From 920a182c2bfb26de0416c56e1d983deff0ec4bc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 21:21:37 -1100 Subject: [PATCH 01/52] marmarainfo firstheight lastheight minamount maxamount [currency issuerpk] --- src/cc/CCMarmara.h | 9 ++- src/cc/CCinclude.h | 2 + src/cc/CCtx.cpp | 4 +- src/cc/marmara.cpp | 167 +++++++++++++++++++++++++++++++++------ src/rpc/server.cpp | 2 + src/rpc/server.h | 2 + src/wallet/rpcwallet.cpp | 69 +++++++++++++--- 7 files changed, 216 insertions(+), 39 deletions(-) diff --git a/src/cc/CCMarmara.h b/src/cc/CCMarmara.h index 8fbe25b62..79372fa27 100644 --- a/src/cc/CCMarmara.h +++ b/src/cc/CCMarmara.h @@ -23,10 +23,15 @@ #define MARMARA_GROUPSIZE 60 #define MARMARA_MINLOCK (1440 * 3 * 30) #define MARMARA_MAXLOCK (1440 * 24 * 30) + uint64_t komodo_block_prg(uint32_t nHeight); +int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid); + UniValue MarmaraPoolPayout(uint64_t txfee,int32_t firstheight,double perc,char *jsonstr); // [[pk0, shares0], [pk1, shares1], ...] -UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 createtxid); -UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 createtxid); +UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid); +UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t amount,std::string currency,int32_t matures,uint256 approvaltxid,uint256 batontxid); +UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency); +UniValue MarmaraCrediloop(uint256 batontxid); bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index aaeadcc61..0744156a5 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -56,6 +56,8 @@ extern uint32_t ASSETCHAINS_CC; extern char ASSETCHAINS_SYMBOL[]; extern std::string CCerror; +#define CC_MAXVINS 1024 + #define SMALLVAL 0.000000000000001 #ifndef _BITS256 #define _BITS256 diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 32d525517..a70d4f038 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -42,7 +42,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran { auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; - int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0,normalvins=0,ccvins=0; + int64_t utxovalues[CC_MAXVINS],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0,normalvins=0,ccvins=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*othercond2=0,*othercond3=0,*cond; CPubKey unspendablepk; n = mtx.vout.size(); @@ -52,7 +52,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran normaloutputs += mtx.vout[i].nValue; totaloutputs += mtx.vout[i].nValue; } - if ( (n= mtx.vin.size()) > 64 ) + if ( (n= mtx.vin.size()) > CC_MAXVINS ) { fprintf(stderr,"FinalizeCCTx: %d is too many vins\n",n); return("0"); diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 9a5a1e6ef..ba238e755 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -18,6 +18,25 @@ /* Marmara CC is for the MARMARA project + 'R': two forms for initial issuance and for accepting existing + vins normal + vout0 approval to senderpk (issuer or owner of baton) + + 'I' + vin0 approval from 'R' + vins1+ normal + vout0 baton to 1st receiverpk + vout1 marker to Marmara so all issuances can be tracked (spent when loop is closed) + + 'T' + vin0 approval from 'R' + vin1 baton from 'I'/'T' + vins2+ normal + vout0 baton to next receiverpk (following the unspent baton back to original is the credit loop) + + 'S' + vins CC utxos from credit loop + */ // start of consensus code @@ -138,6 +157,29 @@ CScript MarmaraLoopOpret(uint8_t funcid,uint256 createtxid,CPubKey senderpk,int6 return(opret); } +uint8_t MarmaraDecodeLoopOpret(const CScript scriptPubKey,uint256 &createtxid,CPubKey &senderpk,int64_t &amount,int32_t &matures,std::string ¤cy) +{ + 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 >> createtxid; ss >> senderpk; ss >> amount; ss >> matures; ss >> currency) != 0 ) + { + return(f); + } + return(0); +} + +int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) +{ + CTransaction tx; uint256 hashBlock; int32_t numvouts,matures; std::string currency; CPubKey senderpk; int64_t amount; + if ( myGetTransaction(batontxid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) + { + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' ) + return(0); + } + return(-1); +} + CScript Marmara_scriptPubKey(int32_t height,CPubKey pk) { CTxOut ccvout; @@ -297,16 +339,51 @@ int64_t AddMarmaraCoinbases(struct CCcontract_info *cp,CMutableTransaction &mtx, return(totalinputs); } -UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 createtxid) +int32_t MarmaraGetCreditloops(int64_t &totalamount,std::vector &issuances,struct CCcontract_info *cp,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,CPubKey refpk,std::string refcurrency) +{ + char coinaddr[64]; CPubKey Marmarapk,senderpk; int64_t amount; uint256 createtxid,txid,hashBlock; CTransaction tx; int32_t numvouts,unlockht,ht,vout,matures,n=0; + std::vector > unspentOutputs; + Marmarapk = GetUnspendable(cp,0); + GetCCaddress(cp,coinaddr,Marmarapk); + SetCCunspents(unspentOutputs,coinaddr); + //fprintf(stderr,"check coinaddr.(%s)\n",coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + //fprintf(stderr,"txid.%s/v%d\n",txid.GetHex().c_str(),vout); + if ( vout == 1 && GetTransaction(txid,tx,hashBlock,false) != 0 ) + { + if ( tx.IsCoinBase() == 0 && (numvouts= tx.vout.size()) > 2 && tx.vout[numvouts - 1].nValue == 0 ) + { + if ( MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency) == 'I' ) + { + n++; + if ( currency == refcurrency && matures >= firstheight && matures <= lastheight && amount >= minamount && amount <= maxamount && (refpk.size() == 0 || senderpk == refpk) ) + { + issuances.push_back(txid); + totalamount += amount; + } + } + } + } else fprintf(stderr,"error getting tx\n"); + } + return(n); +} + +UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; int32_t needbaton = 0; + UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; uint256 createtxid; int32_t needbaton = 0; cp = CCinit(&C,EVAL_MARMARA); if ( txfee == 0 ) txfee = 10000; // check for batonownership by senderpk and parameters match createtxid mypk = pubkey2pk(Mypubkey()); - if ( currency != "MARMARA" ) + memset(&createtxid,0,sizeof(createtxid)); + if ( batontxid != zeroid && MarmaraGetcreatetxid(createtxid,batontxid) < 0 ) + errorstr = (char *)"cant get createtxid from batontxid"; + else if ( currency != "MARMARA" ) errorstr = (char *)"for now, only MARMARA loops are supported"; else if ( amount < txfee ) errorstr = (char *)"amount must be for more than txfee"; @@ -346,16 +423,20 @@ UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::stri return(result); } -UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t amount,std::string currency,int32_t matures,uint256 createtxid) +UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t amount,std::string currency,int32_t matures,uint256 approvaltxid,uint256 batontxid) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; + UniValue result(UniValue::VOBJ); CPubKey mypk,Marmarapk; struct CCcontract_info *cp,C; std::string rawtx; uint256 createtxid; char *errorstr=0; cp = CCinit(&C,EVAL_MARMARA); if ( txfee == 0 ) txfee = 10000; - // make sure if transfer that it is not too late + // make sure receiverpk is unique to creditloop + // make sure less than maxlength + Marmarapk = GetUnspendable(cp,0); mypk = pubkey2pk(Mypubkey()); - if ( currency != "MARMARA" ) + if ( MarmaraGetcreatetxid(createtxid,approvaltxid) < 0 ) + errorstr = (char *)"cant get createtxid from approvaltxid"; + else if ( currency != "MARMARA" ) errorstr = (char *)"for now, only MARMARA loops are supported"; else if ( amount < txfee ) errorstr = (char *)"amount must be for more than txfee"; @@ -363,10 +444,15 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a errorstr = (char *)"it must mature in the future"; if ( errorstr == 0 ) { - if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) + mtx.vin.push_back(CTxIn(approvaltxid,0,CScript())); + if ( funcid == 'T' ) + mtx.vin.push_back(CTxIn(batontxid,0,CScript())); + if ( funcid == 'I' || AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,receiverpk)); + if ( funcid == 'I' ) + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,Marmarapk)); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,MarmaraLoopOpret(funcid,createtxid,receiverpk,amount,matures,currency)); if ( rawtx.size() > 0 ) errorstr = 0; @@ -385,6 +471,9 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a char str[2]; str[0] = funcid, str[1] = 0; result.push_back(Pair("funcid",str)); result.push_back(Pair("createtxid",createtxid.GetHex())); + result.push_back(Pair("approvaltxid",approvaltxid.GetHex())); + if ( funcid == 'T' ) + result.push_back(Pair("batontxid",batontxid.GetHex())); result.push_back(Pair("receiverpk",HexStr(receiverpk))); result.push_back(Pair("amount",ValueFromAmount(amount))); result.push_back(Pair("matures",matures)); @@ -393,32 +482,64 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a return(result); } -std::string MarmaraFund(uint64_t txfee,int64_t funds) +// get creditloop pubkeys + +UniValue Marmara(uint64_t txfee,uint256 batontxid) { - CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - CPubKey mypk,Marmarapk; CScript opret; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ); int64_t avail,amount,paid=0; int32_t i,n = 0; uint256 txid,*revcreditloop=0; CPubKey Marmarapk; struct CCcontract_info *cp,C; + result.push_back(Pair("result","success")); cp = CCinit(&C,EVAL_MARMARA); - if ( txfee == 0 ) - txfee = 10000; - mypk = pubkey2pk(Mypubkey()); Marmarapk = GetUnspendable(cp,0); - if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 ) + txid = batontxid; + while ( txid.hasprev() != 0 ) { - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,funds,Marmarapk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); + txid = txid.prev(); + // check for unique, else error + revcreditloop[n++] = txid; } - return(""); + for (i=0; i= amount ) + { + change = (amount - paid); + break; + } + } + + return(result); } -UniValue MarmaraInfo() +UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { - UniValue result(UniValue::VOBJ); char numstr[64]; - CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - CPubKey Marmarapk; struct CCcontract_info *cp,C; int64_t funding; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n; int64_t totalamount=0; std::vector issuances; + CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); - result.push_back(Pair("name","Marmara")); + if ( refpk.size() == 33 ) + result.push_back(Pair("issuer",HexStr(refpk))); + if ( currency.size() == 0 ) + currency = (char *)"MARMARA"; + if ( firstheight <= lastheight ) + firstheight = 0, lastheight = (1 << 30); + if ( minamount <= maxamount ) + minamount = 0, maxamount = (1LL << 60); + result.push_back(Pair("firstheight",firstheight)); + result.push_back(Pair("lastheight",lastheight)); + result.push_back(Pair("minamount",ValueFromAmount(minamount))); + result.push_back(Pair("maxamount",ValueFromAmount(maxamount))); + result.push_back(Pair("currency",currency)); cp = CCinit(&C,EVAL_MARMARA); Marmarapk = GetUnspendable(cp,0); + if ( (n= MarmaraGetCreditloops(totalamount,issuances,cp,firstheight,lastheight,minamount,maxamount,refpk,currency)) > 0 ) + { + result.push_back(Pair("n",n)); + matches = (int32_t)issuances.size(); + result.push_back(Pair("matches",matches)); + for (i=0; i senderpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 batontxid; std::vector senderpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || (params.size() != 5 && params.size() != 4) ) { // 1st marmarareceive 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 1440 // after marmarareceive 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 1440 - throw runtime_error("marmarareceive senderpk amount currency matures createtxid\n"); + throw runtime_error("marmarareceive senderpk amount currency matures batontxid\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"); - memset(&createtxid,0,sizeof(createtxid)); + memset(&batontxid,0,sizeof(batontxid)); senderpub = ParseHex(params[0].get_str().c_str()); if (senderpub.size()!= 33) { @@ -5570,17 +5570,17 @@ UniValue marmara_receive(const UniValue& params, bool fHelp) currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()) + chainActive.LastTip()->GetHeight() + 1; if ( params.size() == 5 ) - createtxid = Parseuint256((char *)params[4].get_str().c_str()); - return(MarmaraReceive(0,pubkey2pk(senderpub),amount,currency,matures,createtxid)); + batontxid = Parseuint256((char *)params[4].get_str().c_str()); + return(MarmaraReceive(0,pubkey2pk(senderpub),amount,currency,matures,batontxid)); } UniValue marmara_issue(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 createtxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 approvaltxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb - throw runtime_error("marmaraissue receiverpk amount currency matures createtxid\n"); + throw runtime_error("marmaraissue receiverpk amount currency matures approvaltxid\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"); @@ -5593,8 +5593,8 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) amount = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999; currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()); - createtxid = Parseuint256((char *)params[4].get_str().c_str()); - return(MarmaraIssue(0,'I',pubkey2pk(receiverpub),amount,currency,matures,createtxid)); + approvaltxid = Parseuint256((char *)params[4].get_str().c_str()); + return(MarmaraIssue(0,'I',pubkey2pk(receiverpub),amount,currency,matures,approvaltxid,zeroid)); } UniValue marmara_transfer(const UniValue& params, bool fHelp) @@ -5603,7 +5603,7 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) if ( fHelp || params.size() != 5 ) { // marmaratransfer 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb - throw runtime_error("marmaratransfer receiverpk amount currency matures createtxid\n"); + throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\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"); @@ -5616,8 +5616,53 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) amount = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999; currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()); - createtxid = Parseuint256((char *)params[4].get_str().c_str()); - return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,createtxid)); + batontxid = Parseuint256((char *)params[4].get_str().c_str()); + if ( MarmaraGetcreatetxid(createtxid,batontxid) < 0 ) + throw runtime_error("invalid batontxid"); + return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,createtxid,batontxid)); +} + +UniValue marmara_info(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); CPubKey issuerpk; std::vector issuerpub; int64_t minamount,maxamount; int32_t firstheight,lastheight; std::string currency; + if ( fHelp || params.size() < 4 || params.size() > 6 ) + { + throw runtime_error("marmarainfo firstheight lastheight minamount maxamount [currency issuerpk]\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"); + firstheight = atol(params[0].get_str().c_str()); + lastheight = atol(params[1].get_str().c_str()); + minamount = atof(params[2].get_str().c_str()) * COIN + 0.00000000499999; + maxamount = atof(params[3].get_str().c_str()) * COIN + 0.00000000499999; + if ( params.size() >= 5 ) + currency = params[4].get_str(); + if ( params.size() == 6 ) + { + issuerpub = ParseHex(params[5].get_str().c_str()); + if ( issuerpub.size()!= 33 ) + { + ERR_RESULT("invalid issuer pubkey"); + return result; + } + issuerpk = pubkey2pk(issuerpub); + } + result = MarmaraInfo(issuerpk,firstheight,lastheight,minamount,maxamount,currency); + return(result); +} + +UniValue marmara_creditloop(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint256 createtxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + if ( fHelp || params.size() != 5 ) + { + // marmaratransfer 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb + throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\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"); + //UniValue MarmaraCrediloop(uint256 batontxid); + return(result); } UniValue channelslist(const UniValue& params, bool fHelp) From fe0e9bd44ef146b8282b2d737543d3134ea581c6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 21:26:39 -1100 Subject: [PATCH 02/52] Syntax --- src/cc/marmara.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index ba238e755..1585bcc6b 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -171,8 +171,8 @@ uint8_t MarmaraDecodeLoopOpret(const CScript scriptPubKey,uint256 &createtxid,CP int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) { - CTransaction tx; uint256 hashBlock; int32_t numvouts,matures; std::string currency; CPubKey senderpk; int64_t amount; - if ( myGetTransaction(batontxid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) + CTransaction tx; uint256 hashBlock; uint8_t funcid; int32_t numvouts,matures; std::string currency; CPubKey senderpk; int64_t amount; + if ( myGetTransaction(txid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) { if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' ) return(0); @@ -341,7 +341,7 @@ int64_t AddMarmaraCoinbases(struct CCcontract_info *cp,CMutableTransaction &mtx, int32_t MarmaraGetCreditloops(int64_t &totalamount,std::vector &issuances,struct CCcontract_info *cp,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,CPubKey refpk,std::string refcurrency) { - char coinaddr[64]; CPubKey Marmarapk,senderpk; int64_t amount; uint256 createtxid,txid,hashBlock; CTransaction tx; int32_t numvouts,unlockht,ht,vout,matures,n=0; + char coinaddr[64]; CPubKey Marmarapk,senderpk; int64_t amount; uint256 createtxid,txid,hashBlock; CTransaction tx; int32_t numvouts,vout,matures,n=0; std::string currency; std::vector > unspentOutputs; Marmarapk = GetUnspendable(cp,0); GetCCaddress(cp,coinaddr,Marmarapk); @@ -484,7 +484,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a // get creditloop pubkeys -UniValue Marmara(uint64_t txfee,uint256 batontxid) +/*UniValue Marmara(uint64_t txfee,uint256 batontxid) { UniValue result(UniValue::VOBJ); int64_t avail,amount,paid=0; int32_t i,n = 0; uint256 txid,*revcreditloop=0; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); @@ -509,11 +509,11 @@ UniValue Marmara(uint64_t txfee,uint256 batontxid) } return(result); -} +}*/ UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n; int64_t totalamount=0; std::vector issuances; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); if ( refpk.size() == 33 ) From 4f9ce5d4cc5fe824f6bb7c493042dd8d9f8e98bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 21:27:14 -1100 Subject: [PATCH 03/52] -ToString() --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 1585bcc6b..7188f510a 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -537,7 +537,7 @@ UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_ matches = (int32_t)issuances.size(); result.push_back(Pair("matches",matches)); for (i=0; i Date: Mon, 14 Jan 2019 21:32:18 -1100 Subject: [PATCH 04/52] Fix --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index f637f29b1..1c24547c2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5537,7 +5537,7 @@ UniValue marmara_poolpayout(const UniValue& params, bool fHelp) if ( fHelp || params.size() != 3 ) { // marmarapoolpayout 0.5 2 '[["024131032ed90941e714db8e6dd176fe5a86c9d873d279edecf005c06f773da686",1000],["02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92",100]]'; - marmarapoolpayout 0 2 '[["024131032ed90941e714db8e6dd176fe5a86c9d873d279edecf005c06f773da686",1000]]' + //marmarapoolpayout 0 2 '[["024131032ed90941e714db8e6dd176fe5a86c9d873d279edecf005c06f773da686",1000]]' throw runtime_error("marmarapoolpayout perc firstheight \"[[\\\"pubkey\\\":shares], ...]\"\n"); } if ( ensure_CCrequirements() < 0 ) @@ -5599,7 +5599,7 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue marmara_transfer(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 createtxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 createtxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { // marmaratransfer 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb From 3246b4306b13162c3b922d628432bb4d229fbc89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:07:24 -1100 Subject: [PATCH 05/52] Allow 'R' --- src/cc/marmara.cpp | 2 +- src/wallet/rpcwallet.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 7188f510a..b69807884 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -174,7 +174,7 @@ int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) CTransaction tx; uint256 hashBlock; uint8_t funcid; int32_t numvouts,matures; std::string currency; CPubKey senderpk; int64_t amount; if ( myGetTransaction(txid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) { - if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' ) + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' || funcid == 'R' ) return(0); } return(-1); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1c24547c2..f5427fe70 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5553,8 +5553,8 @@ UniValue marmara_receive(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 batontxid; std::vector senderpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || (params.size() != 5 && params.size() != 4) ) { - // 1st marmarareceive 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 1440 - // after marmarareceive 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 1440 + // 1st marmarareceive 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 1440 + // after marmarareceive 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 1440 throw runtime_error("marmarareceive senderpk amount currency matures batontxid\n"); } if ( ensure_CCrequirements() < 0 ) @@ -5579,7 +5579,7 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 approvaltxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { - // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb + // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3803 16e9d0571c9b9f0f885aabb432bdd68d7fce9c2af8aa56d09972f4c40b8435a1 throw runtime_error("marmaraissue receiverpk amount currency matures approvaltxid\n"); } if ( ensure_CCrequirements() < 0 ) From 00ba2f442039eeed7978fb5e476212d260558d47 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:08:26 -1100 Subject: [PATCH 06/52] Set createtxid to txid for 'R" --- src/cc/marmara.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index b69807884..db60040fc 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -174,8 +174,13 @@ int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) CTransaction tx; uint256 hashBlock; uint8_t funcid; int32_t numvouts,matures; std::string currency; CPubKey senderpk; int64_t amount; if ( myGetTransaction(txid,tx,hashBlock) != 0 && (numvouts= tx.vout.size()) > 1 ) { - if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' || funcid == 'R' ) + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) == 'I' || funcid == 'T' ) return(0); + else if ( funcid == 'R' ) + { + createtxid = txid; + return(0); + } } return(-1); } From 98a81709d70a4e07cf6d3662cb66b1cae64f42f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:13:46 -1100 Subject: [PATCH 07/52] Test --- src/cc/marmara.cpp | 6 +++--- src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index db60040fc..5eb40aebe 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -452,12 +452,12 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a mtx.vin.push_back(CTxIn(approvaltxid,0,CScript())); if ( funcid == 'T' ) mtx.vin.push_back(CTxIn(batontxid,0,CScript())); - if ( funcid == 'I' || AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) + if ( funcid == 'I' || AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,receiverpk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee/2,receiverpk)); if ( funcid == 'I' ) - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,Marmarapk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee/2,Marmarapk)); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,MarmaraLoopOpret(funcid,createtxid,receiverpk,amount,matures,currency)); if ( rawtx.size() > 0 ) errorstr = 0; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index f5427fe70..89ca92ce7 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5579,7 +5579,7 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 approvaltxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { - // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3803 16e9d0571c9b9f0f885aabb432bdd68d7fce9c2af8aa56d09972f4c40b8435a1 + // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3878 78d4bb8e70578ab28ddf60c0af93c6f459f525271864c9984ccbe14e25124dfc throw runtime_error("marmaraissue receiverpk amount currency matures approvaltxid\n"); } if ( ensure_CCrequirements() < 0 ) From 5e4375ef81232be6714a2e7be9615304f9873c92 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:23:31 -1100 Subject: [PATCH 08/52] 'R" to fund 'I' and 'T' --- src/cc/marmara.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 5eb40aebe..29b57bbfd 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -379,7 +379,7 @@ int32_t MarmaraGetCreditloops(int64_t &totalamount,std::vector &issuanc UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; uint256 createtxid; int32_t needbaton = 0; + UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; uint256 createtxid; int64_t amount; int32_t needbaton = 0; cp = CCinit(&C,EVAL_MARMARA); if ( txfee == 0 ) txfee = 10000; @@ -396,13 +396,13 @@ UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::stri errorstr = (char *)"it must mature in the future"; if ( errorstr == 0 ) { - if ( createtxid == zeroid ) - needbaton = 1; - if ( AddNormalinputs(mtx,mypk,(1+needbaton)*txfee,1) > 0 ) + if ( batontxid != zeroid ) + amount = txfee; + else amount = 2*txfee; + if ( AddNormalinputs(mtx,mypk,amount + txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; - if ( needbaton != 0 ) - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,senderpk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,amount,senderpk)); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,MarmaraLoopOpret('R',createtxid,senderpk,amount,matures,currency)); if ( rawtx.size() > 0 ) errorstr = 0; @@ -455,9 +455,9 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a if ( funcid == 'I' || AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee/2,receiverpk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,receiverpk)); if ( funcid == 'I' ) - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee/2,Marmarapk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,txfee,Marmarapk)); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,MarmaraLoopOpret(funcid,createtxid,receiverpk,amount,matures,currency)); if ( rawtx.size() > 0 ) errorstr = 0; From 54b98b84600ade58a2a3a8652d4ca1b3f16a3440 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:24:29 -1100 Subject: [PATCH 09/52] batonamount --- src/cc/marmara.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 29b57bbfd..35d465df1 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -379,7 +379,7 @@ int32_t MarmaraGetCreditloops(int64_t &totalamount,std::vector &issuanc UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid) { CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; uint256 createtxid; int64_t amount; int32_t needbaton = 0; + UniValue result(UniValue::VOBJ); CPubKey mypk; struct CCcontract_info *cp,C; std::string rawtx; char *errorstr=0; uint256 createtxid; int64_t batonamount; int32_t needbaton = 0; cp = CCinit(&C,EVAL_MARMARA); if ( txfee == 0 ) txfee = 10000; @@ -397,9 +397,9 @@ UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::stri if ( errorstr == 0 ) { if ( batontxid != zeroid ) - amount = txfee; - else amount = 2*txfee; - if ( AddNormalinputs(mtx,mypk,amount + txfee,1) > 0 ) + batonamount = txfee; + else batonamount = 2*txfee; + if ( AddNormalinputs(mtx,mypk,batonamount + txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,amount,senderpk)); From a362c04ae941959ffcf60abab2a7292174f48500 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:26:31 -1100 Subject: [PATCH 10/52] Send baton amount --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 35d465df1..e5d5e9094 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -402,7 +402,7 @@ UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::stri if ( AddNormalinputs(mtx,mypk,batonamount + txfee,1) > 0 ) { errorstr = (char *)"couldnt finalize CCtx"; - mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,amount,senderpk)); + mtx.vout.push_back(MakeCC1vout(EVAL_MARMARA,batonamount,senderpk)); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,MarmaraLoopOpret('R',createtxid,senderpk,amount,matures,currency)); if ( rawtx.size() > 0 ) errorstr = 0; From fccecf9b31b6a587ac5bd109662ce4bad6e30d50 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 22:54:40 -1100 Subject: [PATCH 11/52] Total amount --- src/cc/marmara.cpp | 1 + src/wallet/rpcwallet.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index e5d5e9094..89e5479c3 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -544,6 +544,7 @@ UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_ for (i=0; i receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { - // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3878 78d4bb8e70578ab28ddf60c0af93c6f459f525271864c9984ccbe14e25124dfc + // marmaraissue 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3903 010ff7f9256cefe3b5dee3d72c0eeae9fc6f34884e6f32ffe5b60916df54a9be throw runtime_error("marmaraissue receiverpk amount currency matures approvaltxid\n"); } if ( ensure_CCrequirements() < 0 ) @@ -5602,7 +5602,7 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 createtxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { - // marmaratransfer 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb + // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\n"); } if ( ensure_CCrequirements() < 0 ) From 52c163fe458e8bb7e63efc1724bdaef5555e6428 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 23:05:27 -1100 Subject: [PATCH 12/52] Dont increment matures on non-1st 'R' --- src/wallet/rpcwallet.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index f175192bd..f6c79826b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5554,7 +5554,7 @@ UniValue marmara_receive(const UniValue& params, bool fHelp) if ( fHelp || (params.size() != 5 && params.size() != 4) ) { // 1st marmarareceive 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 1440 - // after marmarareceive 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 1440 + // after marmarareceive 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 3903 bf6b4d42aa3ce974c853d73b06c78597dd3b5fb493d5d0d944f72c2017f561ad throw runtime_error("marmarareceive senderpk amount currency matures batontxid\n"); } if ( ensure_CCrequirements() < 0 ) @@ -5568,9 +5568,11 @@ UniValue marmara_receive(const UniValue& params, bool fHelp) } amount = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999; currency = params[2].get_str(); - matures = atol(params[3].get_str().c_str()) + chainActive.LastTip()->GetHeight() + 1; if ( params.size() == 5 ) + { + matures = atol(params[3].get_str().c_str()); batontxid = Parseuint256((char *)params[4].get_str().c_str()); + } else matures = atol(params[3].get_str().c_str()) + chainActive.LastTip()->GetHeight() + 1; return(MarmaraReceive(0,pubkey2pk(senderpub),amount,currency,matures,batontxid)); } @@ -5602,7 +5604,7 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 createtxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 5 ) { - // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb + // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 bf6b4d42aa3ce974c853d73b06c78597dd3b5fb493d5d0d944f72c2017f561ad throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\n"); } if ( ensure_CCrequirements() < 0 ) From 3c03185b005d596c7cfa98793dd2ff66d528079c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 23:09:04 -1100 Subject: [PATCH 13/52] Add batontxid to transfer --- src/wallet/rpcwallet.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index f6c79826b..a72518ac2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5601,11 +5601,11 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue marmara_transfer(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 createtxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; - if ( fHelp || params.size() != 5 ) + UniValue result(UniValue::VOBJ); uint256 batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + if ( fHelp || params.size() != 6 ) { - // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 bf6b4d42aa3ce974c853d73b06c78597dd3b5fb493d5d0d944f72c2017f561ad - throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\n"); + // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e + throw runtime_error("marmaratransfer receiverpk amount currency matures approvaltxid\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"); @@ -5618,10 +5618,9 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) amount = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999; currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()); - batontxid = Parseuint256((char *)params[4].get_str().c_str()); - if ( MarmaraGetcreatetxid(createtxid,batontxid) < 0 ) - throw runtime_error("invalid batontxid"); - return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,createtxid,batontxid)); + approvaltxid = Parseuint256((char *)params[4].get_str().c_str()); + batontxid = Parseuint256((char *)params[5].get_str().c_str()); + return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,approvaltxid,batontxid)); } UniValue marmara_info(const UniValue& params, bool fHelp) From cc839d6f773ae3312db3d92bae8edb7564cd1be6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 23:10:21 -1100 Subject: [PATCH 14/52] Approvaltxid --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index a72518ac2..67f7fa054 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5601,10 +5601,10 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue marmara_transfer(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 approvaltxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; if ( fHelp || params.size() != 6 ) { - // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e + // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e bf6b4d42aa3ce974c853d73b06c78597dd3b5fb493d5d0d944f72c2017f561ad throw runtime_error("marmaratransfer receiverpk amount currency matures approvaltxid\n"); } if ( ensure_CCrequirements() < 0 ) From 9755dbc647cb3ffe58abd56dddef1aaee384b205 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 14 Jan 2019 23:25:17 -1100 Subject: [PATCH 15/52] Print batontxid --- src/cc/CCMarmara.h | 1 + src/cc/marmara.cpp | 23 +++++++++++++++++++---- src/wallet/rpcwallet.cpp | 7 ++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/cc/CCMarmara.h b/src/cc/CCMarmara.h index 79372fa27..ef8cc678b 100644 --- a/src/cc/CCMarmara.h +++ b/src/cc/CCMarmara.h @@ -26,6 +26,7 @@ uint64_t komodo_block_prg(uint32_t nHeight); int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid); +int32_t MarmaraGetbatontxid(uint256 &batontxid,uint256 txid); UniValue MarmaraPoolPayout(uint64_t txfee,int32_t firstheight,double perc,char *jsonstr); // [[pk0, shares0], [pk1, shares1], ...] UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid); diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 89e5479c3..c9976c75d 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -178,13 +178,26 @@ int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) return(0); else if ( funcid == 'R' ) { - createtxid = txid; + if ( createtxid == zeroid ) + createtxid = txid; return(0); } } return(-1); } +int32_t MarmaraGetbatontxid(uint256 &batontxid,uint256 txid) +{ + uint256 createtxid; + memset(&batontxid,0,sizeof(batontxid)); + if ( MarmaraGetcreatetxid(createtxid,txid) == 0 ) + { + return(0); + } + return(-1); +} + + CScript Marmara_scriptPubKey(int32_t height,CPubKey pk) { CTxOut ccvout; @@ -420,6 +433,8 @@ UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::stri result.push_back(Pair("rawtx",rawtx)); result.push_back(Pair("funcid","R")); result.push_back(Pair("createtxid",createtxid.GetHex())); + if ( batontxid != zeroid ) + result.push_back(Pair("batontxid",batontxid.GetHex())); result.push_back(Pair("senderpk",HexStr(senderpk))); result.push_back(Pair("amount",ValueFromAmount(amount))); result.push_back(Pair("matures",matures)); @@ -445,8 +460,8 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a errorstr = (char *)"for now, only MARMARA loops are supported"; else if ( amount < txfee ) errorstr = (char *)"amount must be for more than txfee"; - else if ( matures <= chainActive.LastTip()->GetHeight() ) - errorstr = (char *)"it must mature in the future"; + //else if ( matures <= chainActive.LastTip()->GetHeight() ) + // errorstr = (char *)"it must mature in the future"; if ( errorstr == 0 ) { mtx.vin.push_back(CTxIn(approvaltxid,0,CScript())); @@ -544,7 +559,7 @@ UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_ for (i=0; i receiverpub; int64_t amount; int32_t matures; std::string currency; - if ( fHelp || params.size() != 6 ) + if ( fHelp || params.size() != 5 ) { - // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e bf6b4d42aa3ce974c853d73b06c78597dd3b5fb493d5d0d944f72c2017f561ad + // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e throw runtime_error("marmaratransfer receiverpk amount currency matures approvaltxid\n"); } if ( ensure_CCrequirements() < 0 ) @@ -5619,7 +5619,8 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()); approvaltxid = Parseuint256((char *)params[4].get_str().c_str()); - batontxid = Parseuint256((char *)params[5].get_str().c_str()); + if ( MarmaraGetbatontxid(batontxid,approvaltxid) < 0 ) + throw runtime_error("couldnt find batontxid\n"); return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,approvaltxid,batontxid)); } From 6873cb6653db9457d860d02db6b4c6764bb4d0e1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:09:07 -1100 Subject: [PATCH 16/52] Get credit loop --- src/cc/CCMarmara.h | 2 +- src/cc/CCinclude.h | 5 ++++- src/cc/CCtx.cpp | 34 ++++++++++++++++++++++++++++++++++ src/cc/marmara.cpp | 20 +++++++++++++++++--- src/wallet/rpcwallet.cpp | 4 ++-- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/cc/CCMarmara.h b/src/cc/CCMarmara.h index ef8cc678b..9904a663e 100644 --- a/src/cc/CCMarmara.h +++ b/src/cc/CCMarmara.h @@ -26,7 +26,7 @@ uint64_t komodo_block_prg(uint32_t nHeight); int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid); -int32_t MarmaraGetbatontxid(uint256 &batontxid,uint256 txid); +int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid,uint256 txid); UniValue MarmaraPoolPayout(uint64_t txfee,int32_t firstheight,double perc,char *jsonstr); // [[pk0, shares0], [pk1, shares1], ...] UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 0744156a5..40028ee5c 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -105,15 +105,18 @@ struct oracleprice_info #ifdef ENABLE_WALLET extern CWallet* pwalletMain; #endif +//extern CCoinsViewCache *pcoinsTip; bool GetAddressUnspent(uint160 addressHash, int type,std::vector > &unspentOutputs); CBlockIndex *komodo_getblockindex(uint256 hash); int32_t komodo_nextheight(); +int32_t CCgetspenttxid(uint256 &spenttxid,int32_t &vini,int32_t &height,uint256 txid,int32_t vout); + static const uint256 zeroid; bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock); int32_t is_hexstr(char *str,int32_t n); bool myAddtomempool(CTransaction &tx, CValidationState *pstate = NULL, bool fSkipExpiry = false); -//uint64_t myGettxout(uint256 hash,int32_t n); +int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag); bool myIsutxo_spentinmempool(uint256 txid,int32_t vout); bool mytxid_inmempool(uint256 txid); int32_t myIsutxo_spent(uint256 &spenttxid,uint256 txid,int32_t vout); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index a70d4f038..c73bead04 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -247,6 +247,40 @@ int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) return(0); } +int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag) +{ + CCoins coins; + if ( mempoolflag != 0 ) + { + LOCK(mempool.cs); + CCoinsViewMemPool view(pcoinsTip, mempool); + if (!view.GetCoins(txid, coins)) + return(-1); + if ( myIsutxo_spentinmempool(txid,vout) != 0 ) + return(-1); + } + else + { + if (!pcoinsTip->GetCoins(hash, coins)) + return(-1); + } + if ( vout < coins.vout.size() ) + return(coins.vout[vout].nValue); + else return(-1); +} + +int32_t CCgetspenttxid(uint256 &spenttxid,int32_t &vini,int32_t &height,uint256 txid,int32_t vout) +{ + CSpentIndexKey key(txid, vout); + CSpentIndexValue value; + if ( !GetSpentIndex(key, value) ) + return(-1); + spenttxid = value.txid; + vini = (int32_t)value.inputIndex; + height = value.blockHeight; + return(0); +} + int64_t CCaddress_balance(char *coinaddr) { int64_t sum = 0; std::vector > unspentOutputs; diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index c9976c75d..cfbdbc798 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -186,13 +186,25 @@ int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) return(-1); } -int32_t MarmaraGetbatontxid(uint256 &batontxid,uint256 txid) +int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid,uint256 txid) { - uint256 createtxid; + uint256 createtxid,spenttxid; int64_t value; int32_t vini,height,vout = 0; memset(&batontxid,0,sizeof(batontxid)); if ( MarmaraGetcreatetxid(createtxid,txid) == 0 ) { - return(0); + txid = createtxid; + while ( CCgetspenttxid(spenttxid,vini,height,txid,vout) == 0 ) + { + if ( (value= CCgettxout(spenttxid,vout,1)) > 0 ) + { + batontxid = txid; + fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex(),(double)value/COIN); + return(0); + } + creditloop.push_back(spenttxid); + fprintf(stderr,"%s\n",spenttxid.GetHex()); + txid = spenttxid; + } } return(-1); } @@ -456,6 +468,8 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a mypk = pubkey2pk(Mypubkey()); if ( MarmaraGetcreatetxid(createtxid,approvaltxid) < 0 ) errorstr = (char *)"cant get createtxid from approvaltxid"; + else if ( batontxid == zeroid ) + errorstr = (char *)"null batontxid"; else if ( currency != "MARMARA" ) errorstr = (char *)"for now, only MARMARA loops are supported"; else if ( amount < txfee ) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e22cdae0b..6ecf99204 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5601,7 +5601,7 @@ UniValue marmara_issue(const UniValue& params, bool fHelp) UniValue marmara_transfer(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 approvaltxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 approvaltxid,batontxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; std::vector creditloop; if ( fHelp || params.size() != 5 ) { // marmaratransfer 028076d42eb20efc10007fafb5ca66a2052523c0d2221e607adf958d1a332159f6 7.5 MARMARA 3903 748a4c80e6f6b725340fb0f52738f38a11c422d59b3034c8366b3d7b33c99a1e @@ -5619,7 +5619,7 @@ UniValue marmara_transfer(const UniValue& params, bool fHelp) currency = params[2].get_str(); matures = atol(params[3].get_str().c_str()); approvaltxid = Parseuint256((char *)params[4].get_str().c_str()); - if ( MarmaraGetbatontxid(batontxid,approvaltxid) < 0 ) + if ( MarmaraGetbatontxid(creditloop,batontxid,approvaltxid) < 0 ) throw runtime_error("couldnt find batontxid\n"); return(MarmaraIssue(0,'T',pubkey2pk(receiverpub),amount,currency,matures,approvaltxid,batontxid)); } From 50cbe82c68e9904ccc784f54b92838129a06a26d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:13:48 -1100 Subject: [PATCH 17/52] Hash -> taxied --- src/cc/CCtx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index c73bead04..a80b3b3cf 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -261,7 +261,7 @@ int32_t CCgettxout(uint256 txid,int32_t vout,int32_t mempoolflag) } else { - if (!pcoinsTip->GetCoins(hash, coins)) + if (!pcoinsTip->GetCoins(txid, coins)) return(-1); } if ( vout < coins.vout.size() ) From 1cf607f70f3fd2e8dc8fe8f90a5c86c5318d7bd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:16:16 -1100 Subject: [PATCH 18/52] c_str --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index cfbdbc798..60d827eca 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -198,7 +198,7 @@ int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid, if ( (value= CCgettxout(spenttxid,vout,1)) > 0 ) { batontxid = txid; - fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex(),(double)value/COIN); + fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex().c_str(),(double)value/COIN); return(0); } creditloop.push_back(spenttxid); From 9bf61c22593356c4fcca8386fcb5b61b417657f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:22:43 -1100 Subject: [PATCH 19/52] Tweak batontxid searching --- src/cc/marmara.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 60d827eca..67296f19c 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -188,21 +188,23 @@ int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid) int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid,uint256 txid) { - uint256 createtxid,spenttxid; int64_t value; int32_t vini,height,vout = 0; + uint256 createtxid,spenttxid; int64_t value; int32_t vini,height,n=0,vout = 0; memset(&batontxid,0,sizeof(batontxid)); if ( MarmaraGetcreatetxid(createtxid,txid) == 0 ) { txid = createtxid; + fprintf(stderr,"txid.%s -> createtxid %s\n",txid.GetHex().c_str(),createtxid.GetHex().c_str()); while ( CCgetspenttxid(spenttxid,vini,height,txid,vout) == 0 ) { + creditloop.push_back(txid); + fprintf(stderr,"%d: %s\n",n,txid.GetHex().c_str()); + n++; if ( (value= CCgettxout(spenttxid,vout,1)) > 0 ) { - batontxid = txid; + batontxid = spenttxid; fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex().c_str(),(double)value/COIN); return(0); } - creditloop.push_back(spenttxid); - fprintf(stderr,"%s\n",spenttxid.GetHex()); txid = spenttxid; } } From 389e07d1fb5209669b382940747f10cd4d64ca9b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:46:27 -1100 Subject: [PATCH 20/52] marmara_creditloop --- src/cc/CCMarmara.h | 2 +- src/cc/marmara.cpp | 36 ++++++++++++++++++++++++++++++++---- src/wallet/rpcwallet.cpp | 9 +++++---- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/cc/CCMarmara.h b/src/cc/CCMarmara.h index 9904a663e..1d61a86d4 100644 --- a/src/cc/CCMarmara.h +++ b/src/cc/CCMarmara.h @@ -27,12 +27,12 @@ uint64_t komodo_block_prg(uint32_t nHeight); int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid); int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid,uint256 txid); +UniValue MarmaraCreditloop(uint256 txid); UniValue MarmaraPoolPayout(uint64_t txfee,int32_t firstheight,double perc,char *jsonstr); // [[pk0, shares0], [pk1, shares1], ...] UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid); UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t amount,std::string currency,int32_t matures,uint256 approvaltxid,uint256 batontxid); UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency); -UniValue MarmaraCrediloop(uint256 batontxid); bool MarmaraValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn); diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 67296f19c..3ab1317c5 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -203,7 +203,7 @@ int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid, { batontxid = spenttxid; fprintf(stderr,"got baton %s %.8f\n",batontxid.GetHex().c_str(),(double)value/COIN); - return(0); + return(n); } txid = spenttxid; } @@ -211,7 +211,6 @@ int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid, return(-1); } - CScript Marmara_scriptPubKey(int32_t height,CPubKey pk) { CTxOut ccvout; @@ -476,8 +475,8 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a errorstr = (char *)"for now, only MARMARA loops are supported"; else if ( amount < txfee ) errorstr = (char *)"amount must be for more than txfee"; - //else if ( matures <= chainActive.LastTip()->GetHeight() ) - // errorstr = (char *)"it must mature in the future"; + else if ( matures <= chainActive.LastTip()->GetHeight() ) + errorstr = (char *)"it must mature in the future"; if ( errorstr == 0 ) { mtx.vin.push_back(CTxIn(approvaltxid,0,CScript())); @@ -547,6 +546,35 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a return(result); }*/ +UniValue MarmaraCreditloop(uint256 txid) +{ + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid; uint8_t funcid; int32_t numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; + if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) + { + for (i=0; i 1 ) + { + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) != 0 ) + { + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("txid",txid.GetHex())); + obj.push_back(Pair("createtxid",createtxid.GetHex())); + obj.push_back(Pair("senderpk",HexStr(senderpk))); + obj.push_back(Pair("amount",ValueFromAmount(amount))); + obj.push_back(Pair("matures",matures)); + obj.push_back(Pair("currency",currency)); + a.push_back(obj); + } + } + } + result.push_back(Pair("result",(char *)"success")); + result.push_back("creditloop",a); + } + + return(result); +} + UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6ecf99204..836380f1b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5656,14 +5656,15 @@ UniValue marmara_info(const UniValue& params, bool fHelp) UniValue marmara_creditloop(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); uint256 createtxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; - if ( fHelp || params.size() != 5 ) + if ( fHelp || params.size() != 1 ) { - // marmaratransfer 039433dc3749aece1bd568f374a45da3b0bc6856990d7da3cd175399577940a775 7.5 MARMARA 2693 e5b1ef8ec90e981d3011c8e024cef869b69af2d4dd6837d1ab1d394d3730b7cb - throw runtime_error("marmaratransfer receiverpk amount currency matures batontxid\n"); + // marmaracreditloop 010ff7f9256cefe3b5dee3d72c0eeae9fc6f34884e6f32ffe5b60916df54a9be + throw runtime_error("marmaracreditloop txid\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"); - //UniValue MarmaraCrediloop(uint256 batontxid); + txid = Parseuint256((char *)params[0].get_str().c_str()); + result = MarmaraCreditloop(txid); return(result); } From ba76bd2d7033c006dfd59570da936d390af7481c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:47:36 -1100 Subject: [PATCH 21/52] Declare vars --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 3ab1317c5..2b71f566b 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -548,7 +548,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid; uint8_t funcid; int32_t numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,hashBlock; uint8_t funcid; int32_t numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; CTransaction tx; if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { for (i=0; i Date: Tue, 15 Jan 2019 00:48:02 -1100 Subject: [PATCH 22/52] Test --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 2b71f566b..097983ebd 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -569,7 +569,7 @@ UniValue MarmaraCreditloop(uint256 txid) } } result.push_back(Pair("result",(char *)"success")); - result.push_back("creditloop",a); + result.push_back(Pair("creditloop",a)); } return(result); From e620f47e519a0a71daf7153791f63aa883f244c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:48:54 -1100 Subject: [PATCH 23/52] N --- src/cc/marmara.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 097983ebd..24bd3d6f3 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -548,7 +548,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,hashBlock; uint8_t funcid; int32_t numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; CTransaction tx; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; CTransaction tx; if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { for (i=0; i Date: Tue, 15 Jan 2019 00:49:26 -1100 Subject: [PATCH 24/52] ) --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 24bd3d6f3..5c87d7bec 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -569,7 +569,7 @@ UniValue MarmaraCreditloop(uint256 txid) } } result.push_back(Pair("result",(char *)"success")); - result.push_back(Pair("n",n); + result.push_back(Pair("n",n)); result.push_back(Pair("creditloop",a)); } From 41ed37e9693eb2eeff036b9652e22cfaed01affe Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:50:18 -1100 Subject: [PATCH 25/52] Funcid --- src/cc/marmara.cpp | 1 + src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 5c87d7bec..2629b7dfd 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -559,6 +559,7 @@ UniValue MarmaraCreditloop(uint256 txid) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("txid",txid.GetHex())); + obj.push_back(Pair("funcid",funcid)); obj.push_back(Pair("createtxid",createtxid.GetHex())); obj.push_back(Pair("senderpk",HexStr(senderpk))); obj.push_back(Pair("amount",ValueFromAmount(amount))); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 836380f1b..81b692dc0 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5655,7 +5655,7 @@ UniValue marmara_info(const UniValue& params, bool fHelp) UniValue marmara_creditloop(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 createtxid; std::vector receiverpub; int64_t amount; int32_t matures; std::string currency; + UniValue result(UniValue::VOBJ); uint256 txid; if ( fHelp || params.size() != 1 ) { // marmaracreditloop 010ff7f9256cefe3b5dee3d72c0eeae9fc6f34884e6f32ffe5b60916df54a9be From f03daaf2eb4df9da51c539cd07a4f015feec06a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 00:58:49 -1100 Subject: [PATCH 26/52] Baton address --- src/cc/marmara.cpp | 61 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 2629b7dfd..681689a6e 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -548,38 +548,63 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures; int64_t amount; CPubKey senderpk; std::string currency; CTransaction tx; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char batonaddr[64]; if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { - for (i=0; i 1 ) { - if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) + result.push_back(Pair("result",(char *)"success")); + result.push_back(Pair("batontxid",batontxid.GetHex())); + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,senderpk,refamount,refmatures,refcurrency)) != 0 ) { - if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) != 0 ) + obj.push_back(Pair("funcid",funcid)); + obj.push_back(Pair("createtxid",createtxid.GetHex())); + obj.push_back(Pair("amount",ValueFromAmount(amount))); + obj.push_back(Pair("matures",matures)); + obj.push_back(Pair("currency",currency)); + GetScriptaddr(batonaddr,tx.vout[0].scriptPubKey); + obj.push_back(Pair("batonaddress",batonaddr)); + for (i=0; i 1 ) + { + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) != 0 ) + { + UniValue obj(UniValue::VOBJ); + obj.push_back(Pair("txid",txid.GetHex())); + obj.push_back(Pair("funcid",funcid)); + obj.push_back(Pair("senderpk",HexStr(senderpk))); + a.push_back(obj); + } + } } + result.push_back(Pair("n",n)); + result.push_back(Pair("creditloop",a)); + } + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt get batontxid opret")); } } - result.push_back(Pair("result",(char *)"success")); - result.push_back(Pair("n",n)); - result.push_back(Pair("creditloop",a)); + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt find batontxid")); + } + } + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt get creditloop")); } - return(result); } UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; + + { UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); if ( refpk.size() == 33 ) From 8f55cee678dce394ecb1e82d0734fc569723d9e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:02:12 -1100 Subject: [PATCH 27/52] Test --- src/cc/marmara.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 681689a6e..cf3d248e5 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -548,7 +548,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char batonaddr[64]; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64]; if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { if ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) @@ -557,13 +557,13 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("batontxid",batontxid.GetHex())); if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,senderpk,refamount,refmatures,refcurrency)) != 0 ) { - obj.push_back(Pair("funcid",funcid)); - obj.push_back(Pair("createtxid",createtxid.GetHex())); - obj.push_back(Pair("amount",ValueFromAmount(amount))); - obj.push_back(Pair("matures",matures)); - obj.push_back(Pair("currency",currency)); - GetScriptaddr(batonaddr,tx.vout[0].scriptPubKey); - obj.push_back(Pair("batonaddress",batonaddr)); + result.push_back(Pair("funcid",funcid)); + result.push_back(Pair("createtxid",createtxid.GetHex())); + result.push_back(Pair("amount",ValueFromAmount(amount))); + result.push_back(Pair("matures",matures)); + result.push_back(Pair("currency",currency)); + GetScriptaddr(coinaddr,tx.vout[0].scriptPubKey); + result.push_back(Pair("batonaddress",coinaddr)); for (i=0; i 1 ) @@ -574,6 +574,10 @@ UniValue MarmaraCreditloop(uint256 txid) obj.push_back(Pair("txid",txid.GetHex())); obj.push_back(Pair("funcid",funcid)); obj.push_back(Pair("senderpk",HexStr(senderpk))); + GetCCaddress(cp,coinaddr,senderpk); + obj.push_back(Pair("sender",coinaddr)); + GetScriptaddr(coinaddr,tx.vout[0].scriptPubKey); + obj.push_back(Pair("nextaddress",coinaddr)); a.push_back(obj); } } From c3d105361d60be8a4c7351970d768496110d7592 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:02:46 -1100 Subject: [PATCH 28/52] -{ --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index cf3d248e5..37afeec30 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -608,7 +608,7 @@ UniValue MarmaraCreditloop(uint256 txid) UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { - { UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); if ( refpk.size() == 33 ) From fdfef30eb9864f90ebc13e5f8c41cc7cb6329307 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:04:54 -1100 Subject: [PATCH 29/52] Test --- src/cc/marmara.cpp | 46 ++++------------------------------------------ 1 file changed, 4 insertions(+), 42 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 37afeec30..2c6b4d2d8 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -52,44 +52,6 @@ int64_t IsMarmaravout(struct CCcontract_info *cp,const CTransaction& tx,int32_t return(0); } -/*bool MarmaraExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) -{ - static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; - numvins = tx.vin.size(); - numvouts = tx.vout.size(); - for (i=0; iismyvin)(tx.vin[i].scriptSig) != 0 ) - { - //fprintf(stderr,"vini.%d check mempool\n",i); - if ( eval->GetTxUnconfirmed(tx.vin[i].prevout.hash,vinTx,hashBlock) == 0 ) - return eval->Invalid("cant find vinTx"); - else - { - //fprintf(stderr,"vini.%d check hash and vout\n",i); - if ( hashBlock == zerohash ) - return eval->Invalid("cant Marmara from mempool"); - if ( (assetoshis= IsMarmaravout(cp,vinTx,tx.vin[i].prevout.n)) != 0 ) - inputs += assetoshis; - } - } - } - for (i=0; iInvalid("mismatched inputs != outputs + txfee"); - } - else return(true); -}*/ - int32_t MarmaraRandomize(uint32_t ind) { uint64_t val64; uint32_t val,range = (MARMARA_MAXLOCK - MARMARA_MINLOCK); @@ -548,7 +510,8 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64]; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64]; struct CCcontract_info *cp,C; + cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { if ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) @@ -562,7 +525,7 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("amount",ValueFromAmount(amount))); result.push_back(Pair("matures",matures)); result.push_back(Pair("currency",currency)); - GetScriptaddr(coinaddr,tx.vout[0].scriptPubKey); + GetScriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); for (i=0; i issuances; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); From 9ec06006d7c87c4223ba06b07ae81a0b2d273246 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:07:06 -1100 Subject: [PATCH 30/52] Getscriptaddress --- src/cc/marmara.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 2c6b4d2d8..e56f7fcc5 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -525,7 +525,7 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("amount",ValueFromAmount(amount))); result.push_back(Pair("matures",matures)); result.push_back(Pair("currency",currency)); - GetScriptaddress(coinaddr,tx.vout[0].scriptPubKey); + Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); for (i=0; i Date: Tue, 15 Jan 2019 01:15:36 -1100 Subject: [PATCH 31/52] Mypubkey() --- src/cc/marmara.cpp | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index e56f7fcc5..df41823cb 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { @@ -520,13 +520,18 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("batontxid",batontxid.GetHex())); if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,senderpk,refamount,refmatures,refcurrency)) != 0 ) { - result.push_back(Pair("funcid",funcid)); - result.push_back(Pair("createtxid",createtxid.GetHex())); - result.push_back(Pair("amount",ValueFromAmount(amount))); - result.push_back(Pair("matures",matures)); - result.push_back(Pair("currency",currency)); + str[0] = funcid, str[1] = 0; + result.push_back(Pair("funcid",str)); + result.push_back(Pair("createtxid",refcreatetxid.GetHex())); + result.push_back(Pair("amount",ValueFromAmount(refamount))); + result.push_back(Pair("matures",refmatures)); + result.push_back(Pair("currency",refcurrency)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pubkeys[0])) << OP_CHECKSIG); + result.push_back(Pair("myaddress",coinaddr)); + GetCCaddress(cp,coinaddr,Mypubkey()); + result.push_back(Pair("myCCaddress",coinaddr)); for (i=0; i 1 ) @@ -534,13 +539,22 @@ UniValue MarmaraCreditloop(uint256 txid) if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) != 0 ) { UniValue obj(UniValue::VOBJ); - obj.push_back(Pair("txid",txid.GetHex())); - obj.push_back(Pair("funcid",funcid)); + obj.push_back(Pair("txid",creditloop[i].GetHex())); + str[0] = funcid, str[1] = 0; + obj.push_back(Pair("funcid",str)); obj.push_back(Pair("senderpk",HexStr(senderpk))); GetCCaddress(cp,coinaddr,senderpk); - obj.push_back(Pair("sender",coinaddr)); + obj.push_back(Pair("receiver",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); + if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) + { + obj.push_back(Pair("objerror",(char *)"mismatched createtxid or amount or matures or currency"))); + obj.push_back(Pair("createtxid",createtxid.GetHex())); + obj.push_back(Pair("amount",ValueFromAmount(amount))); + obj.push_back(Pair("matures",matures)); + obj.push_back(Pair("currency",currency)); + } a.push_back(obj); } } @@ -570,9 +584,13 @@ UniValue MarmaraCreditloop(uint256 txid) UniValue MarmaraInfo(CPubKey refpk,int32_t firstheight,int32_t lastheight,int64_t minamount,int64_t maxamount,std::string currency) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int32_t i,n,matches; int64_t totalamount=0; std::vector issuances; char coinaddr[64]; CPubKey Marmarapk; struct CCcontract_info *cp,C; result.push_back(Pair("result","success")); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(Mypubkey())) << OP_CHECKSIG); + result.push_back(Pair("myaddress",coinaddr)); + GetCCaddress(cp,coinaddr,Mypubkey()); + result.push_back(Pair("myCCaddress",coinaddr)); if ( refpk.size() == 33 ) result.push_back(Pair("issuer",HexStr(refpk))); if ( currency.size() == 0 ) From e56e7dd8f822e437b3514bc0e38362c5b0554817 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:16:46 -1100 Subject: [PATCH 32/52] Fix --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index df41823cb..affa2a224 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -528,7 +528,7 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("currency",refcurrency)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pubkeys[0])) << OP_CHECKSIG); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(Mypubkey())) << OP_CHECKSIG); result.push_back(Pair("myaddress",coinaddr)); GetCCaddress(cp,coinaddr,Mypubkey()); result.push_back(Pair("myCCaddress",coinaddr)); From 0bf08eedd0e92eef7823868b219d94a62ac23312 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:17:30 -1100 Subject: [PATCH 33/52] - --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index affa2a224..c66a49ce3 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -549,7 +549,7 @@ UniValue MarmaraCreditloop(uint256 txid) obj.push_back(Pair("nextaddress",coinaddr)); if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { - obj.push_back(Pair("objerror",(char *)"mismatched createtxid or amount or matures or currency"))); + obj.push_back(Pair("objerror",(char *)"mismatched createtxid or amount or matures or currency")); obj.push_back(Pair("createtxid",createtxid.GetHex())); obj.push_back(Pair("amount",ValueFromAmount(amount))); obj.push_back(Pair("matures",matures)); From e2a8009162d889da75fbfa87048af74da6df41c1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:29:54 -1100 Subject: [PATCH 34/52] numerrs --- src/cc/marmara.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index c66a49ce3..34efe2626 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t err=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { @@ -522,6 +522,12 @@ UniValue MarmaraCreditloop(uint256 txid) { str[0] = funcid, str[1] = 0; result.push_back(Pair("funcid",str)); + if ( refcreatetxid != creditloop[0] ) + { + fprintf(stderr,"invalid refcreatetxid, setting to creditloop[0]\n"); + refcreatetxid = creditloop[0] + err++; + } result.push_back(Pair("createtxid",refcreatetxid.GetHex())); result.push_back(Pair("amount",ValueFromAmount(refamount))); result.push_back(Pair("matures",refmatures)); @@ -547,8 +553,11 @@ UniValue MarmaraCreditloop(uint256 txid) obj.push_back(Pair("receiver",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); + if ( funcid == 'R' && createtxid == zeroid ) + createtxid = creditloop[i]; if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { + err++; obj.push_back(Pair("objerror",(char *)"mismatched createtxid or amount or matures or currency")); obj.push_back(Pair("createtxid",createtxid.GetHex())); obj.push_back(Pair("amount",ValueFromAmount(amount))); @@ -560,6 +569,7 @@ UniValue MarmaraCreditloop(uint256 txid) } } result.push_back(Pair("n",n)); + result.push_back(Pair("numerrors",errs)); result.push_back(Pair("creditloop",a)); } else From ac7814aa59e23753b86b25bc7d8a10d397923420 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:30:46 -1100 Subject: [PATCH 35/52] Numbers --- src/cc/marmara.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 34efe2626..beaccea21 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t err=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { @@ -526,7 +526,7 @@ UniValue MarmaraCreditloop(uint256 txid) { fprintf(stderr,"invalid refcreatetxid, setting to creditloop[0]\n"); refcreatetxid = creditloop[0] - err++; + numerrs++; } result.push_back(Pair("createtxid",refcreatetxid.GetHex())); result.push_back(Pair("amount",ValueFromAmount(refamount))); @@ -557,7 +557,7 @@ UniValue MarmaraCreditloop(uint256 txid) createtxid = creditloop[i]; if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { - err++; + numerrs++; obj.push_back(Pair("objerror",(char *)"mismatched createtxid or amount or matures or currency")); obj.push_back(Pair("createtxid",createtxid.GetHex())); obj.push_back(Pair("amount",ValueFromAmount(amount))); @@ -569,7 +569,7 @@ UniValue MarmaraCreditloop(uint256 txid) } } result.push_back(Pair("n",n)); - result.push_back(Pair("numerrors",errs)); + result.push_back(Pair("numerrors",numerrs)); result.push_back(Pair("creditloop",a)); } else From 4ceddd6a93f5422db5959140bfe5b88f50adfb99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:31:35 -1100 Subject: [PATCH 36/52] ; --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index beaccea21..f7cad1fa9 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -525,7 +525,7 @@ UniValue MarmaraCreditloop(uint256 txid) if ( refcreatetxid != creditloop[0] ) { fprintf(stderr,"invalid refcreatetxid, setting to creditloop[0]\n"); - refcreatetxid = creditloop[0] + refcreatetxid = creditloop[0]; numerrs++; } result.push_back(Pair("createtxid",refcreatetxid.GetHex())); From 49ac671671802c40df7d4f2ea33d77b20cdad9d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:46:00 -1100 Subject: [PATCH 37/52] Test --- src/cc/marmara.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index f7cad1fa9..48dc1f6ef 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,13 +510,17 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { if ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) { result.push_back(Pair("result",(char *)"success")); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(Mypubkey())) << OP_CHECKSIG); + result.push_back(Pair("myaddress",coinaddr)); + GetCCaddress(cp,myCCaddr,Mypubkey()); + result.push_back(Pair("myCCaddress",myCCaddr)); result.push_back(Pair("batontxid",batontxid.GetHex())); if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,senderpk,refamount,refmatures,refcurrency)) != 0 ) { @@ -532,12 +536,15 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("amount",ValueFromAmount(refamount))); result.push_back(Pair("matures",refmatures)); result.push_back(Pair("currency",refcurrency)); + result.push_back(Pair("senderpk",HexStr(senderpk))); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk())) << OP_CHECKSIG); + obj.push_back(Pair("senderaddr",coinaddr)); + Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(Mypubkey())) << OP_CHECKSIG); - result.push_back(Pair("myaddress",coinaddr)); - GetCCaddress(cp,coinaddr,Mypubkey()); - result.push_back(Pair("myCCaddress",coinaddr)); + if ( strcmp(myCCaddr,coinaddr) == 0 ) + result.push_back(Pair("ismine",1)); + else result.push_back(Pair("ismine",0)); for (i=0; i 1 ) @@ -549,8 +556,8 @@ UniValue MarmaraCreditloop(uint256 txid) str[0] = funcid, str[1] = 0; obj.push_back(Pair("funcid",str)); obj.push_back(Pair("senderpk",HexStr(senderpk))); - GetCCaddress(cp,coinaddr,senderpk); - obj.push_back(Pair("receiver",coinaddr)); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk())) << OP_CHECKSIG); + obj.push_back(Pair("senderaddr",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); if ( funcid == 'R' && createtxid == zeroid ) From 23093607b09f8ccf67cfbf1296da538b58023782 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:47:50 -1100 Subject: [PATCH 38/52] Test --- src/cc/marmara.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 48dc1f6ef..394d2d9d8 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -537,9 +537,8 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("matures",refmatures)); result.push_back(Pair("currency",refcurrency)); result.push_back(Pair("senderpk",HexStr(senderpk))); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk())) << OP_CHECKSIG); - obj.push_back(Pair("senderaddr",coinaddr)); - + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk)) << OP_CHECKSIG); + result.push_back(Pair("senderaddr",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); if ( strcmp(myCCaddr,coinaddr) == 0 ) @@ -556,7 +555,7 @@ UniValue MarmaraCreditloop(uint256 txid) str[0] = funcid, str[1] = 0; obj.push_back(Pair("funcid",str)); obj.push_back(Pair("senderpk",HexStr(senderpk))); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk())) << OP_CHECKSIG); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk)) << OP_CHECKSIG); obj.push_back(Pair("senderaddr",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); From 76ff3a027510c9864887f371ca00d7a9d652ffb0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 01:56:17 -1100 Subject: [PATCH 39/52] Conditional recv/send pk --- src/cc/marmara.cpp | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 394d2d9d8..93f55799e 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { @@ -522,7 +522,7 @@ UniValue MarmaraCreditloop(uint256 txid) GetCCaddress(cp,myCCaddr,Mypubkey()); result.push_back(Pair("myCCaddress",myCCaddr)); result.push_back(Pair("batontxid",batontxid.GetHex())); - if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,senderpk,refamount,refmatures,refcurrency)) != 0 ) + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,refcreatetxid,pk,refamount,refmatures,refcurrency)) != 0 ) { str[0] = funcid, str[1] = 0; result.push_back(Pair("funcid",str)); @@ -536,9 +536,11 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("amount",ValueFromAmount(refamount))); result.push_back(Pair("matures",refmatures)); result.push_back(Pair("currency",refcurrency)); - result.push_back(Pair("senderpk",HexStr(senderpk))); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk)) << OP_CHECKSIG); - result.push_back(Pair("senderaddr",coinaddr)); + result.push_back(Pair("receiverpk",HexStr(pk))); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); + result.push_back(Pair("receiveraddr",coinaddr)); + GetCCaddress(cp,coinaddr,pk); + result.push_back(Pair("receiverCCaddr",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); if ( strcmp(myCCaddr,coinaddr) == 0 ) @@ -548,19 +550,31 @@ UniValue MarmaraCreditloop(uint256 txid) { if ( GetTransaction(creditloop[i],tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) { - if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,senderpk,amount,matures,currency)) != 0 ) + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,pk,amount,matures,currency)) != 0 ) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("txid",creditloop[i].GetHex())); str[0] = funcid, str[1] = 0; obj.push_back(Pair("funcid",str)); - obj.push_back(Pair("senderpk",HexStr(senderpk))); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(senderpk)) << OP_CHECKSIG); - obj.push_back(Pair("senderaddr",coinaddr)); + if ( funcid == 'R' && createtxid == zeroid ) + { + createtxid = creditloop[i]; + obj.push_back(Pair("senderpk",HexStr(pk))); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); + obj.push_back(Pair("senderaddr",coinaddr)); + GetCCaddress(cp,coinaddr,pk); + result.push_back(Pair("senderCCaddr",coinaddr)); + } + else + { + obj.push_back(Pair("receiverpk",HexStr(pk))); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); + obj.push_back(Pair("receiveraddr",coinaddr)); + GetCCaddress(cp,coinaddr,pk); + result.push_back(Pair("receiverCCaddr",coinaddr)); + } Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); - if ( funcid == 'R' && createtxid == zeroid ) - createtxid = creditloop[i]; if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { numerrs++; From a5f19e3399ecc232bf9494bcd98d3b64a1aedbe8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 02:01:28 -1100 Subject: [PATCH 40/52] Fix --- src/cc/marmara.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 93f55799e..7e054c369 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -563,7 +563,7 @@ UniValue MarmaraCreditloop(uint256 txid) Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); obj.push_back(Pair("senderaddr",coinaddr)); GetCCaddress(cp,coinaddr,pk); - result.push_back(Pair("senderCCaddr",coinaddr)); + obj.push_back(Pair("senderCCaddr",coinaddr)); } else { @@ -571,7 +571,7 @@ UniValue MarmaraCreditloop(uint256 txid) Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); obj.push_back(Pair("receiveraddr",coinaddr)); GetCCaddress(cp,coinaddr,pk); - result.push_back(Pair("receiverCCaddr",coinaddr)); + obj.push_back(Pair("receiverCCaddr",coinaddr)); } Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); obj.push_back(Pair("nextaddress",coinaddr)); From bad70de66a435485295afca0c2323e5e592a7de1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 02:02:23 -1100 Subject: [PATCH 41/52] Test --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 7e054c369..9097b618b 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -574,7 +574,7 @@ UniValue MarmaraCreditloop(uint256 txid) obj.push_back(Pair("receiverCCaddr",coinaddr)); } Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); - obj.push_back(Pair("nextaddress",coinaddr)); + obj.push_back(Pair("nextCCaddress",coinaddr)); if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { numerrs++; From b41b4e3a4cc18a43c0a3a5b85d800b92eafe815a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 02:08:25 -1100 Subject: [PATCH 42/52] Test --- src/cc/marmara.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 9097b618b..941c25cb6 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -536,11 +536,11 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("amount",ValueFromAmount(refamount))); result.push_back(Pair("matures",refmatures)); result.push_back(Pair("currency",refcurrency)); - result.push_back(Pair("receiverpk",HexStr(pk))); + result.push_back(Pair("batonpk",HexStr(pk))); Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); - result.push_back(Pair("receiveraddr",coinaddr)); + result.push_back(Pair("batonaddr",coinaddr)); GetCCaddress(cp,coinaddr,pk); - result.push_back(Pair("receiverCCaddr",coinaddr)); + result.push_back(Pair("batonCCaddr",coinaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); result.push_back(Pair("batonaddress",coinaddr)); if ( strcmp(myCCaddr,coinaddr) == 0 ) @@ -559,11 +559,11 @@ UniValue MarmaraCreditloop(uint256 txid) if ( funcid == 'R' && createtxid == zeroid ) { createtxid = creditloop[i]; - obj.push_back(Pair("senderpk",HexStr(pk))); + obj.push_back(Pair("issuerpk",HexStr(pk))); Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); - obj.push_back(Pair("senderaddr",coinaddr)); + obj.push_back(Pair("issueraddr",coinaddr)); GetCCaddress(cp,coinaddr,pk); - obj.push_back(Pair("senderCCaddr",coinaddr)); + obj.push_back(Pair("issuerCCaddr",coinaddr)); } else { @@ -574,7 +574,7 @@ UniValue MarmaraCreditloop(uint256 txid) obj.push_back(Pair("receiverCCaddr",coinaddr)); } Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); - obj.push_back(Pair("nextCCaddress",coinaddr)); + obj.push_back(Pair("destCCaddress",coinaddr)); if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { numerrs++; From fba668fa077079b1928ee73d96d599d87686ef9f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 02:12:06 -1100 Subject: [PATCH 43/52] Test --- src/cc/marmara.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 941c25cb6..37ba74b5b 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { @@ -539,10 +539,14 @@ UniValue MarmaraCreditloop(uint256 txid) result.push_back(Pair("batonpk",HexStr(pk))); Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); result.push_back(Pair("batonaddr",coinaddr)); - GetCCaddress(cp,coinaddr,pk); - result.push_back(Pair("batonCCaddr",coinaddr)); + GetCCaddress(cp,batonCCaddr,pk); + result.push_back(Pair("batonCCaddr",batonCCaddr)); Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); - result.push_back(Pair("batonaddress",coinaddr)); + if ( strcmp(coinaddr,batonCCaddr) != 0 ) + { + result.push_back(Pair("vout0address",coinaddr)); + numerrs++; + } if ( strcmp(myCCaddr,coinaddr) == 0 ) result.push_back(Pair("ismine",1)); else result.push_back(Pair("ismine",0)); @@ -573,8 +577,12 @@ UniValue MarmaraCreditloop(uint256 txid) GetCCaddress(cp,coinaddr,pk); obj.push_back(Pair("receiverCCaddr",coinaddr)); } - Getscriptaddress(coinaddr,tx.vout[0].scriptPubKey); - obj.push_back(Pair("destCCaddress",coinaddr)); + Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); + if ( strcmp(destaddr,coinaddr) != 0 ) + { + obj.push_back(Pair("vout0address",destaddr)); + numerrs++; + } if ( createtxid != refcreatetxid || amount != refamount || matures != refmatures || currency != refcurrency ) { numerrs++; From 4f194e605386633b3ced025198342d7f734b4972 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 02:14:52 -1100 Subject: [PATCH 44/52] Destaddr --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 37ba74b5b..1e16532d4 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -510,7 +510,7 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { From 6620e4cec288090746a3f2aa206bb25d54b36d96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:04:00 -1100 Subject: [PATCH 45/52] marmara_settlement skeleton --- src/cc/CCMarmara.h | 1 + src/cc/marmara.cpp | 73 ++++++++++++++++++++++++++++------------ src/rpc/server.cpp | 1 + src/rpc/server.h | 1 + src/wallet/rpcwallet.cpp | 15 +++++++++ 5 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/cc/CCMarmara.h b/src/cc/CCMarmara.h index 1d61a86d4..753f8edb6 100644 --- a/src/cc/CCMarmara.h +++ b/src/cc/CCMarmara.h @@ -28,6 +28,7 @@ uint64_t komodo_block_prg(uint32_t nHeight); int32_t MarmaraGetcreatetxid(uint256 &createtxid,uint256 txid); int32_t MarmaraGetbatontxid(std::vector &creditloop,uint256 &batontxid,uint256 txid); UniValue MarmaraCreditloop(uint256 txid); +UniValue MarmaraSettlement(uint64_t txfee,uint256 batontxid); UniValue MarmaraPoolPayout(uint64_t txfee,int32_t firstheight,double perc,char *jsonstr); // [[pk0, shares0], [pk1, shares1], ...] UniValue MarmaraReceive(uint64_t txfee,CPubKey senderpk,int64_t amount,std::string currency,int32_t matures,uint256 batontxid); diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 1e16532d4..ff4d0dc32 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -479,34 +479,65 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a return(result); } -// get creditloop pubkeys - -/*UniValue Marmara(uint64_t txfee,uint256 batontxid) +UniValue MarmaraSettlement(uint64_t txfee,uint256 batontxid) { - UniValue result(UniValue::VOBJ); int64_t avail,amount,paid=0; int32_t i,n = 0; uint256 txid,*revcreditloop=0; CPubKey Marmarapk; struct CCcontract_info *cp,C; - result.push_back(Pair("result","success")); + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); - Marmarapk = GetUnspendable(cp,0); - txid = batontxid; - while ( txid.hasprev() != 0 ) + if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) { - txid = txid.prev(); - // check for unique, else error - revcreditloop[n++] = txid; - } - for (i=0; i= amount ) + if ( GetTransaction(batontxid,batontx,hashBlock,false) != 0 && (numvouts= batontx.vout.size()) > 1 ) { - change = (amount - paid); - break; + if ( (funcid= MarmaraDecodeLoopOpret(batontx.vout[numvouts-1].scriptPubKey,refcreatetxid,pk,refamount,refmatures,refcurrency)) != 0 ) + { + if ( refcreatetxid != creditloop[0] ) + { + fprintf(stderr,"invalid refcreatetxid, setting to creditloop[0]\n"); + refcreatetxid = creditloop[0]; + numerrs++; + } + GetCCaddress(cp,myCCaddr,Mypubkey()); + Getscriptaddress(batonCCaddr,batontx.vout[0].scriptPubKey); + if ( strcmp(myCCaddr,batonCCaddr) == 0 ) + { + for (i=0; i 1 ) + { + if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,pk,amount,matures,currency)) != 0 ) + { + GetCCaddress(cp,coinaddr,pk); + fprintf(stderr,"get locked funds of %s %.8f\n",coinaddr,(double)CCaddress_balance(coinaddr)/COIN); + } + } + } + } + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"this node does not have the baton")); + result.push_back(Pair("myCCaddr",myCCaddr)); + result.push_back(Pair("batonCCaddr",batonCCaddr)); + } + } + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt get batontxid opret")); + } + } + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt find batontxid")); } } - + else + { + result.push_back(Pair("result",(char *)"error")); + result.push_back(Pair("error",(char *)"couldnt get creditloop")); + } return(result); -}*/ +} UniValue MarmaraCreditloop(uint256 txid) { diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index c8e2c4113..94403bcc0 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -449,6 +449,7 @@ static const CRPCCommand vRPCCommands[] = { "marmara", "marmaratransfer", &marmara_transfer, true }, { "marmara", "marmarainfo", &marmara_info, true }, { "marmara", "marmaracreditloop", &marmara_creditloop, true }, + { "marmara", "marmarasettlement", &marmara_settlement, true }, // Payments { "payments", "paymentsaddress", &paymentsaddress, true }, diff --git a/src/rpc/server.h b/src/rpc/server.h index 1bc6bd582..920aac970 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -278,6 +278,7 @@ extern UniValue marmara_issue(const UniValue& params, bool fHelp); extern UniValue marmara_transfer(const UniValue& params, bool fHelp); extern UniValue marmara_info(const UniValue& params, bool fHelp); extern UniValue marmara_creditloop(const UniValue& params, bool fHelp); +extern UniValue marmara_settlement(const UniValue& params, bool fHelp); extern UniValue paymentsaddress(const UniValue& params, bool fHelp); extern UniValue gatewaysaddress(const UniValue& params, bool fHelp); extern UniValue gatewayslist(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 81b692dc0..b9186f5c7 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5668,6 +5668,21 @@ UniValue marmara_creditloop(const UniValue& params, bool fHelp) return(result); } +UniValue marmara_settlement(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint256 batontxid; + if ( fHelp || params.size() != 1 ) + { + // marmaracreditloop cc23bf81733556dc06db2fd9c9f4178cad44bdc237d6e62101cf0cdafb5195f7 + throw runtime_error("marmarasettlement batontxid\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"); + batontxid = Parseuint256((char *)params[0].get_str().c_str()); + result = MarmaraSettlement(batontxid); + return(result); +} + UniValue channelslist(const UniValue& params, bool fHelp) { if ( fHelp || params.size() > 0 ) From 422182a9d7c3525efb12e1b3ef1a8e93afabe892 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:05:14 -1100 Subject: [PATCH 46/52] Fix --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index ff4d0dc32..959f2f68c 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -483,7 +483,7 @@ UniValue MarmaraSettlement(uint64_t txfee,uint256 batontxid) { UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); - if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) + if ( (n= MarmaraGetbatontxid(creditloop,batontxid,batontxid)) > 0 ) { if ( GetTransaction(batontxid,batontx,hashBlock,false) != 0 && (numvouts= batontx.vout.size()) > 1 ) { From b51a551dde03ba4df8580a0437a0d9ae667a0e0a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:06:31 -1100 Subject: [PATCH 47/52] Refbatontxid --- src/cc/marmara.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 959f2f68c..07b8d5c5f 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -479,11 +479,11 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a return(result); } -UniValue MarmaraSettlement(uint64_t txfee,uint256 batontxid) +UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) { UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); - if ( (n= MarmaraGetbatontxid(creditloop,batontxid,batontxid)) > 0 ) + if ( (n= MarmaraGetbatontxid(creditloop,batontxid,refbatontxid)) > 0 && batontxid == refbatontxid ) { if ( GetTransaction(batontxid,batontx,hashBlock,false) != 0 && (numvouts= batontx.vout.size()) > 1 ) { From e1e112fc248229e901480f553c7bedbc7467fdab Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:19:16 -1100 Subject: [PATCH 48/52] Set three --- src/cc/marmara.cpp | 2 ++ src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 07b8d5c5f..e644cbe36 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -482,6 +482,8 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) { UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; + if ( txfee == 0 ) + txfee = 10000; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,refbatontxid)) > 0 && batontxid == refbatontxid ) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index b9186f5c7..02cb6afd3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5679,7 +5679,7 @@ UniValue marmara_settlement(const UniValue& params, bool fHelp) 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"); batontxid = Parseuint256((char *)params[0].get_str().c_str()); - result = MarmaraSettlement(batontxid); + result = MarmaraSettlement(0,batontxid); return(result); } From fa756027954860cd988a45a57f6f1df04121a024 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:24:30 -1100 Subject: [PATCH 49/52] Test --- src/cc/marmara.cpp | 4 ++-- src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index e644cbe36..8f6350daa 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -509,8 +509,8 @@ UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) { GetCCaddress(cp,coinaddr,pk); fprintf(stderr,"get locked funds of %s %.8f\n",coinaddr,(double)CCaddress_balance(coinaddr)/COIN); - } - } + } else fprintf(stderr,"null funcid for creditloop[%d]\n",i); + } else fprintf(stderr,"couldnt get creditloop[%d]\n",i); } } else diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 02cb6afd3..63992bf4d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5673,7 +5673,7 @@ UniValue marmara_settlement(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 batontxid; if ( fHelp || params.size() != 1 ) { - // marmaracreditloop cc23bf81733556dc06db2fd9c9f4178cad44bdc237d6e62101cf0cdafb5195f7 + // marmarasettlement cc23bf81733556dc06db2fd9c9f4178cad44bdc237d6e62101cf0cdafb5195f7 throw runtime_error("marmarasettlement batontxid\n"); } if ( ensure_CCrequirements() < 0 ) From f1971e0054885d83da5d56f117c511eafeb90288 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:26:59 -1100 Subject: [PATCH 50/52] Test --- src/cc/marmara.cpp | 2 +- src/wallet/rpcwallet.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 8f6350daa..8386db2c5 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -485,7 +485,7 @@ UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) if ( txfee == 0 ) txfee = 10000; cp = CCinit(&C,EVAL_MARMARA); - if ( (n= MarmaraGetbatontxid(creditloop,batontxid,refbatontxid)) > 0 && batontxid == refbatontxid ) + if ( (n= MarmaraGetbatontxid(creditloop,batontxid,refbatontxid)) > 0 ) { if ( GetTransaction(batontxid,batontx,hashBlock,false) != 0 && (numvouts= batontx.vout.size()) > 1 ) { diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 63992bf4d..0dcaaa848 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5673,6 +5673,7 @@ UniValue marmara_settlement(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); uint256 batontxid; if ( fHelp || params.size() != 1 ) { + // marmarasettlement 010ff7f9256cefe3b5dee3d72c0eeae9fc6f34884e6f32ffe5b60916df54a9be // marmarasettlement cc23bf81733556dc06db2fd9c9f4178cad44bdc237d6e62101cf0cdafb5195f7 throw runtime_error("marmarasettlement batontxid\n"); } From 6745e98d48baa6c6a547f289652f35bd13b0d964 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:30:37 -1100 Subject: [PATCH 51/52] GetCCaddress1of2 --- src/cc/marmara.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index 8386db2c5..d8e936839 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -507,7 +507,7 @@ UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) { if ( (funcid= MarmaraDecodeLoopOpret(tx.vout[numvouts-1].scriptPubKey,createtxid,pk,amount,matures,currency)) != 0 ) { - GetCCaddress(cp,coinaddr,pk); + GetCCaddress1of2(cp,coinaddr,Marmarapk,pk); fprintf(stderr,"get locked funds of %s %.8f\n",coinaddr,(double)CCaddress_balance(coinaddr)/COIN); } else fprintf(stderr,"null funcid for creditloop[%d]\n",i); } else fprintf(stderr,"couldnt get creditloop[%d]\n",i); From 28d6643b3a4a409d2a847504c27d3fe8ca387533 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 15 Jan 2019 04:32:23 -1100 Subject: [PATCH 52/52] -senderpk --- src/cc/marmara.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/marmara.cpp b/src/cc/marmara.cpp index d8e936839..4eea7395d 100644 --- a/src/cc/marmara.cpp +++ b/src/cc/marmara.cpp @@ -481,10 +481,11 @@ UniValue MarmaraIssue(uint64_t txfee,uint8_t funcid,CPubKey receiverpk,int64_t a UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey Marmarapk,pk; std::string currency,refcurrency; CTransaction tx,batontx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; if ( txfee == 0 ) txfee = 10000; cp = CCinit(&C,EVAL_MARMARA); + Marmarapk = GetUnspendable(cp,0); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,refbatontxid)) > 0 ) { if ( GetTransaction(batontxid,batontx,hashBlock,false) != 0 && (numvouts= batontx.vout.size()) > 1 ) @@ -543,7 +544,7 @@ UniValue MarmaraSettlement(uint64_t txfee,uint256 refbatontxid) UniValue MarmaraCreditloop(uint256 txid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey senderpk,pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::vector creditloop; uint256 batontxid,createtxid,refcreatetxid,hashBlock; uint8_t funcid; int32_t numerrs=0,i,n,numvouts,matures,refmatures; int64_t amount,refamount; CPubKey pk; std::string currency,refcurrency; CTransaction tx; char coinaddr[64],myCCaddr[64],destaddr[64],batonCCaddr[64],str[2]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_MARMARA); if ( (n= MarmaraGetbatontxid(creditloop,batontxid,txid)) > 0 ) {