Browse Source

allow address creation beyond gap limit in GUI. fixes #512

283
ThomasV 11 years ago
parent
commit
b5acdab3e9
  1. 21
      gui/qt/main_window.py
  2. 14
      lib/wallet.py

21
gui/qt/main_window.py

@ -40,6 +40,7 @@ from electrum import Transaction
from electrum import mnemonic from electrum import mnemonic
from electrum import util, bitcoin, commands, Interface, Wallet from electrum import util, bitcoin, commands, Interface, Wallet
from electrum import SimpleConfig, Wallet, WalletStorage from electrum import SimpleConfig, Wallet, WalletStorage
from electrum import Imported_Wallet
from amountedit import AmountEdit, BTCAmountEdit, MyLineEdit from amountedit import AmountEdit, BTCAmountEdit, MyLineEdit
from network_dialog import NetworkDialog from network_dialog import NetworkDialog
@ -681,7 +682,7 @@ class ElectrumWindow(QMainWindow):
self.save_request_button.clicked.connect(self.save_payment_request) self.save_request_button.clicked.connect(self.save_payment_request)
grid.addWidget(self.save_request_button, 3, 1) grid.addWidget(self.save_request_button, 3, 1)
clear_button = QPushButton(_('New')) 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.addWidget(clear_button, 3, 2)
grid.setRowStretch(4, 1) grid.setRowStretch(4, 1)
@ -739,6 +740,22 @@ class ElectrumWindow(QMainWindow):
self.wallet.storage.put('receive_requests', self.receive_requests) self.wallet.storage.put('receive_requests', self.receive_requests)
self.update_receive_tab() 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): def clear_receive_tab(self):
self.receive_requests = self.wallet.storage.get('receive_requests',{}) self.receive_requests = self.wallet.storage.get('receive_requests',{})
domain = self.wallet.get_account_addresses(self.current_account, include_change=False) 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(): if not self.wallet.address_is_old(addr) and addr not in self.receive_requests.keys():
break break
else: else:
addr = "" addr = ''
self.receive_address_e.setText(addr) self.receive_address_e.setText(addr)
self.receive_message_e.setText('') self.receive_message_e.setText('')
self.receive_amount_e.setAmount(None) self.receive_amount_e.setAmount(None)

14
lib/wallet.py

@ -547,7 +547,7 @@ class Abstract_Wallet:
def get_account_addresses(self, a, include_change=True): def get_account_addresses(self, a, include_change=True):
if a is None: if a is None:
o = self.addresses(True) o = self.addresses(include_change)
elif a in self.accounts: elif a in self.accounts:
ac = self.accounts[a] ac = self.accounts[a]
o = ac.get_addresses(0) o = ac.get_addresses(0)
@ -1140,10 +1140,13 @@ class Deterministic_Wallet(Abstract_Wallet):
return nmax + 1 return nmax + 1
def create_new_address(self, account, for_change): def create_new_address(self, account, for_change):
if account is None:
account = self.default_account()
address = account.create_new_address(for_change) address = account.create_new_address(for_change)
self.history[address] = [] self.history[address] = []
self.synchronizer.add(address) self.synchronizer.add(address)
self.save_accounts() self.save_accounts()
return address
def synchronize_sequence(self, account, for_change): def synchronize_sequence(self, account, for_change):
limit = self.gap_limit_for_change if for_change else self.gap_limit 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): def __init__(self, storage):
Deterministic_Wallet.__init__(self, storage) Deterministic_Wallet.__init__(self, storage)
def default_account(self):
return self.accounts["m/0'"]
def is_watching_only(self): def is_watching_only(self):
return self.master_private_keys is {} return self.master_private_keys is {}
@ -1401,6 +1407,9 @@ class Wallet_2of2(NewWallet):
NewWallet.__init__(self, storage) NewWallet.__init__(self, storage)
self.storage.put('wallet_type', '2of2', True) self.storage.put('wallet_type', '2of2', True)
def default_account(self):
return self.accounts['m/']
def can_create_accounts(self): def can_create_accounts(self):
return False return False
@ -1462,6 +1471,9 @@ class Wallet_2of3(Wallet_2of2):
class OldWallet(Deterministic_Wallet): class OldWallet(Deterministic_Wallet):
def default_account(self):
return self.accounts[0]
def make_seed(self): def make_seed(self):
import mnemonic import mnemonic
seed = random_seed(128) seed = random_seed(128)

Loading…
Cancel
Save