From 2d815fa5df60e453f715bfa5b58c82ae7f40729f 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 | 2 ++ src/bitcoin_validator.js | 2 ++ src/crypto/utils.js | 5 +++++ src/currencies.js | 8 +++++++- test/wallet_address_validator.js | 31 +++++++++++++++++++++++++++++-- 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 46b827d0..4061e5a6 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ npm install multicoin-address-validator * Gnosis/gno `'Gnosis'` or `'gno'` * Golem/glm `'Golem'` or `'glm'` * Golem (GNT)/gnt `'Golem (GNT)'` 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 b1c8fca3..c56c3d8c 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "Gnosis","gno", "Golem","glm", "Golem (GNT)","gnt", + "Groestlcoin", "grs", "HedgeTrade","hedg", "Hush","hush", "HyperSpace","xsc", @@ -152,6 +153,7 @@ "bundle": "^2.1.0", "cbor-js": "^0.1.0", "crc": "^3.8.0", + "groestl-hash-js": "1.0.0", "js-sha512": "^0.8.0", "jssha": "^2.4.2", "lodash.isequal": "^4.5.0", diff --git a/src/bitcoin_validator.js b/src/bitcoin_validator.js index a1dab6bd..ed81ae37 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 0632c567..1f87bfc5 100644 --- a/src/crypto/utils.js +++ b/src/crypto/utils.js @@ -6,6 +6,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, length) { var hex = number.toString(16); @@ -122,6 +123,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 4d1f57c5..83db5b14 100644 --- a/src/currencies.js +++ b/src/currencies.js @@ -43,6 +43,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', @@ -619,4 +626,3 @@ var 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 3f45688c..43084284 100644 --- a/test/wallet_address_validator.js +++ b/test/wallet_address_validator.js @@ -106,6 +106,35 @@ 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', 'grs'); + valid('grs1qnxt8adg4qk3ljl0qhvp4m0nt56w6ma77vwr2jq', 'grs'); + valid('tgrs1qw4z3xrtgx4f6w7akwpp2xa0gupmkv4yauemmm9', 'grs', 'testnet'); + + invalid("grs1q49qls5kklryt95g5xq4p6msycpgjp8ramfc9jq", 'grs'), + invalid("tgrs1qqjd3qhncsxdyh5gt7hz4k6zzvfguslwxwgv23j", 'grs') + }); + it('should return true for correct peercoin addresses', function () { valid('PHCEsP6od3WJ8K2WKWEDBYKhH95pc9kiZN', 'peercoin'); valid('PSbM1pGoE9dnAuVWvpQqTTYVpKZU41dNAz', 'peercoin'); @@ -1527,5 +1556,3 @@ describe('invalid results', function () { }); - -