diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index fffc57ffa..587eac221 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1457,6 +1457,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ bool GetStakeParams(const CTransaction &stakeTx, CStakeParams &stakeParams); bool ValidateMatchingStake(const CTransaction &ccTx, uint32_t voutNum, const CTransaction &stakeTx, bool &cheating); +bool ValidateStakeTransaction(const CTransaction &stakeTx, CStakeParams &stakeParams, bool validateSig = true); // for now, we will ignore slowFlag in the interest of keeping success/fail simpler for security purposes bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height) @@ -1632,12 +1633,14 @@ bool verusCheckPOSBlock(int32_t slowflag, CBlock *pblock, int32_t height) strcpy(cbaddr, CBitcoinAddress(cbaddress).ToString().c_str()); if (newPOSEnforcement) { - if (!strcmp(destaddr,voutaddr)) + if (!strcmp(destaddr, voutaddr)) { // allow delegation of stake, but require all ouputs to be // crypto conditions CStakeParams p; - if (GetStakeParams(pblock->vtx[txn_count-1], p)) + // validatestake transaction sets the pubkey of the stake output + // if it has no override into the pubkey + if (ValidateStakeTransaction(pblock->vtx[txn_count-1], p, false)) { COptCCParams cpp; // loop through all outputs to make sure they are sent to the proper pubkey diff --git a/src/script/script_ext.cpp b/src/script/script_ext.cpp index e4ae41dbe..613b50c05 100644 --- a/src/script/script_ext.cpp +++ b/src/script/script_ext.cpp @@ -96,8 +96,7 @@ bool CScriptExt::ExtractVoutDestination(const CTransaction& tx, int32_t voutNum, // if this is a timelocked transaction, get the destination behind the time lock if (tx.IsCoinBase() && tx.vout.size() == 2 && voutNum == 0 && spk.IsPayToScriptHash(&scriptHash) && - tx.vout[1].scriptPubKey.size() >= 7 && // minimum for any possible future to prevent out of bounds - tx.vout[1].scriptPubKey[0] == OP_RETURN) + tx.vout[1].scriptPubKey.IsOpReturn()) { opcodetype op; std::vector opretData = std::vector(); diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 71fa0d629..67aa0f28f 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -191,16 +191,11 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector cp.n) + if (cp.IsValid()) { - // all addresses that should be there must be 33 byte pub keys - for (int i = 1; i <= cp.n; i++) + for (auto k : cp.vKeys) { - if (vParams[i].size() != 33) - { - // we accept no errors - return false; - } + vSolutionsRet.push_back(std::vector(k.begin(), k.end())); } } }