# Buggy code
def retrieve(
    click_config,
    # API Options
    provider_uri,
    network,
    registry_filepath,
    checksum_address,
    dev,
    config_file,
    discovery_port,
    teacher_uri,
    min_stake,
    # Other
    label,
    policy_encrypting_key,
    alice_verifying_key,
    message_kit,
):
    """
    Obtain plaintext from encrypted data, if access was granted.
    """

    ### Setup ###
    _setup_emitter(click_config)

    bob_config = _get_bob_config(
        click_config,
        dev,
        provider_uri,
        network,
        registry_filepath,
        checksum_address,
        config_file,
        discovery_port,
    )
    #############

    BOB = actions.make_cli_character(
        character_config=bob_config,
        click_config=click_config,
        dev=dev,
        teacher_uri=teacher_uri,
        min_stake=min_stake,
    )

    # Validate
    if not all((label, policy_encrypting_key, alice_verifying_key, message_kit)):
        input_specification, output_specification = BOB.control.get_specifications(
            interface_name="retrieve"
        )
        required_fields = ", ".join(input_specification)
        raise click.BadArgumentUsage(
            f"{required_fields} are required flags to retrieve"
        )

    # Request
    bob_request_data = {
        "label": label,
        "policy_encrypting_key": policy_encrypting_key,
        "alice_verifying_key": alice_verifying_key,
        "message_kit": message_kit,
    }

    response = BOB.controller.retrieve(request=bob_request_data)
    return response


# Traceback (nucypher.blockchain.eth.interfaces.InterfaceError)
(nucypher) derek@derek-home-server:~/nucypher/forks/david/nucypher$ nucypher ursula run --teacher <teacher_uri> --interactive



,ggg,     	gg
dP""Y8a    	88                               	,dPYb,
Yb, `88    	88                               	IP'`Yb
`"  88    	88                               	I8  8I
88    	88                               	I8  8'
88    	88   ,gggggg,	,g, 	gg  	gg  I8 dP	,gggg,gg
88    	88   dP""""8I   ,8'8,	I8  	8I  I8dP	dP"  "Y8I
88    	88  ,8'	8I  ,8'  Yb   I8,	,8I  I8P	i8'	,8I
Y8b,____,d88,,dP 	Y8,,8'_   8) ,d8b,  ,d8b,,d8b,_ ,d8,   ,d8b,
"Y888888P"Y88P  	`Y8P' "YY8P8P8P'"Y88P"`Y88P'"Y88P"Y8888P"`Y8


the Untrusted Re-Encryption Proxy.


Enter password to unlock account 0x4a0A9e421B624410DAf3AF42707F7c5973a2C963:
Enter NuCypher keyring password:
Decrypting NuCypher keyring...
Starting Ursula on <my_ip>:9151
Connecting to goerli
Working ~ Keep Ursula Online!
Attached 0xf6B42791C096C94F92AA0938fA13C93B0eD1EB2A@<my_ip>:9151
⛰ ⚘ | Ivory Mountain DarkOrchid Flower

Type 'help' or '?' for help
Ursula(0xf6B4279) >>> confirm_activity
Unhandled Error
Traceback (most recent call last):
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/python/log.py", line 103, in callWithLogger
return callWithContext({"system": lp}, func, *args, **kw)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/python/log.py", line 86, in callWithContext
return context.call({ILogContext: newCtx}, func, *args, **kw)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/python/context.py", line 122, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/python/context.py", line 85, in callWithContext
return func(*args,**kw)
--- <exception caught here> ---
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
why = selectable.doRead()
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/internet/process.py", line 291, in doRead
return fdesc.readFromFD(self.fd, self.dataReceived)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/internet/fdesc.py", line 94, in readFromFD
callback(output)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/internet/process.py", line 295, in dataReceived
self.proc.childDataReceived(self.name, data)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/internet/_posixstdio.py", line 77, in childDataReceived
self.protocol.dataReceived(data)
File "/home/derek/.local/share/virtualenvs/nucypher-yyLOaW15/lib/python3.6/site-packages/twisted/protocols/basic.py", line 572, in dataReceived
why = self.lineReceived(line)
File "/home/derek/nucypher/forks/david/nucypher/nucypher/cli/processes.py", line 148, in lineReceived
self.__commands[line]()
File "/home/derek/nucypher/forks/david/nucypher/nucypher/cli/processes.py", line 183, in confirm_activity
return self.ursula.confirm_activity()
File "/home/derek/nucypher/forks/david/nucypher/nucypher/blockchain/eth/actors.py", line 70, in wrapped
return func(actor, *args, **kwargs)
File "/home/derek/nucypher/forks/david/nucypher/nucypher/blockchain/eth/actors.py", line 77, in wrapped
receipt = actor_method(self, *args, **kwargs)
File "/home/derek/nucypher/forks/david/nucypher/nucypher/blockchain/eth/actors.py", line 662, in confirm_activity
receipt = self.staking_agent.confirm_activity(worker_address=self.__worker_address)
File "/home/derek/nucypher/forks/david/nucypher/nucypher/blockchain/eth/agents.py", line 279, in confirm_activity
receipt = self.blockchain.send_transaction(contract_function=contract_function, sender_address=worker_address)
File "/home/derek/nucypher/forks/david/nucypher/nucypher/blockchain/eth/interfaces.py", line 353, in send_transaction
raise self.InterfaceError(str(READ_ONLY_INTERFACE))
nucypher.blockchain.eth.interfaces.InterfaceError: READ_ONLY_INTERFACE

# Fixed code
def retrieve(
    click_config,
    # API Options
    provider_uri,
    network,
    registry_filepath,
    checksum_address,
    dev,
    config_file,
    discovery_port,
    teacher_uri,
    min_stake,
    # Other
    label,
    policy_encrypting_key,
    alice_verifying_key,
    message_kit,
):
    """
    Obtain plaintext from encrypted data, if access was granted.
    """

    ### Setup ###
    _setup_emitter(click_config)

    bob_config = _get_bob_config(
        click_config,
        dev,
        provider_uri,
        network,
        registry_filepath,
        checksum_address,
        config_file,
        discovery_port,
    )
    #############

    BOB = actions.make_cli_character(
        character_config=bob_config,
        click_config=click_config,
        unlock_keyring=not dev,
        teacher_uri=teacher_uri,
        min_stake=min_stake,
    )

    # Validate
    if not all((label, policy_encrypting_key, alice_verifying_key, message_kit)):
        input_specification, output_specification = BOB.control.get_specifications(
            interface_name="retrieve"
        )
        required_fields = ", ".join(input_specification)
        raise click.BadArgumentUsage(
            f"{required_fields} are required flags to retrieve"
        )

    # Request
    bob_request_data = {
        "label": label,
        "policy_encrypting_key": policy_encrypting_key,
        "alice_verifying_key": alice_verifying_key,
        "message_kit": message_kit,
    }

    response = BOB.controller.retrieve(request=bob_request_data)
    return response