Esempio n. 1
0
 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
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
 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
Esempio n. 5
0
 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