class EIP55::Address

Attributes

address[R]

Public Class Methods

new(address) click to toggle source
# File lib/eip55/address.rb, line 6
def initialize address
  @address = Util.prefix(address)
end

Public Instance Methods

checksummed() click to toggle source
# File lib/eip55/address.rb, line 20
def checksummed
  raise InvalidAddressError.new("Invalid address: #{address}") unless matches_any_format?

  cased = unprefixed.chars.zip(checksum.chars).map do |char, check|
    check.match?(/[0-7]/) ? char.downcase : char.upcase
  end

  Util.prefix(cased.join)
end
valid?() click to toggle source
# File lib/eip55/address.rb, line 10
def valid?
  if !matches_any_format?
    false
  elsif not_checksummed?
    true
  else
    checksum_matches?
  end
end

Private Instance Methods

all_lowercase?() click to toggle source
# File lib/eip55/address.rb, line 50
def all_lowercase?
  address.match(/\A(?:0[xX])[a-f0-9]{40}\z/)
end
all_uppercase?() click to toggle source
# File lib/eip55/address.rb, line 46
def all_uppercase?
  address.match(/\A(?:0[xX])[A-F0-9]{40}\z/)
end
checksum() click to toggle source
# File lib/eip55/address.rb, line 58
def checksum
  Util.encode_hex(Util.keccak256(unprefixed.downcase))
end
checksum_matches?() click to toggle source
# File lib/eip55/address.rb, line 34
def checksum_matches?
  address == checksummed
end
matches_any_format?() click to toggle source
# File lib/eip55/address.rb, line 38
def matches_any_format?
  address.match(/\A(?:0[xX])[a-fA-F0-9]{40}\z/)
end
not_checksummed?() click to toggle source
# File lib/eip55/address.rb, line 42
def not_checksummed?
  all_uppercase? || all_lowercase?
end
unprefixed() click to toggle source
# File lib/eip55/address.rb, line 54
def unprefixed
  Util.unprefix(address)
end