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:
@@ -1183,6 +1183,22 @@
|
||||
"merge_max_inputs": "Max. Inputs pro Batch",
|
||||
"merge_no_spendable": "Noch keine verfügbaren Inputs zum Konsolidieren.",
|
||||
"merge_progress": "Konsolidierung läuft… dies kann einige Minuten dauern. Sie können dieses Fenster schließen.",
|
||||
"merge_run_aborted_toast": "Die Verbindung zum Node wurde zurückgesetzt, daher wurde die Konsolidierung gestoppt. Führen Sie sie erneut aus, um fortzufahren.",
|
||||
"merge_run_busy": "Eine Konsolidierung läuft. Warten Sie, bis sie fertig ist, oder stoppen Sie sie zuerst.",
|
||||
"merge_run_chip_fmt": "Konsolidierung %d/%d",
|
||||
"merge_run_err_timeout": "Der Node hat nicht rechtzeitig geantwortet; der Durchgang ist möglicherweise trotzdem eingereiht.",
|
||||
"merge_run_halted_fmt": "Konsolidierung nach wiederholten Fehlern gestoppt: %s",
|
||||
"merge_run_migration_pending": "Schließen Sie die Seed-Migration ab oder brechen Sie sie ab, bevor Sie konsolidieren.",
|
||||
"merge_run_progress_fmt": "Konsolidierung läuft… Durchgang %d von etwa %d, bisher %d Notes zusammengeführt. Sie können dieses Fenster schließen; der Vorgang läuft im Hintergrund weiter.",
|
||||
"merge_run_start_failed": "Die Konsolidierung konnte nicht gestartet werden – der Node ist nicht verbunden.",
|
||||
"merge_run_status_not_run": "%s – nicht konsolidiert (%d Notes)",
|
||||
"merge_run_status_waiting": "%s – wartet (%d Notes)",
|
||||
"merge_run_stop": "Stoppen",
|
||||
"merge_run_stopped_toast": "Konsolidierung gestoppt. Führen Sie sie erneut aus, um den Rest zusammenzuführen.",
|
||||
"merge_run_stopping": "Wird nach den bereits gesendeten Durchgängen gestoppt…",
|
||||
"merge_run_wait_batch": "Die Durchgänge werden verteilt, damit der Node reaktionsfähig bleibt…",
|
||||
"merge_run_wait_send": "Pausiert, bis Ihre ausstehende Transaktion durch ist.",
|
||||
"merge_run_wait_sync": "Pausiert: Der Node synchronisiert noch.",
|
||||
"merge_scope_failed_fmt": "Ihre Inputs konnten nicht gelesen werden: %s",
|
||||
"merge_scope_fmt": "%d transparente + %d geschützte Inputs · ~%s DRGX verfügbar",
|
||||
"merge_scope_loading": "Ihre Inputs werden geprüft…",
|
||||
|
||||
@@ -1183,6 +1183,22 @@
|
||||
"merge_max_inputs": "Máximo de entradas por lote",
|
||||
"merge_no_spendable": "Aún no hay entradas disponibles para consolidar.",
|
||||
"merge_progress": "Consolidando… esto puede tardar varios minutos. Puedes cerrar esta ventana.",
|
||||
"merge_run_aborted_toast": "La conexión con el nodo se reinició, así que la consolidación se detuvo. Ejecútala de nuevo para continuar.",
|
||||
"merge_run_busy": "Hay una consolidación en curso. Espera a que termine o detenla primero.",
|
||||
"merge_run_chip_fmt": "Consolidando %d/%d",
|
||||
"merge_run_err_timeout": "El nodo no respondió a tiempo; puede que el lote siga en cola.",
|
||||
"merge_run_halted_fmt": "Consolidación detenida tras fallos repetidos: %s",
|
||||
"merge_run_migration_pending": "Termina o cancela la migración de la semilla antes de consolidar.",
|
||||
"merge_run_progress_fmt": "Consolidando… lote %d de unos %d, %d notas fusionadas hasta ahora. Puedes cerrar esta ventana; seguirá en segundo plano.",
|
||||
"merge_run_start_failed": "No se pudo iniciar la consolidación: el nodo no está conectado.",
|
||||
"merge_run_status_not_run": "%s: sin consolidar (%d notas)",
|
||||
"merge_run_status_waiting": "%s: en espera (%d notas)",
|
||||
"merge_run_stop": "Detener",
|
||||
"merge_run_stopped_toast": "Consolidación detenida. Ejecútala de nuevo para fusionar el resto.",
|
||||
"merge_run_stopping": "Deteniendo tras los lotes ya enviados…",
|
||||
"merge_run_wait_batch": "Espaciando los lotes para que el nodo siga respondiendo…",
|
||||
"merge_run_wait_send": "En pausa hasta que se complete tu transacción pendiente.",
|
||||
"merge_run_wait_sync": "En pausa: el nodo aún se está sincronizando.",
|
||||
"merge_scope_failed_fmt": "No se pudieron leer tus entradas: %s",
|
||||
"merge_scope_fmt": "%d entradas transparentes + %d blindadas · ~%s DRGX disponibles",
|
||||
"merge_scope_loading": "Comprobando tus entradas…",
|
||||
|
||||
@@ -1183,6 +1183,22 @@
|
||||
"merge_max_inputs": "Nombre max d'entrées par lot",
|
||||
"merge_no_spendable": "Aucune entrée dépensable à consolider pour l'instant.",
|
||||
"merge_progress": "Consolidation en cours… cela peut prendre quelques minutes. Vous pouvez fermer cette fenêtre.",
|
||||
"merge_run_aborted_toast": "La connexion au nœud a été réinitialisée, la consolidation s'est donc arrêtée. Relancez-la pour continuer.",
|
||||
"merge_run_busy": "Une consolidation est en cours. Attendez qu'elle se termine ou arrêtez-la d'abord.",
|
||||
"merge_run_chip_fmt": "Consolidation %d/%d",
|
||||
"merge_run_err_timeout": "Le nœud n'a pas répondu à temps ; le lot est peut-être encore en file d'attente.",
|
||||
"merge_run_halted_fmt": "Consolidation arrêtée après des échecs répétés : %s",
|
||||
"merge_run_migration_pending": "Terminez ou annulez la migration de la phrase de récupération avant de consolider.",
|
||||
"merge_run_progress_fmt": "Consolidation en cours… lot %d sur environ %d, %d notes fusionnées jusqu'ici. Vous pouvez fermer cette fenêtre ; l'opération continue en arrière-plan.",
|
||||
"merge_run_start_failed": "Impossible de démarrer la consolidation — le nœud n'est pas connecté.",
|
||||
"merge_run_status_not_run": "%s — non consolidé (%d notes)",
|
||||
"merge_run_status_waiting": "%s — en attente (%d notes)",
|
||||
"merge_run_stop": "Arrêter",
|
||||
"merge_run_stopped_toast": "Consolidation arrêtée. Relancez-la pour fusionner le reste.",
|
||||
"merge_run_stopping": "Arrêt après les lots déjà envoyés…",
|
||||
"merge_run_wait_batch": "Espacement des lots pour que le nœud reste réactif…",
|
||||
"merge_run_wait_send": "En pause jusqu'à ce que votre transaction en attente soit passée.",
|
||||
"merge_run_wait_sync": "En pause : le nœud est encore en cours de synchronisation.",
|
||||
"merge_scope_failed_fmt": "Impossible de lire vos entrées : %s",
|
||||
"merge_scope_fmt": "%d entrées transparentes + %d blindées · ~%s DRGX dépensables",
|
||||
"merge_scope_loading": "Vérification de vos entrées…",
|
||||
|
||||
@@ -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": "入力を確認中…",
|
||||
|
||||
@@ -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": "입력을 확인하는 중…",
|
||||
|
||||
@@ -1183,6 +1183,22 @@
|
||||
"merge_max_inputs": "Máx. de entradas por lote",
|
||||
"merge_no_spendable": "Ainda não há entradas disponíveis para consolidar.",
|
||||
"merge_progress": "Consolidando… isso pode levar alguns minutos. Você pode fechar esta janela.",
|
||||
"merge_run_aborted_toast": "A conexão com o nó foi redefinida, então a consolidação parou. Execute-a novamente para continuar.",
|
||||
"merge_run_busy": "Uma consolidação está em andamento. Aguarde que termine ou interrompa-a primeiro.",
|
||||
"merge_run_chip_fmt": "Consolidando %d/%d",
|
||||
"merge_run_err_timeout": "O nó não respondeu a tempo; o lote ainda pode estar na fila.",
|
||||
"merge_run_halted_fmt": "Consolidação interrompida após falhas repetidas: %s",
|
||||
"merge_run_migration_pending": "Conclua ou cancele a migração da semente antes de consolidar.",
|
||||
"merge_run_progress_fmt": "Consolidando… lote %d de cerca de %d, %d notas mescladas até agora. Você pode fechar esta janela; a operação continua em segundo plano.",
|
||||
"merge_run_start_failed": "Não foi possível iniciar a consolidação — o nó não está conectado.",
|
||||
"merge_run_status_not_run": "%s — não consolidado (%d notas)",
|
||||
"merge_run_status_waiting": "%s — aguardando (%d notas)",
|
||||
"merge_run_stop": "Parar",
|
||||
"merge_run_stopped_toast": "Consolidação interrompida. Execute-a novamente para mesclar o restante.",
|
||||
"merge_run_stopping": "Parando após os lotes já enviados…",
|
||||
"merge_run_wait_batch": "Espaçando os lotes para que o nó continue respondendo…",
|
||||
"merge_run_wait_send": "Pausado até que sua transação pendente seja concluída.",
|
||||
"merge_run_wait_sync": "Pausado: o nó ainda está sincronizando.",
|
||||
"merge_scope_failed_fmt": "Não foi possível ler suas entradas: %s",
|
||||
"merge_scope_fmt": "%d entradas transparentes + %d blindadas · ~%s DRGX disponíveis",
|
||||
"merge_scope_loading": "Verificando suas entradas…",
|
||||
|
||||
@@ -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": "Проверка ваших входов…",
|
||||
|
||||
@@ -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": "正在检查您的输入…",
|
||||
|
||||
@@ -1097,6 +1097,7 @@ fee-input = { width = 150 }
|
||||
utxo-limit-input = { width = 150 }
|
||||
shield-button = { width = 120, font = "button" }
|
||||
cancel-button = { width = 100, font = "button" }
|
||||
list-max-rows = { size = 7 } # address picker / run rows shown before the list scrolls
|
||||
|
||||
[dialogs.request-payment]
|
||||
width = 500.0
|
||||
|
||||
Reference in New Issue
Block a user