def b58decode(v: String, out_size: Optional[int] = None) -> bytes: """Decode a Base58Check encoded bytes-like object or ASCII string. Optionally, it also ensures required output size. """ if isinstance(v, str): # do not trim spaces v = v.encode("ascii") result = _b58decode(v) if len(result) < 4: err_msg = "not enough bytes for checksum, " err_msg += f"invalid base58 decoded size: {len(result)}" raise BTClibValueError(err_msg) result, checksum = result[:-4], result[-4:] h256 = hash256(result) if checksum != h256[:4]: err_msg = f"invalid checksum: 0x{checksum.hex()} instead of 0x{h256[:4].hex()}" raise BTClibValueError(err_msg) if out_size is None or len(result) == out_size: return result err_msg = "valid checksum, invalid decoded size: " err_msg += f"{len(result)} bytes instead of {out_size}" raise BTClibValueError(err_msg)
def nulldata( cls: Type[_ScriptPubKey], data: String, check_validity: bool = True, ) -> _ScriptPubKey: "Return the nulldata ScriptPubKey of the provided data." if isinstance(data, str): # do not strip spaces data = data.encode() if len(data) > 80: err_msg = f"invalid nulldata payload length: {len(data)} bytes " raise BTClibValueError(err_msg) script = serialize(["OP_RETURN", data]) return cls(script, check_validity=check_validity)