gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject, cairo
from decimal import Decimal
-from electrum.util import print_error
-from electrum.bitcoin import is_valid
-from electrum import mnemonic, pyqrnative, WalletStorage, Wallet
+from electrum_nvc.util import print_error
+from electrum_nvc.bitcoin import is_valid
+from electrum_nvc import mnemonic, WalletStorage, Wallet
Gdk.threads_init()
-APP_NAME = "Electrum"
+APP_NAME = "Electrum-NVC"
import platform
MONOSPACE_FONT = 'Lucida Console' if platform.system() == 'Windows' else 'monospace'
-from electrum.util import format_satoshis
-from electrum.network import DEFAULT_SERVERS
-from electrum.bitcoin import MIN_RELAY_TX_FEE
+from electrum_nvc.util import format_satoshis, parse_URI
+from electrum_nvc.network import DEFAULT_SERVERS
+from electrum_nvc.bitcoin import MIN_RELAY_TX_FEE
def numbify(entry, is_int = False):
text = entry.get_text().strip()
s = s.replace('.','')
s = s[:p] + '.' + s[p:p+8]
try:
- amount = int( Decimal(s) * 100000000 )
+ amount = int( Decimal(s) * 1000000 )
except Exception:
amount = None
else:
-def show_seed_dialog(wallet, password, parent):
- if not wallet.seed:
+def show_seed_dialog(seed, parent):
+ if not seed:
show_message("No seed")
return
- try:
- mnemonic = wallet.get_mnemonic(password)
- except Exception:
- show_message("Incorrect password")
- return
+
dialog = Gtk.MessageDialog(
parent = parent,
flags = Gtk.DialogFlags.MODAL,
buttons = Gtk.ButtonsType.OK,
- message_format = "Your wallet generation seed is:\n\n" + '"' + mnemonic + '"'\
+ message_format = "Your wallet generation seed is:\n\n" + '"' + seed + '"'\
+ "\n\nPlease keep it in a safe place; if you lose it, you will not be able to restore your wallet.\n\n" )
dialog.set_title("Seed")
dialog.show()
# ask if the user wants to create a new wallet, or recover from a seed.
# if he wants to recover, and nothing is found, do not create wallet
dialog = Gtk.Dialog("electrum", parent=None,
- flags=Gtk.DialogFlags.MODAL|Gtk.DialogFlags.NO_SEPARATOR,
+ flags=Gtk.DialogFlags.MODAL,
buttons= ("create", 0, "restore",1, "cancel",2) )
label = Gtk.Label("Wallet file not found.\nDo you want to create a new wallet,\n or to restore an existing one?" )
if r==Gtk.ResponseType.CANCEL:
return False
- try:
- seed.decode('hex')
- except Exception:
- print_error("Warning: Not hex, trying decode")
- seed = mnemonic.mn_decode( seed.split(' ') )
- if not seed:
- show_message("no seed")
- return False
-
- return seed
+ if Wallet.is_seed(seed):
+ return seed
+
+ show_message("no seed")
+ return False
fee_label.set_size_request(150,10)
fee_label.show()
fee.pack_start(fee_label,False, False, 10)
- fee_entry.set_text( str( Decimal(self.wallet.fee) /100000000 ) )
+ fee_entry.set_text( str( Decimal(self.wallet.fee) /1000000 ) )
fee_entry.connect('changed', numbify, False)
fee_entry.show()
fee.pack_start(fee_entry,False,False, 10)
return
try:
- fee = int( 100000000 * Decimal(fee) )
+ fee = int( 1000000 * Decimal(fee) )
except Exception:
show_message("error")
return
password = password_dialog(self.window)
if not password: return
else: password = None
- show_seed_dialog(wallet, password, self.window)
+ seed = wallet.get_mnemonic(password)
+ show_seed_dialog(seed, self.window)
button = Gtk.Button('S')
button.connect("clicked", seedb, self.wallet )
button.set_relief(Gtk.ReliefStyle.NONE)
#assume two outputs - one for change
inputs, total, fee = self.wallet.choose_tx_inputs( amount, fee, 2 )
if not is_fee:
- fee_entry.set_text( str( Decimal( fee ) / 100000000 ) )
+ fee_entry.set_text( str( Decimal( fee ) / 1000000 ) )
self.fee_box.show()
if inputs:
amount_entry.modify_text(Gtk.StateType.NORMAL, Gdk.color_parse("#000000"))
entry.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse("#ffffff"))
def set_url(self, url):
- payto, amount, label, message, signature, identity, url = self.wallet.parse_url(url, self.show_message, self.question)
+ payto, amount, label, message, payment_request = parse_URI(url)
self.notebook.set_current_page(1)
self.payto_entry.set_text(payto)
self.message_entry.set_text(message)
self.amount_entry.set_text(amount)
- if identity:
- self.set_frozen(self.payto_entry,True)
- self.set_frozen(self.amount_entry,True)
- self.set_frozen(self.message_entry,True)
- self.payto_sig_id.set_text( ' The bitcoin URI was signed by ' + identity )
- else:
- self.payto_sig.set_visible(False)
+ self.payto_sig.set_visible(False)
def create_about_tab(self):
from gi.repository import Pango
to_address = r
if not is_valid(to_address):
- self.show_message( "invalid bitcoin address:\n"+to_address)
+ self.show_message( "invalid novacoin address:\n"+to_address)
return
try:
- amount = int( Decimal(amount_entry.get_text()) * 100000000 )
+ amount = int( Decimal(amount_entry.get_text()) * 1000000 )
except Exception:
self.show_message( "invalid amount")
return
try:
- fee = int( Decimal(fee_entry.get_text()) * 100000000 )
+ fee = int( Decimal(fee_entry.get_text()) * 1000000 )
except Exception:
self.show_message( "invalid fee")
return
treeview.append_column(tvcolumn)
cell = Gtk.CellRendererPixbuf()
tvcolumn.pack_start(cell, False)
- tvcolumn.set_attributes(cell, stock_id=1)
+ tvcolumn.set_attributes(cell, stock_id=1) # here is an exception
tvcolumn = Gtk.TreeViewColumn('Date')
treeview.append_column(tvcolumn)
cell.connect('editing-started', editing_started, self.history_list)
tvcolumn.set_expand(True)
tvcolumn.pack_start(cell, True)
- tvcolumn.set_attributes(cell, text=3, foreground_set = 4)
+ tvcolumn.set_attributes(cell, text=3, foreground_set = 4) # here is an exception
tvcolumn = Gtk.TreeViewColumn('Amount')
treeview.append_column(tvcolumn)
hbox.pack_start(button,False, False, 0)
def showqrcode(w, treeview, liststore):
+ import qrcode
path, col = treeview.get_cursor()
if not path: return
address = liststore.get_value(liststore.get_iter(path), 0)
- qr = pyqrnative.QRCode(4, pyqrnative.QRErrorCorrectLevel.H)
- qr.addData(address)
- qr.make()
+ qr = qrcode.QRCode()
+ qr.add_data(address)
boxsize = 7
- boxcount_row = qr.getModuleCount()
+ matrix = qr.get_matrix()
+ boxcount_row = len(matrix)
size = (boxcount_row + 4) * boxsize
def area_expose_cb(area, cr):
style = area.get_style()
Gdk.cairo_set_source_color(cr, style.black)
for r in range(boxcount_row):
for c in range(boxcount_row):
- if qr.isDark(r, c):
+ if matrix[r][c]:
cr.rectangle((c + 2) * boxsize, (r + 2) * boxsize, boxsize, boxsize)
cr.fill()
area = Gtk.DrawingArea()
else:
time_str = 'pending'
- inputs = map(lambda x: x.get('address'), tx.inputs)
- outputs = map(lambda x: x.get('address'), tx.d['outputs'])
+ inputs = map(lambda x: x.get('address') if not x.get('is_coinbase') else 'Coinbase', tx.inputs)
+ outputs = map(lambda x: x[1] if x[2] != 0 else 'Zero', tx.get_outputs())
tx_details = "Transaction Details" +"\n\n" \
+ "Transaction ID:\n" + tx_hash + "\n\n" \
+ "Status: %d confirmations\n"%conf
wallet.gap_limit = gap
wallet.storage.put('gap_limit', gap, True)
-
if action == 'create':
- wallet.init_seed(None)
- show_seed_dialog(wallet, None, None)
+ seed = wallet.make_seed()
+ show_seed_dialog(seed, None)
r = change_password_dialog(False, None)
password = r[2] if r else None
- wallet.save_seed(password)
+ wallet.add_seed(seed, password)
+ wallet.create_accounts(password)
wallet.synchronize() # generate first addresses offline
elif action == 'restore':
seed = self.seed_dialog()
- wallet.init_seed(seed)
+ if not seed:
+ exit()
r = change_password_dialog(False, None)
password = r[2] if r else None
- wallet.save_seed(password)
+ wallet.add_seed(seed, password)
+ wallet.create_accounts(password)
else:
exit()