text: /*
   * Copyright ConsenSys Software Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
   * the License. You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
   * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
   * specific language governing permissions and limitations under the License.
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  const RLP = require("rlp");
  const _ = require("lodash");
  const { keccak256 } = require("./util/custom-ethjs-util");
  
  /**
   * @module utils
   */
  function Utils(web3) {
    /**
     * Generate a privacyGroupId
     * @function generatePrivacyGroup
     * @param {Object} options
     * @param {string} options.privateFor
     * @param {string} options.privateFrom
     *
     * @returns String
     */
    const generatePrivacyGroup = (options) => {
      const participants = _.chain(options.privateFor || [])
        .concat(options.privateFrom)
        .uniq()
        .map((publicKey) => {
          const buffer = Buffer.from(publicKey, "base64");
          let result = 1;
          buffer.forEach((value) => {
            // eslint-disable-next-line no-bitwise
            result = (31 * result + ((value << 24) >> 24)) & 0xffffffff;
          });
          return { b64: publicKey, buf: buffer, hash: result };
        })
        .sort((a, b) => {
          return a.hash - b.hash;
        })
        .map((x) => {
          return x.buf;
        })
        .value();
  
      const rlp = RLP.encode(participants);
  
      return Buffer.from(keccak256(rlp)).toString("base64");
    };
  
    /**
     * @function setPrivate
     * @param {String} rawTransaction
     * @return {Buffer} encoded data
     */
    const setPrivate = (rawTransaction) => {
      const decoded = RLP.decode(rawTransaction);
      const compareTo = Buffer.from("1c", "hex");
      if (decoded[6].compare(compareTo) === 0)
        decoded[6] = Buffer.from("26", "hex");
      else decoded[6] = Buffer.from("25", "hex");
      return RLP.encode(decoded);
    };
  
    Object.assign(web3.utils, {
      generatePrivacyGroup,
      setPrivate,
    });
    return web3;
  }
  module.exports = Utils;
  