cleanup, and make send_tx work
This commit is contained in:
parent
4d60380325
commit
985d54197a
@ -1,11 +1,11 @@
|
|||||||
import sys
|
import sys
|
||||||
import datetime
|
import datetime
|
||||||
|
import traceback
|
||||||
from android import activity
|
|
||||||
|
|
||||||
from electrum import WalletStorage, Wallet
|
from electrum import WalletStorage, Wallet
|
||||||
from electrum.i18n import _, set_language
|
from electrum.i18n import _, set_language
|
||||||
from electrum.contacts import Contacts
|
from electrum.contacts import Contacts
|
||||||
|
from electrum import bitcoin
|
||||||
|
|
||||||
from kivy.config import Config
|
from kivy.config import Config
|
||||||
Config.set('modules', 'screen', 'droid2')
|
Config.set('modules', 'screen', 'droid2')
|
||||||
@ -29,11 +29,10 @@ Factory.register('InstallWizard',
|
|||||||
module='electrum_gui.kivy.uix.dialogs.installwizard')
|
module='electrum_gui.kivy.uix.dialogs.installwizard')
|
||||||
Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs')
|
Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs')
|
||||||
Factory.register('ELTextInput', module='electrum_gui.kivy.uix.screens')
|
Factory.register('ELTextInput', module='electrum_gui.kivy.uix.screens')
|
||||||
Factory.register('QrScannerDialog', module='electrum_gui.kivy.uix.dialogs.qr_scanner')
|
|
||||||
|
|
||||||
|
|
||||||
# delayed imports: for startup speed on android
|
# delayed imports: for startup speed on android
|
||||||
notification = app = Decimal = ref = format_satoshis = bitcoin = Builder = None
|
notification = app = Decimal = ref = format_satoshis = Builder = None
|
||||||
inch = None
|
inch = None
|
||||||
util = False
|
util = False
|
||||||
re = None
|
re = None
|
||||||
@ -124,6 +123,17 @@ class ElectrumWindow(App):
|
|||||||
'''Number of zeros used while representing the value in base_unit.
|
'''Number of zeros used while representing the value in base_unit.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
def get_amount(self, amount_str):
|
||||||
|
from electrum.bitcoin import COIN
|
||||||
|
from decimal import Decimal
|
||||||
|
try:
|
||||||
|
x = Decimal(str(amount_str))
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
p = pow(10, self.decimal_point)
|
||||||
|
return int(p * x)
|
||||||
|
|
||||||
|
|
||||||
navigation_higherarchy = ListProperty([])
|
navigation_higherarchy = ListProperty([])
|
||||||
'''This is a list of the current navigation higherarchy of the app used to
|
'''This is a list of the current navigation higherarchy of the app used to
|
||||||
navigate using back button.
|
navigate using back button.
|
||||||
@ -188,8 +198,8 @@ class ElectrumWindow(App):
|
|||||||
self.electrum_config = config = kwargs.get('config', None)
|
self.electrum_config = config = kwargs.get('config', None)
|
||||||
self.gui_object = kwargs.get('gui_object', None)
|
self.gui_object = kwargs.get('gui_object', None)
|
||||||
|
|
||||||
self.config = self.gui_object.config
|
#self.config = self.gui_object.config
|
||||||
self.contacts = Contacts(self.config)
|
self.contacts = Contacts(self.electrum_config)
|
||||||
|
|
||||||
self.bind(url=self.set_url)
|
self.bind(url=self.set_url)
|
||||||
# were we sent a url?
|
# were we sent a url?
|
||||||
@ -208,16 +218,9 @@ class ElectrumWindow(App):
|
|||||||
def set_url(self, instance, url):
|
def set_url(self, instance, url):
|
||||||
self.gui_object.set_url(url)
|
self.gui_object.set_url(url)
|
||||||
|
|
||||||
def old_scan_qr(self, on_complete):
|
|
||||||
dlg = Cache.get('electrum_widgets', 'QrScannerDialog')
|
|
||||||
if not dlg:
|
|
||||||
dlg = Factory.QrScannerDialog()
|
|
||||||
Cache.append('electrum_widgets', 'QrScannerDialog', dlg)
|
|
||||||
dlg.bind(on_complete=on_complete)
|
|
||||||
dlg.open()
|
|
||||||
|
|
||||||
def scan_qr(self, on_complete):
|
def scan_qr(self, on_complete):
|
||||||
from jnius import autoclass
|
from jnius import autoclass
|
||||||
|
from android import activity
|
||||||
PythonActivity = autoclass('org.renpy.android.PythonActivity')
|
PythonActivity = autoclass('org.renpy.android.PythonActivity')
|
||||||
Intent = autoclass('android.content.Intent')
|
Intent = autoclass('android.content.Intent')
|
||||||
intent = Intent("com.google.zxing.client.android.SCAN")
|
intent = Intent("com.google.zxing.client.android.SCAN")
|
||||||
@ -498,9 +501,7 @@ class ElectrumWindow(App):
|
|||||||
# since the callback has been called before the GUI was initialized
|
# since the callback has been called before the GUI was initialized
|
||||||
self.update_history_tab()
|
self.update_history_tab()
|
||||||
self.notify_transactions()
|
self.notify_transactions()
|
||||||
self.update_account_selector()
|
|
||||||
|
|
||||||
#run_hook('load_wallet', wallet)
|
|
||||||
|
|
||||||
def update_status(self, *dt):
|
def update_status(self, *dt):
|
||||||
if not self.wallet:
|
if not self.wallet:
|
||||||
@ -564,18 +565,6 @@ class ElectrumWindow(App):
|
|||||||
self.update_history_tab()
|
self.update_history_tab()
|
||||||
self.update_contacts_tab()
|
self.update_contacts_tab()
|
||||||
|
|
||||||
def update_account_selector(self):
|
|
||||||
# account selector
|
|
||||||
#TODO
|
|
||||||
return
|
|
||||||
accounts = self.wallet.get_account_names()
|
|
||||||
self.account_selector.clear()
|
|
||||||
if len(accounts) > 1:
|
|
||||||
self.account_selector.addItems([_("All accounts")] + accounts.values())
|
|
||||||
self.account_selector.setCurrentIndex(0)
|
|
||||||
self.account_selector.show()
|
|
||||||
else:
|
|
||||||
self.account_selector.hide()
|
|
||||||
|
|
||||||
def parse_histories(self, items):
|
def parse_histories(self, items):
|
||||||
for item in items:
|
for item in items:
|
||||||
@ -742,45 +731,12 @@ class ElectrumWindow(App):
|
|||||||
|
|
||||||
#self.run_hook('update_contacts_tab')
|
#self.run_hook('update_contacts_tab')
|
||||||
|
|
||||||
def set_pay_from(self, l):
|
|
||||||
#TODO
|
|
||||||
return
|
|
||||||
self.pay_from = l
|
|
||||||
self.from_list.clear()
|
|
||||||
self.from_label.setHidden(len(self.pay_from) == 0)
|
|
||||||
self.from_list.setHidden(len(self.pay_from) == 0)
|
|
||||||
for addr in self.pay_from:
|
|
||||||
c, u = self.wallet.get_addr_balance(addr)
|
|
||||||
balance = self.format_amount(c + u)
|
|
||||||
self.from_list.addTopLevelItem(QTreeWidgetItem( [addr, balance] ))
|
|
||||||
|
|
||||||
|
|
||||||
def protected(func):
|
|
||||||
return lambda s, *args, **kwargs: s.do_protect(func, args, **kwargs)
|
|
||||||
|
|
||||||
def do_protect(self, func, **kwargs):
|
|
||||||
print kwargs
|
|
||||||
instance = kwargs.get('instance', None)
|
|
||||||
password = kwargs.get('password', None)
|
|
||||||
message = kwargs.get('message', '')
|
|
||||||
|
|
||||||
def run_func(instance=None, password=None):
|
|
||||||
args = (self, instance, password)
|
|
||||||
apply(func, args)
|
|
||||||
|
|
||||||
if self.wallet.use_encryption:
|
|
||||||
return self.password_required_dialog(post_ok=run_func, message=message)
|
|
||||||
|
|
||||||
return run_func()
|
|
||||||
|
|
||||||
def do_send(self):
|
def do_send(self):
|
||||||
app = App.get_running_app()
|
app = App.get_running_app()
|
||||||
screen_send = app.root.main_screen.ids.tabs.ids.screen_send
|
screen_send = app.root.main_screen.ids.tabs.ids.screen_send
|
||||||
scrn = screen_send.ids
|
scrn = screen_send.ids
|
||||||
label = unicode(scrn.message_e.text)
|
label = unicode(scrn.message_e.text)
|
||||||
|
|
||||||
r = unicode(scrn.payto_e.text).strip()
|
r = unicode(scrn.payto_e.text).strip()
|
||||||
|
|
||||||
# label or alias, with address in brackets
|
# label or alias, with address in brackets
|
||||||
global re
|
global re
|
||||||
if not re:
|
if not re:
|
||||||
@ -788,75 +744,45 @@ class ElectrumWindow(App):
|
|||||||
m = re.match('(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>', r)
|
m = re.match('(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>', r)
|
||||||
to_address = m.group(2) if m else r
|
to_address = m.group(2) if m else r
|
||||||
|
|
||||||
global bitcoin
|
|
||||||
if not bitcoin:
|
|
||||||
from electrum import bitcoin
|
|
||||||
|
|
||||||
if not bitcoin.is_address(to_address):
|
if not bitcoin.is_address(to_address):
|
||||||
app.show_error(_('Invalid Bitcoin Address') +
|
app.show_error(_('Invalid Bitcoin Address') + ':\n' + to_address)
|
||||||
':\n' + to_address)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
amount = scrn.amount_e.text
|
amount = self.get_amount(scrn.amount_e.text)
|
||||||
|
|
||||||
fee = scrn.fee_e.amt
|
fee = scrn.fee_e.amt
|
||||||
if not fee:
|
if not fee:
|
||||||
app.show_error(_('Invalid Fee'))
|
app.show_error(_('Invalid Fee'))
|
||||||
return
|
return
|
||||||
|
|
||||||
from pudb import set_trace; set_trace()
|
#from pudb import set_trace; set_trace()
|
||||||
message = 'sending {} {} to {}'.format(\
|
message = 'sending {} {} to {}'.format(app.base_unit, scrn.amount_e.text, r)
|
||||||
app.base_unit, scrn.amount_e.text, r)
|
|
||||||
|
|
||||||
confirm_fee = self.config.get('confirm_amount', 100000)
|
# assume no password and fee is None
|
||||||
if fee >= confirm_fee:
|
password = None
|
||||||
if not self.question(_("The fee for this transaction seems unusually high.\nAre you really sure you want to pay %(fee)s in fees?")%{ 'fee' : self.format_amount(fee) + ' '+ self.base_unit()}):
|
fee = None
|
||||||
return
|
self.send_tx([('address', to_address, amount)], fee, label, password)
|
||||||
|
|
||||||
self.send_tx(to_address, amount, fee, label)
|
|
||||||
|
|
||||||
@protected
|
|
||||||
def send_tx(self, outputs, fee, label, password):
|
def send_tx(self, outputs, fee, label, password):
|
||||||
|
app = App.get_running_app()
|
||||||
# first, create an unsigned tx
|
# make unsigned transaction
|
||||||
domain = self.get_payment_sources()
|
coins = self.wallet.get_spendable_coins()
|
||||||
try:
|
try:
|
||||||
tx = self.wallet.make_unsigned_transaction(outputs, fee, None, domain)
|
tx = self.wallet.make_unsigned_transaction(coins, outputs, self.electrum_config, fee)
|
||||||
tx.error = None
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc(file=sys.stdout)
|
traceback.print_exc(file=sys.stdout)
|
||||||
self.show_info(str(e))
|
app.show_error(str(e))
|
||||||
return
|
return
|
||||||
|
# sign transaction
|
||||||
|
try:
|
||||||
|
self.wallet.sign_transaction(tx, password)
|
||||||
|
except Exception as e:
|
||||||
|
traceback.print_exc(file=sys.stdout)
|
||||||
|
app.show_error(str(e))
|
||||||
|
return
|
||||||
|
# broadcast
|
||||||
|
self.wallet.sendtx(tx)
|
||||||
|
|
||||||
# call hook to see if plugin needs gui interaction
|
|
||||||
#run_hook('send_tx', tx)
|
|
||||||
|
|
||||||
# sign the tx
|
|
||||||
def sign_thread():
|
|
||||||
time.sleep(0.1)
|
|
||||||
keypairs = {}
|
|
||||||
self.wallet.add_keypairs_from_wallet(tx, keypairs, password)
|
|
||||||
self.wallet.sign_transaction(tx, keypairs, password)
|
|
||||||
return tx, fee, label
|
|
||||||
|
|
||||||
def sign_done(tx, fee, label):
|
|
||||||
if tx.error:
|
|
||||||
self.show_info(tx.error)
|
|
||||||
return
|
|
||||||
if tx.requires_fee(self.wallet.verifier) and fee < MIN_RELAY_TX_FEE:
|
|
||||||
self.show_error(_("This transaction requires a higher fee, or "
|
|
||||||
"it will not be propagated by the network."))
|
|
||||||
return
|
|
||||||
if label:
|
|
||||||
self.wallet.set_label(tx.hash(), label)
|
|
||||||
|
|
||||||
if not self.gui_object.payment_request:
|
|
||||||
if not tx.is_complete() or self.config.get('show_before_broadcast'):
|
|
||||||
self.show_transaction(tx)
|
|
||||||
return
|
|
||||||
|
|
||||||
self.broadcast_transaction(tx)
|
|
||||||
|
|
||||||
WaitingDialog(self, 'Signing..').start(sign_thread, sign_done)
|
|
||||||
|
|
||||||
def notify_transactions(self, *dt):
|
def notify_transactions(self, *dt):
|
||||||
'''
|
'''
|
||||||
@ -1063,7 +989,6 @@ class ElectrumWindow(App):
|
|||||||
|
|
||||||
self.set_frozen(content, False)
|
self.set_frozen(content, False)
|
||||||
|
|
||||||
self.set_pay_from([])
|
|
||||||
self.update_status()
|
self.update_status()
|
||||||
|
|
||||||
def set_frozen(self, entry, frozen):
|
def set_frozen(self, entry, frozen):
|
||||||
@ -1156,18 +1081,7 @@ class ElectrumWindow(App):
|
|||||||
|
|
||||||
|
|
||||||
def get_payment_sources(self):
|
def get_payment_sources(self):
|
||||||
if self.pay_from:
|
return self.wallet.get_account_addresses(self.current_account)
|
||||||
return self.pay_from
|
|
||||||
else:
|
|
||||||
return self.wallet.get_account_addresses(self.current_account)
|
|
||||||
|
|
||||||
|
|
||||||
def send_from_addresses(self, addrs):
|
|
||||||
self.set_pay_from( addrs )
|
|
||||||
tabs = self.tabs
|
|
||||||
screen_send = tabs.ids.screen_send
|
|
||||||
self.tabs.setCurrentIndex(1)
|
|
||||||
|
|
||||||
|
|
||||||
def payto(self, addr):
|
def payto(self, addr):
|
||||||
if not addr:
|
if not addr:
|
||||||
|
|||||||
@ -378,10 +378,10 @@
|
|||||||
height: blue_bottom.item_height if app.expert_mode else 0
|
height: blue_bottom.item_height if app.expert_mode else 0
|
||||||
CreateAccountButtonGreen:
|
CreateAccountButtonGreen:
|
||||||
background_color: (1, 1, 1, 1) if self.disabled else ((.258, .80, .388, 1) if self.state == 'normal' else (.203, .490, .741, 1))
|
background_color: (1, 1, 1, 1) if self.disabled else ((.258, .80, .388, 1) if self.state == 'normal' else (.203, .490, .741, 1))
|
||||||
text: _('Goto next step') if app.wallet and app.wallet.seed else _('Create unsigned transaction')
|
text: _('Send')
|
||||||
size_hint_y: None
|
size_hint_y: None
|
||||||
height: '38dp'
|
height: '38dp'
|
||||||
disabled: True if wallet_selection.opacity == 0 else False
|
disabled: False
|
||||||
on_release: app.do_send()
|
on_release: app.do_send()
|
||||||
Widget
|
Widget
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user