private static TransactionReceipt decodeTypedReceipt(
      final RLPInput rlpInput, final boolean revertReasonAllowed) {
    RLPInput input = rlpInput;
    final Bytes typedTransactionReceiptBytes = input.readBytes();
    TransactionType transactionType = TransactionType.of(typedTransactionReceiptBytes.get(0));
    input = new BytesValueRLPInput(typedTransactionReceiptBytes.slice(1), false);
    input.enterList();
    final RLPInput statusOrStateRoot = input.readAsRlp();
    final long cumulativeGas = input.readLongScalar();
    LogsBloomFilter bloomFilter = null;
    final boolean isCompacted = isNextNotBloomFilter(input);
    if (!isCompacted) {
      bloomFilter = LogsBloomFilter.readFrom(input);
    }
    final List<Log> logs = input.readList(logInput -> Log.readFrom(logInput, isCompacted));
    // if the receipt is compacted, we need to build the bloom filter from the logs
    if (isCompacted) {
      bloomFilter = LogsBloomFilter.builder().insertLogs(logs).build();
    }
    Optional<Bytes> revertReason = readMaybeRevertReason(input, revertReasonAllowed);
    input.leaveList();
    return createReceipt(
        transactionType, statusOrStateRoot, cumulativeGas, logs, bloomFilter, revertReason);
  }
Creates a transaction receipt for the given RLP

@param rlpInput the RLP-encoded transaction receipt
@param revertReasonAllowed whether the rlp input is allowed to have a revert reason
@return the transaction receipt
ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/receipt/TransactionReceiptDecoder.java