def _parse_transaction(self, tx, blockcount=None): if not blockcount: blockcount = self.blockcount() confirmations = 0 block_height = None if 'block_height' in tx['status']: block_height = tx['status']['block_height'] confirmations = blockcount - block_height status = 'unconfirmed' if tx['status']['confirmed']: status = 'confirmed' fee = None if 'fee' not in tx else tx['fee'] t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network, fee=fee, size=tx['size'], hash=tx['txid'], date=None if 'block_time' not in tx['status'] else datetime.utcfromtimestamp(tx['status']['block_time']), confirmations=confirmations, block_height=block_height, status=status, coinbase=tx['vin'][0]['is_coinbase']) index_n = 0 for ti in tx['vin']: if tx['vin'][0]['is_coinbase']: t.add_input(prev_hash=ti['txid'], output_n=ti['vout'], index_n=index_n, unlocking_script=ti['scriptsig'], value=0) else: t.add_input( prev_hash=ti['txid'], output_n=ti['vout'], index_n=index_n, unlocking_script=ti['scriptsig'], value=ti['prevout']['value'], address='' if 'scriptpubkey_address' not in ti['prevout'] else ti['prevout']['scriptpubkey_address'], unlocking_script_unsigned=ti['prevout']['scriptpubkey']) index_n += 1 index_n = 0 for to in tx['vout']: address = '' if 'scriptpubkey_address' in to: address = to['scriptpubkey_address'] spent = self.isspent(t.txid, index_n) t.add_output(value=to['value'], address=address, lock_script=to['scriptpubkey'], output_n=index_n, spent=spent) index_n += 1 if 'segwit' in [i.witness_type for i in t.inputs]: t.witness_type = 'segwit' t.update_totals() t.size = tx['size'] return t
def _parse_transaction(self, tx, block_count=None): block_height = None if not tx['block_height'] else tx['block_height'] confirmations = tx['confirmations'] if block_height and not confirmations and tx['status'] == 'confirmed': if not block_count: block_count = self.blockcount() confirmations = block_count - block_height try: # FIXME: On blocksmurfer side: always return timestamp tdate = datetime.strptime(tx['date'], "%Y-%m-%dT%H:%M:%S") except (KeyError, TypeError): tdate = datetime.utcfromtimestamp(tx['time']) t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network, fee=tx['fee'], size=tx['size'], hash=tx['txid'], date=tdate, input_total=tx['input_total'], output_total=tx['output_total'], confirmations=confirmations, block_height=block_height, status=tx['status'], coinbase=tx['coinbase'], rawtx=tx['raw_hex'], witness_type=tx['witness_type']) for ti in tx['inputs']: t.add_input(prev_hash=ti['prev_hash'], output_n=ti['output_n'], index_n=ti['index_n'], unlocking_script=ti['script'], value=ti['value'], public_hash=to_bytes(ti['public_hash']), address=ti['address'], witness_type=ti['witness_type'], locktime_cltv=ti['locktime_cltv'], locktime_csv=ti['locktime_csv'], signatures=ti['signatures'], compressed=ti['compressed'], encoding=ti['encoding'], unlocking_script_unsigned=ti['script_code'], sigs_required=ti['sigs_required']) for to in tx['outputs']: t.add_output(value=to['value'], address=to['address'], public_hash=to['public_hash'], lock_script=to['script'], spent=to['spent']) if t.coinbase: # TODO: Remove when blocksmurfer is fixed t.inputs[0].value = 0 t.update_totals() return t
def _parse_transaction(self, tx, block_count=None): block_height = None if not tx['block_height'] else tx['block_height'] confirmations = tx['confirmations'] if block_height and not confirmations and tx['status'] == 'confirmed': if not block_count: block_count = self.blockcount() confirmations = block_count - block_height tx_date = None if not tx.get('date') else datetime.strptime( tx['date'], "%Y-%m-%dT%H:%M:%S") # FIXME: Blocksmurfer returns 'date' or 'time', should be consistent if not tx_date and 'time' in tx: tx_date = datetime.utcfromtimestamp(tx['time']) t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network, fee=tx['fee'], size=tx['size'], txid=tx['txid'], date=tx_date, input_total=tx['input_total'], output_total=tx['output_total'], confirmations=confirmations, block_height=block_height, status=tx['status'], coinbase=tx['coinbase'], rawtx=bytes.fromhex(tx['raw_hex']), witness_type=tx['witness_type']) for ti in tx['inputs']: t.add_input(prev_txid=ti['prev_txid'], output_n=ti['output_n'], keys=ti.get('keys', []), index_n=ti['index_n'], unlocking_script=ti['script'], value=ti['value'], public_hash=bytes.fromhex(ti['public_hash']), address=ti['address'], witness_type=ti['witness_type'], locktime_cltv=ti['locktime_cltv'], locktime_csv=ti['locktime_csv'], signatures=ti['signatures'], compressed=ti['compressed'], encoding=ti['encoding'], unlocking_script_unsigned=ti['script_code'], sigs_required=ti['sigs_required'], sequence=ti['sequence'], witnesses=[bytes.fromhex(w) for w in ti['witnesses']], script_type=ti['script_type'], strict=False) for to in tx['outputs']: t.add_output(value=to['value'], address=to['address'], public_hash=to['public_hash'], lock_script=to['script'], spent=to['spent'], strict=False) t.update_totals() return t
def _parse_transaction(self, tx, blockcount=None): if not blockcount: blockcount = self.blockcount() confirmations = 0 block_height = None if 'block_height' in tx['status']: block_height = tx['status']['block_height'] confirmations = blockcount - block_height status = 'unconfirmed' if tx['status']['confirmed']: status = 'confirmed' fee = None if 'fee' not in tx else tx['fee'] t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network, fee=fee, size=tx['size'], txid=tx['txid'], date=None if 'block_time' not in tx['status'] else datetime.utcfromtimestamp(tx['status']['block_time']), confirmations=confirmations, block_height=block_height, status=status, coinbase=tx['vin'][0]['is_coinbase']) index_n = 0 for ti in tx['vin']: if tx['vin'][0]['is_coinbase']: t.add_input(prev_txid=ti['txid'], output_n=ti['vout'], index_n=index_n, unlocking_script=ti['scriptsig'], value=0, sequence=ti['sequence']) else: witnesses = [] if 'witness' in ti: witnesses = [bytes.fromhex(w) for w in ti['witness']] t.add_input(prev_txid=ti['txid'], output_n=ti['vout'], index_n=index_n, unlocking_script=ti['scriptsig'], value=ti['prevout']['value'], address='' if 'scriptpubkey_address' not in ti['prevout'] else ti['prevout']['scriptpubkey_address'], sequence=ti['sequence'], unlocking_script_unsigned=ti['prevout']['scriptpubkey'], witnesses=witnesses) index_n += 1 index_n = 0 if len(tx['vout']) > 50: # Every output needs an extra query, stop execution if there are too many transaction outputs return False for to in tx['vout']: address = '' if 'scriptpubkey_address' in to: address = to['scriptpubkey_address'] spent = self.isspent(t.txid, index_n) t.add_output(value=to['value'], address=address, lock_script=to['scriptpubkey'], output_n=index_n, spent=spent) index_n += 1 if 'segwit' in [i.witness_type for i in t.inputs] or 'p2sh-segwit' in [i.witness_type for i in t.inputs]: t.witness_type = 'segwit' t.update_totals() t.size = tx['size'] return t
def _parse_transaction(self, tx): witness_type = 'legacy' if len([ti['witness'] for ti in tx['inputs'] if ti['witness'] != '00']): witness_type = 'segwit' coinbase = False if tx['inputs'][0]['prevout']['hash'] == '00' * 32: coinbase = True status = 'unconfirmed' if tx['confirmations']: status = 'confirmed' t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network, fee=tx['fee'], size=int(len(tx['hex'])/2), hash=tx['hash'], date=datetime.fromtimestamp(tx['time']), confirmations=tx['confirmations'], block_height=tx['height'], block_hash=tx['block'], rawtx=tx['hex'], status=status, coinbase=coinbase, witness_type=witness_type) for ti in tx['inputs']: witness_type = 'legacy' script = ti['script'] if ti['witness'] != '00': witness_type = 'segwit' script = ti['witness'][2:] address = '' value = 0 if 'coin' in ti: address = ti['coin']['address'] value = ti['coin']['value'] t.add_input(prev_hash=ti['prevout']['hash'], output_n=ti['prevout']['index'], unlocking_script=script, address=address, value=value, witness_type=witness_type, sequence=ti['sequence']) output_n = 0 for to in tx['outputs']: address = '' if to['address']: address = to['address'] t.add_output(value=to['value'], address=address, lock_script=to['script'], output_n=output_n, spent=None) output_n += 1 t.update_totals() if t.coinbase: t.input_total = t.output_total return t