class AdequateCryptoAddress::Bitcoincash

Constants

DEFAULT_PREFIX
TYPE_MAP

Attributes

digest[R]
payload[R]
prefix[R]
raw_address[R]
type[R]

Public Class Methods

new(address) click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 31
def initialize(address)
  @raw_address = address
  normalize
end

Public Instance Methods

address()
Alias for: cash_address
address_type(address_code, address_type) click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 44
def address_type(address_code, address_type)
  TYPE_MAP[address_code].each do |mapping|
    return mapping if mapping.include?(address_type)
  end

  raise(AdequateCryptoAddress::InvalidAddress, 'Could not determine address type')
end
cash_address() click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 59
def cash_address
  type_int = address_type(:cash, type)[1]
  p = [type_int] + payload
  p = convertbits(p, 8, 5)
  checksum = calculate_cash_checksum(p)
  "#{prefix}:#{b32encode(p + checksum)}"
end
Also aliased as: address
legacy_address() click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 52
def legacy_address
  type_int = address_type(:legacy, type)[1]
  input = code_list_to_string([type_int] + payload + Array(digest))
  input += Digest::SHA256.digest(Digest::SHA256.digest(input))[0..3] unless digest
  Base58.binary_to_base58(input, :bitcoin)
end
valid?(validated_type = nil) click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 36
def valid?(validated_type = nil)
  if validated_type
    type == validated_type.to_sym
  else
    !type.nil?
  end
end

Private Instance Methods

from_cash_string() click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 81
def from_cash_string
  if (raw_address.upcase != raw_address) && (raw_address.downcase != raw_address)
    raise(InvalidCashAddress, 'Cash address contains uppercase and lowercase characters')
  end

  @raw_address = raw_address.downcase
  @raw_address = "#{DEFAULT_PREFIX}:#{raw_address}" if !raw_address.include?(':')

  @prefix, base32string = raw_address.split(':')
  decoded = b32decode(base32string)

  raise(InvalidCashAddress, 'Bad cash address checksum') if !verify_cash_checksum(decoded)

  converted = convertbits(decoded, 5, 8)
  @type = address_type(:cash, converted[0].to_i)[0]
  @payload = converted[1..-7]

  @type = :p2shtest if prefix == 'bchtest' && type == :p2sh
  @type = :p2pkhtest if prefix == 'bchtest' && type == :p2pkh
end
from_legacy_string() click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 102
def from_legacy_string
  decoded = nil
  begin
    decoded = Base58.base58_to_binary(raw_address, :bitcoin).bytes
  rescue StandardError
    raise(InvalidLegacyAddress, 'Could not decode legacy address')
  end

  @type = address_type(:legacy, decoded[0].to_i)[0]
  @payload = decoded[1..-5]
  @digest = decoded[-4..-1]
  @prefix = DEFAULT_PREFIX

  @type = :p2shtest if prefix == 'bchtest' && type == :p2sh
  @type = :p2pkhtest if prefix == 'bchtest' && type == :p2pkh
  @prefix = 'bchtest' if [:p2shtest, :p2pkhtest].include?(type)
end
normalize() click to toggle source
# File lib/adequate_crypto_address/bch.rb, line 71
def normalize
  begin
    from_cash_string
  rescue InvalidCashAddress
    from_legacy_string
  end
rescue AdequateCryptoAddress::InvalidAddress
  nil
end