From 423625bf0517cedcf6e449c354e629386c45e39c Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Mon, 10 Feb 2020 13:43:05 -0800 Subject: [PATCH] Add Groestlcoin (GRS) --- README.md | 1 + package.json | 3 +++ src/bitcoin_validator.js | 2 ++ src/crypto/utils.js | 5 +++++ src/currencies.js | 9 +++++++-- test/wallet_address_validator.js | 25 +++++++++++++++++++++++++ 6 files changed, 43 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d340cb32..959d4174 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ npm install multicoin-address-validator * GarliCoin/grlc `'GarliCoin'` or `'grlc'` * Gnosis/gno `'Gnosis'` or `'gno'` * Golem/gnt `'Golem'` or `'gnt'` +* Groestlcoin/grs `'Groestlcoin'` or `'grs'` * HedgeTrade/hedg `'HedgeTrade'` or `'hedg'` * Hush/hush `'Hush'` or `'hush'` * HyperSpace/xsc `'HyperSpace'` or `'xsc'` diff --git a/package.json b/package.json index 016167d7..03a466f0 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,8 @@ "gno", "Golem", "gnt", + "Groestlcoin"", + "grs", "HedgeTrade", "hedg", "Hush", @@ -243,6 +245,7 @@ "bundle": "^2.1.0", "cbor-js": "^0.1.0", "crc": "^3.8.0", + "groestl-hash-js": "1.0.0", "jssha": "^3.1.2", "lodash.isequal": "^4.5.0", "minify": "^6.0.0" diff --git a/src/bitcoin_validator.js b/src/bitcoin_validator.js index 4b22ecfe..1e8fa530 100644 --- a/src/bitcoin_validator.js +++ b/src/bitcoin_validator.js @@ -24,6 +24,8 @@ function getChecksum(hashFunction, payload) { return cryptoUtils.blake256Checksum(payload); case 'keccak256': return cryptoUtils.keccak256Checksum(payload); + case 'groestl512x2': + return cryptoUtils.groestl512x2(payload); case 'sha256': default: return cryptoUtils.sha256Checksum(payload); diff --git a/src/crypto/utils.js b/src/crypto/utils.js index c12318f7..671cc5ba 100644 --- a/src/crypto/utils.js +++ b/src/crypto/utils.js @@ -5,6 +5,7 @@ var Blake2B = require('./blake2b'); var base58 = require('./base58'); var base32 = require('./base32'); var BigNum = require('browserify-bignum'); +var groestl = require('groestl-hash-js'); function numberToHex(number) { var hex = Math.round(number).toString(16) @@ -115,6 +116,10 @@ module.exports = { blake2b256: function (hexString) { return new Blake2B(32).update(Buffer.from(hexString, 'hex'), 32).digest('hex'); }, + groestl512x2: function (hexString) { + let result = groestl.groestl_2(Buffer.from(hexString, 'hex'), 1, 0).substr(0, 8); + return result; + }, base58: base58.decode, byteArray2hexStr: byteArray2hexStr, hexStr2byteArray: hexStr2byteArray, diff --git a/src/currencies.js b/src/currencies.js index 1b7aad4e..b43b14e8 100644 --- a/src/currencies.js +++ b/src/currencies.js @@ -39,6 +39,13 @@ var CURRENCIES = [{ addressTypes: { prod: ['30', '05', '32'], testnet: ['6f', 'c4', '3a'] }, bech32Hrp: { prod: ['ltc'], testnet: ['tltc'] }, validator: BTCValidator + }, { + name: 'Groestlcoin', + symbol: 'grs', + addressTypes: { prod: ['24', '05'], testnet: ['6f', 'c4'] }, + bech32Hrp: { prod: ['grs'], testnet: ['tgrs'] }, + hashFunction: 'groestl512x2', + validator: BTCValidator }, { name: 'PeerCoin', symbol: 'ppc', @@ -516,5 +523,3 @@ var CURRENCIES = [{ // CURRENCIES // .sort((a, b) => a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1) // .forEach(c => console.log(`"${c.name}","${c.symbol}",`)); - - diff --git a/test/wallet_address_validator.js b/test/wallet_address_validator.js index f7faf98e..489693c9 100644 --- a/test/wallet_address_validator.js +++ b/test/wallet_address_validator.js @@ -103,6 +103,31 @@ describe('WAValidator.validate()', function () { valid('tltc1qu78xur5xnq6fjy83amy0qcjfau8m367defyhms', 'litecoin', { networkType: 'testnet' }); }); + it('should return true for correct groestlcoin addresses', function () { + valid('Foa6yZoKq2r4t3tUFKFcfoXSQjSodZsGx1', 'groestlcoin'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'groestlcoin'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'GRS'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'Groestlcoin'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'grs'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'grs', 'prod'); + valid('Fr2Z1bLzqRZByt2WeZwWnpCkA1eBYv83wZ', 'grs', 'both'); + valid('FpM19fiGQNjNcaRjFaXVX6Nrewr4gnuuMZ', 'grs', 'prod'); + valid('3FyVFsEyyBPzHjD3qUEgX7Jsn4tcJWiqeN', 'grs', 'prod'); + valid('38mKdURe1zcQyrFqRLzR8PRao3iLFU5hwU', 'grs', 'prod'); + valid('mptPo5AvLzJXi4T82vR6g82fT5uJ9cgfsV', 'grs', 'both'); + valid('FdWcvgskHoXUTqeQRAiuGuh5KQ2EoXv5iM', 'groestlcoin'); + valid('mzBc4XEFSdzCDcTxAgf6EZXgsZWq3SbMQT', 'groestlcoin', 'testnet'); + valid('mzBc4XEFSdzCDcTxAgf6EZXgsZWq3SbMQT', 'groestlcoin', 'both'); + + // p2sh addresses + valid('3NJZLcZEEYBpxYEUGewU4knsQRn1T2Htk2', 'groestlcoin'); + valid('2MxKEf2su6FGAUfCEAHreGFQvEYrfZDahUf', 'groestlcoin', 'testnet'); + + // segwit addresses + valid('grs1q49qls5kklryt95g5xx4p6msycpgjp8ramfc9jq', 'groestlcoin'); + valid('tgrs1qgjd3qhncsxdyh5gt7hz4k6zzvfguslwxwgv23j', 'groestlcoin'); + }); + it('should return true for correct peercoin addresses', function () { valid('PHCEsP6od3WJ8K2WKWEDBYKhH95pc9kiZN', 'peercoin'); valid('PSbM1pGoE9dnAuVWvpQqTTYVpKZU41dNAz', 'peercoin');