Class: AddressCodec::Codec

Inherits:
Object
  • Object
show all
Defined in:
lib/address-codec/codec.rb

Direct Known Subclasses

XrpCodec

Instance Method Summary collapse

Constructor Details

#initializeCodec

Returns a new instance of Codec.



9
10
11
# File 'lib/address-codec/codec.rb', line 9

def initialize
  @codec = Core::Base58XRP.new
end

Instance Method Details

#decode(base58string, opts) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/address-codec/codec.rb', line 18

def decode(base58string, opts)
  versions = opts[:versions]
  types = opts[:version_types]

  without_sum = decode_checked(base58string)

  if versions.length > 1 && !opts[:expected_length]
    raise 'expected_length is required because there are >= 2 possible versions'
  end

  version_length_guess = versions[0].is_a?(Numeric) ? 1 : versions[0].length
  payload_length = opts[:expected_length] || without_sum.length - version_length_guess
  version_bytes = without_sum[0...-payload_length]
  payload = without_sum[-payload_length..-1]

  versions.each_with_index do |version, i|
    version = Array(version)
    if version_bytes == version
      return {
        version: version,
        bytes: payload,
        type: types ? types[i] : nil
      }
    end
  end

  raise 'version_invalid: version bytes do not match any of the provided version(s)'
end

#decode_checked(base58string) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/address-codec/codec.rb', line 52

def decode_checked(base58string)
  bytes = decode_raw(base58string)

  if bytes.length < 5
    raise 'invalid_input_size: decoded data must have length >= 5'
  end

  unless verify_check_sum(bytes)
    raise 'checksum_invalid'
  end

  bytes[0...-4]
end

#encode(bytes, opts) ⇒ Object



13
14
15
16
# File 'lib/address-codec/codec.rb', line 13

def encode(bytes, opts)
  versions = opts[:versions]
  encode_versioned(bytes, versions, opts[:expected_length])
end

#encode_checked(bytes) ⇒ Object



47
48
49
50
# File 'lib/address-codec/codec.rb', line 47

def encode_checked(bytes)
  check = sha256(sha256(bytes))[0, 4]
  encode_raw(bytes + check)
end