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
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 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
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
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 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
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
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): # 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
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
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
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
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))
# # 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',