coin-address-validators 0.0.3 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 56edfdfd7d5f1a470161a6b023912670965de8d8
4
- data.tar.gz: 9d11bd8bec9a018592e5fa10ad59e92133c2b74b
3
+ metadata.gz: f73bbd3f62b249dcc89e715efec732e1b363d7b2
4
+ data.tar.gz: f961e2560f281098dbd7d73ac8ef3c86a662de64
5
5
  SHA512:
6
- metadata.gz: 120653700405dc6acef33ea0dda46c1e68fe77ee923d480d516ed1535bc1f25fa9a5da73f33b4fa3f6a42f5719875ec41fe9263b9e2d028f762c51884734cc54
7
- data.tar.gz: 018b1bf5ad16408657d32d444b0d7cd5fe76a068c059a9794386d2c24d7ee30981041946ad1711f1b289b96e2040d196e581d7880495529dc7f8adfa46f7497a
6
+ metadata.gz: 553b95c7458d4fc5b6dea49e05a2ba1ea86bae35651da9c8bb781765e87c50d4b582dd598d1d18a9536f535b6c452d2316bea2ca59fc5f6e910139642d81c0ad
7
+ data.tar.gz: cf7161cc2931f83e6039eec2fb25074e4e8a819d15da12217c41872b34a0a6446b7101f8ca08ecaeb72cbddecef971415fb21e752dc55c7a620748008fbd1c98
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coin-address-validators (0.0.2)
4
+ coin-address-validators (0.0.8)
5
+ base58
5
6
  base_x
6
7
  bitcoin-ruby
7
8
  cashaddress
@@ -10,25 +11,30 @@ PATH
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
14
+ base58 (0.2.3)
13
15
  base_x (0.8.1)
14
- bitcoin-ruby (0.0.18)
16
+ bitcoin-ruby (0.0.20)
17
+ eventmachine
18
+ ffi
19
+ scrypt
15
20
  byebug (9.0.6)
16
21
  cashaddress (0.1.0)
17
22
  diff-lcs (1.3)
18
- digest-sha3 (1.1.0)
19
- eth (0.4.8)
20
- digest-sha3 (~> 1.1)
23
+ digest-sha3-patched (1.1.1)
24
+ eth (0.4.12)
25
+ digest-sha3-patched (~> 1.1)
21
26
  ffi (~> 1.0)
22
27
  money-tree (~> 0.10.0)
23
28
  rlp (~> 0.7.3)
24
- scrypt (~> 3.0.5)
25
- ffi (1.9.25)
29
+ scrypt (~> 3.0.6)
30
+ eventmachine (1.2.7)
31
+ ffi (1.13.1)
26
32
  ffi-compiler (1.0.1)
27
33
  ffi (>= 1.0.0)
28
34
  rake
29
35
  money-tree (0.10.0)
30
36
  ffi
31
- rake (12.3.1)
37
+ rake (13.0.1)
32
38
  rlp (0.7.3)
33
39
  rspec (3.7.0)
34
40
  rspec-core (~> 3.7.0)
@@ -43,7 +49,7 @@ GEM
43
49
  diff-lcs (>= 1.2.0, < 2.0)
44
50
  rspec-support (~> 3.7.0)
45
51
  rspec-support (3.7.1)
46
- scrypt (3.0.5)
52
+ scrypt (3.0.7)
47
53
  ffi-compiler (>= 1.0, < 2.0)
48
54
 
49
55
  PLATFORMS
@@ -56,4 +62,4 @@ DEPENDENCIES
56
62
  rspec
57
63
 
58
64
  BUNDLED WITH
59
- 1.16.1
65
+ 1.17.3
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "bitcoin-ruby"
22
22
  spec.add_dependency "base_x"
23
+ spec.add_dependency "base58"
23
24
  spec.add_dependency "cashaddress"
24
25
  spec.add_dependency "eth"
25
26
 
@@ -2,8 +2,10 @@ require 'bitcoin'
2
2
  require 'base_x'
3
3
  require 'cashaddress'
4
4
  require 'eth'
5
+ require 'base58'
5
6
 
6
7
  class CoinAddressValidators
8
+ TOKENS = %w[ret erct]
7
9
  require 'coin-address-validators/version'
8
10
 
9
11
  attr_reader :coin
@@ -17,6 +19,10 @@ class CoinAddressValidators
17
19
  inner_validator.valid?(address)
18
20
  end
19
21
 
22
+ def parse_cash_addr(address)
23
+ inner_validator.parse_cash_addr(address)
24
+ end
25
+
20
26
  def self.[](coin)
21
27
  @singletons ||= {}
22
28
  @singletons[coin] ||= new(coin)
@@ -30,6 +36,7 @@ class CoinAddressValidators
30
36
 
31
37
  def inner_validator_class
32
38
  prefix = coin == "usdt" ? "btc" : coin
39
+ prefix = TOKENS.include?(coin) ? "eth" : prefix
33
40
  CoinAddressValidators.const_get("#{prefix.capitalize}Validator")
34
41
  end
35
42
 
@@ -61,7 +68,7 @@ class CoinAddressValidators
61
68
 
62
69
  def valid?(address)
63
70
  hex = XRPBASE58.decode(address).bth
64
- addr = hex[0...-8]
71
+ addr = hex[0...-8].rjust(42, "0")
65
72
  checksum = hex[-8..-1]
66
73
  Digest::SHA256.hexdigest(Digest::SHA256.digest(addr.htb))[0...8] == checksum
67
74
  rescue BaseX::InvalidNumeral => e
@@ -77,7 +84,7 @@ class CoinAddressValidators
77
84
  else
78
85
  [Cashaddress.to_legacy("bitcoincash:#{address}"), true]
79
86
  end
80
- rescue Cashaddress::Error
87
+ rescue Cashaddress::Error, TypeError
81
88
  [nil, false]
82
89
  end
83
90
 
@@ -94,4 +101,45 @@ class CoinAddressValidators
94
101
  end
95
102
  end
96
103
 
104
+ class TrxValidator
105
+ def valid?(address)
106
+ return false unless address.is_a?(String)
107
+ return false unless address.size == 34
108
+ addr = BaseX::BitcoinBase58.decode(address)
109
+ return false unless addr.size == 25
110
+ return false unless addr.unpack1("H*").start_with?("41")
111
+
112
+ checksum = addr[-4..-1]
113
+ real_addr = addr[0..-5]
114
+
115
+ # TODO checksum properly
116
+ # hash0 = sha256(real_addr)
117
+ # hash1 = sha256(hash0)
118
+ # checksum1 = hash1[0..3]
119
+ # return (checksum[0] == checksum1[0] && checksum[1] == checksum1[1] && checksum[2] ==
120
+ # checksum1[2] && checksum[3] == checksum1[3])
121
+
122
+ return address == to_base58_address(real_addr.unpack1("H*"))
123
+ end
124
+
125
+ def to_base58_address(hex)
126
+ return "" unless hex
127
+
128
+ sha256ed = sha256(sha256(hex))
129
+ bytes = hex_str_to_bytes(hex) + hex_str_to_bytes(sha256ed).first(4)
130
+ Base58.encode(bytes_to_str(bytes).to_i(16), :bitcoin)
131
+ end
132
+
133
+ def hex_str_to_bytes(hex_str)
134
+ hex_str.scan(/../).map(&:hex)
135
+ end
136
+
137
+ def bytes_to_str(bytes)
138
+ bytes.pack("c*").unpack1("H*")
139
+ end
140
+
141
+ def sha256(hex_str)
142
+ Digest::SHA2.new(256).hexdigest([hex_str].pack("H*"))
143
+ end
144
+ end
97
145
  end
@@ -1,3 +1,3 @@
1
1
  class CoinAddressValidators
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -33,6 +33,27 @@ RSpec.describe CoinAddressValidators do
33
33
  end
34
34
  end
35
35
 
36
+ context "trx" do
37
+ it "returns correctly" do
38
+ expect(CoinAddressValidators["trx"].valid?("TVn8zgT7QsNdGtPnhk9PFPGevbCsH2EUds")).to be_truthy
39
+ expect(CoinAddressValidators["trx"].valid?("tVn8zgT7QsNdGtPnhk9PFPGevbCsH2EUds")).to be_falsey
40
+ end
41
+ end
42
+
43
+ context "ret token" do
44
+ it "returns correctly" do
45
+ expect(CoinAddressValidators["ret"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f0833853")).to be_truthy
46
+ expect(CoinAddressValidators["ret"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f08338534")).to be_falsey
47
+ end
48
+ end
49
+
50
+ context "erct token" do
51
+ it "returns correctly" do
52
+ expect(CoinAddressValidators["erct"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f0833853")).to be_truthy
53
+ expect(CoinAddressValidators["erct"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f08338534")).to be_falsey
54
+ end
55
+ end
56
+
36
57
  context "ltc" do
37
58
  it "returns correctly" do
38
59
  expect(CoinAddressValidators["ltc"].valid?("LajyQBeZaBA1NkZDeY8YT5RYYVRkXMvb2T")).to be_truthy
@@ -46,15 +67,39 @@ RSpec.describe CoinAddressValidators do
46
67
  expect(CoinAddressValidators["xrp"].valid?("r!!!")).to be_falsey
47
68
  expect(CoinAddressValidators["xrp"].valid?("rQGwKPE63Mmi9QdswwxKkVUxp6joqFbjzm")).to be_falsey
48
69
  expect(CoinAddressValidators["xrp"].valid?("rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC")).to be_truthy
70
+ expect(CoinAddressValidators["xrp"].valid?("rkbwLDZywoUVcjfrQzY7ccjSwnnXmJo6F")).to be_truthy
49
71
  end
50
72
  end
51
73
 
52
74
  context "nil address" do
53
- %w(btc bch eth ltc xrp).each do |coin|
75
+ %w(btc bch eth ltc xrp ret).each do |coin|
54
76
  it "returns false" do
55
77
  expect(CoinAddressValidators[coin].valid?(nil)).to be_falsey
56
78
  end
57
79
  end
58
80
  end
59
- end
60
81
 
82
+ describe "#parse_cash_addr" do
83
+
84
+ %w[btc eth trx ltc xrp erct usdt].each do |coin|
85
+ context "#{coin}Validator" do
86
+ it "raise error" do
87
+ expect do
88
+ CoinAddressValidators[coin].parse_cash_addr("ABC")
89
+ end.to raise_error(NoMethodError)
90
+ end
91
+ end
92
+ end
93
+
94
+ context "BchValidator" do
95
+ context "invalid address" do
96
+ it "handles gracefully" do
97
+ legacy_address, ok = CoinAddressValidators["bch"].parse_cash_addr("ABC")
98
+ expect(ok).to be_falsey
99
+ end
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coin-address-validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phuong Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-23 00:00:00.000000000 Z
11
+ date: 2020-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bitcoin-ruby
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: base58
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: cashaddress
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -144,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
158
  version: '0'
145
159
  requirements: []
146
160
  rubyforge_project:
147
- rubygems_version: 2.4.5.2
161
+ rubygems_version: 2.6.14.3
148
162
  signing_key:
149
163
  specification_version: 4
150
164
  summary: Validators for btc, bch, ltc, eth, xrp addresses