# Buggy code
def make_cli_character(
    character_config,
    click_config,
    dev: bool = False,
    teacher_uri: str = None,
    min_stake: int = 0,
    **config_args,
):
    emitter = click_config.emitter

    #
    # Pre-Init
    #

    # Handle Keyring

    if not dev:
        character_config.attach_keyring()
        unlock_nucypher_keyring(
            emitter,
            character_configuration=character_config,
            password=get_nucypher_password(confirm=False),
        )

    # Handle Teachers
    teacher_nodes = load_seednodes(
        emitter,
        teacher_uris=[teacher_uri] if teacher_uri else None,
        min_stake=min_stake,
        federated_only=character_config.federated_only,
        network_domains=character_config.domains,
        network_middleware=character_config.network_middleware,
        registry=character_config.registry,
    )

    #
    # Character Init
    #

    # Produce Character
    try:
        CHARACTER = character_config(
            known_nodes=teacher_nodes,
            network_middleware=character_config.network_middleware,
            **config_args,
        )
    except CryptoError:
        raise character_config.keyring.AuthenticationFailed(
            "Failed to unlock keyring. Are you sure you provided the correct password?"
        )
    #
    # Post-Init
    #

    if CHARACTER.controller is not NO_CONTROL_PROTOCOL:
        CHARACTER.controller.emitter = (
            emitter  # TODO: set it on object creation? Or not set at all?
        )

    # Federated
    if character_config.federated_only:
        emitter.message("WARNING: Running in Federated mode", color="yellow")

    return CHARACTER


# 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 make_cli_character(
    character_config,
    click_config,
    unlock_keyring: bool = True,
    teacher_uri: str = None,
    min_stake: int = 0,
    load_preferred_teachers: bool = True,
    **config_args,
):
    emitter = click_config.emitter

    #
    # Pre-Init
    #

    # Handle Keyring

    if unlock_keyring:
        character_config.attach_keyring()
        unlock_nucypher_keyring(
            emitter,
            character_configuration=character_config,
            password=get_nucypher_password(confirm=False),
        )

    # Handle Teachers
    teacher_nodes = list()
    if load_preferred_teachers:
        teacher_nodes = load_seednodes(
            emitter,
            teacher_uris=[teacher_uri] if teacher_uri else None,
            min_stake=min_stake,
            federated_only=character_config.federated_only,
            network_domains=character_config.domains,
            network_middleware=character_config.network_middleware,
            registry=character_config.registry,
        )

    #
    # Character Init
    #

    # Produce Character
    try:
        CHARACTER = character_config(
            known_nodes=teacher_nodes,
            network_middleware=character_config.network_middleware,
            **config_args,
        )
    except CryptoError:
        raise character_config.keyring.AuthenticationFailed(
            "Failed to unlock keyring. Are you sure you provided the correct password?"
        )
    #
    # Post-Init
    #

    if CHARACTER.controller is not NO_CONTROL_PROTOCOL:
        CHARACTER.controller.emitter = (
            emitter  # TODO: set it on object creation? Or not set at all?
        )

    # Federated
    if character_config.federated_only:
        emitter.message("WARNING: Running in Federated mode", color="yellow")

    return CHARACTER