coin-address-validators 0.0.4 → 0.0.9

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: 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