Module: Privy::Base58

Defined in:
lib/privy/base58.rb

Constant Summary collapse

ALPHABET =
"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
INDEX =
ALPHABET.chars.each_with_index.to_h.freeze

Class Method Summary collapse

Class Method Details

.decode(value) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/privy/base58.rb', line 22

def decode(value)
  integer = 0
  value.each_char do |char|
    digit = INDEX[char]
    raise ArgumentError, "invalid base58 character: #{char.inspect}" if digit.nil?

    integer = (integer * 58) + digit
  end

  bytes = []
  while integer.positive?
    bytes.unshift(integer & 0xff)
    integer >>= 8
  end

  leading_zeroes = value.each_char.take_while { |char| char == "1" }.length
  ("\x00".b * leading_zeroes) + bytes.pack("C*")
end

.encode(bytes) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/privy/base58.rb', line 10

def encode(bytes)
  integer = bytes.unpack1("H*").to_i(16)
  encoded = +""
  while integer.positive?
    integer, remainder = integer.divmod(58)
    encoded.prepend(ALPHABET[remainder])
  end

  leading_zeroes = bytes.bytes.take_while(&:zero?).length
  ("1" * leading_zeroes) + encoded
end