text: 'use strict'
  Object.defineProperty(exports, '__esModule', { value: true })
  var _version_1 = require('./_version')
  // Unknown Error
  exports.UNKNOWN_ERROR = 'UNKNOWN_ERROR'
  // Not implemented
  exports.NOT_IMPLEMENTED = 'NOT_IMPLEMENTED'
  // Missing new operator to an object
  //  - name: The name of the class
  exports.MISSING_NEW = 'MISSING_NEW'
  // Call exception
  //  - transaction: the transaction
  //  - address?: the contract address
  //  - args?: The arguments passed into the function
  //  - method?: The Solidity method signature
  //  - errorSignature?: The EIP848 error signature
  //  - errorArgs?: The EIP848 error parameters
  //  - reason: The reason (only for EIP848 "Error(string)")
  exports.CALL_EXCEPTION = 'CALL_EXCEPTION'
  // Invalid argument (e.g. value is incompatible with type) to a function:
  //   - argument: The argument name that was invalid
  //   - value: The value of the argument
  exports.INVALID_ARGUMENT = 'INVALID_ARGUMENT'
  // Missing argument to a function:
  //   - count: The number of arguments received
  //   - expectedCount: The number of arguments expected
  exports.MISSING_ARGUMENT = 'MISSING_ARGUMENT'
  // Too many arguments
  //   - count: The number of arguments received
  //   - expectedCount: The number of arguments expected
  exports.UNEXPECTED_ARGUMENT = 'UNEXPECTED_ARGUMENT'
  // Numeric Fault
  //   - operation: the operation being executed
  //   - fault: the reason this faulted
  exports.NUMERIC_FAULT = 'NUMERIC_FAULT'
  // Insufficien funds (< value + gasLimit * gasPrice)
  //   - transaction: the transaction attempted
  exports.INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS'
  // Nonce has already been used
  //   - transaction: the transaction attempted
  exports.NONCE_EXPIRED = 'NONCE_EXPIRED'
  // The replacement fee for the transaction is too low
  //   - transaction: the transaction attempted
  exports.REPLACEMENT_UNDERPRICED = 'REPLACEMENT_UNDERPRICED'
  // Unsupported operation
  //   - operation
  exports.UNSUPPORTED_OPERATION = 'UNSUPPORTED_OPERATION'
  var _permanentCensorErrors = false
  var _censorErrors = false
  // @TODO: Enum
  function throwError(message, code, params) {
      if (_censorErrors) {
          throw new Error('unknown error')
      }
      if (!code) {
          code = exports.UNKNOWN_ERROR
      }
      if (!params) {
          params = {}
      }
      var messageDetails = []
      Object.keys(params).forEach(function(key) {
          try {
              messageDetails.push(key + '=' + JSON.stringify(params[key]))
          }        catch (error) {
              messageDetails.push(key + '=' + JSON.stringify(params[key].toString()))
          }
      })
      messageDetails.push('version=' + _version_1.version)
      var reason = message
      if (messageDetails.length) {
          message += ' (' + messageDetails.join(', ') + ')'
      }
      // @TODO: Any??
      var error = new Error(message)
      error.reason = reason
      error.code = code
      Object.keys(params).forEach(function(key) {
          error[key] = params[key]
      })
      throw error
  }
  exports.throwError = throwError
  function checkNew(self, kind) {
      if (!(self instanceof kind)) {
          throwError('missing new', exports.MISSING_NEW, { name: kind.name })
      }
  }
  exports.checkNew = checkNew
  function checkArgumentCount(count, expectedCount, suffix) {
      if (!suffix) {
          suffix = ''
      }
      if (count < expectedCount) {
          throwError('missing argument' + suffix, exports.MISSING_ARGUMENT, { count: count, expectedCount: expectedCount })
      }
      if (count > expectedCount) {
          throwError('too many arguments' + suffix, exports.UNEXPECTED_ARGUMENT, { count: count, expectedCount: expectedCount })
      }
  }
  exports.checkArgumentCount = checkArgumentCount
  function setCensorship(censorship, permanent) {
      if (_permanentCensorErrors) {
          throwError('error censorship permanent', exports.UNSUPPORTED_OPERATION, { operation: 'setCensorship' })
      }
      _censorErrors = !!censorship
      _permanentCensorErrors = !!permanent
  }
  exports.setCensorship = setCensorship
  function checkNormalize() {
      try {
          // Make sure all forms of normalization are supported
          ['NFD', 'NFC', 'NFKD', 'NFKC'].forEach(function(form) {
              try {
                  'test'.normalize(form)
              }            catch (error) {
                  throw new Error('missing ' + form)
              }
          })
          if (String.fromCharCode(0xe9).normalize('NFD') !== String.fromCharCode(0x65, 0x0301)) {
              throw new Error('broken implementation')
          }
      }    catch (error) {
          throwError('platform missing String.prototype.normalize', exports.UNSUPPORTED_OPERATION, { operation: 'String.prototype.normalize', form: error.message })
      }
  }
  exports.checkNormalize = checkNormalize
  var LogLevels = { debug: 1, 'default': 2, info: 2, warn: 3, error: 4, off: 5 }
  var LogLevel = LogLevels['default']
  function setLogLevel(logLevel) {
      var level = LogLevels[logLevel]
      if (level == null) {
          warn('invliad log level - ' + logLevel)
          return
      }
      LogLevel = level
  }
  exports.setLogLevel = setLogLevel
  function log(logLevel, args) {
      if (LogLevel > LogLevels[logLevel]) {
          return
      }
      console.log.apply(console, args)
  }
  function warn() {
      var args = []
      for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i]
      }
      log('warn', args)
  }
  exports.warn = warn
  function info() {
      var args = []
      for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i]
      }
      log('info', args)
  }
  exports.info = info
  