def analyze_tx(tx_hex_string): output = {} # get op_return from transaction hex = unhexlify(tx_hex_string) deserializedTransaction = CTransaction.deserialize(hex) op_return_vout = deserializedTransaction.vout[1].scriptPubKey # get redeem script redeem_script = '' for i in op_return_vout: script = bytes(i).decode('utf8') if 'REDEEM' in script: redeem_script_string = script.replace('REDEEM SCRIPT ', '') output['redeemScript'] = redeem_script_string # convert redeem script into list redeemScript = CScript(unhexlify(redeem_script_string)) redeem_script_array = [] for i in redeemScript: redeem_script_array.append(i) # get redeem script hash (hodl address) p2sh_address = P2SHBitcoinAddress.from_redeemScript(redeemScript) output['hodlAddress'] = str(p2sh_address) # get nlocktime from redeem script nlocktime_hex = b2lx(redeem_script_array[0]) nlocktime = int(nlocktime_hex, 16) output['nLockTime'] = nlocktime # get authorized key from redeem script pubkey = b2x(redeem_script_array[3]) # get address from authorized key pubkey = unhexlify(pubkey) P2PKHBitcoinAddress = bitcoin.wallet.P2PKHBitcoinAddress addr = P2PKHBitcoinAddress.from_pubkey(pubkey) output['authorizedAddress'] = str(addr) # get total sent to hodl address locked_satoshis = 0 for i in deserializedTransaction.vout: if i.nValue > 0: sPK = i.scriptPubKey amount = i.nValue try: vout_p2sh_addr = P2SHBitcoinAddress.from_scriptPubKey(sPK) # rewards only paid to really locked funds if str(p2sh_address) == str(vout_p2sh_addr): locked_satoshis += amount except: pass output["lockedSatoshis"] = locked_satoshis return (output)
def P2SHAddress(self): return P2SHBitcoinAddress.from_scriptPubKey(self.scriptPubkey())