From b5acdab3e98f22ae212dd9aa091f00d3132c186f Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 26 Jun 2014 18:55:22 +0200 Subject: [PATCH] allow address creation beyond gap limit in GUI. fixes #512 --- gui/qt/main_window.py | 21 +++++++++++++++++++-- lib/wallet.py | 14 +++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py index cc61f4237..4dec40e54 100644 --- a/gui/qt/main_window.py +++ b/gui/qt/main_window.py @@ -40,6 +40,7 @@ from electrum import Transaction from electrum import mnemonic from electrum import util, bitcoin, commands, Interface, Wallet from electrum import SimpleConfig, Wallet, WalletStorage +from electrum import Imported_Wallet from amountedit import AmountEdit, BTCAmountEdit, MyLineEdit from network_dialog import NetworkDialog @@ -681,7 +682,7 @@ class ElectrumWindow(QMainWindow): self.save_request_button.clicked.connect(self.save_payment_request) grid.addWidget(self.save_request_button, 3, 1) clear_button = QPushButton(_('New')) - clear_button.clicked.connect(self.clear_receive_tab) + clear_button.clicked.connect(self.new_receive_address) grid.addWidget(clear_button, 3, 2) grid.setRowStretch(4, 1) @@ -739,6 +740,22 @@ class ElectrumWindow(QMainWindow): self.wallet.storage.put('receive_requests', self.receive_requests) self.update_receive_tab() + def new_receive_address(self): + domain = self.wallet.get_account_addresses(self.current_account, include_change=False) + for addr in domain: + if not self.wallet.address_is_old(addr) and addr not in self.receive_requests.keys(): + break + else: + if isinstance(self.wallet, Imported_Wallet): + self.show_message(_('No more addresses in your wallet.')) + return + if not self.question(_("Warning: The next address will not be recovered automatically if you restore your wallet from seed; you may need to add it manually.\n\nThis occurs because you have too many unused addresses in your wallet. To avoid this situation, use the existing addresses first.\n\nCreate anyway?")): + return + addr = self.wallet.create_new_address(self.current_account, False) + self.receive_address_e.setText(addr) + self.receive_message_e.setText('') + self.receive_amount_e.setAmount(None) + def clear_receive_tab(self): self.receive_requests = self.wallet.storage.get('receive_requests',{}) domain = self.wallet.get_account_addresses(self.current_account, include_change=False) @@ -746,7 +763,7 @@ class ElectrumWindow(QMainWindow): if not self.wallet.address_is_old(addr) and addr not in self.receive_requests.keys(): break else: - addr = "" + addr = '' self.receive_address_e.setText(addr) self.receive_message_e.setText('') self.receive_amount_e.setAmount(None) diff --git a/lib/wallet.py b/lib/wallet.py index 53f0d4103..fb1e31b70 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -547,7 +547,7 @@ class Abstract_Wallet: def get_account_addresses(self, a, include_change=True): if a is None: - o = self.addresses(True) + o = self.addresses(include_change) elif a in self.accounts: ac = self.accounts[a] o = ac.get_addresses(0) @@ -1140,10 +1140,13 @@ class Deterministic_Wallet(Abstract_Wallet): return nmax + 1 def create_new_address(self, account, for_change): + if account is None: + account = self.default_account() address = account.create_new_address(for_change) self.history[address] = [] self.synchronizer.add(address) self.save_accounts() + return address def synchronize_sequence(self, account, for_change): limit = self.gap_limit_for_change if for_change else self.gap_limit @@ -1257,6 +1260,9 @@ class NewWallet(Deterministic_Wallet): def __init__(self, storage): Deterministic_Wallet.__init__(self, storage) + def default_account(self): + return self.accounts["m/0'"] + def is_watching_only(self): return self.master_private_keys is {} @@ -1401,6 +1407,9 @@ class Wallet_2of2(NewWallet): NewWallet.__init__(self, storage) self.storage.put('wallet_type', '2of2', True) + def default_account(self): + return self.accounts['m/'] + def can_create_accounts(self): return False @@ -1462,6 +1471,9 @@ class Wallet_2of3(Wallet_2of2): class OldWallet(Deterministic_Wallet): + def default_account(self): + return self.accounts[0] + def make_seed(self): import mnemonic seed = random_seed(128)