diff --git a/src/address.js b/src/address.js index e631401..d7e5c6d 100644 --- a/src/address.js +++ b/src/address.js @@ -18,8 +18,8 @@ function fromBase58Check (address) { function fromOutputScript (scriptPubKey, network) { network = network || networks.bitcoin - if (bscript.isPubKeyHashOutput(scriptPubKey)) return toBase58Check(scriptPubKey.slice(3, 23), network.pubKeyHash) - if (bscript.isScriptHashOutput(scriptPubKey)) return toBase58Check(scriptPubKey.slice(2, 22), network.scriptHash) + if (bscript.isPubKeyHashOutput(scriptPubKey)) return toBase58Check(bscript.compile(scriptPubKey).slice(3, 23), network.pubKeyHash) + if (bscript.isScriptHashOutput(scriptPubKey)) return toBase58Check(bscript.compile(scriptPubKey).slice(2, 22), network.scriptHash) throw new Error(bscript.toASM(scriptPubKey) + ' has no matching Address') } diff --git a/test/address.js b/test/address.js index e765eb0..a254343 100644 --- a/test/address.js +++ b/test/address.js @@ -36,6 +36,15 @@ describe('address', function () { }) }) + fixtures.valid.forEach(function (f) { + it('parses (as chunks) ' + f.script.slice(0, 30) + '... (' + f.network + ')', function () { + var chunks = bscript.decompile(bscript.fromASM(f.script)) + var address = baddress.fromOutputScript(chunks, networks[f.network]) + + assert.strictEqual(address, f.base58check) + }) + }) + fixtures.invalid.fromOutputScript.forEach(function (f) { it('throws when ' + f.script.slice(0, 30) + '... ' + f.exception, function () { var script = bscript.fromASM(f.script)