return true;
}
+ bool CBitcoinAddress::Set(const CBitcoinAddress &dest)
+ {
+ nVersion = dest.nVersion;
+ vchData = dest.vchData;
+ return true;
+ }
+
bool CBitcoinAddress::IsValid() const
{
unsigned int nExpectedSize = 20;
bool fExpectTestNet = false;
+ bool fSimple = true;
switch(nVersion)
{
case PUBKEY_PAIR_ADDRESS:
nExpectedSize = 68; // Serialized pair of public keys
fExpectTestNet = false;
+ fSimple = false;
break;
case PUBKEY_ADDRESS:
nExpectedSize = 20; // Hash of public key
case PUBKEY_PAIR_ADDRESS_TEST:
nExpectedSize = 68;
fExpectTestNet = true;
+ fSimple = false;
break;
case PUBKEY_ADDRESS_TEST:
nExpectedSize = 20;
default:
return false;
}
- return fExpectTestNet == fTestNet && vchData.size() == nExpectedSize;
+
+ // Basic format sanity check
+ bool fSeemsSane = (fExpectTestNet == fTestNet && vchData.size() == nExpectedSize);
+
+ if (fSeemsSane && !fSimple)
+ {
+ // Perform dditional checking
+ // for pubkey pair addresses
+ CMalleablePubKey mpk;
+ mpk.setvch(vchData);
+ return mpk.IsValid();
+ }
+ else
+ return fSeemsSane;
}
CTxDestination CBitcoinAddress::Get() const {
default: return false;
}
}
+
+ bool CBitcoinAddress::IsPubKey() const {
+ if (!IsValid())
+ return false;
+ switch (nVersion) {
+ case PUBKEY_ADDRESS:
+ case PUBKEY_ADDRESS_TEST: {
+ return true;
+ }
+ default: return false;
+ }
+ }
bool CBitcoinAddress::IsPair() const {
if (!IsValid())