Commit Graph

69 Commits

Author SHA1 Message Date
1dc3c79486 Will list: context menu actions and will-executor bulk tools
PreviewList: right-click menu with sign / details / broadcast / check /
copy id / copy / merge from txn / delete, with multi-selection support and
availability rules (broadcast force-repushes, delete restricted to invalid
or unsigned txs, sign skips non-valid txs).

WillExecutorWidget: Export, Ping All and Select All become dropdown buttons
(export all/selected/valid, ping all/selected, select all/only valid,
deselect all/only invalid).

WillExecutorListWidget: single-cell Copy action.

BalWindow: txids-scoped sign/broadcast plumbing and merge_single_transaction.
2026-08-01 19:11:35 -04:00
30a5720ceb BalWindow/plugin: history persistence, will import/merge, sig tracking, local-spender fixes 2026-08-01 17:21:36 -04:00
08394f4868 lint: ruff cleanup pass across bal/ and tests/
- Sort imports and fix pyproject ruff config (per-file ignores for
  intentional Qt/core exceptions)
- Mark Heirs.validate_* helpers as @staticmethod
- Clean up dead code, rename shadowing vars, use raise ... from
- Add AGENTS.md with env/lint/test/release guidance
2026-07-31 16:03:17 -04:00
649910e599 Add OP_RETURN support for heirs
Allow heirs to produce an OP_RETURN output instead of a regular BTC
payment. An address prefixed with OP_RETURN: carries hex data (max 80
bytes); such heirs always have amount 0 and are excluded from amount
calculations. GUI dialog shows a message field with the decoded text,
the heir list displays the decoded message, and the OP_RETURN output
is emitted with zero value in inheritance transactions.
2026-07-30 22:06:49 -04:00
fb797f31e3 fix version lookup for internal plugin install; silence JSON parse debug noise 2026-07-30 18:53:43 -04:00
9bf088b7ff Add Willexecutors.is_valid + grey italic styling for invalid executors 2026-07-30 18:11:29 -04:00
4a9299d85b add make-release.sh, svatantrya.asc, and update HANDOFF.md
- make-release.sh: automated release script (tests, lint, build, GPG sign, SHA-256, Gitea)
- svatantrya.asc: PGP public key for release verification
- HANDOFF.md: updated release workflow documentation
- willexecutors.py: input validation for addresses, fees, and API responses
- manifest.json: fixed version back to 0.6.1
- test_core_plugin_base.py: updated baltx_fees default
2026-07-22 21:07:32 -04:00
4b0af6f4bf v0.6.1: read version from manifest.json (single source of truth)
Read the plugin version at runtime from bal/manifest.json via
importlib.resources (zip-safe, works from inside a zip on Windows).
Removes the four-file duplication (VERSION, __init__.py, plugin_base.py,
manifest.json) and deletes the bal/VERSION file.

- bal/core/plugin_base.py: new get_version() function, BalPlugin.version
  is now a @property, removed hardcoded __version__
- bal/__init__.py: removed __version__, replaced with a comment
- bal/core/willexecutors.py: user-agent uses get_version()
- bal/gui/qt/dialogs.py, widgets.py: call sites use .version property
- tests/test_version_source.py: 7 tests incl. zip-safe subprocess check
- HANDOFF.md: updated to single-source-of-truth documentation
- CHANGELOG.md: entries 43-46
- bal/manifest.json: version bumped to 0.6.1

PR #4 (branch bitcoinafterlife-patch-5).
2026-07-22 11:19:18 -04:00
449e815f89 v0.5.18: version bump 2026-07-16 12:31:51 +00:00
59c3271fc7 v0.5.18: onion helpers, download robustness, Tor-aware messages 2026-07-16 12:31:29 +00:00
7722272c39 v0.5.18: Tor-gated onion download, crash fix, clearer Tor timeout message 2026-07-16 12:30:30 +00:00
1d3227d963 v0.5.16: version bump 2026-07-16 09:38:08 +00:00
5cac176dfb v0.5.16: onion helpers + download filter 2026-07-16 09:37:40 +00:00
e4bcc4f911 v0.5.16: skip .onion will-executors from download when not on Tor 2026-07-16 09:37:10 +00:00
62502263fd v0.5.15: sync version in plugin_base 2026-07-15 12:08:13 +00:00
184eb7b619 v0.5.15: version bump 2026-07-15 12:07:43 +00:00
3845c8d739 v0.5.15: shorten long .onion URLs + fix KeyError on delete/select/ping 2026-07-15 12:06:58 +00:00
84e1094553 v0.5.13: version bump 2026-07-14 10:50:46 +00:00
df6b5e3e9a v0.5.13: Electrum 4.8.0 compatibility (register_dict -> register_name shim 2026-07-14 10:50:08 +00:00
b1145d654c v0.5.13: remove Check Alive red highlight 2026-07-14 10:49:27 +00:00
e8cde30182 v0.5.11: version bump 2026-07-13 21:54:53 +00:00
745489f616 v0.5.11: Electrum 4.8.0 compatibility (register_dict -> register_name shim) 2026-07-13 21:53:51 +00:00
cd2278c2b8 v0.5.10: sync version in plugin_base 2026-07-05 09:06:53 +00:00
3ceabac0bb v0.5.10: version bump 2026-07-05 09:05:36 +00:00
527ae95c75 v0.5.10: Check Alive/BASIC fixes, UX improvements, Raw-Date handling. 2026-07-05 09:03:57 +00:00
2cb39f1a6d v0.5.2: sync version in plugin_base 2026-07-04 10:07:53 +00:00
20fd54681f v0.5.2: version bump 2026-07-04 10:07:25 +00:00
346164207f v0.5.1: sync version in plugin_base 2026-07-04 08:12:25 +00:00
431bcc6247 v0.5.1: version bump 2026-07-04 08:11:18 +00:00
9cbed79590 v0.5.1: fix Windows Settings-dialog flicker 2026-07-04 08:07:33 +00:00
donkey-ai
ca874d8e93 v0.5.4 2026-07-02 00:29:26 +02:00
kaibot
868674ece2 baltx_fees default 100 -> 20 2026-06-30 06:23:44 -04:00
kaibot
aaa8658aa0 fix: default baltx_fees 100 -> 50 2026-06-30 06:21:58 -04:00
kaibot
aa03c12aab v0.5.0 2026-06-30 04:33:24 -04:00
kaibot
65b50b51f3 fix: auto-sign on check rispetta AUTO_SIGN + nascosto in basic mode
- plugin.py: auto-sign setting con widget nominati, nascosto in basic mode
  (visibile solo in ADVANCED, come welist server e calendar app)
- dialogs.py: _on_success_phase1_body() salta firma/broadcast quando
  AUTO_SIGN è OFF (solo in advanced; basic usa sempre default=True)
- dialogs.py: _show_next_steps_hint() sopprime hint manuali anche in basic
  mode (dove auto-sign è sempre attivo)
2026-06-30 04:27:31 -04:00
kaibot
7b77ff8692 feat: add will-executor edit dialog on double-click with sync button (↻)
- WillExecutorListWidget: double-click/Enter opens edit dialog
- WillExecutorWidget.add() accepts edit_key param for edit mode:
  pre-populates URL, Info, Base Fee, Address fields
- Sync button (↻) pings executor URL via TaskThread and populates
  fields; updates executor status in list in edit mode (200/KO)
- Loading indicator (⟳) during async ping
- QMessageBox with dialog as parent for sync errors
- Focus returns to URL field after sync error
- 'Add another' button only in add mode, no longer default (OK is default)
- Removed Promo Code field
- Heir dialog: 'Add another' no longer default (matches new pattern)
2026-06-30 03:56:11 -04:00
kaibot
ffd518f1a5 fix: forward force param in push_transactions_to_willexecutors so rebroadcast actually resends pushed txs 2026-06-30 02:55:53 -04:00
kaibot
8a6cfc13cf feat: add per-setting reset button (↺) to each row in settings dialog 2026-06-30 02:50:32 -04:00
kaibot
f574472dcf refactor: extract BalCalendarButton common widget + basic-mode default app 2026-06-30 02:43:05 -04:00
kaibot
02cda3513b feat: add calendar button with dropdown menu to build-will dialog + calendar app setting (advanced mode) 2026-06-30 02:27:50 -04:00
kaibot
6d568bf304 Fix: NoneType error in normalize_will when others_inputs is None
When deleting old transactions and clicking Check, task_phase1 would fail
with 'NoneType object has no attribute get' error in WillItem.normalize_locktime.

Root cause: In Will.normalize_will (will.py:150), the parameter others_inputs
defaults to None. At line 151, a local variable 'others_input' is created with
a safe default value (empty dict). However, lines 179 and 184 still used the
original 'others_inputs' parameter instead of the safe local variable, causing
the error when calling .get() on None.

Fix: Use the safe 'others_input' variable instead of the raw parameter in
lines 179 and 184.

Also added:
- Traceback logging to on_error_phase1 so future errors include full call stack
- Debug logging in update_all to log willitems state before processing
- Comprehensive test (test_e5_build_with_real_wallet_heirs_and_utxos) that
  reproduces the exact scenario from the user's karen7 wallet
2026-06-29 12:03:24 -04:00
kaibot
aa971b8759 fix: distinguish empty response from network error in advanced mode
Show 'No active will-executor servers for {chain}' when the server
responds with no data, and 'Could not reach the configured welist
server' only for actual connection errors.
2026-06-29 01:13:38 -04:00
kaibot
41803139c6 feat: move User Type above advanced-only settings, improve dialog sizing
- Move User Type combo to row 5 (before Number of reminders)
- Use QLayout.SizeConstraint.SetFixedSize so dialog auto-resizes on mode switch
- Hide event summary, description and reminders count in basic mode, use defaults
- Increase Event Description height to 3 lines
- Set minimum width on line edits for proper dialog sizing in advanced mode
2026-06-29 01:07:22 -04:00
kaibot
ff00097af4 docs: update User Type and welist server help texts
User Type help now says BASIC is safe for most users and lists
welist server URL config + always-editable fields as advanced features.
Welist server help text updated to 'Only available in ADVANCED mode'.
2026-06-29 00:29:17 -04:00
kaibot
7a58c69533 feat: add configurable welist server URL (advanced mode only)
- Add NoServersForChainError(chain, url, reason) with error details
- Expose WELIST_SERVER setting in plugin dialog, hidden in basic mode
- Basic mode uses factory default; advanced mode uses configured URL only
- Show descriptive error with URL and reason when advanced-mode fetch fails
2026-06-29 00:18:42 -04:00
kaibot
7004953ce2 fix: keep will-settings fields editable in advanced mode
In advanced mode the locktime, check-alive and fees fields should always
be editable regardless of the EDITABLE_DATES setting. Only basic mode
respects that setting.
2026-06-29 00:01:25 -04:00
kaibot
b8e6c240be feat(willexecutors): differentiate empty server response from network error
Raise NoServersForChainError when the welist server responds but returns
no data for the requested chain, showing a chain-specific message instead
of the generic network error.
2026-06-28 23:56:30 -04:00
donkey-ai
33e8a7533d v0.4.8: seven UX fixes for the BAL inheritance plugin
- #04: Raw/Date selector now reappears on the WILL/HEIR tabs when switching to
  ADVANCED (and when a raw value is pushed from the wizard), keeping the current
  value/editor. New BalTimeEditWidget.apply_user_type_visibility() wired into
  WillSettingsWidget for both the locktime and check-alive boxes.
- #3: Building Will report window minimum height 500 -> 450 px.
- #5: 'User Type' setting moved to the bottom, above 'Rebroadcast transactions'.
- #6: enabling ADVANCED now requires typing 'at My Risk' (case-insensitive);
  wrong phrase or cancel reverts to BASIC. QInputDialog added to common import.
- #7a: on CHECK with an emptied wallet, an extra reassuring line is shown on
  'Checking your will': 'Inheritance already executed (on blockchain)' in GREEN
  (CONFIRMED) or 'Inheritance in mempool (waiting confirmation)' in ORANGE
  (MEMPOOL). New _executed_inheritance_status() helper.
- #7b: 'Balance is too low, or CheckAlive is in the past. Skipped' (space added)
  recoloured to ORANGE instead of red.
- Reset button renamed 'Reset setting' -> 'Reset to Default Setting'.
- Added tests/test_group_h_v048.py (8 tests). Version 0.4.7 -> 0.4.8.
  Full suite: 266 passed; ruff clean; CHANGELOG #24; memory updated (#04 done).
2026-06-28 23:02:40 -04:00
donkey-ai
646a33f2f5 feat(v0.4.7): report area 500px, heirs one-per-line, wizard line breaks, ALL-DUST guard
Owner-approved changes after testing v0.4.6, plus accumulated v0.4.x work,
task-tracking notes, and an updated project HANDOFF document.

The four v0.4.7 changes:

1. Report area (BalBuildWillDialog) opens 500px tall (min) up to 700px (max),
   then the scrollbar takes over. Previously it opened ~140px (too short).

2. Heirs are listed ONE per line again (green, bold) in _build_success_report,
   reverting the v0.4.6 single-line form. Heir names can be long and the report
   now scrolls, so compression is no longer needed.

3. Two wizard texts get an explicit line break: after "(or backup)" in the date
   hint and after "miner fees" in the fee note (widgets.py).

4. ALL-DUST guard: when EVERY heir's share is below the Bitcoin dust limit, the
   inheritance would pay nobody. Heirs.prepare_lists now raises
   HeirAmountIsDustException at the end (where all heirs across all locktimes
   are known with their final dust state), and dialogs.task_phase1 shows a clear
   RED message and stops without building/signing/checking. A mix of dust +
   valid heirs keeps building normally. The guard is intentionally in
   prepare_lists, NOT prepare_transactions (which only sees the lowest locktime
   and would false-positive). HeirAmountIsDustException is imported in common.py.

Tests: 3 new tests in test_core_heirs_extra.py pin the dust behaviour (all-dust
raises; mixed continues; multi-locktime continues). Full suite: 258 passed.
ruff: no new errors. Version bumped 0.4.6 -> 0.4.7 (4 files). CHANGELOG #23.

Also adds/updates HANDOFF.md so any future AI (Claude or another model) can
resume the project with full context (rules, layout, build/test/lint, dust
logic, git flow), and records the task-tracking notes in
.agent_memory_tasks.md.
2026-06-28 23:02:25 -04:00
donkey-ai
5b707e647b feat(bal): UI batch v0.3.9 + expired-will invalidate regression fix
UI batch (TASK A/B/C/D):
- (A) Clearer 'Will expired' message: shortened will id (8+8 chars) and
  readable UTC date instead of raw UNIX timestamp; shown in WARNING colour
  (orange) instead of ERROR (red) in the wizard, as it is an expected step.
- (A2) Split the orange message onto two lines via <br> (rendered as HTML by
  msg_warning) to avoid an overly long single line.
- (B) History tab labels (text only): inheritance txs -> 'BAL Inheritance
  transaction'; invalidate tx -> 'BAL Invalidate transaction'. Colours left
  to Electrum defaults.
- (C) New 'No will-executor TX' checkbox in plugin settings, bound to the
  existing NO_WILLEXECUTOR config (default ON, kept in sync with the wizard),
  with help text, and included in the settings reset action.
- (D) Wizard button label 'Create your will' -> 'Build Your Will'.

Regression fix (A3):
- When an heir was added to an already-expired will via the wizard, the
  automatic invalidation no longer triggered. Root cause: the inner
  check_will() after build_will() raised WillExpiredException and the handler
  returned (False, None), which never invalidated.
- Auto-opening the invalidation tx window from the closing wizard proved
  unreliable (the window ended up behind the main wallet on some window
  managers; a re-check loop could ask to invalidate repeatedly before the tx
  reached the mempool). The robust fix: close the wizard and show a clear
  instruction popup guiding the user to run 'Tools -> Invalidate' and then
  press 'Check' to finish the will. Reasoning documented in the code.

Version bumped to 0.3.9 (manifest.json, __init__.py, plugin_base.py, VERSION).
CHANGELOG entry #15 updated. Verified: py_compile OK, ruff clean (no new
errors), full test suite 239 passed.
2026-06-28 23:02:11 -04:00