Replace the separate Export / Export V-NC toolbar actions with a cascading
Export submenu: All exports every will item, Valid exports only valid ones,
Valid NC exports valid items that are not yet fully signed.
- 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
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.
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).
- 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)
- 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)
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
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.
- 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
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'.
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.
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.
- #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).