Skip to content

Commit

Permalink
Broken addresses on command line no longer trigger testnet.
Browse files Browse the repository at this point in the history
When passing a bitcoin: URI on the command line, invalid addresses do not incorrectly send the
user to the test network.
  • Loading branch information
Ross Nicoll committed Aug 30, 2014
1 parent 9d26dc3 commit e84843c
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 13 deletions.
8 changes: 6 additions & 2 deletions src/base58.cpp
Expand Up @@ -215,9 +215,13 @@ bool CBitcoinAddress::Set(const CTxDestination &dest) {
}

bool CBitcoinAddress::IsValid() const {
return IsValid(Params());
}

bool CBitcoinAddress::IsValid(const CChainParams &params) const {
bool fCorrectSize = vchData.size() == 20;
bool fKnownVersion = vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
bool fKnownVersion = vchVersion == params.Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||
vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
return fCorrectSize && fKnownVersion;
}

Expand Down
1 change: 1 addition & 0 deletions src/base58.h
Expand Up @@ -104,6 +104,7 @@ class CBitcoinAddress : public CBase58Data {
bool Set(const CScriptID &id);
bool Set(const CTxDestination &dest);
bool IsValid() const;
bool IsValid(const CChainParams &params) const;

CBitcoinAddress() {}
CBitcoinAddress(const CTxDestination &dest) { Set(dest); }
Expand Down
19 changes: 10 additions & 9 deletions src/chainparams.cpp
Expand Up @@ -220,24 +220,25 @@ const CChainParams &Params() {
return *pCurrentParams;
}

void SelectParams(CBaseChainParams::Network network) {
SelectBaseParams(network);
CChainParams &Params(CBaseChainParams::Network network) {
switch (network) {
case CBaseChainParams::MAIN:
pCurrentParams = &mainParams;
break;
return mainParams;
case CBaseChainParams::TESTNET:
pCurrentParams = &testNetParams;
break;
return testNetParams;
case CBaseChainParams::REGTEST:
pCurrentParams = &regTestParams;
break;
return regTestParams;
default:
assert(false && "Unimplemented network");
return;
return mainParams;
}
}

void SelectParams(CBaseChainParams::Network network) {
SelectBaseParams(network);
pCurrentParams = &Params(network);
}

bool SelectParamsFromCommandLine() {
if (!SelectBaseParamsFromCommandLine())
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/chainparams.h
Expand Up @@ -111,6 +111,9 @@ class CChainParams
*/
const CChainParams &Params();

/** Return parameters for the given network. */
CChainParams &Params(CBaseChainParams::Network network);

/** Sets the params returned by Params() to those for the given network. */
void SelectParams(CBaseChainParams::Network network);

Expand Down
8 changes: 6 additions & 2 deletions src/qt/paymentserver.cpp
Expand Up @@ -10,6 +10,7 @@
#include "optionsmodel.h"

#include "base58.h"
#include "chainparams.h"
#include "ui_interface.h"
#include "wallet.h"

Expand Down Expand Up @@ -199,8 +200,11 @@ bool PaymentServer::ipcParseCommandLine(int argc, char* argv[])
{
CBitcoinAddress address(r.address.toStdString());

SelectParams(CBaseChainParams::MAIN);
if (!address.IsValid())
if (address.IsValid(Params(CBaseChainParams::MAIN)))
{
SelectParams(CBaseChainParams::MAIN);
}
else if (address.IsValid(Params(CBaseChainParams::TESTNET)))
{
SelectParams(CBaseChainParams::TESTNET);
}
Expand Down

0 comments on commit e84843c

Please sign in to comment.