wallet_validator 0.3.2 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50fda8e35d98d0fecd2ac6f98cda91092635f638d5853032e913f46d43c02b75
4
- data.tar.gz: df7dd9eb4291bfae711c57f95e2aaeb777ebf028bef9bb0ea297e02cceb5b3b4
3
+ metadata.gz: f7bc70af1b4caba253c84ea04705eff11c6002215cafd2d5b071b9326ca6c07e
4
+ data.tar.gz: 3d7cc423b308d129efbfb7057f2e0d15f1ed9e761f4f617aa76681d425d7ac32
5
5
  SHA512:
6
- metadata.gz: 16197423414f5438763315bb3257ee3279c5add961efdcd8ad1fd052d24cad7bf8ff49703ac7e221864fb73a8f4e7677a54d782955982e13defdc0e69973f7a2
7
- data.tar.gz: 3bce9a5ae845aa0724835a840efcfafce23ffe656d4e5d0622bd02ff90080c10354f30768ad95d955b9b6d919ac82941bfc61880164528de5e4e45f6021f4920
6
+ metadata.gz: 78305694a1d3c3b61481ecfc3d3c4383dc2aa3177e6e1290c5171d2dbecafb6fc05c129ef6e5736cc795c55aa4816f08ad96def395ed49916a8f98e6bf969324
7
+ data.tar.gz: 99b17c3eff2ca7489c451419999f8adf0b9b61b13c39f2a6c5efb565f4a5bc2c6e19c6e11d70424ea2c48fc14c63f8cd70cedc15d4f55e039ac8973f32b51495
data/Gemfile CHANGED
@@ -5,4 +5,7 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
- gem "digest-sha3"
8
+ gem "digest-sha3"
9
+ gem "pry"
10
+ gem "base58"
11
+ gem "cbor"
data/Gemfile.lock CHANGED
@@ -1,13 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wallet_validator (0.3.1)
4
+ wallet_validator (0.4.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ base58 (0.2.3)
10
+ cbor (0.5.9.6)
11
+ coderay (1.1.3)
9
12
  diff-lcs (1.4.4)
10
13
  digest-sha3 (1.1.0)
14
+ method_source (1.0.0)
15
+ pry (0.14.1)
16
+ coderay (~> 1.1)
17
+ method_source (~> 1.0)
11
18
  rake (12.3.3)
12
19
  rspec (3.10.0)
13
20
  rspec-core (~> 3.10.0)
@@ -27,7 +34,10 @@ PLATFORMS
27
34
  ruby
28
35
 
29
36
  DEPENDENCIES
37
+ base58
38
+ cbor
30
39
  digest-sha3
40
+ pry
31
41
  rake (~> 12.0)
32
42
  rspec (~> 3.0)
33
43
  wallet_validator!
@@ -1,3 +1,6 @@
1
+ require "pry"
2
+ require "cbor"
3
+ require 'zlib'
1
4
 
2
5
  module WalletValidator
3
6
  class Ada < Btc
@@ -17,11 +20,31 @@ module WalletValidator
17
20
  }.freeze
18
21
 
19
22
  def valid?
20
- Crypto::Bech32.valid?(address, attribute["bech32"]["hrp"], attribute["bech32"]["separator"], attribute["bech32"]["length_check"])
23
+ valid_address_v1? || valid_address_shelley?
21
24
  end
22
25
 
23
26
  private
24
27
 
28
+ def valid_address_v1?
29
+ begin
30
+ decoded_baase58 = Crypto::Base58.base58_to_binary(address, "ADA")
31
+
32
+ tagged, valid_crc = CBOR.decode(decoded_baase58)
33
+
34
+ return false if !valid_crc.is_a?(Numeric)
35
+
36
+ crc = Zlib::crc32(tagged.value)
37
+
38
+ return crc == valid_crc
39
+ rescue
40
+ return false
41
+ end
42
+ end
43
+
44
+ def valid_address_shelley?
45
+ Crypto::Bech32.valid?(address, attribute["bech32"]["hrp"], attribute["bech32"]["separator"])
46
+ end
47
+
25
48
  def attribute
26
49
  is_testnet && CURRENCY_ATTR["testnet"] ? CURRENCY_ATTR["testnet"] : CURRENCY_ATTR["main"]
27
50
  end
@@ -12,16 +12,20 @@ module WalletValidator
12
12
  def valid?
13
13
  match = address.match(/^(.+):(.+)$/)
14
14
 
15
- return false unless match[1] == is_testnet ? "bchtest" : "bitcoincash"
15
+ if match
16
+ return false unless match[1] == is_testnet ? "bchtest" : "bitcoincash"
16
17
 
17
- prefix = is_testnet ? [2, 3, 8, 20, 5, 19, 20, 0] : [2, 9, 20, 3, 15, 9, 14, 3, 1, 19, 8, 0]
18
- raw_payload = match[2].split("").map { |m| Crypto::Bech32::CHARSET.index(m) }
19
- return false if bch_polymod(prefix + raw_payload) != 0 # raise "Address checksum invalid: #{cashaddress}"
18
+ prefix = is_testnet ? [2, 3, 8, 20, 5, 19, 20, 0] : [2, 9, 20, 3, 15, 9, 14, 3, 1, 19, 8, 0]
19
+ raw_payload = match[2].split("").map { |m| Crypto::Bech32::CHARSET.index(m) }
20
+ return false if bch_polymod(prefix + raw_payload) != 0 # raise "Address checksum invalid: #{cashaddress}"
20
21
 
21
- payload = bch_convert_bits(raw_payload[0..-9], 5, 8, false)
22
- return false if payload.empty? # raise "Converted payload was empty"
22
+ payload = bch_convert_bits(raw_payload[0..-9], 5, 8, false)
23
+ return false if payload.empty? # raise "Converted payload was empty"
23
24
 
24
- return true
25
+ return true
26
+ else
27
+ Btc.new(@address, @is_testnet).valid?
28
+ end
25
29
  end
26
30
 
27
31
  private
@@ -8,20 +8,18 @@ module WalletValidator
8
8
  "bech32" => {
9
9
  "hrp" => "bnb", # hrp
10
10
  "separator" => "1", # separator
11
- "length_check" => [38] # length check
12
11
  },
13
12
  },
14
13
  "testnet" => {
15
14
  "bech32" => {
16
15
  "hrp" => "tbnb", # hrp
17
16
  "separator" => "1", # separator
18
- "length_check" => [38] # length check
19
17
  }
20
18
  }
21
19
  }.freeze
22
20
 
23
21
  def valid?
24
- Crypto::Bech32.valid?(address, attribute["bech32"]["hrp"], attribute["bech32"]["separator"], attribute["bech32"]["length_check"])
22
+ Crypto::Bech32.valid?(address, attribute["bech32"]["hrp"], attribute["bech32"]["separator"])
25
23
  end
26
24
 
27
25
  private
@@ -37,7 +37,7 @@ module WalletValidator
37
37
 
38
38
  if filter_def
39
39
  # false時繼續往下
40
- return true if Crypto::Bech32.valid?(address, filter_def["hrp"], filter_def["separator"], filter_def["length_check"])
40
+ return true if Crypto::Bech32.valid?(address, filter_def["hrp"], filter_def["separator"])
41
41
  end
42
42
 
43
43
  filter = attribute["filter"]
@@ -3,10 +3,16 @@ module Crypto
3
3
  ALPHABET = {
4
4
  :flickr => "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", # This is the default
5
5
  :ripple => "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz",
6
+ :cardano => "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
6
7
  }.freeze
7
8
 
8
9
  def self.base58_to_binary(base58_val, currency)
9
- alphabet = currency.downcase == "xrp" ? ALPHABET[:ripple] : ALPHABET[:flickr]
10
+ alphabet = case currency.downcase
11
+ when "xrp"
12
+ ALPHABET[:ripple]
13
+ else
14
+ ALPHABET[:flickr]
15
+ end
10
16
 
11
17
  nzeroes = nil
12
18
  base58_val.chars.each_with_index do |c, index|
@@ -26,7 +32,14 @@ module Crypto
26
32
  end
27
33
 
28
34
  def self.base58_to_int(base58_val, currency)
29
- alphabet = currency.downcase == "xrp" ? ALPHABET[:ripple] : ALPHABET[:flickr]
35
+ alphabet = case currency.downcase
36
+ when "xrp"
37
+ ALPHABET[:ripple]
38
+ when "ada"
39
+ ALPHABET[:cardano]
40
+ else
41
+ ALPHABET[:flickr]
42
+ end
30
43
 
31
44
  int_val = 0
32
45
  base58_val.reverse.split(//).each_with_index do |char, index|
@@ -1,16 +1,13 @@
1
1
  module Crypto
2
2
  module Bech32
3
- LENGTH_CHECK_SET = [39, 59, 98].freeze
4
3
  CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l".split(//)
5
4
  GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3].freeze
6
5
 
7
- def self.valid?(address, hrp, separator, length_set = LENGTH_CHECK_SET)
8
- length_set ||= LENGTH_CHECK_SET # 歸正
6
+ def self.valid?(address, hrp, separator)
9
7
  address = address.downcase.strip
10
8
 
11
9
  match = address.match(/^#{hrp}#{separator}([\da-z]+)$/)
12
10
  return false if !match
13
- return false if !length_set.include?(match[1].length)
14
11
 
15
12
  pos = address.rindex(separator)
16
13
  return false if pos.nil? || pos < 1 || pos + 7 > address.length || address.length > 108
@@ -1,3 +1,3 @@
1
1
  module WalletValidator
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wallet_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-05 00:00:00.000000000 Z
11
+ date: 2021-10-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Write a longer description or delete this line.
14
14
  email: