Пример #1
0
 def _convert_to_transaction(self, tx):
     if tx['confirmations']:
         status = 'confirmed'
     else:
         status = 'unconfirmed'
     fees = None if 'fees' not in tx else int(
         round(float(tx['fees']) * self.units, 0))
     value_in = 0 if 'valueIn' not in tx else tx['valueIn']
     isCoinbase = False
     if 'isCoinBase' in tx and tx['isCoinBase']:
         value_in = tx['valueOut']
         isCoinbase = True
     t = Transaction(locktime=tx['locktime'],
                     version=tx['version'],
                     network=self.network,
                     fee=fees,
                     size=tx['size'],
                     hash=tx['txid'],
                     date=datetime.fromtimestamp(tx['blocktime']),
                     confirmations=tx['confirmations'],
                     block_height=tx['blockheight'],
                     block_hash=tx['blockhash'],
                     status=status,
                     input_total=int(round(float(value_in) * self.units,
                                           0)),
                     coinbase=isCoinbase,
                     output_total=int(
                         round(float(tx['valueOut']) * self.units, 0)))
     for ti in tx['vin']:
         sequence = struct.pack('<L', ti['sequence'])
         if isCoinbase:
             t.add_input(prev_hash=32 * b'\0',
                         output_n=4 * b'\xff',
                         unlocking_script=ti['coinbase'],
                         index_n=ti['n'],
                         script_type='coinbase',
                         sequence=sequence)
         else:
             value = int(round(float(ti['value']) * self.units, 0))
             t.add_input(prev_hash=ti['txid'],
                         output_n=ti['vout'],
                         unlocking_script=ti['scriptSig']['hex'],
                         index_n=ti['n'],
                         value=value,
                         sequence=sequence,
                         double_spend=False if ti['doubleSpentTxID'] is None
                         else ti['doubleSpentTxID'])
     for to in tx['vout']:
         value = int(round(float(to['value']) * self.units, 0))
         address = ''
         try:
             address = to['scriptPubKey']['addresses'][0]
         except ValueError:
             pass
         t.add_output(value=value,
                      address=address,
                      lock_script=to['scriptPubKey']['hex'],
                      spent=True if to['spentTxId'] else False,
                      output_n=to['n'])
     return t
Пример #2
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
Пример #3
0
    def gettransaction(self, tx_id):
        res = self.compose_request('dashboards/transaction/', data=tx_id)

        tx = res['data'][tx_id]['transaction']
        confirmations = res['context']['state'] - tx['block_id']
        status = 'unconfirmed'
        if confirmations:
            status = 'confirmed'
        witness_type = 'legacy'
        if tx['has_witness']:
            witness_type = 'segwit'
        input_total = tx['input_total']
        if tx['is_coinbase']:
            input_total = tx['output_total']
        t = Transaction(locktime=tx['lock_time'], version=tx['version'], network=self.network,
                        fee=tx['fee'], size=tx['size'], hash=tx['hash'],
                        date=datetime.strptime(tx['time'], "%Y-%m-%d %H:%M:%S"),
                        confirmations=confirmations, block_height=tx['block_id'], status=status,
                        input_total=input_total, coinbase=tx['is_coinbase'],
                        output_total=tx['output_total'], witness_type=witness_type)
        index_n = 0
        for ti in res['data'][tx_id]['inputs']:
            t.add_input(prev_hash=ti['transaction_hash'], output_n=ti['index'],
                        unlocking_script_unsigned=ti['script_hex'], index_n=index_n, value=ti['value'],
                        address=ti['recipient'], unlocking_script=ti['spending_signature_hex'])
            index_n += 1
        for to in res['data'][tx_id]['outputs']:
            try:
                deserialize_address(to['recipient'], network=self.network.name)
                addr = to['recipient']
            except EncodingError:
                addr = ''
            t.add_output(value=to['value'], address=addr, lock_script=to['script_hex'],
                         spent=to['is_spent'], output_n=to['index'])
        return t
Пример #4
0
 def _convert_to_transaction(self, tx):
     if tx['confirmations']:
         status = 'confirmed'
     else:
         status = 'unconfirmed'
     fees = None if 'fees' not in tx else int(round(float(tx['fees']) * self.units, 0))
     value_in = 0 if 'valueIn' not in tx else tx['valueIn']
     isCoinbase = False
     if 'isCoinBase' in tx and tx['isCoinBase']:
         isCoinbase = True
     txdate = None
     if 'blocktime' in tx:
         txdate = datetime.utcfromtimestamp(tx['blocktime'])
     t = Transaction(locktime=tx['locktime'], version=tx['version'], network=self.network,
                     fee=fees, size=tx['size'], txid=tx['txid'],
                     date=txdate, confirmations=tx['confirmations'],
                     block_height=tx['blockheight'], status=status,
                     input_total=int(round(float(value_in) * self.units, 0)), coinbase=isCoinbase,
                     output_total=int(round(float(tx['valueOut']) * self.units, 0)))
     for ti in tx['vin']:
         if isCoinbase:
             t.add_input(prev_txid=32 * b'\0', output_n=4*b'\xff', unlocking_script=ti['coinbase'], index_n=ti['n'],
                         script_type='coinbase', sequence=ti['sequence'], value=0)
         else:
             value = int(round(float(ti['value']) * self.units, 0))
             t.add_input(prev_txid=ti['txid'], output_n=ti['vout'], unlocking_script=ti['scriptSig']['hex'],
                         index_n=ti['n'], value=value, sequence=ti['sequence'],
                         double_spend=False if ti['doubleSpentTxID'] is None else ti['doubleSpentTxID'])
     for to in tx['vout']:
         value = int(round(float(to['value']) * self.units, 0))
         t.add_output(value=value, lock_script=to['scriptPubKey']['hex'],
                      spent=True if to['spentTxId'] else False, output_n=to['n'],
                      spending_txid=None if not to['spentTxId'] else to['spentTxId'],
                      spending_index_n=None if not to['spentIndex'] else to['spentIndex'], strict=False)
     return t
Пример #5
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
Пример #6
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
Пример #7
0
    def gettransactions(self, addresslist):
        txs = []
        for address in addresslist:
            # res = self.compose_request('address', address, 'unspent-outputs')
            current_page = 1
            while len(txs) < 2000:
                variables = {'page': current_page, 'limit': 200}
                res = self.compose_request('address', address, 'transactions',
                                           variables)
                for tx in res['data']:
                    if tx['hash'] in [t.hash for t in txs]:
                        break
                    if tx['confirmations']:
                        status = 'confirmed'
                    else:
                        status = 'unconfirmed'
                    t = Transaction(network=self.network,
                                    fee=tx['total_fee'],
                                    hash=tx['hash'],
                                    date=datetime.strptime(
                                        tx['time'], "%Y-%m-%dT%H:%M:%S+%f"),
                                    confirmations=tx['confirmations'],
                                    block_height=tx['block_height'],
                                    block_hash=tx['block_hash'],
                                    status=status,
                                    input_total=tx['total_input_value'],
                                    output_total=tx['total_output_value'])
                    for index_n, ti in enumerate(tx['inputs']):
                        t.add_input(prev_hash=ti['output_hash'],
                                    output_n=ti['output_index'],
                                    unlocking_script=ti['script_signature'],
                                    index_n=index_n,
                                    value=int(
                                        round(ti['value'] * self.units, 0)))
                    for to in tx['outputs']:
                        t.add_output(value=int(
                            round(to['value'] * self.units, 0)),
                                     address=to['address'],
                                     lock_script=to['script_hex'],
                                     spent=bool(to['spent_hash']))
                    txs.append(t)
                if current_page * 200 > int(res['total']):
                    break
                current_page += 1

        if len(txs) >= 2000:
            _logger.warning(
                "BlockTrail: UTXO's list has been truncated, UTXO list is incomplete"
            )
        return txs
Пример #8
0
    def _parse_transaction(self, tx):
        status = 'unconfirmed'
        if tx['confirmations']:
            status = 'confirmed'
        witness_type = 'legacy'
        if 'inputs' in tx and [ti['witness'] for ti in tx['inputs'] if ti['witness'] and ti['witness'] != ['NULL']]:
            witness_type = 'segwit'
        input_total = tx['input_amount_int']
        t_time = None
        if tx['time']:
            t_time = datetime.utcfromtimestamp(tx['time'])
        if tx['coinbase']:
            input_total = tx['output_amount_int']
        t = Transaction(locktime=tx['locktime'], version=int(tx['version']), network=self.network, fee=tx['fee_int'],
                        size=tx['size'], hash=tx['txid'], date=t_time,
                        confirmations=tx['confirmations'], block_height=tx['block'], status=status,
                        input_total=input_total, coinbase=tx['coinbase'],
                        output_total=tx['output_amount_int'], witness_type=witness_type)
        index_n = 0
        if tx['coinbase']:
            t.add_input(prev_hash=b'\00' * 32, output_n=0, value=input_total)
        else:
            for ti in tx['inputs']:
                unlocking_script = ti['script_sig']['hex']
                witness_type = 'legacy'
                if ti['witness'] and ti['witness'] != ['NULL']:
                    address = Address.import_address(ti['addresses'][0])
                    if address.script_type == 'p2sh':
                        witness_type = 'p2sh-segwit'
                    else:
                        witness_type = 'segwit'
                    unlocking_script = b"".join([varstr(to_bytes(x)) for x in ti['witness']])
                t.add_input(prev_hash=ti['txid'], output_n=ti['vout'], unlocking_script=unlocking_script,
                            index_n=index_n, value=ti['value_int'], address=ti['addresses'][0], sequence=ti['sequence'],
                            witness_type=witness_type)
                index_n += 1

        for to in tx['outputs']:
            spent = False
            spending_txid = None
            if 'spend_txid' in to and to['spend_txid']:
                spent = True
                spending_txid = to['spend_txid']
            address = ''
            if to['addresses']:
                address = to['addresses'][0]
            t.add_output(value=to['value_int'], address=address, lock_script=to['script_pub_key']['hex'],
                         spent=spent, output_n=to['n'], spending_txid=spending_txid)
        return t
Пример #9
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
Пример #10
0
    def _parse_transaction(self, tx):
        # t = Transaction.import_raw(tx['rawTx'], network=self.network)
        status = 'unconfirmed'
        if tx['confirmations']:
            status = 'confirmed'
        date = None
        if 'timestamp' in tx and tx['timestamp']:
            date = datetime.utcfromtimestamp(tx['timestamp'])
        elif 'blockTime' in tx and tx['blockTime']:
            date = datetime.utcfromtimestamp(tx['blockTime'])
        block_height = None
        block_hash = None
        if 'blockHeight' in tx:
            block_height = tx['blockHeight']
        if 'blockHash' in tx:
            block_hash = tx['blockHash']
        witness_type = 'legacy'
        if tx['segwit']:
            witness_type = 'segwit'

        t = Transaction(
            locktime=tx['lockTime'], version=tx['version'], network=self.network, fee=tx['fee'],
            fee_per_kb=None if 'feeRate' not in tx else int(tx['feeRate']), size=tx['size'], hash=tx['txId'], date=date,
            confirmations=tx['confirmations'], block_height=block_height, block_hash=block_hash,
            input_total=tx['inputsAmount'], output_total=tx['outputsAmount'], status=status, coinbase=tx['coinbase'],
            verified=None if 'valid' not in tx else tx['valid'], witness_type=witness_type)

        for n, ti in tx['vIn'].items():
            if t.coinbase:
                t.add_input(prev_hash=ti['txId'], output_n=ti['vOut'], unlocking_script=ti['scriptSig'],
                            sequence=ti['sequence'], index_n=int(n), value=0)
            else:
                t.add_input(prev_hash=ti['txId'], output_n=ti['vOut'], unlocking_script=ti['scriptSig'],
                            unlocking_script_unsigned=ti['scriptPubKey'],
                            address='' if 'address' not in ti else ti['address'], sequence=ti['sequence'],
                            index_n=int(n), value=ti['amount'])

        for _, to in tx['vOut'].items():
            spending_txid = None if not to['spent'] else to['spent'][0]['txId']
            spending_index_n = None if not to['spent'] else to['spent'][0]['vIn']
            t.add_output(to['value'], '' if 'address' not in to else to['address'],
                         '' if 'addressHash' not in to else to['addressHash'], lock_script=to['scriptPubKey'],
                         spent=bool(to['spent']), spending_txid=spending_txid, spending_index_n=spending_index_n)

        return t
Пример #11
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
Пример #12
0
    def gettransaction(self, tx_id):
        res = self.compose_request('dashboards/transaction/', data=tx_id)

        tx = res['data'][tx_id]['transaction']
        confirmations = 0 if tx['block_id'] <= 0 else res['context']['state'] - tx['block_id']
        status = 'unconfirmed'
        if confirmations:
            status = 'confirmed'
        witness_type = 'legacy'
        if tx['has_witness']:
            witness_type = 'segwit'
        input_total = tx['input_total']
        t = Transaction(locktime=tx['lock_time'], version=tx['version'], network=self.network,
                        fee=tx['fee'], size=tx['size'], txid=tx['hash'],
                        date=None if not confirmations else datetime.strptime(tx['time'], "%Y-%m-%d %H:%M:%S"),
                        confirmations=confirmations, block_height=tx['block_id'] if tx['block_id'] > 0 else None,
                        status=status, input_total=input_total, coinbase=tx['is_coinbase'],
                        output_total=tx['output_total'], witness_type=witness_type)
        index_n = 0
        if not res['data'][tx_id]['inputs']:
            # This is a coinbase transaction, add input
            t.add_input(prev_txid=b'\00' * 32, output_n=0, value=0)

        for ti in res['data'][tx_id]['inputs']:
            if ti['spending_witness']:
                # witnesses = b"".join([varstr(bytes.fromhex(x)) for x in ti['spending_witness'].split(",")])
                witnesses = ti['spending_witness'].split(",")
                address = Address.parse(ti['recipient'])
                if address.script_type == 'p2sh':
                    witness_type = 'p2sh-segwit'
                else:
                    witness_type = 'segwit'
                t.add_input(prev_txid=ti['transaction_hash'], output_n=ti['index'],
                            unlocking_script=ti['spending_signature_hex'],
                            witnesses=witnesses, index_n=index_n, value=ti['value'],
                            address=address, witness_type=witness_type, sequence=ti['spending_sequence'], strict=False)
            else:
                t.add_input(prev_txid=ti['transaction_hash'], output_n=ti['index'],
                            unlocking_script=ti['spending_signature_hex'], index_n=index_n, value=ti['value'],
                            address=ti['recipient'], unlocking_script_unsigned=ti['script_hex'],
                            sequence=ti['spending_sequence'], strict=False)
            index_n += 1
        for to in res['data'][tx_id]['outputs']:
            try:
                deserialize_address(to['recipient'], network=self.network.name)
                addr = to['recipient']
            except EncodingError:
                addr = ''
            t.add_output(value=to['value'], address=addr, lock_script=to['script_hex'],
                         spent=to['is_spent'], output_n=to['index'], spending_txid=to['spending_transaction_hash'],
                         spending_index_n=to['spending_index'], strict=False)
        return t
Пример #13
0
    def create_transaction(self, wallet_address_list,
                           private_input_address_list, output_address,
                           change_address, send_amount, fee_per_kb, network):
        try:

            print(
                'Create and sign  Transaction with Multiple INPUTS using keys from Wallet class '
            )
            charge_back_amount = 0
            print('Dummy transaction with Outputs ')
            transaction_outputs = [
                Output(send_amount, address=output_address, network=network),
                Output(charge_back_amount,
                       address=change_address,
                       network=network)
            ]
            print('transaction_outputs', transaction_outputs)
            print('created dummy txn for fee calc')
            t = Transaction(outputs=transaction_outputs,
                            network=network,
                            fee_per_kb=fee_per_kb)
            print('Fee with o/p  ', t.calculate_fee())
            fee = t.calculate_fee()
            charge_back_amount = send_amount - fee
            '''
            if charge_back_amount < 0:
                raise ServiceException('Insufficient fund to continue transaction')
            '''
            print('created real txn for fee calc')
            transaction_outputs = [
                Output(send_amount, address=output_address, network=network),
                Output(charge_back_amount,
                       address=change_address,
                       network=network)
            ]
            print('transaction_outputs', transaction_outputs)
            transaction_inputs = []
            for input in wallet_address_list:
                transaction_inputs.append(
                    (input['txid'], int(input['vout']),
                     self.json_get(private_input_address_list,
                                   input['address'])))
            print('transaction_inputs', transaction_inputs)
            t.fee = t.calculate_fee()
            print('Fee with ip/ op ', t.fee)

            for ti in transaction_inputs:
                ki = Key(ti[2], network=network)
                t.add_input(prev_hash=ti[0], output_n=ti[1], keys=ki.public())
            icount = 0
            for ti in transaction_inputs:
                ki = Key(ti[2], network=network)
                t.sign(ki.private_byte, icount)
                icount += 1

            print('\nRaw Signed Transaction %s' % binascii.hexlify(t.raw()))
            print('\nVerified %s' % t.verify())

            print('------------info-----------')
            t.info()
            print('------------end-----------')
        except Exception as e:
            raise e

        return t
Пример #14
0
async def build_tx(amount, recipient, memo, fee_rate, sender, network,
                   sochain_url):
    """Build transcation

    :param amount: amount of BTC to transfer
    :type amount: int
    :param recipient: destination address
    :type recipient: str
    :param memo: optional memo for transaction
    :type memo: str
    :param fee_rate: fee rates for transaction
    :type fee_rate: int
    :param sender: sender's address
    :type sender: str
    :param network: testnet or mainnet
    :type network: str
    :returns: transaction
    """
    try:
        utxos = await scan_UTXOs(sochain_url, network, sender)
        if len(utxos) == 0:
            raise Exception("No utxos to send")

        balance = await sochain_api.get_balance(sochain_url, network, sender)

        if not validate_address(network, recipient):
            raise Exception('Invalid address')

        fee_rate_whole = fee_rate

        compiled_memo = None
        if memo:
            compiled_memo = compile_memo(memo)

        fee = get_fee(utxos, fee_rate_whole, compiled_memo)

        if fee + amount > balance * 10**8:
            raise Exception('Balance insufficient for transaction')

        t = Transaction(network=network_to_bitcoinlib_format(network),
                        witness_type='segwit')

        for i in utxos:
            t.add_input(prev_txid=i.hash,
                        output_n=i.index,
                        value=i.witness_utxo.value,
                        witnesses=i.witness_utxo.script)

        t.add_output(address=recipient, value=amount)
        change = await get_change(sochain_url, amount + fee, network, sender)

        if change > 0:
            t.add_output(address=sender, value=int(change))

        if compiled_memo:
            t.add_output(lock_script=compiled_memo, value=0)

        return t, utxos

    except Exception as err:
        raise Exception(str(err))
Пример #15
0
#
# Create transactions
#

print(
    "\n=== Create and sign transaction with add_input, add_output methods ===")
print(
    "(Based on http://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx/24580)"
)
t = Transaction()
prev_tx = 'f2b3eb2deb76566e7324307cd47c35eeb88413f971d88519859b1834307ecfec'
ki = Key(0x18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725,
         compressed=False)
t.add_input(prev_hash=prev_tx,
            output_n=1,
            keys=ki.public_hex,
            compressed=False)
t.add_output(99900000, '1runeksijzfVxyrpiyCY2LCBvYsSiFsCm')
t.sign(ki.private_byte)
pprint(t.as_dict())
print("Raw:", binascii.hexlify(t.raw()))
print("Verified %s " % t.verify())
print(t.raw_hex())

print(
    "\n=== Create and sign transaction with transactions Input and Output objects ==="
)
print(
    "(Based on http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html)"
)
ki = Key('5HusYj2b2x4nroApgfvaSfKYZhRbKFH41bVyPooymbC6KfgSXdD',