Skip to content

Commit 4a7677a

Browse files
fix(BIP85): use Seed object instead of seed_num for storing parent relation
1 parent 4dbd137 commit 4a7677a

File tree

6 files changed

+18
-18
lines changed

6 files changed

+18
-18
lines changed

src/seedsigner/controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def get_seed(self, seed_num: int) -> Seed:
225225

226226
def discard_seed(self, seed_num: int):
227227
if seed_num < len(self.storage.seeds):
228-
self.storage.discard_seed(seed_num)
228+
self.storage.discard_seed(self.storage.seeds[seed_num])
229229
else:
230230
raise Exception(f"There is no seed_num {seed_num}; only {len(self.storage.seeds)} in memory.")
231231

src/seedsigner/models/seed.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ class BIP85GrandchildNotAllowedException(Exception):
269269

270270

271271
class BIP85ChildSeed(Seed):
272-
def __init__(self, parent_seed_num: int, child_index: int, num_words: int, **kwargs):
273-
self.parent_seed_num = parent_seed_num
272+
def __init__(self, parent_seed: Seed, child_index: int, num_words: int, **kwargs):
273+
self.parent_seed = parent_seed
274274
self.child_index = child_index
275275
self.num_words = num_words
276276
super().__init__(**kwargs)

src/seedsigner/models/seed_storage.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def finalize_pending_seed(self) -> int:
2828
if isinstance(self.pending_seed, BIP85ChildSeed):
2929
# Insert child seeds adjacent to parent, sorted by child index, then by number of words
3030
# Required to list seeds in a presentable order
31-
existing_siblings = self.get_bip85_child_seeds(self.pending_seed.parent_seed_num)
32-
index = self.pending_seed.parent_seed_num + 1
31+
existing_siblings = self.get_bip85_child_seeds(self.pending_seed.parent_seed)
32+
index = self.seeds.index(self.pending_seed.parent_seed) + 1
3333
for sibling in existing_siblings:
3434
if (sibling.child_index, sibling.num_words) < (self.pending_seed.child_index, self.pending_seed.num_words):
3535
index += 1
@@ -43,10 +43,10 @@ def finalize_pending_seed(self) -> int:
4343
return index
4444

4545

46-
def discard_seed(self, seed_num: int):
47-
bip85_child_seeds = self.get_bip85_child_seeds(seed_num)
46+
def discard_seed(self, seed: Seed):
47+
bip85_child_seeds = self.get_bip85_child_seeds(seed)
4848

49-
del self.seeds[seed_num]
49+
self.seeds.remove(seed)
5050

5151
for child_seed in bip85_child_seeds:
5252
self.seeds.remove(child_seed)
@@ -126,6 +126,6 @@ def discard_pending_mnemonic(self):
126126
self._pending_is_electrum = False
127127

128128

129-
def get_bip85_child_seeds(self, seed_num: int) -> list[BIP85ChildSeed]:
129+
def get_bip85_child_seeds(self, parent_seed: Seed) -> list[BIP85ChildSeed]:
130130
"""Returns the list of BIP-85 child seeds derived from the specified seed."""
131-
return [seed for seed in self.seeds if isinstance(seed, BIP85ChildSeed) and seed.parent_seed_num == seed_num]
131+
return [seed for seed in self.seeds if isinstance(seed, BIP85ChildSeed) and seed.parent_seed == parent_seed]

src/seedsigner/views/seed_views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,9 +1195,10 @@ def run(self):
11951195
)
11961196

11971197
child_index = int(ret)
1198-
child_mnemonic = self.controller.get_seed(self.seed_num).get_bip85_child_mnemonic(child_index, self.num_words, self.settings.get_value(SettingsConstants.SETTING__NETWORK)).split()
1198+
parent_seed = self.controller.get_seed(self.seed_num)
1199+
child_mnemonic = parent_seed.get_bip85_child_mnemonic(child_index, self.num_words, self.settings.get_value(SettingsConstants.SETTING__NETWORK)).split()
11991200
child_seed = BIP85ChildSeed(
1200-
parent_seed_num=self.seed_num,
1201+
parent_seed=parent_seed,
12011202
child_index=child_index,
12021203
num_words=self.num_words,
12031204
mnemonic=child_mnemonic,
@@ -1270,7 +1271,7 @@ def run(self):
12701271

12711272
if selected_menu_num == RET_CODE__BACK_BUTTON or button_data[selected_menu_num] == self.DONE:
12721273
self.controller.storage.clear_pending_seed()
1273-
return Destination(SeedOptionsView, view_args=dict(seed_num=self.seed.parent_seed_num), clear_history=True)
1274+
return Destination(SeedOptionsView, view_args=dict(seed_num=self.controller.storage.seeds.index(self.seed.parent_seed)), clear_history=True)
12741275

12751276
if button_data[selected_menu_num] == self.VIEW_MNEMONIC:
12761277
return Destination(SeedWordsWarningView, view_args=dict(seed_num=None))

tests/screenshot_generator/generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def add_op_return_to_psbt(psbt: PSBT, raw_payload_data: bytes):
105105
seed_12 = Seed(mnemonic=mnemonic_12, passphrase="cap*BRACKET3stove", wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH)
106106
seed_24 = Seed(mnemonic=mnemonic_24, passphrase="some-PASS*phrase9", wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH)
107107
seed_24_w_passphrase = Seed(mnemonic=mnemonic_24, passphrase="some-PASS*phrase9", wordlist_language_code=SettingsConstants.WORDLIST_LANGUAGE__ENGLISH)
108-
bip85_child_seed = BIP85ChildSeed(parent_seed_num=2, child_index=0, num_words=12, mnemonic=seed_24.get_bip85_child_mnemonic(0, 12).split())
108+
bip85_child_seed = BIP85ChildSeed(parent_seed=seed_24, child_index=0, num_words=12, mnemonic=seed_24.get_bip85_child_mnemonic(0, 12).split())
109109
MULTISIG_WALLET_DESCRIPTOR = """wsh(sortedmulti(1,[22bde1a9/48h/1h/0h/2h]tpubDFfsBrmpj226ZYiRszYi2qK6iGvh2vkkghfGB2YiRUVY4rqqedHCFEgw12FwDkm7rUoVtq9wLTKc6BN2sxswvQeQgp7m8st4FP8WtP8go76/{0,1}/*,[73c5da0a/48h/1h/0h/2h]tpubDFH9dgzveyD8zTbPUFuLrGmCydNvxehyNdUXKJAQN8x4aZ4j6UZqGfnqFrD4NqyaTVGKbvEW54tsvPTK2UoSbCC1PJY8iCNiwTL3RWZEheQ/{0,1}/*))#3jhtf6yx"""
110110

111111

tests/test_seed_storage.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ def test_finalize_pending_seed(self, children_specs):
4343

4444
for parent_idx, child_idx, num_words in children_specs:
4545
parent_seed = parent_seeds[parent_idx]
46-
parent_position = storage.seeds.index(parent_seed) # Position of 2nd parent might change as we add children
4746

4847
child_seed = BIP85ChildSeed(
49-
parent_seed_num=parent_position,
48+
parent_seed=parent_seed,
5049
child_index=child_idx,
5150
num_words=num_words,
5251
mnemonic=parent_seed.get_bip85_child_mnemonic(child_idx, num_words).split(),
@@ -90,12 +89,12 @@ def test_discard_seed(self, child_indices):
9089
# Add child seeds to storage
9190
for child_index in child_indices:
9291
child_seed = BIP85ChildSeed(
93-
parent_seed_num=0,
92+
parent_seed=parent_seed,
9493
child_index=child_index,
9594
num_words=12,
9695
mnemonic=parent_seed.get_bip85_child_mnemonic(child_index, 12).split(),
9796
)
9897
storage.seeds.append(child_seed)
9998

100-
storage.discard_seed(0)
99+
storage.discard_seed(parent_seed)
101100
assert len(storage.seeds) == 1 # Only the second seed should remain

0 commit comments

Comments
 (0)