Monero Blockchain 6.1.7
2 September 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
Monero (XMR) Blockchain v6.1.7
Release Date: September 2, 2026 Tags: WITHDRAWALS, DEPOSITS, DIAGNOSTICS, RPC, DIGEST-AUTH, DOCUMENTATION, MONERO, XMR
Overview
A withdrawal release, and both halves of it move money. Every completed XMR withdrawal has been paying the customer short: the network fee was taken off the amount sent and off the platform's cut, so one fee was charged twice. A 0.01 XMR withdrawal carrying a 0.001 fee arrived as 0.009944. The customer now receives the full amount and the gas is funded from the withdrawal fee, so your XMR fee revenue drops by the network fee.
The other half bites only off mainnet: withdrawals to valid stagenet and testnet
addresses could be refused as Invalid Monero address, and XMR could be missing
from the deposit currency list, with nothing saying why. Validation now decodes
the address and checks its checksum instead of reading its first character.
The admin chain-requirements test is fixed too — it reported 401 after Digest auth against credentials that were correct, because monerod and
monero-wallet-rpc hold the Digest session on the TCP connection. Read the
Upgrade Notes before updating.
Requires Core v6.7.5 and Ecosystem v6.4.9.
Update Instructions
# 1. Update the addon in Admin → System → Extensions
# 2. Restart the backend
pnpm updatorNo schema change and no seeder. Re-run Admin → Ecosystem → Blockchains →
Requirements → Monero afterwards, and check the backend log at startup — it
now prints the network monerod reports and compares it against XMR_NETWORK.
Upgrade Notes
Every completed XMR withdrawal has paid the customer short
The network fee was subtracted twice. It came off the amount sent to the customer, and the platform's cut was independently reduced by the same fee — so the customer paid the gas and the platform paid it again. A 0.01 XMR withdrawal carrying a 0.001 fee reached the recipient as 0.00994424.
The withdrawal route debits amount + withdrawalFee and nothing else, on every
chain, and every other chain covers the network cost out of that fee. Monero was
the one that did not.
- Fixed the customer to receive the full amount requested, with the network fee funded from the withdrawal fee — so the wallet now spends exactly what the customer was debited.
- Changed what the platform earns on an XMR withdrawal. It is the withdrawal fee minus the network fee, where it used to be the whole withdrawal fee. At current Monero fees that is a fraction of a cent per withdrawal.
- Review your completed XMR withdrawals if you intend to make customers whole. Each was short by that transaction's own network fee, which is recorded on the platform-fee entry raised alongside it.
- If the network fee ever exceeds the withdrawal fee you charge, the platform now absorbs the difference and logs a warning rather than refusing the withdrawal. Raise the XMR withdrawal fee if that warning appears.
Withdrawals refused, and XMR missing from deposits, on a stagenet or testnet install
Two symptoms with one cause: the platform's idea of which Monero network it runs on did not match the network your addresses belong to, and nothing on either path said so.
Address validation read XMR_NETWORK without trimming it, and any value it
did not recognise fell back to the mainnet rules silently — so a genuine
stagenet address was refused as Invalid Monero address, blaming the customer's
address for a server setting. On the deposit side a currency is offered only
while its token's network label agrees with XMR_NETWORK, so an XMR token still
labelled mainnet on a stagenet install was dropped from the picker with
nothing but a log line to explain it.
- Fixed address validation to read the network out of the address itself and to report a network mismatch as a mismatch, naming both networks, instead of as an invalid address.
- Added a startup line comparing
XMR_NETWORKagainst the networkmonerodreports, so a mismatch is visible in the log before a customer finds it. - Set
XMR_NETWORKto the networkmonerodactually runs, then confirm it reached the process — a value already present in the environment wins over the one in your.envfile, so a process manager holding an older copy keeps serving it however the file reads.pm2 restart <app> --update-envforces a re-read. The new startup line prints what the process actually resolved. - If XMR is missing from the deposit currency list, open Admin → Ecosystem →
Blockchains → Requirements → Monero. The new token-network row names the
currency and the two values that disagree. Correct whichever side is
wrong — the XMR token's network field, or
XMR_NETWORK.
A Monero row that was red may simply turn green
If the requirements test has been telling you XMR_RPC_USER / XMR_RPC_PASSWORD
are wrong while deposits credited normally, the credentials were never wrong and
there is nothing to repair — re-run the test after updating.
If it still reports a rejection after this release, read which of the two it now
names. "rejected user …" means the service judged the pair and refused it,
and the fix is in --rpc-login. "challenge marked stale" means the pair was
accepted and the connection was the problem: something between the backend and
the service — a reverse proxy, a load balancer, a tunnel that drops idle
connections — is not keeping the challenge and the answer on one connection. The
addon's own calls fail through that path too, so that one is a real fault.
Every daemon in XMR_<NETWORK>_RPC is now probed
If you named more than one daemon in 6.1.6, the test used to probe a single address. It now probes them all and reports any that are unreachable, unsynchronised or on a different network. Those daemons were already in use by the running platform; only the reporting has caught up, so a newly red row is describing a fault that predates this release.
Fixed
The network fee taken from the customer and from the platform at once
A Monero transfer pays its fee on top of the destinations, out of the sending
wallet — so a withdrawal has to decide who funds it. This one charged it to both
sides: the recipient's destination was set to amount - networkFee, and the
platform's cut was set to withdrawalFee - networkFee.
The result was a wallet that spent amount + withdrawalFee - networkFee against
a customer debit of amount + withdrawalFee — the books did not balance, and the
difference came out of the customer's payout. The fee probe compounded it by
measuring a transfer of the short amount rather than the one about to be sent.
- Fixed the recipient's destination to the full amount requested, leaving the network fee funded from the withdrawal fee the customer already paid.
- Fixed the balance requirement to account for the network fee as a real outflow, since it is no longer absorbed by shrinking the customer's payout.
- Fixed the fee probe to measure a transfer the size of the one that is actually broadcast.
- Added a warning when the network fee exceeds the withdrawal fee charged, naming the shortfall the platform is covering.
Valid stagenet and testnet addresses refused as invalid
Monero's address prefix is network-specific — mainnet addresses open with 4 or
8, stagenet with 5 or 7, testnet with 9, A or B — and the check chose
which set to accept from XMR_NETWORK. It compared only the first character,
and it looked that value up without trimming it, with the mainnet set standing in
for anything it did not recognise. A stray space, a spelling other than the three
expected, or a value that never reached the process therefore refused every
stagenet and testnet address on the install — and reported it as
Invalid Monero address, which sends the operator to inspect an address that
was correct all along.
- Fixed the check to decode the address and take the network from the address itself, so a single character is no longer the evidence.
- Fixed
XMR_NETWORKto be trimmed and case-folded the way the rest of the platform already read it, so address validation and the deposit currency list can no longer disagree about which network you are on. - Changed the refusal for a genuinely wrong-network address to name the
address's network and the platform's, and to point at
XMR_NETWORK. - Changed an unrecognised
XMR_NETWORKto stop quietly meaning mainnet. A well-formed address is now let through and the misconfiguration is logged for the operator;monero-wallet-rpcrefuses a foreign-network transfer in any case, so nothing leaves the platform on a guess.
A mistyped address accepted at the withdrawal form
Because the check read one character, any string starting with the right one
counted as an address. A truncated paste or a single wrong character passed the
form, and the withdrawal was accepted and queued before monero-wallet-rpc
refused to send it.
- Fixed validation to decode the address and verify the four-byte checksum Monero appends to it, so a typo is caught at the form instead of becoming a failed withdrawal.
Correct credentials reported as wrong
monerod and monero-wallet-rpc do not accept credentials up front. The first
call is anonymous, the service answers 401 with a challenge, and the caller
repeats the request with a digest computed over that challenge. The part that is
easy to miss is where the challenge lives: the service keeps the nonce and its
request counter per TCP connection, and treats a valid digest for a nonce
that connection did not issue as stale rather than as authenticated.
The diagnostics were built on a pooled HTTP client, which gives no guarantee the
second request reuses the first one's socket. When it did not, the service saw a
nonce from someone else's connection and answered 401 — which the check
reported as bad credentials. The addon's own client has always talked to Monero
over a keep-alive connection and so never hit this, which is exactly why the
screen and the deposit monitor disagreed.
- Fixed both Monero probes —
monero-wallet-rpc get_versionandmonerod get_info— to send the challenge and the answer over one connection. - Added the stale-versus-rejected distinction to the failure message, so a proxy that breaks the handshake is no longer reported as a wrong password.
- Fixed an unreachable service to report the socket error and the
host:portinstead of a bare client error, and to say that a Monero process answering local tools proves it is running rather than that.envpoints at it. - Fixed the wallet and daemon rows to name the
.envkey each one came from, so the row and the line to edit agree.
One daemon probed where the platform uses a pool
Since 6.1.6 a configured XMR_<NETWORK>_RPC builds a failover pool, and the
platform will dial any endpoint in it. The check probed one address, so a second
daemon that was stale, unreachable or on the wrong network passed unnoticed until
it served a real query.
- Fixed the daemon check to probe every endpoint in the list and report how many answered.
- Added a failure when endpoints in one pool report different networks, and
made a network mismatch on any of them reach the
XMR_NETWORKcomparison rather than being hidden by a healthy sibling.
https:// URLs refused as unusable
The addon passes the host, port and path to a plain HTTP connection and never
reads the scheme, so https://host:18081/json_rpc reaches a stock daemon exactly
as http:// does — its --rpc-ssl autodetect default accepts plaintext on the
same listener. Only a URL with no port genuinely breaks, because it then resolves
to port 80.
- Fixed the URL rule to refuse only that case — which includes an explicit
:443, since the parser erases a scheme's default port — and to warn on the rest that the URL claims TLS the connection never negotiates.
Changed
The backend says at startup which network Monero is really on
A disagreement between XMR_NETWORK and the network monerod runs breaks
withdrawals and hides XMR from the deposit picker, and neither symptom named the
cause. The requirements screen has carried this comparison for some releases,
but it only answers when somebody opens it already suspecting the chain — by
which point the working theory is usually that the address is bad.
- Added the network
monerodreports to the startup log, and an error line when it disagrees withXMR_NETWORKthat names both values and the one to set. - Added a warning when
XMR_NETWORKis absent, or holds something other thanmainnet,stagenetortestnet, naming the network the daemon reports so the correct value is on screen rather than guessed at.
Documentation that 6.1.6 left behind
The 6.1.6 upgrade notes said in so many words that the admin screen and the
Monero documentation still described XMR_<NETWORK>_RPC as display-only and
were now wrong. Both have been corrected.
- Changed the RPC connection guide and the environment reference to describe
XMR_<NETWORK>_RPCand its_FALLBACKas the keys they became: a daemon list that replacesXMR_DAEMON_RPC_URLfor every daemon query. Both were removed from the "keys that do nothing" tables, where they had been left. - Changed the description of how a multi-daemon pool picks. It is not a preference order: an endpoint that has never been tried is preferred, then the fastest measured one. Every entry must therefore be healthy and on the same network — a stale daemon anywhere in the list will be dialled.
- Changed the account of
XMR_DAEMON_RPC_URLunder a configured pool. It is not simply ignored: it remains the addressmonero-wallet-rpcis first pointed at, until a pool daemon answers. - Changed the
https://guidance to describe what the addon actually does with the scheme, in place of the claim that such a URL always fails. - Added the connection-scoped Digest behaviour to the RPC connection guide and the troubleshooting page, including what a stale challenge proves: the credentials were accepted, and the connection was not the one that issued the nonce.