diff --git a/lib/address.js b/lib/address.js index b017bc7f4..d37dee42c 100644 --- a/lib/address.js +++ b/lib/address.js @@ -154,6 +154,8 @@ Address._transformObject = function(data) { /** * Internal function to discover the network and type based on the first data byte + * If two or more networks match the criteria, a list of networks is returned. + * If one network is found, that one single network is returned (not wrapped in a list). * * @param {Buffer} buffer - An instance of a hex encoded address Buffer * @returns {Object} An object with keys: network and type @@ -162,14 +164,24 @@ Address._transformObject = function(data) { Address._classifyFromVersion = function(buffer) { var version = {}; - var pubkeyhashNetwork = Networks.get(buffer[0], 'pubkeyhash'); - var scripthashNetwork = Networks.get(buffer[0], 'scripthash'); + var pubkeyhashNetworks = Networks.get(buffer[0], 'pubkeyhash'); + var scripthashNetworks = Networks.get(buffer[0], 'scripthash'); - if (pubkeyhashNetwork) { - version.network = pubkeyhashNetwork; + if (pubkeyhashNetworks && pubkeyhashNetworks.name) { + version.network = pubkeyhashNetworks; version.type = Address.PayToPublicKeyHash; - } else if (scripthashNetwork) { - version.network = scripthashNetwork; + return version +} else if (scripthashNetworks && scripthashNetworks.name) { + version.network = scripthashNetworks; + version.type = Address.PayToScriptHash; + return version + } + + if (pubkeyhashNetworks.length > 1) { + version.networks = pubkeyhashNetworks; + version.type = Address.PayToPublicKeyHash; +} else if (scripthashNetworks.length > 1) { + version.networks = scripthashNetworks; version.type = Address.PayToScriptHash; } @@ -198,7 +210,11 @@ Address._transformBuffer = function(buffer, network, type) { network = Networks.get(network); var bufferVersion = Address._classifyFromVersion(buffer); - if (!bufferVersion.network || (network && network !== bufferVersion.network)) { + if (bufferVersion.networks && (network && !_.find(bufferVersion.networks, network))) { + throw new TypeError('Address has mismatched network type.'); + } + + if (bufferVersion.network && (network && bufferVersion.network != network)) { throw new TypeError('Address has mismatched network type.'); } diff --git a/lib/networks.js b/lib/networks.js index 3a9381c5d..f59ca2d40 100644 --- a/lib/networks.js +++ b/lib/networks.js @@ -37,12 +37,19 @@ function get(arg, keys) { var containsArg = function(key) { return networks[index][key] === arg; }; + var matched_networks = []; for (var index in networks) { if (_.any(keys, containsArg)) { - return networks[index]; + matched_networks.push(networks[index]); } } - return undefined; + if(matched_networks.length == 1) { + return matched_networks[0] + } + if(matched_networks.length == 0) { + return undefined; + } + return matched_networks } return networkMaps[arg]; } diff --git a/lib/privatekey.js b/lib/privatekey.js index f820cae09..9bc5252cc 100644 --- a/lib/privatekey.js +++ b/lib/privatekey.js @@ -152,7 +152,7 @@ PrivateKey._transformBuffer = function(buf, network) { throw new Error('Invalid network'); } - if (network && info.network !== Networks.get(network)) { + if (network && (info.network !== Networks.get(network) && !_.find(info.network, network))) { throw new TypeError('Private key network mismatch'); }