Skip to content

scriptpubkey_to_address() does not give clear error messages #354

Open
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions