public static BlockHeaderValidator.Builder mergeBlockHeaderValidator(final FeeMarket feeMarket) {

    if (!feeMarket.implementsBaseFee()) {
      return MainnetBlockHeaderValidator.createPgaBlockHeaderValidator(
          preMergeCalculator, PoWHasher.ETHASH_LIGHT);
    } else {
      var baseFeeMarket = (BaseFeeMarket) feeMarket;

      return new BlockHeaderValidator.Builder()
          .addRule(new AncestryValidationRule())
          .addRule(new GasUsageValidationRule())
          .addRule(
              new GasLimitRangeAndDeltaValidationRule(
                  MIN_GAS_LIMIT, Long.MAX_VALUE, Optional.of(baseFeeMarket)))
          .addRule(new TimestampBoundedByFutureParameter(TIMESTAMP_TOLERANCE_S))
          .addRule(new ExtraDataMaxLengthValidationRule(BlockHeader.MAX_EXTRA_DATA_BYTES))
          .addRule((new BaseFeeMarketBlockHeaderGasPriceValidationRule(baseFeeMarket)))
          .addRule(new ConstantOmmersHashRule())
          .addRule(new NoNonceRule())
          .addRule(new NoDifficultyRule())
          .addRule(new IncrementalTimestampRule());
    }
  }
Creates a set of rules which when executed will determine if a given block header is valid with
respect to its parent (or chain).

<p>Specifically the set of rules provided by this function are to be used for a Mainnet Merge
chain.

@param feeMarket the applicable {@link FeeMarket}
@return the header validator.
consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/MergeValidationRulesetFactory.java