const ethUtil = require('ethereumjs-util')
const assert = require('assert')
const BN = require('bn.js')
const {
  ENVIRONMENT_TYPE_POPUP,
  ENVIRONMENT_TYPE_NOTIFICATION,
  ENVIRONMENT_TYPE_FULLSCREEN,
  PLATFORM_FIREFOX,
  PLATFORM_OPERA,
  PLATFORM_CHROME,
  PLATFORM_EDGE,
  PLATFORM_BRAVE,
} = require('./enums')

/**
 * Generates an example stack trace
 *
 * @returns {string} A stack trace
 *
 */
function getStack () {
  const stack = new Error('Stack trace generator - not an error').stack
  return stack
}

/**
 * Used to determine the window type through which the app is being viewed.
 *  - 'popup' refers to the extension opened through the browser app icon (in top right corner in chrome and firefox)
 *  - 'responsive' refers to the main browser window
 *  - 'notification' refers to the popup that appears in its own window when taking action outside of metamask
 *
 * @returns {string} A single word label that represents the type of window through which the app is being viewed
 *
 */
const getEnvironmentType = (url = window.location.href) => {
  if (url.match(/popup.html(?:#.*)*$/)) {
    return ENVIRONMENT_TYPE_POPUP
  } else if (url.match(/home.html(?:\?.+)*$/) || url.match(/home.html(?:#.*)*$/)) {
    return ENVIRONMENT_TYPE_FULLSCREEN
  } else {
    return ENVIRONMENT_TYPE_NOTIFICATION
  }
}

/**
 * Returns the platform (browser) where the extension is running.
 *
 * @returns {string} the platform ENUM
 *
 */
const getPlatform = _ => {
  const ua = navigator.userAgent
  if (ua.search('Firefox') !== -1) {
    return PLATFORM_FIREFOX
  } else {
    if (window && window.chrome && window.chrome.ipcRenderer) {
      return PLATFORM_BRAVE
    } else if (ua.search('Edge') !== -1) {
      return PLATFORM_EDGE
    } else if (ua.search('OPR') !== -1) {
      return PLATFORM_OPERA
    } else {
      return PLATFORM_CHROME
    }
  }
}

/**
 * Checks whether a given balance of ETH, represented as a hex string, is sufficient to pay a value plus a gas fee
 *
 * @param {object} txParams Contains data about a transaction
 * @param {string} txParams.gas The gas for a transaction
 * @param {string} txParams.gasPrice The price per gas for the transaction
 * @param {string} txParams.value The value of ETH to send
 * @param {string} hexBalance A balance of ETH represented as a hex string
 * @returns {boolean} Whether the balance is greater than or equal to the value plus the value of gas times gasPrice
 *
 */
function sufficientBalance (txParams, hexBalance) {
  // validate hexBalance is a hex string
  assert.equal(typeof hexBalance, 'string', 'sufficientBalance - hexBalance is not a hex string')
  assert.equal(hexBalance.slice(0, 2), '0x', 'sufficientBalance - hexBalance is not a hex string')

  const balance = hexToBn(hexBalance)
  const value = hexToBn(txParams.value)
  const gasLimit = hexToBn(txParams.gas)
  const gasPrice = hexToBn(txParams.gasPrice)

  const maxCost = value.add(gasLimit.mul(gasPrice))
  return balance.gte(maxCost)
}

/**
 * Converts a BN object to a hex string with a '0x' prefix
 *
 * @param {BN} inputBn The BN to convert to a hex string
 * @returns {string} A '0x' prefixed hex string
 *
 */
function bnToHex (inputBn) {
  return ethUtil.addHexPrefix(inputBn.toString(16))
}

/**
 * Converts a hex string to a BN object
 *
 * @param {string} inputHex A number represented as a hex string
 * @returns {Object} A BN object
 *
 */
function hexToBn (inputHex) {
  return new BN(ethUtil.stripHexPrefix(inputHex), 16)
}

/**
 * Used to multiply a BN by a fraction
 *
 * @param {BN} targetBN The number to multiply by a fraction
 * @param {number|string} numerator The numerator of the fraction multiplier
 * @param {number|string} denominator The denominator of the fraction multiplier
 * @returns {BN} The product of the multiplication
 *
 */
function BnMultiplyByFraction (targetBN, numerator, denominator) {
  const numBN = new BN(numerator)
  const denomBN = new BN(denominator)
  return targetBN.mul(numBN).div(denomBN)
}

function applyListeners (listeners, emitter) {
  Object.keys(listeners).forEach((key) => {
    emitter.on(key, listeners[key])
  })
}

function removeListeners (listeners, emitter) {
  Object.keys(listeners).forEach((key) => {
    emitter.removeListener(key, listeners[key])
  })
}

module.exports = {
  removeListeners,
  applyListeners,
  getPlatform,
  getStack,
  getEnvironmentType,
  sufficientBalance,
  hexToBn,
  bnToHex,
  BnMultiplyByFraction,
}
9Q2'>branches/2019Q2</option>
<option value='branches/2019Q3'>branches/2019Q3</option>
<option value='branches/2019Q4'>branches/2019Q4</option>
<option value='branches/2020Q1'>branches/2020Q1</option>
<option value='branches/2020Q2'>branches/2020Q2</option>
<option value='branches/2020Q3'>branches/2020Q3</option>
<option value='branches/2020Q4'>branches/2020Q4</option>
<option value='branches/2021Q1'>branches/2021Q1</option>
<option value='branches/RELEASE_8_4_0'>branches/RELEASE_8_4_0</option>
<option value='branches/RELENG_2_1_0'>branches/RELENG_2_1_0</option>
<option value='branches/RELENG_2_2'>branches/RELENG_2_2</option>
<option value='branches/RELENG_9_1_0'>branches/RELENG_9_1_0</option>
<option value='branches/RELENG_9_2_0'>branches/RELENG_9_2_0</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15'>dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0'>dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2</option>
<option value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2' selected='selected'>dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2</option>
<option value='main'>main</option>
<option value='master'>master</option>
<option value='svn_head'>svn_head</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>FreeBSD Ports (https://github.com/freebsd/freebsd-ports)</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/about/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/refs/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/tree/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/diff/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/stats/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/Tools'>
<input type='hidden' name='h' value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'/><input type='hidden' name='id' value='041a24ea1dbae179a8345dc62f8abfbd5572d852'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852'>Tools</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=041a24ea1dbae179a8345dc62f8abfbd5572d852&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=dfe4da5d88f422135411affa3bb44732407dd68e'>note mark_safe.pl</a></td><td>pgollucci</td><td><span title='2009-05-17 19:40:16 +0800'>2009-05-17</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=3215c053f1fa57da6d818bd3ae5f4387b96d43b7'>o don't set anything in ports with NO_BUILD</a></td><td>pgollucci</td><td><span title='2009-05-17 19:12:24 +0800'>2009-05-17</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=7eeaa278412bad29703494bf0f0be75bfd8dbb08'>Do not mark rubygem ports, its a NO-OP</a></td><td>pgollucci</td><td><span title='2009-05-16 09:51:40 +0800'>2009-05-16</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+2</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=78a12f618af8cb51233a5904a3335422218a37ed'>Make previous commit work for both context and unified input patches.</a></td><td>itetcu</td><td><span title='2009-05-11 00:34:20 +0800'>2009-05-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=94310a90f76bf2e1340744490a6e3c7e540396fc'>When naming the split patch files, replace the original path '/' with '__'</a></td><td>itetcu</td><td><span title='2009-05-11 00:28:52 +0800'>2009-05-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=ac6fa5a23215742da4ec71003d9261f5919e4401'>- fix --port support</a></td><td>pgollucci</td><td><span title='2009-04-30 05:16:43 +0800'>2009-04-30</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=51dd7fa6eaf1553f8d057191417460f5d2f0ff22'>- Start some docs</a></td><td>pgollucci</td><td><span title='2009-04-30 05:08:53 +0800'>2009-04-30</span></td><td>1</td><td><span class='deletions'>-11</span>/<span class='insertions'>+93</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=0c79e308dda6a9353d805dd8558bfa7998d33fd9'>Script to set MAKE_JOBS_(UN)SAFE=   yes for a MAINTAINERs ports.</a></td><td>pgollucci</td><td><span title='2009-04-22 08:33:44 +0800'>2009-04-22</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+191</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=0cd385a62a8ed1de452dc10c21e63307fa2714a3'>Fix bug where number of error logs was incorrect.</a></td><td>linimon</td><td><span title='2009-03-26 18:38:44 +0800'>2009-03-26</span></td><td>1</td><td><span class='deletions'>-8</span>/<span class='insertions'>+9</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=e4a7bacaa858c0b7b82aa3cd609673a6ee746a84'>Rewrite of processlog by kris.</a></td><td>linimon</td><td><span title='2009-03-26 18:33:51 +0800'>2009-03-26</span></td><td>1</td><td><span class='deletions'>-84</span>/<span class='insertions'>+147</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=d4072e8fdb3ce65ab5816aaa4a9e632b581c152a'> - Add a new case 'nested-declaration' to catch errors on -current.</a></td><td>linimon</td><td><span title='2009-03-25 18:18:41 +0800'>2009-03-25</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=c139468f4156c59c216c58d5f201dddbec9238f2'>Use diff -p both when first creating and when updating a patch.</a></td><td>naddy</td><td><span title='2009-02-16 00:16:33 +0800'>2009-02-16</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=1ea60451aabfbbc481e83b496925df0c809824c5'>Remove 6-exp2 builds, they haven't been used in a while</a></td><td>pav</td><td><span title='2009-01-22 00:11:24 +0800'>2009-01-22</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=785be011fb410c0ab3bda564b50a63b10331a2f1'>Factor out the code that performs the PORTREVISION bump for one port.</a></td><td>gerald</td><td><span title='2009-01-08 05:33:17 +0800'>2009-01-08</span></td><td>1</td><td><span class='deletions'>-42</span>/<span class='insertions'>+47</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/Tools?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&amp;id=1b1fcbc58a52779bbae52bd66c5f10fae2b4bce0'>Reduce per branch code duplication</a></td><td>erwin</td><td><span title='2008-12-28 05:24:30 +0800'>2008-12-28</span></td><td>1</td><td><span class='deletions'>-41</span>/<span class='insertions'>+16</span></td></tr>
<tr>