def get_fidelity_bond_data(taker): with taker.dblock: fbonds = taker.db.execute("SELECT * FROM fidelitybonds;").fetchall() blocks = jm_single().bc_interface.get_current_block_height() mediantime = jm_single().bc_interface.get_best_block_median_time() interest_rate = get_interest_rate() bond_utxo_set = set() fidelity_bond_data = [] bond_outpoint_conf_times = [] fidelity_bond_values = [] for fb in fbonds: try: parsed_bond = FidelityBondProof.parse_and_verify_proof_msg( fb["counterparty"], fb["takernick"], fb["proof"]) except ValueError: continue bond_utxo_data = FidelityBondMixin.get_validated_timelocked_fidelity_bond_utxo( parsed_bond.utxo, parsed_bond.utxo_pub, parsed_bond.locktime, parsed_bond.cert_expiry, blocks) if bond_utxo_data == None: continue #check for duplicated utxos i.e. two or more makers using the same UTXO # which is obviously not allowed, a fidelity bond must only be usable by one maker nick utxo_str = parsed_bond.utxo[0] + b":" + str( parsed_bond.utxo[1]).encode("ascii") if utxo_str in bond_utxo_set: continue bond_utxo_set.add(utxo_str) fidelity_bond_data.append((parsed_bond, bond_utxo_data)) conf_time = jm_single().bc_interface.get_block_time( jm_single().bc_interface.get_block_hash( blocks - bond_utxo_data["confirms"] + 1)) bond_outpoint_conf_times.append(conf_time) bond_value = FidelityBondMixin.calculate_timelocked_fidelity_bond_value( bond_utxo_data["value"], conf_time, parsed_bond.locktime, mediantime, interest_rate) fidelity_bond_values.append(bond_value) return (fidelity_bond_data, fidelity_bond_values, bond_outpoint_conf_times)
def create_orderbook_table(self, btc_unit, rel_unit): result = '' try: self.taker.dblock.acquire(True) rows = self.taker.db.execute('SELECT * FROM orderbook;').fetchall() finally: self.taker.dblock.release() if not rows: return 0, result rows = [o for o in rows if o["ordertype"] in filtered_offername_list] if jm_single().bc_interface == None: for row in rows: row["bondvalue"] = "No data" else: blocks = jm_single().bc_interface.get_current_block_height() mediantime = jm_single().bc_interface.get_best_block_median_time() interest_rate = get_interest_rate() for row in rows: with self.taker.dblock: fbond_data = self.taker.db.execute( "SELECT * FROM fidelitybonds WHERE counterparty=?;", (row["counterparty"], )).fetchall() if len(fbond_data) == 0: row["bondvalue"] = "0" continue else: try: parsed_bond = FidelityBondProof.parse_and_verify_proof_msg( fbond_data[0]["counterparty"], fbond_data[0]["takernick"], fbond_data[0]["proof"]) except ValueError: row["bondvalue"] = "0" continue utxo_data = FidelityBondMixin.get_validated_timelocked_fidelity_bond_utxo( parsed_bond.utxo, parsed_bond.utxo_pub, parsed_bond.locktime, parsed_bond.cert_expiry, blocks) if utxo_data == None: row["bondvalue"] = "0" continue bond_value = FidelityBondMixin.calculate_timelocked_fidelity_bond_value( utxo_data["value"], jm_single().bc_interface.get_block_time( jm_single().bc_interface.get_block_hash( blocks - utxo_data["confirms"] + 1)), parsed_bond.locktime, mediantime, interest_rate) row["bondvalue"] = satoshi_to_unit_power( bond_value, 2 * unit_to_power[btc_unit]) order_keys_display = (('ordertype', ordertype_display), ('counterparty', do_nothing), ('oid', order_str), ('cjfee', cjfee_display), ('txfee', satoshi_to_unit), ('minsize', satoshi_to_unit), ('maxsize', satoshi_to_unit), ('bondvalue', do_nothing)) # somewhat complex sorting to sort by cjfee but with swabsoffers on top def orderby_cmp(x, y): if x['ordertype'] == y['ordertype']: return cmp(Decimal(x['cjfee']), Decimal(y['cjfee'])) return cmp(offername_list.index(x['ordertype']), offername_list.index(y['ordertype'])) for o in sorted(rows, key=cmp_to_key(orderby_cmp)): result += ' <tr>\n' for key, displayer in order_keys_display: result += ' <td>' + displayer(o[key], o, btc_unit, rel_unit) + '</td>\n' result += ' </tr>\n' return len(rows), result