adequate_crypto_address 0.1.9 → 0.1.11

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: cc3f7b31f03344b8164799a312194a5bb5dae5cf60534fd27b2b63ac2f34f71e
4
- data.tar.gz: 1d27ef4e6b5bfe339bded354851535180d2253abc669201821d156f2d4ef2208
3
+ metadata.gz: 6fee1d177fb87fdb5e97bb27ac01606349f567b99bd1d7f1a2553c8d6a17e1de
4
+ data.tar.gz: 7968e28889bc532c2705322a5d15ddeaf386c82f13fc41114bca6df0d375c49f
5
5
  SHA512:
6
- metadata.gz: 8a0605d3bf6f9a4a152d2a7eac314957c7144a866b8d15e102568cb620599aab118f7cbaa9ca0aad5a4c3c544abe3d547a5c5de7d05e0a225920c5e3a0036c70
7
- data.tar.gz: 1bbcd35c29eaea4834b245cfeba3c335b430430e2e84a18a9e216ded2a3e679bb3e04b569b42fc48fcdf600b43b20dac3f03255cc1e9644b65fa090ca45dcaf7
6
+ metadata.gz: 62df3006c3a130904b82d42cad6b94259fc6461dbdcbae0f0e0227716fccf0200aa6d6b698c7ae76ffde13fc85b23df993f20ddd2444f8a6e12648320c051f2f
7
+ data.tar.gz: bd5e6981b62cd15be7ccac5c9604865fa272d9bec754f2ba8ef4ed0dff9b6c3d4f6d1c31648b14c4cb7b64e244869a3b8808c6bf851b72a84c2cc2362ccd20bf
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source 'https://rubygems.org'
4
4
 
5
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
- gem 'coveralls', '>= 0.8.17', require: false
7
+ gem 'coveralls', '>= 0.8.23', require: false
8
8
  gem 'pry', require: false
9
9
 
10
10
  gem 'rubocop-rspec'
data/Makefile CHANGED
@@ -3,4 +3,4 @@ build:
3
3
  gem build adequate_crypto_address.gemspec
4
4
 
5
5
  push:
6
- gem push adequate_crypto_address-0.1.9.gem
6
+ gem push adequate_crypto_address-0.1.11.gem
@@ -9,16 +9,17 @@ Gem::Specification.new do |spec|
9
9
  spec.version = AdequateCryptoAddress::VERSION
10
10
  spec.authors = ['vtm']
11
11
 
12
- spec.summary = 'A Ruby Library for dealing with validation cryptocurrency adresses.'
13
- spec.description = 'A Ruby Library for dealing with validation cryptocurrency adresses.'
12
+ spec.summary = 'Ruby helpers for validating cryptocurrency addresses.'
13
+ spec.description = 'Provides Ruby helpers to validate cryptocurrency addresses across common chains.'
14
14
  spec.homepage = 'https://github.com/vtm9/adequate_crypto_address'
15
15
 
16
16
  spec.license = 'MIT'
17
+ spec.required_ruby_version = '>= 3.0'
17
18
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
18
19
  spec.require_paths = ['lib']
19
20
 
20
21
  spec.add_dependency 'base58', '~> 0.2'
21
22
  spec.add_dependency 'keccak', '~> 1.3'
22
- spec.add_development_dependency 'rake', '~> 13.0'
23
- spec.add_development_dependency 'rspec', '~> 3.10'
23
+ spec.add_development_dependency 'rake', '~> 13.2'
24
+ spec.add_development_dependency 'rspec', '~> 3.13'
24
25
  end
@@ -33,6 +33,8 @@ module AdequateCryptoAddress
33
33
  return :segwit_v0_keyhash if witness_version == 0 && witness_program.bytesize == 20
34
34
 
35
35
  return :segwit_v0_scripthash if witness_version == 0 && witness_program.bytesize == 32
36
+
37
+ return :taproot if witness_version == 1 && witness_program.bytesize == 32
36
38
  end
37
39
 
38
40
  base58_decoded = begin
@@ -72,6 +74,7 @@ module AdequateCryptoAddress
72
74
  length = program.size
73
75
  return nil if length < 2 || length > 40
74
76
  return nil if data[0] == 0 && length != 20 && length != 32
77
+ return nil if data[0] == 1 && length != 32
75
78
 
76
79
  program_hex = program.pack('C*').unpack('H*').first
77
80
  [data[0], program_hex]
@@ -3,6 +3,55 @@
3
3
  module AdequateCryptoAddress
4
4
  class Ltc < Altcoin
5
5
  ADDRESS_TYPES = { prod: %w[30 05 32], test: %w[6f c4 3a] }.freeze
6
+
7
+ private
8
+
9
+ def address_type
10
+ segwit_decoded = begin
11
+ decode_segwit_address
12
+ rescue StandardError
13
+ nil
14
+ end
15
+
16
+ if segwit_decoded
17
+ witness_version, witness_program_hex, hrp = segwit_decoded
18
+ witness_program = [witness_program_hex].pack('H*')
19
+
20
+ if witness_version == 0
21
+ return :prod if hrp == 'ltc' && [20, 32].include?(witness_program.bytesize)
22
+ return :test if hrp == 'tltc' && [20, 32].include?(witness_program.bytesize)
23
+ end
24
+
25
+ if witness_version == 1 && witness_program.bytesize == 32
26
+ return :prod if hrp == 'ltc'
27
+ return :test if hrp == 'tltc'
28
+ end
29
+ end
30
+
31
+ super
32
+ end
33
+
34
+ def decode_segwit_address
35
+ actual_hrp, data = Utils::Bech32.decode(address)
36
+
37
+ return nil if actual_hrp.nil?
38
+
39
+ length = data.size
40
+ return nil if length == 0 || length > 65
41
+ return nil unless %w[ltc tltc].include?(actual_hrp)
42
+ return nil if data[0] > 16
43
+
44
+ program = Utils::Bech32.convert_bits(data[1..-1], from_bits: 5, to_bits: 8, pad: false)
45
+ return nil if program.nil?
46
+
47
+ length = program.size
48
+ return nil if length < 2 || length > 40
49
+ return nil if data[0] == 0 && length != 20 && length != 32
50
+ return nil if data[0] == 1 && length != 32
51
+
52
+ program_hex = program.pack('C*').unpack('H*').first
53
+ [data[0], program_hex, actual_hrp]
54
+ end
6
55
  end
7
56
  Litecoin = Ltc
8
57
  end
@@ -121,7 +121,9 @@ module AdequateCryptoAddress
121
121
  end
122
122
 
123
123
  return nil if have_lower && have_upper
124
- return nil if chk != 1
124
+
125
+ # Accept both Bech32 (chk == 1) and Bech32m (chk == 0x2bc830a3)
126
+ return nil unless chk == 1 || chk == 0x2bc830a3
125
127
 
126
128
  [hrp.pack('C*'), data]
127
129
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AdequateCryptoAddress
4
- VERSION = '0.1.9'
4
+ VERSION = '0.1.11'
5
5
  end
@@ -29,7 +29,12 @@ RSpec.describe(AdequateCryptoAddress) do
29
29
  expect(described_class).to be_valid('bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', 'bitcoin')
30
30
  expect(described_class).to be_valid('bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', 'bitcoin', :segwit_v0_keyhash)
31
31
  expect(described_class).to be_valid('bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9', 'BTC')
32
- expect(described_class).to be_valid('bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9', 'bitcoin', 'segwit_v0_scripthash')
32
+ expect(described_class).to be_valid('bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9', 'bitcoin', :segwit_v0_scripthash)
33
+ end
34
+
35
+ it 'validates taproot addresses' do
36
+ expect(described_class).to be_valid('bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr', 'bitcoin')
37
+ expect(described_class).to be_valid('bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr', 'BTC', :taproot)
33
38
  end
34
39
 
35
40
  it 'validates wrong addresses' do
@@ -46,6 +51,8 @@ RSpec.describe(AdequateCryptoAddress) do
46
51
  expect(described_class).not_to be_valid('bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du', 'bitcoin')
47
52
  expect(described_class).not_to be_valid('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv', 'Bitcoin')
48
53
  expect(described_class).not_to be_valid('bc1gmk9yu', 'bitcoin')
54
+ expect(described_class).not_to be_valid('bc1p5d7rjq7g6rdk2yhzks9smlqfpuecypus6uf4e9qrsssrwc09', 'bitcoin') # invalid checksum
55
+ expect(described_class).not_to be_valid('bc1p5d7rjq7g6rdk2yhzks9smlqfpuecypus6uf4e9qrsssrwc0', 'bitcoin') # too short
49
56
  end
50
57
  end
51
58
 
@@ -169,6 +176,8 @@ RSpec.describe(AdequateCryptoAddress) do
169
176
  expect(described_class).to be_valid('2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7', 'LTC', :test)
170
177
  expect(described_class).to be_valid('QW2SvwjaJU8LD6GSmtm1PHnBG2xPuxwZFy', 'LTC', :test)
171
178
  expect(described_class).to be_valid('QjpzxpbLp5pCGsCczMbfh1uhC3P89QZavY', 'LTC', :test)
179
+ expect(described_class).to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC', :test)
180
+ expect(described_class).to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC')
172
181
  end
173
182
 
174
183
  it 'validates wrong addresses' do
@@ -176,6 +185,8 @@ RSpec.describe(AdequateCryptoAddress) do
176
185
  expect(described_class).not_to be_valid('t1Y9yhDa5XEjgfnTgZoKddeSiEN1aoLkQxq', :zcash)
177
186
  expect(described_class).not_to be_valid('t3Yz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd', :ZEC)
178
187
  expect(described_class).not_to be_valid('t2YNzUUx8mWBCRYPRezvA363EYXyEpHokyi', :zcash, :test)
188
+ expect(described_class).not_to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC', :prod)
189
+ expect(described_class).not_to be_valid('tltc1Pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC')
179
190
  end
180
191
  end
181
192
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adequate_crypto_address
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - vtm
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-09-14 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: base58
@@ -44,30 +43,30 @@ dependencies:
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: '13.0'
46
+ version: '13.2'
48
47
  type: :development
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: '13.0'
53
+ version: '13.2'
55
54
  - !ruby/object:Gem::Dependency
56
55
  name: rspec
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: '3.10'
60
+ version: '3.13'
62
61
  type: :development
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
- version: '3.10'
69
- description: A Ruby Library for dealing with validation cryptocurrency adresses.
70
- email:
67
+ version: '3.13'
68
+ description: Provides Ruby helpers to validate cryptocurrency addresses across common
69
+ chains.
71
70
  executables: []
72
71
  extensions: []
73
72
  extra_rdoc_files: []
@@ -105,7 +104,6 @@ homepage: https://github.com/vtm9/adequate_crypto_address
105
104
  licenses:
106
105
  - MIT
107
106
  metadata: {}
108
- post_install_message:
109
107
  rdoc_options: []
110
108
  require_paths:
111
109
  - lib
@@ -113,15 +111,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
113
111
  requirements:
114
112
  - - ">="
115
113
  - !ruby/object:Gem::Version
116
- version: '0'
114
+ version: '3.0'
117
115
  required_rubygems_version: !ruby/object:Gem::Requirement
118
116
  requirements:
119
117
  - - ">="
120
118
  - !ruby/object:Gem::Version
121
119
  version: '0'
122
120
  requirements: []
123
- rubygems_version: 3.2.22
124
- signing_key:
121
+ rubygems_version: 3.6.9
125
122
  specification_version: 4
126
- summary: A Ruby Library for dealing with validation cryptocurrency adresses.
123
+ summary: Ruby helpers for validating cryptocurrency addresses.
127
124
  test_files: []