utils.js

/*
 * 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;