Skip to content

Commit 302ee24

Browse files
committed
wallet: refactor get_change_addresses_for_new_transaction
1 parent d6c300e commit 302ee24

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

electrum/wallet.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,19 +1840,7 @@ def get_change_addresses_for_new_transaction(
18401840
else:
18411841
change_addrs = [preferred_change_addr]
18421842
elif self.use_change:
1843-
# Recalc and get unused change addresses
1844-
addrs = self.calc_unused_change_addresses()
1845-
# New change addresses are created only after a few
1846-
# confirmations.
1847-
if addrs:
1848-
# if there are any unused, select all
1849-
change_addrs = addrs
1850-
else:
1851-
# if there are none, take one randomly from the last few
1852-
if not allow_reusing_used_change_addrs:
1853-
return []
1854-
addrs = self.get_change_addresses(slice_start=-self.gap_limit_for_change)
1855-
change_addrs = [random.choice(addrs)] if addrs else []
1843+
change_addrs = self._get_change_addresses_we_can_use_now(allow_reuse=allow_reusing_used_change_addrs)
18561844
for addr in change_addrs:
18571845
assert is_address(addr), f"not valid bitcoin address: {addr}"
18581846
# note that change addresses are not necessarily ismine
@@ -1872,21 +1860,37 @@ def get_single_change_address_for_new_transaction(
18721860
return addrs[0]
18731861
return None
18741862

1875-
@check_returned_address_for_corruption
18761863
def get_new_sweep_address_for_channel(self) -> str:
1864+
addrs = self._get_change_addresses_we_can_use_now(allow_reuse=True)
1865+
if addrs:
1866+
return addrs[0]
1867+
# fallback for e.g. imported wallets
1868+
return self.get_receiving_address()
1869+
1870+
def _get_change_addresses_we_can_use_now(
1871+
self,
1872+
*,
1873+
allow_reuse: bool = True,
1874+
) -> Sequence[str]:
18771875
# Recalc and get unused change addresses
18781876
addrs = self.calc_unused_change_addresses()
1877+
# New change addresses are created only after a few
1878+
# confirmations.
18791879
if addrs:
1880-
selected_addr = addrs[0]
1880+
# if there are any unused, select all
1881+
change_addrs = addrs
18811882
else:
18821883
# if there are none, take one randomly from the last few
1884+
if not allow_reuse:
1885+
return []
18831886
addrs = self.get_change_addresses(slice_start=-self.gap_limit_for_change)
1884-
if addrs:
1885-
selected_addr = random.choice(addrs)
1886-
else: # fallback for e.g. imported wallets
1887-
selected_addr = self.get_receiving_address()
1888-
assert is_address(selected_addr), f"not valid bitcoin address: {selected_addr}"
1889-
return selected_addr
1887+
change_addrs = [random.choice(addrs)] if addrs else []
1888+
for addr in change_addrs:
1889+
assert is_address(addr), f"not valid bitcoin address: {addr}"
1890+
# note that change addresses are not necessarily ismine
1891+
# in which case this is a no-op
1892+
self.check_address_for_corruption(addr)
1893+
return change_addrs
18901894

18911895
def should_keep_reserve_utxo(
18921896
self,

0 commit comments

Comments
 (0)