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

This commit is contained in:
ThomasV 2014-06-26 18:55:22 +02:00
parent 38f5deee86
commit b5acdab3e9
2 changed files with 32 additions and 3 deletions

View File

@ -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)

View File

@ -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)