public static ProtocolSchedule fromConfig(
      final GenesisConfigOptions config,
      final Optional<Boolean> isRevertReasonEnabled,
      final Optional<EvmConfiguration> evmConfiguration,
      final MiningConfiguration miningConfiguration,
      final BadBlockManager badBlockManager,
      final boolean isParallelTxProcessingEnabled,
      final MetricsSystem metricsSystem) {
    if (FixedDifficultyCalculators.isFixedDifficultyInConfig(config)) {
      return FixedDifficultyProtocolSchedule.create(
          config,
          isRevertReasonEnabled.orElse(false),
          evmConfiguration.orElse(EvmConfiguration.DEFAULT),
          miningConfiguration,
          badBlockManager,
          isParallelTxProcessingEnabled,
          metricsSystem);
    }
    return new ProtocolScheduleBuilder(
            config,
            Optional.of(DEFAULT_CHAIN_ID),
            ProtocolSpecAdapters.create(0, Function.identity()),
            isRevertReasonEnabled.orElse(false),
            evmConfiguration.orElse(EvmConfiguration.DEFAULT),
            miningConfiguration,
            badBlockManager,
            isParallelTxProcessingEnabled,
            metricsSystem)
        .createProtocolSchedule();
  }
Create a Mainnet protocol schedule from a config object

@param config {@link GenesisConfigOptions} containing the config options for the milestone
    starting points
@param isRevertReasonEnabled whether storing the revert reason is for failed transactions
@param evmConfiguration how to configure the EVMs jumpdest cache
@param miningConfiguration the mining parameters
@param badBlockManager the cache to use to keep invalid blocks
@param isParallelTxProcessingEnabled indicates whether parallel transaction is enabled
@param metricsSystem A metricSystem instance to expose metrics in the underlying calls
@return A configured mainnet protocol schedule
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSchedule.java