AdequateCryptoAddress
Simple wallet address validator and normalizer for cryptocurrencies addresses in Ruby.
Inspired by ognus/wallet-address-validator.
Installation
Add this line to your application's Gemfile:
gem 'adequate_crypto_address'
Or install it yourself as:
gem install adequate_crypto_address
Main API
.valid? (address, currency [, type = :prod])
Parameters
- address - Wallet address to validate.
- currency - Currency name string or symbol in any case,
:bitcoin
or 'BTC'
or :btc
or 'BitCoin'
- type - Optional. You can enforce validation with specific type. Not all currencies support types.
Returns true if the address (string) is a valid wallet address for the crypto currency specified, see below for supported currencies.
Supported crypto currencies
- Bitcoin/BTC,
'bitcoin'
or 'BTC'
types: :segwit_v0_keyhash :segwit_v0_scripthash :hash160 :p2sh
- BitcoinCash/BCH,
'bitcoincash'
or 'BCH'
types: :p2sh :p2pkh :p2pkhtest :p2shtest
- Dash,
'dash'
or 'DASH'
types: :prod :test
- Zcash/ZEC,
'zcash'
or 'ZEC'
types: :prod :test
- Ethereum/ETH,
'ethereum'
or 'ETH'
- Ripple/XRP,
'ripple'
or 'XRP'
- Toncoin,
'TON'
- Monero/XRM,
'monero'
Usage
Validation
require 'adequate_crypto_address'
AdequateCryptoAddress.valid?('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'BTC')
AdequateCryptoAddress.valid?('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', :bitcoin, :p2sh)
AdequateCryptoAddress.valid?('bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', :bch)
AdequateCryptoAddress.valid?('mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD', :BCH, :p2pkhtest)
AdequateCryptoAddress.valid?('0xde709f2102306220921060314715629080e2fb77', :ETH)
AdequateCryptoAddress.valid?('de709f2102306220921060314715629080e2fb77', :ethereum)
Normalization
*Not all currencies support this feature.
require 'adequate_crypto_address'
AdequateCryptoAddress.address('mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD', 'bch').cash_address
AdequateCryptoAddress.address('bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', 'bch').legacy_address
address_string = 'qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk'
addr = AdequateCryptoAddress.address(address_string, 'bch')
addr.prefix
addr.type
addr.address
AdequateCryptoAddress.address('D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', 'eth').address
ActiveRecord validation example
class Model < ActiveRecord::Base
attribute :address, :string
attribute :dest_tag, :string
attribute :currency, :string
validate :validate_address_type
validate :validate_destination_tag
def validate_address_type
errors.add(:address, 'invalid address') unless AdequateCryptoAddress.valid?(address, currency)
end
def validate_destination_tag
errors.add(:dest_tag, 'invalid destination tag') if dest_tag.present? && !(dest_tag =~ /\A\d{1,10}\z/)
end
end
Add your currnecy
module AdequateCryptoAddress
class Coin
attr_reader :address
def initialize(address_sring)
@address = address_sring
end
def valid?(_type)
address.present?
end
end
end
AdequateCryptoAddress.valid?('addr', :coin)
Development
Run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
Contributing
- Fork the repo
- Grab dependencies:
bundle install
- Make sure everything is working:
bundle exec rake spec
- Make your changes
- Test your changes
- Create a Pull Request
- Celebrate!!!!!
Notes
Bug reports and pull requests are welcome on GitHub at https://github.com/vtm9/adequate_crypto_address/issues