<?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>DEV Community: OrbitFlare RPC</title>
    <description>The latest articles on DEV Community by OrbitFlare RPC (@orbitflarerpc).</description>
    <link>https://dev.to/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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813769%2F9f10e588-ac4d-43c5-9207-b2c4b7b0a835.png</url>
      <title>DEV Community: OrbitFlare RPC</title>
      <link>https://dev.to/orbitflarerpc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orbitflarerpc"/>
    <language>en</language>
    <item>
      <title>Alpenglow: How Solana Swaps Its Consensus in One Slot</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:17:32 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/alpenglow-how-solana-swaps-its-consensus-in-one-slot-38o1</link>
      <guid>https://dev.to/orbitflarerpc/alpenglow-how-solana-swaps-its-consensus-in-one-slot-38o1</guid>
      <description>&lt;p&gt;Solana consensus has been using the same design since 2020. Every validator publishes votes as transactions in the blocks, adds increasingly strong lockouts and declares a block final once 32 more blocks have built upon it. It works, but it lacks a published safety proof, consumes over half of all transactions in the network, and its finality takes seconds despite the rest of the stack working in milliseconds.&lt;/p&gt;

&lt;p&gt;Alpenglow is its replacement. The design is due to Quentin Kniep, Jakub Sliwinski, and Roger Wattenhofer, who left ETH Zurich and joined Anza after publishing their research on liveness issues in TowerBFT. Alpenglow was published in May 2025. Validators approved SIMD-0326 in September 2025 with 98.27% of participating stake in favor, and the protocol has been running on a community cluster privately for five months, undergone a bug bounty, rehearsed nine migrations and flipped on testnet and devnet. Mainnet is next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TowerBFT Has to Be Replaced
&lt;/h2&gt;

&lt;p&gt;There are three layers in today's consensus. &lt;strong&gt;Proof of History&lt;/strong&gt; provides validators with a shared clock through continuous hashing. &lt;strong&gt;Turbine&lt;/strong&gt; propagates blocks via a tree of validators, and Alpenglow will preserve this functionality for now. &lt;strong&gt;TowerBFT&lt;/strong&gt; is a voting layer where every validator sends a transaction with the vote for the block it received, and this vote transaction is included into a future block similarly to others. Once there are 32 blocks built upon a block, it is rooted.&lt;/p&gt;

&lt;p&gt;This 32-slot wait is responsible for the famous 12.8-second delay at 400-ms slots. Slots are 200 ms now under SIMD-0525, so the wait takes about 7 seconds on mainnet. Way before this moment, the block is optimistically confirmed at 66% of stake, which is what &lt;code&gt;confirmed&lt;/code&gt; reports and most applications use.&lt;/p&gt;

&lt;p&gt;The reasons for switching to Alpenglow are listed explicitly in SIMD-0326. Finality is slow for anyone requiring a no-rollback guarantee. Vote transactions make up between 54% and 59% of all mainnet transactions in late September 2026, according to Solana Compass, and each of them costs the validator about 5,000 lamports, which adds up to roughly 2.16 SOL per epoch. The votes go through gossip and are verified on chain. And, finally, TowerBFT lacks a formal safety proof. Votor solves all four of these.&lt;/p&gt;

&lt;h2&gt;
  
  
  Votor: Two Voting Paths at Once
&lt;/h2&gt;

&lt;p&gt;The leader broadcasts the block in chunks via erasure coding. The moment a validator receives a valid and complete block with a parent block that it has already voted for, it broadcasts the &lt;strong&gt;notarization vote&lt;/strong&gt; directly to every other validator. There is no transaction and no gossip here, just a signed UDP message. Then two paths of actions begin at the same time.&lt;/p&gt;

&lt;p&gt;First, the &lt;strong&gt;fast path&lt;/strong&gt;: if some validator collects notarization votes from 80% of stake, it puts together the fast-finalization certificate and declares the block final after a single round. Then the &lt;strong&gt;slow path&lt;/strong&gt;: once 60% of stake has notarized, every validator casts a finalization vote, and a finalization certificate is created from 60% of them.&lt;/p&gt;

&lt;p&gt;The first path to succeed wins. If 80% of stake is close to you, the fast path wins. If only 60% is close to you, two fast rounds among the latter can beat the single slow round that needs to gather 80%. The protocol does not have to guess the case.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4n7cz0iqy3iuc83h5ljs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4n7cz0iqy3iuc83h5ljs.png" alt="Two ways to final, one way to skip" width="800" height="865"&gt;&lt;/a&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bzvleeweh6x9rm8eawa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bzvleeweh6x9rm8eawa.png" alt="What each certificate needs to form" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 80% and 60% thresholds are a result of the fault model. Under 20% Byzantine stake, any 60% certificate will be composed of votes from over 40% of honest stake, and since any honest validator can cast only one notarization or skip vote per slot, it is impossible for two different blocks to gather 60%. This is the basis of the safety proof of the algorithm. Every certificate consists of one BLS aggregate signature and a bitmap of signers, and thus is small enough to fit in one UDP message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeouts are replacing PoH.&lt;/strong&gt; When a validator receives a certificate for the block before the leader's four-slot window, it sets a timer for each slot in this window at once. In Agave, the base timeout is 400 ms plus one block time per slot, so at 200 ms blocks, the first slot in a window times out 600 ms after the parent block becomes ready. If the block arrives first, the validator votes for it. If the timer fires first, it broadcasts a &lt;strong&gt;skip vote&lt;/strong&gt; for this slot and all subsequent unvoted slots in this window. No clocks need to be synchronized, as every validator just measures local short intervals. A skip certificate at 60% is a definitive outcome, and the next leader builds upon the latest notarized block, effectively ignoring the skipped slot.&lt;/p&gt;

&lt;p&gt;Two fallback votes help to deal with leaders broadcasting different blocks to different validators. A validator who skips a block can switch to a &lt;strong&gt;notar-fallback vote&lt;/strong&gt; once it notices 40% of stake notarizing a block, while a notarizing validator can switch to &lt;strong&gt;skip-fallback&lt;/strong&gt; once it becomes obvious that no block can collect 80%. This guarantees that every slot will end with either a notarized block or a skip certificate. If no slot finalizes for 10 seconds, the validators rebroadcast their latest certificates and increase timeouts by 5% per window, so eventually even a regional outage resolves itself without coordination.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 20+20 Model, Honestly
&lt;/h2&gt;

&lt;p&gt;The main claim is that Alpenglow tolerates 40% of stake going down. This is correct, but an imprecise statement, and an accurate one is important.&lt;/p&gt;

&lt;p&gt;Under complete asynchrony, Alpenglow is safe as long as &lt;strong&gt;Byzantine stake is less than 20%&lt;/strong&gt;. Even an adversary controlling the whole network and delaying every message could not make two honest nodes finalize conflicting blocks. In addition to this, &lt;strong&gt;20% of crashed stake&lt;/strong&gt; does not affect the safety. As long as the propagation layer does not deliver different blocks for the same slot to different honest nodes, liveness is preserved. Thus, crash-only faults under 40% stake are always tolerated.&lt;/p&gt;

&lt;p&gt;However, an adversary who controls a leader with 18% stake and can partition the honest network into two isolated clusters and broadcast different blocks to each of them can stall a slot. A well-distributed validator set makes it hard to do, but it is a known liveness attack. Therefore, understand 40% fault tolerance as 20% malicious plus 20% crashed, not as 40% malicious.&lt;/p&gt;

&lt;p&gt;Compared with TowerBFT's 33% Byzantine bound, Alpenglow is worse against a coordinated attack by more than 20% and less than 33% of stake and better against anything else. The trade-off here is that in a large proof-of-stake network, a coordinated attack by a third of stake is not the most likely scenario. Bugs, misconfigurations and outages are, and these correspond to crashes. Signing two conflicting votes is a provable violation under SIMD-0326, but slashing is a separate proposal and is not live yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rotor Is Not Shipping Yet
&lt;/h2&gt;

&lt;p&gt;Rotor is the second part of the design. It replaces Turbine's multilayer tree with a single layer of stake-weighted relays, and makes the leader's upload bandwidth not a limit anymore. Reaching 80% of stake would take around 150 nodes and roughly 2 ms. This is not included in the planned 21 October activation. The Foundation marks it as a feature for a later stage without any date, SIMD-0326 carves it out for its own proposal, and Turbine remains. Fast leader handover and geo-aware handoff are postponed as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Votes Are Out of the Blockchain
&lt;/h2&gt;

&lt;p&gt;Three changes happened on the mainnet months before the migration to make off-chain voting possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BLS keys&lt;/strong&gt; (SIMD-0387, July 8, 2026). Since the Ed25519 signatures cannot be aggregated, every validator had to register a 48-byte BLS public key in its vote account with proof of possession. A vote account without one will behave like unstaked when Alpenglow is active, and &lt;code&gt;getVoteAccounts&lt;/code&gt; will show a &lt;code&gt;blsPubkeyCompressed&lt;/code&gt; field, which is null for those accounts that haven't performed this operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Validator Admission Ticket&lt;/strong&gt; (SIMD-0357, July 22, 2026). Once the vote transactions are gone, the vote fees disappear too. The VAT replaces them with a flat fee, burned from the vote account at the beginning of each epoch, and gives admission to the next epoch. It was 1.6 SOL per epoch at 400 ms slots and scales with slot time, so at today's 200 ms slots, it is &lt;strong&gt;0.8 SOL per epoch&lt;/strong&gt;, compared with roughly 2.16 SOL that validators spend on vote fees now. The first charge will be done at the beginning of epoch 1064 and funds epoch 1065. A vote account that cannot pay is not admitted, and that validator neither votes nor produces blocks for the next epoch. The set of admitted validators is capped at 2,000 by stake, which is way above the roughly 680 voting validators today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rewards&lt;/strong&gt; continue to exist. The leader of slot s+8 may include BLS aggregations of votes received for slot s; each included vote earns its voter a share of issuance, and the leader earns the same as each voter for performing the aggregation.&lt;/p&gt;

&lt;p&gt;Thus, the practical outcome is that the vote account, not the identity account, has to remain funded. Anza recommends routing block revenue into the vote account to cover VAT automatically and warns that the reward paid at the epoch boundary is too late to rescue a validator that lacks funds at the admission time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Migration: Switching Consensus Engines in One Slot
&lt;/h2&gt;

&lt;p&gt;SIMD-0384 describes the process of switching. Its goal is that no user-signed transaction should be dropped and if the migration fails, nothing will happen at all.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fixlsxxgxblvqscuadcky.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fixlsxxgxblvqscuadcky.png" alt="Four steps from TowerBFT to Votor" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activation.&lt;/strong&gt; The feature gate becomes active at epoch 1064, which starts at slot 459,648,000, and the Foundation expects it to start around 15:00 UTC on Wednesday, 21 October. For now, nothing changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boundary.&lt;/strong&gt; Exactly 5,000 slots later, at slot 459,653,000 and about 18 minutes afterward, leaders start packing vote transactions only into blocks. Honest validators will mark any block with a user transaction as dead, and TowerBFT will stop rooting. Since all further blocks will contain only votes, rollbacks of any of them incur zero cost to users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Genesis.&lt;/strong&gt; The validators will wait for the block at or after the boundary carrying TowerBFT votes from at least 82% of stake in its direct child. Blocks usually carry votes from over 95% of stake, so the boundary block will usually pass immediately. The last block prior to the boundary in this chain will become Alpenglow's genesis block, every validator will sign a BLS genesis vote for it, and with 82% of stake, the genesis certificate will form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handoff.&lt;/strong&gt; Seeing the valid certificate, every validator will launch Votor from the genesis block, disable TowerBFT, roll back all blocks past the genesis in the same way duplicate-block handling works, and enable user transactions again. The genesis certificate will be recorded in the first Alpenglow block and in an on-chain account, so a validator restarting from a later snapshot will know what consensus engine to run. Anza estimates the handoff to take hundreds of milliseconds, and Triton One estimates a user-visible gap of about two slots.&lt;/p&gt;

&lt;p&gt;If 82% never signs the genesis, there will be no abort step, as there is no need for it. The validators will continue using TowerBFT, and the migration will not complete. There is no intermediate phase when the chain uses neither engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The client diversity issue.&lt;/strong&gt; Firedancer's v26.10.2 release published on 14 October and labeled as mainnet ready supports Alpenglow consensus, but not the migration from TowerBFT to Alpenglow. So, for the migration itself, every validator must use a client descended from Agave 4.3.0, and that is practically Agave, Jito-Solana or Harmonic Salsa, and then may switch back to Firedancer. According to Solana Compass, as of 13 October, about 15.8% of stake among the top 500 validators used Firedancer-family clients. If this stake stays as is, what remains is barely above the 82% threshold. Anza has been quite explicit that these operators have to switch beforehand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Track Record
&lt;/h2&gt;

&lt;p&gt;The community cluster became operational on 11 May 2026 with over 40 nodes. The first migration attempt uncovered two bugs that Anza acknowledged on the validator call of the Foundation and hotfixed. The next attempt completed successfully, and the cluster has been running since then. A public explorer shows the finalization time of about 107 ms and around 96% of blocks taking the fast path. A bug bounty lasted from August 5 to August 19, and featured a fund of up to 50,000 SOL, 115 researchers and more than 300 submissions. Anza has reported payouts exceeding 25,000 SOL, though the breakdown of severity has not been published. Testnet flipped on September 24 at slot 444,625,255, and devnet on September 25 at slot 504,148,999. Agave 4.3 including the full Alpenglow code was recommended for all mainnet validators on September 21.&lt;/p&gt;

&lt;p&gt;The 150 ms figure is based on the latency simulation with real validator latencies, with a median around 110 to 130 ms and the slowest node below 200 ms. Consider it an expectation, not a fixed number. A 54 ms testnet median circulated without any publicly named source, so we do not reproduce it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Will Change for Developers
&lt;/h2&gt;

&lt;p&gt;Execution will not change. The SVM, transaction formats, programs, fees and priority fees will stay the same. All below is about consensus outputs and data you rely on.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commitment levels.&lt;/strong&gt; &lt;code&gt;confirmed&lt;/code&gt; and &lt;code&gt;finalized&lt;/code&gt; converge to the same state, defined as 60% of stake voting to finalize or 80% of stake notarizing, and &lt;code&gt;finalized&lt;/code&gt; will arrive about 150 ms after the block instead of 32 slots later. They both will work on the activation day, and &lt;code&gt;confirmed&lt;/code&gt; commitment level is scheduled for future removal, so use &lt;code&gt;finalized&lt;/code&gt; in new code. &lt;strong&gt;Do not switch early.&lt;/strong&gt; Until the genesis certificate is present, &lt;code&gt;finalized&lt;/code&gt; commitment on the mainnet still means a 32-slot wait. Check &lt;code&gt;getAgGenesisCert&lt;/code&gt; on your RPC, which will return null under TowerBFT and a certificate object once Alpenglow is live. The meaning of &lt;code&gt;getBlockCommitment&lt;/code&gt; disappears, as there is no lockout stack to report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction counts.&lt;/strong&gt; Vote transactions will disappear from blocks, so per-block counts and every TPS chart will drop by over half without any change in actual activity. Adjust alerting thresholds before 21 October.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple candidate blocks per slot.&lt;/strong&gt; A leader may produce multiple blocks for a slot, and only one will be notarized, so Agave 4.3 will tag Geyser events with a &lt;code&gt;bank_id&lt;/code&gt;, and Yellowstone gRPC will expose it. If you build blocks from transactions or account updates, group them by slot and bank id, keep the candidate that reached &lt;code&gt;confirmed&lt;/code&gt; and discard others. The ids are node-local, so align blocks across providers by blockhash only. The four legacy Geyser callbacks become deprecated in favor of bank-scoped ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ticks and block footer.&lt;/strong&gt; PoH ticks will disappear from the shred stream. Alpenglow blocks start with a &lt;code&gt;BlockHeader&lt;/code&gt; marker and will end with a versioned footer (SIMD-0307) containing the producer timestamp, a client user-agent string and the leader's latest finalization certificate. The footers are accessible via a gRPC opt-in filter, but are not accessible via JSON-RPC yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clock sysvar.&lt;/strong&gt; The layout will be the same, but the &lt;code&gt;unix_timestamp&lt;/code&gt; will become set by the leader in a bounded range, not derived from a stake-weighted median of votes. Use it as an approximation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockhash expiration.&lt;/strong&gt; Slots still exist, and the 150-slot window will remain the same, corresponding to about 32 seconds at current slot timing. Fetch blockhashes at &lt;code&gt;confirmed&lt;/code&gt; or higher, as a hash of a vote-only block that will be rolled back during the migration is useless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yellowstone gRPC.&lt;/strong&gt; The plugin release for Alpenglow is &lt;code&gt;v16.0.0-rc10+solana.4.3.0&lt;/code&gt;. Old clients will continue streaming but will not be able to see &lt;code&gt;bank_id&lt;/code&gt; and footers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration day for bots.&lt;/strong&gt; Expect one or two slots of vote-only blocks somewhere near the boundary, followed by a small break in the slot numbering sequence. Read at &lt;code&gt;confirmed&lt;/code&gt; through that window, and hold back from the activation slot until the genesis certificate appears if you are conservative. Jito’s BAM nodes will go into maintenance mode during the transition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Requirements for Validators.&lt;/strong&gt; If you operate a validator, here are the three requirements you need to satisfy: operate a client based on Agave 4.3.0, since Firedancer can’t help you through the transition; register a BLS key and confirm it with &lt;code&gt;solana vote-account&lt;/code&gt;; keep the vote account balance at the rent-exempt minimum plus 0.8 SOL before epoch 1064, with a refill plan. Otherwise, you’ll be left outside the admitted set and earn nothing until you sort it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things That Alpenglow Does Not Do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It does not improve throughput.&lt;/strong&gt; “100 times improvement” is about finality latency, not block limits, execution, and compute budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It did not cut the slot time.&lt;/strong&gt; The transition from 400 ms to 200 ms was SIMD-0525, implemented in four phases from August to October, unrelated to Alpenglow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It does not eliminate MEV.&lt;/strong&gt; The window from block visibility to finality narrows to around 150 ms, thus squeezing the latency arbitrage space, but it does not change the block building incentives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It does not bring in slashing, Rotor, or fast leader handover.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is not quantum-resistant.&lt;/strong&gt; There is an experimental quantum-resistant hash-signature scheme called Quantumglow, with no plans on the schedule yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implications for Building on OrbitFlare
&lt;/h2&gt;

&lt;p&gt;As we run RPC, WebSocket, Yellowstone gRPC, Jetstream, and Shredstream, all the above features land on our infrastructure stack and on yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RPC and WebSocket users&lt;/strong&gt; will benefit the most for free. Once &lt;code&gt;getAgGenesisCert&lt;/code&gt; starts returning a certificate on mainnet, the guaranteed &lt;code&gt;finalized&lt;/code&gt; state will come in a sub-second timeframe, and your signature status flow will respond even faster. Do not switch to &lt;code&gt;finalized&lt;/code&gt; prematurely, and do reset any alerts about transaction counts. The gap described in our &lt;a href="https://orbitflare.com/blog/fundamentals/solana-commitment-levels-explained" rel="noopener noreferrer"&gt;commitment levels explainer&lt;/a&gt; between confirmed and finalized is going away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yellowstone gRPC and Jetstream users&lt;/strong&gt; should implement &lt;code&gt;bank_id&lt;/code&gt; processing mentioned above if they build blocks from the transaction-level data and upgrade to the Alpenglow client release prior to activation day. For Jetstream users who act on decoded transactions at &lt;code&gt;processed&lt;/code&gt;, their logic will remain the same, but the window where that data is ahead of finality will become shorter, from seconds to about 150 ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shredstream users&lt;/strong&gt; will be impacted the least as Turbine will stay, and so will shreds. Ticks will disappear, blocks will acquire a header marker and a footer, and under SIMD-0337 the FEC sets will be fixed at 32 data shreds plus 32 coding shreds. Rotor, when it ships, is the change that touches the propagation path, and our &lt;a href="https://orbitflare.com/blog/fundamentals/shredstream" rel="noopener noreferrer"&gt;Shredstream piece&lt;/a&gt; covers how the current one works.&lt;/p&gt;

&lt;p&gt;In case you are uncertain about your category, contact us in the &lt;a href="https://discord.gg/orbitflare" rel="noopener noreferrer"&gt;OrbitFlare Discord&lt;/a&gt; channel prior to activation rather than after.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Short Version
&lt;/h2&gt;

&lt;p&gt;Alpenglow is a protocol with published proofs, a fault model that is worse for one particular type of attacker, but better for all others, and a migration that cannot lose user transactions or leave the chain between two engines. The primary risk on 21 October is not about the protocol itself; it is about ensuring that all validators run a single client family for the transition, and about one sixth of stake has to move before then. If the transition experience repeats the testnet and devnet one, then the transition will take a few hundred milliseconds, and Solana will wake up with 150 ms finality and votes off the chain.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://orbitflare.com" rel="noopener noreferrer"&gt;OrbitFlare&lt;/a&gt; is a Solana infrastructure layer providing RPC, WebSocket, Yellowstone gRPC, Jetstream shred-decoded streaming, and Shredstream services.&lt;/em&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://drive.google.com/file/d/1RPJ9OyohFMuFfLmTB5ydPYlrKTIlUxq9/view" rel="noopener noreferrer"&gt;Solana Alpenglow Consensus white paper v1.2 (Kniep, Sliwinski, Wattenhofer, Anza)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0326-alpenglow.md" rel="noopener noreferrer"&gt;SIMD-0326: Alpenglow&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0384-alpenglow-migration.md" rel="noopener noreferrer"&gt;SIMD-0384: Alpenglow Migration&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/upgrades/alpenglow" rel="noopener noreferrer"&gt;Solana Foundation upgrade page: Alpenglow&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/consensus/alpenglow" rel="noopener noreferrer"&gt;Alpenglow operator documentation (Anza docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://blog.triton.one/alpenglow-and-your-triton-stack-what-to-update-before-mainnet/" rel="noopener noreferrer"&gt;Alpenglow on Mainnet: What to Update (Triton One)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://orbitflare.com/blog/fundamentals/alpenglow-solana-consensus-explained" rel="noopener noreferrer"&gt;orbitflare.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>alpenglow</category>
      <category>consensus</category>
      <category>rpc</category>
    </item>
    <item>
      <title>How to Build a Solana Indexer: Streams, Backfill, Decoding and Reconciliation</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:36:06 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/how-to-build-a-solana-indexer-streams-backfill-decoding-and-reconciliation-3h1c</link>
      <guid>https://dev.to/orbitflarerpc/how-to-build-a-solana-indexer-streams-backfill-decoding-and-reconciliation-3h1c</guid>
      <description>&lt;p&gt;Short answer: a Solana indexer consumes the chain's account and transaction streams and transforms them into a queryable database specific to your application. Token holders, pool activity, NFT transfers, and protocol positions: whatever your product needs, in order to answer faster than an RPC call can. The indexer architecture consists of a stream consumer (Geyser gRPC for live), a backfill source (archive RPC for history), a decoder for every program, an idempotent database writer, and a gap/reorg handling routine. This post describes every part, the decisions that make the indexer robust under load, and the underlying infrastructure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Index via Geyser gRPC stream, not via polling. Filters on the server side provide exactly the accounts and programs of interest, at node-processing latency.&lt;/li&gt;
&lt;li&gt;Backfill history via an archive once, stay live afterwards. Combining them without a cutover point usually results in holes in the index.&lt;/li&gt;
&lt;li&gt;Every write must be idempotent and keyed by the slot and the signature, due to stream replays and forks.&lt;/li&gt;
&lt;li&gt;Decode using the program's own layout and version the decoder; program upgrades cause silent corruption most often.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What an indexer is for
&lt;/h2&gt;

&lt;p&gt;An indexer is a tool to precompute answers to your questions and serve them from a database. Solana's RPC provides the answers to such questions as "this account now" or "that transaction happened". But it does not answer aggregate and historical questions efficiently: who holds a token, the hourly volume of a pool, the ownership history of an NFT. The indexer computes the answers by consuming the stream of account writes and transactions and storing them into the database of your choice.&lt;/p&gt;

&lt;p&gt;The indexer output serves your product needs, whether it's a relational database for analytics, a hot-path key-value database, or a search engine for discovery. While the output varies between products, the input is always the same: the account writes and transactions, filtered to the programs you are interested in, and ordered by slot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fix09hb66s044apsrfjso.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fix09hb66s044apsrfjso.png" alt="The six parts of an indexer" width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The live consumer
&lt;/h2&gt;

&lt;p&gt;Subscribe to the stream using Yellowstone gRPC filters for the accounts (by owner program with memcmp filters on discriminators in case multiple account types exist) and the transactions (including your programs). If the indexer does not handle rollbacks, request &lt;code&gt;confirmed&lt;/code&gt; commitment; &lt;code&gt;processed&lt;/code&gt; commitment is earlier, but can be rolled back.&lt;/p&gt;

&lt;p&gt;Track the slot number on every message. Your consumer's current slot number vs the chain's current slot number is the lag metric that shows how well your indexer keeps up with the chain, and a hole in the series of slots is a trigger for a gap reprocess. &lt;a href="https://orbitflare.com/blog/developers/yellowstone-grpc-explained" rel="noopener noreferrer"&gt;Yellowstone gRPC explained&lt;/a&gt; describes the stream subscription model; &lt;a href="https://orbitflare.com/blog/developers/solana-websockets-vs-grpc" rel="noopener noreferrer"&gt;WebSockets vs gRPC&lt;/a&gt; explains why the stream uses gRPC at this scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backfill
&lt;/h2&gt;

&lt;p&gt;The history prior to the beginning of the live feed comes from archive RPC. The usual approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the slot number at which your live consumer starts.&lt;/li&gt;
&lt;li&gt;Walk &lt;code&gt;getSignaturesForAddress&lt;/code&gt; for your programs backwards starting from this slot, paging until you find the first slot that needs to be indexed.&lt;/li&gt;
&lt;li&gt;Fetch each transaction via &lt;code&gt;getTransaction&lt;/code&gt; (or a block via &lt;code&gt;getBlock&lt;/code&gt; if the density of the transactions is high enough) and pass it through the same decoder and writer as in the live path.&lt;/li&gt;
&lt;li&gt;Stop at the cutover slot number. Transactions newer than this one are live, and older are from backfill. They should not overlap without idempotent writes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Backfill is where the request budgets go to die. Batch, page carefully, and use the plan whose archive access and rate limits match the job; &lt;a href="https://orbitflare.com/products/historical-data" rel="noopener noreferrer"&gt;historical data&lt;/a&gt; is this tier in OrbitFlare, and &lt;a href="https://orbitflare.com/blog/fundamentals/solana-rpc-pricing-explained" rel="noopener noreferrer"&gt;Solana RPC pricing explained&lt;/a&gt; explains why archival calls are expensive under credit pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoding
&lt;/h2&gt;

&lt;p&gt;The account data are bytes arranged according to the layout defined by the owning program; the instruction data as well. Decode using the IDL or layout of the program, and treat the decoder as versioned code: in case of a program upgrade and a layout change, the old accounts may contain the old layout until rewritten. A decoder that relies on a single layout silently corrupts the index.&lt;/p&gt;

&lt;p&gt;Three practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key decoders by the program ID and discriminator&lt;/strong&gt;, and handle the unknown discriminators by logging and skipping, not guessing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculate token balance differences using pre and post token balances from the transaction metadata.&lt;/strong&gt; They are independent from the instruction decoding and thus work regardless of any unknown layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store the raw bytes&lt;/strong&gt; in addition to decoded records for a retention period to be able to replay the decoding fix without fetching everything again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Writing idempotently
&lt;/h2&gt;

&lt;p&gt;The streams replay after disconnection, backfill overlaps the live feed at the cutover point, and forks at the &lt;code&gt;processed&lt;/code&gt; commitment may deliver the same slot twice with different content. The writer must be ready for all three: every record is keyed by the slot and the signature (and the instruction index where relevant), and writing the same key twice is either no operation or an overwrite, never a duplicate.&lt;/p&gt;

&lt;p&gt;Two patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upsert by the key&lt;/strong&gt; for current-state tables (holder balances, pool state).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Append-only events are keyed by the signature and the index&lt;/strong&gt; for history, with a unique constraint that excludes duplications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Commit in slot order and track the last completely written slot as a checkpoint; on restart, the indexing resumes from this point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reconciliation
&lt;/h2&gt;

&lt;p&gt;Gaps and reorgs happen and should be expected, not an exception.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gaps&lt;/strong&gt;: if your consumer skips some slots in its sequence, refetch the corresponding blocks from the archive RPC and process them with the pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reorgs&lt;/strong&gt;: at &lt;code&gt;processed&lt;/code&gt; commitment, a slot can be superseded. Either index at &lt;code&gt;confirmed&lt;/code&gt; (easier option) or maintain the window of unconfirmed writes that can be rolled back when a slot is superseded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift checks&lt;/strong&gt;: regularly compare the sample of indexed state against live &lt;code&gt;getAccountInfo&lt;/code&gt; requests; the discrepancy means some problem with the decoder or writing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming&lt;/strong&gt;: a gRPC endpoint in the region where the indexer is running, with the throughput generated by your filters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archive&lt;/strong&gt;: an endpoint with the required history depth and a request budget that is capable of surviving the backfill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated capacity&lt;/strong&gt; when your filter volume is high or backfill is continuous; a &lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;dedicated node&lt;/a&gt; removes shared limits from both paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: sized for write throughput in slot order, with indexes optimized for your queries rather than for ingest.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A Solana indexer is a live gRPC consumer with an archive backfill and a cutover point, with a decoder per program, idempotent database writer keyed by slot and signature, and a reconciler that handles gaps and reorgs. Start by getting the keys and commitment level right, since they define whether the indexer will stay correct under load or not. Then choose the streaming and archive endpoints that match your filters and backfill needs, and implement the drift checks to avoid undetected corruption.&lt;/p&gt;

&lt;p&gt;OrbitFlare's &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC service&lt;/a&gt; covers the live path, &lt;a href="https://orbitflare.com/products/historical-data" rel="noopener noreferrer"&gt;historical data&lt;/a&gt; the backfill, and &lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;dedicated nodes&lt;/a&gt; the volume.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://orbitflare.com/blog/developers/how-to-build-a-solana-indexer" rel="noopener noreferrer"&gt;orbitflare.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>indexing</category>
      <category>grpc</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to Run a Solana Validator: Hardware, Setup, Operations and Economics</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:09:30 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/how-to-run-a-solana-validator-hardware-setup-operations-and-economics-464l</link>
      <guid>https://dev.to/orbitflarerpc/how-to-run-a-solana-validator-hardware-setup-operations-and-economics-464l</guid>
      <description>&lt;p&gt;Running a Solana validator requires managing a highly capable server staying synchronized with the chain, casting votes on every new block, and generating blocks on time, while gathering enough delegated stake to be profitable. The technical aspect of configuring can take only a day, but running a validator is a lifelong dedication to hardware, networking, upgrading, and monitoring. Only once a validator gets a trusted name from delegators does the business pay off.&lt;/p&gt;

&lt;p&gt;This guide will cover hardware requirements, the step-by-step setup process, operations details, economic factors, and the honest decision if you should consider running a validator or delegating the stake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you run one?
&lt;/h2&gt;

&lt;p&gt;Consider becoming a validator to run an infrastructure-related business, having delegable stake or the way to gather it, and being ready for permanent operations. Consider &lt;a href="https://orbitflare.com/stake" rel="noopener noreferrer"&gt;delegating your stake&lt;/a&gt; if you are interested in staking yield; the &lt;a href="https://orbitflare.com/staking/calculator" rel="noopener noreferrer"&gt;staking calculator&lt;/a&gt; allows comparing options.&lt;/p&gt;

&lt;p&gt;Do not become a validator in order to "have a node for your app". Validator is a poor RPC server (API traffic and voting compete); the proper option is an &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC node&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware and location
&lt;/h2&gt;

&lt;p&gt;Requirements grow with each network upgrade; current minimal configurations are listed in &lt;a href="https://docs.anza.xyz/operations/requirements" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;, while the typical configuration exceeds it. General outline does not change much, however:&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zejsnnds38ft9vvyo9g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zejsnnds38ft9vvyo9g.png" width="800" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frankfurt, Amsterdam, and the East coast of the United States are regions with large stake accumulation and validator density because of that. Metered Internet egress is the dominant source of the bandwidth cost in public clouds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup sequence
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Provision your server host: tweak OS (file descriptor limits, network buffer sizes, huge page allocation), provision separate disks for accounts and ledger, provide time synchronization.&lt;/li&gt;
&lt;li&gt;Install your client: official Agave client or a popular Jito-Solana client (which provides MEV capability), or a newer Firedancer-based client. Pin its version; updating should be deliberate and done with care.&lt;/li&gt;
&lt;li&gt;Generate necessary keypairs: for identity, for vote account, and for authorized withdrawer which you store securely offline. Keep identity private key on the node, while withdrawer stays offline.&lt;/li&gt;
&lt;li&gt;Create a vote account with set-up commission and fund the identity account with sufficient amount of SOL to cover vote fees.&lt;/li&gt;
&lt;li&gt;Restore the node starting from snapshot and not from the genesis, allowing it to catch up with the chain tip.&lt;/li&gt;
&lt;li&gt;Check if the node is successfully synced, casting votes and listed in validator list with right commission.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Perform the setup process on testnet first: testnet was created for such purposes (&lt;a href="https://orbitflare.com/blog/fundamentals/solana-devnet-vs-mainnet-vs-testnet" rel="noopener noreferrer"&gt;devnet vs mainnet vs testnet&lt;/a&gt;). Testing the update and restart processes on the testnet prevents any damage during the process on the mainnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily operations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Upgrades:&lt;/strong&gt; clients receive regular updates, some become obligatory by a set deadline. Follow announcement channels, test the update on testnet and perform the upgrade on mainnet in the window selected by you to not coincide with being a leader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; watch for lag compared to the cluster, per epoch vote credits compared to peers, skip rate, delinquency status, disk usage and its rate of growth, network usage, and the SOL balance on the identity account for vote fee. You have to set alerts for all of them; otherwise, validator loses reputation without any notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restarts:&lt;/strong&gt; schedule them in advance. Restart of the node during its leadership slots leads to skipping of them. Snapshots reduce time required for a restart process, but do not make it instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key maintenance:&lt;/strong&gt; keypair for authorized withdrawer is used to withdraw rewards from the vote account; make sure this key stays offline. Change the identity key pair only after testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ledger management:&lt;/strong&gt; as the &lt;a href="https://orbitflare.com/blog/fundamentals/solana-archive-node-and-historical-data" rel="noopener noreferrer"&gt;chain grows&lt;/a&gt;, set up retention and pruning parameters, otherwise the disk will fill up and prevent further operation of the node.&lt;/p&gt;

&lt;h2&gt;
  
  
  The economics
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3giadd3iga0jlxj1f6gr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3giadd3iga0jlxj1f6gr.png" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process of getting profitability starts with losses for new validators. To get stakeholders' trust, you have to present good performance, join available &lt;a href="https://solana.org/delegation-program" rel="noopener noreferrer"&gt;delegation programs&lt;/a&gt;, offer reasonable commission without previous bait-and-switch history and operate well for as long as it takes for public metrics to speak for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Synchronization failure because disks or network throughput was chosen by the minimum possible value; node failed to keep up with chain under load.&lt;/li&gt;
&lt;li&gt;Missing obligatory update; validator is disconnected from the cluster.&lt;/li&gt;
&lt;li&gt;Restarting during leader slots and skipping of leader slots due to it.&lt;/li&gt;
&lt;li&gt;Running out of vote fee SOL on the identity account.&lt;/li&gt;
&lt;li&gt;Exposing validator public RPC port and lowering vote performance by doing so.&lt;/li&gt;
&lt;li&gt;Loss of key or online storage of withdrawer key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of those failure modes are easily avoided with proper monitoring and runbook, that's why initial testing on testnet is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Running a Solana validator is infrastructure business: latest generation bare-metal server close to other stakes, deliberate client selection and provisioning process, testing on testnet and monitoring on lag, skip rate and vote credits thereafter. Only after delegators trust the public metrics, the business starts earning money, and until that, it requires spending some. If your goal is staking yield, delegate it to the validator; if you need a Solana node to run your application, either run a &lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;dedicated node&lt;/a&gt; or rent &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC access&lt;/a&gt;. You have to become a validator only if running one is the goal itself.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OrbitFlare operates Jito-enabled &lt;a href="https://orbitflare.com/products/validator" rel="noopener noreferrer"&gt;validator&lt;/a&gt; you could delegate to, and &lt;a href="https://orbitflare.com/staking/calculator" rel="noopener noreferrer"&gt;staking calculator&lt;/a&gt; allows you to evaluate your choice before making it.&lt;/em&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/requirements" rel="noopener noreferrer"&gt;Validator hardware requirements (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/setup-a-validator" rel="noopener noreferrer"&gt;Setup a Solana validator (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/best-practices/general" rel="noopener noreferrer"&gt;Validator operations best practices (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/best-practices/monitoring" rel="noopener noreferrer"&gt;Validator monitoring best practices (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/best-practices/security" rel="noopener noreferrer"&gt;Validator security best practices (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/operations/validator-or-rpc-node" rel="noopener noreferrer"&gt;Validator or RPC node? (Agave docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.jito.wtf/" rel="noopener noreferrer"&gt;Jito-Solana and the block engine (Jito docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.firedancer.io/" rel="noopener noreferrer"&gt;Firedancer validator client (Firedancer docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.org/delegation-program" rel="noopener noreferrer"&gt;Solana Foundation Delegation Program (Solana Foundation)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.validators.app/" rel="noopener noreferrer"&gt;Validator performance metrics (Validators.app)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/blog/fundamentals/solana-devnet-vs-mainnet-vs-testnet" rel="noopener noreferrer"&gt;Solana devnet vs mainnet vs testnet (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/blog/fundamentals/network-infrastructure-for-low-latency-solana-trading" rel="noopener noreferrer"&gt;Network infrastructure for low-latency Solana trading (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/validator" rel="noopener noreferrer"&gt;OrbitFlare validator&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/staking/calculator" rel="noopener noreferrer"&gt;OrbitFlare staking calculator&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://discord.gg/orbitflare" rel="noopener noreferrer"&gt;OrbitFlare Discord&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>validator</category>
      <category>jito</category>
      <category>orbitflare</category>
    </item>
    <item>
      <title>Solana RPC for AI Agents: MCP, Tools and Guardrails</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Thu, 17 Sep 2026 12:07:34 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/solana-rpc-for-ai-agents-mcp-tools-and-guardrails-m1a</link>
      <guid>https://dev.to/orbitflarerpc/solana-rpc-for-ai-agents-mcp-tools-and-guardrails-m1a</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0crzkf2fzozw6fpc1brf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0crzkf2fzozw6fpc1brf.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An AI agent acting on Solana requires exactly the same components a trading bot requires, arranged in a way safe for the language model to use: a read path to current chain state, a write path to land transactions, and guardrails that bound the agent's spending and signature power. In 2026, this means an MCP (Model Context Protocol) server and tools wrapping the provider's RPC, gRPC, and transaction-landing endpoints, keeping keys and limits on the server side. Here we cover what exactly an agent needs from Solana infrastructure, how to expose it via MCP and tools, latency and cost issues, and guardrails that prevent an autonomous agent from turning into a costly incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an AI agent needs from Solana infrastructure
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbo2z9h76vb0sgfctu32.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbo2z9h76vb0sgfctu32.png" alt="AI Agent Needs Table" width="800" height="774"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The column on the right is the relevant one. A model can reason well on structured results and terribly on raw account bytes, and must never be able to construct a transaction from a raw RPC endpoint. Each capability is a tool, and the schema is where the guardrails live.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: the standard interface
&lt;/h2&gt;

&lt;p&gt;MCP allows a model to discover and invoke tools provided by a server via a standard protocol. In case of Solana, an MCP server wraps a provider's endpoints and exposes various tools, including &lt;code&gt;get_account&lt;/code&gt;, &lt;code&gt;get_token_balances&lt;/code&gt;, &lt;code&gt;simulate_swap&lt;/code&gt;, &lt;code&gt;send_transaction&lt;/code&gt; and others, each with typed inputs and outputs.&lt;/p&gt;

&lt;p&gt;OrbitFlare provides an MCP server and agent tooling for its endpoints; &lt;a href="https://docs.orbitflare.com/agents/overview" rel="noopener noreferrer"&gt;docs.orbitflare.com/agents&lt;/a&gt; describes the installation procedure and the available tools, including the CLI and SDK versions. The principles described below are applicable whether you use that server or implement your own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep credentials on the server side.&lt;/strong&gt; The MCP server stores the RPC key and, in case the agent is allowed to sign, the signing key or delegated signer. The model sees the tool names and results, but never the secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make reads broad and sends narrow.&lt;/strong&gt; Expose many read tools with generous limits and one or two send tools with strict policy. The agent should be able to explore anything freely and only able to act through a gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Return structured and decoded data.&lt;/strong&gt; Decode token accounts, pool reserves and transaction metadata on the server side. Passing raw base64-encoded strings as the tool result wastes the context and is prone to misunderstandings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails that belong to the tool layer
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpvu1te06cdtf73lwjlk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpvu1te06cdtf73lwjlk.png" alt="Guardrails Table" width="800" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A prompt is not a guardrail. You can talk the model out of following the prompt instruction; but you cannot do that when the limit or cap is enforced on the server side in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Latency: slower than a bot, but not optional
&lt;/h2&gt;

&lt;p&gt;An agent's workflow consists of observe, reason, act stages, with the reason step requiring hundreds of milliseconds to several seconds. This is much slower than a trading bot, leading some teams to think that the latency issue can be completely ignored here. But it cannot, because of the following reasons.&lt;/p&gt;

&lt;p&gt;First, outdated observation gets amplified by the long reasoning time: an agent reading a pool price, thinking for three seconds and acting upon it acts based on the price several slots old. Provide the agent with a fresh read immediately prior to sending, with a simulation returning an error in case the state moved.&lt;/p&gt;

&lt;p&gt;Second, an event-driven agent requires prompt wake-up. An agent reacting to a wallet movement or a governance proposal should be triggered by a subscription (Yellowstone gRPC or WebSockets), not a polling by a timer.&lt;/p&gt;

&lt;p&gt;For agents doing trading, the execution path is the same as for bots: a staked submission lane to avoid dropping the transaction under the load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost: agents are very chatty
&lt;/h2&gt;

&lt;p&gt;A model exploring the problem can invoke a dozen of read tools per step. When multiplied by steps and number of agents, it will consume the entire request budget. There are three ways to handle it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cache on the server side.&lt;/strong&gt; Account reads that were not changed since the last slot require no additional RPC calls; and a Yellowstone subscription keeps the cache hot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch in the tool.&lt;/strong&gt; A &lt;code&gt;get_token_balances&lt;/code&gt; tool should do a single &lt;code&gt;getMultipleAccounts&lt;/code&gt; call, not a separate one per account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer a pricing model that does not weight methods.&lt;/strong&gt; Agents call expensive methods (&lt;code&gt;getProgramAccounts&lt;/code&gt;, history) freely; while credit-based pricing penalizes that.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A reference setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provider endpoints:&lt;/strong&gt; a keyed RPC URL, a Yellowstone gRPC endpoint, and a staked send path, all in the region close to your agent's host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; with stored credentials, exposing decoded read tools, a simulation tool, triggers for subscriptions and a policy-gated send tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent runtime&lt;/strong&gt; (any model with tool invocation) with the MCP server, a limited signing key and the kill switch checked on every send.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability:&lt;/strong&gt; every tool invocation logged with input parameters, result, latency and cost, so you can trace what the agent did and why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation:&lt;/strong&gt; re-run recorded tool invocations trace against new prompts or models.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Solana infrastructure for AI agents is exactly the same read, write and guardrails stack as a bot, provided as typed tools via MCP with credentials and policy on the server side. Give the agent broad, decoded and cached reads; mandatory simulation step; and a narrow, limited, allowlisted send path with a kill switch. Trigger it by subscriptions rather than timers, and price for the chatty access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.orbitflare.com/agents/overview" rel="noopener noreferrer"&gt;Documentation of OrbitFlare's agents&lt;/a&gt; has the MCP server and SDK. The &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC plans&lt;/a&gt; and &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC service&lt;/a&gt; are the provider endpoints behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.orbitflare.com/agents/overview" rel="noopener noreferrer"&gt;OrbitFlare agents documentation: MCP server, CLI and SDK&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc/http/simulatetransaction" rel="noopener noreferrer"&gt;simulateTransaction RPC method (Solana docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/rpcpool/yellowstone-grpc" rel="noopener noreferrer"&gt;Yellowstone gRPC (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream and Yellowstone gRPC streaming (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;OrbitFlare RPC plans&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>orbitflare</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Solana WebSockets vs gRPC: When to Switch and How</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Wed, 16 Sep 2026 12:33:23 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/solana-websockets-vs-grpc-when-to-switch-and-how-47kg</link>
      <guid>https://dev.to/orbitflarerpc/solana-websockets-vs-grpc-when-to-switch-and-how-47kg</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1acx6q4ohknb4h7mf6g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1acx6q4ohknb4h7mf6g.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Both WebSocket and gRPC are meant to push Solana updates to the application without the need for client-side polling; for some types of dashboard subscriptions, the two can be used interchangeably. Differences arise when working on a larger scale: WebSocket subscriptions happen on the RPC layer after the block processing, transfer JSON, and become hard to maintain past several dozen subscriptions. On the other hand, Geyser gRPC is integrated into the node process, transfers binary data, applies server-side filters, and works well with thousands of accounts on a single stream. The suggested way to migrate is from WebSockets to gRPC as soon as the subscription count, message rate, or latency become a problem, whereas WebSockets continue to be used in simple scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational mechanisms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WebSocket&lt;/strong&gt; is a subscription part of the Solana JSON-RPC API. A WebSocket Secure (WSS) connection is established with an RPC node, subscribe requests are performed, and the node starts pushing notifications in JSON format when matching events reach the chosen commitment level. The events themselves are collected by the node in its internal block processing, and the RPC service then formats and sends them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geyser gRPC&lt;/strong&gt; is a plugin running inside the node process. It receives every account write, transaction, slot, and block, processed by the node, and streams the subset of it that satisfies the user-defined filters using a gRPC connection based on Protocol Buffers. No intermediary RPC layer is involved here, and no JSON is used. Yellowstone is the default plugin, and you can find details about the subscription model of Yellowstone gRPC in &lt;a href="https://github.com/rpcpool/yellowstone-grpc" rel="noopener noreferrer"&gt;its documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparative overview
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1li1s8d9ionbkd3q3k13.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1li1s8d9ionbkd3q3k13.png" alt="Websocket vs gRPC Table" width="800" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases for WebSockets
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaction confirmation:&lt;/strong&gt; the &lt;code&gt;signatureSubscribe&lt;/code&gt; functionality provides a simple tool to track a transaction until it reaches the desired commitment level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple dashboards:&lt;/strong&gt; keeping track of just a few accounts and the balances and logs of some programs using WebSocket capabilities is quite easy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications where some latency is not a concern:&lt;/strong&gt; notifications where some hundred milliseconds delay is acceptable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client simplicity:&lt;/strong&gt; wide library support with almost no dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use cases for gRPC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mass account watching:&lt;/strong&gt; keeping track of hundreds of wallets or all accounts belonging to a certain program with gRPC subscriptions is much easier than with WebSockets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High message rate:&lt;/strong&gt; the high message rate becomes a performance bottleneck for JSON serialization and per-subscription overhead on WebSockets; gRPC can handle the high throughput of streams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency-sensitive logic:&lt;/strong&gt; apps like trading, liquidation, and copy-trading bots require earlier visibility and server-side filters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive transaction metadata at scale:&lt;/strong&gt; Yellowstone transaction updates contain inner instructions, balance changes, and logs; the information vital for indexing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a third option for workloads where a single event is being watched that comes before both WebSockets and gRPC ones: shred-based streams like &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream&lt;/a&gt; where the transactions reconstructed from the leader broadcasts prior to node processing of the blocks are sent. The &lt;a href="https://orbitflare.com/blog/fundamentals/shredstream" rel="noopener noreferrer"&gt;Shredstream architecture&lt;/a&gt; explains why it works in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration from WebSockets to gRPC
&lt;/h2&gt;

&lt;p&gt;The transition doesn't have to be a full-scale thing done at once. The steps can be the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Measure your baseline metrics:&lt;/strong&gt; number of subscriptions, message rate, and latency between the slot of the event and the processing of it by the app. It will show what subscriptions to migrate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrating the largest subscription first:&lt;/strong&gt; it usually involves the &lt;code&gt;programSubscribe&lt;/code&gt; or many &lt;code&gt;accountSubscribe&lt;/code&gt; requests. Replace them with one gRPC accounts filter scoped to the program owner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrating the latency-sensitive subscription next:&lt;/strong&gt; the subscription that drives the bot's logic. Replace it with gRPC transactions or accounts filter at the &lt;code&gt;processed&lt;/code&gt; or &lt;code&gt;confirmed&lt;/code&gt; commitment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keeping the simple subscriptions on WebSockets until you have reasons to migrate them:&lt;/strong&gt; for instance, &lt;code&gt;signatureSubscribe&lt;/code&gt; for your own transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handling reconnections and possible gaps.&lt;/strong&gt; gRPC streams are prone to disconnections; perform idempotent resubscriptions and check the state of the stream against the chain after a long pause.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opening a WebSocket for every account.&lt;/strong&gt; Better to multiplex the subscriptions on one connection or, even better, migrate them to gRPC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side filtering on gRPC:&lt;/strong&gt; subscribe widely and filter locally, thus consuming extra bandwidth and latency. Use the filters in the subscription request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using &lt;code&gt;processed&lt;/code&gt; commitment without considering rollbacks:&lt;/strong&gt; the earliest commitment on either transport is reversible; use &lt;code&gt;confirmed&lt;/code&gt; ones unless you can handle the reversion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polling and subscribing to the same thing simultaneously:&lt;/strong&gt; if you have a subscription, stop polling the same data, as it wastes the request bandwidth and is slower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring slot gaps:&lt;/strong&gt; keep track of the slot corresponding to each message; the growing difference between the message slots and the current slot shows that the consumer is falling behind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost aspects
&lt;/h2&gt;

&lt;p&gt;WebSocket is included in most plans, even free tiers, because the node processes each event only once irrespective of the subscriber count. gRPC is usually a higher tier or a separate product because it transfers much more data per client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Both WebSocket and gRPC transfer Solana updates; the differences are in the node interface, data serialization, filters, and scalability capabilities. WebSockets are to be used in simple, small-scale, and latency-tolerant subscriptions, as well as for confirming one's transactions. Geyser gRPC should be used for multi-account watching, high message rate, latency-sensitive logic, and the shred stream in case you need an early event visibility prior to the node block processing. The transition should be gradual with the prioritization of subscriptions depending on the workload.&lt;/p&gt;

&lt;p&gt;OrbitFlare provides WebSocket on all plans and Yellowstone and Jetstream gRPC across all eleven regions. You can find more details on the &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc/websocket" rel="noopener noreferrer"&gt;Solana WebSocket RPC methods (Solana docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.anza.xyz/validator/geyser" rel="noopener noreferrer"&gt;Geyser plugins (Anza docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/rpcpool/yellowstone-grpc" rel="noopener noreferrer"&gt;Yellowstone gRPC (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/blog/fundamentals/shredstream" rel="noopener noreferrer"&gt;Shredstream explained (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream and Yellowstone gRPC streaming (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;OrbitFlare RPC plans&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>websocket</category>
      <category>grpc</category>
      <category>orbitflare</category>
    </item>
    <item>
      <title>getProgramAccounts Alternatives: Stop Scanning, Start Streaming</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Tue, 15 Sep 2026 12:51:08 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/getprogramaccounts-alternatives-stop-scanning-start-streaming-2k2h</link>
      <guid>https://dev.to/orbitflarerpc/getprogramaccounts-alternatives-stop-scanning-start-streaming-2k2h</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyhkybc9oh17ejo2eung.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpyhkybc9oh17ejo2eung.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;getProgramAccounts&lt;/code&gt; retrieves all accounts belonging to the given program with optional filtering in one request. It makes the method extremely costly, rate-limited and prone to throttling, making it the most expensive, rate-limited and throttled call in Solana RPC API. There are multiple options to use instead for anything else than a one-shot request: Geyser gRPC subscription streaming the accounts continuously, indexer pre-populated once for cheap querying, &lt;code&gt;getMultipleAccounts&lt;/code&gt; if the addresses are known, or provider-side index like DAS API for NFTs. Below you'll find the explanation of why the call is costly, what are the use-cases for it and alternatives for each of the use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Description of the method and the source of the cost
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;getProgramAccounts(programId, filters)&lt;/code&gt; requests the node to fetch all accounts with the given program as the owner and, optionally, filter them by data size and by &lt;code&gt;memcmp&lt;/code&gt; filters on the account data. Node must look into its account index with the given owner, apply the filters and serialize the response.&lt;/p&gt;

&lt;p&gt;The request is cheap for a small program owning just a few hundred accounts. On the contrary, a token program, a major decentralized exchange or a lending protocol owns millions of accounts. Even with tight filters, the node does lots of scanning and produces a huge response. Providers limit this call (by rate, response size or require filters and &lt;code&gt;dataSlice&lt;/code&gt;), weight the call very heavy in credit pricing and may offload the call to the specialized hardware. Applications repeatedly calling this method in a loop to monitor accounts are the most common cause of throttling and unexpected invoicing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases in which the method remains a good choice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-shot discovery&lt;/strong&gt;: finding all accounts of the given kind to seed an indexer or a cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small programs&lt;/strong&gt;: programs controlled by the user with a limited number of accounts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development&lt;/strong&gt;: exploring a program's accounts while developing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In all three cases the use of &lt;code&gt;dataSlice&lt;/code&gt; to get only the necessary bytes and applying tight &lt;code&gt;memcmp&lt;/code&gt; filters on the discriminator is advised to reduce the size of the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative 1: subscribe to the accounts with Yellowstone gRPC
&lt;/h2&gt;

&lt;p&gt;If the reason to call &lt;code&gt;getProgramAccounts&lt;/code&gt; repeatedly is to detect changes in accounts, a subscription is better than scanning. A Yellowstone gRPC account filter by the owner program (same &lt;code&gt;memcmp&lt;/code&gt; conditions) will stream all writes to each matching account. It eliminates the loop and provides lower latency than any polling period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative 2: build an indexer and query your own storage
&lt;/h2&gt;

&lt;p&gt;When the goal is to answer some aggregate questions (e.g., all holders of a mint, all positions above a certain threshold, all pools for the given pair) the proper solution is a database built from the stream and queried using SQL or a key-value lookup. Seed the indexer with a single &lt;code&gt;getProgramAccounts&lt;/code&gt; call or archival backfill and keep it up-to-date via gRPC to avoid scanning the chain for the same question again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative 3: &lt;code&gt;getMultipleAccounts&lt;/code&gt; for known addresses
&lt;/h2&gt;

&lt;p&gt;If the target accounts are known (they are derived addresses or have been identified by an indexer), fetch them directly. &lt;code&gt;getMultipleAccounts&lt;/code&gt; returns up to one hundred accounts per call and takes a fraction of the cost of a scan over a whole program. Many looping implementations of &lt;code&gt;getProgramAccounts&lt;/code&gt; actually request "fetch these fifty accounts I already know" in the wrong way.&lt;/p&gt;

&lt;p&gt;Accounts like associated token accounts, PDAs and pool accounts should be derived, not searched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative 4: provider-side indexes
&lt;/h2&gt;

&lt;p&gt;There are some questions that are asked often enough for providers to maintain their own indices. The most famous example is NFTs: Digital Asset Standard (DAS) API can answer "which assets does this wallet own" and "what is the metadata of a given asset" for standard and compressed NFTs without any program scans from the client side. &lt;a href="https://orbitflare.com/blog/developers/solana-nft-indexing-das-api" rel="noopener noreferrer"&gt;NFT and DAS indexing on Solana&lt;/a&gt; explains the issue. For token holders, balances and other questions check whether there is an index provided by your provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision framework by the question
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxa9krdzd7mu05f42epc4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxa9krdzd7mu05f42epc4.png" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If the continuous usage of the method is still needed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Always use &lt;code&gt;memcmp&lt;/code&gt; filters on the discriminator and use &lt;code&gt;dataSlice&lt;/code&gt; to fetch only the necessary bytes.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request data at the &lt;code&gt;confirmed&lt;/code&gt; commitment level;&lt;/strong&gt; &lt;code&gt;finalized&lt;/code&gt; commitment will give you the old snapshot anyway without any gain for a scan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache the results and compute the diffs instead of re-fetching the whole datasets.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer pricing models that don't weight the method specifically.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;**Consider getting a &lt;a href="//https**://orbitflare.com/products/dedicated-nodes"&gt;dedicated node&lt;/a&gt; if the scans are critical for your product: it will have a fixed hardware cost and no per-call costs and reduce the throttling risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;getProgramAccounts&lt;/code&gt; is a discovery method that turned into a polling method. It explains the throttling of applications and invoice increases. Substitute endless loops with Yellowstone gRPC subscription when you need to detect changes, with indexer for fast aggregate queries, with &lt;code&gt;getMultipleAccounts&lt;/code&gt; if the addresses are known or with a provider-side index like DAS if you need to work with NFTs. Keep using the method for one-shot discovery with &lt;code&gt;dataSlice&lt;/code&gt; and filters.&lt;/p&gt;

&lt;p&gt;OrbitFlare's &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC service&lt;/a&gt; is the streaming alternative to &lt;code&gt;getProgramAccounts&lt;/code&gt;, and the &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC plans&lt;/a&gt; are priced by requests per second with no method weighting, so the call costs the same as other methods when you need it.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc/http/getprogramaccounts" rel="noopener noreferrer"&gt;getProgramAccounts RPC method (Solana docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc/http/getmultipleaccounts" rel="noopener noreferrer"&gt;getMultipleAccounts RPC method (Solana docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/rpcpool/yellowstone-grpc" rel="noopener noreferrer"&gt;Yellowstone gRPC (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://developers.metaplex.com/das-api" rel="noopener noreferrer"&gt;Digital Asset Standard API (Metaplex docs)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/blog/developers/solana-nft-indexing-das-api" rel="noopener noreferrer"&gt;NFT and DAS indexing on Solana (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream and Yellowstone gRPC streaming (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;OrbitFlare dedicated nodes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;OrbitFlare RPC plans&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>orbitflare</category>
      <category>rpc</category>
      <category>grpc</category>
    </item>
    <item>
      <title>Copy Trading Architecture: Centralized vs Decentralized</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Mon, 14 Sep 2026 12:50:02 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/copy-trading-architecture-centralized-vs-decentralized-4e9h</link>
      <guid>https://dev.to/orbitflarerpc/copy-trading-architecture-centralized-vs-decentralized-4e9h</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq283bthnabhesenxk5v1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq283bthnabhesenxk5v1.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The difference in copy trading architecture centralized vs decentralized lies in the place where the trade is copied: a private platform ledger or a public chain. A centralized platform mirrors trades between accounts which it already controls. A decentralized platform needs to detect a trade outside of its control and submit another one before the window closes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the real architectural difference between centralized and decentralized copy trading?
&lt;/h2&gt;

&lt;p&gt;Centralized copy trading mirrors a trade within the platform's infrastructure without involving blockchain. Decentralized copy trading observes a public wallet on a blockchain, detects an order made by the wallet and executes another one to follow it.&lt;/p&gt;

&lt;p&gt;eToro explains the operation principle of its CopyTrader system: you allocate $1,000 to a trader who has $10,000 on their account, and when they open a $1,000 position, a $100 position &lt;a href="https://www.etoro.com/copytrader/copy-vs-mirror/" rel="noopener noreferrer"&gt;opens automatically in your account&lt;/a&gt;. It is proportional, executed on the platform's infrastructure and custodial. There is no wallet to monitor since the platform sees everything in advance.&lt;/p&gt;

&lt;p&gt;Decentralized copy trading doesn't allow any of that visibility. The wallet's transactions arrive on the public ledger and nothing will push them to you, so you have to retrieve transactions yourself and fast enough that there is still a time to submit a copy trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does a decentralized copy trading platform's architecture actually work?
&lt;/h2&gt;

&lt;p&gt;This is a combination of a detection layer and an execution layer, and almost all mistakes are made on the detection layer, by failing to see a transaction in time. The platform should see the transaction instantly, decode the trade and execute it before it is too late.&lt;/p&gt;

&lt;p&gt;The problem lies with the detection layer. Polling an RPC endpoint for signatures of the wallet works theoretically until you realize that you miss the trades and you receive updates periodically. &lt;a href="https://orbitflare.com/solutions/traders" rel="noopener noreferrer"&gt;OrbitFlare's own trader infrastructure page&lt;/a&gt; states that "Copy trading fails on latency and on gaps. Polling &lt;code&gt;getSignaturesForAddress&lt;/code&gt; means you find out after the fact and miss anything that lands between calls." The fix for that is a push model, a gRPC stream filtered by an account id server-side so that you receive transactions instantly.&lt;/p&gt;

&lt;p&gt;The execution layer then needs to submit a copy trade fast and protect from front-running. Here the MEV protection becomes useful, since Jito bundles offer &lt;a href="https://docs.jito.wtf/" rel="noopener noreferrer"&gt;fast landing and revert protection&lt;/a&gt;, so a copy trade transaction either lands or fails without costing you the position.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jb7nmepcoravjbfy4az.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jb7nmepcoravjbfy4az.png" width="799" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you actually build a copy trading platform on blockchain?
&lt;/h2&gt;

&lt;p&gt;Three components must operate to submit a trade: a low-latency data stream for detecting the trades of the source wallet, a decoder which understands the instructions of the DEX, and an execution pipeline which submits the trade quickly enough. A failure in any one of the components renders useless the rest of them.&lt;/p&gt;

&lt;p&gt;We made &lt;a href="https://github.com/orbitflare/templates/tree/main/solana-copy-trader" rel="noopener noreferrer"&gt;a working example of this exact architecture&lt;/a&gt; available instead of just explaining it. &lt;code&gt;solana-copy-trader&lt;/code&gt; template uses Jetstream instead of polling, can decode swaps across Jupiter, Raydium, and Pump.fun, and uses Jito MEV protection so that a copy trade lands safely without risking getting sandwiched. The platform is written with Rust, Tokio, gRPC and Redis, not because this is an unusual tech stack, but because copy trading is a streaming problem first and this is the stack which is efficient at processing a constant flow of transactions in real time without falling behind. The majority of copy-trading bots in the wild are broken at the decoding step, because they can decode swaps of one DEX and silently miss trades routed to any other DEX.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the future of decentralized copy trading look like?
&lt;/h2&gt;

&lt;p&gt;More and more platforms will switch to the streaming model because the platforms which copy trades one block late will keep losing fills to the platforms which use the streaming infrastructure. The copy trading infrastructure will become the question not of whether it should be decentralized or not, but how much latency it can tolerate depending on the strategy being followed. A slow-moving position tracker can get away with polling, but a sniper copy trade bot cannot.&lt;/p&gt;

&lt;p&gt;The best copy trading platforms, centralized or decentralized, converge to the same requirement: the platform must see the source event instantly, not on the next scheduled update. This is true regardless of whether you run a copy trading platform for retail followers or a copy bot for a specific strategy, because the infrastructure underlying the crypto copy trading platform is increasingly becoming the same as the infrastructure for market data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is decentralized copy trading always better than centralized?&lt;/strong&gt; Not necessarily. It trades the simplicity of the platform for the non-custodial feature and the ability to verify transactions publicly at the expense of the necessity to implement an infrastructure for detecting and racing on the blockchain transactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the minimal latency a decentralized copy trading platform needs?&lt;/strong&gt; There is no definite answer, because the latency requirements depend on the specific strategy being implemented.&lt;/p&gt;

&lt;p&gt;Want to see how the infrastructure of streaming-based copy trading looks in reality? &lt;a href="https://orbitflare.com/solutions/traders" rel="noopener noreferrer"&gt;OrbitFlare's trader solutions&lt;/a&gt; cover RPC, gRPC and Shredstream products which are commonly used for building such a bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/templates/tree/main/solana-copy-trader" rel="noopener noreferrer"&gt;OrbitFlare Solana copy trader template (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/solutions/traders" rel="noopener noreferrer"&gt;OrbitFlare trader solutions&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream and Yellowstone gRPC streaming (OrbitFlare)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.jito.wtf/" rel="noopener noreferrer"&gt;Jito bundles documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.etoro.com/copytrader/copy-vs-mirror/" rel="noopener noreferrer"&gt;eToro: copy trading vs mirror trading&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>copytrading</category>
      <category>solana</category>
      <category>orbitflare</category>
      <category>web3</category>
    </item>
    <item>
      <title>Solana Devnet vs Mainnet vs Testnet: Which Cluster for What</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Fri, 11 Sep 2026 14:00:38 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/solana-devnet-vs-mainnet-vs-testnet-which-cluster-for-what-45if</link>
      <guid>https://dev.to/orbitflarerpc/solana-devnet-vs-mainnet-vs-testnet-which-cluster-for-what-45if</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhkrdakwz8aj25wc6ozy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkhkrdakwz8aj25wc6ozy.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
There are three public clusters in Solana: Mainnet Beta, Devnet, and Testnet. Mainnet Beta is a production network with live SOLs, Devnet provides a way to test applications for free with freely airdropped SOL, but without any financial risk, while Testnet is supposed to be used by core developers and validators to test the next release of the network itself, and it is intentionally unstable and is not intended for application testing. Develop on Devnet, deploy to Mainnet and avoid deploying to Testnet except for validator software testing. This article is devoted to a thorough description of each cluster, how to direct your wallet and code to a cluster, practical differences between them and common mistakes made because of confusion with their usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three clusters
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngg7zdshdgk38dj9mbkf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngg7zdshdgk38dj9mbkf.png" width="800" height="636"&gt;&lt;/a&gt;&lt;br&gt;
"Beta" in the name of Mainnet is historical, as it supports real value for years and works as a production network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Devnet: a development platform
&lt;/h2&gt;

&lt;p&gt;Devnet uses the same validator software as Mainnet (sometimes even a newer version), runs identical programs and exposes the same RPC API, which means that the code can easily be switched from Devnet to Mainnet by changing an URL. You can get SOL from the faucet (there are some limitations on rate; do not request too much), deploy programs and verify end-to-end flows with zero financial risks.&lt;/p&gt;

&lt;p&gt;There are two caveats with Devnet: firstly, it can be reset, destroying all deployed programs and accounts; keep scripts of deployments to be able to redeploy programs. Secondly, it is quiet: there is no congestion, no competition for the block space and no saturation of transaction forwarding. It verifies the correctness of the logic but does not give any information about landing rate, priority fees and latency under load.&lt;/p&gt;

&lt;p&gt;OrbitFlare provides Devnet and Mainnet URLs per account; every OrbitFlare plan, even free, includes Devnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mainnet Beta: the home of the value
&lt;/h2&gt;

&lt;p&gt;Devoted to real SOL, real users and real competition for block space. All validations on Devnet, although helpful, are not enough here: network congestion appears during important events, leaders prioritize staked connections and priority fees are real market. The &lt;a href="https://orbitflare.com/blog/fundamentals/network-infrastructure-for-low-latency-solana-trading" rel="noopener noreferrer"&gt;low-latency infrastructure guide&lt;/a&gt; covers specifics of this environment.&lt;/p&gt;

&lt;p&gt;Testing on Mainnet before launching should be done in small scales: just replicate the same transaction flow, spend real fees and measure landing rate in peak periods.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testnet: generally not suitable for applications
&lt;/h2&gt;

&lt;p&gt;Testnet is used for validators to be able to run release candidates and for core teams to test network changes under load. It is updated frequently, may fork or be reset and tooling is oriented towards node operators. Application developers testing their programs on Testnet face instability without any benefits. In case if some tutorial tells you to use Testnet for your dApp, this tutorial is probably outdated; use Devnet instead.&lt;/p&gt;

&lt;p&gt;In case if you are going to operate a validator on Mainnet, you can run one on Testnet as a proving ground.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pointing wallets and code to a cluster
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Wallets&lt;/strong&gt;: most wallets have a network switcher (Mainnet, Devnet, Testnet) in settings and a separate RPC field per network. Switch to Devnet to verify the application running on a Devnet deployment; return to Mainnet before handling real funds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;: cluster is defined by an RPC URL. Keep one URL per environment in configuration (for example, &lt;code&gt;SOLANA_RPC_URL&lt;/code&gt; for production environment with a connection to Mainnet and a separate variable for development environment with a connection to Devnet), do not derive one from another at runtime. Local test validator (&lt;code&gt;solana-test-validator&lt;/code&gt;) is the fourth way to test your code: a private cluster on a local computer, instant and free, without any network involvement.&lt;/p&gt;

&lt;p&gt;Program addresses are different in different clusters for your own programs (each program is deployed separately per cluster), but core programs (token program, system program, associated token program) have the same addresses. Well-known third-party programs are usually deployed both on Devnet and Mainnet at identical addresses, but still better to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical differences
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjxtxdxf3sl6ng8vwt9x.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjxtxdxf3sl6ng8vwt9x.png" width="800" height="688"&gt;&lt;/a&gt;&lt;br&gt;
The main difference is that Devnet verifies the correctness of the logic and Mainnet verifies the performance and economics. Bots, in particular, may work perfectly on Devnet and become unprofitable or unable to land on Mainnet, which explains the emphasis on Mainnet testing in the &lt;a href="https://orbitflare.com/blog/developers/solana-sniper-bot-guide" rel="noopener noreferrer"&gt;sniper bot guide&lt;/a&gt; with small transaction volumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Incorrect URL in production.&lt;/strong&gt; A release targeted to Devnet looks working but actually performs no real operations. Separate configurations and startup check of genesis hash will help to overcome this problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing landing on Devnet.&lt;/strong&gt; Transactions always land on Devnet, so measure on Mainnet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expecting that a certain program exists on Devnet.&lt;/strong&gt; Some Mainnet programs are not deployed on Devnet or are deployed at different addresses; better to verify this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relying on Devnet state.&lt;/strong&gt; Resets destroy it; keep scripts of redeployments and seed data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using Testnet for dApps.&lt;/strong&gt; Its instability does not provide any benefits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Devnet is for development, Mainnet is for production and Testnet is for network-level testing. Keep separate cluster URLs per environment, verify the genesis hash at startup, verify your logic on Devnet and performance on Mainnet with small-scale tests and understand that landing, fees or latency characteristics cannot be verified on a quiet cluster.&lt;/p&gt;

&lt;p&gt;OrbitFlare provides Devnet and Mainnet URLs through a free account; &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC plans&lt;/a&gt; cover the Mainnet path in case of deployment under load.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>orbitflare</category>
      <category>cluster</category>
      <category>web3</category>
    </item>
    <item>
      <title>Solana Archive Nodes and Historical Data: What Needs an Archive and How to Use It</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Fri, 11 Sep 2026 13:55:20 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/solana-archive-nodes-and-historical-data-what-needs-an-archive-and-how-to-use-it-j45</link>
      <guid>https://dev.to/orbitflarerpc/solana-archive-nodes-and-historical-data-what-needs-an-archive-and-how-to-use-it-j45</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwtl67xqxwoigu9jr65z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwtl67xqxwoigu9jr65z.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
A standard Solana RPC node maintains only a recent history of ledger data, so requests for blocks, transactions, or signatures older than some time window return no results. An archive, or, more precisely, an archive data tier, holds the full ledger history in a separate long-term storage and delivers it via the same RPC API. You need access to archive data if you want to obtain a wallet's history, the trades of a pool from some months ago, or any block created before last week; most people rent it rather than maintain it themselves. This post explains what the retention window is, which methods use the archive, what it means to run an archive, and how to use historical data efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retention window
&lt;/h2&gt;

&lt;p&gt;Any Solana validator or RPC node stores the ledger (i.e., blocks and transactions) in a local database that gradually accumulates entries. Due to the huge amount of history, nodes perform pruning: they keep a certain number of recent slots and drop older ones. The window is measured in days. Requests for any slots within the window succeed, while requests for any slots outside the window return null or an error that the slot is unavailable.&lt;/p&gt;

&lt;p&gt;That might be unexpected for teams that are familiar with other chains, where a full node can deliver any history. On Solana, the full history is an explicitly separate product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an archive tier
&lt;/h2&gt;

&lt;p&gt;An archive is a long-term storage of all blocks and transactions starting from genesis or from the moment when the archive was turned on; all blocks and transactions are delivered via the same RPC methods. The reference implementation uses a wide-column database (there is support for a BigTable-style backend), and providers maintain something similar to that. When an RPC node receives a request for a slot that is out of the local retention window, it forwards the query to the archive.&lt;/p&gt;

&lt;p&gt;On your side, nothing changes: the same call for a transaction works for transactions created yesterday or two years ago as long as the endpoint has an archive access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which methods use the archive
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22mjf1hz92k9gki6bq6g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22mjf1hz92k9gki6bq6g.png" width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This last detail changes the way you design applications. There is no "balance at slot X" method on Solana. If you need any historical balances or positions, you should rebuild them yourself from the history of transactions (from pre- and post-balance in every transaction's metadata).&lt;/p&gt;

&lt;h2&gt;
  
  
  Typical archive queries
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;wallet history&lt;/strong&gt;: all transactions of an address, done with the combination of &lt;code&gt;getSignaturesForAddress&lt;/code&gt; and subsequent &lt;code&gt;getTransaction&lt;/code&gt; calls. Required by explorers, portfolio trackers, tax calculators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;protocol analytics&lt;/strong&gt;: all swaps at a pool during a period, re-created from blocks or from the lists of signatures for a program.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;indexer backfill&lt;/strong&gt;: filling all the pre-live data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;compliance and audit&lt;/strong&gt;: proving what happened and when.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;research&lt;/strong&gt;: any walk through history.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running your own archive
&lt;/h2&gt;

&lt;p&gt;It is the most expensive Solana infrastructure to maintain: the historical data is huge and grows by each slot, the backing storage has to grow along with that, and the ingestion process should never lag behind. Providers or large indexers with their dedicated data team are usually the ones who run it. For most projects, the option of renting access to the archive is reasonable. OrbitFlare &lt;a href="https://orbitflare.com/products/historical-data" rel="noopener noreferrer"&gt;historical data&lt;/a&gt; tier is an archive tier and is available via the same API endpoints as the whole service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using historical data efficiently
&lt;/h2&gt;

&lt;p&gt;Historical calls are the heaviest and, under credit-based pricing, the most expensive requests in the API. There are four ways of reducing cost and latency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page &lt;code&gt;getSignaturesForAddress&lt;/code&gt; requests with &lt;code&gt;before&lt;/code&gt; and &lt;code&gt;until&lt;/code&gt; and stop as soon as you reach the range that you need; don't scan the whole history if you need only last month.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;getBlock&lt;/code&gt; with transaction details if a block contains many interesting transactions, and use &lt;code&gt;getTransaction&lt;/code&gt; if there are few.&lt;/strong&gt; It is very wasteful to fetch an entire block to get a single transaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache immutable results.&lt;/strong&gt; Finalized transactions never change; you should store them once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backfill once, then stay live.&lt;/strong&gt; Use a gRPC stream to receive new data and an archive for pre-backfill data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose a pricing model that works well with the historical queries. Under requests-per-second pricing model, a historical call is the same as any other call; under credit pricing model, it is usually weighted heavier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Solana's standard nodes forget history after some days; anything older is an archive query delivered from a separate long-term storage via the same RPC API. Historical calls to &lt;code&gt;getBlock&lt;/code&gt;, &lt;code&gt;getTransaction&lt;/code&gt;, and &lt;code&gt;getSignaturesForAddress&lt;/code&gt; against old slots need an archive access; current-state calls never do, and there is no historical-state calls at all; thus, history reconstruction is an indexing task. Rent an archive access rather than run it yourself, do efficient paging and caching, and choose a pricing model that doesn't punish heavy requests.&lt;/p&gt;

&lt;p&gt;OrbitFlare &lt;a href="https://orbitflare.com/products/historical-data" rel="noopener noreferrer"&gt;historical data&lt;/a&gt; tier delivers the full history through the standard API endpoints; combine it with the &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC service&lt;/a&gt; for the post-backfill data.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>orbitflare</category>
      <category>archive</category>
      <category>rpc</category>
    </item>
    <item>
      <title>Agave 4.2: Transaction V1 Breaking Changes Checklist</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Thu, 10 Sep 2026 00:02:52 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/agave-42-transaction-v1-breaking-changes-checklist-50h</link>
      <guid>https://dev.to/orbitflarerpc/agave-42-transaction-v1-breaking-changes-checklist-50h</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0cildamw8gupgri24gn3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0cildamw8gupgri24gn3.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Transaction V1 activates on Solana mainnet at the next epoch boundary on 10 September 2026. The new version increases the maximum transaction size from 1,232 bytes to 4,096 bytes and adds a new format that cannot be read by the old client libraries.&lt;/p&gt;

&lt;p&gt;Only one item on the list causes an error; all others allow code to function with incorrect numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status of each change
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8sg6wijk90s7yz59b95.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8sg6wijk90s7yz59b95.png" alt="SIMD Table" width="800" height="726"&gt;&lt;/a&gt;&lt;br&gt;
Agave 4.2 was released on 11 August 2026; however, none of the changes have been activated on that date. Every change has its own activation gate, which explains the different dates mentioned above.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Require v1 on every call that returns transactions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Any call that returns transactions and has not been declared compatible with version 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; With an error (the only item causing an error). The error code is -32015. The whole call fails, not just this particular transaction. As a consequence, a single v1 transaction in a block breaks the &lt;code&gt;getBlock&lt;/code&gt; call for the whole block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to verify.&lt;/strong&gt; &lt;code&gt;getBlock&lt;/code&gt;, &lt;code&gt;getTransaction&lt;/code&gt;, &lt;code&gt;getTransactionsForAddress&lt;/code&gt; when &lt;code&gt;transactionDetails&lt;/code&gt; is &lt;code&gt;full&lt;/code&gt;, and the &lt;code&gt;transactionSubscribe&lt;/code&gt; and &lt;code&gt;blockSubscribe&lt;/code&gt; WebSocket subscriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Add &lt;code&gt;maxSupportedTransactionVersion: 1&lt;/code&gt; to every relevant endpoint. Update the SDK first and check its ability to read v1 transactions; otherwise, requesting an unsupported version will merely move the error. For TypeScript, use &lt;code&gt;@solana/kit&lt;/code&gt; 8.0 or higher, or &lt;code&gt;@solana/web3.js&lt;/code&gt; v3. For Rust, use &lt;code&gt;solana-rpc-client-api&lt;/code&gt; 4.2 or higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Read the priority fee from the header
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Any way to estimate the fees by looking for ComputeBudget instruction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; Without an error. A v1 transaction doesn't contain a ComputeBudget instruction; any code scanning for it fails to find anything, reports zero, and proceeds further. Thus, every v1 transaction appears to pay zero priority fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason for change.&lt;/strong&gt; With v0, validators needed to look through the instruction data to calculate the bid of a transaction, which took time. With v1, the compute budget moves into the header, where the priority fee, the compute unit limit, the account data size limit, and the heap request reside. In case a v1 transaction contains a ComputeBudget instruction, it is simply ignored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Use the &lt;code&gt;priorityFee&lt;/code&gt; property from the &lt;code&gt;transactionConfig&lt;/code&gt; object. Watch the units carefully; in legacy and v0 the number meant the price in micro-lamports per compute unit. In v1, it means the total in lamports. Thus, the &lt;code&gt;priorityFee&lt;/code&gt; of &lt;code&gt;50000&lt;/code&gt; corresponds to 50,000 lamports for the whole transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Stop assuming updates for every writable account
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Everything that correlates transactions to accounts, performs reconciliation, and counts the number of account updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; Without an error. Agave 4.2 stops writing accounts that a transaction locked for writing but didn't update; thus, those accounts stop emitting updates in &lt;code&gt;getBlock&lt;/code&gt; and gRPC and WebSocket streams. Providers deploying the new release start getting approximately 80% fewer events, although depending on the kind of data you monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Consider the absence of the update event as a signal of "unchanged" rather than as an error. The fee payer is the only account that can be assumed updated reliably. Thus, adapt your monitoring code to the situation; you'll start getting a lot fewer update events, even without service failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a new reward type
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Parsers limited to the fixed number of reward types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; Without an error. The stake account being deactivated produces a final payout with type &lt;code&gt;DeactivatedStake&lt;/code&gt;, which appears together with other types (fee, rent, staking, voting) in &lt;code&gt;getBlock&lt;/code&gt; and &lt;code&gt;blockSubscribe&lt;/code&gt; rewards. Parsers unaware of the new value simply skip it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Add &lt;code&gt;DeactivatedStake&lt;/code&gt; to the list of accepted reward types. During the update, make sure to log the unknown values, so that you'll start seeing the newly introduced values in logs instead of holes in numeric outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Update Token-2022 parsing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Anything that parses Token-2022 instructions or mint extensions from &lt;code&gt;jsonParsed&lt;/code&gt; responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; Some expected fields might be missing, whereas some absent fields might appear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changes.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;depositConfidentialTransfer&lt;/code&gt; and &lt;code&gt;withdrawConfidentialTransfer&lt;/code&gt; no longer have separate &lt;code&gt;source&lt;/code&gt; and &lt;code&gt;destination&lt;/code&gt; fields; there is a single &lt;code&gt;account&lt;/code&gt; field now, since the two were always equal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unwrapLamports&lt;/code&gt;, &lt;code&gt;confidentialBurn&lt;/code&gt;, permissioned burn, and batch operations are parsed as JSON instead of raw bytes. &lt;code&gt;unwrapLamports&lt;/code&gt; has the &lt;code&gt;amount&lt;/code&gt; as a string and it can be omitted if the whole balance is unwrapped.&lt;/li&gt;
&lt;li&gt;Mints with unknown extensions no longer return an empty &lt;code&gt;extensions&lt;/code&gt; array, but the full correct one, which can have some names unknown before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Adapt your code to the new &lt;code&gt;account&lt;/code&gt; field structure, don't reject extension names you don't know yet, and consider the absence of &lt;code&gt;unwrapLamports&lt;/code&gt; &lt;code&gt;amount&lt;/code&gt; as the sign of complete unwrap.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Stop using the hardcoded slot time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What fails.&lt;/strong&gt; Anything that relies on 400 ms interval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it fails.&lt;/strong&gt; Slowly accumulates problems: timeouts trigger too soon, estimates of blocks per window go wrong, and calculations of duration based on slot count become wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended action.&lt;/strong&gt; Mainnet has switched to 350 ms at epoch 1020 (21 August 2026) and to 300 ms at epoch 1024 (28 August). SIMD-0525 reduces the slot time by 50 ms each time, approaching 200 ms. The 250 ms value is currently active on testnet but not on mainnet. Don't hardcode the value; calculate the time either based on block timestamps or configure it so that the future changes would be done via configurations, not new releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versions to pin
&lt;/h2&gt;

&lt;p&gt;The minimum version corresponds to the earliest release able to read v1.&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipabms2q4tp73h4xd5uk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fipabms2q4tp73h4xd5uk.png" alt="Minimum Version Table" width="800" height="913"&gt;&lt;/a&gt;&lt;br&gt;
Note: &lt;code&gt;orbitflare-sdk-proto&lt;/code&gt; is an internal dependency of the Rust SDK and is included automatically; direct pinning is only needed if you consume the protos directly.&lt;/p&gt;

&lt;p&gt;Go users need to regenerate the protobuf bindings from the current Yellowstone protos and &lt;code&gt;solana-storage-proto&lt;/code&gt;, not from an older pinned file.&lt;/p&gt;

&lt;h2&gt;
  
  
  If decoding transactions manually
&lt;/h2&gt;

&lt;p&gt;If you parse raw transaction bytes, be it the provided decode example, a custom shred decoder, or your own parser, there are three layout changes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The version byte is 129 now, allowing distinguishing v1 transactions from legacy and v0.&lt;/li&gt;
&lt;li&gt;Signatures come at the end of the transaction, not at the beginning.&lt;/li&gt;
&lt;li&gt;The compute budget moves from the instructions into the header.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Address lookup tables do not exist in v1; practically, this is fine, because the 4,096-byte limit allows listing the accounts directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There are six items to check, with the only one failing definitively. Other five allow normal operation with erroneous measurements.&lt;/p&gt;

&lt;p&gt;Do it in the following order: first fix the reading calls (the primary source of errors), then the fee interpretation, then the account and reward parsing, and finally the timing constants.&lt;/p&gt;

&lt;p&gt;OrbitFlare's &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC&lt;/a&gt;, &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Yellowstone gRPC, and Jetstream&lt;/a&gt; systems deploy the current Agave release in all regions, handling the format changes on the server side. Jetstream sends v1 transactions without requiring subscription change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0296-larger-transactions.md" rel="noopener noreferrer"&gt;SIMD-0296: larger transactions&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0385-transaction-v1.md" rel="noopener noreferrer"&gt;SIMD-0385: transaction v1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/upgrades/agave-4-2-release-overview" rel="noopener noreferrer"&gt;Agave 4.2 release overview (Solana)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/upgrades/reduced-slot-times" rel="noopener noreferrer"&gt;Reduced slot times (SIMD-0525)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/upgrades/reduced-rent" rel="noopener noreferrer"&gt;Reduced rent (SIMD-0437)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/shredstream-decode-example" rel="noopener noreferrer"&gt;OrbitFlare shredstream decode example&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://crates.io/crates/orbitflare-sdk" rel="noopener noreferrer"&gt;OrbitFlare Rust SDK: orbitflare-sdk (crates.io)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://crates.io/crates/orbitflare-sdk-proto" rel="noopener noreferrer"&gt;OrbitFlare proto crate: orbitflare-sdk-proto (crates.io)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@orbitflare/sdk" rel="noopener noreferrer"&gt;OrbitFlare TypeScript SDK: @orbitflare/sdk (npm)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/orbitflare-sdk-go" rel="noopener noreferrer"&gt;OrbitFlare Go SDK: orbitflare-sdk-go (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>agave</category>
      <category>solana</category>
      <category>orbitflare</category>
      <category>simd</category>
    </item>
    <item>
      <title>Solana RPC Rate Limits: How They Work and How to Stop Hitting Them</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Tue, 08 Sep 2026 15:11:31 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/solana-rpc-rate-limits-how-they-work-and-how-to-stop-hitting-them-38bn</link>
      <guid>https://dev.to/orbitflarerpc/solana-rpc-rate-limits-how-they-work-and-how-to-stop-hitting-them-38bn</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6trhyymr6bbchc00kmd9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6trhyymr6bbchc00kmd9.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
In short, the provider, not the protocol, enforces the Solana RPC rate limits, which are available in three forms: a number of requests per second, a monthly quota of credits or compute units, and per-method limits applied to costly operations such as &lt;code&gt;getProgramAccounts&lt;/code&gt;. If you reach one of these limits you receive an HTTP 429 response or a JSON-RPC error, and the solution is seldom to upgrade to a more expensive plan; instead it is generally necessary to stop polling, to batch the data you fetch, to subscribe to changes and to cache the data that doesn't change. This guide outlines how the limits work, how to determine which one you have hit, and the modifications that reduce request volume by a factor of ten.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public endpoints limit requests per IP address, and strictly so, while provider plans impose limits per key and include a budget that can be viewed in a dashboard.&lt;/li&gt;
&lt;li&gt;The three types of limits fail in different ways: if the RPS limit is exceeded the system returns a 429 immediately, if the credit allowance is exhausted it either throttles the request or charges for the overage, and a heavy method may be refused completely.&lt;/li&gt;
&lt;li&gt;Nearly all limit problems involve polling. Simply replace a poll loop with a subscription and the calls will be eliminated.&lt;/li&gt;
&lt;li&gt;Regard a keyed URL as a credential; if the key is leaked it will use up your quota on someone else's machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How the limits work
&lt;/h2&gt;

&lt;p&gt;The Solana protocol does not have the idea of an API rate limit; instead, a node will respond to whatever request it is able to handle. Such limits are necessary since nodes are finite and the providers have to share them. Three methods are commonly used, often being combined.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;How it is measured&lt;/th&gt;
&lt;th&gt;What hitting it looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requests per second&lt;/td&gt;
&lt;td&gt;A sliding window per key or per IP&lt;/td&gt;
&lt;td&gt;Immediate 429 on the excess requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly allowance (credits or compute units)&lt;/td&gt;
&lt;td&gt;Each method deducts a weight from a pool&lt;/td&gt;
&lt;td&gt;Throttling or overage billing when the pool is empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-method limits&lt;/td&gt;
&lt;td&gt;Caps or refusals on heavy methods&lt;/td&gt;
&lt;td&gt;Errors specific to &lt;code&gt;getProgramAccounts&lt;/code&gt;, large &lt;code&gt;getBlock&lt;/code&gt; calls, archive queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The public endpoints are the ones with the lowest numbers and are associated with your IP address. The public mainnet endpoint, for example, allows 100 requests per 10 seconds per IP, 40 requests per 10 seconds per IP for any single method, 40 concurrent connections per IP, and 100 MB of data per 30 seconds, and Solana's own documentation says that it is not intended for production applications. For provider plans, the numbers are given according to each tier and usage is displayed in a dashboard, which should be the first place you check when there's a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnosing which limit you hit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When receiving an HTTP 429 with bursts: you have exceeded the number of requests per second. Check for loops, parallel fan-out, or a retry storm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Either 429 or the rate is reduced towards the end of the month: the allowance is used up. Check the usage at the method level since the typical cause is a heavy method being called in a loop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Errors occur only in the case of a particular method: there is a per-method limit. The usual examples are &lt;code&gt;getProgramAccounts&lt;/code&gt; and the extensive &lt;code&gt;getLogs&lt;/code&gt; or &lt;code&gt;getSignaturesForAddress&lt;/code&gt; ranges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see usage that you do not recognise, the key may have been leaked. Rotate it and find out who is calling with it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cutting request volume
&lt;/h2&gt;

&lt;p&gt;The fixes listed below are given in order of the amount of request volume they usually save.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Use subscriptions instead of polling. If a loop calls &lt;code&gt;getAccountInfo&lt;/code&gt; once every second, it ends up making 86,400 calls per account each day and detects changes with a delay. However, using a WebSocket &lt;code&gt;accountSubscribe&lt;/code&gt; or a Yellowstone gRPC accounts filter results in no calls being made and means that changes are detected instantly. This one change eliminates most of the request volume in most applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not call &lt;code&gt;getProgramAccounts&lt;/code&gt; in a loop. It is the most intensive method in the API and at the same time the one that providers restrict the most.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Batch. &lt;code&gt;getMultipleAccounts&lt;/code&gt; can retrieve up to 100 accounts with a single call; by using JSON-RPC batch requests (an array of request objects sent in a single POST, which the Solana RPC specification supports), several calls can be combined into a single round trip. Ten calls are then made as one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store data that is immutable and changes slowly. Finalised transactions never change, so they can be cached for as long as you like. Program accounts that have been decoded once can be kept, and token metadata also changes rarely. The time-to-live period for the cache should match the frequency with which the data actually changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;code&gt;dataSlice&lt;/code&gt; and precise filters. Only retrieve the bytes that are required. This is cheaper in terms of compute units and results in faster responses everywhere.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix the retries. When receiving a 429 response, use exponential backoff with jitter and avoid attempting an immediate retry since a retry storm can turn a short-term limit into a lengthy outage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead of checking the status via &lt;code&gt;getSignatureStatuses&lt;/code&gt; at intervals of a few hundred milliseconds, confirm the transactions using &lt;code&gt;signatureSubscribe&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Designing for limits from the start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use one connection per process, and reuse it with keep-alive; establishing a new connection for each request results in latency and causes the limits to be reached more quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prepare a budget on a per-feature basis by determining the number of calls that each part of the application makes per user action and then monitoring this figure in the provider's dashboard as the features are released.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign separate keys for each service and environment. A job that goes wrong in the staging environment should not use up the resources allocated to production, and a leak in one service should not cause all the other services to fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor the 429 rate and usage in relation to the allowance, with alerts triggered well in advance of exhaustion.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When you actually need a bigger plan
&lt;/h2&gt;

&lt;p&gt;Once the adjustments mentioned above have been made, ongoing legitimate traffic that exceeds the plan's ceiling is the reason to upgrade. The other reason is when you need a feature which the tier doesn't provide: gRPC streaming, archive depth, regional endpoints, or a staked transaction path. And when high levels of sustained traffic are involved, a &lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;dedicated node&lt;/a&gt; eliminates rate limits altogether since your limitation will then be determined by the hardware rather than by a shared budget.&lt;/p&gt;

&lt;p&gt;The plans offered by OrbitFlare are based on requests per second without taking into account the weight of individual methods, meaning that a heavy method does not use up part of the allowance; the tiers are listed on the &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC nodes page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The rate limits on Solana RPC services are a feature provided by the provider and come in three forms: per second, per allowance, and per method. Work out which of these you are encountering by looking at the error messages and using the dashboard, then reduce the volume by subscribing rather than polling, phasing out loops using &lt;code&gt;getProgramAccounts&lt;/code&gt;, batching the requests, caching the results, slicing the data, and correcting the retry mechanism. It is only after that that a bigger plan becomes appropriate, and at a real scale a dedicated node makes the issue disappear.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;OrbitFlare RPC plans&lt;/a&gt; state their requests-per-second budgets and offer WebSockets on all tiers; the &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;gRPC service&lt;/a&gt; is the subscription option which makes most polling unnecessary.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/references/clusters" rel="noopener noreferrer"&gt;Solana clusters and public RPC endpoint limits&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc" rel="noopener noreferrer"&gt;Solana JSON-RPC documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/docs/rpc/http/getmultipleaccounts" rel="noopener noreferrer"&gt;getMultipleAccounts reference&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;OrbitFlare RPC plans&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/pricing" rel="noopener noreferrer"&gt;OrbitFlare pricing&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;OrbitFlare dedicated nodes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>How to Build a Solana Sniper Bot: Detection, Filters and Execution</title>
      <dc:creator>OrbitFlare RPC</dc:creator>
      <pubDate>Tue, 08 Sep 2026 14:04:21 +0000</pubDate>
      <link>https://dev.to/orbitflarerpc/how-to-build-a-solana-sniper-bot-detection-filters-and-execution-2pjo</link>
      <guid>https://dev.to/orbitflarerpc/how-to-build-a-solana-sniper-bot-detection-filters-and-execution-2pjo</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fje8egfoko6p94cjc01wi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fje8egfoko6p94cjc01wi.png" alt="Cover Image" width="800" height="450"&gt;&lt;/a&gt;In a nutshell, a Solana sniper bot is a type of program that spots a new liquidity pool or a token listing as soon as it appears on the blockchain and then places a buy order before the wider market has had a chance to react. Since the entire approach is a race that takes place in milliseconds, the bot essentially consists of three parts: a detection layer which picks up the event first, a decision layer which filters out potential scams, and an execution layer which carries out the transaction while the price is still exactly as it was when it was observed. This article examines each of these layers, explains where the time is actually spent, and outlines the failure modes that distinguish bots that function in real conditions from those that only work on the testnet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The speed of detection is what gives you the edge. A bot which learns about a pool from a finalised block is already hundreds of milliseconds slower than one that reads shreds or uses a low-latency gRPC stream.&lt;/li&gt;
&lt;li&gt;The reason for most losses isn't that the bot is slow; it's that it buys the wrong thing. Honeypot checks, authority checks, and liquidity sanity checks should be included in the hot path and not left until a later review.&lt;/li&gt;
&lt;li&gt;Execution requires a prioritised write path; if a simple &lt;code&gt;sendTransaction&lt;/code&gt; is carried out at the time of a launch, it goes out over an unstaked connection and usually loses to snipers who are on staked ones.&lt;/li&gt;
&lt;li&gt;Build around the leader schedule, since the region from which your transaction leaves is determined by where the current leader is sitting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How does a Solana sniper bot actually work?
&lt;/h2&gt;

&lt;p&gt;A sniper bot monitors on-chain events, detects the establishment of a tradeable market, decides within microseconds whether or not to take action, and then carries out a swap. On Solana the events that are worth keeping an eye on are the instructions which create or initialise a pool on a DEX program (Raydium, Orca, Meteora and the launchpad programs that migrate into them) and the first liquidity deposit that makes the pool tradeable.&lt;/p&gt;

&lt;p&gt;The pipeline has four stages, and each stage has a latency budget:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Typical budget&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Observe&lt;/td&gt;
&lt;td&gt;See the pool creation instruction on chain&lt;/td&gt;
&lt;td&gt;Where most of the race is won or lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decode&lt;/td&gt;
&lt;td&gt;Parse accounts, mint, liquidity, authorities&lt;/td&gt;
&lt;td&gt;Sub-millisecond if done in memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decide&lt;/td&gt;
&lt;td&gt;Run safety filters and position sizing&lt;/td&gt;
&lt;td&gt;Sub-millisecond for precomputed rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;td&gt;Build, sign, and land the swap&lt;/td&gt;
&lt;td&gt;Network bound; region and path decide it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All the parts that come after 'observe' take place within your own process and can therefore be made faster through normal engineering techniques. Since the 'observe' and 'execute' stages rely on infrastructure, the remainder of this guide focuses most of its attention on that area.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection: where the race is decided
&lt;/h2&gt;

&lt;p&gt;There are four methods of working out that a pool has been made, and these methods are not the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Polling an RPC.&lt;/strong&gt; Continuously calling either &lt;code&gt;getProgramAccounts&lt;/code&gt; or &lt;code&gt;getSignaturesForAddress&lt;/code&gt;. This is simple but terribly slow: you only find out about the pool a few seconds after it has been created, and you end up hitting your rate limit as a result. It can be of use only for research and never for actual live sniping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. WebSocket subscriptions.&lt;/strong&gt; By using &lt;code&gt;logsSubscribe&lt;/code&gt; or &lt;code&gt;programSubscribe&lt;/code&gt; on the DEX program, you will receive a push notification whenever a matching transaction is processed. This represents the basic requirement for a functioning bot, but the notifications are sent after the RPC node has processed the block, which is after the leader has produced it and after it has been propagated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Geyser gRPC (Yellowstone).&lt;/strong&gt; The Geyser plugin sends out a gRPC stream which provides account and transaction updates as the node is processing them, with filtering carried out on the server so that you only get the data for which you have subscribed. It has lower latency than WebSockets and is much more selective. This is the minimum requirement for most serious bots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Shreds.&lt;/strong&gt; When a leader is forming a block, it sends out fragments called shreds. If you look at these fragments directly or use a service which reconstructs the transactions from them, you will be able to see the pool creation as the block is still being put together, prior to any RPC node having processed it. This represents the earliest possible point at which observation can take place, and it is what distinguishes consistently early bots from the rest.&lt;/p&gt;

&lt;p&gt;In reality the stack is as follows: it includes a Shredstream-fed stream for the hot path, a gRPC stream as the source of structured data, and WebSockets as the fallback option. Because OrbitFlare's &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream gRPC&lt;/a&gt; provides the stream derived from the shreds with the transaction already decoded, your bot receives a typed event instead of raw packets. Details about the mechanics can be found in &lt;a href="https://orbitflare.com/blog/fundamentals/shredstream" rel="noopener noreferrer"&gt;what is Shredstream&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decoding the event correctly
&lt;/h2&gt;

&lt;p&gt;When an event occurs, the bot requires the pool address, both token mints, the initial liquidity amounts, and the accounts that it will need in order to carry out a swap. Two rules prevent this stage from becoming a bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parse in memory, never fetch.&lt;/strong&gt; Each time you make a &lt;code&gt;getAccountInfo&lt;/code&gt; call after the event it involves a round trip that you can't afford. Decode the instruction data and the accounts list from the transaction itself and keep the DEX program layouts in your binary, along with a warm cache of the token program, the associated token program and the common vault layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precompute what you can.&lt;/strong&gt; The address of your wallet's associated token account for a particular mint is deterministic. The swap instruction for a given DEX is a template as well. Before the event takes place, prepare as much of the transaction as possible and then insert the mint and pool addresses when they become available.&lt;/p&gt;

&lt;p&gt;A good decode stage runs in less than a millisecond. If yours is slower, profile it before changing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deciding: the filters that save you money
&lt;/h2&gt;

&lt;p&gt;It's speed that gets you into the trade, while filters keep you out of the trades which were meant to take your money. The typical traps found on Solana launches, and the safeguards that detect them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trap&lt;/th&gt;
&lt;th&gt;What it looks like&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mint authority retained&lt;/td&gt;
&lt;td&gt;Creator can mint unlimited supply after launch&lt;/td&gt;
&lt;td&gt;Require mint authority to be revoked or null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freeze authority retained&lt;/td&gt;
&lt;td&gt;Creator can freeze your token account&lt;/td&gt;
&lt;td&gt;Require freeze authority to be null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fake or tiny liquidity&lt;/td&gt;
&lt;td&gt;Pool exists but has trivial depth&lt;/td&gt;
&lt;td&gt;Minimum liquidity threshold in SOL terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liquidity not locked or burned&lt;/td&gt;
&lt;td&gt;Creator pulls liquidity after you buy&lt;/td&gt;
&lt;td&gt;Check LP token destination; prefer burned LP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sell tax or transfer hook&lt;/td&gt;
&lt;td&gt;Token program extension blocks or taxes transfers&lt;/td&gt;
&lt;td&gt;Inspect Token-2022 extensions; skip unknown hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concentrated holder&lt;/td&gt;
&lt;td&gt;One wallet holds most of the supply&lt;/td&gt;
&lt;td&gt;Holder distribution check via indexer or cached data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each of these has to be based on data that you already possess or that you can obtain from a single cached source. A filter which requires three RPC calls is one that causes you to be delayed. Since many bots have a background indexer that continuously monitors token metadata and holder distributions, the hot path performs a hash lookup instead of making a network request.&lt;/p&gt;

&lt;p&gt;This also applies to position sizing. You should decide the maximum amount of SOL per trade, the maximum slippage, and the maximum share of the pool's liquidity that you are willing to take up before the event takes place. These should be set as constants and read by the hot path, not made into calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executing: landing the buy
&lt;/h2&gt;

&lt;p&gt;You first observed the pool and concluded that it was safe; at this stage the transaction has to get to the current leader before all the others'. This is entirely an infrastructure issue and it has four parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority fee.&lt;/strong&gt; Set the compute unit price high enough to win ordering within the block. Since the fee market on Solana is specific to the accounts you interact with, the relevant price is the one that other snipers are paying on this pool, not the overall median fee for the network. Estimating the fee dynamically, based on recent transactions that have involved the same DEX program, is better than using a fixed fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write path.&lt;/strong&gt; When a launch is taking place the public TPU gets overwhelmed by other snipers and as a result the unstaked connections are dropped first. In this case you should use either a Jito bundle (one that includes a tip reflecting the expected edge) or a stake-weighted QoS lane. We look at all the options in &lt;a href="https://orbitflare.com/blog/fundamentals/how-to-land-transactions-on-solana" rel="noopener noreferrer"&gt;how to land transactions on Solana&lt;/a&gt;. A staked lane is generally the better default choice for single-leg sniping since the bundle auction involves an extra step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Region.&lt;/strong&gt; In the current slot the leader is a particular validator located in a specific datacentre. When a transaction goes from Frankfurt to a leader based in Ashburn, it pays for the Atlantic twice: once when your data arrives and again when the block returns. Serious bots operate in more than one region and submit their transactions from the one closest to the scheduled leader. The &lt;a href="https://orbitflare.com/solana-rpc/frankfurt" rel="noopener noreferrer"&gt;region pages&lt;/a&gt; show where OrbitFlare has a presence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retry strategy.&lt;/strong&gt; Send the transaction to both the current leader and the next one, then stop. Blindly resending it for ten seconds will burn through the rate limit and often results in a worse fill in a later slot that you didn't want.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reference architecture
&lt;/h2&gt;

&lt;p&gt;Putting the stages together, a production sniper looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Streams&lt;/strong&gt;: a gRPC subscription powered by Shredstream and filtered to include only the DEX programs that you trade, together with a gRPC subscription from Yellowstone for account state, and also a WebSocket fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indexer&lt;/strong&gt;: a background process which keeps the token metadata, authorities, and holder distributions in memory, fed by the same streams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot path&lt;/strong&gt;: there is one single-threaded event loop in each region which carries out the decoding, filtering, sizing, building, signing, and submission. If your language permits it, there should be no allocations on the hot path; Rust is the most commonly used language and Go can be used as well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submission&lt;/strong&gt;: in each region there is a staked write path together with leader schedule tracking so that the appropriate region can be selected for each event.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-trade&lt;/strong&gt;: this is a distinct process which keeps an eye on the position, handles the exits, and records the result for later analysis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fundamental rule concerning design is that nothing on the hot path should wait for a network request; all the data it needs must have been included with the event or should have been cached previously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring whether your bot is actually fast
&lt;/h2&gt;

&lt;p&gt;Statements about latency without actual measurement are just guesses. To obtain accurate figures, record three timestamps for each event: the time at which the event was observed, the time when the transaction was submitted, and the slot in which it landed. Then track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observe-to-submit time.&lt;/strong&gt; This is your own code. You should achieve sub-millisecond performance with a well-built bot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit-to-landing slot delta.&lt;/strong&gt; The difference between the slot you submitted in and the slot the transaction actually landed in. This is your infrastructure. A zero indicates that you landed in the slot you had aimed for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Landing rate during launches.&lt;/strong&gt; The proportion of submitted transactions that landed at all within the 60 seconds surrounding a launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fill quality.&lt;/strong&gt; The executed price compared to the price at the time of observation. This figure shows whether being fast actually translated into being early.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you look at the results for different regions and for different write paths, you will usually find that one region is early for a subset of the leaders but late for the others; this is the kind of data that you need in order to justify a multi-region deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using a public or shared RPC for the hot path.&lt;/strong&gt; It is unreliable precisely when it is needed due to rate limits and the shared capacity. A &lt;a href="https://orbitflare.com/products/dedicated-nodes" rel="noopener noreferrer"&gt;dedicated node&lt;/a&gt; or a plan with reserved capacity should be the standard choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filtering after submitting.&lt;/strong&gt; Bots end up with frozen tokens because they buy first and then check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One region.&lt;/strong&gt; The leader schedule is global and a single-region bot is late for most of it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignoring Token-2022 extensions.&lt;/strong&gt; Transfer hooks and fees are valid features and can also be very effective as traps. Skip any tokens with extensions that you do not explicitly understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed priority fees.&lt;/strong&gt; The fee applicable at the time of a launch can be many times higher than the quiet-hour fee. This should be estimated dynamically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No exit plan.&lt;/strong&gt; Paper gains turn into real losses when you get in quickly without having a strategy for getting out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A Solana sniper bot is essentially a race based on latency that also involves a safety issue; in order to win the observation phase you need to use either shred-level or gRPC streaming, keep the decode and decision phases in memory, and then carry out the transaction via a staked, region-aware write path. You should measure the time taken from observation to submission, from submission to landing, and the fill quality, and let these figures guide all of your infrastructure decisions.&lt;/p&gt;

&lt;p&gt;If you wish to make the transition from a working bot to an early one, the &lt;a href="https://orbitflare.com/products/solana-grpc" rel="noopener noreferrer"&gt;Jetstream gRPC service&lt;/a&gt; provides you with the event stream derived from shreds, and the &lt;a href="https://orbitflare.com/products/rpc-nodes" rel="noopener noreferrer"&gt;RPC plans&lt;/a&gt; include the staked write path as well, and both are available in the regions where the leaders are.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://solana.com/developers/guides/advanced/stake-weighted-qos" rel="noopener noreferrer"&gt;Stake-weighted QoS guide (Solana)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.jito.wtf/" rel="noopener noreferrer"&gt;Jito bundle documentation&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/blog/fundamentals/shredstream" rel="noopener noreferrer"&gt;What is Shredstream?&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/orbitflare/shredstream-decode-example" rel="noopener noreferrer"&gt;Shredstream decode example (GitHub)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.orbitflare.com/data-streaming/jetstream-v2" rel="noopener noreferrer"&gt;Jetstream V2 docs&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://orbitflare.com/benchmarks" rel="noopener noreferrer"&gt;OrbitFlare benchmarks&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>orbtiflare</category>
      <category>rpc</category>
      <category>trading</category>
    </item>
  </channel>
</rss>
