From 39e950f8d87f20879829c0c94a026cb188b37104 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 19 Oct 2018 16:17:37 +0200 Subject: [PATCH 01/87] Fix oraclefeed bugs and gatewaysmultisig rpc call --- src/cc/dapps/oraclefeed.c | 7 ++++--- src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index eaf488a34..3662b7742 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -332,6 +332,7 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + jsonstr[strlen(jsonstr)-1]='\0'; if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); @@ -584,7 +585,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad return(0); } satoshis -= txfee; - sprintf(array,"[\"%s\"]",depositaddr); + sprintf(array,"\'[\"%s\"]\'",depositaddr); if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array,"")) != 0 ) { //createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} @@ -628,7 +629,7 @@ cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx char *retstr,*hexstr; cJSON *retjson; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 ) { - if ( jint(retjson,"complete") != 0 ) + if ( is_cJSON_True(jobj(retjson,"complete")) != 0 ) return(retjson); else if ( (hexstr= jstr(retjson,"hex")) != 0 && strlen(hexstr) > strlen(rawtx) ) { @@ -814,7 +815,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t { if ( (clijson= addmultisignature(refcoin,"",signeraddr,rawtx)) != 0 ) { - if ( jint(clijson,"complete") != 0 ) + if ( is_cJSON_True(jobj(clijson,"complete")) != 0 ) { cointxid = komodobroadcast(refcoin,"",clijson); if ( bits256_nonz(cointxid) != 0 ) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e7c8e2bdd..59f0b6ba7 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5593,7 +5593,7 @@ UniValue gatewayspending(const UniValue& params, bool fHelp) UniValue gatewaysmultisig(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); uint256 bindtxid,withtxid; std::string coin,hex; char *txidaddr; - if ( fHelp || params.size() != 2 ) + if ( fHelp || params.size() != 4 ) throw runtime_error("gatewaysmultisig bindtxid coin withtxid txidaddr\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); From 58c81292536f88491d85742fd3aa64970f40158e Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 19 Oct 2018 20:38:10 +0200 Subject: [PATCH 02/87] Another oraclefeed fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3662b7742..aca027b07 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -601,8 +601,8 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN); } char *argA,*argB; - argA = jprint(vins,1); - argB = jprint(vouts,1); + sprintf(argA,"\'%s\'",jprint(vins,1)); + sprintf(argB,"\'%s\'",jprint(vouts,1)); if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); From 029bd0dd5d331d21b5df5c542f9afb76a735fa66 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 19 Oct 2018 20:58:26 +0200 Subject: [PATCH 03/87] Fix --- src/cc/dapps/oraclefeed.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index aca027b07..d9bda7309 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -600,9 +600,14 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad change = (total - satoshis); jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN); } - char *argA,*argB; - sprintf(argA,"\'%s\'",jprint(vins,1)); - sprintf(argB,"\'%s\'",jprint(vouts,1)); + char *tmpA=jprint(vins,1); + char *tmpB=jprint(vouts,1); + char *argA=malloc(sizeof(char) * (strlen(tmpA)+3)); + char *argB=malloc(sizeof(char) * (strlen(tmpB)+3)); + sprintf(argA,"\'%s\'",tmpA); + sprintf(argB,"\'%s\'",tmpB); + printf("%s\n",argA); + printf("%s\n",argB); if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); From 2fd999a2f674168cb34947f012f5f640871928cd Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 13:00:16 +0200 Subject: [PATCH 04/87] Multisig withdraw fix --- src/cc/CCGateways.h | 3 +- src/cc/dapps/oraclefeed.c | 112 +++++++++++++++++++++++--------------- src/cc/gateways.cpp | 85 +++++++++++++++++++++-------- src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/wallet/rpcwallet.cpp | 34 +++++++++--- 6 files changed, 162 insertions(+), 74 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index b584ba5d0..70c50dcdb 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -27,7 +27,8 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); -std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr); +std::string GatewaysMultisig(char *txidaddr); +std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoin, std::string hex); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index d9bda7309..e85206071 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -615,6 +615,8 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad } else if ( txstr == 0 ) printf("createmultisig: null txstr and JSON2\n"); + free(tmpA); + free(tmpB); free(argA); free(argB); } @@ -646,10 +648,10 @@ cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx return(0); } -char *get_gatewaysmultisig(char *refcoin,char *acname,char *bindtxidstr,char *withtxidstr,char *txidaddr) +char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr) { char *retstr,*hexstr,*hex=0; cJSON *retjson; - if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",bindtxidstr,refcoin,withtxidstr,txidaddr)) != 0 ) + if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",txidaddr,"","","")) != 0 ) { if ( (hexstr= jstr(retjson,"hex")) != 0 ) hex = clonestr(hexstr); @@ -658,6 +660,21 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *bindtxidstr,char *wi return(hex); } +int32_t gatewayspartialsign(char *refcoin,char *acname,char *txidaddr,char *hex) +{ + char str[65],str2[65],*retstr; cJSON *retjson; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspartialsign",txidaddr,refcoin,hex,"")) != 0 ) + { + komodobroadcast(refcoin,acname,retjson); + return(jint(retjson,"rank")); + } + else if ( retstr != 0 ) + { + printf("error parsing gatewaysmarkdone.(%s)\n",retstr); + free(retstr); + } +} + void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid) { char str[65],str2[65],*retstr; cJSON *retjson; @@ -733,13 +750,20 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd return(retval); } -int32_t coinaddrexists(char *refcoin,char *acname,char *coinaddr) +int32_t sendfromthisnode(char *refcoin,char *acname,char *coinaddr) { - cJSON *array; bits256 txid; int32_t i,n,num=0; + cJSON *array,*item; bits256 txid; int32_t i,n,num=0; char *tmptxid,*retstr; if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) { - num = cJSON_GetArraySize(array); - free_json(array); + for (i=0; i","amount":0.0001},{"address":"","amount":}]' - txid = sendtoaddress("KMD",acname,txidaddr,10000); - if ( bits256_nonz(txid) != 0 && coinaddrexists("KMD",acname,txidaddr) > 0 ) + if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && sendfromthisnode("KMD",acname,txidaddr) == 0) + { + // the actual withdraw + if ( strcmp(depositaddr,signeraddr) == 0 ) { - // the actual withdraw - if ( strcmp(depositaddr,signeraddr) == 0 ) + txid= sendtoaddress("KMD",acname,txidaddr,10000); + if (bits256_nonz(txid) != 0) { cointxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); - if ( bits256_nonz(cointxid) != 0 ) + if ( bits256_nonz(cointxid) != 0) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); @@ -812,36 +835,39 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else { - if ( (rawtx= get_gatewaysmultisig(refcoin,acname,bindtxidstr,bits256_str(str,origtxid),txidaddr)) == 0 ) - { - rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); - } - if ( rawtx != 0 ) - { - if ( (clijson= addmultisignature(refcoin,"",signeraddr,rawtx)) != 0 ) - { - if ( is_cJSON_True(jobj(clijson,"complete")) != 0 ) - { - cointxid = komodobroadcast(refcoin,"",clijson); - if ( bits256_nonz(cointxid) != 0 ) - { - fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); - } - } - else if ( jint(clijson,"partialtx") != 0 ) - { - // 10000 + ith -> txidaddr - txid = komodobroadcast("KMD",acname,clijson); - fprintf(stderr,"%s M.%d of N.%d partialtx %s sent\n",refcoin,M,N,bits256_str(str,txid)); - } - free_json(clijson); - } - processed++; - free(rawtx); - } else fprintf(stderr,"couldnt create msig rawtx\n"); + fprintf(stderr,"ERROR sending withdraw marker %s %s to %s %.8f processed\n",refcoin,bits256_str(str,cointxid),txidaddr,(double)10000/SATOSHIDEN); } } + else + { + if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr)) == 0 ) + { + rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); + } + if ( rawtx != 0 ) + { + if ( (clijson= addmultisignature(refcoin,"",signeraddr,rawtx)) != 0 ) + { + if ( is_cJSON_True(jobj(clijson,"complete")) != 0 ) + { + cointxid = komodobroadcast(refcoin,"",clijson); + if ( bits256_nonz(cointxid) != 0 ) + { + fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); + } + } + else if ( jint(clijson,"partialtx") != 0 ) + { + K=gatewayspartialsign(refcoin,acname,txidaddr,jstr(retjson,"hex")); + fprintf(stderr,"%d of %d partialtx %s sent\n",K,N,bits256_str(str,txid)); + } + free_json(clijson); + } + processed++; + free(rawtx); + } else fprintf(stderr,"couldnt create msig rawtx\n"); + } } else if ( retval > 0 ) { diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d2c43ad56..6d1bff5c9 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -178,6 +178,18 @@ uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint25 return(0); } +uint8_t DecodeGatewaysPartialOpRet(const CScript &scriptPubKey,int32_t &K, CPubKey &signerpk, std::string &coin,std::string &hex) +{ + std::vector vopret; uint8_t *script,e,f; + GetOpReturnData(scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> K; ss >> signerpk; ss >> coin; ss >> hex) != 0 ) + { + return(f); + } + return(0); +} + uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,std::string &coin,uint256 &tokenid,int64_t &totalsupply,uint256 &oracletxid,uint8_t &M,uint8_t &N,std::vector &pubkeys,uint8_t &taddr,uint8_t &prefix,uint8_t &prefix2) { std::vector vopret; uint8_t *script,e,f; @@ -873,31 +885,60 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) return(result); } -std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr) +std::string GatewaysMultisig(char *txidaddr) { - UniValue result(UniValue::VOBJ); std::string coin,hex; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CPubKey Gatewayspk,mypk; struct CCcontract_info *cp,C; int32_t i,n,complete,partialtx; int64_t totalsupply; - cp = CCinit(&C,EVAL_GATEWAYS); - if ( txfee == 0 ) - txfee = 10000; - complete = partialtx = 0; - mypk = pubkey2pk(Mypubkey()); - Gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(gatewaysassets,EVAL_GATEWAYS,Gatewayspk); - if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) + std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K; CPubKey signerpk; + std::vector > unspentOutputs; + + SetCCunspents(unspentOutputs,txidaddr); + if (unspentOutputs.size()==0) return (""); + maxK=0; + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { - depositaddr[0] = 0; - if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 1 && coin == refcoin ) + txid = it->first.txhash; + if (GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) { - // need a decentralized way to add signatures to msig tx - n = pubkeys.size(); - for (i=0; i0) return(parthex); + else return (""); +} + +std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoin, std::string hex) +{ + CMutableTransaction mtx; CScript opret; CPubKey mypk,gatewayspk,signerpk; struct CCcontract_info *cp,C; CTransaction tx; + std::vector > unspentOutputs; + int32_t maxK,K; uint256 txid,parttxid,hashBlock; + cp = CCinit(&C,EVAL_GATEWAYS); + if ( txfee == 0 ) + txfee = 5000; + mypk = pubkey2pk(Mypubkey()); + gatewayspk = GetUnspendable(cp,0); + SetCCunspents(unspentOutputs,txidaddr); + if (unspentOutputs.size()==0) + { + if (AddNormalinputs(mtx,mypk,2*txfee,2)==0) + fprintf(stderr,"error adding funds for partialsign\n"); + } + else + { + maxK=0; + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + if (GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) + { + maxK=K; + parttxid=txid; + } + } + if (maxK>0) mtx.vin.push_back(CTxIn(parttxid,0,CScript())); + else fprintf(stderr,"Error finding previous partial tx\n"); + } + + mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG)); + opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K << mypk << refcoin << hex); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 7d2eab1e3..e4dcdbbbd 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -426,6 +426,7 @@ static const CRPCCommand vRPCCommands[] = { "gateways", "gatewayspending", &gatewayspending, true }, { "gateways", "gatewaysmultisig", &gatewaysmultisig, true }, { "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true }, + { "gateways", "gatewayspartialsign", &gatewayspartialsign, true }, /* dice */ { "dice", "dicelist", &dicelist, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index a78f1b6fc..cf23f6496 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -253,6 +253,7 @@ extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); extern UniValue gatewayspending(const UniValue& params, bool fHelp); extern UniValue gatewaysmarkdone(const UniValue& params, bool fHelp); extern UniValue gatewaysmultisig(const UniValue& params, bool fHelp); +extern UniValue gatewayspartialsign(const UniValue& params, bool fHelp); extern UniValue channelsinfo(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); extern UniValue channelspayment(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 59f0b6ba7..014f8973e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5592,18 +5592,36 @@ UniValue gatewayspending(const UniValue& params, bool fHelp) UniValue gatewaysmultisig(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 bindtxid,withtxid; std::string coin,hex; char *txidaddr; - if ( fHelp || params.size() != 4 ) - throw runtime_error("gatewaysmultisig bindtxid coin withtxid txidaddr\n"); + UniValue result(UniValue::VOBJ); std::string hex; char *txidaddr; + if ( fHelp || params.size() != 1 ) + throw runtime_error("gatewaysmultisig txidaddr\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; - LOCK2(cs_main, pwalletMain->cs_wallet); - bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + LOCK2(cs_main, pwalletMain->cs_wallet); + txidaddr = (char *)params[0].get_str().c_str(); + hex = GatewaysMultisig(txidaddr); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex",hex)); + } else ERR_RESULT("couldnt gatewaysmultisig"); + return(result); +} + +UniValue gatewayspartialsign(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; char *txidaddr; + if ( fHelp || params.size() != 3 ) + throw runtime_error("gatewayspartialsign txidaddr refcoin\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + txidaddr = (char *)params[0].get_str().c_str(); coin = params[1].get_str(); - withtxid = Parseuint256((char *)params[2].get_str().c_str()); - txidaddr = (char *)params[3].get_str().c_str(); - hex = GatewaysMultisig(0,coin,bindtxid,withtxid,txidaddr); + coin = params[2].get_str(); + hex = GatewaysPartialSign(0,txidaddr,coin,parthex); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 4dbfd427b712bc69bef7e8165490d8da192b0ece Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 16:40:58 +0200 Subject: [PATCH 05/87] Fix --- src/cc/dapps/oraclefeed.c | 10 +++++----- src/cc/gateways.cpp | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index e85206071..98b5664d6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -869,11 +869,11 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else fprintf(stderr,"couldnt create msig rawtx\n"); } } - else if ( retval > 0 ) - { - fprintf(stderr,"already did withdraw %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid,refcoin,zeroid); - } + // else if ( retval > 0 ) + // { + // fprintf(stderr,"already did withdraw %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); + // gatewaysmarkdone("KMD",acname,origtxid,refcoin,zeroid); + // } } } } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 6d1bff5c9..cd892e131 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -801,7 +801,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin CCchange = (inputs - amount); mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,amount,gatewayspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << withdrawpub << OP_CHECKSIG)); - mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG)); + mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,txfee,gatewayspk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CCchange,mypk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); @@ -818,6 +818,7 @@ std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string ref if ( txfee == 0 ) txfee = 5000; mypk = pubkey2pk(Mypubkey()); + mtx.vin.push_back(CTxIn(withdrawtxid,2,CScript())); mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'M' << cointxid << refcoin); From 32572846ded619b882a2ac70fe621e3bb6b4963b Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 16:55:36 +0200 Subject: [PATCH 06/87] Fix --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cd892e131..828695a2e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -827,7 +827,7 @@ std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string ref UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { - UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); @@ -864,6 +864,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); if ( strcmp(destaddr,coinaddr) == 0 ) { + UniValue obj(UniValue::VOBJ); obj.push_back(Pair("txid",uint256_str(str,txid))); CCtxidaddr(txidaddr,txid); obj.push_back(Pair("txidaddr",txidaddr)); From b18631ae2bd00d13c7b6a6bde39a5158834fed08 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 17:49:21 +0200 Subject: [PATCH 07/87] Fix --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 46 +++++++++++++++++++++++++++++++++------- src/wallet/rpcwallet.cpp | 4 ++-- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 70c50dcdb..63f572378 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -24,7 +24,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction & std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); -std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); +std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); std::string GatewaysMultisig(char *txidaddr); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 828695a2e..81ec4b40f 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -190,6 +190,29 @@ uint8_t DecodeGatewaysPartialOpRet(const CScript &scriptPubKey,int32_t &K, CPubK return(0); } +uint8_t DecodeGatewaysWithdrawOpRet(const CScript &scriptPubKey, uint256 &assetid, std::string &refcoin, CPubKey &withdrawpub, int64_t &amount) +{ + std::vector vopret; uint8_t *script,e,f; + GetOpReturnData(scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> refcoin; ss >> withdrawpub; ss >> amount) != 0 ) + { + return(f); + } + return(0); +} +uint8_t DecodeGatewaysMarkdoneOpRet(const CScript &scriptPubKey, std::string &refcoin, uint256 &cointxid) +{ + std::vector vopret; uint8_t *script,e,f; + GetOpReturnData(scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> refcoin; ss >> cointxid) != 0 ) + { + return(f); + } + return(0); +} + uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,std::string &coin,uint256 &tokenid,int64_t &totalsupply,uint256 &oracletxid,uint8_t &M,uint8_t &N,std::vector &pubkeys,uint8_t &taddr,uint8_t &prefix,uint8_t &prefix2) { std::vector vopret; uint8_t *script,e,f; @@ -775,9 +798,11 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui return(""); } -std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) +std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C; + uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; + std::vector msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; CScript opret; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -800,11 +825,12 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin if ( inputs > amount ) CCchange = (inputs - amount); mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,amount,gatewayspk)); - mtx.vout.push_back(CTxOut(txfee,CScript() << withdrawpub << OP_CHECKSIG)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(withdrawpub)) << OP_CHECKSIG)); mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,txfee,gatewayspk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CCchange,mypk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'W' << assetid << refcoin << withdrawpub << amount); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); @@ -827,8 +853,12 @@ std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string ref UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { - UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin,tmprefcoin; CPubKey mypk,gatewayspk,withdrawpub; std::vector msigpubkeys; + uint256 cointxid,hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; + char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; + int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply,amount; struct CCcontract_info *cp,C; std::vector > unspentOutputs; + cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); @@ -851,14 +881,14 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) queueflag = 1; break; } - Getscriptaddress(withmarker,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG); - SetCCunspents(unspentOutputs,withmarker); + //Getscriptaddress(withmarker,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG); + SetCCunspents(unspentOutputs,coinaddr); numqueued = 0; for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; vout = (int32_t)it->first.index; - if ( GetTransaction(txid,tx,hashBlock,false) != 0 ) + if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts=tx.vout.size())>0 && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'M') { Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 014f8973e..13fb81c2d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5545,10 +5545,10 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp) const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); - coin = params[1].get_str(); + coin = params[1].get_str(); withdrawpub = ParseHex(params[2].get_str()); amount = atof((char *)params[3].get_str().c_str()) * COIN; - hex = GatewaysWithdraw(0,bindtxid,coin,withdrawpub,amount); + hex = GatewaysWithdraw(0,bindtxid,coin,pubkey2pk(withdrawpub),amount); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 07660bb09808b2ad485f38076ffc51d60365f046 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 18:08:39 +0200 Subject: [PATCH 08/87] Fix --- src/cc/gateways.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 81ec4b40f..38062d401 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -856,7 +856,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) UniValue result(UniValue::VOBJ),pending(UniValue::VARR); CTransaction tx; std::string coin,tmprefcoin; CPubKey mypk,gatewayspk,withdrawpub; std::vector msigpubkeys; uint256 cointxid,hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; - int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply,amount; struct CCcontract_info *cp,C; + int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply,amount,nValue; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); @@ -888,7 +888,9 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { txid = it->first.txhash; vout = (int32_t)it->first.index; - if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts=tx.vout.size())>0 && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'M') + nValue = (int64_t)it->second.satoshis; + fprintf(stderr,"%s %d %ld\n",txid.ToString().c_str(),vout,(long)nValue); + if ( vout == 2 && nValue == 10000 && GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'W') { Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); From f29445f03ea24d7bd124fec93c198ca7d64b2f54 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 21:45:52 +0200 Subject: [PATCH 09/87] Fix --- src/cc/dapps/oraclefeed.c | 6 +++--- src/cc/gateways.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 98b5664d6..f6b385aa5 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -750,7 +750,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd return(retval); } -int32_t sendfromthisnode(char *refcoin,char *acname,char *coinaddr) +int32_t markerfromth(char *refcoin,char *acname,char *coinaddr) { cJSON *array,*item; bits256 txid; int32_t i,n,num=0; char *tmptxid,*retstr; if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) @@ -813,7 +813,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (depositaddr= jstr(item,"depositaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { - if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && sendfromthisnode("KMD",acname,txidaddr) == 0) + if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && markerfromthisnode("KMD",acname,txidaddr) == 0) { // the actual withdraw if ( strcmp(depositaddr,signeraddr) == 0 ) @@ -859,7 +859,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else if ( jint(clijson,"partialtx") != 0 ) { - K=gatewayspartialsign(refcoin,acname,txidaddr,jstr(retjson,"hex")); + K=gatewayspartialsign(refcoin,acname,txidaddr,jstr(clijson,"hex")); fprintf(stderr,"%d of %d partialtx %s sent\n",K,N,bits256_str(str,txid)); } free_json(clijson); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 38062d401..f993a84c3 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -972,7 +972,7 @@ std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoi else fprintf(stderr,"Error finding previous partial tx\n"); } - mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG)); + mtx.vout.push_back(CTxOut(5000,txidaddr)); opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K << mypk << refcoin << hex); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 13fb81c2d..d7f25b50f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5613,7 +5613,7 @@ UniValue gatewayspartialsign(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; char *txidaddr; if ( fHelp || params.size() != 3 ) - throw runtime_error("gatewayspartialsign txidaddr refcoin\n"); + throw runtime_error("gatewayspartialsign txidaddr refcoin hex\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; From 8841c81404e2e71b9ff0f962308d3336b99bbb57 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 22:02:42 +0200 Subject: [PATCH 10/87] Fix --- src/cc/CCGateways.h | 2 +- src/cc/channels.cpp | 8 ++++---- src/cc/dapps/oraclefeed.c | 8 ++++---- src/cc/gateways.cpp | 18 +++++++++--------- src/wallet/rpcwallet.cpp | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 63f572378..cd094fce0 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -28,7 +28,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); std::string GatewaysMultisig(char *txidaddr); -std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoin, std::string hex); +std::string GatewaysPartialSign(uint64_t txfee,uint256 txidaddr,std::string refcoin, std::string hex); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/channels.cpp b/src/cc/channels.cpp index bd0b5bb7f..f32e9d4d1 100644 --- a/src/cc/channels.cpp +++ b/src/cc/channels.cpp @@ -64,7 +64,7 @@ Possible third iteration: int64_t IsChannelsvout(struct CCcontract_info *cp,const CTransaction& tx,CPubKey srcpub, CPubKey destpub,int32_t v) { - char destaddr[64],channeladdr[64]; + char destaddr[65],channeladdr[65]; GetCCaddress1of2(cp,channeladdr,srcpub,destpub); if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -77,7 +77,7 @@ int64_t IsChannelsvout(struct CCcontract_info *cp,const CTransaction& tx,CPubKey int64_t IsChannelsMarkervout(struct CCcontract_info *cp,const CTransaction& tx,CPubKey srcpub,int32_t v) { - char destaddr[64],ccaddr[64]; + char destaddr[65],ccaddr[65]; GetCCaddress(cp,ccaddr,srcpub); if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -364,7 +364,7 @@ bool ChannelsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction & int64_t AddChannelsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx, CTransaction openTx, uint256 &prevtxid) { - char coinaddr[64]; int64_t param2,totalinputs = 0,numvouts; uint256 txid=zeroid,tmp_txid,hashBlock,param3; CTransaction tx; int32_t param1; + char coinaddr[65]; int64_t param2,totalinputs = 0,numvouts; uint256 txid=zeroid,tmp_txid,hashBlock,param3; CTransaction tx; int32_t param1; std::vector > unspentOutputs; CPubKey srcpub,destpub; uint8_t myprivkey[32]; @@ -692,7 +692,7 @@ std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid) UniValue ChannelsInfo(uint256 channeltxid) { UniValue result(UniValue::VOBJ); CTransaction tx,opentx; uint256 txid,tmp_txid,hashBlock,param3,opentxid,hashchain,prevtxid; - struct CCcontract_info *cp,C; char myCCaddr[64],addr[64],str1[256],str2[64]; int32_t vout,numvouts,param1,numpayments; + struct CCcontract_info *cp,C; char myCCaddr[65],addr[65],str1[256],str2[65]; int32_t vout,numvouts,param1,numpayments; int64_t nValue,param2,payment; CPubKey srcpub,destpub,mypk; std::vector > txids; diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index f6b385aa5..c5dea8de9 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -660,10 +660,10 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr) return(hex); } -int32_t gatewayspartialsign(char *refcoin,char *acname,char *txidaddr,char *hex) +int32_t gatewayspartialsign(char *refcoin,char *acname,bits256 txid,char *hex) { - char str[65],str2[65],*retstr; cJSON *retjson; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspartialsign",txidaddr,refcoin,hex,"")) != 0 ) + char str[65],*retstr; cJSON *retjson; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspartialsign",bits256_str(str,txid),refcoin,hex,"")) != 0 ) { komodobroadcast(refcoin,acname,retjson); return(jint(retjson,"rank")); @@ -859,7 +859,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else if ( jint(clijson,"partialtx") != 0 ) { - K=gatewayspartialsign(refcoin,acname,txidaddr,jstr(clijson,"hex")); + K=gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex")); fprintf(stderr,"%d of %d partialtx %s sent\n",K,N,bits256_str(str,txid)); } free_json(clijson); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index f993a84c3..5ab78fb8e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -940,16 +940,16 @@ std::string GatewaysMultisig(char *txidaddr) else return (""); } -std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoin, std::string hex) +std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, std::string hex) { - CMutableTransaction mtx; CScript opret; CPubKey mypk,gatewayspk,signerpk; struct CCcontract_info *cp,C; CTransaction tx; - std::vector > unspentOutputs; - int32_t maxK,K; uint256 txid,parttxid,hashBlock; + CMutableTransaction mtx; CScript opret; CPubKey mypk,txidaddrpk,signerpk; struct CCcontract_info *cp,C; CTransaction tx; + std::vector > unspentOutputs; char txidaddr[65]; + int32_t maxK,K; uint256 tmptxid,parttxid,hashBlock; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 5000; mypk = pubkey2pk(Mypubkey()); - gatewayspk = GetUnspendable(cp,0); + txidaddrpk=CCtxidaddr(txidaddr,txid); SetCCunspents(unspentOutputs,txidaddr); if (unspentOutputs.size()==0) { @@ -961,18 +961,18 @@ std::string GatewaysPartialSign(uint64_t txfee,char* txidaddr,std::string refcoi maxK=0; for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { - txid = it->first.txhash; - if (GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) + tmptxid = it->first.txhash; + if (GetTransaction(tmptxid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) { maxK=K; - parttxid=txid; + parttxid=tmptxid; } } if (maxK>0) mtx.vin.push_back(CTxIn(parttxid,0,CScript())); else fprintf(stderr,"Error finding previous partial tx\n"); } - mtx.vout.push_back(CTxOut(5000,txidaddr)); + mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(txidaddrpk)) << OP_CHECKSIG)); opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K << mypk << refcoin << hex); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d7f25b50f..ca3c0bea4 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5611,17 +5611,17 @@ UniValue gatewaysmultisig(const UniValue& params, bool fHelp) UniValue gatewayspartialsign(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; char *txidaddr; + UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; uint256 txid; if ( fHelp || params.size() != 3 ) throw runtime_error("gatewayspartialsign txidaddr refcoin hex\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); - txidaddr = (char *)params[0].get_str().c_str(); + txid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); - coin = params[2].get_str(); - hex = GatewaysPartialSign(0,txidaddr,coin,parthex); + parthex = params[2].get_str(); + hex = GatewaysPartialSign(0,txid,coin,parthex); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 0c3f76e992bb742c4dffd00c20826274c6d1e879 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 22:15:18 +0200 Subject: [PATCH 11/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index c5dea8de9..6d3695a5f 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -750,7 +750,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd return(retval); } -int32_t markerfromth(char *refcoin,char *acname,char *coinaddr) +int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) { cJSON *array,*item; bits256 txid; int32_t i,n,num=0; char *tmptxid,*retstr; if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) From ced164c07acb247962df17b0aed54a066979036e Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Fri, 26 Oct 2018 23:53:58 +0200 Subject: [PATCH 12/87] Fix --- src/cc/gateways.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5ab78fb8e..c3d09098c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -944,7 +944,7 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, { CMutableTransaction mtx; CScript opret; CPubKey mypk,txidaddrpk,signerpk; struct CCcontract_info *cp,C; CTransaction tx; std::vector > unspentOutputs; char txidaddr[65]; - int32_t maxK,K; uint256 tmptxid,parttxid,hashBlock; + int32_t maxK,K=0; uint256 tmptxid,parttxid,hashBlock; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 5000; @@ -953,8 +953,7 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, SetCCunspents(unspentOutputs,txidaddr); if (unspentOutputs.size()==0) { - if (AddNormalinputs(mtx,mypk,2*txfee,2)==0) - fprintf(stderr,"error adding funds for partialsign\n"); + if (AddNormalinputs(mtx,mypk,2*txfee,2)==0) fprintf(stderr,"error adding funds for partialsign\n"); } else { @@ -973,6 +972,6 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, } mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(txidaddrpk)) << OP_CHECKSIG)); - opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K << mypk << refcoin << hex); + opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K+1 << mypk << refcoin << hex); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } From 11e854b9247119032e1a45740e712514abd5d17e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 27 Oct 2018 21:15:31 -1100 Subject: [PATCH 13/87] Handle 10 simul dice bet spammers --- src/cc/dice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 3a2d3129c..5d1620edf 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -968,7 +968,7 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet int32_t entropytxs; if ( (funding= DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,entropytxs)) >= 2*bet*odds+txfee && entropyval != 0 ) { - if ( entropytxs < 2 ) { + if ( entropytxs < 10 ) { error = "Your dealer is broke, find a new casino."; return(""); } From e36c6f65ee56169df909a2c49b025fb87ec453c6 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 18:04:29 +0800 Subject: [PATCH 14/87] posibly stable --- src/cc/CCtx.cpp | 2 +- src/cc/dice.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 5c2c42e97..3326e9447 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -276,7 +276,7 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * abovei = belowi = -1; for (above=below=i=0; i 150 ) { + if ( numunspents > 500 ) { if ( (rand() % 100) < 80 ) continue; } diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 86483d008..927ab7b95 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -578,7 +578,7 @@ bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) } else { - if ( skipped == 0) + if ( skipped == 0 ) { //vout.0: funding CC change to entropy owner //vout.2: normal output to bettor's address From d72c39339362553b98c0ebd77ef4cd393439223b Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 18:36:22 +0800 Subject: [PATCH 15/87] done? --- src/cc/CCtx.cpp | 4 ---- src/cc/dice.cpp | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 3326e9447..71669a0a6 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -276,10 +276,6 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * abovei = belowi = -1; for (above=below=i=0; i 500 ) { - if ( (rand() % 100) < 80 ) - continue; - } if ( (atx_value= utxos[i].nValue) <= 0 ) continue; if ( atx_value == value ) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 927ab7b95..afebfd4e4 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -1203,6 +1203,7 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx } error = "didnt find dicefinish tx"; } + error = res; return(-1.); } return(0.); From 71d9c82c7ab7593281f9010e4bd803065dffaac1 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 12:46:51 +0100 Subject: [PATCH 16/87] Check mempool for markdone in pending --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index c3d09098c..b49d51664 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -880,8 +880,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { queueflag = 1; break; - } - //Getscriptaddress(withmarker,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG); + } SetCCunspents(unspentOutputs,coinaddr); numqueued = 0; for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) @@ -890,7 +889,8 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) vout = (int32_t)it->first.index; nValue = (int64_t)it->second.satoshis; fprintf(stderr,"%s %d %ld\n",txid.ToString().c_str(),vout,(long)nValue); - if ( vout == 2 && nValue == 10000 && GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) && DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'W') + if ( vout == 2 && nValue == 10000 && GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) && + DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'W' && myIsutxo_spentinmempool(txid,vout) != 0) { Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); From 6756a2f4f2f39aaee88174ad81f3e84d52d895a2 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 20:00:04 +0800 Subject: [PATCH 17/87] done --- src/cc/dice.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index afebfd4e4..67d251bcc 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -413,10 +413,8 @@ int32_t DiceIsWinner(uint256 &entropy,uint256 txid,CTransaction tx,CTransaction hentropy2 = DiceHashEntropy(entropy,vinTx.vin[0].prevout.hash); if ( hentropy == hentropy2 ) { - char str[65]; - fprintf(stderr, "%s something \n",uint256_str(str,entropy)); winnings = DiceCalc(tx.vout[1].nValue,tx.vout[2].nValue,minbet,maxbet,maxodds,timeoutblocks,entropy,bettorentropy); - fprintf(stderr,"%s winnings %.8f bet %.8f at odds %d:1\n",uint256_str(str,tx.GetHash()),(double)winnings/COIN,(double)tx.vout[1].nValue/COIN,(int32_t)(tx.vout[2].nValue-10000)); + char str[65]; fprintf(stderr,"%s winnings %.8f bet %.8f at odds %d:1\n",uint256_str(str,tx.GetHash()),(double)winnings/COIN,(double)tx.vout[1].nValue/COIN,(int32_t)(tx.vout[2].nValue-10000)); //fprintf(stderr,"I am house entropy %.8f entropy.(%s) vs %s -> winnings %.8f\n",(double)vinTx.vout[0].nValue/COIN,uint256_str(str,entropy),uint256_str(str2,hash),(double)winnings/COIN); if ( winnings == 0 ) { @@ -736,7 +734,9 @@ int64_t DicePlanFunds(uint64_t &entropyval,uint256 &entropytxid,uint64_t refsbit entropytxid = txid; entropyval = tx.vout[0].nValue; first = 1; - fprintf(stderr, "chosen entropy on loop: %d\n",loops); + if (random) { + fprintf(stderr, "chosen entropy on loop: %d\n",loops); + } } else { @@ -1202,8 +1202,7 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx } else return(0.); } error = "didnt find dicefinish tx"; - } - error = res; + } else error = res; return(-1.); } return(0.); From a96dafc837b141e1f0a7d6c448a8048a05193eb6 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 13:03:24 +0100 Subject: [PATCH 18/87] Fix --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b49d51664..8a04a1b30 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -890,7 +890,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) nValue = (int64_t)it->second.satoshis; fprintf(stderr,"%s %d %ld\n",txid.ToString().c_str(),vout,(long)nValue); if ( vout == 2 && nValue == 10000 && GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) && - DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'W' && myIsutxo_spentinmempool(txid,vout) != 0) + DecodeGatewaysWithdrawOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,tmprefcoin,withdrawpub,amount) == 'W' && myIsutxo_spentinmempool(txid,vout) == 0) { Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); From c57612e01bf8191673dd9f59eda36aa0e24bd02c Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 13:24:38 +0100 Subject: [PATCH 19/87] Check mempool in Gateways Multisig --- src/cc/gateways.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 8a04a1b30..2f554b47a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -921,7 +921,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) std::string GatewaysMultisig(char *txidaddr) { - std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K; CPubKey signerpk; + std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K,numvouts; CPubKey signerpk; std::vector > unspentOutputs; SetCCunspents(unspentOutputs,txidaddr); @@ -930,12 +930,25 @@ std::string GatewaysMultisig(char *txidaddr) for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; - if (GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) + if (GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts=tx.vout.size()) > 0 && DecodeGatewaysPartialOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK ) { maxK=K; parthex=hex; } } + + BOOST_FOREACH(const CTxMemPoolEntry &e, mempool.mapTx) + { + const CTransaction &txmempool = e.GetTx(); + const uint256 &hash = txmempool.GetHash(); + + if ((numvouts=txmempool.vout.size()) > 0 && DecodeGatewaysPartialOpRet(txmempool.vout[numvouts-1].scriptPubKey,K,signerpk,refcoin,hex) == 'P' && K>maxK) + { + maxK=K; + parthex=hex; + } + } + if (maxK>0) return(parthex); else return (""); } From 16e69092d98ff90aa360cac66515d8cfd548c114 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:17:09 +0800 Subject: [PATCH 20/87] first try --- src/main.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 11df78609..676c77cdc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -92,6 +92,7 @@ unsigned int expiryDelta = DEFAULT_TX_EXPIRY_DELTA; CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE); CTxMemPool mempool(::minRelayTxFee); +CTxMemPool tmpmempool(::minRelayTxFee); struct COrphanTx { CTransaction tx; @@ -1697,7 +1698,7 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo } } //fprintf(stderr,"check disk\n"); - + if (fTxIndex) { CDiskTxPos postx; //fprintf(stderr,"ReadTxIndex\n"); @@ -4247,6 +4248,17 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { CValidationState stateDummy; int32_t i,j,rejects=0,lastrejects=0; //fprintf(stderr,"put block's tx into mempool\n"); + // Copy the mempool to temporary mempool because there can be tx in local mempool that make the block invalid. + LOCK(mempool.cs); + BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { + const CTransaction &tx = e.GetTx(); + const uint256 &hash = tx.GetHash(); + tmpmempool.addUnchecked(hash,e,!IsInitialBlockDownload()); + fprintf(stderr, "added mempool tx to temp mempool\n"); + } + // clear the mempool before importing all block txs to mempool. + mempool.clear(); + // add all the txs in the block to the empty mempool. while ( 1 ) { for (i=0; i Date: Mon, 29 Oct 2018 21:19:15 +0800 Subject: [PATCH 21/87] more --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 676c77cdc..cb07c181b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4310,7 +4310,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { const CTransaction &tx = e.GetTx(); - if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival. + if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); } From 7a0832ebb09153978d96c36eec3533ecb67aa6d6 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:31:31 +0800 Subject: [PATCH 22/87] fix --- src/main.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cb07c181b..1b160097b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4307,16 +4307,19 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C LogPrintf("CheckBlockHeader komodo_check_deposit error"); return(false); } - int invalidtxs = 0; - BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - const CTransaction &tx = e.GetTx(); - if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. - invalidtxs++; - fprintf(stderr, "added mempool tx back to mempool\n"); + if ( ASSETCHAINS_CC != 0 ) // CC contracts might refer to transactions in the current block, from a CC spend within the same block and out of order + { + int invalidtxs = 0; + BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { + const CTransaction &tx = e.GetTx(); + if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. + invalidtxs++; + fprintf(stderr, "added mempool tx back to mempool\n"); + } + fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); + // empty the temp mempool for next time. + tmpmempool.clear(); } - fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); - // empty the temp mempool for next time. - tmpmempool.clear(); return true; } From eae3058c515ac9b3675838e71a504ae7a6d9ef80 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:34:45 +0800 Subject: [PATCH 23/87] try --- src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1b160097b..ac22d7dd5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4251,8 +4251,8 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C // Copy the mempool to temporary mempool because there can be tx in local mempool that make the block invalid. LOCK(mempool.cs); BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { - const CTransaction &tx = e.GetTx(); - const uint256 &hash = tx.GetHash(); + CTransaction &tx = e.GetTx(); + uint256 &hash = tx.GetHash(); tmpmempool.addUnchecked(hash,e,!IsInitialBlockDownload()); fprintf(stderr, "added mempool tx to temp mempool\n"); } @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - const CTransaction &tx = e.GetTx(); + CTransaction &tx = e.GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From 22bbf1477c258b75efc930172df2d73f4ca87fd0 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:40:12 +0800 Subject: [PATCH 24/87] try --- src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ac22d7dd5..db2e9a3f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4251,8 +4251,8 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C // Copy the mempool to temporary mempool because there can be tx in local mempool that make the block invalid. LOCK(mempool.cs); BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { - CTransaction &tx = e.GetTx(); - uint256 &hash = tx.GetHash(); + const CTransaction &tx = e.GetTx(); + const uint256 &hash = tx.GetHash(); tmpmempool.addUnchecked(hash,e,!IsInitialBlockDownload()); fprintf(stderr, "added mempool tx to temp mempool\n"); } @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction &tx = e.GetTx(); + CTransaction &tx = e->GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From bb2a48ab545d10b23853d68cc77e0d995fee1456 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:43:13 +0800 Subject: [PATCH 25/87] try --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index db2e9a3f4..3ec949b21 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction &tx = e->GetTx(); + CTransaction &tx = e.GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From 441240215fc3365499a3493ccbf2cd2a559a2903 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:43:37 +0800 Subject: [PATCH 26/87] this --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 3ec949b21..0ed53e0c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction &tx = e.GetTx(); + CTransaction tx = e.GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From 624d0e81cbc06ea573031b15ccaf5088a260a756 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:43:58 +0800 Subject: [PATCH 27/87] a --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 0ed53e0c7..801432a71 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction tx = e.GetTx(); + CTransaction& tx = e.GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From b64c592e07dc6ad1fb07852de5a8fd521af73db1 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:46:24 +0800 Subject: [PATCH 28/87] try --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 801432a71..0ed53e0c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4311,7 +4311,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction& tx = e.GetTx(); + CTransaction tx = e.GetTx(); if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); From f8074b70496e72cacdd2fabc3b50e1f8dce987d4 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 21:57:48 +0800 Subject: [PATCH 29/87] remove hack --- src/cc/dice.cpp | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 67d251bcc..c5f289487 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -443,7 +443,7 @@ bool DiceVerifyTimeout(CTransaction &betTx,int32_t timeoutblocks) bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) { uint256 txid,fundingtxid,vinfundingtxid,vinhentropy,vinproof,hashBlock,hash,proof,entropy; int64_t minbet,maxbet,maxodds,timeoutblocks,odds,winnings; uint64_t vinsbits,sbits,amount,inputs,outputs,txfee=10000; int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,iswin; uint8_t funcid; CScript fundingPubKey; CTransaction fundingTx,vinTx,vinofvinTx; char CCaddr[64]; - CBlockIndex block; int skipped = 0; + CBlockIndex block; numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; @@ -551,8 +551,7 @@ bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) else if ( eval->GetTxUnconfirmed(tx.vin[1].prevout.hash,vinTx,hashBlock) == 0 ) { char str[65],str2[65],str3[65]; fprintf(stderr, "txid.%s tx.%s hashBlock.%s\n",uint256_str(str,txid),uint256_str(str2,tx.vin[1].prevout.hash),uint256_str(str3,hashBlock)); - //return eval->Invalid("always should find looking vin.0, but didnt for wlt"); - skipped = 1; + return eval->Invalid("always should find looking vin.0, but didnt for wlt"); } else if (hashBlock.IsNull() || !eval->GetBlock(hashBlock, block)) return eval->Invalid(" TX not confirmed! always should find vin.0, but didnt for wlt"); else if ( vinTx.vout.size() < 3 || DecodeDiceOpRet(tx.vin[1].prevout.hash,vinTx.vout[vinTx.vout.size()-1].scriptPubKey,vinsbits,vinfundingtxid,vinhentropy,vinproof) != 'B' ) @@ -576,30 +575,27 @@ bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) } else { - if ( skipped == 0 ) + //vout.0: funding CC change to entropy owner + //vout.2: normal output to bettor's address + //vout.n-1: opreturn 'W' sbits fundingtxid hentropy proof + odds = vinTx.vout[2].nValue - txfee; + if ( ConstrainVout(tx.vout[0],1,cp->unspendableCCaddr,0) == 0 ) + return eval->Invalid("vout[0] != inputs-txfee for win/timeout"); + else if ( tx.vout[2].scriptPubKey != vinTx.vout[2].scriptPubKey ) + return eval->Invalid("vout[2] scriptPubKey mismatch for win/timeout"); + else if ( tx.vout[2].nValue != (odds+1)*vinTx.vout[1].nValue ) + return eval->Invalid("vout[2] payut mismatch for win/timeout"); + else if ( inputs != (outputs + tx.vout[2].nValue) && inputs != (outputs + tx.vout[2].nValue+txfee) ) { - //vout.0: funding CC change to entropy owner - //vout.2: normal output to bettor's address - //vout.n-1: opreturn 'W' sbits fundingtxid hentropy proof - odds = vinTx.vout[2].nValue - txfee; - if ( ConstrainVout(tx.vout[0],1,cp->unspendableCCaddr,0) == 0 ) - return eval->Invalid("vout[0] != inputs-txfee for win/timeout"); - else if ( tx.vout[2].scriptPubKey != vinTx.vout[2].scriptPubKey ) - return eval->Invalid("vout[2] scriptPubKey mismatch for win/timeout"); - else if ( tx.vout[2].nValue != (odds+1)*vinTx.vout[1].nValue ) - return eval->Invalid("vout[2] payut mismatch for win/timeout"); - else if ( inputs != (outputs + tx.vout[2].nValue) && inputs != (outputs + tx.vout[2].nValue+txfee) ) - { - fprintf(stderr,"inputs %.8f != outputs %.8f + %.8f\n",(double)inputs/COIN,(double)outputs/COIN,(double)tx.vout[2].nValue/COIN); - return eval->Invalid("CC funds mismatch for win/timeout"); - } - else if ( tx.vout[3].scriptPubKey != fundingPubKey ) - { - if ( tx.vout[3].scriptPubKey.size() == 0 || ((uint8_t *)tx.vout[3].scriptPubKey.data())[0] != 0x6a ) - return eval->Invalid("vout[3] not send to fundingPubKey for win/timeout"); - } - iswin = (funcid == 'W'); + fprintf(stderr,"inputs %.8f != outputs %.8f + %.8f\n",(double)inputs/COIN,(double)outputs/COIN,(double)tx.vout[2].nValue/COIN); + return eval->Invalid("CC funds mismatch for win/timeout"); } + else if ( tx.vout[3].scriptPubKey != fundingPubKey ) + { + if ( tx.vout[3].scriptPubKey.size() == 0 || ((uint8_t *)tx.vout[3].scriptPubKey.data())[0] != 0x6a ) + return eval->Invalid("vout[3] not send to fundingPubKey for win/timeout"); + } + iswin = (funcid == 'W'); } if ( iswin != 0 ) { From 98eeeff0014ec84a2d705bcbda18700d92b830ef Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 22:14:55 +0800 Subject: [PATCH 30/87] temp disable random entropy to try and brake mempool --- src/cc/dice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index c5f289487..39a433efb 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -974,9 +974,9 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet error = strprintf("Dice plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds); return(""); } - int32_t entropytxs=0,emptyvar=0; + int32_t entropytxs=0; //,emptyvar=0; funding = DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,entropytxs,false); - DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,emptyvar,true); + //DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,emptyvar,true); if ( ( funding >= 2*bet*odds+txfee && entropyval != 0 ) ) { if ( entropytxs < 100 ) { From 916986cd544bd6dfc2edfcd12690e4c238a63fac Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 22:55:43 +0800 Subject: [PATCH 31/87] enabled utxo selection. --- src/cc/CCtx.cpp | 5 +++++ src/cc/dice.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 71669a0a6..60b52fba0 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -276,6 +276,11 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * abovei = belowi = -1; for (above=below=i=0; i 500 ) { + // if ( (rand() % 100) < 80 ) + // continue; + //} if ( (atx_value= utxos[i].nValue) <= 0 ) continue; if ( atx_value == value ) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 39a433efb..c5f289487 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -974,9 +974,9 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet error = strprintf("Dice plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds); return(""); } - int32_t entropytxs=0; //,emptyvar=0; + int32_t entropytxs=0,emptyvar=0; funding = DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,entropytxs,false); - //DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,emptyvar,true); + DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid,emptyvar,true); if ( ( funding >= 2*bet*odds+txfee && entropyval != 0 ) ) { if ( entropytxs < 100 ) { From 07cfded72b2305f8e70d2a8014a512ff552fe302 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 22:58:41 +0800 Subject: [PATCH 32/87] remoce getblock, redundant --- src/cc/dice.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index c5f289487..ef0b7675b 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -548,12 +548,8 @@ bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) return eval->Invalid("vin0 or vin1 normal vin for bet"); else if ( tx.vin[1].prevout.hash != tx.vin[2].prevout.hash ) return eval->Invalid("vin0 != vin1 prevout.hash for bet"); - else if ( eval->GetTxUnconfirmed(tx.vin[1].prevout.hash,vinTx,hashBlock) == 0 ) { - char str[65],str2[65],str3[65]; - fprintf(stderr, "txid.%s tx.%s hashBlock.%s\n",uint256_str(str,txid),uint256_str(str2,tx.vin[1].prevout.hash),uint256_str(str3,hashBlock)); + else if ( eval->GetTxUnconfirmed(tx.vin[1].prevout.hash,vinTx,hashBlock) == 0 ) return eval->Invalid("always should find looking vin.0, but didnt for wlt"); - } else if (hashBlock.IsNull() || !eval->GetBlock(hashBlock, block)) - return eval->Invalid(" TX not confirmed! always should find vin.0, but didnt for wlt"); else if ( vinTx.vout.size() < 3 || DecodeDiceOpRet(tx.vin[1].prevout.hash,vinTx.vout[vinTx.vout.size()-1].scriptPubKey,vinsbits,vinfundingtxid,vinhentropy,vinproof) != 'B' ) return eval->Invalid("not betTx for vin0/1 for wlt"); else if ( sbits != vinsbits || fundingtxid != vinfundingtxid ) From b88f5e1484d113f0631563ae8d69ae9503dedfd2 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:00:38 +0800 Subject: [PATCH 33/87] missed --- src/cc/dice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index ef0b7675b..29e36e968 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -542,7 +542,6 @@ bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) //vin.3+: funding CC vout.0 from 'F', 'E', 'W', 'L' or 'T' //vout.1: tag to owner address for entropy funds preventCCvouts = 1; - CBlockIndex block; DiceAmounts(inputs,outputs,cp,eval,tx,sbits,fundingtxid); if ( IsCCInput(tx.vin[1].scriptSig) == 0 || IsCCInput(tx.vin[2].scriptSig) == 0 ) return eval->Invalid("vin0 or vin1 normal vin for bet"); From b655a5ff0e13639060c964c41c3ac34ec07355c7 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:03:18 +0800 Subject: [PATCH 34/87] more --- src/cc/dice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 29e36e968..7e013ffe2 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -443,7 +443,6 @@ bool DiceVerifyTimeout(CTransaction &betTx,int32_t timeoutblocks) bool DiceValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) { uint256 txid,fundingtxid,vinfundingtxid,vinhentropy,vinproof,hashBlock,hash,proof,entropy; int64_t minbet,maxbet,maxodds,timeoutblocks,odds,winnings; uint64_t vinsbits,sbits,amount,inputs,outputs,txfee=10000; int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,iswin; uint8_t funcid; CScript fundingPubKey; CTransaction fundingTx,vinTx,vinofvinTx; char CCaddr[64]; - CBlockIndex block; numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; From 94153cd13539dbd53537f38b1116b6ba11115136 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 16:05:32 +0100 Subject: [PATCH 35/87] Fix import of multisig address --- src/cc/dapps/oraclefeed.c | 43 ++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 6d3695a5f..a1c917ca3 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -546,6 +546,24 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) } } +void admultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char *bindtxidstr) +{ + cJSON *retjson; char *retstr,Mstr[10]; + + printf("%d %s\n",M,pubkeys); + sprintf(Mstr,"%d",M); + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"addmultisigaddress",Mstr,pubkeys,bindtxidstr,"")) != 0 ) + { + printf("addmultisigaddress.(%s)\n",jprint(retjson,0)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"addmultisigaddress.(%s) %s error.(%s)\n",refcoin,acname,retstr); + free(retstr); + } +} + cJSON *getinputarray(int64_t *totalp,cJSON *unspents,int64_t required) { cJSON *vin,*item,*vins = cJSON_CreateArray(); int32_t i,n,v; int64_t satoshis; bits256 txid; @@ -691,9 +709,9 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit } } -int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) +int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr, char *pubkeys) { - char *oracle,*retstr,*name,*deposit; cJSON *retjson; + char *oracle,*retstr,*name,*deposit; cJSON *retjson,*pubarray; int32_t n; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","","")) != 0 ) { if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 && (deposit= jstr(retjson,"deposit")) != 0 ) @@ -705,6 +723,18 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *M *Np = jint(retjson,"N"); //printf("(%s)\n",jprint(retjson,0)); } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); + if (jarray(&n,retjson,"pubkeys")!=0) + { + pubkeys=malloc((sizeof(char)*70*n)+5); + sprintf(pubkeys,"\"["); + for (int i=0;i Date: Mon, 29 Oct 2018 16:09:11 +0100 Subject: [PATCH 36/87] Fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index a1c917ca3..dc9a0f342 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -546,7 +546,7 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) } } -void admultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char *bindtxidstr) +void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char *bindtxidstr) { cJSON *retjson; char *retstr,Mstr[10]; @@ -969,7 +969,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item,*pubkeys; int32_t acheight,i,retval,M,N,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,depositaddr[64],hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,M,N,n,height,prevheight = 0; char *pubkeys,*format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,depositaddr[64],hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; if ( argc < 6 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n"); From 38e5f55f1c9117b0bd5cfc81893631580c40880f Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 16:19:51 +0100 Subject: [PATCH 37/87] Add check if address exists in wallet --- src/cc/dapps/oraclefeed.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index dc9a0f342..74c47ea90 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -531,6 +531,23 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) return(0); } +int32_t validateaddress(char *refcoin,char *acname,char *depositaddr) +{ + cJSON *retjson; char *retstr; int32_t res=0; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"validateaddress",depositaddr,"","","")) != 0 ) + { + if (is_cJSON_True(jobj(retjson,"ismine")) != 0 ) res=1; + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"validateaddress.(%s) %s error.(%s)\n",refcoin,acname,retstr); + free(retstr); + } + + return (res); +} + void importaddress(char *refcoin,char *acname,char *depositaddr) { cJSON *retjson; char *retstr; @@ -1011,8 +1028,11 @@ int32_t main(int32_t argc,char **argv) printf("cant find bindtxid.(%s)\n",bindtxidstr); exit(0); } - if (M==N==1) importaddress(refcoin,"",depositaddr); - else addmultisigaddress(refcoin,"",M,pubkeys,bindtxidstr); + if (validateaddress(refcoin,"",depositaddr)==0) + { + if (M==N==1) importaddress(refcoin,"",depositaddr); + else addmultisigaddress(refcoin,"",M,pubkeys,bindtxidstr); + } if (pubkeys!=NULL) free(pubkeys); printf("set refcoin %s <- %s [%s] M.%d of N.%d\n",depositaddr,refcoin,REFCOIN_CLI,M,N); } From 6ba8c494e6925db53e8bbebf0e80866bd7206b86 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:26:41 +0800 Subject: [PATCH 38/87] try optional to disable nullifiers check --- src/main.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0ed53e0c7..2f90f161d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1310,7 +1310,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, boost::optional bool_nullifiers) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1391,14 +1391,17 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return false; } } - BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) + if (!bool_nullifiers) { - BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) + BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { - if (pool.mapNullifiers.count(nf)) + BOOST_FOREACH(const uint256 &nf, joinsplit.nullifiers) { - fprintf(stderr,"pool.mapNullifiers.count\n"); - return false; + if (pool.mapNullifiers.count(nf)) + { + fprintf(stderr,"pool.mapNullifiers.count\n"); + return false; + } } } } @@ -1678,11 +1681,15 @@ bool GetAddressUnspent(uint160 addressHash, int type, else return(coins.vout[n].nValue); }*/ -bool myAddtomempool(CTransaction &tx) +bool myAddtomempool(CTransaction &tx,boost:optional bool_nullifiers) { CValidationState state; CTransaction Ltx; bool fMissingInputs,fOverrideFees = false; - if ( mempool.lookup(tx.GetHash(),Ltx) == 0 ) - return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)); + if ( mempool.lookup(tx.GetHash(),Ltx) == 0 ) { + if (bool_nullifiers) + return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,bool_nullifiers)); + else + return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)); + } else return(true); } @@ -4312,7 +4319,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { CTransaction tx = e.GetTx(); - if ( myAddtomempool(tx) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. + if ( myAddtomempool(tx,1) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); } From 5010217b996a86edddd5b1603cc0473e7772235f Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:29:35 +0800 Subject: [PATCH 39/87] bootst include --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index 2f90f161d..31becb7d2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,6 +42,7 @@ #include #include #include +#include using namespace std; From 2c98a4f5fea89b776b7fe20fc262cbd1f45436ed Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:40:05 +0800 Subject: [PATCH 40/87] try --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index 31becb7d2..ea5255928 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1310,6 +1310,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF return nMinFee; } +using boost::optional; bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, boost::optional bool_nullifiers) { From 30d0a58a1ad8dce1b82b032ee7d91311d7d9b57d Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:41:54 +0800 Subject: [PATCH 41/87] fix --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index ea5255928..2ccc9aa17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1683,7 +1683,7 @@ bool GetAddressUnspent(uint160 addressHash, int type, else return(coins.vout[n].nValue); }*/ -bool myAddtomempool(CTransaction &tx,boost:optional bool_nullifiers) +bool myAddtomempool(CTransaction &tx,boost::optional bool_nullifiers) { CValidationState state; CTransaction Ltx; bool fMissingInputs,fOverrideFees = false; if ( mempool.lookup(tx.GetHash(),Ltx) == 0 ) { From 06bdc769992bb6f94b33390f7ab19ce346bf9d02 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:52:17 +0800 Subject: [PATCH 42/87] try --- src/main.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2ccc9aa17..5415705c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,6 @@ #include #include #include -#include using namespace std; @@ -1310,7 +1309,6 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF return nMinFee; } -using boost::optional; bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, boost::optional bool_nullifiers) { @@ -1683,15 +1681,11 @@ bool GetAddressUnspent(uint160 addressHash, int type, else return(coins.vout[n].nValue); }*/ -bool myAddtomempool(CTransaction &tx,boost::optional bool_nullifiers) +bool myAddtomempool(CTransaction &tx) { CValidationState state; CTransaction Ltx; bool fMissingInputs,fOverrideFees = false; - if ( mempool.lookup(tx.GetHash(),Ltx) == 0 ) { - if (bool_nullifiers) - return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,bool_nullifiers)); - else - return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)); - } + if ( mempool.lookup(tx.GetHash(),Ltx) == 0 ) + return(AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)); else return(true); } @@ -4321,7 +4315,8 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C int invalidtxs = 0; BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { CTransaction tx = e.GetTx(); - if ( myAddtomempool(tx,1) == false ) // this happens if there were invalid txs in the local mempool, on block arrival, used to make the block invalid. + CValidationState state; bool fMissingInputs,fOverrideFees = false; + if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,1) == false ); invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); } From 71c57902668e87ff3fa88a9ebcacc09205961435 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Mon, 29 Oct 2018 23:56:53 +0800 Subject: [PATCH 43/87] maybe --- src/main.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main.h b/src/main.h index fd418502a..7e2c0fe9f 100644 --- a/src/main.h +++ b/src/main.h @@ -180,11 +180,11 @@ void RegisterNodeSignals(CNodeSignals& nodeSignals); /** Unregister a network node */ void UnregisterNodeSignals(CNodeSignals& nodeSignals); -/** +/** * Process an incoming block. This only returns after the best known valid * block is made active. Note that it does not, however, guarantee that the * specific block passed to it has been checked for validity! - * + * * @param[out] state This may be set to an Error state if any error occurred processing it, including during validation/connection/etc of otherwise unrelated blocks during reorganisation; or it may be set to an Invalid state if pblock is itself invalid (but this is not guaranteed even when the block is checked). If you want to *possibly* get feedback on whether pblock is valid, you must also install a CValidationInterface (see validationinterface.h) - this will have its BlockChecked method called whenever *any* block completes validation. * @param[in] pfrom The node which we are receiving the block from; it is added to mapBlockSource and may be penalised if the block is invalid. * @param[in] pblock The block we want to process. @@ -267,7 +267,7 @@ void PruneAndFlush(); /** (try to) add transaction to memory pool **/ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fRejectAbsurdFee=false); + bool* pfMissingInputs, bool fRejectAbsurdFee=false, boost::optional bool_nullifiers); struct CNodeStateStats { @@ -640,7 +640,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF /** * Check transaction inputs, and make sure any * pay-to-script-hash transactions are evaluating IsStandard scripts - * + * * Why bother? To avoid denial-of-service attacks; an attacker * can submit a standard HASH... OP_EQUAL transaction, * which will get accepted into blocks. The redemption @@ -649,14 +649,14 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF * DUP CHECKSIG DROP ... repeated 100 times... OP_1 */ -/** +/** * Check for standard transaction types * @param[in] mapInputs Map of previous transactions that have outputs we're spending * @return True if all inputs (scriptSigs) use only standard transaction forms */ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, uint32_t consensusBranchId); -/** +/** * Count ECDSA signature operations the old-fashioned (pre-0.6) way * @return number of sigops this transaction's outputs will produce when spent * @see CTransaction::FetchInputs @@ -665,7 +665,7 @@ unsigned int GetLegacySigOpCount(const CTransaction& tx); /** * Count ECDSA signature operations in pay-to-script-hash inputs. - * + * * @param[in] mapInputs Map of previous transactions that have outputs we're spending * @return maximum number of sigops required to validate this transaction's inputs * @see CTransaction::FetchInputs @@ -732,9 +732,9 @@ bool IsExpiredTx(const CTransaction &tx, int nBlockHeight); */ bool CheckFinalTx(const CTransaction &tx, int flags = -1); -/** +/** * Closure representing one script verification - * Note that this stores references to the spending transaction + * Note that this stores references to the spending transaction */ class CScriptCheck { From 6f84a8cb23871049ba37449298edd6e2b204de26 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Tue, 30 Oct 2018 00:10:41 +0800 Subject: [PATCH 44/87] try --- src/main.cpp | 6 +++--- src/main.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5415705c7..e6cca73bc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1310,7 +1310,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, boost::optional bool_nullifiers) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, bool fNullifiers) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1391,7 +1391,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return false; } } - if (!bool_nullifiers) + if (fNullifiers == true) { BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { @@ -4316,7 +4316,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { CTransaction tx = e.GetTx(); CValidationState state; bool fMissingInputs,fOverrideFees = false; - if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,1) == false ); + if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,true) == false ); invalidtxs++; fprintf(stderr, "added mempool tx back to mempool\n"); } diff --git a/src/main.h b/src/main.h index 7e2c0fe9f..244817a61 100644 --- a/src/main.h +++ b/src/main.h @@ -267,7 +267,7 @@ void PruneAndFlush(); /** (try to) add transaction to memory pool **/ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fRejectAbsurdFee=false, boost::optional bool_nullifiers); + bool* pfMissingInputs, bool fRejectAbsurdFee=false, bool fNullifiers=false); struct CNodeStateStats { From 87d899fb9aeac1f4437cc57e9a6ee44392decdd2 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Tue, 30 Oct 2018 00:13:02 +0800 Subject: [PATCH 45/87] fix --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index e6cca73bc..a8405aaad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1391,7 +1391,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return false; } } - if (fNullifiers == true) + if (fNullifiers == false) { BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) { From 53476dff15227ff38134acf198ff275e5132b94b Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Tue, 30 Oct 2018 00:23:15 +0800 Subject: [PATCH 46/87] fix --- src/main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a8405aaad..d8a32f3c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1454,12 +1454,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } // are the joinsplit's requirements met? - if (!view.HaveJoinSplitRequirements(tx)) + if ( fNullifiers == true ) { - //fprintf(stderr,"accept failure.2\n"); - return state.Invalid(error("AcceptToMemoryPool: joinsplit requirements not met"),REJECT_DUPLICATE, "bad-txns-joinsplit-requirements-not-met"); + if (!view.HaveJoinSplitRequirements(tx)) + { + //fprintf(stderr,"accept failure.2\n"); + return state.Invalid(error("AcceptToMemoryPool: joinsplit requirements not met"),REJECT_DUPLICATE, "bad-txns-joinsplit-requirements-not-met"); + } } - // Bring the best block into scope view.GetBestBlock(); From e7208f084971ea03a3cf1e6bb7b5a6f8bbf1393a Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 17:30:53 +0100 Subject: [PATCH 47/87] Fix --- src/cc/dapps/oraclefeed.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 74c47ea90..12a78dd2b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -565,11 +565,12 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char *bindtxidstr) { - cJSON *retjson; char *retstr,Mstr[10]; + cJSON *retjson; char *retstr,Mstr[10],tmp[128]; printf("%d %s\n",M,pubkeys); sprintf(Mstr,"%d",M); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"addmultisigaddress",Mstr,pubkeys,bindtxidstr,"")) != 0 ) + sprintf(tmp,"\"%s\"",bindtxidstr); + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"addmultisigaddress",Mstr,pubkeys,tmp,"")) != 0 ) { printf("addmultisigaddress.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -726,9 +727,9 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit } } -int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr, char *pubkeys) +int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr, char **pubkeys) { - char *oracle,*retstr,*name,*deposit; cJSON *retjson,*pubarray; int32_t n; + char *oracle,*retstr,*name,*deposit,temp[128]; cJSON *retjson,*pubarray; int32_t n; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","","")) != 0 ) { if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 && (deposit= jstr(retjson,"deposit")) != 0 ) @@ -738,21 +739,23 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *M { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); - //printf("(%s)\n",jprint(retjson,0)); - } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); - if (jarray(&n,retjson,"pubkeys")!=0) + } + else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); + if ((pubarray=jarray(&n,retjson,"pubkeys"))!=0) { - pubkeys=malloc((sizeof(char)*70*n)+5); - sprintf(pubkeys,"\"["); + *pubkeys=malloc((sizeof(char)*70*n)+64); + sprintf(*pubkeys,"\"["); for (int i=0;i Date: Mon, 29 Oct 2018 17:35:59 +0100 Subject: [PATCH 48/87] Fix --- src/cc/dapps/oraclefeed.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 12a78dd2b..6f921e747 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -536,7 +536,7 @@ int32_t validateaddress(char *refcoin,char *acname,char *depositaddr) cJSON *retjson; char *retstr; int32_t res=0; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"validateaddress",depositaddr,"","","")) != 0 ) { - if (is_cJSON_True(jobj(retjson,"ismine")) != 0 ) res=1; + if (is_cJSON_True(jobj(retjson,"iswatchonly")) != 0 ) res=1; free_json(retjson); } else if ( retstr != 0 ) @@ -572,13 +572,13 @@ void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char sprintf(tmp,"\"%s\"",bindtxidstr); if ( (retjson= get_komodocli(refcoin,&retstr,acname,"addmultisigaddress",Mstr,pubkeys,tmp,"")) != 0 ) { - printf("addmultisigaddress.(%s)\n",jprint(retjson,0)); - free_json(retjson); + fprintf(stderr,"unexpected addmultisigaddress json.(%s)\n",jprint(retjson,0)); + free(retstr); } else if ( retstr != 0 ) { - fprintf(stderr,"addmultisigaddress.(%s) %s error.(%s)\n",refcoin,acname,retstr); - free(retstr); + printf("addmultisigaddress.(%s)\n",jprint(retjson,0)); + free_json(retjson); } } From a19d3e7881461b82e94c423861e08c1cec8d3af2 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 17:38:05 +0100 Subject: [PATCH 49/87] Fix --- src/cc/dapps/oraclefeed.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 6f921e747..355ed1c2a 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -566,8 +566,7 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char *bindtxidstr) { cJSON *retjson; char *retstr,Mstr[10],tmp[128]; - - printf("%d %s\n",M,pubkeys); + sprintf(Mstr,"%d",M); sprintf(tmp,"\"%s\"",bindtxidstr); if ( (retjson= get_komodocli(refcoin,&retstr,acname,"addmultisigaddress",Mstr,pubkeys,tmp,"")) != 0 ) @@ -577,7 +576,7 @@ void addmultisigaddress(char *refcoin,char *acname,int32_t M, char *pubkeys,char } else if ( retstr != 0 ) { - printf("addmultisigaddress.(%s)\n",jprint(retjson,0)); + printf("addmultisigaddress.(%s)\n",retstr); free_json(retjson); } } From 6721141bc053c5f7e4c103b9d7572c25f2a81656 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 17:52:30 +0100 Subject: [PATCH 50/87] Fix --- src/cc/dapps/oraclefeed.c | 8 ++++---- src/cc/gateways.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 355ed1c2a..ef05fdcff 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -683,7 +683,7 @@ cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx return(0); } -char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr) +char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) { char *retstr,*hexstr,*hex=0; cJSON *retjson; if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",txidaddr,"","","")) != 0 ) @@ -889,7 +889,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else { - if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr)) == 0 ) + if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0 ) { rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); } @@ -908,8 +908,8 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else if ( jint(clijson,"partialtx") != 0 ) { - K=gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex")); - fprintf(stderr,"%d of %d partialtx %s sent\n",K,N,bits256_str(str,txid)); + gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex")); + fprintf(stderr,"%d of %d partialtx %s sent\n",K+1,N,bits256_str(str,txid)); } free_json(clijson); } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 2f554b47a..5bc897e68 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -922,7 +922,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) std::string GatewaysMultisig(char *txidaddr) { std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K,numvouts; CPubKey signerpk; - std::vector > unspentOutputs; + std::vector > unspentOutputs; UniValue result(UniValue::VOBJ); SetCCunspents(unspentOutputs,txidaddr); if (unspentOutputs.size()==0) return (""); @@ -949,15 +949,15 @@ std::string GatewaysMultisig(char *txidaddr) } } - if (maxK>0) return(parthex); - else return (""); + result.push_back(Pair("hex",parthex)); + result.push_back(Pair("number_of_signs",K)); } std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, std::string hex) { CMutableTransaction mtx; CScript opret; CPubKey mypk,txidaddrpk,signerpk; struct CCcontract_info *cp,C; CTransaction tx; std::vector > unspentOutputs; char txidaddr[65]; - int32_t maxK,K=0; uint256 tmptxid,parttxid,hashBlock; + int32_t maxK,K=0; uint256 tmptxid,parttxid,hashBlock; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 5000; @@ -985,6 +985,6 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, } mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(txidaddrpk)) << OP_CHECKSIG)); - opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K+1 << mypk << refcoin << hex); + opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K+1 << mypk << refcoin << hex); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } From 52bd617b1b574971c21df9c48f9a8b1e6d249866 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 18:17:30 +0100 Subject: [PATCH 51/87] Fix --- src/cc/dapps/oraclefeed.c | 1 + src/wallet/rpcwallet.cpp | 8 +------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ef05fdcff..ce075443e 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -690,6 +690,7 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) { if ( (hexstr= jstr(retjson,"hex")) != 0 ) hex = clonestr(hexstr); + *K=jint(retjson,"number_of_signs"); free_json(retjson); } return(hex); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ca3c0bea4..fdeaea2ff 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5600,13 +5600,7 @@ UniValue gatewaysmultisig(const UniValue& params, bool fHelp) const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); txidaddr = (char *)params[0].get_str().c_str(); - hex = GatewaysMultisig(txidaddr); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex",hex)); - } else ERR_RESULT("couldnt gatewaysmultisig"); - return(result); + return(GatewaysMultisig(txidaddr)); } UniValue gatewayspartialsign(const UniValue& params, bool fHelp) From b6a9ea6c3a6fc4c06cff2b4897f0972b4f7d8c87 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Tue, 30 Oct 2018 01:19:44 +0800 Subject: [PATCH 52/87] fix --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index d8a32f3c7..16994e0e3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4320,7 +4320,8 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C CValidationState state; bool fMissingInputs,fOverrideFees = false; if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,true) == false ); invalidtxs++; - fprintf(stderr, "added mempool tx back to mempool\n"); + else + fprintf(stderr, "added mempool tx back to mempool\n"); } fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); // empty the temp mempool for next time. From edff8a648aa6c0efc8433fe40c1b5a636308d9ab Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 18:21:14 +0100 Subject: [PATCH 53/87] Fix --- src/cc/gateways.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5bc897e68..4bb2d13e3 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -951,6 +951,7 @@ std::string GatewaysMultisig(char *txidaddr) result.push_back(Pair("hex",parthex)); result.push_back(Pair("number_of_signs",K)); + return (result); } std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, std::string hex) From 41c207787054a62a71ed800d3269d3e07f36e045 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Mon, 29 Oct 2018 18:23:27 +0100 Subject: [PATCH 54/87] Fix --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index cd094fce0..e82add62b 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -27,7 +27,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); -std::string GatewaysMultisig(char *txidaddr); +UniValue GatewaysMultisig(char *txidaddr); std::string GatewaysPartialSign(uint64_t txfee,uint256 txidaddr,std::string refcoin, std::string hex); // CCcustom diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 4bb2d13e3..2ff633a99 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -919,7 +919,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) return(result); } -std::string GatewaysMultisig(char *txidaddr) +UniValue GatewaysMultisig(char *txidaddr) { std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K,numvouts; CPubKey signerpk; std::vector > unspentOutputs; UniValue result(UniValue::VOBJ); From 3d7a5f943409165446225c7c14a83a3c6b585bc4 Mon Sep 17 00:00:00 2001 From: blackjok3r Date: Tue, 30 Oct 2018 01:26:59 +0800 Subject: [PATCH 55/87] fix --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 16994e0e3..34492dc9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4318,7 +4318,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { CTransaction tx = e.GetTx(); CValidationState state; bool fMissingInputs,fOverrideFees = false; - if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,true) == false ); + if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,true) == false ) invalidtxs++; else fprintf(stderr, "added mempool tx back to mempool\n"); From d83a8593b22725cb4cd81f96e4a23b57884e0e64 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 29 Oct 2018 07:03:09 -1100 Subject: [PATCH 56/87] -print --- src/cc/dice.cpp | 5 +++++ src/main.cpp | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 7e013ffe2..ee41dca17 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -85,6 +85,11 @@ WARNING: there is an attack vector that precludes betting any large amounts, it 3. reorg the chain and make a big bet using the winning entropy calculated in 2. In order to mitigate this, the disclosure of the house entropy needs to be delayed beyond a reasonable reorg depth (notarization). It is recommended for production dice game with significant amounts of money to use such a delayed disclosure method. + + Actually a much better solution to this is possible, which allows to retain the realtime response aspect of dice CC, which is critical to its usage. + + + */ #include "../compat/endian.h" diff --git a/src/main.cpp b/src/main.cpp index 34492dc9f..ae8f92887 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4320,10 +4320,10 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C CValidationState state; bool fMissingInputs,fOverrideFees = false; if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees,true) == false ) invalidtxs++; - else - fprintf(stderr, "added mempool tx back to mempool\n"); + //else fprintf(stderr, "added mempool tx back to mempool\n"); } - fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); + if ( invalidtxs > 0 ) + fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); // empty the temp mempool for next time. tmpmempool.clear(); } From 79429720dc3ba341d24de628ea385c9905813181 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 29 Oct 2018 07:09:21 -1100 Subject: [PATCH 57/87] -prints --- src/cc/CCutils.cpp | 2 +- src/cc/dice.cpp | 2 +- src/main.cpp | 4 ++-- src/script/standard.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 491798a98..d4de992f7 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -193,7 +193,7 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) strcpy(destaddr,(char *)CBitcoinAddress(address).ToString().c_str()); return(true); } - fprintf(stderr,"ExtractDestination failed\n"); + //fprintf(stderr,"ExtractDestination failed\n"); return(false); } diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index ee41dca17..e456ea6ae 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -284,7 +284,7 @@ uint64_t DiceCalc(int64_t bet,int64_t odds,int64_t minbet,int64_t maxbet,int64_t break; } } - fprintf(stderr,"modval %d vs %d\n",modval,(int32_t)(10000/(odds+1))); + //fprintf(stderr,"modval %d vs %d\n",modval,(int32_t)(10000/(odds+1))); if ( modval < 10000/(odds+1) ) winnings = bet * (odds+1); } diff --git a/src/main.cpp b/src/main.cpp index ae8f92887..938cfdfe0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4259,7 +4259,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C const CTransaction &tx = e.GetTx(); const uint256 &hash = tx.GetHash(); tmpmempool.addUnchecked(hash,e,!IsInitialBlockDownload()); - fprintf(stderr, "added mempool tx to temp mempool\n"); + //fprintf(stderr, "added mempool tx to temp mempool\n"); } // clear the mempool before importing all block txs to mempool. mempool.clear(); @@ -4322,7 +4322,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C invalidtxs++; //else fprintf(stderr, "added mempool tx back to mempool\n"); } - if ( invalidtxs > 0 ) + if ( 0 && invalidtxs > 0 ) fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); // empty the temp mempool for next time. tmpmempool.clear(); diff --git a/src/script/standard.cpp b/src/script/standard.cpp index fde836154..c7999a7de 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -246,7 +246,7 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet) CPubKey pubKey(vSolutions[0]); if (!pubKey.IsValid()) { - fprintf(stderr,"TX_PUBKEY invalid pubkey\n"); + //fprintf(stderr,"TX_PUBKEY invalid pubkey\n"); return false; } From a2ccb2118e359c093c30afd79bfcdf256d057ec6 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 10:59:12 +0100 Subject: [PATCH 58/87] Fix --- src/cc/dapps/oraclefeed.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ce075443e..83c13e440 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -531,12 +531,12 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) return(0); } -int32_t validateaddress(char *refcoin,char *acname,char *depositaddr) +int32_t validateaddress(char *refcoin,char *acname,char *depositaddr, char* compare) { cJSON *retjson; char *retstr; int32_t res=0; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"validateaddress",depositaddr,"","","")) != 0 ) { - if (is_cJSON_True(jobj(retjson,"iswatchonly")) != 0 ) res=1; + if (is_cJSON_True(jobj(retjson,compare)) != 0 ) res=1; free_json(retjson); } else if ( retstr != 0 ) @@ -802,16 +802,20 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) { - cJSON *array,*item; bits256 txid; int32_t i,n,num=0; char *tmptxid,*retstr; + cJSON *array,*item,*rawtx,*vins,*vin; bits256 txid,tmptxid; int32_t i,n,m,num=0; char *retstr; if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) { for (i=0; i Date: Tue, 30 Oct 2018 11:32:47 +0100 Subject: [PATCH 59/87] Fix --- src/cc/dapps/oraclefeed.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 83c13e440..f506b2c28 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -805,6 +805,7 @@ int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) cJSON *array,*item,*rawtx,*vins,*vin; bits256 txid,tmptxid; int32_t i,n,m,num=0; char *retstr; if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) { + n=cJSON_GetArraySize(array); for (i=0; i 0 ) - // { - // fprintf(stderr,"already did withdraw %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); - // gatewaysmarkdone("KMD",acname,origtxid,refcoin,zeroid); - // } + else if ( retval > 0 ) + { + fprintf(stderr,"already did withdraw/signing %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); + } } } } From ee49162c75a11879a890992627356065f7849ae5 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 12:20:55 +0100 Subject: [PATCH 60/87] Fix --- src/cc/dapps/oraclefeed.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index f506b2c28..ff9f7920a 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -810,11 +810,10 @@ int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) { item = jitem(array,i); if ((bits256_nonz(tmptxid=jbits256(item,"txid")))!=0 && (rawtx=get_rawtransaction(refcoin,acname,tmptxid))!=0 && (vins=jarray(&m,rawtx,"vin"))!=0) - { - num=1; + { for (int j=0;j Date: Tue, 30 Oct 2018 12:34:11 +0100 Subject: [PATCH 61/87] Fix --- src/cc/dapps/oraclefeed.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ff9f7920a..42a078b37 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -828,11 +828,25 @@ int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) for (i=0; i 0 ) - { - num = 1; - break; + if ((bits256_nonz(tmptxid=jbits256(item,"txid")))!=0 && (rawtx=get_rawtransaction(refcoin,acname,tmptxid))!=0 && (vins=jarray(&m,rawtx,"vin"))!=0) + { + for (int j=0;j 0 ) + // { + // num = 1; + // break; + // } } } free_json(array); From 124778ceff0c81078d6b152d50b4a08a9b34befb Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 12:37:15 +0100 Subject: [PATCH 62/87] Fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 42a078b37..d4eb55c76 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -827,8 +827,8 @@ int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) { for (i=0; i Date: Tue, 30 Oct 2018 12:45:59 +0100 Subject: [PATCH 63/87] Fix --- src/cc/dapps/oraclefeed.c | 49 ++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index d4eb55c76..c011229d6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -770,12 +770,12 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *M int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinaddr) { - cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; + cJSON *txobj,*vouts,*vout,*vins,*vin,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numarray,retval = 0, hasvout=0; if ( (txobj= get_rawtransaction(refcoin,acname,txid)) != 0 ) { - if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) + if ( (vouts= jarray(&numarray,txobj,"vout")) != 0 ) { - for (i=0; i 0 ) + { + num = 1; + break; } - - if (num==1) break; - // if ( tx_has_voutaddress(refcoin,acname,txid,coinaddr) > 0 ) - // { - // num = 1; - // break; - // } } } free_json(array); From 113dcd93080c0640a62442cc9b27f5db7f84c1de Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 12:49:57 +0100 Subject: [PATCH 64/87] Fix --- src/cc/dapps/oraclefeed.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index c011229d6..09f0f67f1 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -795,7 +795,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd } } } - if (vins=jarray(&numarray,txobj,"vin")!=0) + if ((vins=jarray(&numarray,txobj,"vin"))!=0) { for (int i=0;j Date: Tue, 30 Oct 2018 12:57:58 +0100 Subject: [PATCH 65/87] Fix --- src/cc/dapps/oraclefeed.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 09f0f67f1..82c013973 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -799,7 +799,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd { for (int i=0;j Date: Tue, 30 Oct 2018 13:07:00 +0100 Subject: [PATCH 66/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 82c013973..bf99af1ee 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -795,7 +795,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd } } } - if ((vins=jarray(&numarray,txobj,"vin"))!=0) + if (hasvout==1 && (vins=jarray(&numarray,txobj,"vin"))!=0) { for (int i=0;j Date: Tue, 30 Oct 2018 16:33:42 +0100 Subject: [PATCH 67/87] Fix --- src/cc/dapps/oraclefeed.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index bf99af1ee..256704fe4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -776,9 +776,8 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd if ( (vouts= jarray(&numarray,txobj,"vout")) != 0 ) { for (i=0; i Date: Tue, 30 Oct 2018 17:03:55 +0100 Subject: [PATCH 68/87] Fix --- src/cc/dapps/oraclefeed.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 256704fe4..d047c45a7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -788,10 +788,12 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd { //fprintf(stderr,"found %s in %s v%d\n",coinaddr,bits256_str(str,txid),i); hasvout = 1; + break; } } } } + if (hasvout==1) break; } } if (hasvout==1 && (vins=jarray(&numarray,txobj,"vin"))!=0) @@ -853,6 +855,7 @@ int32_t markerfromthisnode(char *refcoin,char *acname,char *coinaddr) free_json(array); } else return(-1); } + printf("NUM=%d\n",num); return(num); } From 6d1ab84a05f9d3ec363338ba14aba06db9a63197 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 17:06:50 +0100 Subject: [PATCH 69/87] Fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index d047c45a7..6535f47ea 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -330,9 +330,9 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char system(cmdstr); *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) - { - //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + { jsonstr[strlen(jsonstr)-1]='\0'; + fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); From 49479d233ba54c7bbe0a875226d821d6a1fb78df Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 17:18:12 +0100 Subject: [PATCH 70/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 6535f47ea..50faf5cf7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -798,7 +798,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd } if (hasvout==1 && (vins=jarray(&numarray,txobj,"vin"))!=0) { - for (int i=0;j Date: Tue, 30 Oct 2018 17:39:25 +0100 Subject: [PATCH 71/87] Fix --- src/cc/gateways.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 2ff633a99..7dc4234b8 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -924,8 +924,7 @@ UniValue GatewaysMultisig(char *txidaddr) std::string parthex,hex,refcoin; uint256 txid,hashBlock; CTransaction tx; int32_t i,maxK,K,numvouts; CPubKey signerpk; std::vector > unspentOutputs; UniValue result(UniValue::VOBJ); - SetCCunspents(unspentOutputs,txidaddr); - if (unspentOutputs.size()==0) return (""); + SetCCunspents(unspentOutputs,txidaddr); maxK=0; for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { From f5f90e0c6b3742061c6c7c292abe73936565003c Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 17:51:42 +0100 Subject: [PATCH 72/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- src/cc/gateways.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 50faf5cf7..7a906318a 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -332,7 +332,7 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { jsonstr[strlen(jsonstr)-1]='\0'; - fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7dc4234b8..d3352a460 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -964,13 +964,13 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, mypk = pubkey2pk(Mypubkey()); txidaddrpk=CCtxidaddr(txidaddr,txid); SetCCunspents(unspentOutputs,txidaddr); + maxK=0; if (unspentOutputs.size()==0) { if (AddNormalinputs(mtx,mypk,2*txfee,2)==0) fprintf(stderr,"error adding funds for partialsign\n"); } else { - maxK=0; for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { tmptxid = it->first.txhash; @@ -985,6 +985,6 @@ std::string GatewaysPartialSign(uint64_t txfee,uint256 txid,std::string refcoin, } mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(txidaddrpk)) << OP_CHECKSIG)); - opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << K+1 << mypk << refcoin << hex); + opret << OP_RETURN << E_MARSHAL(ss << cp->evalcode << 'P' << maxK+1 << mypk << refcoin << hex); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } From 2964ae2da6271d530e61a707f8750f342163fcd7 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 18:02:17 +0100 Subject: [PATCH 73/87] Fix --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d3352a460..2829706ff 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -949,7 +949,7 @@ UniValue GatewaysMultisig(char *txidaddr) } result.push_back(Pair("hex",parthex)); - result.push_back(Pair("number_of_signs",K)); + result.push_back(Pair("number_of_signs",maxK)); return (result); } From 78ab663601cc6c3610ac874ef8cf2f0dca2d0281 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 18:14:13 +0100 Subject: [PATCH 74/87] Fix --- src/cc/dapps/oraclefeed.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 7a906318a..86273828e 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -796,23 +796,23 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd if (hasvout==1) break; } } - if (hasvout==1 && (vins=jarray(&numarray,txobj,"vin"))!=0) - { - for (int i=0;i Date: Tue, 30 Oct 2018 18:16:00 +0100 Subject: [PATCH 75/87] ... --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 86273828e..12926a54c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -332,7 +332,7 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { jsonstr[strlen(jsonstr)-1]='\0'; - //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); From 743f21e6e48294358f37d6b2f37a1b3896cfbd52 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 18:22:13 +0100 Subject: [PATCH 76/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 12926a54c..d6bd1f53c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -809,7 +809,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd // } free_json(txobj); } - return(retval); + return(hasvout); } int32_t markerfromthisnodeorunconfirmed(char *refcoin,char *acname,char *coinaddr) From e88f0f9dfb660106272c83b9504acaeeb2c99ea7 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Tue, 30 Oct 2018 18:55:45 +0100 Subject: [PATCH 77/87] ... --- src/cc/dapps/oraclefeed.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index d6bd1f53c..b99954d39 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -688,8 +688,11 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) char *retstr,*hexstr,*hex=0; cJSON *retjson; if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",txidaddr,"","","")) != 0 ) { - if ( (hexstr= jstr(retjson,"hex")) != 0 ) + if ((hexstr=jstr(retjson,"hex")) != 0 ) + { + printf("!%s!%s!%ld\n",jstr(retjson,"hex"),hexstr,strlen(hexstr)); hex = clonestr(hexstr); + } *K=jint(retjson,"number_of_signs"); free_json(retjson); } From 47ab0296d6ca68aab23e4824120dbac3f9541729 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 31 Oct 2018 02:48:42 -1100 Subject: [PATCH 78/87] Oraclesregister, allow using floating point for < 1.0 data fee --- src/wallet/rpcwallet.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6469b3e43..c7a11fe1a 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5715,7 +5715,8 @@ UniValue oraclesregister(const UniValue& params, bool fHelp) const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); txid = Parseuint256((char *)params[0].get_str().c_str()); - datafee = atol((char *)params[1].get_str().c_str()); + if ( (datafee= atol((char *)params[1].get_str().c_str())) == 0 ) + datafee = atof((char *)params[1].get_str().c_str()) * COIN; hex = OracleRegister(0,txid,datafee); if ( hex.size() > 0 ) { From f51ee9a916d3bf9f046e31552e4e316c4c93d014 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 15:58:32 +0100 Subject: [PATCH 79/87] Fix clonestr --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index b99954d39..ed2d27304 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -139,7 +139,7 @@ long _stripwhite(char *buf,int accept) char *clonestr(char *str) { char *clone; - if ( str == 0 || str[0] == 0 ) + if ( str == 0) { printf("warning cloning nullstr.%p\n",str); //#ifdef __APPLE__ From 922dc2ba1e912dd0d402537db31911c4e0cf532e Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:00:32 +0100 Subject: [PATCH 80/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ed2d27304..b59bfd8de 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -915,7 +915,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else { - if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0 ) + if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0 && strlen(rawtx)>0) { rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); } From 70aaec105819ccea2ee54ce5f24b074c579cc736 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:05:24 +0100 Subject: [PATCH 81/87] Fix --- src/cc/dapps/oraclefeed.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index b59bfd8de..8a633bb01 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -139,7 +139,7 @@ long _stripwhite(char *buf,int accept) char *clonestr(char *str) { char *clone; - if ( str == 0) + if ( str == 0 || str[0]==0) { printf("warning cloning nullstr.%p\n",str); //#ifdef __APPLE__ @@ -689,9 +689,8 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",txidaddr,"","","")) != 0 ) { if ((hexstr=jstr(retjson,"hex")) != 0 ) - { - printf("!%s!%s!%ld\n",jstr(retjson,"hex"),hexstr,strlen(hexstr)); - hex = clonestr(hexstr); + { + if (strlen(hex)>0) hex = clonestr(hexstr); } *K=jint(retjson,"number_of_signs"); free_json(retjson); @@ -915,7 +914,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else { - if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0 && strlen(rawtx)>0) + if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0) { rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); } From 55d887fa757f21f6f243e928ec8914f9af90b001 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:07:26 +0100 Subject: [PATCH 82/87] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 8a633bb01..d2809eb12 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -690,7 +690,7 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) { if ((hexstr=jstr(retjson,"hex")) != 0 ) { - if (strlen(hex)>0) hex = clonestr(hexstr); + if (strlen(hexstr)>0) hex = clonestr(hexstr); } *K=jint(retjson,"number_of_signs"); free_json(retjson); From 7778f46ed8c01689d9584fb7f4e475d81374f700 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:11:28 +0100 Subject: [PATCH 83/87] Fix --- src/cc/dapps/oraclefeed.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index d2809eb12..99a693e9b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -332,7 +332,7 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { jsonstr[strlen(jsonstr)-1]='\0'; - fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); @@ -942,11 +942,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t free(rawtx); } else fprintf(stderr,"couldnt create msig rawtx\n"); } - } - else if ( retval > 0 ) - { - fprintf(stderr,"already did withdraw/signing %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); - } + } } } } From 725d549f6d968285305a0ef857c7a3270f16ec4b Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:25:12 +0100 Subject: [PATCH 84/87] Fix --- src/cc/dapps/oraclefeed.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 99a693e9b..60e435874 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -19,6 +19,8 @@ #include #include "cJSON.c" +bits256 zeroid; + char hexbyte(int32_t c) { c &= 0xf; @@ -698,19 +700,19 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K) return(hex); } -int32_t gatewayspartialsign(char *refcoin,char *acname,bits256 txid,char *hex) +bits256 gatewayspartialsign(char *refcoin,char *acname,bits256 txid,char *hex) { char str[65],*retstr; cJSON *retjson; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspartialsign",bits256_str(str,txid),refcoin,hex,"")) != 0 ) { - komodobroadcast(refcoin,acname,retjson); - return(jint(retjson,"rank")); + return(komodobroadcast(refcoin,acname,retjson)); } else if ( retstr != 0 ) { - printf("error parsing gatewaysmarkdone.(%s)\n",retstr); + printf("error parsing gatewayspartialsing.(%s)\n",retstr); free(retstr); } + return (zeroid); } void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid) @@ -856,8 +858,7 @@ int32_t markerfromthisnodeorunconfirmed(char *refcoin,char *acname,char *coinadd } free_json(array); } else return(-1); - } - printf("NUM=%d\n",num); + } return(num); } @@ -870,7 +871,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item,*clijson; char str[65],*rawtx,*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,K,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; + cJSON *retjson,*pending,*item,*clijson; char str[65],*rawtx,*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,K,retval,processed = 0; bits256 txid,cointxid,origtxid; int64_t satoshis; memset(&zeroid,0,sizeof(zeroid)); if ( (retjson= get_gatewayspending("KMD",acname,bindtxidstr)) != 0 ) { @@ -933,7 +934,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t } else if ( jint(clijson,"partialtx") != 0 ) { - gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex")); + txid=gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex")); fprintf(stderr,"%d of %d partialtx %s sent\n",K+1,N,bits256_str(str,txid)); } free_json(clijson); From 127ee64e48f304237889022f9ab5485105c25d81 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 16:54:18 +0100 Subject: [PATCH 85/87] Fix --- src/cc/channels.cpp | 2 +- src/cc/dapps/oraclefeed.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cc/channels.cpp b/src/cc/channels.cpp index f32e9d4d1..d92186d26 100644 --- a/src/cc/channels.cpp +++ b/src/cc/channels.cpp @@ -692,7 +692,7 @@ std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid) UniValue ChannelsInfo(uint256 channeltxid) { UniValue result(UniValue::VOBJ); CTransaction tx,opentx; uint256 txid,tmp_txid,hashBlock,param3,opentxid,hashchain,prevtxid; - struct CCcontract_info *cp,C; char myCCaddr[65],addr[65],str1[256],str2[65]; int32_t vout,numvouts,param1,numpayments; + struct CCcontract_info *cp,C; char myCCaddr[65],addr[65],str1[256],str2[256]; int32_t vout,numvouts,param1,numpayments; int64_t nValue,param2,payment; CPubKey srcpub,destpub,mypk; std::vector > txids; diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 60e435874..0ff12bee5 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -360,7 +360,7 @@ bits256 komodobroadcast(char *refcoin,char *acname,cJSON *hexjson) retstr[64] = 0; decode_hex(txid.bytes,32,retstr); } - fprintf(stderr,"broadcast %s txid.(%s)\n",acname,bits256_str(str,txid)); + fprintf(stderr,"broadcast %s txid.(%s)\n",strlen(acname)>0?acname:refcoin,bits256_str(str,txid)); free(retstr); } } @@ -637,14 +637,12 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad change = (total - satoshis); jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN); } - char *tmpA=jprint(vins,1); - char *tmpB=jprint(vouts,1); + char *tmpA=jprint(vins,0); + char *tmpB=jprint(vouts,0); char *argA=malloc(sizeof(char) * (strlen(tmpA)+3)); char *argB=malloc(sizeof(char) * (strlen(tmpB)+3)); sprintf(argA,"\'%s\'",tmpA); - sprintf(argB,"\'%s\'",tmpB); - printf("%s\n",argA); - printf("%s\n",argB); + sprintf(argB,"\'%s\'",tmpB); if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); @@ -658,6 +656,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad free(argB); } } + free_json(retjson); } else if ( retstr != 0 ) { From d988726d5ffb11a93b4315d2213dc64361b5a3b2 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 17:14:29 +0100 Subject: [PATCH 86/87] Fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 0ff12bee5..62f9c3254 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -637,8 +637,8 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad change = (total - satoshis); jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN); } - char *tmpA=jprint(vins,0); - char *tmpB=jprint(vouts,0); + char *tmpA=jprint(vins,1); + char *tmpB=jprint(vouts,1); char *argA=malloc(sizeof(char) * (strlen(tmpA)+3)); char *argB=malloc(sizeof(char) * (strlen(tmpB)+3)); sprintf(argA,"\'%s\'",tmpA); From c6069e78595693ad750c8baf6c5d00b8c56d8650 Mon Sep 17 00:00:00 2001 From: Mihailo Milenkovic Date: Wed, 31 Oct 2018 17:17:37 +0100 Subject: [PATCH 87/87] Fix --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 62f9c3254..a0930bae4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -1044,7 +1044,7 @@ int32_t main(int32_t argc,char **argv) printf("need to specify path to refcoin's cli as last argv\n"); exit(0); } - pubkeys=NULL; + pubkeys=0; if ( get_gatewaysinfo("KMD",acname,depositaddr,&M,&N,bindtxidstr,refcoin,oraclestr,&pubkeys) < 0 ) { printf("cant find bindtxid.(%s)\n",bindtxidstr); @@ -1055,7 +1055,7 @@ int32_t main(int32_t argc,char **argv) if (M==N==1) importaddress(refcoin,"",depositaddr); else addmultisigaddress(refcoin,"",M,pubkeys,bindtxidstr); } - if (pubkeys!=NULL) free(pubkeys); + if (pubkeys!=0) free(pubkeys); printf("set refcoin %s <- %s [%s] M.%d of N.%d\n",depositaddr,refcoin,REFCOIN_CLI,M,N); } if ( (regjson= jarray(&n,clijson,"registered")) != 0 )