Auto merge of #4360 - oxarbitrage:issue3235, r=str4d

Add destination wrapper functions

Closes #3235.
This commit is contained in:
Homu 2020-02-19 17:53:54 +00:00
commit 3f270a2afa
5 changed files with 20 additions and 6 deletions

View File

@ -616,7 +616,7 @@ CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
CTxDestination address = DecodeDestination(GetFoundersRewardAddressAtHeight(nHeight).c_str()); CTxDestination address = DecodeDestination(GetFoundersRewardAddressAtHeight(nHeight).c_str());
assert(IsValidDestination(address)); assert(IsValidDestination(address));
assert(boost::get<CScriptID>(&address) != nullptr); assert(IsScriptDestination(address));
CScriptID scriptID = boost::get<CScriptID>(address); // address is a boost variant CScriptID scriptID = boost::get<CScriptID>(address); // address is a boost variant
CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL; CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
return script; return script;

View File

@ -506,13 +506,13 @@ static bool getIndexKey(
if (!IsValidDestination(dest)) { if (!IsValidDestination(dest)) {
return false; return false;
} }
if (dest.type() == typeid(CKeyID)) { if (IsKeyDestination(dest)) {
auto x = boost::get<CKeyID>(&dest); auto x = boost::get<CKeyID>(&dest);
memcpy(&hashBytes, x->begin(), 20); memcpy(&hashBytes, x->begin(), 20);
type = CScript::P2PKH; type = CScript::P2PKH;
return true; return true;
} }
if (dest.type() == typeid(CScriptID)) { if (IsScriptDestination(dest)) {
auto x = boost::get<CScriptID>(&dest); auto x = boost::get<CScriptID>(&dest);
memcpy(&hashBytes, x->begin(), 20); memcpy(&hashBytes, x->begin(), 20);
type = CScript::P2SH; type = CScript::P2SH;

View File

@ -280,6 +280,14 @@ bool IsValidDestination(const CTxDestination& dest) {
return dest.which() != 0; return dest.which() != 0;
} }
bool IsKeyDestination(const CTxDestination& dest) {
return dest.which() == 1;
}
bool IsScriptDestination(const CTxDestination& dest) {
return dest.which() == 2;
}
// insightexplorer // insightexplorer
CTxDestination DestFromAddressHash(int scriptType, uint160& addressHash) CTxDestination DestFromAddressHash(int scriptType, uint160& addressHash)
{ {

View File

@ -81,6 +81,12 @@ typedef boost::variant<CNoDestination, CKeyID, CScriptID> CTxDestination;
/** Check whether a CTxDestination is a CNoDestination. */ /** Check whether a CTxDestination is a CNoDestination. */
bool IsValidDestination(const CTxDestination& dest); bool IsValidDestination(const CTxDestination& dest);
/** Check whether a CTxDestination is a CKeyID. */
bool IsKeyDestination(const CTxDestination& dest);
/** Check whether a CTxDestination is a CScriptID. */
bool IsScriptDestination(const CTxDestination& dest);
/** Get the name of a txnouttype as a C string, or nullptr if unknown. */ /** Get the name of a txnouttype as a C string, or nullptr if unknown. */
const char* GetTxnOutputType(txnouttype t); const char* GetTxnOutputType(txnouttype t);

View File

@ -72,15 +72,15 @@ BOOST_AUTO_TEST_CASE(rpc_addmultisig)
CTxDestination address; CTxDestination address;
BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false)); BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
address = DecodeDestination(v.get_str()); address = DecodeDestination(v.get_str());
BOOST_CHECK(IsValidDestination(address) && boost::get<CScriptID>(&address) != nullptr); BOOST_CHECK(IsValidDestination(address) && IsScriptDestination(address));
BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false)); BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex, address2Hex), false));
address = DecodeDestination(v.get_str()); address = DecodeDestination(v.get_str());
BOOST_CHECK(IsValidDestination(address) && boost::get<CScriptID>(&address) != nullptr); BOOST_CHECK(IsValidDestination(address) && IsScriptDestination(address));
BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false)); BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(2, address1Hex, address2Hex), false));
address = DecodeDestination(v.get_str()); address = DecodeDestination(v.get_str());
BOOST_CHECK(IsValidDestination(address) && boost::get<CScriptID>(&address) != nullptr); BOOST_CHECK(IsValidDestination(address) && IsScriptDestination(address));
BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error); BOOST_CHECK_THROW(addmultisig(createArgs(0), false), runtime_error);
BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error); BOOST_CHECK_THROW(addmultisig(createArgs(1), false), runtime_error);