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 +4 -4
- data/Gemfile.lock +16 -10
- data/coin-address-validators.gemspec +1 -0
- data/lib/coin-address-validators.rb +50 -1
- data/lib/coin-address-validators/version.rb +1 -1
- data/spec/lib/coin-address-validators_spec.rb +38 -3
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be268d5f5597596c7bf81a7e638d46dc4d84953b
|
4
|
+
data.tar.gz: 5b6e9de20cf5473682a9ea47452ded0433d0fcdb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: add60feda23e782ef43277c0cb564ecb6bd301931445ae075bc30e711bda5c16ab4ce7c4ad80592f3ba9e374b4f9465ebae42065da26ef393ef6191631db662f
|
7
|
+
data.tar.gz: 762f57c3e2d8803f88b6330ae591553753147a917c8ec2594fcb1117bd3a8a3df53cfec4dbe668ef5072586f10f106db9e46ebe3fb697a6557ba9004feef9cee
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
coin-address-validators (0.0.
|
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.
|
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.
|
19
|
-
eth (0.4.
|
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.
|
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 (
|
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.
|
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.
|
65
|
+
1.17.3
|
@@ -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
|
@@ -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 "
|
61
|
-
|
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
|
+
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:
|
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.
|
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
|