def validateGAAddr(result, wallet): if sys.version_info.major < 3: addrscript = CScript(binascii.unhexlify(result['script'])) else: addrscript = CScript(binascii.unhexlify(result['script'])) addrdata = [x for x in addrscript] assert(len(addrdata) == 5) if sys.version_info.major < 3: secondpkh = binascii.hexlify(addrdata[2]) else: secondpkh = binascii.hexlify(addrdata[2]) print("Second pubkey hash: %s" % secondpkh) m = addrdata[0] assert(m == 2) n = addrdata[3] assert(n==2) assert(addrdata[4] == OP_CHECKMULTISIG) hexsubkey = wallet.subkey(1).subkey(result['pointer']).public_copy().sec_as_hex() if sys.version_info.major < 3: addrfromapi = P2SHBitcoinAddress.from_redeemScript(CScript(binascii.unhexlify(result['script']))) else: addrfromapi = P2SHBitcoinAddress.from_redeemScript(CScript(binascii.unhexlify(result['script']))) assert(hexsubkey == secondpkh.decode('utf8')) return addrfromapi
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 syncWallet(result, wallet, gaitwallet, path): hexprivkey = wallet.subkey(1).subkey(result['pointer']).wif() hexpubkey = wallet.subkey(1).subkey(result['pointer']).public_copy().sec_as_hex() tproxy = Proxy() GAKey = gaitwallet.subkey(1).subkey_for_path(path).subkey(result['pointer']).sec_as_hex() addrfromapi = P2SHBitcoinAddress.from_redeemScript(CScript(binascii.unhexlify(result['script']))) print(addrfromapi) #tproxy.call("importprivkey", hexprivkey, "", False) print(tproxy.call("createmultisig", 2, [GAKey, hexpubkey])['address'])
def generate_multisig_address(redeemscript: str, testnet: bool = False) -> str: """ Generates a P2SH-multisig Bitcoin address from a redeem script Args: redeemscript: hex-encoded redeem script use generate_multisig_redeem_script to create the redeem script from three compressed public keys testnet: Should the address be testnet or mainnet? Example: TODO """ if testnet: bitcoin.SelectParams('testnet') redeem_script = CScript(bitcoin.core.x(redeemscript)) addr = P2SHBitcoinAddress.from_redeemScript(redeem_script) return str(addr)
def p2sh_addr(self): return P2SHBitcoinAddress.from_redeemScript(self.script)
def address(self): return P2SHBitcoinAddress.from_redeemScript(self.deposit_redeemScript)
def create_command(args): redeemScript = hodl_redeemScript(args.privkey, args.nLockTime) logging.debug('redeemScript: %s' % b2x(redeemScript)) addr = P2SHBitcoinAddress.from_redeemScript(redeemScript) print(addr)
def create_command(pubkey, nLockTime): redeemScript = hodl_redeemScript(pubkey, nLockTime) addr = P2SHBitcoinAddress.from_redeemScript(redeemScript) return ({'address': str(addr), 'redeemScript': b2x(redeemScript)})