adequate_crypto_address 0.1.11 → 0.2.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 +4 -4
- data/CHANGELOG.md +70 -0
- data/README.md +143 -29
- data/bin/console +0 -1
- data/lib/adequate_crypto_address/ada.rb +127 -0
- data/lib/adequate_crypto_address/altcoin.rb +30 -14
- data/lib/adequate_crypto_address/bch.rb +84 -30
- data/lib/adequate_crypto_address/btc.rb +86 -59
- data/lib/adequate_crypto_address/doge.rb +12 -0
- data/lib/adequate_crypto_address/eth.rb +8 -7
- data/lib/adequate_crypto_address/ltc.rb +45 -37
- data/lib/adequate_crypto_address/sol.rb +36 -0
- data/lib/adequate_crypto_address/ton.rb +54 -4
- data/lib/adequate_crypto_address/utils/bch.rb +8 -28
- data/lib/adequate_crypto_address/utils/bech32.rb +136 -107
- data/lib/adequate_crypto_address/utils/monero_base58.rb +60 -0
- data/lib/adequate_crypto_address/utils/xlm.rb +25 -0
- data/lib/adequate_crypto_address/version.rb +1 -1
- data/lib/adequate_crypto_address/xlm.rb +75 -0
- data/lib/adequate_crypto_address/xmr.rb +63 -15
- data/lib/adequate_crypto_address.rb +27 -4
- metadata +11 -43
- data/.coveralls.yml +0 -2
- data/.gitignore +0 -16
- data/.rspec +0 -3
- data/.rubocop.yml +0 -36
- data/.travis.yml +0 -13
- data/Gemfile +0 -12
- data/Makefile +0 -6
- data/Rakefile +0 -8
- data/adequate_crypto_address.gemspec +0 -25
- data/spec/adequate_crypto_address/bch_spec.rb +0 -77
- data/spec/adequate_crypto_address_spec.rb +0 -235
- data/spec/spec_helper.rb +0 -17
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require 'adequate_crypto_address/utils/bech32'
|
|
4
4
|
require 'adequate_crypto_address/utils/bch'
|
|
5
|
+
require 'adequate_crypto_address/utils/xlm'
|
|
6
|
+
require 'adequate_crypto_address/utils/monero_base58'
|
|
5
7
|
|
|
6
8
|
require 'adequate_crypto_address/altcoin'
|
|
7
9
|
require 'adequate_crypto_address/bch'
|
|
@@ -13,6 +15,10 @@ require 'adequate_crypto_address/zec'
|
|
|
13
15
|
require 'adequate_crypto_address/ltc'
|
|
14
16
|
require 'adequate_crypto_address/ton'
|
|
15
17
|
require 'adequate_crypto_address/xmr'
|
|
18
|
+
require 'adequate_crypto_address/doge'
|
|
19
|
+
require 'adequate_crypto_address/sol'
|
|
20
|
+
require 'adequate_crypto_address/xlm'
|
|
21
|
+
require 'adequate_crypto_address/ada'
|
|
16
22
|
|
|
17
23
|
module AdequateCryptoAddress
|
|
18
24
|
class UnknownCurrency < StandardError; end
|
|
@@ -23,12 +29,29 @@ module AdequateCryptoAddress
|
|
|
23
29
|
end
|
|
24
30
|
|
|
25
31
|
def address(address, currency)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
klass = currency_class(currency)
|
|
33
|
+
raise UnknownCurrency, "Wrong currency #{currency}" unless klass
|
|
34
|
+
|
|
35
|
+
klass.new(address)
|
|
29
36
|
end
|
|
30
37
|
|
|
38
|
+
# Public contract: returns the detected address type as a Symbol when the
|
|
39
|
+
# address is valid for the currency, or nil when it is not.
|
|
31
40
|
def address_type(address, currency)
|
|
32
|
-
|
|
41
|
+
address(address, currency).address_type
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Resolve a currency name (string or symbol, any case) to its validator class.
|
|
45
|
+
# Only classes defined directly on this module that implement the validator
|
|
46
|
+
# interface are eligible, so malformed input can never be mistaken for a
|
|
47
|
+
# currency and NoMethodError is never swallowed as UnknownCurrency.
|
|
48
|
+
def currency_class(currency)
|
|
49
|
+
const_name = currency.to_s.capitalize
|
|
50
|
+
return nil unless const_defined?(const_name, false)
|
|
51
|
+
|
|
52
|
+
klass = const_get(const_name)
|
|
53
|
+
return nil unless klass.is_a?(Class) && klass.method_defined?(:valid?)
|
|
54
|
+
|
|
55
|
+
klass
|
|
33
56
|
end
|
|
34
57
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: adequate_crypto_address
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- vtm
|
|
@@ -37,73 +37,41 @@ dependencies:
|
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
39
|
version: '1.3'
|
|
40
|
-
- !ruby/object:Gem::Dependency
|
|
41
|
-
name: rake
|
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
|
43
|
-
requirements:
|
|
44
|
-
- - "~>"
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: '13.2'
|
|
47
|
-
type: :development
|
|
48
|
-
prerelease: false
|
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
-
requirements:
|
|
51
|
-
- - "~>"
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: '13.2'
|
|
54
|
-
- !ruby/object:Gem::Dependency
|
|
55
|
-
name: rspec
|
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
|
57
|
-
requirements:
|
|
58
|
-
- - "~>"
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: '3.13'
|
|
61
|
-
type: :development
|
|
62
|
-
prerelease: false
|
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
-
requirements:
|
|
65
|
-
- - "~>"
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: '3.13'
|
|
68
40
|
description: Provides Ruby helpers to validate cryptocurrency addresses across common
|
|
69
41
|
chains.
|
|
70
42
|
executables: []
|
|
71
43
|
extensions: []
|
|
72
44
|
extra_rdoc_files: []
|
|
73
45
|
files:
|
|
74
|
-
-
|
|
75
|
-
- ".gitignore"
|
|
76
|
-
- ".rspec"
|
|
77
|
-
- ".rubocop.yml"
|
|
78
|
-
- ".travis.yml"
|
|
79
|
-
- Gemfile
|
|
46
|
+
- CHANGELOG.md
|
|
80
47
|
- LICENSE.txt
|
|
81
|
-
- Makefile
|
|
82
48
|
- README.md
|
|
83
|
-
- Rakefile
|
|
84
|
-
- adequate_crypto_address.gemspec
|
|
85
49
|
- bin/console
|
|
86
50
|
- lib/adequate_crypto_address.rb
|
|
51
|
+
- lib/adequate_crypto_address/ada.rb
|
|
87
52
|
- lib/adequate_crypto_address/altcoin.rb
|
|
88
53
|
- lib/adequate_crypto_address/bch.rb
|
|
89
54
|
- lib/adequate_crypto_address/btc.rb
|
|
90
55
|
- lib/adequate_crypto_address/dash.rb
|
|
56
|
+
- lib/adequate_crypto_address/doge.rb
|
|
91
57
|
- lib/adequate_crypto_address/eth.rb
|
|
92
58
|
- lib/adequate_crypto_address/ltc.rb
|
|
59
|
+
- lib/adequate_crypto_address/sol.rb
|
|
93
60
|
- lib/adequate_crypto_address/ton.rb
|
|
94
61
|
- lib/adequate_crypto_address/utils/bch.rb
|
|
95
62
|
- lib/adequate_crypto_address/utils/bech32.rb
|
|
63
|
+
- lib/adequate_crypto_address/utils/monero_base58.rb
|
|
64
|
+
- lib/adequate_crypto_address/utils/xlm.rb
|
|
96
65
|
- lib/adequate_crypto_address/version.rb
|
|
66
|
+
- lib/adequate_crypto_address/xlm.rb
|
|
97
67
|
- lib/adequate_crypto_address/xmr.rb
|
|
98
68
|
- lib/adequate_crypto_address/xrp.rb
|
|
99
69
|
- lib/adequate_crypto_address/zec.rb
|
|
100
|
-
- spec/adequate_crypto_address/bch_spec.rb
|
|
101
|
-
- spec/adequate_crypto_address_spec.rb
|
|
102
|
-
- spec/spec_helper.rb
|
|
103
70
|
homepage: https://github.com/vtm9/adequate_crypto_address
|
|
104
71
|
licenses:
|
|
105
72
|
- MIT
|
|
106
|
-
metadata:
|
|
73
|
+
metadata:
|
|
74
|
+
rubygems_mfa_required: 'true'
|
|
107
75
|
rdoc_options: []
|
|
108
76
|
require_paths:
|
|
109
77
|
- lib
|
|
@@ -118,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
118
86
|
- !ruby/object:Gem::Version
|
|
119
87
|
version: '0'
|
|
120
88
|
requirements: []
|
|
121
|
-
rubygems_version:
|
|
89
|
+
rubygems_version: 4.0.16
|
|
122
90
|
specification_version: 4
|
|
123
91
|
summary: Ruby helpers for validating cryptocurrency addresses.
|
|
124
92
|
test_files: []
|
data/.coveralls.yml
DELETED
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
require: rubocop-rspec
|
|
2
|
-
|
|
3
|
-
AllCops:
|
|
4
|
-
DisplayCopNames: true
|
|
5
|
-
|
|
6
|
-
Naming/AccessorMethodName:
|
|
7
|
-
Description: Check the naming of accessor methods for get_/set_.
|
|
8
|
-
Enabled: false
|
|
9
|
-
|
|
10
|
-
Style/DocumentationMethod:
|
|
11
|
-
RequireForNonPublicMethods: false
|
|
12
|
-
|
|
13
|
-
Documentation:
|
|
14
|
-
Enabled: false
|
|
15
|
-
|
|
16
|
-
Style/ClassAndModuleChildren:
|
|
17
|
-
Enabled: false
|
|
18
|
-
|
|
19
|
-
Style/NegatedIf:
|
|
20
|
-
Enabled: false
|
|
21
|
-
|
|
22
|
-
Metrics/LineLength:
|
|
23
|
-
Max: 120
|
|
24
|
-
|
|
25
|
-
Metrics/MethodLength:
|
|
26
|
-
Max: 30
|
|
27
|
-
|
|
28
|
-
Style/SymbolArray:
|
|
29
|
-
Enabled: true
|
|
30
|
-
EnforcedStyle: brackets
|
|
31
|
-
|
|
32
|
-
Style/StringLiterals:
|
|
33
|
-
EnforcedStyle: single_quotes
|
|
34
|
-
SupportedStyles:
|
|
35
|
-
- single_quotes
|
|
36
|
-
|
data/.travis.yml
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
language: ruby
|
|
3
|
-
sudo: false
|
|
4
|
-
cache: bundler
|
|
5
|
-
rvm:
|
|
6
|
-
- 2.5.1
|
|
7
|
-
before_install: gem install bundler -v 1.16.3
|
|
8
|
-
script: bundle exec rspec spec
|
|
9
|
-
notifications:
|
|
10
|
-
email:
|
|
11
|
-
- vtmilyakov@yandex.ru
|
|
12
|
-
after_success:
|
|
13
|
-
- CI=true TRAVIS=true coveralls --verbose
|
data/Gemfile
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
source 'https://rubygems.org'
|
|
4
|
-
|
|
5
|
-
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
|
6
|
-
|
|
7
|
-
gem 'coveralls', '>= 0.8.23', require: false
|
|
8
|
-
gem 'pry', require: false
|
|
9
|
-
|
|
10
|
-
gem 'rubocop-rspec'
|
|
11
|
-
# Specify your gem's dependencies in adequate_crypto_address.gemspec
|
|
12
|
-
gemspec
|
data/Makefile
DELETED
data/Rakefile
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
lib = File.expand_path('lib', __dir__)
|
|
4
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
|
-
require 'adequate_crypto_address/version'
|
|
6
|
-
|
|
7
|
-
Gem::Specification.new do |spec|
|
|
8
|
-
spec.name = 'adequate_crypto_address'
|
|
9
|
-
spec.version = AdequateCryptoAddress::VERSION
|
|
10
|
-
spec.authors = ['vtm']
|
|
11
|
-
|
|
12
|
-
spec.summary = 'Ruby helpers for validating cryptocurrency addresses.'
|
|
13
|
-
spec.description = 'Provides Ruby helpers to validate cryptocurrency addresses across common chains.'
|
|
14
|
-
spec.homepage = 'https://github.com/vtm9/adequate_crypto_address'
|
|
15
|
-
|
|
16
|
-
spec.license = 'MIT'
|
|
17
|
-
spec.required_ruby_version = '>= 3.0'
|
|
18
|
-
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
|
19
|
-
spec.require_paths = ['lib']
|
|
20
|
-
|
|
21
|
-
spec.add_dependency 'base58', '~> 0.2'
|
|
22
|
-
spec.add_dependency 'keccak', '~> 1.3'
|
|
23
|
-
spec.add_development_dependency 'rake', '~> 13.2'
|
|
24
|
-
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
25
|
-
end
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
RSpec.describe(AdequateCryptoAddress::Bch) do
|
|
4
|
-
let(:legacy_p2sh) { '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC' }
|
|
5
|
-
let(:legacy_p2pkh) { '155fzsEBHy9Ri2bMQ8uuuR3tv1YzcDywd4' }
|
|
6
|
-
let(:cashaddr_p2sh) { 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq' }
|
|
7
|
-
let(:cashaddr_p2pkh) { 'bitcoincash:qqkv9wr69ry2p9l53lxp635va4h86wv435995w8p2h' }
|
|
8
|
-
let(:cashaddr_p2pkh_testnet) { 'bchtest:qpqtmmfpw79thzq5z7s0spcd87uhn6d34uqqem83hf' }
|
|
9
|
-
let(:legacy_p2pkh_testnet) { 'mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD' }
|
|
10
|
-
let(:cashaddr_p2sh_testnet) { 'bchtest:pp8f7ww2g6y07ypp9r4yendrgyznysc9kqxh6acwu3' }
|
|
11
|
-
let(:legacy_p2sh_testnet) { '2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc' }
|
|
12
|
-
let(:mixed_case_cashadddr) { 'bitcoincash:qqkv9wr69ry2p9l53lxP635va4h86wv435995w8p2H' }
|
|
13
|
-
|
|
14
|
-
describe '#legacy_address' do
|
|
15
|
-
it 'converts legacy testnet p2pkh' do
|
|
16
|
-
expect(described_class.new(legacy_p2pkh_testnet).legacy_address).to eq(legacy_p2pkh_testnet)
|
|
17
|
-
expect(described_class.new(cashaddr_p2pkh_testnet).legacy_address).to eq(legacy_p2pkh_testnet)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it 'converts legacy testnet p2sh' do
|
|
21
|
-
expect(described_class.new(legacy_p2sh_testnet).legacy_address).to eq(legacy_p2sh_testnet)
|
|
22
|
-
expect(described_class.new(cashaddr_p2sh_testnet).legacy_address).to eq(legacy_p2sh_testnet)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it 'converts to legacy p2sh' do
|
|
26
|
-
expect(described_class.new(legacy_p2sh).legacy_address).to eq(legacy_p2sh)
|
|
27
|
-
expect(described_class.new(cashaddr_p2sh).legacy_address).to eq(legacy_p2sh)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'converts to legacy p2pkh' do
|
|
31
|
-
expect(described_class.new(legacy_p2pkh).legacy_address).to eq(legacy_p2pkh)
|
|
32
|
-
expect(described_class.new(cashaddr_p2pkh).legacy_address).to eq(legacy_p2pkh)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
context 'uppercase cashaddr address' do
|
|
36
|
-
it 'converts to legacy p2sh' do
|
|
37
|
-
expect(described_class.new(cashaddr_p2sh.upcase).legacy_address).to eq(legacy_p2sh)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it 'converts to legacy p2pkh' do
|
|
41
|
-
expect(described_class.new(cashaddr_p2pkh.upcase).legacy_address).to eq(legacy_p2pkh)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
context '#cash_address' do
|
|
47
|
-
it 'converts cash testnet p2pkh' do
|
|
48
|
-
expect(described_class.new(legacy_p2pkh_testnet).cash_address).to eq(cashaddr_p2pkh_testnet)
|
|
49
|
-
expect(described_class.new(cashaddr_p2pkh_testnet).cash_address).to eq(cashaddr_p2pkh_testnet)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'converts cash testnet p2sh' do
|
|
53
|
-
expect(described_class.new(legacy_p2sh_testnet).cash_address).to eq(cashaddr_p2sh_testnet)
|
|
54
|
-
expect(described_class.new(cashaddr_p2sh_testnet).cash_address).to eq(cashaddr_p2sh_testnet)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it 'converts to cash p2sh' do
|
|
58
|
-
expect(described_class.new(legacy_p2sh).cash_address).to eq(cashaddr_p2sh)
|
|
59
|
-
expect(described_class.new(cashaddr_p2sh).cash_address).to eq(cashaddr_p2sh)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it 'converts to cash p2pkh' do
|
|
63
|
-
expect(described_class.new(legacy_p2pkh).cash_address).to eq(cashaddr_p2pkh)
|
|
64
|
-
expect(described_class.new(cashaddr_p2pkh).cash_address).to eq(cashaddr_p2pkh)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
context 'uppercase cashaddr address' do
|
|
68
|
-
it 'converts to cash p2sh' do
|
|
69
|
-
expect(described_class.new(cashaddr_p2sh.upcase).cash_address).to eq(cashaddr_p2sh)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it 'converts to cash p2pkh' do
|
|
73
|
-
expect(described_class.new(cashaddr_p2pkh.upcase).cash_address).to eq(cashaddr_p2pkh)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
RSpec.describe(AdequateCryptoAddress) do
|
|
4
|
-
describe '.valid?' do
|
|
5
|
-
context 'Bitcoin' do
|
|
6
|
-
it 'validates hash160 addresses' do
|
|
7
|
-
expect(described_class).to be_valid('12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP', 'bitcoin')
|
|
8
|
-
expect(described_class).to be_valid('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'BTC')
|
|
9
|
-
expect(described_class).to be_valid('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'Bitcoin')
|
|
10
|
-
expect(described_class).to be_valid('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'btc')
|
|
11
|
-
expect(described_class).to be_valid('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'btc', :hash160)
|
|
12
|
-
|
|
13
|
-
# testnet
|
|
14
|
-
expect(described_class).to be_valid('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef', 'bitcoin', 'hash160test')
|
|
15
|
-
expect(described_class).to be_valid('mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB', :btc)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
it 'validates p2sh addresses' do
|
|
19
|
-
expect(described_class).to be_valid('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', 'BTC')
|
|
20
|
-
expect(described_class).to be_valid('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', 'bitcoin', 'p2sh')
|
|
21
|
-
|
|
22
|
-
# testnet
|
|
23
|
-
expect(described_class).to be_valid('2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7', 'btc')
|
|
24
|
-
expect(described_class).to be_valid('2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7', 'bitcoin', 'p2shtest')
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it 'validates segwit addresses' do
|
|
28
|
-
expect(described_class).to be_valid('BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4', 'BTC')
|
|
29
|
-
expect(described_class).to be_valid('bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', 'bitcoin')
|
|
30
|
-
expect(described_class).to be_valid('bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', 'bitcoin', :segwit_v0_keyhash)
|
|
31
|
-
expect(described_class).to be_valid('bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9', 'BTC')
|
|
32
|
-
expect(described_class).to be_valid('bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9', 'bitcoin', :segwit_v0_scripthash)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it 'validates taproot addresses' do
|
|
36
|
-
expect(described_class).to be_valid('bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr', 'bitcoin')
|
|
37
|
-
expect(described_class).to be_valid('bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr', 'BTC', :taproot)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it 'validates wrong addresses' do
|
|
41
|
-
expect(described_class).not_to be_valid('asdf', :bitcoin)
|
|
42
|
-
expect(described_class).not_to be_valid('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', 'bitcoin', :segwit_v0_keyhash)
|
|
43
|
-
expect(described_class).not_to be_valid('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', 'bitcoin', 'asdf')
|
|
44
|
-
expect(described_class).not_to be_valid('tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty', :bitcoin)
|
|
45
|
-
expect(described_class).not_to be_valid('bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5', 'bitcoin')
|
|
46
|
-
expect(described_class).not_to be_valid('BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2', 'bitcoin')
|
|
47
|
-
expect(described_class).not_to be_valid('bc1rw5uspcuh', 'bitcoin')
|
|
48
|
-
expect(described_class).not_to be_valid('bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90', 'bitcoin')
|
|
49
|
-
expect(described_class).not_to be_valid('BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P', 'bitcoin')
|
|
50
|
-
expect(described_class).not_to be_valid('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7', 'BTC')
|
|
51
|
-
expect(described_class).not_to be_valid('bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du', 'bitcoin')
|
|
52
|
-
expect(described_class).not_to be_valid('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv', 'Bitcoin')
|
|
53
|
-
expect(described_class).not_to be_valid('bc1gmk9yu', 'bitcoin')
|
|
54
|
-
expect(described_class).not_to be_valid('bc1p5d7rjq7g6rdk2yhzks9smlqfpuecypus6uf4e9qrsssrwc09', 'bitcoin') # invalid checksum
|
|
55
|
-
expect(described_class).not_to be_valid('bc1p5d7rjq7g6rdk2yhzks9smlqfpuecypus6uf4e9qrsssrwc0', 'bitcoin') # too short
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
context 'Bitcoincash' do
|
|
60
|
-
it 'validates legacy addresses' do
|
|
61
|
-
expect(described_class).to be_valid('3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC', :bch, :p2sh)
|
|
62
|
-
expect(described_class).to be_valid('155fzsEBHy9Ri2bMQ8uuuR3tv1YzcDywd4', 'bitcoincash', :p2pkh)
|
|
63
|
-
expect(described_class).to be_valid('2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc', 'BCH', :p2shtest)
|
|
64
|
-
expect(described_class).to be_valid('mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD', :BCH, :p2pkhtest)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it 'validates cash addresses' do
|
|
68
|
-
expect(described_class).to be_valid('bitcoincash:qqkv9wr69ry2p9l53lxp635va4h86wv435995w8p2h', :bch, :p2pkh)
|
|
69
|
-
expect(described_class).to be_valid('bitcoincash:pqdg9uq52wzhf228hweext9j2jdjgdpj9qt7xxfngd', :bitcoincash, :p2sh)
|
|
70
|
-
expect(described_class).to be_valid('bchtest:qpqtmmfpw79thzq5z7s0spcd87uhn6d34uqqem83hf', :Bitcoincash, :p2pkhtest)
|
|
71
|
-
expect(described_class).to be_valid('bchtest:pp8f7ww2g6y07ypp9r4yendrgyznysc9kqxh6acwu3', :BCH, :p2shtest)
|
|
72
|
-
expect(described_class).to be_valid('bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', :bitcoincash)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it 'validates cash addresses without prefix addresses' do
|
|
76
|
-
expect(described_class).to be_valid('qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', :bitcoincash)
|
|
77
|
-
expect(described_class).to be_valid('pqdg9uq52wzhf228hweext9j2jdjgdpj9qt7xxfngd', :bitcoincash, :p2sh)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it 'validates wrong addresses' do
|
|
81
|
-
expect(described_class).not_to be_valid('bitcoincash:qqkv9wr69ry2p9l53lxP635va4h86wv435995w8p2H', :bch)
|
|
82
|
-
expect(described_class).not_to be_valid('wrong', :bch)
|
|
83
|
-
expect(described_class).not_to be_valid('bitcoincash:wrong', :bch)
|
|
84
|
-
expect(described_class).not_to be_valid('bitcoincash:123', :bch)
|
|
85
|
-
|
|
86
|
-
expect(described_class).not_to be_valid('bitcoincash:qqkv9wr69ry2p9l53lxp635va4h86wv435995w8p2h', :bch, :p2pkhtest)
|
|
87
|
-
expect(described_class).not_to be_valid('bitcoincash:pqdg9uq52wzhf228hweext9j2jdjgdpj9qt7xxfngd', :bitcoincash, :p2pkhtest)
|
|
88
|
-
expect(described_class).not_to be_valid('bchtest:qpqtmmfpw79thzq5z7s0spcd87uhn6d34uqqem83hf', :Bitcoincash, :p2sh)
|
|
89
|
-
expect(described_class).not_to be_valid('bchtest:pp8f7ww2g6y07ypp9r4yendrgyznysc9kqxh6acwu3', :BCH, :p2sh)
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
context 'Ethereum' do
|
|
94
|
-
it 'validates addresses' do
|
|
95
|
-
expect(described_class).to be_valid('0xE37c0D48d68da5c5b14E5c1a9f1CFE802776D9FF', 'ethereum')
|
|
96
|
-
expect(described_class).to be_valid('0xa00354276d2fC74ee91e37D085d35748613f4748', :ethereum)
|
|
97
|
-
expect(described_class).to be_valid('0xAff4d6793F584a473348EbA058deb8caad77a288', :ETH)
|
|
98
|
-
expect(described_class).to be_valid('0xc6d9d2cd449a754c494264e1809c50e34d64562b', 'ETH')
|
|
99
|
-
expect(described_class).to be_valid('0x52908400098527886E0F7030069857D2E4169EE7', 'ETH')
|
|
100
|
-
expect(described_class).to be_valid('0x8617E340B3D01FA5F11F306F4090FD50E238070D', 'ETH')
|
|
101
|
-
expect(described_class).to be_valid('0xde709f2102306220921060314715629080e2fb77', 'ETH')
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it 'validates without prefixes addresses' do
|
|
105
|
-
expect(described_class).to be_valid('27b1fdb04752bbc536007a920d24acb045561c26', 'ETH')
|
|
106
|
-
expect(described_class).to be_valid('5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed', 'ETH')
|
|
107
|
-
expect(described_class).to be_valid('fB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', 'ETH')
|
|
108
|
-
expect(described_class).to be_valid('dbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB', 'ETH')
|
|
109
|
-
expect(described_class).to be_valid('D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', 'ETH')
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it 'validates wrong addresses' do
|
|
113
|
-
expect(described_class).not_to be_valid('wrong', :ETH)
|
|
114
|
-
expect(described_class).not_to be_valid('0xD1110A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', 'ETH')
|
|
115
|
-
expect(described_class).not_to be_valid('a10354276d2fC74ee91e37D085d35748613f4748', :ethereum)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
context 'Ripple' do
|
|
120
|
-
it 'validates addresses' do
|
|
121
|
-
expect(described_class).to be_valid('rPMLwSwyyULN2acf5JKB1nj8F8Eu8pVMV8', :ripple)
|
|
122
|
-
expect(described_class).to be_valid('rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn', :ripple)
|
|
123
|
-
expect(described_class).to be_valid('rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn', 'RIPPLE')
|
|
124
|
-
expect(described_class).to be_valid('r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV', 'XRP')
|
|
125
|
-
expect(described_class).to be_valid('rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', :XRP)
|
|
126
|
-
expect(described_class).to be_valid('rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN', 'XRP')
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it 'validates wrong addresses' do
|
|
130
|
-
expect(described_class).not_to be_valid('wrong', :xrp)
|
|
131
|
-
expect(described_class).not_to be_valid('r3kmLJN5D28dHuH8vZNUZpMC43pEHpaoc1', :xrp)
|
|
132
|
-
expect(described_class).not_to be_valid('r1kmLJN5D28dHuH8vZNUZpMC43pEHpaocV', 'ripple')
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
context 'Dash' do
|
|
137
|
-
it 'validates addresses' do
|
|
138
|
-
expect(described_class).to be_valid('Xx4dYKgz3Zcv6kheaqog3fynaKWjbahb6b', :dash)
|
|
139
|
-
expect(described_class).to be_valid('XcY4WJ6Z2Q8w7vcYER1JypC8s2oa3SQ1b1', 'DASH')
|
|
140
|
-
expect(described_class).to be_valid('XqMkVUZnqe3w4xvgdZRtZoe7gMitDudGs4', 'DASH', :prod)
|
|
141
|
-
expect(described_class).to be_valid('yPv7h2i8v3dJjfSH4L3x91JSJszjdbsJJA', :DASH, 'test')
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it 'validates wrong addresses' do
|
|
145
|
-
expect(described_class).not_to be_valid('wrong', :dash)
|
|
146
|
-
expect(described_class).not_to be_valid('yPv7h2i8v3dJ1fSH4L3x91JSJszjdbsJJA', :dash)
|
|
147
|
-
expect(described_class).not_to be_valid('XqMkVUZnqe3w4xvgdZRtZoe7gMitDudGs4', 'dash', :test)
|
|
148
|
-
expect(described_class).not_to be_valid('yPv7h2i8v3dJjfSH4L3x91JSJszjdbsJJA', :DASH, :prod)
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
context 'Zcash' do
|
|
153
|
-
it 'validates addresses' do
|
|
154
|
-
expect(described_class).to be_valid('t1U9yhDa5XEjgfnTgZoKddeSiEN1aoLkQxq', :zec)
|
|
155
|
-
expect(described_class).to be_valid('t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd', 'zcash', :prod)
|
|
156
|
-
expect(described_class).to be_valid('t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi', 'ZEC', :test)
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it 'validates wrong addresses' do
|
|
160
|
-
expect(described_class).not_to be_valid('wrong', :zec)
|
|
161
|
-
expect(described_class).not_to be_valid('t1Y9yhDa5XEjgfnTgZoKddeSiEN1aoLkQxq', :zcash)
|
|
162
|
-
expect(described_class).not_to be_valid('t3Yz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd', :ZEC)
|
|
163
|
-
expect(described_class).not_to be_valid('t2YNzUUx8mWBCRYPRezvA363EYXyEpHokyi', :zcash, :test)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
context 'Litecoin' do
|
|
168
|
-
it 'validates addresses' do
|
|
169
|
-
expect(described_class).to be_valid('LVg2kJoFNg45Nbpy53h7Fe1wKyeXVRhMH9', :ltc)
|
|
170
|
-
expect(described_class).to be_valid('LVg2kJoFNg45Nbpy53h7Fe1wKyeXVRhMH9', 'ltc', :prod)
|
|
171
|
-
expect(described_class).to be_valid('LTpYZG19YmfvY2bBDYtCKpunVRw7nVgRHW', 'LTC')
|
|
172
|
-
expect(described_class).to be_valid('Lb6wDP2kHGyWC7vrZuZAgV7V4ECyDdH7a6', 'Litecoin')
|
|
173
|
-
expect(described_class).to be_valid('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef', 'Litecoin', :test)
|
|
174
|
-
|
|
175
|
-
expect(described_class).to be_valid('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', 'LTC')
|
|
176
|
-
expect(described_class).to be_valid('2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7', 'LTC', :test)
|
|
177
|
-
expect(described_class).to be_valid('QW2SvwjaJU8LD6GSmtm1PHnBG2xPuxwZFy', 'LTC', :test)
|
|
178
|
-
expect(described_class).to be_valid('QjpzxpbLp5pCGsCczMbfh1uhC3P89QZavY', 'LTC', :test)
|
|
179
|
-
expect(described_class).to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC', :test)
|
|
180
|
-
expect(described_class).to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC')
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it 'validates wrong addresses' do
|
|
184
|
-
expect(described_class).not_to be_valid('wrong', :zec)
|
|
185
|
-
expect(described_class).not_to be_valid('t1Y9yhDa5XEjgfnTgZoKddeSiEN1aoLkQxq', :zcash)
|
|
186
|
-
expect(described_class).not_to be_valid('t3Yz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd', :ZEC)
|
|
187
|
-
expect(described_class).not_to be_valid('t2YNzUUx8mWBCRYPRezvA363EYXyEpHokyi', :zcash, :test)
|
|
188
|
-
expect(described_class).not_to be_valid('tltc1pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC', :prod)
|
|
189
|
-
expect(described_class).not_to be_valid('tltc1Pxdvk48nchp45mcg8pcht5ss8ladtxnl7mkr96lrw93q79g407ufqmelwuu', 'LTC')
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
context 'Toncoin' do
|
|
194
|
-
it 'validates addresses' do
|
|
195
|
-
expect(described_class).to be_valid('UQCScs4HjjwnlIFKIq_juiuLLLnjJKTjQyfcADjYNvdYwn-l', :TON)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it 'validates wrong addresses' do
|
|
199
|
-
expect(described_class).not_to be_valid('wrongFKIq_juiuLLLnjJKTjQyfcAD', :TON)
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
context 'Monero' do
|
|
204
|
-
it 'validates addresses' do
|
|
205
|
-
expect(described_class).to be_valid('4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57', :XMR)
|
|
206
|
-
expect(described_class).to be_valid('4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57', :monero)
|
|
207
|
-
expect(described_class).to be_valid('4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57', :Xmr)
|
|
208
|
-
expect(described_class).to be_valid('4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57', :xmr)
|
|
209
|
-
expect(described_class).to be_valid('4TZ76dT4mbsizsTtJzy7kYBo9f8xduc8wTsWb86pCmx5Cmh43CDxNS1FRcMrE3CNQ2ZT17vzCudc5TbNYBzizwqZFah5K1Js7VpL88qPSi', :monero)
|
|
210
|
-
expect(described_class).to be_valid('4TZ76dT4mbsizsTtJzy7kYBo9f8xduc8wTsWb86pCmx5Cmh43CDxNS1FRcMrE3CNQ2ZT17vzCudc5TbNYBzizwqZFah5K1Js7VpL88qPSi', :Xmr)
|
|
211
|
-
expect(described_class).to be_valid('4TZ76dT4mbsizsTtJzy7kYBo9f8xduc8wTsWb86pCmx5Cmh43CDxNS1FRcMrE3CNQ2ZT17vzCudc5TbNYBzizwqZFah5K1Js7VpL88qPSi', :Xmr)
|
|
212
|
-
expect(described_class).to be_valid('4TZ76dT4mbsizsTtJzy7kYBo9f8xduc8wTsWb86pCmx5Cmh43CDxNS1FRcMrE3CNQ2ZT17vzCudc5TbNYBzizwqZFah5K1Js7VpL88qPSi', :xmr)
|
|
213
|
-
expect(described_class).to be_valid('8BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQjpXCZedGfVQVmzCh57', :xmr)
|
|
214
|
-
expect(described_class).to be_valid('8TZ76dT4mbsizsTtJzy7kYBo9f8xduc8wTsWb86pCmx5Cmh43CDxNS1FRcMrE3CNQ2ZT17vzCudc5TbNYBzizwqZFah5K1Js7VpL88qPSi', :monero)
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it 'validates wrong addresses' do
|
|
218
|
-
expect(described_class).not_to be_valid('NOT_VALID_4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjp', :monero)
|
|
219
|
-
expect(described_class).not_to be_valid('NOT_VALID_4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjp', :Xmr)
|
|
220
|
-
expect(described_class).not_to be_valid('NOT_VALID_4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjp', :XMR)
|
|
221
|
-
expect(described_class).not_to be_valid('NOT_VALID_4BKnGLZNZ5pjpXCZedGfVQjpXCZedGfVQjp', :xmr)
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
describe '.address' do
|
|
227
|
-
it 'returns insance' do
|
|
228
|
-
expect(described_class.address('D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', 'eth')).to be_kind_of(AdequateCryptoAddress::Eth)
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
it 'raises UnknownCurrency with unknown currency' do
|
|
232
|
-
expect { described_class.address('addr', 'asdf') }.to raise_error(AdequateCryptoAddress::UnknownCurrency, /asdf/)
|
|
233
|
-
end
|
|
234
|
-
end
|
|
235
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'coveralls'
|
|
4
|
-
Coveralls.wear!
|
|
5
|
-
|
|
6
|
-
$LOAD_PATH.unshift File.dirname(__FILE__)
|
|
7
|
-
require 'rspec'
|
|
8
|
-
require 'adequate_crypto_address'
|
|
9
|
-
|
|
10
|
-
RSpec.configure do |config|
|
|
11
|
-
# Enable flags like --only-failures and --next-failure
|
|
12
|
-
config.example_status_persistence_file_path = '.rspec_status'
|
|
13
|
-
|
|
14
|
-
config.order = :random
|
|
15
|
-
config.filter_run :focus
|
|
16
|
-
config.run_all_when_everything_filtered = true
|
|
17
|
-
end
|