diff --git a/modules/ecashaddrjs/README.md b/modules/ecashaddrjs/README.md --- a/modules/ecashaddrjs/README.md +++ b/modules/ecashaddrjs/README.md @@ -37,6 +37,19 @@ console.log(ecashaddr.isValidCashAddress(bitcoincashAddress)); // true console.log(ecashaddr.isValidCashAddress(bitcoincashAddress), 'bitcoincash'); // true console.log(ecashaddr.isValidCashAddress(bitcoincashAddress), 'ecash'); // false +// getOutputScriptFromAddress +// p2pkh +console.log( + ecashaddr.getOutputScriptFromAddress( + 'ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr', + ), +); // 76a9144e532257c01b310b3b5c1fd947c79a72addf852388ac +// p2sh +console.log( + ecashaddr.getOutputScriptFromAddress( + 'ecash:prfhcnyqnl5cgrnmlfmms675w93ld7mvvqd0y8lz07', + ), +); // a914d37c4c809fe9840e7bfa77b86bd47163f6fb6c6087 ``` ### Working with chronik-client in Node.js @@ -134,4 +147,5 @@ 1.2.0 - Support lowercase input and output of address types, support encoding outputScript to address, support getting type and hash from an outputScript with new exported function `getTypeAndHashFromOutputScript`\ 1.3.0 - Add `toLegacy` function to convert cashaddress format to legacy address\ 1.4.0 - Add `isValidCashAddress` function to validate cash addresses by prefix\ -1.4.1-6 - Fix repo README link for npmjs page +1.4.1-6 - Fix repo README link for npmjs page\ +1.5.0 - Add `getOutputScriptFromAddress` function to get outputScript from address diff --git a/modules/ecashaddrjs/package.json b/modules/ecashaddrjs/package.json --- a/modules/ecashaddrjs/package.json +++ b/modules/ecashaddrjs/package.json @@ -1,6 +1,6 @@ { "name": "ecashaddrjs", - "version": "1.4.6", + "version": "1.5.0", "description": "eCash cashaddr address format support for Node.js and web browsers.", "main": "src/cashaddr.js", "browser": "dist/cashaddrjs.min.js", diff --git a/modules/ecashaddrjs/src/cashaddr.js b/modules/ecashaddrjs/src/cashaddr.js --- a/modules/ecashaddrjs/src/cashaddr.js +++ b/modules/ecashaddrjs/src/cashaddr.js @@ -572,6 +572,26 @@ } } +/** + * Return true for a valid cashaddress + * Prefixless addresses with valid checksum are also valid + * + * @static + * @param {string} address a valid p2pkh or p2sh cash address + * @returns {string} the outputScript associated with this address and type + * @throws {ValidationError} if decode fails + */ +function getOutputScriptFromAddress(address) { + const { type, hash } = decode(address, true); + let registrationOutputScript; + if (type === 'p2pkh') { + registrationOutputScript = `76a914${hash}88ac`; + } else { + registrationOutputScript = `a914${hash}87`; + } + return registrationOutputScript; +} + module.exports = { encode: encode, decode: decode, @@ -580,5 +600,6 @@ getTypeAndHashFromOutputScript: getTypeAndHashFromOutputScript, toLegacy: toLegacy, isValidCashAddress: isValidCashAddress, + getOutputScriptFromAddress: getOutputScriptFromAddress, ValidationError: ValidationError, }; diff --git a/modules/ecashaddrjs/test/cashaddr.js b/modules/ecashaddrjs/test/cashaddr.js --- a/modules/ecashaddrjs/test/cashaddr.js +++ b/modules/ecashaddrjs/test/cashaddr.js @@ -649,4 +649,43 @@ } }); }); + describe('#getOutputScriptFromAddress()', () => { + it('should get outputScripts from address on mainnet correctly', () => { + for (const index in EXPECTED_P2PKH_OUTPUTS) { + assert.equal( + cashaddr.getOutputScriptFromAddress( + EXPECTED_P2PKH_OUTPUTS[index], + ), + TEST_P2PKH_OUTPUTSCRIPTS[index], + ); + assert.equal( + cashaddr.getOutputScriptFromAddress( + EXPECTED_P2SH_OUTPUTS[index], + ), + TEST_P2SH_OUTPUTSCRIPTS[index], + ); + } + }); + it('should get outputScripts from testnet addresses correctly', () => { + for (const index in TEST_HASHES) { + assert.equal( + cashaddr.getOutputScriptFromAddress( + EXPECTED_P2PKH_OUTPUTS_TESTNET[index], + ), + TEST_P2PKH_OUTPUTSCRIPTS[index], + ); + assert.equal( + cashaddr.getOutputScriptFromAddress( + EXPECTED_P2SH_OUTPUTS_TESTNET[index], + ), + TEST_P2SH_OUTPUTSCRIPTS[index], + ); + } + }); + it('should fail on invalid addresses', () => { + assert.throws(() => { + cashaddr.getOutputScriptFromAddress('notAnAddress'); + }, cashaddr.ValidationError); + }); + }); });