code: def get_udc_and_token(runner) -> Tuple[Optional[ContractProxy], Optional[ContractProxy]]:
      
      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
docs: Return contract proxies for the UserDepositContract and associated token