<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: OrbitFlare RPC</title>
    <description>The latest articles on Forem by OrbitFlare RPC (@orbitflarerpc).</description>
    <link>https://forem.com/orbitflarerpc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813769%2F9f10e588-ac4d-43c5-9207-b2c4b7b0a835.png</url>
      <title>Forem: OrbitFlare RPC</title>
      <link>https://forem.com/orbitflarerpc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/orbitflarerpc"/>
    <language>en</language>
    <item>
      <title>Top Solana RPC Providers in 2026 - A Comprehensive Guide</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Fri, 01 May 2026 18:46:34 +0000</pubDate>
      <link>https://forem.com/orbitflarerpc/top-solana-rpc-providers-in-2026-a-comprehensive-guide-5hck</link>
      <guid>https://forem.com/orbitflarerpc/top-solana-rpc-providers-in-2026-a-comprehensive-guide-5hck</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd3wkqzf2578prsn9mvm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd3wkqzf2578prsn9mvm.png" alt="Banner" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a long time, picking a Solana RPC provider was a one-line decision: pick the cheapest endpoint that didn't fall over. The interesting question was whether you could afford a dedicated node or had to live on shared infrastructure. That world is mostly gone.&lt;/p&gt;

&lt;p&gt;In 2026, "Solana RPC" usually means a stack of five things that used to be distinct products. Plain JSON-RPC is the floor. On top of it sit WebSocket subscriptions, Yellowstone-style gRPC streams, shred-level feeds tapped before validators finish execution, and staked transaction submission with SWQoS routing. Most of the providers below offer some subset. A few offer all of them. At least two of the names you keep seeing on these lists don't really play the same game anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Actually Benchmark
&lt;/h2&gt;

&lt;p&gt;Reading a provider's website is not benchmarking. Five things worth putting on a real test rig from your own infrastructure before signing anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;p99 latency on the methods your app actually calls.&lt;/strong&gt; Average latency is marketing. The slowest 1% of requests is what breaks production. Pick the three or four methods that dominate your traffic (&lt;code&gt;getAccountInfo&lt;/code&gt;, &lt;code&gt;sendTransaction&lt;/code&gt;, &lt;code&gt;simulateTransaction&lt;/code&gt;, &lt;code&gt;getSignaturesForAddress&lt;/code&gt; are typical) and measure p99 from your own server for at least an hour during real chain activity. The gap between providers shows up in the long tail, not the median.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transaction land rate during congestion.&lt;/strong&gt; Pick a known busy window (a vote epoch transition, a major mint, a memecoin event) and submit a few hundred test transactions through each provider you're evaluating. Track what percentage land on the first try. Staked submission and SWQoS routing typically push this into the high 90s; unprioritized submission can fall into the 60s. Land rate at p50 congestion is the number every provider quotes; land rate at p99 is the one that matters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reconnect behavior under partial failure.&lt;/strong&gt; Most providers' SDKs survive a clean disconnect. The interesting case is a flaky upstream: connection technically alive, packets dropping, slot lag silently growing. Simulate it (&lt;code&gt;tc qdisc add dev eth0 netem loss 5%&lt;/code&gt; on Linux is one easy approach) and watch whether the client recovers, retries, or just keeps yielding stale data. Whoever hides the failure longest hurts you the most.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The pricing curve at 10x your current load.&lt;/strong&gt; Free tiers and starter plans are decoys. The real number is what the bill becomes at the volume you'd hit if your product worked. Build a quick spreadsheet: project your request mix to 10x scale, run it through each provider's pricing page, see which ones double, which ones quadruple, and which ones quietly switch you to a custom-quote tier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The shape of what's above plain JSON-RPC.&lt;/strong&gt; Raw RPC is a commodity. The actual differentiators are the surfaces above it: parsed transactions, token and NFT metadata APIs, shred-level feeds, regional pops, archival depth, observability dashboards. Match your real needs against what each provider has shipped, not what they list on a coming-soon page. If a feature isn't documented, it doesn't exist for buying purposes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. OrbitFlare
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facfnqfqnl8jcnr18n466.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facfnqfqnl8jcnr18n466.png" alt="OrbitFlare Website" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OrbitFlare runs the full transport stack for Solana: RPC, WebSocket, Yellowstone-compatible gRPC, and two shred-layer products. Jetstream delivers decoded shreds over gRPC (the server parses the transaction for you), while Shredstream forwards raw shreds over UDP straight from top-of-Turbine validators in 9 regions. Coverage spans 11 regional pops on three continents: four in the US (Ashburn, New York, Los Angeles, Salt Lake City), five in Europe (Amsterdam, Frankfurt, London, Dublin, Siauliai), and two in Asia (Tokyo, Singapore). A single SDK talks to all four transports through one builder pattern, which kills the per-transport plumbing tax any non-trivial Solana app eventually accumulates.&lt;/p&gt;

&lt;p&gt;The Jetstream path sits closer to the leader than any Geyser-based feed by definition. Geyser fires after the validator commits the transaction. Shred decoding produces a parsed transaction before that. For anyone timing entries on swap rumors, copy-trading an active wallet, or detecting pool creations before they're in a block, that window matters.&lt;/p&gt;

&lt;p&gt;What OrbitFlare doesn't ship: NFT-heavy parsing APIs and cross-chain coverage. If those are the problem, Helius and QuickNode are the right calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Triton One
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfsx49jqwkjpj5tp2mjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfsx49jqwkjpj5tp2mjv.png" alt="Triton Website" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Triton built Yellowstone. That alone earns them a top spot on any honest list, because the standard everyone else implements is the standard they wrote. Their public products read like an institutional menu: Dragon's Mouth for live gRPC, Steamboat for archival queries, Old Faithful for historical block data, Cascade Marketplace for SWQoS routing.&lt;/p&gt;

&lt;p&gt;They run dedicated nodes by default. Observed latency sits around 100ms, which is competitive with anyone. They have the longest credible track record powering large protocols. Openbook, Pyth, and Wormhole have all leaned on Triton at various points, and that kind of operational reputation isn't bought, it accumulates.&lt;/p&gt;

&lt;p&gt;The catch is the price tag. Dedicated nodes start in the high four figures per month, with Cascade pricing on top if staked submission is needed. Triton is institutional infrastructure and prices itself that way. For something that genuinely needs the guarantees they offer (large DeFi, exchange backends, capital-heavy MEV operations), they're worth the spend. For a side project a few months in, the pricing page is the bouncer.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Helius
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctaqp9vrt0lif5xnywd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctaqp9vrt0lif5xnywd0.png" alt="Helius Website" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Helius is the Solana-native incumbent, and usually the right answer when the requirement is "I need a lot of Solana-specific tooling and I want it now." Their RPC runs through staked validator nodes for SWQoS priority on transaction submission. Beyond plain RPC, they ship an Enhanced Transactions API, the Digital Asset Standard (DAS) read API, parsed webhooks, and LaserStream for low-latency gRPC.&lt;/p&gt;

&lt;p&gt;If your app is heavy on token metadata, NFT data, or anything that would otherwise require a custom indexer to enrich raw RPC output, Helius has done that work and exposes it under one account. Their free tier at 1M credits per month is one of the more generous on this list, which makes the on-ramp for hobby projects almost frictionless. They also operate a top-staked validator, which gives them more leverage on transaction landing than most.&lt;/p&gt;

&lt;p&gt;The tradeoff worth flagging: the Enhanced APIs are useful but sticky. Once your code is wired to "give me a parsed transaction with token transfers labeled," moving to another provider means writing the parser yourself. That's not a knock on their engineering. It's a portability choice worth making consciously.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. GetBlock
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gif2hyhxny1mq5mn0fy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gif2hyhxny1mq5mn0fy.png" alt="GetBlock Website" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GetBlock benchmarks #1 on raw latency in Asia, EU, and Africa, which is credible for users outside North America. Their dedicated nodes ship with Yellowstone gRPC included rather than as an add-on, unusual at their price point, and they offer a LandFirst transaction submission product that competes with paid SWQoS tiers elsewhere.&lt;/p&gt;

&lt;p&gt;Their shared tier is fine for hobby projects but they're at their best as a regional dedicated provider. They also offer free engineering help for custom configurations, worth mentioning not as praise but as a signal of where they sit. You're getting hands-on attention you wouldn't get from QuickNode or Alchemy at the same spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. RPC Fast
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F412noginhwuvc3q3g7ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F412noginhwuvc3q3g7ov.png" alt="RPC Fast Website" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RPC Fast is the most opinionated provider on this list. They run bare-metal dedicated nodes only, ship Jito ShredStream on by default, and price everything custom. There is no self-serve tier ladder. The pitch is straightforward: HFT-grade infrastructure for teams that can write a procurement email.&lt;/p&gt;

&lt;p&gt;Their automated failover claim of sub-50ms recovery is aggressive enough that it's worth pressure-testing in a real benchmark before signing anything, but the underlying setup (bare-metal nodes, geographic redundancy) is the right shape for it. Yellowstone gRPC is supported but not their primary streaming pitch. ShredStream is.&lt;/p&gt;

&lt;p&gt;The catch is the pricing model. Custom-only is fine when the budget exists; it's a wall when the goal is to spin up a node over the weekend. Skip this one if "request a quote" isn't a workflow you can run.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Alchemy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9k2kt80mdokgq5tvuv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9k2kt80mdokgq5tvuv7.png" alt="Alchemy Website" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alchemy supports 37+ chains and has the deepest developer tooling in crypto, the kind of metering, logging, replay, and trace infrastructure you'd expect from a much older industry. For teams already using them on EVM, adding Solana is two clicks and a billing change.&lt;/p&gt;

&lt;p&gt;What you get: solid latency (40-60ms observed in North America and Asia), a generous free tier (30M compute units a month), and the most polished docs on this list. What you don't get: Solana-specific depth. There's no equivalent of Helius's parsed APIs, no Jetstream-style shred feed, and the highest shared plan caps at 300 RPS.&lt;/p&gt;

&lt;p&gt;Alchemy is the right answer when Solana is one of several chains being supported and managing two relationships isn't appealing. It's not the right answer when Solana is the hot path.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. QuickNode
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8w8aifo98njr7a2rkuh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8w8aifo98njr7a2rkuh7.png" alt="QuickNode Website" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;QuickNode is the EC2 of crypto RPC. They support 75+ chains across 120+ networks, have the most polished dashboard in the space, and offer a long shelf of add-ons to compose per-project. MEV protection, transaction speed boosters, NFT and token APIs, Yellowstone gRPC on port 10000, and so on.&lt;/p&gt;

&lt;p&gt;For multi-chain teams, especially ones that want a single vendor for both EVM and Solana, QuickNode is the pragmatic answer. Their ops are mature, their SLAs are real, and their support is responsive in ways most of this list isn't.&lt;/p&gt;

&lt;p&gt;Where they're not the obvious pick: pure Solana work where every dial needs to be turned up. Standard tiers cap shared throughput around 400 RPS, which sounds like plenty until a sniper is fanning blockhash refreshes through a launch. The Solana-specific depth, parsed APIs, shred-level feeds, fine-grained staked submission, is shallower than what Helius, Triton, or OrbitFlare offer.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Ankr
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl766jifa66gl6jgzs9e0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl766jifa66gl6jgzs9e0.png" alt="Ankr Website" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ankr runs a decentralized RPC network across 80+ chains, with throughput up to ~1,500 RPS on premium tiers. Pricing is pay-as-you-go from around $6 per 1M requests, which is the most cost-effective option on this list for low-volume reads.&lt;/p&gt;

&lt;p&gt;Two things to know. Their network model means there's no single dedicated machine, traffic is load-balanced across operators. That's fine for read-heavy workloads, less ideal when predictable latency for transaction submission is a requirement. SWQoS access is gated behind their premium tier.&lt;/p&gt;

&lt;p&gt;Pick Ankr when cost per read matters more than tail latency. Skip it for any hot path.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Chainstack
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0xjbwm865n9hy7v6swg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0xjbwm865n9hy7v6swg.png" alt="Chainstack Website" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chainstack quietly turned on Jito ShredStream by default on their Solana nodes in early 2026, shipped a Trader Node product with priority routing, and run real SOC 2 Type II compliance, which matters more than people admit when the goal is to onboard institutional customers.&lt;/p&gt;

&lt;p&gt;Their Unlimited Node tier at $149/mo is the best flat-rate offer in the market. Full RPC, WebSocket, and gRPC access without the per-request metering that turns other providers' pricing pages into spreadsheet exercises. That directly undercuts OrbitFlare's Growth tier on raw monthly cost. Chainstack sits below the providers above in this ranking because their Solana product is one of many things they offer rather than their entire business. For teams already on Chainstack for EVM work, extending to Solana is a one-tab decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Syndica
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasswm56z18cnx3rcoycp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasswm56z18cnx3rcoycp.png" alt="Syndica Website" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Syndica is Solana-only and has leaned hard into observability. ChainStream gives a query layer over historical Solana data. Their dashboards show what RPC traffic actually looks like, with request mix, p99 latency by method, and error rates broken down in a way most providers don't bother with.&lt;/p&gt;

&lt;p&gt;The core RPC is solid but isn't differentiated on raw speed. The reason to pick Syndica is the diagnostics. When a team is trying to figure out why a particular method is slow, or which addresses are eating most of their getAccountInfo budget, having that data already collected beats writing a metrics pipeline from scratch.&lt;/p&gt;

&lt;p&gt;Best fit for teams with their hands full of Solana-specific debugging and a real need to understand their own usage in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dedicated vs Shared
&lt;/h2&gt;

&lt;p&gt;A quick note, because people still ask this every week.&lt;/p&gt;

&lt;p&gt;Shared nodes get you started faster and cost less, but they come with noisy-neighbor effects. When another tenant runs a heavy &lt;code&gt;getProgramAccounts&lt;/code&gt; query on the same instance, p99 latency spikes. On the better providers this is minor. On cheaper ones it can be severe.&lt;/p&gt;

&lt;p&gt;Dedicated nodes remove the noise but introduce configuration and capacity questions that used to be the provider's problem. You pick the region. You pick the hardware tier. You pay whether your traffic is full or empty.&lt;/p&gt;

&lt;p&gt;The right answer depends more on predictability requirements than on scale. A small trading operation that needs consistent latency belongs on dedicated before a much larger read-heavy app that can tolerate occasional spikes. Every major provider on this list offers both shapes. Pick the one that matches what you need to be certain about.&lt;/p&gt;

&lt;h2&gt;
  
  
  By Use Case
&lt;/h2&gt;

&lt;p&gt;The honest mapping, since "no universal winner" sounds wise but doesn't help anyone make a decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trading, MEV, sniping.&lt;/strong&gt; OrbitFlare, Triton One, or RPC Fast. All three give shred-level or sub-block feeds and serious latency. OrbitFlare for teams that want one SDK across the whole transport surface. Triton if the team is already built around Yellowstone and the institutional reputation is part of the buying decision. RPC Fast if the budget is open and procurement is an option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana-native dApps with NFT or token surfaces.&lt;/strong&gt; Helius. The Enhanced Transactions API and DAS will save weeks of indexer work. Plan for the portability cost when moving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-chain teams.&lt;/strong&gt; QuickNode for breadth and ops maturity, Alchemy for developer tooling depth, Chainstack for the flat-rate pricing. The right answer depends on existing relationships more than the technology.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Institutional workloads with compliance requirements.&lt;/strong&gt; Chainstack (SOC 2 Type II) or Triton One. Helius is also SOC 2 certified but fewer of their enterprise customers talk about it publicly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-sensitive read workloads.&lt;/strong&gt; Ankr. Pay-as-you-go pricing is the cheapest cost-per-request on this list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana with regional concentration outside North America.&lt;/strong&gt; GetBlock for Africa benchmarks. OrbitFlare for any of the 11 regions across the US, Europe (including Eastern Europe via Siauliai), and Asia (Tokyo and Singapore).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production debugging on Solana.&lt;/strong&gt; Syndica's observability layer earns its rank.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  At a Glance
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztw17i5htdzbryd00alk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztw17i5htdzbryd00alk.png" alt="Providers Comparison" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Floor
&lt;/h2&gt;

&lt;p&gt;There is no universal best. There is a worst, though, and that's running anything you care about on a public RPC endpoint and being surprised when it stops responding the moment a launch hits. Pick something on this list. The cheapest paid tier of any of them beats free.&lt;/p&gt;

&lt;p&gt;To compare specifics against OrbitFlare, or to get help sizing the right tier for a workload, &lt;a href="//discord.gg/orbitflare"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>orbitflare</category>
      <category>rpc</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>The OrbitFlare SDK: One Rust Crate for Every Solana Transport</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:38:00 +0000</pubDate>
      <link>https://forem.com/orbitflarerpc/the-orbitflare-sdk-one-rust-crate-for-every-solana-transport-4doi</link>
      <guid>https://forem.com/orbitflarerpc/the-orbitflare-sdk-one-rust-crate-for-every-solana-transport-4doi</guid>
      <description>&lt;p&gt;Building a Solana app in Rust tends to mean you collect SDKs. One for JSON-RPC because you need &lt;code&gt;get_balance&lt;/code&gt; and &lt;code&gt;get_transaction&lt;/code&gt; for the obvious one-shot reads. One for WebSocket because polling for account changes gets tired fast. One for gRPC because Yellowstone is the only realistic way to keep up once your volume passes a certain threshold. And often a fourth for whatever specialized feed you've signed up for on top of it, because the first three stop being enough the moment latency starts mattering to your app.&lt;/p&gt;

&lt;p&gt;Each one arrives with its own types, its own error model, its own opinions about how to reconnect when the socket drops, and its own way of threading auth into a URL. You end up writing the same wrapper code in four slightly different places - retry the request, fall back to a secondary endpoint, redact the api key out of log lines, time out when the connection has gone silent - and none of it is the reason you started the project. It's the least interesting code in any Solana app, and somehow it ends up being the most fragile too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The OrbitFlare Rust SDK
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fax0qd676hzajoix8gxek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fax0qd676hzajoix8gxek.png" alt="OrbitFlare homepage"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://orbitflare.com" rel="noopener noreferrer"&gt;OrbitFlare&lt;/a&gt;&lt;/strong&gt; sits at the other end of that problem. We run Solana RPC, WebSocket, and gRPC endpoints, plus our own Jetstream feed for the cases where Geyser-based streams can't keep up.&lt;/p&gt;

&lt;p&gt;Our new Rust SDK is what you use to talk to any of it, and it's shaped around a single builder pattern and a single error type across every transport, so the code you write to call &lt;code&gt;get_balance&lt;/code&gt; over HTTP reads almost identically to the code you write to open a binary gRPC firehose.&lt;/p&gt;

&lt;p&gt;What that buys you, beyond a shorter &lt;code&gt;Cargo.toml&lt;/code&gt;, is that all the plumbing you would otherwise be writing per-client lives once, in one place, and gets better over time instead of drifting in four directions at once.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Transports
&lt;/h2&gt;

&lt;p&gt;The crate exposes four transport modules, each behind its own feature flag.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rpc&lt;/code&gt; is the typed JSON-RPC client you'll reach for whenever you need a one-shot read, a transaction submission, or a historical lookup.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;ws&lt;/code&gt; gives you the pub/sub surface for the things you want to watch as they happen on-chain: slots, accounts, signatures, and log filters.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;WsClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ws://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;grpc&lt;/code&gt; is the Yellowstone-compatible firehose, where you open one long-lived subscription, hand the server a set of filters, and let it stream every matching event straight from the validator's Geyser plugin.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;geyser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;GeyserClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.rpc.orbitflare.com:10000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;jetstream&lt;/code&gt; has the same API shape as the gRPC client, but the data comes out of our own shred-decoded pipeline rather than Geyser, which is a meaningful win when "earlier" matters to what you're building.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;jetstream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;JetstreamClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.jetstream.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo add orbitflare-sdk &lt;span class="nt"&gt;--features&lt;/span&gt; &amp;lt;features&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The available features are &lt;code&gt;rpc&lt;/code&gt;, &lt;code&gt;ws&lt;/code&gt;, &lt;code&gt;grpc&lt;/code&gt;, and &lt;code&gt;jetstream&lt;/code&gt;. Pick whichever combination your app actually needs and your dependency tree stays lean.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Don't Have to Write
&lt;/h2&gt;

&lt;p&gt;The boring infrastructure around any transport client - reconnect, fallback, liveness, api key handling - is where most of the bugs in any Solana app quietly live, and it's fundamentally the same work regardless of which protocol you're speaking. &lt;/p&gt;

&lt;p&gt;The SDK handles it once, on your behalf, and runs the same implementation across every client. When a socket drops, the subscriptions you had on it get re-registered against the new connection. When a primary endpoint starts misbehaving, the client backs off and cycles through whatever fallback URLs you chained onto the builder, bringing the primary back into rotation once it recovers. &lt;/p&gt;

&lt;p&gt;And anywhere a URL might end up in an error log, the api key gets redacted out of it first and you start grepping your tracing output.&lt;/p&gt;

&lt;h2&gt;
  
  
  In a Real Project
&lt;/h2&gt;

&lt;p&gt;Most apps built on the SDK end up with roughly the same shape. You construct the clients you need up front, hand them off to whichever parts of the app are going to use them, and let the SDK manage the underlying connections for the lifetime of the process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;orbitflare_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;
    &lt;span class="n"&gt;GeyserClientBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RpcClientBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WsClientBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[tokio::main]&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;WsClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.urls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s"&gt;"ws://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"ws://lon.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;geyser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;GeyserClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.rpc.orbitflare.com:10000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// ... use rpc, ws, geyser&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The demo we're going to build over the rest of this post is a small wallet ticker. You pass in a pubkey at the command line, and the program prints a live view of that wallet's SOL balance along with every token account it owns, updating the display in place as the balances change. Around 120 lines of code end to end.&lt;/p&gt;

&lt;p&gt;It uses the same pattern the code sketch above hinted at. The RPC client handles the bootstrap - one &lt;code&gt;get_balance&lt;/code&gt; for the SOL side, one &lt;code&gt;get_token_accounts_by_owner&lt;/code&gt; for the SPL tokens, and a handful of small lookups to decorate each account with its mint's decimals so the output reads as token amounts rather than raw integers. &lt;/p&gt;

&lt;p&gt;From there the WebSocket client takes over: we open an &lt;code&gt;account_subscribe&lt;/code&gt; for the wallet itself and one for each token account we found, merge the updates into a single stream inside the app, and redraw the dashboard whenever any of them tick. The RPC client gets you the starting state; the WebSocket client keeps it honest from there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up the Project
&lt;/h3&gt;

&lt;p&gt;Create a new Cargo project and pull in the dependencies you'll need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[package]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"wallet-ticker"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2024"&lt;/span&gt;
&lt;span class="py"&gt;rust-version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.85"&lt;/span&gt;

&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;orbitflare-sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"rpc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ws"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;tokio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.52.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;serde_json&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0.149"&lt;/span&gt;
&lt;span class="py"&gt;base64&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.22.1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;orbitflare-sdk&lt;/code&gt; with the &lt;code&gt;rpc&lt;/code&gt; and &lt;code&gt;ws&lt;/code&gt; features gives you exactly the two transports this project uses and nothing else. &lt;/p&gt;

&lt;p&gt;Tokio's &lt;code&gt;full&lt;/code&gt; feature is convenient for a tutorial; in a production app you'd bare that down to the runtime pieces you actually rely on. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;base64&lt;/code&gt; and &lt;code&gt;serde_json&lt;/code&gt; show up because WebSocket account updates arrive as base64-encoded bytes wrapped in a JSON envelope, and you'll be reaching into both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building the Clients
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RpcClient::build&lt;/code&gt; is synchronous; &lt;code&gt;WsClient::build&lt;/code&gt; is async because it actually opens the socket. The &lt;code&gt;Arc&lt;/code&gt; wrap on &lt;code&gt;ws&lt;/code&gt; is there because each subscription will live in its own &lt;code&gt;tokio::spawn&lt;/code&gt; and they all need to reach the same underlying connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.commitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"confirmed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nn"&gt;WsClientBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;.url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ws://ams.rpc.orbitflare.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Bootstrap
&lt;/h3&gt;

&lt;p&gt;Pulling the wallet's current state is two RPC calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;sol_lamports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="nf"&gt;.get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;raw_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt;
    &lt;span class="nf"&gt;.get_token_accounts_by_owner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;get_token_accounts_by_owner&lt;/code&gt; returns each entry in &lt;code&gt;jsonParsed&lt;/code&gt; encoding, so the mint address, token amount, and decimals are already structured fields you can lift straight into a &lt;code&gt;HashMap&amp;lt;pubkey, Holding&amp;gt;&lt;/code&gt;. The pubkey you key by is the token account's own address - that's the id you'll subscribe to in the next step, not the mint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subscribing Concurrently
&lt;/h3&gt;

&lt;p&gt;Once you have the list of accounts, you need one subscription for the wallet itself and one per token account. The shape that works is a &lt;code&gt;tokio::spawn&lt;/code&gt; per subscription sharing an &lt;code&gt;Arc&amp;lt;WsClient&amp;gt;&lt;/code&gt;, with all of them pushing updates into a single &lt;code&gt;mpsc&lt;/code&gt; channel the main loop drains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pubkey&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;holdings&lt;/span&gt;&lt;span class="nf"&gt;.keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.cloned&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="py"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="nf"&gt;.account_subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"confirmed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="nf"&gt;.next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// decode v["data"][0] as an SPL token account,&lt;/span&gt;
            &lt;span class="c1"&gt;// then send an Update down tx&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;tokio::spawn&lt;/code&gt; is what makes this scale. A naive &lt;code&gt;for pubkey in ... { ws.account_subscribe(...).await? }&lt;/code&gt; loop works too, but it serializes one subscribe per round-trip. That's fine for a dozen accounts, painful for a few hundred, and flat-out unusable on wallets with thousands of token accounts. Spawning lets every subscription open in parallel, and the first updates start landing in the channel before the last subscribe ack even comes back.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Render Loop
&lt;/h3&gt;

&lt;p&gt;Everything comes together in a short loop that reads the next update, mutates local state, and redraws:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="nf"&gt;.recv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Sol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sol_lamports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nn"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;holdings&lt;/span&gt;&lt;span class="nf"&gt;.get_mut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="py"&gt;.amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sol_lamports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;holdings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it against any Solana address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ORBITFLARE_LICENSE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ORBIT-KKKKKK-EEEEEE-YYYYYY cargo run &lt;span class="nt"&gt;--release&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;pubkey&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see the dashboard populate within a few hundred milliseconds as the RPC bootstrap lands, then each line ticks in place the moment something touches the wallet on-chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wallet: CKs1E69a2e9TmH4mKKLrXFF8kD3ZnwKjoEuXa6sz9WqX

  SOL     0.040420950
  EPjF...Dt1v      42.500000
  So11...1112       0.005000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ctrl+C to quit. The full source - about 140 lines of Rust end to end, including the &lt;code&gt;render&lt;/code&gt; function, the state types, and the bootstrap parse loop - is linked at the bottom of the post.&lt;/p&gt;

&lt;p&gt;That's about it for the SDK in broad strokes - a builder per transport, a shared error and retry story, and the reconnect and fallback work kept inside the crate where you don't have to think about it. &lt;/p&gt;

&lt;p&gt;The ticker above is the smallest app that meaningfully exercises more than one of the clients at a time, but the shape scales up from there: the same pattern works just as well when you're stitching together a copy trader, a liquidation monitor, or anything else that needs to move between one-shot reads and live streams in the same loop.&lt;/p&gt;

&lt;p&gt;With the SDK in place, the plumbing is off your plate and what's left is the part of the project that's actually yours to build. Which, for most of us, is the only reason we started one in the first place.&lt;/p&gt;

&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://crates.io/crates/orbitflare-sdk" rel="noopener noreferrer"&gt;&lt;code&gt;orbitflare-sdk&lt;/code&gt; on crates.io&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/wallet-ticker" rel="noopener noreferrer"&gt;Full Wallet Ticker Project&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/orbitflare-sdk-rs/tree/main/crates/orbitflare-sdk/examples" rel="noopener noreferrer"&gt;SDK Examples on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.orbitflare.com/sdk/overview" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you build something with the crate, or run into a rough edge that should be smoother, we'd love to &lt;em&gt;&lt;a href="//discord.gg/orbtiflare"&gt;hear&lt;/a&gt;&lt;/em&gt; about it and help you out!&lt;/p&gt;

</description>
      <category>solana</category>
      <category>sdk</category>
      <category>rust</category>
      <category>orbitflare</category>
    </item>
  </channel>
</rss>
