async def reformat_out(self, out): res = misc.StdObj( amount=out.amount, addr=addr.build_address(out.addr.m_spend_public_key, out.addr.m_view_public_key), is_subaddress=out.is_subaddress, ) return res
def _get_integrated_idx(self, outputs, aux_data=None): if aux_data is None or aux_data.destinations is None: return [] integrated_indices = [] integrated_pairs = [] for idx, cur in enumerate(aux_data.destinations): ainfo = cur[0] if ainfo.is_integrated: caddr = xmr_addr.build_address(ainfo.spend_key, ainfo.view_key) integrated_pairs.append((caddr, cur[1])) for idx, dst in enumerate(outputs): for ipair in integrated_pairs: if xmr_addr.addr_eq(ipair[0], dst.addr) and dst.amount == ipair[1]: integrated_indices.append(idx) logger.debug("Integrated indices: %s" % len(integrated_indices)) return integrated_indices
async def describe(self, inp, unsigned_txs, keys, key_subs): print("\nInp: %s, #txs: %s, #transfers: %s" % (inp, len(unsigned_txs.txes), len(unsigned_txs.transfers))) for txid, tx in enumerate(unsigned_txs.txes): srcs = tx.sources dsts = tx.splitted_dsts extra = tx.extra change = tx.change_dts account = tx.subaddr_account subs = tx.subaddr_indices mixin = len(srcs[0].outputs) - 1 amnt_in = sum([x.amount for x in srcs]) amnt_out = sum([x.amount for x in dsts]) fee = amnt_in - amnt_out n_inp_additional = sum( [1 for x in srcs if len(x.real_out_additional_tx_keys) > 0] ) change_addr = ( addr.build_address( change.addr.m_spend_public_key, change.addr.m_view_public_key ) if change else None ) out_txs2 = await self.reformat_outs(dsts) num_stdaddresses, num_subaddresses, single_dest_subaddress = addr.classify_subaddresses( out_txs2, change_addr ) print( " tx: %s, #inp: %2d, #inp_add: %2d, #out: %2d, mixin: %2d, acc: %s, subs: %s, " "xmr_in: %10.6f, xmr_out: %10.6f, fee: %10.6f, change: %10.6f, out_clean: %10.6f" % ( txid, len(srcs), n_inp_additional, len(dsts), mixin, account, subs, wallet.conv_disp_amount(amnt_in), wallet.conv_disp_amount(amnt_out), wallet.conv_disp_amount(fee), wallet.conv_disp_amount(change.amount) if change else 0, wallet.conv_disp_amount( (amnt_out - change.amount) if change else amnt_out ), ) ) print( " Out: num_std: %2d, num_sub: %2d, single_dest_sub: %s, total: %s" % ( num_stdaddresses, num_subaddresses, 1 if single_dest_subaddress else 0, len(dsts), ) ) accounts = set() subs = set() for inp in srcs: res = await self.analyze_input(keys, key_subs, inp) accounts.add(res[0]) if res != (0, 0): subs.add(res) print(" Ins: accounts: %s, subs: %s" % (accounts, len(subs))) extras = await monero.parse_extra_fields(extra) extras_val = [] for c in extras: if isinstance(c, TxExtraPubKey): extras_val.append("TxKey") elif isinstance(c, TxExtraNonce): extras_val.append( "Nonce: %s" % binascii.hexlify(c.nonce).decode("ascii") ) elif isinstance(c, TxExtraAdditionalPubKeys): extras_val.append("AdditionalTxKeys: %s" % len(c.data)) else: extras_val.append(str(c)) print(" Extras: %s" % ", ".join(extras_val)) # Final verification for idx, inp in enumerate(tx.sources): self.check_input(inp, keys, key_subs) if not crypto.point_eq( crypto.decodepoint(inp.outputs[inp.real_output][1].mask), crypto.gen_c(crypto.decodeint(inp.mask), inp.amount), ): raise ValueError("Real source entry's mask does not equal spend key's. Inp: %d" % idx)