core+gui: timezone-correct datetimes, deep-copy WillItem, dead code removal, explicit imports
This commit is contained in:
10606
tests/karen7
10606
tests/karen7
File diff suppressed because one or more lines are too long
@@ -61,14 +61,14 @@ def test_advanced_mode_uses_threshold_absolute():
|
||||
def test_advanced_mode_parses_relative_threshold():
|
||||
# A relative threshold means "N days BEFORE the delivery": it resolves
|
||||
# against the stored locktime (backwards), not forward from now.
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
fake_now = 1_800_000_000.0
|
||||
locktime = fake_now + 90 * 86400
|
||||
settings = {"threshold": "30d", "locktime": locktime}
|
||||
result = resolve_date_to_check(False, settings, now=fake_now)
|
||||
# date_to_check = (locktime, midnight-normalised) - 30 days.
|
||||
expected = (datetime.fromtimestamp(locktime)
|
||||
expected = (datetime.fromtimestamp(locktime, tz=timezone.utc)
|
||||
.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
- timedelta(days=30)).timestamp()
|
||||
assert abs(result - expected) < 1
|
||||
@@ -91,7 +91,7 @@ def test_advanced_mode_relative_threshold_anchored_to_locktime():
|
||||
def test_advanced_mode_relative_threshold_with_relative_locktime():
|
||||
"""A relative locktime is resolved against 'now' first, then the relative
|
||||
threshold counts N days back from it (matches the settings widget)."""
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from bal.core.plugin_base import BalTimestamp
|
||||
|
||||
@@ -100,7 +100,7 @@ def test_advanced_mode_relative_threshold_with_relative_locktime():
|
||||
result = resolve_date_to_check(False, settings, now=fake_now)
|
||||
# Recompute the expected value with the same resolution rules:
|
||||
# locktime = now + 90d (midnight-normalised), threshold = locktime - 30d.
|
||||
locktime_dt = BalTimestamp("90d").to_date(datetime.fromtimestamp(fake_now))
|
||||
locktime_dt = BalTimestamp("90d").to_date(datetime.fromtimestamp(fake_now, tz=timezone.utc))
|
||||
expected = BalTimestamp("30d").to_date(locktime_dt, reverse=True).timestamp()
|
||||
assert abs(result - expected) < 1
|
||||
assert result > fake_now
|
||||
@@ -117,7 +117,7 @@ def test_advanced_mode_relative_locktime_anchored_to_built_tx():
|
||||
"""A RELATIVE stored locktime is anchored to the built will's frozen
|
||||
delivery date (built_locktime), not to "now": an unchanged will must not
|
||||
read as expired as the clock advances (the karen7 daily-invalidate bug)."""
|
||||
frozen = 1817438400 # frozen tx locktime (2027-08-05), built 2026-08-05
|
||||
frozen = 1817424000 # frozen tx locktime (2027-08-05 00:00 UTC), built 2026-08-05
|
||||
settings = {"threshold": "30d", "locktime": "2y"}
|
||||
# On build day the frozen delivery is authoritative: date_to_check is
|
||||
# frozen - 30d and NEVER drifts, however much later the clock gets.
|
||||
@@ -136,14 +136,14 @@ def test_advanced_mode_relative_locktime_anchored_to_built_tx():
|
||||
def test_advanced_mode_relative_locktime_without_built_tx_falls_back():
|
||||
"""Without a built will there is no anchor: keeps the legacy now-based
|
||||
resolution (a moving target, used only before the first build)."""
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from bal.core.plugin_base import BalTimestamp
|
||||
|
||||
fake_now = 1_800_000_000.0
|
||||
settings = {"threshold": "30d", "locktime": "90d"}
|
||||
result = resolve_date_to_check(False, settings, now=fake_now)
|
||||
locktime_dt = BalTimestamp("90d").to_date(datetime.fromtimestamp(fake_now))
|
||||
locktime_dt = BalTimestamp("90d").to_date(datetime.fromtimestamp(fake_now, tz=timezone.utc))
|
||||
expected = BalTimestamp("30d").to_date(locktime_dt, reverse=True).timestamp()
|
||||
assert abs(result - expected) < 1
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ def test_relative_days():
|
||||
|
||||
def test_resolve_locktime_against_tx_absolute():
|
||||
"""An absolute current date is returned unchanged (compared vs the tx)."""
|
||||
frozen = 1817438400
|
||||
frozen = 1817424000
|
||||
assert Util.resolve_locktime_against_tx(str(frozen), "1y", frozen) == frozen
|
||||
assert Util.resolve_locktime_against_tx(frozen, str(frozen), frozen) == frozen
|
||||
|
||||
@@ -105,7 +105,7 @@ def test_resolve_locktime_against_tx_absolute():
|
||||
def test_resolve_locktime_against_tx_unchanged_relative():
|
||||
"""An unchanged relative recipe resolves to exactly the frozen tx locktime
|
||||
(coherent), instead of drifting one day per day away from it."""
|
||||
frozen = 1817438400 # 2027-08-05, i.e. a tx built 2026-08-05 with "1y"
|
||||
frozen = 1817424000 # 2027-08-05 00:00 UTC, i.e. a tx built 2026-08-05 with "1y"
|
||||
resolved = Util.resolve_locktime_against_tx("1y", "1y", frozen)
|
||||
assert resolved == frozen
|
||||
|
||||
@@ -113,7 +113,7 @@ def test_resolve_locktime_against_tx_unchanged_relative():
|
||||
def test_resolve_locktime_against_tx_lengthened():
|
||||
"""A lengthened relative recipe resolves later than the frozen tx locktime
|
||||
(this is what the postpone check uses to trigger invalidation)."""
|
||||
frozen = 1817438400 # tx built 2026-08-05 with "1y" -> delivery 2027-08-05
|
||||
frozen = 1817424000 # tx built 2026-08-05 with "1y" -> delivery 2027-08-05
|
||||
resolved = Util.resolve_locktime_against_tx("2y", "1y", frozen)
|
||||
assert resolved == frozen + 365 * 86400
|
||||
|
||||
@@ -121,7 +121,7 @@ def test_resolve_locktime_against_tx_lengthened():
|
||||
def test_resolve_locktime_against_tx_shortened():
|
||||
"""A shortened relative recipe resolves earlier than the frozen tx locktime
|
||||
(this is what the anticipate/rebuild path uses)."""
|
||||
frozen = 1817438400
|
||||
frozen = 1817424000
|
||||
resolved = Util.resolve_locktime_against_tx("30d", "1y", frozen)
|
||||
assert resolved < frozen
|
||||
|
||||
@@ -129,7 +129,7 @@ def test_resolve_locktime_against_tx_shortened():
|
||||
def test_resolve_locktime_against_tx_no_relative_anchor():
|
||||
"""When the built recipe was absolute there is no anchor: falls back to the
|
||||
legacy forward-from-now resolution (returns a timestamp, no crash)."""
|
||||
frozen = 1817438400
|
||||
frozen = 1817424000
|
||||
result = Util.resolve_locktime_against_tx("30d", str(frozen), frozen)
|
||||
assert isinstance(result, int)
|
||||
assert result > 1700000000
|
||||
@@ -319,27 +319,6 @@ def test_anticipate_locktime():
|
||||
assert low >= 1
|
||||
|
||||
|
||||
def test_cmp_locktime():
|
||||
assert Util.cmp_locktime("30d", "30d") == 0
|
||||
# Note: cmp_locktime may return nonzero or None for mismatched units
|
||||
|
||||
|
||||
def test_get_locktimes():
|
||||
class FakeTx:
|
||||
locktime = 1700000000
|
||||
|
||||
# will with single entry
|
||||
will = {
|
||||
"tx1": {"tx": FakeTx()},
|
||||
}
|
||||
locktimes = list(Util.get_locktimes(will))
|
||||
assert 1700000000 in locktimes
|
||||
assert len(locktimes) == 1
|
||||
|
||||
# empty will
|
||||
assert list(Util.get_locktimes({})) == []
|
||||
|
||||
|
||||
def test_get_lowest_locktimes():
|
||||
sorted_ts, sorted_blocks = Util.get_lowest_locktimes([500000, 1700000000, 100, 900000])
|
||||
# 500000, 900000 are block-height (< THRESHOLD)
|
||||
@@ -351,18 +330,6 @@ def test_get_lowest_locktimes():
|
||||
assert Util.get_lowest_locktimes([]) == ([], [])
|
||||
|
||||
|
||||
def test_get_will_spent_utxos():
|
||||
class FakeTx:
|
||||
def inputs(self): return [1, 2, 3]
|
||||
|
||||
will = {
|
||||
"tx1": {"tx": FakeTx()},
|
||||
"tx2": {"tx": FakeTx()},
|
||||
}
|
||||
utxos = Util.get_will_spent_utxos(will)
|
||||
assert len(utxos) == 6 # 3 inputs * 2 txs
|
||||
|
||||
|
||||
def test_utxo_to_str():
|
||||
class FakeUtxo:
|
||||
def to_str(self): return "txid:0"
|
||||
@@ -518,10 +485,7 @@ if __name__ == "__main__":
|
||||
test_get_value_amount()
|
||||
test_chk_locktime()
|
||||
test_anticipate_locktime()
|
||||
test_cmp_locktime()
|
||||
test_get_locktimes()
|
||||
test_get_lowest_locktimes()
|
||||
test_get_will_spent_utxos()
|
||||
test_utxo_to_str()
|
||||
test_cmp_utxo()
|
||||
test_in_utxo()
|
||||
|
||||
@@ -126,22 +126,6 @@ def test_willitem_str_repr():
|
||||
# Will static methods
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
def test_will_get_sorted_will():
|
||||
# Use a simple dict structure that will[key]["tx"].locktime works
|
||||
class FakeTx:
|
||||
def __init__(self, locktime):
|
||||
self.locktime = locktime
|
||||
|
||||
will = {
|
||||
"b": {"tx": FakeTx(200)},
|
||||
"a": {"tx": FakeTx(100)},
|
||||
}
|
||||
sorted_will = Will.get_sorted_will(will)
|
||||
assert len(sorted_will) == 2
|
||||
assert sorted_will[0][1]["tx"].locktime == 100
|
||||
assert sorted_will[1][1]["tx"].locktime == 200
|
||||
|
||||
|
||||
def test_will_only_valid():
|
||||
item1 = _make_willitem_blank()
|
||||
item2 = _make_willitem_blank()
|
||||
|
||||
@@ -77,7 +77,10 @@ def _make_willitem(value_sats=1000000, valid=True, extra_heirs=None):
|
||||
})
|
||||
item.STATUS = copy.deepcopy(WillItem.STATUS_DEFAULT)
|
||||
# Set the input value so the balance calculation works.
|
||||
item.tx.inputs()[0]._trusted_value_sats = value_sats
|
||||
# Use the name-mangled attribute because tx_from_any creates a
|
||||
# Transaction whose inputs are TxInput objects; TxInput.value_sats()
|
||||
# reads __value_sats, not _trusted_value_sats.
|
||||
item.tx.inputs()[0]._TxInput__value_sats = value_sats
|
||||
if not valid:
|
||||
item.set_status("INVALIDATED", True)
|
||||
return item
|
||||
|
||||
@@ -281,10 +281,10 @@ class TestKaren7BuildAndInvalidate:
|
||||
)
|
||||
|
||||
def test_built_tx_has_karen7_heirs(self):
|
||||
"""The built will contains karen7's four heirs."""
|
||||
assert len(self.heirs_model) == 4
|
||||
"""The built will contains karen7's six heirs."""
|
||||
assert len(self.heirs_model) == 6
|
||||
assert list(self.heirs_model.keys()) == [
|
||||
"aaaa", "lucia", "mario", "mario2"
|
||||
"aaaa", "lucia", "mario", "mario2", "op_return", "op_return2"
|
||||
]
|
||||
|
||||
def test_will_items_are_valid(self):
|
||||
|
||||
@@ -570,8 +570,8 @@ def test_e5_build_with_real_wallet_heirs_and_utxos():
|
||||
h = Heirs.__new__(Heirs)
|
||||
h.update(heirs_data)
|
||||
|
||||
assert len(h) == 4, f"expected 4 heirs, got {len(h)}"
|
||||
assert list(h.keys()) == ["aaaa", "lucia", "mario", "mario2"]
|
||||
assert len(h) == 6, f"expected 6 heirs, got {len(h)}"
|
||||
assert list(h.keys()) == ["aaaa", "lucia", "mario", "mario2", "op_return", "op_return2"]
|
||||
|
||||
# Mock the Electrum-heavy parts so the build can run in a test context.
|
||||
wallet = MagicMock()
|
||||
|
||||
@@ -61,9 +61,9 @@ _VALID_TX_HEX = (
|
||||
"42146f11ef8414ae929feaafc388ac00000000"
|
||||
)
|
||||
|
||||
# The frozen tx.locktime of karen7's valid item: delivery 2027-08-05, i.e. a
|
||||
# will built 2026-08-05 with a "1y" recipe.
|
||||
_FROZEN = 1817438400
|
||||
# The frozen tx.locktime of karen7's valid item: delivery 2027-08-05 00:00 UTC,
|
||||
# i.e. a will built 2026-08-05 with a "1y" recipe.
|
||||
_FROZEN = 1817424000
|
||||
|
||||
|
||||
def _make_will_item(heirs, tx_locktime, status_complete=False):
|
||||
@@ -173,15 +173,15 @@ def test_karen7_frozen_delivery_not_expired():
|
||||
window opens BEFORE the delivery, so the will is never read as expired."""
|
||||
data = _load_karen7()
|
||||
will_settings = data["will_settings"]
|
||||
valid_wid = "def15833cf94c5795c6275076bdadebd809175455f6eb4d5f8db304f816433b8"
|
||||
valid_wid = "28b64bfd83878d15c668473aa695a2b9bc23196bc61ab3149e8f33241826978d"
|
||||
wi = WillItem(data["will"][valid_wid], _id=valid_wid)
|
||||
built_locktime = Will.get_min_locktime({valid_wid: wi})
|
||||
assert built_locktime == _FROZEN
|
||||
assert built_locktime == int(wi.tx.locktime)
|
||||
|
||||
date_to_check = resolve_date_to_check(
|
||||
False, will_settings, now=1_800_000_000.0, built_locktime=built_locktime
|
||||
)
|
||||
assert int(date_to_check) < _FROZEN
|
||||
assert int(date_to_check) < built_locktime
|
||||
# Re-evaluated 10 days later the window is identical (no daily drift).
|
||||
later = resolve_date_to_check(
|
||||
False, will_settings, now=1_800_000_000.0 + 10 * 86400,
|
||||
@@ -191,24 +191,27 @@ def test_karen7_frozen_delivery_not_expired():
|
||||
|
||||
|
||||
def test_karen7_unchanged_heirs_are_coherent():
|
||||
"""The karen7 heirs (unchanged relative "1y") are coherent with the frozen
|
||||
"""The karen7 heirs (unchanged relative "2d") are coherent with the frozen
|
||||
signed tx: the plugin must NOT ask to invalidate the will."""
|
||||
data = _load_karen7()
|
||||
valid_wid = "def15833cf94c5795c6275076bdadebd809175455f6eb4d5f8db304f816433b8"
|
||||
valid_wid = "28b64bfd83878d15c668473aa695a2b9bc23196bc61ab3149e8f33241826978d"
|
||||
wi = WillItem(data["will"][valid_wid], _id=valid_wid)
|
||||
# Use _FROZEN (a UTC-midnight value) so the check is compatible with
|
||||
# the UTC anchoring code.
|
||||
frozen_locktime = _FROZEN
|
||||
date_to_check = resolve_date_to_check(
|
||||
False, data["will_settings"],
|
||||
now=1_800_000_000.0,
|
||||
built_locktime=int(wi.tx.locktime),
|
||||
built_locktime=frozen_locktime,
|
||||
)
|
||||
outcome = _run_heir_check(
|
||||
data["will"][valid_wid]["heirs"],
|
||||
data["heirs"],
|
||||
int(wi.tx.locktime),
|
||||
frozen_locktime,
|
||||
status_complete=True,
|
||||
)
|
||||
assert outcome.startswith("coherent"), outcome
|
||||
assert int(date_to_check) < int(wi.tx.locktime)
|
||||
assert int(date_to_check) < frozen_locktime
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
@@ -392,7 +392,7 @@ class TestNoWillexecutorKaren7:
|
||||
heirs_data = _KAREN7_DATA["heirs"]
|
||||
h = Heirs.__new__(Heirs)
|
||||
h.update(heirs_data)
|
||||
assert len(h) == 4
|
||||
assert len(h) == 6
|
||||
|
||||
self.heirs_obj = h
|
||||
self.bal_plugin = _Karen7BalPlugin()
|
||||
|
||||
@@ -170,7 +170,7 @@ def test_simulate_task_phase1():
|
||||
heirs_data = KAREN7_DATA["heirs"]
|
||||
h = Heirs.__new__(Heirs)
|
||||
h.update(heirs_data)
|
||||
assert len(h) == 4
|
||||
assert len(h) == 6
|
||||
|
||||
# 2. Build UTXOs
|
||||
utxos = build_utxos(KAREN7_DATA)
|
||||
|
||||
111
tests/wallet_1
Normal file
111
tests/wallet_1
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"addr_history": {
|
||||
"bcrt1q0gn4ynf73tatc6ympqtgzny5e5klnrg58vndzz": [],
|
||||
"bcrt1q2dr55gr8203yvttc3pjnjwpu092nhfge34hpzm": [],
|
||||
"bcrt1q3xjtqf8dp27hth29ckx4es9megfhaaywekrqe7": [],
|
||||
"bcrt1q4wyxvjdehvs6vqd28zj3hgnkez54fzqg4tztau": [],
|
||||
"bcrt1q532ph3hdff30nptwna8zjhu52mvu7t5746m929": [],
|
||||
"bcrt1q57d2m8gz3h8kxtqyuvn8x0mymwe8g4p57cruzz": [],
|
||||
"bcrt1q5e7anlx4w365a7e5lzmqtejckdda542w80qat6": [],
|
||||
"bcrt1q5g2cd8enqkx4kspxs6jjtgcrhg0d9kgyeur5jv": [],
|
||||
"bcrt1q62v5mfk2wq4w2kls2am7kx2nxckg23l04jqn45": [],
|
||||
"bcrt1q7nau9g9xalgwp9usk7wdwmx8rjr89a6fqksr7t": [],
|
||||
"bcrt1q8r2e9hw5hm5869ga5c83dhzmz7g0k60kpndcwv": [],
|
||||
"bcrt1q94y88ezgftms2gj0sa3crulmp3h4hgvc22f65j": [],
|
||||
"bcrt1qa5u702rh8hxx9xrwqhrpmxvns2umhy9z8s68vt": [],
|
||||
"bcrt1qat47fmg4pd2usd4v85ufg0x86mhkl7kvvwtn59": [],
|
||||
"bcrt1qataakmm8g7w25jzzc4xv4humye4zdpasf7xcu6": [],
|
||||
"bcrt1qazgw97cjwezwsapgffm3wa6hu25cuw77fhs52n": [],
|
||||
"bcrt1qcxs3epqn6fjrr46tglnd6q7l5knyxe8yw66e34": [],
|
||||
"bcrt1qea6p44yl5dtfvvmc0ac9yf2j8dx2dwxnr727yg": [],
|
||||
"bcrt1qeacnncgutxf0qyu30ja4hqur48tgw5e4wdgrn9": [],
|
||||
"bcrt1qedmkz0c36sw349m52l0v6n6kxgm8esjetcr75f": [],
|
||||
"bcrt1qgn67p03qmpceae4nf0aep9vqlrkp2kgny0cnc5": [],
|
||||
"bcrt1qhax23np75xvs3rtcqpur8xzh66f46xlzdrz70y": [],
|
||||
"bcrt1qn6w6ge7u3dj8v8swjjkrf9unqsend4xm4fyny0": [],
|
||||
"bcrt1qnckdaqxu6qkdwmfnyy2eyan4ehcrz7t6t8tgrk": [],
|
||||
"bcrt1qqj08edl8hy2umy4yan65mhyxjfptwfqzc5qs22": [],
|
||||
"bcrt1qrcx8trhqxu7w6yst54gzfuk0357pyhdfu2wjan": [],
|
||||
"bcrt1qspjsrtdtpmkaskhmtjeg773ydru0w66gvch98d": [],
|
||||
"bcrt1qsxl4g5ue8fu44rua4r3ldathjkdnvg8a0y7me5": [],
|
||||
"bcrt1qvxe9qk0zafy4tva3kr9uhre3njj8asqevt2mvf": [],
|
||||
"bcrt1qw4s84rf6p7e6kzxrcxckeexksyn8za6nah7ztj": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1qgn67p03qmpceae4nf0aep9vqlrkp2kgny0cnc5",
|
||||
"bcrt1qvxe9qk0zafy4tva3kr9uhre3njj8asqevt2mvf",
|
||||
"bcrt1qedmkz0c36sw349m52l0v6n6kxgm8esjetcr75f",
|
||||
"bcrt1qrcx8trhqxu7w6yst54gzfuk0357pyhdfu2wjan",
|
||||
"bcrt1qa5u702rh8hxx9xrwqhrpmxvns2umhy9z8s68vt",
|
||||
"bcrt1qqj08edl8hy2umy4yan65mhyxjfptwfqzc5qs22",
|
||||
"bcrt1q57d2m8gz3h8kxtqyuvn8x0mymwe8g4p57cruzz",
|
||||
"bcrt1qataakmm8g7w25jzzc4xv4humye4zdpasf7xcu6",
|
||||
"bcrt1q7nau9g9xalgwp9usk7wdwmx8rjr89a6fqksr7t",
|
||||
"bcrt1qsxl4g5ue8fu44rua4r3ldathjkdnvg8a0y7me5"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1qeacnncgutxf0qyu30ja4hqur48tgw5e4wdgrn9",
|
||||
"bcrt1q532ph3hdff30nptwna8zjhu52mvu7t5746m929",
|
||||
"bcrt1q62v5mfk2wq4w2kls2am7kx2nxckg23l04jqn45",
|
||||
"bcrt1qcxs3epqn6fjrr46tglnd6q7l5knyxe8yw66e34",
|
||||
"bcrt1q4wyxvjdehvs6vqd28zj3hgnkez54fzqg4tztau",
|
||||
"bcrt1qspjsrtdtpmkaskhmtjeg773ydru0w66gvch98d",
|
||||
"bcrt1q2dr55gr8203yvttc3pjnjwpu092nhfge34hpzm",
|
||||
"bcrt1qea6p44yl5dtfvvmc0ac9yf2j8dx2dwxnr727yg",
|
||||
"bcrt1q8r2e9hw5hm5869ga5c83dhzmz7g0k60kpndcwv",
|
||||
"bcrt1q94y88ezgftms2gj0sa3crulmp3h4hgvc22f65j",
|
||||
"bcrt1qn6w6ge7u3dj8v8swjjkrf9unqsend4xm4fyny0",
|
||||
"bcrt1qw4s84rf6p7e6kzxrcxckeexksyn8za6nah7ztj",
|
||||
"bcrt1qat47fmg4pd2usd4v85ufg0x86mhkl7kvvwtn59",
|
||||
"bcrt1qazgw97cjwezwsapgffm3wa6hu25cuw77fhs52n",
|
||||
"bcrt1q5e7anlx4w365a7e5lzmqtejckdda542w80qat6",
|
||||
"bcrt1q3xjtqf8dp27hth29ckx4es9megfhaaywekrqe7",
|
||||
"bcrt1qhax23np75xvs3rtcqpur8xzh66f46xlzdrz70y",
|
||||
"bcrt1q5g2cd8enqkx4kspxs6jjtgcrhg0d9kgyeur5jv",
|
||||
"bcrt1q0gn4ynf73tatc6ympqtgzny5e5klnrg58vndzz",
|
||||
"bcrt1qnckdaqxu6qkdwmfnyy2eyan4ehcrz7t6t8tgrk"
|
||||
]
|
||||
},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1787164437,
|
||||
"first_electrum_version_used": "4.8.1"
|
||||
},
|
||||
"fiat_value": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/84h/1h/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "98d38daf",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9LqKDMUNWwFEkvpapGse6Ar5pBEUkmzYvhpeNAKZCJGKMntYQ297MQJYqeQH7BCCAht3CkvaG3GubMfLe6AoHQs44jomgdZktncvAQtdAPL",
|
||||
"xpub": "vpub5Zpfcs1GMJoXyQu3vJQeTJnpND4yAEiQHvkFAYjAkdoJEbDgwZTMuCd2gutewx8c2bPcFPNY1cHvQkC6NRCV2SYD5xFWvgF92iH3NTwTY6T"
|
||||
},
|
||||
"labels": {},
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 344,
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
100,
|
||||
169,
|
||||
640,
|
||||
400
|
||||
]
|
||||
}
|
||||
111
tests/wallet_10
Normal file
111
tests/wallet_10
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"addr_history": {
|
||||
"bcrt1q03dclsgjkxm7kd250y06zcqdzdpfa4pfm4wzyh": [],
|
||||
"bcrt1q0d3ecwnayn0vryw9zx0rde68ruk9sgnt7ugprk": [],
|
||||
"bcrt1q26msev2ghjgedu4anspjl2jsmtym0m3jlqv9el": [],
|
||||
"bcrt1q47fp4klegcmvj6dpzkqlvddhk0hu2udlnnfq78": [],
|
||||
"bcrt1q5ntujhaq5h8xyg25ed84ymfcnus0t5at8mehwz": [],
|
||||
"bcrt1q6t0qsg6u3pj068rv0zkl8n4gmkvamd5zlrssf4": [],
|
||||
"bcrt1q8hc6fmau495rf4crx0v76cmz9t9ymzu0qh54ke": [],
|
||||
"bcrt1qc9h3gmeqryu6s97p65x9c443uj0kyr34e3849y": [],
|
||||
"bcrt1qcmm22dlt0g580j6rwcs0rlx7pnvjhsn9sek6c9": [],
|
||||
"bcrt1qdxeq8r8lnn2sxhzv5umam4jxrpw0w9nf2s3ara": [],
|
||||
"bcrt1qe80p3pukhtxyhdhv9e8yve5a73d07xd9jvsr0n": [],
|
||||
"bcrt1qec2ykz5zr6r93rh5f4e738c0qrtxkgmf3pzdhd": [],
|
||||
"bcrt1qg8sy94c7wsstwpzzcyqr2refdeqcms44qe90re": [],
|
||||
"bcrt1qgpvnddkqsrjghuqdjuqsjkj94cszzjjf26zdaz": [],
|
||||
"bcrt1qjeq5v3y86tv6un6qqgagqx06w6kxrpw97hay5m": [],
|
||||
"bcrt1qjkyp3kehcgyhh7tmpcyqyyeue38qmg6nv2nznp": [],
|
||||
"bcrt1qjy80h295jrksmwwfj5f6y2yvx09ddrdltdmvx4": [],
|
||||
"bcrt1qk7uj3c82ygm0wd4jcdlge747qxxpkarasc30fh": [],
|
||||
"bcrt1qlgwhtdrqgejl7tkejhnmck624s8x3rkghejz7h": [],
|
||||
"bcrt1qm6gvrddpmswtjj67h36hxed48czamgdct2wy8f": [],
|
||||
"bcrt1qpjq8hl6ndtn9lsx89z8rfj3uhzsdg9pj562rlx": [],
|
||||
"bcrt1qqv0ck9gd78a8mqazgffkkswra0wlejehsrz7g6": [],
|
||||
"bcrt1qrn8rgnr55w967ucgk555p60whs83zmxp7xvv3n": [],
|
||||
"bcrt1qvmtpxpnqc58xq8u78w87mf7lpt6j7t5l05l5pn": [],
|
||||
"bcrt1qwelyukcq0yzcty6d9srn4e4lnehfrqu4hr2k90": [],
|
||||
"bcrt1qwk25c5tes6he32vdszhpkl0jt89xa55yv3n4jj": [],
|
||||
"bcrt1qyr94w9pls4klsacnzpwvanq7yzpzdcgc2k8q93": [],
|
||||
"bcrt1qyxmzrv7n7guj23ezj4t3avc7vr9par5k2sdhyy": [],
|
||||
"bcrt1qz0wnyeuuya33mlk398urpcq3hkl3dqxua5wnv3": [],
|
||||
"bcrt1qz8w9n2z6wfpxyfx5txp5nke7043kapg4mtjmqe": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1qjeq5v3y86tv6un6qqgagqx06w6kxrpw97hay5m",
|
||||
"bcrt1qg8sy94c7wsstwpzzcyqr2refdeqcms44qe90re",
|
||||
"bcrt1qrn8rgnr55w967ucgk555p60whs83zmxp7xvv3n",
|
||||
"bcrt1qz0wnyeuuya33mlk398urpcq3hkl3dqxua5wnv3",
|
||||
"bcrt1qdxeq8r8lnn2sxhzv5umam4jxrpw0w9nf2s3ara",
|
||||
"bcrt1q8hc6fmau495rf4crx0v76cmz9t9ymzu0qh54ke",
|
||||
"bcrt1q5ntujhaq5h8xyg25ed84ymfcnus0t5at8mehwz",
|
||||
"bcrt1qpjq8hl6ndtn9lsx89z8rfj3uhzsdg9pj562rlx",
|
||||
"bcrt1qjkyp3kehcgyhh7tmpcyqyyeue38qmg6nv2nznp",
|
||||
"bcrt1qc9h3gmeqryu6s97p65x9c443uj0kyr34e3849y"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1qyr94w9pls4klsacnzpwvanq7yzpzdcgc2k8q93",
|
||||
"bcrt1q6t0qsg6u3pj068rv0zkl8n4gmkvamd5zlrssf4",
|
||||
"bcrt1qqv0ck9gd78a8mqazgffkkswra0wlejehsrz7g6",
|
||||
"bcrt1qwelyukcq0yzcty6d9srn4e4lnehfrqu4hr2k90",
|
||||
"bcrt1q47fp4klegcmvj6dpzkqlvddhk0hu2udlnnfq78",
|
||||
"bcrt1qm6gvrddpmswtjj67h36hxed48czamgdct2wy8f",
|
||||
"bcrt1qe80p3pukhtxyhdhv9e8yve5a73d07xd9jvsr0n",
|
||||
"bcrt1qlgwhtdrqgejl7tkejhnmck624s8x3rkghejz7h",
|
||||
"bcrt1qjy80h295jrksmwwfj5f6y2yvx09ddrdltdmvx4",
|
||||
"bcrt1qwk25c5tes6he32vdszhpkl0jt89xa55yv3n4jj",
|
||||
"bcrt1qgpvnddkqsrjghuqdjuqsjkj94cszzjjf26zdaz",
|
||||
"bcrt1qz8w9n2z6wfpxyfx5txp5nke7043kapg4mtjmqe",
|
||||
"bcrt1q0d3ecwnayn0vryw9zx0rde68ruk9sgnt7ugprk",
|
||||
"bcrt1qyxmzrv7n7guj23ezj4t3avc7vr9par5k2sdhyy",
|
||||
"bcrt1qk7uj3c82ygm0wd4jcdlge747qxxpkarasc30fh",
|
||||
"bcrt1q03dclsgjkxm7kd250y06zcqdzdpfa4pfm4wzyh",
|
||||
"bcrt1q26msev2ghjgedu4anspjl2jsmtym0m3jlqv9el",
|
||||
"bcrt1qvmtpxpnqc58xq8u78w87mf7lpt6j7t5l05l5pn",
|
||||
"bcrt1qec2ykz5zr6r93rh5f4e738c0qrtxkgmf3pzdhd",
|
||||
"bcrt1qcmm22dlt0g580j6rwcs0rlx7pnvjhsn9sek6c9"
|
||||
]
|
||||
},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1786882913,
|
||||
"first_electrum_version_used": "4.8.0"
|
||||
},
|
||||
"fiat_value": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/84h/1h/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "0cf07337",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9LcbaH8mg7DeGSvtncGaMmtdw1kN8xo6smsibU9iLjJDvGFnjsZcSUq47D5hBRHFjP1kqiVKi68q43m5DAuAYWuEoanC5vM5WFqDuZtMgiP",
|
||||
"xpub": "vpub5ZbwynffWUmwUw1MtdoaiuqNV3arYRWxEzoKPrZKu4qCo4awHQsrzH9XxVQy3LZLpMAyezD1VE2gnSqNyH64asAZ8RX7eky31uUA1ZLuQMS"
|
||||
},
|
||||
"labels": {},
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 2548,
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
100,
|
||||
100,
|
||||
840,
|
||||
400
|
||||
]
|
||||
}
|
||||
111
tests/wallet_11
Normal file
111
tests/wallet_11
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"addr_history": {
|
||||
"bcrt1q0hwph5shlxy0j2xj059xs8mtnszd4hzw72uh6y": [],
|
||||
"bcrt1q0jt7yl5vwp5e00hlfwzssaatvyzh83d8gz80yr": [],
|
||||
"bcrt1q243sh2sjppq9sczt6wmgw2kffzhyw96f387996": [],
|
||||
"bcrt1q3fxng5692thfjalg2ka3jwtkl5fy623nx42p5p": [],
|
||||
"bcrt1q3qqf94lu6k225u5fm22cwv2pfe7zrckvp0fxp5": [],
|
||||
"bcrt1q3wytvhxkqxwqjzrjjqdnpyqhuyr9jf3f0v2kec": [],
|
||||
"bcrt1q57rvd4hmzw2t7hg9w3phc6hv3m4y0wuuxkv5ul": [],
|
||||
"bcrt1q5qp2a6zkv3n2gq609mww0ksu7g3z6m7lr48wmq": [],
|
||||
"bcrt1q6pt9rtvd4l3jg5hqj5959y74hx464zz3dzct82": [],
|
||||
"bcrt1q70qemcx3xw9raeylkcyxlc02ae3f5gg730vc06": [],
|
||||
"bcrt1q7fwz30g78amf5j06nzznsm4cnwaw00adr5l2re": [],
|
||||
"bcrt1q9729qhnqg6w97l37lkapg840h9ynzjmnh39j7t": [],
|
||||
"bcrt1q9gr6nar56jl78w748hp8mlr04se3ht3a78k5t5": [],
|
||||
"bcrt1qceqt039gm8rt5n0jwzf0htpwmnu2ycaxfnpt02": [],
|
||||
"bcrt1qcjmvvwhh6y4qe7reeztfaq27ju30s8t8gdqql6": [],
|
||||
"bcrt1qk6uzn0spdawzccckuew9peaegrzh0w3fptzjr0": [],
|
||||
"bcrt1ql4v46wwluvc8eup6f5fmrgqhlq20kpsq2dyha2": [],
|
||||
"bcrt1qn8q4suwpktwmakfum2gqqhxqvjxw5f3095r2vz": [],
|
||||
"bcrt1qpj5g06p78g8avjrev4m9an93v7qtdstxrvmwry": [],
|
||||
"bcrt1qpx8lywstlp30currg0ajpj0ttcy9qle5q90f27": [],
|
||||
"bcrt1qqen4jdg7ytmx9quhelzxgly2w6s8pde0huq568": [],
|
||||
"bcrt1qrjurdspugevgrsdgdtrh6kn24nv64mfsaxfm2s": [],
|
||||
"bcrt1qrpqzd27s5jh7j59s9zma759q4rtpquurp3r6ms": [],
|
||||
"bcrt1qs6e7y7hzq7rpr4tc3cdk6p92elhul3wz8nkrv5": [],
|
||||
"bcrt1qth2mh23lv060q26p4ns3pmxjuszrntyqafhl8n": [],
|
||||
"bcrt1qtqsjpx23rtcvfdspjz0ss02r5dcyh975u40w99": [],
|
||||
"bcrt1quu69e4q08etxevlkkmd5v96q2y6edn6lvf0aup": [],
|
||||
"bcrt1qvwzgw0wgxdzrgkksn29j8uehugy7fxw5ykdsrr": [],
|
||||
"bcrt1qxe98rgw9v05qrjs6hfrr4m9wmgv5jdvztgys3z": [],
|
||||
"bcrt1qz56zhzduj9ucle87t6khnvmdgvcdsax7m8nly5": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1qk6uzn0spdawzccckuew9peaegrzh0w3fptzjr0",
|
||||
"bcrt1qz56zhzduj9ucle87t6khnvmdgvcdsax7m8nly5",
|
||||
"bcrt1qrjurdspugevgrsdgdtrh6kn24nv64mfsaxfm2s",
|
||||
"bcrt1qtqsjpx23rtcvfdspjz0ss02r5dcyh975u40w99",
|
||||
"bcrt1qth2mh23lv060q26p4ns3pmxjuszrntyqafhl8n",
|
||||
"bcrt1qrpqzd27s5jh7j59s9zma759q4rtpquurp3r6ms",
|
||||
"bcrt1qvwzgw0wgxdzrgkksn29j8uehugy7fxw5ykdsrr",
|
||||
"bcrt1q5qp2a6zkv3n2gq609mww0ksu7g3z6m7lr48wmq",
|
||||
"bcrt1q0jt7yl5vwp5e00hlfwzssaatvyzh83d8gz80yr",
|
||||
"bcrt1q57rvd4hmzw2t7hg9w3phc6hv3m4y0wuuxkv5ul"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1ql4v46wwluvc8eup6f5fmrgqhlq20kpsq2dyha2",
|
||||
"bcrt1qs6e7y7hzq7rpr4tc3cdk6p92elhul3wz8nkrv5",
|
||||
"bcrt1q7fwz30g78amf5j06nzznsm4cnwaw00adr5l2re",
|
||||
"bcrt1qpj5g06p78g8avjrev4m9an93v7qtdstxrvmwry",
|
||||
"bcrt1q243sh2sjppq9sczt6wmgw2kffzhyw96f387996",
|
||||
"bcrt1q3fxng5692thfjalg2ka3jwtkl5fy623nx42p5p",
|
||||
"bcrt1qqen4jdg7ytmx9quhelzxgly2w6s8pde0huq568",
|
||||
"bcrt1qcjmvvwhh6y4qe7reeztfaq27ju30s8t8gdqql6",
|
||||
"bcrt1q3qqf94lu6k225u5fm22cwv2pfe7zrckvp0fxp5",
|
||||
"bcrt1qn8q4suwpktwmakfum2gqqhxqvjxw5f3095r2vz",
|
||||
"bcrt1q9729qhnqg6w97l37lkapg840h9ynzjmnh39j7t",
|
||||
"bcrt1q6pt9rtvd4l3jg5hqj5959y74hx464zz3dzct82",
|
||||
"bcrt1q70qemcx3xw9raeylkcyxlc02ae3f5gg730vc06",
|
||||
"bcrt1q9gr6nar56jl78w748hp8mlr04se3ht3a78k5t5",
|
||||
"bcrt1qceqt039gm8rt5n0jwzf0htpwmnu2ycaxfnpt02",
|
||||
"bcrt1qxe98rgw9v05qrjs6hfrr4m9wmgv5jdvztgys3z",
|
||||
"bcrt1q3wytvhxkqxwqjzrjjqdnpyqhuyr9jf3f0v2kec",
|
||||
"bcrt1qpx8lywstlp30currg0ajpj0ttcy9qle5q90f27",
|
||||
"bcrt1quu69e4q08etxevlkkmd5v96q2y6edn6lvf0aup",
|
||||
"bcrt1q0hwph5shlxy0j2xj059xs8mtnszd4hzw72uh6y"
|
||||
]
|
||||
},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1786883730,
|
||||
"first_electrum_version_used": "4.8.0"
|
||||
},
|
||||
"fiat_value": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/84h/1h/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "62f91f1a",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9KyNUQerxaL38fAA93TrQJLSpdGjBKVUq8F6QziiHea8ybzmpAPgbgHPaZ5gsksAdn9ZLVih11xTDGDWEqkZRzViY8SKZVPziAvEPPRNnGG",
|
||||
"xpub": "vpub5YxisvBknwtLM9EdF4zrmSHBNf7DanDLCMAhDP8Kqz77rQKvMhhw9UbsRnx11njgk6rcRZxnERmn2ZGC77VYyDosr9vLX5asfPEHBMbFDGu"
|
||||
},
|
||||
"labels": {},
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 2552,
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
100,
|
||||
100,
|
||||
840,
|
||||
400
|
||||
]
|
||||
}
|
||||
125
tests/wallet_4
Normal file
125
tests/wallet_4
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"active_forwardings": {},
|
||||
"addr_history": {
|
||||
"bcrt1q0phrauahlhdaandkq7cp9dr4awrzav9zh8ylau": [],
|
||||
"bcrt1q2esfq5jlrj9nh5lj7kjxg736ksh8f3lsquuchp": [],
|
||||
"bcrt1q2kylshq4vm8r8kcpgdd65mw9w3wauz5j6c66lf": [],
|
||||
"bcrt1q2uhhatt83hyhu4vp045c0q22dkeuy3yufpk7tv": [],
|
||||
"bcrt1q7hward08lvu2s38paqkrws655xxfk608zef7rs": [],
|
||||
"bcrt1q8sathu6j8cqvmm6pcg6ezj9qrc528c9pdz8dg2": [],
|
||||
"bcrt1q9ulln7tlez5se4ydsamh3258ja3wmewm2hkat3": [],
|
||||
"bcrt1qad8qsgl5kwnjc2jh065f9xgkwrxrs6e4crj7eh": [],
|
||||
"bcrt1qayyhz99qmql6vmtzy2j9y8yc5umt3ap0clrr37": [],
|
||||
"bcrt1qc7pzldcrcw23ele4ruughm9u8dp3k6j7hmyl86": [],
|
||||
"bcrt1qcqkeapfkq42uxpdk58h7glqxjsj59c4rkus6jt": [],
|
||||
"bcrt1qcvyffjmdupj86vc49k238ehtvvng62hpfcudxm": [],
|
||||
"bcrt1qd6jksjh0uwaurl287jftdjg854g3c02zlw6gxw": [],
|
||||
"bcrt1qehrqjhn74x738580kfh2s9x7622j2mjvgukzzw": [],
|
||||
"bcrt1qfhxe8lgxvk5f7hce2rls2xg22yp2vwrqzktrqq": [],
|
||||
"bcrt1qhymanatzt7f90060zw7zunwuacn2suqs656a3r": [],
|
||||
"bcrt1qk7l2dxrgfzwcdf7mrhgewxupsv5yd0vv6j9v2g": [],
|
||||
"bcrt1qkwjlhz3xv5hsf0k5d8ntcgwvd2ulrrdmv4h9zd": [],
|
||||
"bcrt1qm4pkufqzezk4l8vjkdx53lh6n9qw8l9mk9fce0": [],
|
||||
"bcrt1qnpqjud06cerd0a5wxpxzk94lks47x576wd06dk": [],
|
||||
"bcrt1qpv4wfzlqejlxatq7nmn7cns5ce60xpnmf9mfkd": [],
|
||||
"bcrt1qt5890v7gts8g5k6n4zxayj7c0rr5pqyn6g5ku7": [],
|
||||
"bcrt1qtjp7sjxjghstj5hhggl4nrgea2wjh3clqctnh4": [],
|
||||
"bcrt1quvrjnrywcsrhhgqfwgvrg7htuh7lp9yc444cuw": [],
|
||||
"bcrt1qxzhk758r7uq4cnhe4av0fe6qwef8w245rdhuhf": [],
|
||||
"bcrt1qyfxfpvajske5t7urmqdyuysq2keghf820x7g3l": [],
|
||||
"bcrt1qynjsulpfhkpq2zj0dgwufva5xjxzm2g7ccu6wr": [],
|
||||
"bcrt1qyr4nek8u89d43y32tug8pdsgm7lpmrvpcd2rpv": [],
|
||||
"bcrt1qyytq83t4wds8v7mu9d7ncmvrkzhppfjdjktz64": [],
|
||||
"bcrt1qzvqkj2uh63psn0q5r67pyzs5kzxq7fc8tsucwk": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1q8sathu6j8cqvmm6pcg6ezj9qrc528c9pdz8dg2",
|
||||
"bcrt1qyytq83t4wds8v7mu9d7ncmvrkzhppfjdjktz64",
|
||||
"bcrt1qkwjlhz3xv5hsf0k5d8ntcgwvd2ulrrdmv4h9zd",
|
||||
"bcrt1qcvyffjmdupj86vc49k238ehtvvng62hpfcudxm",
|
||||
"bcrt1qad8qsgl5kwnjc2jh065f9xgkwrxrs6e4crj7eh",
|
||||
"bcrt1qhymanatzt7f90060zw7zunwuacn2suqs656a3r",
|
||||
"bcrt1qxzhk758r7uq4cnhe4av0fe6qwef8w245rdhuhf",
|
||||
"bcrt1q9ulln7tlez5se4ydsamh3258ja3wmewm2hkat3",
|
||||
"bcrt1q2kylshq4vm8r8kcpgdd65mw9w3wauz5j6c66lf",
|
||||
"bcrt1qt5890v7gts8g5k6n4zxayj7c0rr5pqyn6g5ku7"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1qcqkeapfkq42uxpdk58h7glqxjsj59c4rkus6jt",
|
||||
"bcrt1qyr4nek8u89d43y32tug8pdsgm7lpmrvpcd2rpv",
|
||||
"bcrt1qayyhz99qmql6vmtzy2j9y8yc5umt3ap0clrr37",
|
||||
"bcrt1qfhxe8lgxvk5f7hce2rls2xg22yp2vwrqzktrqq",
|
||||
"bcrt1q7hward08lvu2s38paqkrws655xxfk608zef7rs",
|
||||
"bcrt1qk7l2dxrgfzwcdf7mrhgewxupsv5yd0vv6j9v2g",
|
||||
"bcrt1qyfxfpvajske5t7urmqdyuysq2keghf820x7g3l",
|
||||
"bcrt1qtjp7sjxjghstj5hhggl4nrgea2wjh3clqctnh4",
|
||||
"bcrt1qc7pzldcrcw23ele4ruughm9u8dp3k6j7hmyl86",
|
||||
"bcrt1qpv4wfzlqejlxatq7nmn7cns5ce60xpnmf9mfkd",
|
||||
"bcrt1qzvqkj2uh63psn0q5r67pyzs5kzxq7fc8tsucwk",
|
||||
"bcrt1qynjsulpfhkpq2zj0dgwufva5xjxzm2g7ccu6wr",
|
||||
"bcrt1q0phrauahlhdaandkq7cp9dr4awrzav9zh8ylau",
|
||||
"bcrt1qm4pkufqzezk4l8vjkdx53lh6n9qw8l9mk9fce0",
|
||||
"bcrt1qd6jksjh0uwaurl287jftdjg854g3c02zlw6gxw",
|
||||
"bcrt1qehrqjhn74x738580kfh2s9x7622j2mjvgukzzw",
|
||||
"bcrt1q2esfq5jlrj9nh5lj7kjxg736ksh8f3lsquuchp",
|
||||
"bcrt1qnpqjud06cerd0a5wxpxzk94lks47x576wd06dk",
|
||||
"bcrt1quvrjnrywcsrhhgqfwgvrg7htuh7lp9yc444cuw",
|
||||
"bcrt1q2uhhatt83hyhu4vp045c0q22dkeuy3yufpk7tv"
|
||||
]
|
||||
},
|
||||
"channels": {},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1786881419,
|
||||
"first_electrum_version_used": "4.8.0"
|
||||
},
|
||||
"dont_expire_htlcs": {},
|
||||
"dont_settle_htlcs": {},
|
||||
"fiat_value": {},
|
||||
"forwarding_failures": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"imported_channel_backups": {},
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "257f5dd3",
|
||||
"seed": "govern large reason sense game labor orbit swarm once wealth plunge sorry",
|
||||
"seed_type": "segwit",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9FWbyposPdHhxu62H8aPJqT9TwFpToJrosCueQ7EXtNe7Y9sWuYcVwwToS9hge5TM7BnJCiJxve2Vq98G9YRUXoq8AAT7tDPy7kzfhfDuG2",
|
||||
"xpub": "vpub5UVxPLLmDzr1BPAVPA7PfyPt1y6JsG2iB68WSnWr6DuczLV24Srs3kFwegso2hk1J9RvrjSQbC1otaCLrHbHP5EGqMteUi6m7DsPgGYXYrq"
|
||||
},
|
||||
"labels": {},
|
||||
"lightning_payments": {},
|
||||
"lightning_preimages": {},
|
||||
"lightning_xprv": "vprv9HGmVFxtePRhNodb3RNo1RgT3kT9GTtitf9KHg7FtYzZLBPimW23K34UqMLPKvnDqoqF9Yp5vWZyUfrpMW6SEySycPRqW6dPFxBmKawJg3g",
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"onchain_channel_backups": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"received_mpp_htlcs": {},
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 2545,
|
||||
"submarine_swaps": {},
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
542,
|
||||
189,
|
||||
840,
|
||||
400
|
||||
]
|
||||
}
|
||||
125
tests/wallet_8
Normal file
125
tests/wallet_8
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"active_forwardings": {},
|
||||
"addr_history": {
|
||||
"bcrt1q2rv7c2qf0z678f5kqr46gufkyc0zvjvq75lw0q": [],
|
||||
"bcrt1q3x0gthd4fkq4vuwa6sydf96ua5qhu0x577xw5q": [],
|
||||
"bcrt1q45j3lu8ykdlm0awcv9pp9gqx3d8h40acsn243l": [],
|
||||
"bcrt1q6swm30kz7p4rlzqwh0tahdev0lpr0svfmejd5y": [],
|
||||
"bcrt1q928ckf7923ekazwmmddqwe5pudkl3f5nnv7y2c": [],
|
||||
"bcrt1qa8zp4qkcf26ydyttngun9lrhu3npj6ea0q6x35": [],
|
||||
"bcrt1qaa2t5xted288p5ja6tlc56xh5rj7cy65rzs7n6": [],
|
||||
"bcrt1qamz6c8tm43t83tw2475y5kpjc7rf653ey42qcj": [],
|
||||
"bcrt1qd7s7n2260pc6zed5muk2gr4npjzcvy5xfkt6dr": [],
|
||||
"bcrt1qddr2mg23p2n4w9p947a5yxz2t47p3n3eexfu6s": [],
|
||||
"bcrt1qdmjse0qwn5n0vmh6xr4dupn5c2an83ez5645t5": [],
|
||||
"bcrt1qfgyxzkc3pk9stahk4tjxfcp0ajh33g3692yenk": [],
|
||||
"bcrt1qgcnsedcg899mp3889j2327cjzzzdq0f50dl5lu": [],
|
||||
"bcrt1qhpjnxszljgv4amgt7xgr99hwkq5u6gwzm9u00t": [],
|
||||
"bcrt1qjsgzf2dhrupywtxf6wwptfpzyst5uad4ualhkq": [],
|
||||
"bcrt1qjuvhars326f27lulzu6d77qerpgvlnnzxkgxmv": [],
|
||||
"bcrt1qk22nraj2tf0696gxc2pskgwvat689vmnr755wt": [],
|
||||
"bcrt1qkpkg9wevxwlepw80u4ugc699ewjwz4glhzjg94": [],
|
||||
"bcrt1qlnsc0umje2fxg83rcv5why3d4ydvt9cgq3dpfe": [],
|
||||
"bcrt1qmjr88850ffa6tmr5q80c4uv22yne92zut84nw2": [],
|
||||
"bcrt1qpy3nqpyjftvwd9htmsgaxrlk033ky08ala88gd": [],
|
||||
"bcrt1qq3mxpmsayg3wyjzl876hj7epusw944rwwkrmmj": [],
|
||||
"bcrt1qqm4hkq25epzyshclvfv0lmczqa6kfwsvun9qrs": [],
|
||||
"bcrt1qrfvchvw5suqavc82kwfzx7wkd5h7xl9pzlk3ly": [],
|
||||
"bcrt1qtlp7e4twkad9etqhpjtzc87aqqdks7f9jl3upg": [],
|
||||
"bcrt1qug7ypxjhaxedtl6x8gkp745fvmgn9tfepy7shy": [],
|
||||
"bcrt1qunw7t69x8hncy7f099qh6rgwedtej23hydl076": [],
|
||||
"bcrt1qx55pyw3tw3y7sqxk5j0tny6x294mkkwf69sjdw": [],
|
||||
"bcrt1qxapdcc6kdehpjzxqudm02kfe9lh4pv8ym8ecrw": [],
|
||||
"bcrt1qy8m05c7k6wstwzg4hyn95jx3csf3032r3a53tx": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1q6swm30kz7p4rlzqwh0tahdev0lpr0svfmejd5y",
|
||||
"bcrt1qa8zp4qkcf26ydyttngun9lrhu3npj6ea0q6x35",
|
||||
"bcrt1qk22nraj2tf0696gxc2pskgwvat689vmnr755wt",
|
||||
"bcrt1qunw7t69x8hncy7f099qh6rgwedtej23hydl076",
|
||||
"bcrt1qd7s7n2260pc6zed5muk2gr4npjzcvy5xfkt6dr",
|
||||
"bcrt1qddr2mg23p2n4w9p947a5yxz2t47p3n3eexfu6s",
|
||||
"bcrt1q2rv7c2qf0z678f5kqr46gufkyc0zvjvq75lw0q",
|
||||
"bcrt1qgcnsedcg899mp3889j2327cjzzzdq0f50dl5lu",
|
||||
"bcrt1qjuvhars326f27lulzu6d77qerpgvlnnzxkgxmv",
|
||||
"bcrt1qy8m05c7k6wstwzg4hyn95jx3csf3032r3a53tx"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1qlnsc0umje2fxg83rcv5why3d4ydvt9cgq3dpfe",
|
||||
"bcrt1qjsgzf2dhrupywtxf6wwptfpzyst5uad4ualhkq",
|
||||
"bcrt1qx55pyw3tw3y7sqxk5j0tny6x294mkkwf69sjdw",
|
||||
"bcrt1qfgyxzkc3pk9stahk4tjxfcp0ajh33g3692yenk",
|
||||
"bcrt1qkpkg9wevxwlepw80u4ugc699ewjwz4glhzjg94",
|
||||
"bcrt1q3x0gthd4fkq4vuwa6sydf96ua5qhu0x577xw5q",
|
||||
"bcrt1q45j3lu8ykdlm0awcv9pp9gqx3d8h40acsn243l",
|
||||
"bcrt1qamz6c8tm43t83tw2475y5kpjc7rf653ey42qcj",
|
||||
"bcrt1qmjr88850ffa6tmr5q80c4uv22yne92zut84nw2",
|
||||
"bcrt1qxapdcc6kdehpjzxqudm02kfe9lh4pv8ym8ecrw",
|
||||
"bcrt1qtlp7e4twkad9etqhpjtzc87aqqdks7f9jl3upg",
|
||||
"bcrt1qqm4hkq25epzyshclvfv0lmczqa6kfwsvun9qrs",
|
||||
"bcrt1qaa2t5xted288p5ja6tlc56xh5rj7cy65rzs7n6",
|
||||
"bcrt1qrfvchvw5suqavc82kwfzx7wkd5h7xl9pzlk3ly",
|
||||
"bcrt1qhpjnxszljgv4amgt7xgr99hwkq5u6gwzm9u00t",
|
||||
"bcrt1qq3mxpmsayg3wyjzl876hj7epusw944rwwkrmmj",
|
||||
"bcrt1qdmjse0qwn5n0vmh6xr4dupn5c2an83ez5645t5",
|
||||
"bcrt1qug7ypxjhaxedtl6x8gkp745fvmgn9tfepy7shy",
|
||||
"bcrt1qpy3nqpyjftvwd9htmsgaxrlk033ky08ala88gd",
|
||||
"bcrt1q928ckf7923ekazwmmddqwe5pudkl3f5nnv7y2c"
|
||||
]
|
||||
},
|
||||
"channels": {},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1786882566,
|
||||
"first_electrum_version_used": "4.8.0"
|
||||
},
|
||||
"dont_expire_htlcs": {},
|
||||
"dont_settle_htlcs": {},
|
||||
"fiat_value": {},
|
||||
"forwarding_failures": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"imported_channel_backups": {},
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "2b6497af",
|
||||
"seed": "tenant sponsor drip swamp lake render coil term woman text crucial night",
|
||||
"seed_type": "segwit",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9FZ7kVJY6sZMusFainCS6LXQN38c7LypgTPWWrpUusPbzQ8yac3ew2TxWqtnig2BZaCthRQRq1EVwukggwynyCLJPCLosomTzfT79LcLw9G",
|
||||
"xpub": "vpub5UYU9zqRwF7f8ML3pojSTUU8v4y6Wohg3gK7KFE6UCvasCU889MuUpnSN8PTiu3upqtwJsEc1ewZ7J3nWa8M9rmd3N1HqdPzRRz2QmGG7D7"
|
||||
},
|
||||
"labels": {},
|
||||
"lightning_payments": {},
|
||||
"lightning_preimages": {},
|
||||
"lightning_xprv": "vprv9JtBwGkREg1THJJApfWS91ztRCgbyHETZ7Qa93Vn8WZsTx5xjZmhmHPhGgEpfWjQs1WmDXsRXLVNo1B2LizW5o6W4sgjWauV5ZmmjCrvptA",
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"onchain_channel_backups": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"received_mpp_htlcs": {},
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 2548,
|
||||
"submarine_swaps": {},
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
100,
|
||||
100,
|
||||
840,
|
||||
400
|
||||
]
|
||||
}
|
||||
111
tests/wallet_9
Normal file
111
tests/wallet_9
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"addr_history": {
|
||||
"bcrt1q0x4y26e8xzwtjc209a7nhat52x4tv0jumevm4r": [],
|
||||
"bcrt1q23g4fc35xue05lunzq4n02h55wdw9ym89djtcg": [],
|
||||
"bcrt1q4fc4wlhckn0hvawwr66jf87vj40cg3ysgpw9z2": [],
|
||||
"bcrt1q4rg6j2zs7kgfwwfkarzkdh995ugp52j0g08upc": [],
|
||||
"bcrt1q4u0z2ydtjuucy8vz6ln27ksjmgv2aem3ta2xsh": [],
|
||||
"bcrt1q5em594x47uvn8c62pr5dld60s0jg6at9kuuwnl": [],
|
||||
"bcrt1q9n8fhhh5y7k4x5rwstu84zymd85sd05ksw2aww": [],
|
||||
"bcrt1qad7y4zj060z4xqk6nyd47majuyfsq8f0dqc34s": [],
|
||||
"bcrt1qcvfgvme7q36w52qu94vqk29dn4xfxdkvcwuhg4": [],
|
||||
"bcrt1qdk0um5qeuh39v80zrdwssngnudfnfs4yqztkzl": [],
|
||||
"bcrt1qduzwfg0nrmsnax60r29ema0cfhn08ehz3adhxz": [],
|
||||
"bcrt1qf8763en08t5man2xnv8ndkjstkljtatgnnvdkm": [],
|
||||
"bcrt1qfuwp7f8z4uqrfh5jsff5p9cefnfded8w9p37g0": [],
|
||||
"bcrt1qglhv5uskfhnrnr09r7gmgt68hcch67xzax7lea": [],
|
||||
"bcrt1qgmtzgutnvkjtyu2eywpy9t2ma75w8gxt4gf3zy": [],
|
||||
"bcrt1qgzv7cra6rp5ukeqy8hragdlrp4dmecedeuhvez": [],
|
||||
"bcrt1qh9w20rnkhputhqp0wat6rktqqhlf3eqwh9cd07": [],
|
||||
"bcrt1qj5tqawfkp79wu7p9rq9x9xzpngqxxfxhw6md0s": [],
|
||||
"bcrt1qkwqk2mcvnka24jpyt0lhjhr0w6yq64mxsepgs2": [],
|
||||
"bcrt1qky6mzgkfglascuk0azcaar65x6hyw4ckn3nynd": [],
|
||||
"bcrt1qr0lwmu79urkmmexlh3hm8gy65eseeuye9q8hhl": [],
|
||||
"bcrt1qr8agcgek0tn0gza42d0ym5lhgwlwfhtypdee73": [],
|
||||
"bcrt1qrp9kdgxy8p44sgfjwj46kcg22jq2fhddmwlqwj": [],
|
||||
"bcrt1qscvf4xcg6e209j3fe5ptmmexwlm7sgjmguls5x": [],
|
||||
"bcrt1qt8rftzkhyr30xkdhxzwtfz2n94gz95cy5njv2g": [],
|
||||
"bcrt1qu6hehtcx4yur6gqqgp5xx2zehujyzj0qhdmj7m": [],
|
||||
"bcrt1qvxte82z2kgajjupzcqg94jj4sp03xqst9phf8m": [],
|
||||
"bcrt1qx87xuvhm8kcz2qpjpc4zg3j0cztzsr0sns20pp": [],
|
||||
"bcrt1qxatsqu00j9gx88kaafd5je0lu9atf48w5ftcgn": [],
|
||||
"bcrt1qxlkwctc5vpj0vqgma4c28r6y9mr8thd84htp98": []
|
||||
},
|
||||
"addresses": {
|
||||
"change": [
|
||||
"bcrt1q0x4y26e8xzwtjc209a7nhat52x4tv0jumevm4r",
|
||||
"bcrt1qvxte82z2kgajjupzcqg94jj4sp03xqst9phf8m",
|
||||
"bcrt1qj5tqawfkp79wu7p9rq9x9xzpngqxxfxhw6md0s",
|
||||
"bcrt1q4fc4wlhckn0hvawwr66jf87vj40cg3ysgpw9z2",
|
||||
"bcrt1qscvf4xcg6e209j3fe5ptmmexwlm7sgjmguls5x",
|
||||
"bcrt1qdk0um5qeuh39v80zrdwssngnudfnfs4yqztkzl",
|
||||
"bcrt1qxatsqu00j9gx88kaafd5je0lu9atf48w5ftcgn",
|
||||
"bcrt1qfuwp7f8z4uqrfh5jsff5p9cefnfded8w9p37g0",
|
||||
"bcrt1qduzwfg0nrmsnax60r29ema0cfhn08ehz3adhxz",
|
||||
"bcrt1qr0lwmu79urkmmexlh3hm8gy65eseeuye9q8hhl"
|
||||
],
|
||||
"receiving": [
|
||||
"bcrt1qr8agcgek0tn0gza42d0ym5lhgwlwfhtypdee73",
|
||||
"bcrt1qgzv7cra6rp5ukeqy8hragdlrp4dmecedeuhvez",
|
||||
"bcrt1qky6mzgkfglascuk0azcaar65x6hyw4ckn3nynd",
|
||||
"bcrt1qu6hehtcx4yur6gqqgp5xx2zehujyzj0qhdmj7m",
|
||||
"bcrt1qrp9kdgxy8p44sgfjwj46kcg22jq2fhddmwlqwj",
|
||||
"bcrt1q23g4fc35xue05lunzq4n02h55wdw9ym89djtcg",
|
||||
"bcrt1qxlkwctc5vpj0vqgma4c28r6y9mr8thd84htp98",
|
||||
"bcrt1q4u0z2ydtjuucy8vz6ln27ksjmgv2aem3ta2xsh",
|
||||
"bcrt1q4rg6j2zs7kgfwwfkarzkdh995ugp52j0g08upc",
|
||||
"bcrt1q5em594x47uvn8c62pr5dld60s0jg6at9kuuwnl",
|
||||
"bcrt1qgmtzgutnvkjtyu2eywpy9t2ma75w8gxt4gf3zy",
|
||||
"bcrt1qf8763en08t5man2xnv8ndkjstkljtatgnnvdkm",
|
||||
"bcrt1qglhv5uskfhnrnr09r7gmgt68hcch67xzax7lea",
|
||||
"bcrt1qcvfgvme7q36w52qu94vqk29dn4xfxdkvcwuhg4",
|
||||
"bcrt1qad7y4zj060z4xqk6nyd47majuyfsq8f0dqc34s",
|
||||
"bcrt1qkwqk2mcvnka24jpyt0lhjhr0w6yq64mxsepgs2",
|
||||
"bcrt1qt8rftzkhyr30xkdhxzwtfz2n94gz95cy5njv2g",
|
||||
"bcrt1qh9w20rnkhputhqp0wat6rktqqhlf3eqwh9cd07",
|
||||
"bcrt1q9n8fhhh5y7k4x5rwstu84zymd85sd05ksw2aww",
|
||||
"bcrt1qx87xuvhm8kcz2qpjpc4zg3j0cztzsr0sns20pp"
|
||||
]
|
||||
},
|
||||
"db_metadata": {
|
||||
"creation_timestamp": 1786883660,
|
||||
"first_electrum_version_used": "4.8.0"
|
||||
},
|
||||
"fiat_value": {},
|
||||
"frozen_coins": {},
|
||||
"genesis_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206",
|
||||
"invoices": {},
|
||||
"keystore": {
|
||||
"derivation": "m/84h/0h/0h",
|
||||
"pw_hash_version": 1,
|
||||
"root_fingerprint": "62f91f1a",
|
||||
"type": "bip32",
|
||||
"xprv": "vprv9Lk9ZvPm2qJwCUH2NPtjrseppkqh1SJzazUMWoqBiV6nCswHgHThHVbU6TNE9xY7rN2F5e9krR7PC21fcMKfy1x1158eNJ3iGyCQXinRFwW",
|
||||
"xpub": "vpub5ZjVyRvesCsEQxMVURRkE1bZNngBQu2qxDPxKCEoGpdm5gGSDpmwqHuwwi3BvxVSTSkBdRA7zNeFQaAi9DG3y2TLefEteRyjF8tLqF9TJDW"
|
||||
},
|
||||
"labels": {},
|
||||
"notes_text": "",
|
||||
"num_parents": {},
|
||||
"payment_requests": {},
|
||||
"plugin_data": {},
|
||||
"prevouts_by_scripthash": {},
|
||||
"qt-console-history": [],
|
||||
"seed_version": 71,
|
||||
"spent_outpoints": {},
|
||||
"stored_height": 2552,
|
||||
"transactions": {},
|
||||
"tx_batches": {},
|
||||
"tx_fees": {},
|
||||
"txi": {},
|
||||
"txo": {},
|
||||
"use_encryption": false,
|
||||
"verified_tx3": {},
|
||||
"wallet_type": "standard",
|
||||
"will": {},
|
||||
"winpos-qt": [
|
||||
100,
|
||||
100,
|
||||
840,
|
||||
400
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user