Return contract proxies for the UserDepositContract and associated token

def get_udc_and_token(runner) -> Tuple[Optional[ContractProxy], Optional[ContractProxy]]:
    """ Return contract proxies for the UserDepositContract and associated token """
    from scenario_player.runner import ScenarioRunner
    assert isinstance(runner, ScenarioRunner)

    udc_config = runner.scenario.services.get('udc', {})

    if not udc_config.get('enable', False):
        return None, None

    udc_address = udc_config.get('address')
    if udc_address is None:
        contracts = get_contracts_deployment_info(
            chain_id=runner.chain_id,
            version=DEVELOPMENT_CONTRACT_VERSION,
        )
        udc_address = contracts['contracts'][CONTRACT_USER_DEPOSIT]['address']
    udc_abi = runner.contract_manager.get_contract_abi(CONTRACT_USER_DEPOSIT)
    udc_proxy = runner.client.new_contract_proxy(udc_abi, udc_address)

    ud_token_address = udc_proxy.contract.functions.token().call()
    # FIXME: We assume the UD token is a CustomToken (supporting the `mint()` function)
    custom_token_abi = runner.contract_manager.get_contract_abi(CONTRACT_CUSTOM_TOKEN)
    ud_token_proxy = runner.client.new_contract_proxy(custom_token_abi, ud_token_address)

    return udc_proxy, ud_token_proxy