Skip to content

scriptpubkey_to_address() does not give clear error messages #354

@Randy808

Description

@Randy808

After attempting to use the library function scriptpubkey_to_address from the Python distribution, I got the error message ValueError: Invalid argument

This was the line I used to invoke the function:
wallycore.scriptpubkey_to_address(bytes([0x6a]), wallycore.WALLY_NETWORK_LIQUID)

I tried looking through the repo to see if there's any examples of scriptpubkey_to_address and didn't find much in the code aside from this (which linked the python call to 'wally_scriptpubkey_to_address'):

int ret = ::wally_scriptpubkey_to_address(scriptpubkey.data(), scriptpubkey.size(), network, output);

I did find an example in one of the commits matching the search result:
399906a#diff-a1dde0a251f92d169d953a7e3b12d4f97d98a5985abf5b1a0e48075c062e708c

The standalone example file in that commit can be found here (although it's not in master anymore):
https://github.com/ElementsProject/libwally-core/blob/399906aba358a16f05b233f619fa08aec6bfe116/src/swig_python/contrib/address.py

When I tried running this line using data from the test case it worked:
wallycore.scriptpubkey_to_address(wallycore.hex_to_bytes("76a914bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe88ac"), wallycore.WALLY_NETWORK_LIQUID)

So then I decided to look into the implementation for 'wally_scriptpubkey_to_address':

int wally_scriptpubkey_to_address(const unsigned char *scriptpubkey, size_t scriptpubkey_len,

There's a line that tries to determine the script 'type':

if ((ret = wally_scriptpubkey_get_type(scriptpubkey, scriptpubkey_len, &type)) != WALLY_OK) {

And then only processes the types WALLY_SCRIPT_TYPE_P2PKH and WALLY_SCRIPT_TYPE_P2SH

The function that gets the types ('wally_scriptpubkey_get_type') can be found here:

int wally_scriptpubkey_get_type(const unsigned char *bytes, size_t bytes_len,

Although a type is returned for OP_RETURN, it doesn't accept it in 'wally_scriptpubkey_to_address'

The error I get from the call could tell me it wasn't supported instead of the generic 'WALLY_EINVAL' that's returned as the default catch-all:

return WALLY_EINVAL;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions