Solana Blockchain 6.1.3
Latest4 September 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
Solana Blockchain v6.1.3
Release Date: September 4, 2026 Tags: WITHDRAWALS, REFUNDS, DOCUMENTATION, DIAGNOSTICS, RPC, CONFIGURATION, SOLANA, SOL
Overview
A withdrawal-safety release, on top of the documentation correction it started as. Two things changed in the addon's code:
- A send call that threw was read as "never sent" and refunded. The
handler already parked a transaction it had broadcast but could not confirm
as
TIMEOUT; the gap was the send call itself. A timeout or a dropped connection onsendRawTransactionthrew before that protection began, so the row was markedFAILEDand the customer refunded while the transaction could still land inside the blockhash's validity. - A full-balance withdrawal paid the recipient less than the record said. When the debited amount left nothing on-chain for the network fee, the send was silently reduced by a few thousand lamports and a warning logged. It now fails and refunds instead.
The documentation half stands as written for 6.1.3 before these fixes were
added: 6.1.2 made SOL_<NETWORK>_RPC live, and four documentation pages plus
the admin requirements screen went on telling operators there was no way to
point Solana at a paid RPC. They no longer do.
Requires Core v6.7.6 and Ecosystem v6.5.0. Core carries the reject door
that refuses TIMEOUT rows; Ecosystem carries the shared outcome-classification
and fee-tracker helpers this addon imports.
Update Instructions
# 1. Update the addon in Admin → System → Extensions
# 2. Restart the backend
pnpm updatorNo schema change, no seeder, no .env change required. Update Core and
Ecosystem in the same window. The corrected pages are served from the
documentation site and are already current.
Upgrade Notes
If you concluded Solana could not use your own RPC, it can
Set SOL_<NETWORK>_RPC — a comma-separated list, with SOL_<NETWORK>_RPC_FALLBACK
as an optional second — and restart the backend. Leave it unset and the public
cluster is used exactly as before.
The key is named for the cluster the service resolved to, not the value you
typed. SOL_NETWORK="mainnet" reads SOL_MAINNET_RPC and "testnet" reads
SOL_TESTNET_RPC; every other value, including unset and the plausible-looking
mainnet-beta, resolves to devnet and reads SOL_DEVNET_RPC. So a wrong
SOL_NETWORK puts a paid endpoint in a key nothing reads — the requirements
screen now shows which key is actually in play.
Order in the list is not priority. The endpoints form a failover pool that prefers one it has never tried and then the fastest, so every entry has to be a healthy endpoint on that cluster; one bad URL is an endpoint that will be dialled, not harmless padding.
Expect TIMEOUT rows where a timed-out send used to be refunded
A TIMEOUT row means the transaction was sent and its outcome could not be
read. Look the signature up on a Solana explorer: if it landed, set the row
complete with its hash; if it did not, reject it once the blockhash has expired
and the explorer shows nothing. Neither the queue nor Core 6.7.6's admin reject
door refunds it on its own.
Fixed
- Fixed — a send call that throws asks the cluster for the signature's
status (the signature is known before the send). Accepted means the
withdrawal continues; a definitive rejection such as a simulation error or
insufficient lamports means
FAILEDand a refund; no answer while the blockhash is still valid meansTIMEOUT. - Fixed — a withdrawal whose debited amount leaves nothing on-chain for the network fee fails with a message naming both figures and is refunded, instead of being sent short. Configure a non-zero minimum fee on the SOL token so a full-balance withdrawal always leaves headroom.
- Fixed — the network fee a withdrawal burns from the customer's own address is recorded on the row and debited from the address's per-chain tracker, so a later "withdraw everything" no longer fails against a tracker that never saw the fee leave.
Changed
Four pages that said Solana had no custom RPC
- Changed the Network and RPC guide's "Why there is no custom RPC" section into a description of how to set one, including which key the cluster fall-through causes to be read and why order in the list is not priority.
- Changed the environment reference, which listed
SOL_MAINNET_RPC,SOL_TESTNET_RPCandSOL_DEVNET_RPCunder "read by nothing that matters", to document them as settings and to explain that a wrongSOL_NETWORKcosts twice — the install runs on devnet and the paid endpoint sits in an unread key. - Changed the overview's warning from "there is no custom RPC endpoint" to
what is true: the public cluster is the default and a shared quota, and
SOL_<NETWORK>_RPCis what replaces it. - Changed the troubleshooting entry for 429s and slowness to check that key first, and added a dedicated endpoint to the list of remedies alongside reducing the working set and lengthening the scan interval.
- Changed the Ecosystem environment reference and blockchains guide, which carried the same claim from the other side.
The admin requirements screen
- Changed the
SOL_<NETWORK>_RPCrow on Admin → Ecosystem → Blockchains → Requirements to describe the key as read rather than display-only, and to name the cluster the service resolved to — so an install that fell through to devnet is shownSOL_DEVNET_RPC, the key that is really consulted, instead of the one matching what was typed. - Changed the
SOL_NETWORKandSOLANA_RPC_URLrows to stop saying the service always uses the public cluster endpoint.
Changed
Cores carved out for the platform's own sends
- Changed —
transferSolnow runs on a private core (sendSolWithKeypair) andhandleSplTokenWithdrawalonsendSplFromWallet, both exported for Core 6.7.6's pool-backing engine to send from the treasury's own address without a withdrawal row. The handlers' row writes, order and errors are unchanged and pinned by a write-order test. Also new:sendSolFromMaster(the master keypair as a source of SOL, reserve-checked by Core),getSplTokenBalance(throws on an outage rather than answering zero), and adecodeSecretKeythat accepts a 32-byte seed throughKeypair.fromSeedinstead of zero-padding it into an invalid 64-byte key. Requires Core 6.7.6 and Ecosystem 6.5.0.