Adding FLO data support

1. All the GUI changes for the QT version of the wallet
2. Saving flodata locally in the wallet
This commit is contained in:
Vivek Teega 2018-09-29 23:09:21 +05:30
parent 4b1b6e3adf
commit 91273f7114
7 changed files with 52 additions and 10 deletions

View File

@ -69,8 +69,8 @@ class AddressSynchronizer(PrintError):
# Verified transactions. txid -> VerifiedTxInfo. Access with self.lock.
verified_tx = storage.get('verified_tx3', {})
self.verified_tx = {}
for txid, (height, timestamp, txpos, header_hash) in verified_tx.items():
self.verified_tx[txid] = VerifiedTxInfo(height, timestamp, txpos, header_hash)
for txid, (height, timestamp, txpos, header_hash, flodata) in verified_tx.items():
self.verified_tx[txid] = VerifiedTxInfo(height, timestamp, txpos, header_hash, flodata)
# Transactions pending verification. txid -> tx_height. Access with self.lock.
self.unverified_tx = defaultdict(int)
# true when synchronized
@ -640,6 +640,23 @@ class AddressSynchronizer(PrintError):
# local transaction
return TxMinedStatus(TX_HEIGHT_LOCAL, 0, None, None)
def get_flodata(self, tx_hash: str):
""" Given a transaction, returns flodata """
with self.lock:
if tx_hash in self.verified_tx:
info = self.verified_tx[tx_hash]
flodata = info[4]
return flodata
elif tx_hash in self.unverified_tx:
tx = self.transactions.get(tx_hash)
flodata = tx.flodata[5:]
return flodata
else:
# local transaction
tx = self.transactions.get(tx_hash)
flodata = tx.flodata[5:]
return flodata
def set_up_to_date(self, up_to_date):
with self.lock:
self.up_to_date = up_to_date

View File

@ -74,7 +74,7 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
return str(datetime.date(d.year, d.month, d.day)) if d else _('None')
def refresh_headers(self):
headers = ['', '', _('Date'), _('Description'), _('Amount'), _('Balance')]
headers = ['', '', _('Date'), _('Description'), _('Amount'), _('Balance'), _('FLO Data')]
fx = self.parent.fx
if fx and fx.show_history():
headers.extend(['%s '%fx.ccy + _('Value')])
@ -247,7 +247,8 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
icon = self.icon_cache.get(":icons/" + TX_ICONS[status])
v_str = self.parent.format_amount(value, is_diff=True, whitespaces=True)
balance_str = self.parent.format_amount(balance, whitespaces=True)
entry = ['', tx_hash, status_str, label, v_str, balance_str]
flodata = self.wallet.get_flodata(tx_hash)
entry = ['', tx_hash, status_str, label, v_str, balance_str, flodata]
fiat_value = None
if value is not None and fx and fx.show_history():
fiat_value = tx_item['fiat_value'].value

View File

@ -1094,6 +1094,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.message_e = MyLineEdit()
grid.addWidget(self.message_e, 2, 1, 1, -1)
msg = _('This is where you write the FLO Data for the transaction')
flodata_label = HelpLabel(_('FLO Data'), msg)
grid.addWidget(flodata_label, 7, 0)
self.message_tx = MyLineEdit()
grid.addWidget(self.message_tx, 7, 1, 1, -1)
self.from_label = QLabel(_('From'))
grid.addWidget(self.from_label, 3, 0)
self.from_list = MyTreeWidget(self, self.from_list_menu, ['',''])
@ -1490,6 +1496,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
self.show_error(_('Payment request has expired'))
return
label = self.message_e.text()
flodata = self.message_tx.text()
if self.payment_request:
outputs = self.payment_request.get_outputs()
@ -1525,7 +1532,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
fee_estimator = self.get_send_fee_estimator()
coins = self.get_coins()
return outputs, fee_estimator, label, coins
return outputs, fee_estimator, label, coins, flodata
def do_preview(self):
self.do_send(preview = True)
@ -1536,12 +1543,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
r = self.read_send_tab()
if not r:
return
outputs, fee_estimator, tx_desc, coins = r
outputs, fee_estimator, tx_desc, coins, flodata = r
try:
is_sweep = bool(self.tx_external_keypairs)
tx = self.wallet.make_unsigned_transaction(
coins, outputs, self.config, fixed_fee=fee_estimator,
is_sweep=is_sweep)
is_sweep=is_sweep, flodata=flodata)
except NotEnoughFunds:
self.show_message(_("Insufficient funds"))
return

View File

@ -113,6 +113,8 @@ class TxDialog(QDialog, MessageBoxMixin):
vbox.addWidget(self.size_label)
self.fee_label = QLabel()
vbox.addWidget(self.fee_label)
self.flodata_label = QLabel()
vbox.addWidget(self.flodata_label)
self.add_io(vbox)
@ -266,6 +268,7 @@ class TxDialog(QDialog, MessageBoxMixin):
self.amount_label.setText(amount_str)
self.fee_label.setText(fee_str)
self.size_label.setText(size_str)
self.flodata_label.setText("FLO data: " + self.tx.flodata)
run_hook('transaction_dialog_update', self)
def add_io(self, vbox):

View File

@ -867,7 +867,8 @@ TxMinedStatus = NamedTuple("TxMinedStatus", [("height", int),
VerifiedTxInfo = NamedTuple("VerifiedTxInfo", [("height", int),
("timestamp", int),
("txpos", int),
("header_hash", str)])
("header_hash", str),
("flodata", str)])
def make_aiohttp_session(proxy):
if proxy:

View File

@ -113,7 +113,8 @@ class SPV(PrintError):
except KeyError: pass
self.print_error("verified %s" % tx_hash)
header_hash = hash_header(header)
vtx_info = VerifiedTxInfo(tx_height, header.get('timestamp'), pos, header_hash)
flodata = self.wallet.get_flodata(tx_hash)
vtx_info = VerifiedTxInfo(tx_height, header.get('timestamp'), pos, header_hash, flodata)
self.wallet.add_verified_tx(tx_hash, vtx_info)
if self.is_up_to_date() and self.wallet.is_up_to_date():
self.wallet.save_verified_tx(write=True)

View File

@ -492,6 +492,11 @@ class Abstract_Wallet(AddressSynchronizer):
return ', '.join(labels)
return ''
def get_flodata(self, tx_hash):
tx = self.transactions.get(tx_hash)
flodata = tx.flodata[5:]
return flodata
def get_tx_status(self, tx_hash, tx_mined_status):
extra = []
height = tx_mined_status.height
@ -539,7 +544,7 @@ class Abstract_Wallet(AddressSynchronizer):
return dust_threshold(self.network)
def make_unsigned_transaction(self, inputs, outputs, config, fixed_fee=None,
change_addr=None, is_sweep=False):
change_addr=None, is_sweep=False, flodata=None):
# check outputs
i_max = None
for i, o in enumerate(outputs):
@ -561,6 +566,9 @@ class Abstract_Wallet(AddressSynchronizer):
for item in inputs:
self.add_input_info(item)
if flodata is None:
flodata=''
# change address
# if we leave it empty, coin_chooser will set it
change_addrs = []
@ -609,6 +617,10 @@ class Abstract_Wallet(AddressSynchronizer):
# Timelock tx to current height.
tx.locktime = self.get_local_height()
# Transactions with transaction comments/floData are version 2
if flodata != "":
tx.version = 2
tx.flodata = "text:" + flodata
run_hook('make_unsigned_transaction', self, tx)
return tx