coin-address-validators 0.0.4 → 0.0.9

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
  SHA1:
3
- metadata.gz: 638fba2600d5e49cc76c26aeed7da323568e0064
4
- data.tar.gz: f9741d00c2fbbf8d75d5d2d8da6a8e9128f3a9a0
3
+ metadata.gz: be268d5f5597596c7bf81a7e638d46dc4d84953b
4
+ data.tar.gz: 5b6e9de20cf5473682a9ea47452ded0433d0fcdb
5
5
  SHA512:
6
- metadata.gz: 6d3c7763b04e3c769e20be2080c31adcc21fcdda26fa8553a1c2be99233cc6c1b833f2788aaf5d0113a52b952b2b6abdf669f25f543d8aacfde5e40fce57ece9
7
- data.tar.gz: 97985c8319560e90f7614c26aa524d2528632884c483303a6d597a98c2427acd09d9e3dc26f07908e3871e6cc2dcf34406f9e145f4ee4b1459a2e726715faad1
6
+ metadata.gz: add60feda23e782ef43277c0cb564ecb6bd301931445ae075bc30e711bda5c16ab4ce7c4ad80592f3ba9e374b4f9465ebae42065da26ef393ef6191631db662f
7
+ data.tar.gz: 762f57c3e2d8803f88b6330ae591553753147a917c8ec2594fcb1117bd3a8a3df53cfec4dbe668ef5072586f10f106db9e46ebe3fb697a6557ba9004feef9cee
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coin-address-validators (0.0.4)
4
+ coin-address-validators (0.0.9)
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
@@ -94,4 +101,46 @@ 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
+ return false unless address.start_with?("T")
109
+ addr = BaseX::BitcoinBase58.decode(address)
110
+ return false unless addr.size == 25
111
+ return false unless addr.unpack1("H*").start_with?("41")
112
+
113
+ checksum = addr[-4..-1]
114
+ real_addr = addr[0..-5]
115
+
116
+ # TODO checksum properly
117
+ # hash0 = sha256(real_addr)
118
+ # hash1 = sha256(hash0)
119
+ # checksum1 = hash1[0..3]
120
+ # return (checksum[0] == checksum1[0] && checksum[1] == checksum1[1] && checksum[2] ==
121
+ # checksum1[2] && checksum[3] == checksum1[3])
122
+
123
+ return address == to_base58_address(real_addr.unpack1("H*"))
124
+ end
125
+
126
+ def to_base58_address(hex)
127
+ return "" unless hex
128
+
129
+ sha256ed = sha256(sha256(hex))
130
+ bytes = hex_str_to_bytes(hex) + hex_str_to_bytes(sha256ed).first(4)
131
+ Base58.encode(bytes_to_str(bytes).to_i(16), :bitcoin)
132
+ end
133
+
134
+ def hex_str_to_bytes(hex_str)
135
+ hex_str.scan(/../).map(&:hex)
136
+ end
137
+
138
+ def bytes_to_str(bytes)
139
+ bytes.pack("c*").unpack1("H*")
140
+ end
141
+
142
+ def sha256(hex_str)
143
+ Digest::SHA2.new(256).hexdigest([hex_str].pack("H*"))
144
+ end
145
+ end
97
146
  end
@@ -1,3 +1,3 @@
1
1
  class CoinAddressValidators
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.9"
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,19 +67,31 @@ 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
81
 
60
- describe "BchValidator" do
61
- describe "#parse_cash_addr" do
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
62
95
  context "invalid address" do
63
96
  it "handles gracefully" do
64
97
  legacy_address, ok = CoinAddressValidators["bch"].parse_cash_addr("ABC")
@@ -66,5 +99,7 @@ RSpec.describe CoinAddressValidators do
66
99
  end
67
100
  end
68
101
  end
102
+
69
103
  end
104
+
70
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.4
4
+ version: 0.0.9
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-10-12 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