From c427df8e9852c5dcd20b3297b136bdb25b76f853 Mon Sep 17 00:00:00 2001 From: dimxy Date: Wed, 17 Apr 2019 11:07:10 +0500 Subject: [PATCH] corr vout0 check costbasis --- src/cc/prices.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 3477b1394..600ef08a1 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -195,17 +195,17 @@ bool ValidateCostbasisTx(struct CCcontract_info *cp, Eval *eval, const CTransact // check basic structure: if (costbasistx.vout.size() < 3 || costbasistx.vout.size() > 4) - return eval->Invalid("incorrect vout number for add funding tx"); + return eval->Invalid("incorrect vout count for costbasis tx"); vscript_t opret; if (prices_costbasisopretdecode(costbasistx.vout.back().scriptPubKey, bettxid, pk, height, amount) != 'C') - return eval->Invalid("cannot decode opreturn for setcostbasis tx"); + return eval->Invalid("cannot decode opreturn for costbasis tx"); pricespk = GetUnspendable(cp, 0); - if (MakeCC1vout(cp->evalcode, costbasistx.vout[0].nValue, pk) != costbasistx.vout[0]) - return eval->Invalid("cannot validate vout0 in add funding tx with pk from opreturn"); + if (CTxOut(costbasistx.vout[0].nValue, CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG) != costbasistx.vout[0]) //might go to any pk who calculated costbasis + return eval->Invalid("cannot validate vout0 in costbasis tx with pk from opreturn"); if (MakeCC1vout(cp->evalcode, costbasistx.vout[1].nValue, pricespk) != costbasistx.vout[1]) - return eval->Invalid("cannot validate vout1 in add funding tx with global pk"); + return eval->Invalid("cannot validate vout1 in costbasis tx with global pk"); if (bettx.vout.size() < 1) // maybe this is already checked outside, but it is safe to check here too and have encapsulated check return eval->Invalid("incorrect bettx"); @@ -218,8 +218,9 @@ bool ValidateCostbasisTx(struct CCcontract_info *cp, Eval *eval, const CTransact int64_t positionsize, firstprice; int32_t firstheight; int16_t leverage; + CPubKey betpk; std::vector vec; - if (prices_betopretdecode(bettx.vout.back().scriptPubKey, pk, firstheight, positionsize, leverage, firstprice, vec, tokenid) != 'B') + if (prices_betopretdecode(bettx.vout.back().scriptPubKey, betpk, firstheight, positionsize, leverage, firstprice, vec, tokenid) != 'B') return eval->Invalid("cannot decode opreturn for bet tx"); if( firstheight + PRICES_DAYWINDOW + PRICES_SMOOTHWIDTH > chainActive.Height() ) @@ -270,7 +271,7 @@ bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx vscript_t vintxOpret; int32_t ccVinCount = 0; int32_t prevoutN = 0; - // load vintx: + // load vintx (might be either bet or add funding tx): for (auto vin : tx.vin) if (cp->ismyvin(vin.scriptSig)) { uint256 hashBlock; @@ -651,6 +652,7 @@ void prices_betjson(UniValue &result,int64_t profits,int64_t costbasis,int64_t p result.push_back(Pair("firstprice",ValueFromAmount(firstprice))); } +// retrives costbasis from a tx spending bettx vout1 int64_t prices_costbasis(CTransaction bettx) { int64_t costbasis = 0;