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_addressMain API
.valid? (address, currency [, type = :prod])
Parameters
- address - Wallet address to validate.
- currency - Currency name string or symbol in any case,
:bitcoinor'BTC'or:btcor'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'
# BTC
AdequateCryptoAddress.valid?('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y', 'BTC') #=> true
AdequateCryptoAddress.valid?('3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt', :bitcoin, :p2sh) #=> true
# BCH
AdequateCryptoAddress.valid?('bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', :bch) #=> true
AdequateCryptoAddress.valid?('mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD', :BCH, :p2pkhtest) #=> true
# ETH
AdequateCryptoAddress.valid?('0xde709f2102306220921060314715629080e2fb77', :ETH) #=> true
AdequateCryptoAddress.valid?('de709f2102306220921060314715629080e2fb77', :ethereum) #=> trueNormalization
*Not all currencies support this feature.
require 'adequate_crypto_address'
# BCH
AdequateCryptoAddress.address('mmRH4e9WW4ekZUP5HvBScfUyaSUjfQRyvD', 'bch').cash_address #=> "bchtest:qpqtmmfpw79thzq5z7s0spcd87uhn6d34uqqem83hf"
AdequateCryptoAddress.address('bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk', 'bch').legacy_address #=> "1LcerwTc1oPsMtByDCNUXFxReZpN1EXHoe"
address_string = 'qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk'
addr = AdequateCryptoAddress.address(address_string, 'bch')
addr.prefix #=> "bitcoincash"
addr.type #=> :p2pkh
addr.address #=> "bitcoincash:qrtj3rd8524cndt2eew3s6wljqggmne00sgh4kfypk"
# ETH
AdequateCryptoAddress.address('D1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', 'eth').address #=> "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"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
# for Ripple
def validate_destination_tag
errors.add(:dest_tag, 'invalid destination tag') if dest_tag.present? && !(dest_tag =~ /\A\d{1,10}\z/)
end
endAdd your currnecy
# frozen_string_literal: true
# for Rails /config/initializers/adequate_crypto_address.rb
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) #=> trueDevelopment
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