coins_address_validator 0.1.0

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: 409b4dd853df9b7869ff0ae28b68380175f01319
4
+ data.tar.gz: 604aa52440b8b4bbeccb179ddcb28532df75d446
5
+ SHA512:
6
+ metadata.gz: af6ba42856b06c5c39d3a72174946d1157ab9ac5bb0eac8bf8962d1ad2c1f36cc235e1c8ea5a2f11d8d202a50cdae60941195bf7a791db10217e9743d82a28fe
7
+ data.tar.gz: 5e31f243f491bf9bd561a988d91a4d5248293b941eea738927099639e17f931596c7dc3f58bf573905f24b7b4adba815d0328ffb19b9bfb512786c475a88c01e
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in coins_address_validator.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2015, Hothza
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # CoinsAddressValidator
2
+
3
+ This gem allows you to check if virtual coin address is valid and retrieve information about it.
4
+
5
+ Supported coins:
6
+ - Bitcoin (BTC),
7
+ - DASH (DASH),
8
+ - Dogecoin (DOGE),
9
+ - Litecoin (LTC),
10
+ - Namecoin (NMC),
11
+ - Peercoin (PPC),
12
+ - Primecoin (XPM)
13
+
14
+ If you find this gem useful please send few coins for coffee:
15
+
16
+ - BTC: 1HRqmR2dbuHKeNWp478W77NxLzPi63QoKi
17
+ - LTC: LUzmQEYEMHxh7Q8JWh3vjW2BYCGd8VxANF
18
+ - DASH: XtPu4gA71zMdp37x3XiYdG2U25UA85Gq1w
19
+
20
+ Thank you! :)
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ ```ruby
27
+ gem 'coins_address_validator'
28
+ ```
29
+
30
+ And then execute:
31
+
32
+ $ bundle
33
+
34
+ Or install it yourself as:
35
+
36
+ $ gem install coins_address_validator
37
+
38
+ ## Usage
39
+
40
+ This gem has two public methods:
41
+ ```ruby
42
+ is_address_valid?()
43
+ ```
44
+ which checks if address passed as a parameter is valid BASE58 string, has correct length
45
+ and checksum from decoded address is equal to first four bytes of SHA256(SHA256(h160))
46
+
47
+ Second one:
48
+ ```ruby
49
+ get_address_info()
50
+ ```
51
+ returns information about network (Bitcoin, Litecoin, etc.), network symbol and type of address.
52
+
53
+ ## Contributing
54
+
55
+ 1. Fork it ( https://github.com/Hothza/coins_address_validator/fork )
56
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
57
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
58
+ 4. Push to the branch (`git push origin my-new-feature`)
59
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "coins_address_validator"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'coins_address_validator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "coins_address_validator"
8
+ spec.version = CoinsAddressValidator::VERSION
9
+ spec.authors = ["Hothza"]
10
+ spec.email = ["hothza@users.noreply.github.com"]
11
+
12
+ # if spec.respond_to?(:metadata)
13
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
14
+ # end
15
+
16
+ spec.summary = %q{CoinsAddressValidator - gem which allows you to check if virtual coin address is valid and retrieve information about it.}
17
+ spec.homepage = "https://github.com/Hothza/coin_address_validator"
18
+ spec.license = "BSD"
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.8"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ end
@@ -0,0 +1,3 @@
1
+ module CoinsAddressValidator
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,156 @@
1
+ # Copyright (c) 2015, Hothza
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this
8
+ # list of conditions and the following disclaimer.
9
+ #
10
+ # * Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ require "coins_address_validator/version"
26
+ require 'base58'
27
+ require 'digest'
28
+
29
+ module CoinsAddressValidator
30
+ class Validator
31
+ def get_address_info(address)
32
+ if !address.nil? && !address.empty?
33
+ decoded = decode(address)
34
+ if has_valid_length?(address, decoded[:version].to_i(16)) && is_checksum_valid?(decoded)
35
+ info = NETWORKS[decoded[:version].to_i(16)]
36
+ info = {} if info.nil? # Version is not supported (yet) - return empty info for such coin
37
+
38
+ return { :valid => true, :info => info }
39
+ end
40
+ end
41
+ return { :valid => false, :info => {} }
42
+ end
43
+
44
+ def is_address_valid?(address)
45
+ if !address.nil? && !address.empty?
46
+ decoded = decode(address)
47
+ is_checksum_valid?(decoded) && has_valid_length?(address, decoded[:version].to_i(16))
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ private
54
+ NETWORKS = {
55
+ ## Bitcoin
56
+ 0x00 => { :name => 'Bitcoin', :network => 'mainnet', :symbol => 'BTC', :type => 'Pay-to-PubkeyHash' },
57
+ 0x05 => { :name => 'Bitcoin', :network => 'mainnet', :symbol => 'BTC', :type => 'Pay-to-Script-Hash' },
58
+ 0x6f => { :name => 'Bitcoin', :network => 'testnet3', :symbol => 'XTN', :type => 'Pay-to-PubkeyHash' },
59
+ 0xc4 => { :name => 'Bitcoin', :network => 'testnet3', :symbol => 'XTN', :type => 'Pay-to-Script-Hash' },
60
+
61
+ ## Litecoin
62
+ 0x30 => { :name => 'Litecoin', :network => 'mainnet', :symbol => 'LTC', :type => 'Pay-to-PubkeyHash' },
63
+
64
+ # Litecoin Multisig -> version will be changed after hard-fork
65
+ # to some number which gives 'M' character in address (probably: 0x31 - 0x33)
66
+
67
+ # 0x05 => { :name => 'Litecoin', :network => 'mainnet', :symbol => 'LTC', :type => 'Pay-to-Script-Hash' },
68
+
69
+ # Litecoin version will be changed probably in similar way like in mainnet
70
+
71
+ # 0x6f => { :name => 'Litecoin', :network => 'testnet', :symbol => 'XLT', :type => 'Pay-to-PubkeyHash' },
72
+ # 0xc4 => { :name => 'Litecoin', :network => 'testnet', :symbol => 'XLT', :type => 'Pay-to-Script-Hash' },
73
+
74
+ ## Dogecoin
75
+ 0x1e => { :name => 'Dogecoin', :network => 'mainnet', :symbol => 'DOGE', :type => 'Pay-to-PubkeyHash' },
76
+ 0x16 => { :name => 'Dogecoin', :network => 'mainnet', :symbol => 'DOGE', :type => 'Pay-to-Script-Hash' },
77
+ 0x71 => { :name => 'Dogecoin', :network => 'testnet', :symbol => 'XDT', :type => 'Pay-to-PubkeyHash' },
78
+ #{ 0xc4 => { :name => 'Dogecoin', :network => 'testnet', :symbol => 'XDT', :type => 'Pay-to-Script-Hash' },
79
+
80
+ ## DASH / DRK
81
+ 0x4c => { :name => 'DASH', :network => 'mainnet', :symbol => 'DASH', :type => 'Pay-to-PubkeyHash' },
82
+ 0x10 => { :name => 'DASH', :network => 'mainnet', :symbol => 'DASH', :type => 'Pay-to-Script-Hash' },
83
+ 0x8b => { :name => 'DASH', :network => 'testnet', :symbol => 'tDASH', :type => 'Pay-to-PubkeyHash' },
84
+ 0x13 => { :name => 'DASH', :network => 'testnet', :symbol => 'tDASH', :type => 'Pay-to-Script-Hash' },
85
+
86
+ ## Feathercoin
87
+ 0x0e => { :name => 'Feathercoin', :network => 'mainnet', :symbol => 'FTC', :type => 'Pay-to-PubkeyHash' },
88
+ 0x60 => { :name => 'Feathercoin', :network => 'mainnet', :symbol => 'FTC', :type => 'Pay-to-Script-Hash' },
89
+ 0x41 => { :name => 'Feathercoin', :network => 'testnet', :symbol => 'FTX', :type => 'Pay-to-PubkeyHash' },
90
+ #0xc4 => { :name => 'Feathercoin', :network => 'mainnet', :symbol => 'FTX', :type => 'Pay-to-Script-Hash' },
91
+
92
+ ## Namecoin
93
+ 0x34 => { :name => 'Namecoin', :network => 'mainnet', :symbol => 'NMC', :type => 'Pay-to-PubkeyHash' },
94
+ #0x6f => { :name => 'Namecoin', :network => 'testnet', :symbol => 'NMC', :type => 'Pay-to-PubkeyHash' },
95
+
96
+ ## Peercoin
97
+ 0x37 => { :name => 'Peercoin', :network => 'mainnet', :symbol => 'PPC', :type => 'Pay-to-PubkeyHash' },
98
+ 0x75 => { :name => 'Peercoin', :network => 'mainnet', :symbol => 'PPC', :type => 'Pay-to-Script-Hash' },
99
+
100
+ ## Primecoin
101
+ 0x17 => { :name => 'Primecoin', :network => 'mainnet', :symbol => 'XPM', :type => 'Pay-to-PubkeyHash' },
102
+ 0x53 => { :name => 'Primecoin', :network => 'mainnet', :symbol => 'XPM', :type => 'Pay-to-Script-Hash' },
103
+ }
104
+ BASE58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
105
+ LENGTH = BASE58.length
106
+
107
+ def is_checksum_valid?(decoded)
108
+ double_sha256 = (Digest::SHA256.new << (Digest::SHA256.new << [decoded[:h160]].pack('H*')).digest)
109
+ double_sha256.hexdigest[0, 8] == decoded[:checksum]
110
+ end
111
+
112
+ def has_valid_length?(address, version)
113
+ if version == 0
114
+ return address.length < 35
115
+ elsif version == 1
116
+ return address.length == 33
117
+ elsif version == 2
118
+ return address.length == 33 || address.length == 34
119
+ elsif version > 2 && version < 144
120
+ return address.length == 34
121
+ elsif version == 144
122
+ return address.length == 34 || address.length == 35
123
+ elsif version > 144 && version < 256
124
+ return address.length == 35
125
+ else
126
+ return false
127
+ end
128
+ end
129
+
130
+ def b58tos(string)
131
+ value = 0
132
+ prefix = 0
133
+ string.each_char do |char|
134
+ index = BASE58.index(char)
135
+ raise ArgumentError, 'String passed as a parameter is not a valid BASE58 string.' if index.nil?
136
+ value = (value * LENGTH) + index
137
+ if value == 0
138
+ prefix += 1
139
+ end
140
+ end
141
+
142
+ output = value.to_s(16)
143
+
144
+ # Stupid workaround for missing leading zeros
145
+ output = "0" + output if (output.length % 2) == 1
146
+
147
+ output = ("00" * prefix) + output if prefix > 0
148
+ output
149
+ end
150
+
151
+ def decode(string)
152
+ decoded = b58tos(string)
153
+ { :version => decoded[0, 2], :h160 => decoded[0, decoded.length - 8 ], :checksum => decoded[-8, decoded.length] }
154
+ end
155
+ end
156
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coins_address_validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hothza
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description:
42
+ email:
43
+ - hothza@users.noreply.github.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".travis.yml"
50
+ - Gemfile
51
+ - LICENSE
52
+ - README.md
53
+ - Rakefile
54
+ - bin/console
55
+ - bin/setup
56
+ - coins_address_validator.gemspec
57
+ - lib/coins_address_validator.rb
58
+ - lib/coins_address_validator/version.rb
59
+ homepage: https://github.com/Hothza/coin_address_validator
60
+ licenses:
61
+ - BSD
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.4.8
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: CoinsAddressValidator - gem which allows you to check if virtual coin address
83
+ is valid and retrieve information about it.
84
+ test_files: []