Source: primitives/address.js

/**
 * @file An Ethereum address.
 * @module primitives/address
 */

'use strict'

/**
 * Private members store.
 * @private
 */
const privs = new WeakMap()

/**
 * An Ethereum address.
 * @static
 */
class Address {
  /**
   * @param {string} hex - Hexadecimal representation of address.
   */
  constructor (hex) {
    // Validate arguments
    arg.addressHex(hex)

    const priv = {}
    privs.set(this, priv)
    priv.hex = hex
    priv.taints = null
  }

  /**
   * Hexadecimal representation.
   * @type {string}
   */
  get hex () {
    const priv = privs.get(this)
    const hex = priv.hex
    return hex
  }

  /**
   * All collected taint.
   * @type {Set<module:primitives/taint.Taint>}
   */
  get taints () {
    const priv = privs.get(this)
    const taints = priv.taints
    if (taints === null) {
      return new Set()
    } else {
      return new Set(taints)
    }
  }

  /**
   * Has any taint.
   * @type {boolean}
   */
  get tainted () {
    const priv = privs.get(this)
    const taints = priv.taints
    if (taints === null) {
      return false
    } else {
      return (taints.size !== 0)
    }
  }

  /**
   * Add taint item.
   * @param {module:primitives/taint.Taint} taint
   *     Taint item.
   * @return {module:primitives/address.Address}
   *     This instance for chaining.
   */
  addTaint (taint) {
    // Validate arguments
    arg.Taint(taint)

    const priv = privs.get(this)
    if (priv.taints === null) {
      priv.taints = new Set()
    }
    const taints = priv.taints
    taints.add(taint)
    return this
  }

  /**
   * Check whether has taint item.
   * @param {module:primitives/taint.Taint} taint
   *     Taint item.
   * @return {boolean} Whether has taint item.
   */
  hasTaint (taint) {
    // Validate arguments
    arg.Taint(taint)

    const priv = privs.get(this)
    const taints = priv.taints
    if (taints === null) {
      return false
    } else {
      return taints.has(taint)
    }
  }
}

// Expose
module.exports = Address

// Circular imports
const arg = require('../util/arg')