coin-address-validators 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 39237dc4cfffa22cbf9e2706130e34b16b685ae8
4
+ data.tar.gz: 4ba01e5c580ceda5a47e30305c0fb3efacdc3ca2
5
+ SHA512:
6
+ metadata.gz: a7ac81e40649316e1adec1c8e92d4ee4ce17ffcd2f334d28c9dcf5af5d9dc58e8dc0a61e1c43f4ed642875839495cb537d85b1d4404c139f66175573640b8424
7
+ data.tar.gz: 0480aa904d2e2e407fbf862bab92bdd2fe4cf2dd320e3e1972c6914eafd5b040f7965cd047cad9a17ed217b0c307353a1c3ff728105aecd60f02f56f1176e4af
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .byebug_history
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in banking.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,59 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ coin-address-validators (0.0.1)
5
+ base_x
6
+ bitcoin-ruby
7
+ cashaddress
8
+ eth
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ base_x (0.8.1)
14
+ bitcoin-ruby (0.0.18)
15
+ byebug (9.0.6)
16
+ cashaddress (0.1.0)
17
+ diff-lcs (1.3)
18
+ digest-sha3 (1.1.0)
19
+ eth (0.4.8)
20
+ digest-sha3 (~> 1.1)
21
+ ffi (~> 1.0)
22
+ money-tree (~> 0.10.0)
23
+ rlp (~> 0.7.3)
24
+ scrypt (~> 3.0.5)
25
+ ffi (1.9.25)
26
+ ffi-compiler (1.0.1)
27
+ ffi (>= 1.0.0)
28
+ rake
29
+ money-tree (0.10.0)
30
+ ffi
31
+ rake (12.3.1)
32
+ rlp (0.7.3)
33
+ rspec (3.7.0)
34
+ rspec-core (~> 3.7.0)
35
+ rspec-expectations (~> 3.7.0)
36
+ rspec-mocks (~> 3.7.0)
37
+ rspec-core (3.7.1)
38
+ rspec-support (~> 3.7.0)
39
+ rspec-expectations (3.7.0)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.7.0)
42
+ rspec-mocks (3.7.0)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.7.0)
45
+ rspec-support (3.7.1)
46
+ scrypt (3.0.5)
47
+ ffi-compiler (>= 1.0, < 2.0)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ bundler (~> 1.7)
54
+ byebug
55
+ coin-address-validators!
56
+ rspec
57
+
58
+ BUNDLED WITH
59
+ 1.16.1
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'coin-address-validators/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "coin-address-validators"
8
+ spec.version = CoinAddressValidators::VERSION
9
+ spec.authors = ["Phuong Nguyen"]
10
+ spec.email = ["phuongnd08@gmail.com"]
11
+ spec.summary = %q{Validators for btc, bch, ltc, eth, xrp addresses}
12
+ spec.description = %q{Validators for btc, bch, ltc, eth, xrp addresses}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "bitcoin-ruby"
22
+ spec.add_dependency "base_x"
23
+ spec.add_dependency "cashaddress"
24
+ spec.add_dependency "eth"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.7"
27
+ spec.add_development_dependency("rspec", [">= 0"])
28
+ spec.add_development_dependency("byebug", [">= 0"])
29
+ end
@@ -0,0 +1,96 @@
1
+ require 'bitcoin'
2
+ require 'base_x'
3
+ require 'cashaddress'
4
+ require 'eth'
5
+
6
+ class CoinAddressValidators
7
+ require 'coin-address-validators/version'
8
+
9
+ attr_reader :coin
10
+
11
+ def initialize(coin)
12
+ @coin = coin
13
+ end
14
+
15
+ def valid?(address)
16
+ inner_validator.valid?(address)
17
+ end
18
+
19
+ def self.[](coin)
20
+ @singletons ||= {}
21
+ @singletons[coin] ||= new(coin)
22
+ end
23
+
24
+ private
25
+
26
+ def inner_validator
27
+ @inner_validator ||= inner_validator_class.new
28
+ end
29
+
30
+ def inner_validator_class
31
+ prefix = coin == "usdt" ? "btc" : coin
32
+ CoinAddressValidators.const_get("#{prefix.capitalize}Validator")
33
+ end
34
+
35
+ class BtcValidator
36
+ include Bitcoin::Util
37
+ def valid?(address)
38
+ valid_address?(address)
39
+ end
40
+ end
41
+
42
+ class LtcValidator
43
+ include Bitcoin::Util
44
+
45
+ def with_network(network)
46
+ old_network = Bitcoin.network[:project]
47
+ Bitcoin.network = network
48
+ yield
49
+ ensure
50
+ Bitcoin.network = old_network
51
+ end
52
+
53
+ def valid?(address)
54
+ with_network(:litecoin) { valid_address?(address) }
55
+ end
56
+ end
57
+
58
+ class XrpValidator
59
+ XRPBASE58 = BaseX.new("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz")
60
+
61
+ def valid?(address)
62
+ hex = XRPBASE58.decode(address).bth
63
+ addr = hex[0...-8]
64
+ checksum = hex[-8..-1]
65
+ Digest::SHA256.hexdigest(Digest::SHA256.digest(addr.htb))[0...8] == checksum
66
+ rescue BaseX::InvalidNumeral => e
67
+ false
68
+ end
69
+ end
70
+
71
+ class BchValidator
72
+ include Bitcoin::Util
73
+ def valid?(address)
74
+ return true if valid_address?(address)
75
+ begin
76
+ legacy_address = Cashaddress.to_legacy(address)
77
+ return true
78
+ rescue Cashaddress::Error
79
+ return false if address.start_with?("bitcoincash:")
80
+ begin
81
+ legacy_address = Cashaddress.to_legacy("bitcoincash:" + address)
82
+ return true
83
+ rescue Cashaddress::Error
84
+ return false
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ class EthValidator
91
+ def valid?(address)
92
+ Eth::Utils.valid_address? address
93
+ end
94
+ end
95
+
96
+ end
@@ -0,0 +1,3 @@
1
+ class CoinAddressValidators
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CoinAddressValidators do
4
+ context "btc" do
5
+ it "returns correctly" do
6
+ expect(CoinAddressValidators["btc"].valid?("14YoCUBKcrK3r8Hn7VxYGQ5bbfHf8qRtch")).to be_truthy
7
+ expect(CoinAddressValidators["btc"].valid?("14YoCUBKcrK3r8Hn7VxYGQ5bbfHf8qRtcg")).to be_falsey
8
+ end
9
+ end
10
+
11
+ context "bch" do
12
+ context "cashaddr format" do
13
+ it "returns correctly" do
14
+ expect(CoinAddressValidators["btc"].valid?("14YoCUBKcrK3r8Hn7VxYGQ5bbfHf8qRtch")).to be_truthy
15
+ expect(CoinAddressValidators["btc"].valid?("14YoCUBKcrK3r8Hn7VxYGQ5bbfHf8qRtcg")).to be_falsey
16
+ end
17
+ end
18
+
19
+ context "legacy format" do
20
+ it "returns correctly" do
21
+ expect(CoinAddressValidators["bch"].valid?("bitcoincash:qp85dztm50l8x0rdkr8laartkcygjpkkxg0qqf93kf")).to be_truthy
22
+ expect(CoinAddressValidators["bch"].valid?("qp85dztm50l8x0rdkr8laartkcygjpkkxg0qqf93kf")).to be_truthy
23
+
24
+ expect(CoinAddressValidators["bch"].valid?("bitcoincash:qp85dztm50l8x0rdkr8laartkcygjpkkxg0qqf93ka")).to be_falsey
25
+ end
26
+ end
27
+ end
28
+
29
+ context "eth" do
30
+ it "returns correctly" do
31
+ expect(CoinAddressValidators["eth"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f0833853")).to be_truthy
32
+ expect(CoinAddressValidators["eth"].valid?("0xff0a8531f38e5f143a0444d066fad0a0f08338534")).to be_falsey
33
+ end
34
+ end
35
+
36
+ context "ltc" do
37
+ it "returns correctly" do
38
+ expect(CoinAddressValidators["ltc"].valid?("LajyQBeZaBA1NkZDeY8YT5RYYVRkXMvb2T")).to be_truthy
39
+ expect(CoinAddressValidators["ltc"].valid?("M9k7JpqrWewzzQK8bPT2GFNzbijRHzDaU4")).to be_truthy
40
+ expect(CoinAddressValidators["ltc"].valid?("M9k7JpqrWewzzQK8bPT2GFNzbijRHzDaU5")).to be_falsey
41
+ end
42
+ end
43
+
44
+ context "xrp" do
45
+ it "returns correctly" do
46
+ expect(CoinAddressValidators["xrp"].valid?("r!!!")).to be_falsey
47
+ expect(CoinAddressValidators["xrp"].valid?("rQGwKPE63Mmi9QdswwxKkVUxp6joqFbjzm")).to be_falsey
48
+ expect(CoinAddressValidators["xrp"].valid?("rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC")).to be_truthy
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'byebug'
4
+ require 'coin-address-validators'
5
+
6
+ # Requires supporting ruby files with custom matchers and macros, etc,
7
+ # in spec/support/ and its subdirectories.
8
+ Dir[File.expand_path("./spec/support/**/*.rb")].each { |f| require f }
9
+
10
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
11
+ RSpec.configure do |config|
12
+ config.run_all_when_everything_filtered = true
13
+ config.filter_run :focus
14
+
15
+ # Run specs in random order to surface order dependencies. If you find an
16
+ # order dependency and want to debug it, you can fix the order by providing
17
+ # the seed, which is printed after each run.
18
+ # --seed 1234
19
+ config.order = 'random'
20
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coin-address-validators
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Phuong Nguyen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bitcoin-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: base_x
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cashaddress
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: eth
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Validators for btc, bch, ltc, eth, xrp addresses
112
+ email:
113
+ - phuongnd08@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - Gemfile.lock
121
+ - coin-address-validators.gemspec
122
+ - lib/coin-address-validators.rb
123
+ - lib/coin-address-validators/version.rb
124
+ - spec/lib/coin-address-validators_spec.rb
125
+ - spec/spec_helper.rb
126
+ homepage: ''
127
+ licenses:
128
+ - MIT
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.4.5.2
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Validators for btc, bch, ltc, eth, xrp addresses
150
+ test_files:
151
+ - spec/lib/coin-address-validators_spec.rb
152
+ - spec/spec_helper.rb