From 7195c253768d1b55e0d336179819e34d8bd61c73 Mon Sep 17 00:00:00 2001 From: DanS Date: Sun, 7 Jun 2026 14:15:58 -0500 Subject: [PATCH] fix(send): pass the user-selected fee to z_sendmany MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The full-node send built the recipients array and called z_sendmany with only (fromaddress, amounts) — dropping the minconf and fee positional args. The whole fee-tier UI (Low/Normal/High, send-max math, the confirmation fee) was collected and shown but never sent, so the daemon silently applied its own default fee and the Low/High tiers were cosmetic. Pass {from, recipients, 1, fee}, with the fee formatted fixed-decimal so the daemon's ParseFixedPoint accepts it (a small double like 0.00005 would otherwise serialize to "5e-05" and be rejected). Co-Authored-By: Claude Opus 4.8 --- src/app_network.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app_network.cpp b/src/app_network.cpp index 12be317..8c60c8b 100644 --- a/src/app_network.cpp +++ b/src/app_network.cpp @@ -2046,12 +2046,16 @@ void App::sendTransaction(const std::string& from, const std::string& to, send_progress_active_ = true; ++send_submissions_in_flight_; - worker_->post([this, from, to, amount, memo, recipients, callback]() -> rpc::RPCWorker::MainCb { + // z_sendmany signature is (fromaddress, amounts, minconf, fee). Pass the user-selected + // fee explicitly — formatted as a fixed-decimal string so the daemon's ParseFixedPoint + // accepts it (a small double like 0.00005 would serialize to "5e-05" and be rejected). + const std::string fee_str = util::formatAmountFixed(fee); + worker_->post([this, from, to, amount, fee_str, memo, recipients, callback]() -> rpc::RPCWorker::MainCb { bool ok = false; std::string result_str; try { rpc::RPCClient::TraceScope trace("Send tab / Submit transaction"); - auto result = rpc_->call("z_sendmany", {from, recipients}); + auto result = rpc_->call("z_sendmany", {from, recipients, 1, fee_str}); result_str = result.get(); ok = true; } catch (const std::exception& e) {