diff --git a/.gitignore b/.gitignore index b6e6fb35..511f5a2b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules bower_components .idea .DS_Store +*.swp diff --git a/src/avax_validator.js b/src/avax_validator.js new file mode 100644 index 00000000..dde5409e --- /dev/null +++ b/src/avax_validator.js @@ -0,0 +1,12 @@ +var bip173 = require('./bip173_validator.js') + +// Checks validity in Avalanche X- & P- chains +module.exports = { + isValidAddress: function (address, currency, opts = {}) { + // AVAX addresses can have an ID at the beginning + let [id, addr] = address.split('-') + if (!addr) addr = id + + return bip173.isValidAddress(addr, currency, opts) + } +} diff --git a/src/avaxc_validator.js b/src/avaxc_validator.js new file mode 100644 index 00000000..087657d9 --- /dev/null +++ b/src/avaxc_validator.js @@ -0,0 +1,11 @@ +var ethereum = require('./ethereum_validator') + +// Validate C-Chain addresses (AVAXC) +module.exports = { + isValidAddress: function (address) { + // While rarely used, C-Chain addresses can include a chain ID + let [id, addr] = address.split('-') + if (!addr) addr = id + return ethereum.isValidAddress(addr) + } +} diff --git a/src/currencies.js b/src/currencies.js index 1fdce8c1..a5dc7e0f 100644 --- a/src/currencies.js +++ b/src/currencies.js @@ -17,6 +17,8 @@ var AlgoValidator = require('./algo_validator'); var DotValidator = require('./dot_validator'); var BIP173Validator = require('./bip173_validator') var Base58Validator = require('./base58_validator') +var AVAXValidator = require('./avax_validator') +var AVAXCValidator = require('./avaxc_validator') // defines P2PKH and P2SH address types for standard (prod) and testnet networks var CURRENCIES = [{ @@ -597,7 +599,13 @@ var CURRENCIES = [{ { name: 'Avalanche', symbol: 'avax', - validator: ETHValidator, + bech32Hrp: { prod: ['avax'], testnet: ['cascade', 'denali', 'everest', 'fuji', 'local', 'custom'] }, + validator: AVAXValidator + }, + { + name: 'Avalanche C-Chain', + symbol: 'avaxc', + validator: AVAXCValidator }, ]; diff --git a/test/wallet_address_validator.js b/test/wallet_address_validator.js index 3f45688c..0b569161 100644 --- a/test/wallet_address_validator.js +++ b/test/wallet_address_validator.js @@ -828,6 +828,24 @@ describe('WAValidator.validate()', function () { valid('G4qGCGF4vWGPzYi2pxc2Djvgv3j8NiWaHQMgTVebCX6W', 'sol'); }); + it('should return true for correct X- & P- Avalanche chain addreses', function () { + valid('P-avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avax'); + valid('X-avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avax'); + valid('avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avax'); + valid('P-avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avalanche'); + valid('X-avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avalanche'); + valid('avax1ks5kfds2mk8hxwdfdg6dya2v3pggdwf6enj9lt', 'avalanche'); + + valid('X-fuji1xpmx0ljrpvqexrvrj26fnggvr0ax9wm32gaxmx', 'avalanche', 'testnet'); + valid('fuji1xpmx0ljrpvqexrvrj26fnggvr0ax9wm32gaxmx', 'avalanche', 'testnet'); + }); + + it('should return true for correct Avalanche C-chain address (AVAXC)', function () { + valid('C-0x572f4D80f10f663B5049F789546f25f70Bb62a7F', 'avaxc'); + valid('0x572f4D80f10f663B5049F789546f25f70Bb62a7F', 'avaxc'); + valid('C-0x572f4D80f10f663B5049F789546f25f70Bb62a7F', 'avalanche c-chain'); + valid('0x572f4D80f10f663B5049F789546f25f70Bb62a7F', 'avalanche c-chain'); + }); }); describe('invalid results', function () {