feat(merge): run per-address consolidation as a paced background job

"Keep in each address" posted one task that called z_mergetoaddress for
every batch of every address back to back; each call is a whole-wallet
scan under cs_main, and the daemon runs the ops one at a time anyway.
It is now an App-owned services::ConsolidationRun:

- one RPC at a time; the next merge only after the previous batch left the
  queue and a gap as long as the last call took (2-120 s);
- pauses while the node syncs, the wallet is locked, a send of ours is in
  progress, or another wallet scan is running;
- failures classified: nothing that may have queued is ever resent; a
  breaker stops after 3 dead addresses or 3 failed ops in a row;
- each merge is charged to the scan budget; one re-read and one forced
  balance at the end;
- it keeps running when the dialog closes: a status-bar chip, a run view
  with progress, the wait reason and a Stop button.

The "Into one" merge can no longer be confirmed twice while its call is
in flight. fake_dragonxd gains FAKE_SCAN_SECS, FAKE_MERGE_SERIAL and
FAKE_MERGE_FAIL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-09 11:06:34 -05:00
co-authored by Claude Opus 5.5
parent b29a09eaa0
commit cee8b9d7f6
19 changed files with 1875 additions and 202 deletions
+16
View File
@@ -1183,6 +1183,22 @@
"merge_max_inputs": "バッチあたりの最大入力数",
"merge_no_spendable": "統合できる使用可能な入力がまだありません。",
"merge_progress": "統合中… 数分かかることがあります。このウィンドウは閉じても構いません。",
"merge_run_aborted_toast": "ノードとの接続がリセットされたため、統合を停止しました。続けるには再度実行してください。",
"merge_run_busy": "統合を実行中です。完了を待つか、先に停止してください。",
"merge_run_chip_fmt": "統合中 %d/%d",
"merge_run_err_timeout": "ノードが時間内に応答しませんでした。この回はまだキューに入っている可能性があります。",
"merge_run_halted_fmt": "失敗が続いたため統合を停止しました:%s",
"merge_run_migration_pending": "統合する前に、シードの移行を完了するかキャンセルしてください。",
"merge_run_progress_fmt": "統合中… %d 回目(全体で約 %d 回)、これまでに %d 件のノートを統合しました。このウィンドウを閉じてもバックグラウンドで続行します。",
"merge_run_start_failed": "統合を開始できませんでした — ノードが接続されていません。",
"merge_run_status_not_run": "%s — 未統合(%d 件のノート)",
"merge_run_status_waiting": "%s — 待機中(%d 件のノート)",
"merge_run_stop": "停止",
"merge_run_stopped_toast": "統合を停止しました。残りを統合するには再度実行してください。",
"merge_run_stopping": "送信済みの回が終わったら停止します…",
"merge_run_wait_batch": "ノードの応答性を保つため、間隔を空けて実行しています…",
"merge_run_wait_send": "保留中の取引が完了するまで一時停止しています。",
"merge_run_wait_sync": "一時停止中:ノードはまだ同期中です。",
"merge_scope_failed_fmt": "入力を読み取れませんでした: %s",
"merge_scope_fmt": "透明%d件 + シールド%d件の入力 · 使用可能 約%s DRGX",
"merge_scope_loading": "入力を確認中…",