allow resetting block_h in CCC menu

This commit is contained in:
scgbckbone 2026-01-30 22:54:03 +01:00 committed by doc-hex
parent 01c27fe568
commit 19f200a210
3 changed files with 43 additions and 8 deletions

View File

@ -8,6 +8,7 @@ This lists the new changes that have not yet been published in a normal release.
Navigate to `Advanced/Tools -> Export Wallet -> Key Expression`
- New Feature: Support for v3 transactions
- New Feature: Send keystrokes with all derived BIP-85 secrets
- Enhancement: CCC allow to reset block height
# Mk4 Specific Changes

View File

@ -285,7 +285,7 @@ class CCCFeature:
# a very basic and permissive policy, but non-zero too.
# - 1BTC per day
chain = chains.current_chain()
return SpendingPolicy('ccc', dict(mag=1, vel=144,
return SpendingPolicy('ccc', dict(mag=1, vel=144,
block_h=chain.ccc_min_block, web2fa='', addrs=[]))
@classmethod
@ -402,20 +402,32 @@ class CCCConfigMenu(MenuSystem):
async def debug_last_fail(self, *a):
# debug for customers: why did we reject that last txn?
c = chains.current_chain()
def_bh = c.ccc_min_block
pol = CCCFeature.get_policy()
bh = pol.get('block_h', None)
bh_clear = ''
msg = ''
if bh:
msg += "CCC height:\n\n%s\n\n" % bh
escape = "4"
if bh is not None:
msg += 'CCC height:\n\n%s\n\n' % bh
if bh != def_bh:
bh_clear = 'Press (1) to clear block height. '
escape += "1"
lfr = LastFailReason.get()
msg += 'The most recent policy check failed because of:\n\n%s\n\nPress (4) to clear.' \
% lfr
ch = await ux_show_story(msg, escape='4')
msg += ('The most recent policy check failed because of:\n\n%s\n\n'
'%sPress (4) to clear last fail reason.' % (lfr, bh_clear))
ch = await ux_show_story(msg, escape=escape)
if ch == '4':
LastFailReason.clear()
self.update_contents()
elif ch == '1':
if await ux_confirm("Reset block height to default value %d for %s?" % (def_bh, c.name)):
pol.update_policy_key(_quiet=True, _master_only=False, block_h=def_bh)
async def remove_ccc(self, *a):
# disable and remove feature

View File

@ -705,7 +705,9 @@ def test_ccc_whitelist(whitelist_ok, setup_ccc, ccc_ms_setup,
@pytest.mark.bitcoind
@pytest.mark.parametrize("velocity_mi", ['6 blocks (hour)', '48 blocks (8h)'])
def test_ccc_velocity(velocity_mi, setup_ccc, ccc_ms_setup, bitcoind, settings_set,
policy_sign, settings_get, bitcoind_create_watch_only_wallet):
policy_sign, settings_get, bitcoind_create_watch_only_wallet,
enter_enabled_ccc, pick_menu_item, cap_story, need_keypress,
press_select, press_cancel):
settings_set("ccc", None)
settings_set("chain", "XRT")
@ -713,7 +715,7 @@ def test_ccc_velocity(velocity_mi, setup_ccc, ccc_ms_setup, bitcoind, settings_s
blocks = int(velocity_mi.split()[0])
setup_ccc(vel=velocity_mi)
c_words = setup_ccc(vel=velocity_mi)
_, target_mi = ccc_ms_setup()
assert settings_get("ccc")["pol"]["block_h"] == 0
@ -786,6 +788,26 @@ def test_ccc_velocity(velocity_mi, setup_ccc, ccc_ms_setup, bitcoind, settings_s
violation="nLockTime not height"
)
enter_enabled_ccc(c_words)
pick_menu_item("Last Violation")
time.sleep(.1)
title, story = cap_story()
assert 'Press (1) to clear block height' in story
assert int(story.split("\n\n")[1]) == block_height
need_keypress("1")
time.sleep(.1)
title, story = cap_story()
assert "Reset block height to default value 0 for Bitcoin Regtest?" in story
press_select()
time.sleep(.1)
pick_menu_item("Last Violation")
time.sleep(.1)
title, story = cap_story()
assert 'Press (1) to clear block height' not in story # not in story when default
assert int(story.split("\n\n")[1]) == 0
press_cancel() # go back to CCC menu
press_cancel() # got home
@pytest.mark.bitcoind
def test_ccc_warnings(setup_ccc, ccc_ms_setup, bitcoind, settings_set, policy_sign,