From 4df2623392fb2e7979a98d614f619981a28fe849 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 5 Sep 2018 22:29:28 -1100 Subject: [PATCH 001/306] Cleanup --- src/cc/dapps/oraclefeed.c | 25 -------------- src/cc/prices.cpp | 72 --------------------------------------- 2 files changed, 97 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index e2a7c6830..5dafdcb80 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -325,31 +325,6 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a return(retjson); } -void bntn() -{ - long fsize; int32_t i,n; cJSON *item,*retjson = 0; char cmdstr[32768],*jsonstr,*addr; double val; - if ( (jsonstr= filestr(&fsize,"bntn")) != 0 ) - { - if ( (retjson= cJSON_Parse(jsonstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) - { - for (i=0; i 0 ) - { - val = 1387; - if ( addr[0] == 'z' ) - printf("./komodo-cli -ac_name=BNTN sendtoaddress %s %.8f\n",addr,val); - } - } - } - free_json(retjson); - } - } -} - void komodobroadcast(char *acname,cJSON *hexjson) { char *hexstr,*retstr; cJSON *retjson; diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 72e486114..5a19cd49c 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -155,75 +155,3 @@ int64_t AddPricesInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub } return(totalinputs); } - -/* - UniValue PriceInfo(uint256 origtxid) -{ - UniValue result(UniValue::VOBJ),a(UniValue::VARR),obj(UniValue::VOBJ); - std::vector > unspentOutputs; - CTransaction regtx,tx; std::string name,description,format; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey markerpubkey,pk; struct CCcontract_info *cp,C; uint8_t buf33[33]; int64_t datafee,funding; char str[67],markeraddr[64],numstr[64],batonaddr[64]; std::vector data; - cp = CCinit(&C,EVAL_ORACLES); - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&origtxid,32); - markerpubkey = buf2pk(buf33); - Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); - if ( GetTransaction(origtxid,tx,hashBlock,false) != 0 ) - { - if ( tx.vout.size() > 0 && DecodeOraclesCreateOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,name,description,format) == 'C' ) - { - result.push_back(Pair("result","success")); - result.push_back(Pair("txid",uint256_str(str,origtxid))); - result.push_back(Pair("name",name)); - result.push_back(Pair("description",description)); - result.push_back(Pair("format",format)); - result.push_back(Pair("marker",markeraddr)); - SetCCunspents(unspentOutputs,markeraddr); - for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) - { - txid = it->first.txhash; - if ( GetTransaction(txid,regtx,hashBlock,false) != 0 ) - { - if ( regtx.vout.size() > 0 && DecodeOraclesOpRet(regtx.vout[regtx.vout.size()-1].scriptPubKey,oracletxid,pk,datafee) == 'R' && oracletxid == origtxid ) - { - obj.push_back(Pair("provider",pubkey33_str(str,(uint8_t *)pk.begin()))); - Getscriptaddress(batonaddr,regtx.vout[1].scriptPubKey); - batontxid = OracleBatonUtxo(10000,cp,oracletxid,batonaddr,pk,data); - obj.push_back(Pair("baton",batonaddr)); - obj.push_back(Pair("batontxid",uint256_str(str,batontxid))); - funding = LifetimeOraclesFunds(cp,oracletxid,pk); - sprintf(numstr,"%.8f",(double)funding/COIN); - obj.push_back(Pair("lifetime",numstr)); - funding = AddOracleInputs(cp,mtx,pk,0,0); - sprintf(numstr,"%.8f",(double)funding/COIN); - obj.push_back(Pair("funds",numstr)); - sprintf(numstr,"%.8f",(double)datafee/COIN); - obj.push_back(Pair("datafee",numstr)); - a.push_back(obj); - } - } - } - result.push_back(Pair("registered",a)); - } - } - return(result); -} - -UniValue PricesList() -{ - UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock; CTransaction createtx; std::string name,description,format; char str[65]; - cp = CCinit(&C,EVAL_ORACLES); - SetCCtxids(addressIndex,cp->normaladdr); - for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) - { - txid = it->first.txhash; - if ( GetTransaction(txid,createtx,hashBlock,false) != 0 ) - { - if ( createtx.vout.size() > 0 && DecodeOraclesCreateOpRet(createtx.vout[createtx.vout.size()-1].scriptPubKey,name,description,format) == 'C' ) - { - result.push_back(uint256_str(str,txid)); - } - } - } - return(result); -} -*/ From 4b6317e5a3d23f6ca5111765ad4ab732c2619633 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 5 Sep 2018 22:41:52 -1100 Subject: [PATCH 002/306] Make OraclePrice deterministic --- src/cc/oracles.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a9554b077..ab3ee030b 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -384,12 +384,25 @@ int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) else return(price); } +int _increasing_uint64(const void *a,const void *b) +{ +#define uint64_a (*(uint64_t *)a) +#define uint64_b (*(uint64_t *)b) + if ( uint64_b > uint64_a ) + return(-1); + else if ( uint64_b < uint64_a ) + return(1); + return(0); +#undef uint64_a +#undef uint64_b +} + int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) { int32_t i,j; int64_t price = 0; if ( n == 1 ) return(prices[0]); - // deterministic sort, like heapsort + heapsort(prices,n,sizeof(*prices),_increasing_uint64); for (i=0; i Date: Wed, 5 Sep 2018 22:42:52 -1100 Subject: [PATCH 003/306] Sodlib --- src/cc/CCinclude.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 6cf32b1c5..99fd04544 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -48,6 +48,7 @@ one other technical note is that komodod has the insight-explorer extensions bui #include #include #include "../komodo_defs.h" +#include extern int32_t KOMODO_CONNECTING,KOMODO_CCACTIVATE; extern uint32_t ASSETCHAINS_CC; From 7d0ac4710e647e95abd354a69ec85e020ba75cc7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 5 Sep 2018 22:50:52 -1100 Subject: [PATCH 004/306] Merge sort --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index ab3ee030b..44fe4952a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -402,7 +402,7 @@ int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) int32_t i,j; int64_t price = 0; if ( n == 1 ) return(prices[0]); - heapsort(prices,n,sizeof(*prices),_increasing_uint64); + mergesort(prices,n,sizeof(*prices),_increasing_uint64); for (i=0; i Date: Wed, 5 Sep 2018 22:51:38 -1100 Subject: [PATCH 005/306] bsd --- src/cc/CCinclude.h | 2 +- src/cc/oracles.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 99fd04544..2efd3de64 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -48,7 +48,7 @@ one other technical note is that komodod has the insight-explorer extensions bui #include #include #include "../komodo_defs.h" -#include +#include extern int32_t KOMODO_CONNECTING,KOMODO_CCACTIVATE; extern uint32_t ASSETCHAINS_CC; diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 44fe4952a..ab3ee030b 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -402,7 +402,7 @@ int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) int32_t i,j; int64_t price = 0; if ( n == 1 ) return(prices[0]); - mergesort(prices,n,sizeof(*prices),_increasing_uint64); + heapsort(prices,n,sizeof(*prices),_increasing_uint64); for (i=0; i Date: Wed, 5 Sep 2018 23:04:12 -1100 Subject: [PATCH 006/306] Test --- src/cc/CCinclude.h | 1 - src/cc/oracles.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 2efd3de64..6cf32b1c5 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -48,7 +48,6 @@ one other technical note is that komodod has the insight-explorer extensions bui #include #include #include "../komodo_defs.h" -#include extern int32_t KOMODO_CONNECTING,KOMODO_CCACTIVATE; extern uint32_t ASSETCHAINS_CC; diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index ab3ee030b..8929af4b1 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -402,7 +402,7 @@ int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) int32_t i,j; int64_t price = 0; if ( n == 1 ) return(prices[0]); - heapsort(prices,n,sizeof(*prices),_increasing_uint64); + //heapsort(prices,n,sizeof(*prices),_increasing_uint64); for (i=0; i Date: Thu, 6 Sep 2018 23:51:18 -1100 Subject: [PATCH 007/306] Vectorize OraclesPrices --- src/cc/CCOracles.h | 2 - src/cc/oracles.cpp | 106 +++++++++++++++++++++++++++------------------ 2 files changed, 64 insertions(+), 44 deletions(-) diff --git a/src/cc/CCOracles.h b/src/cc/CCOracles.h index bddb9b15b..41409d5c5 100644 --- a/src/cc/CCOracles.h +++ b/src/cc/CCOracles.h @@ -19,8 +19,6 @@ #include "CCinclude.h" -#define ORACLES_MAXPROVIDERS 64 - bool OraclesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); std::string OracleCreate(int64_t txfee,std::string name,std::string description,std::string format); std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee); diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 8929af4b1..db34227d7 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -369,6 +369,13 @@ int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t return(offset); } +struct oracleprice_info +{ + CPubKey pk; + std::vector data; + int32_t height; +}; + int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) { int32_t i,count = 0; int64_t diff,threshold = (price >> 8); @@ -384,25 +391,11 @@ int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) else return(price); } -int _increasing_uint64(const void *a,const void *b) -{ -#define uint64_a (*(uint64_t *)a) -#define uint64_b (*(uint64_t *)b) - if ( uint64_b > uint64_a ) - return(-1); - else if ( uint64_b < uint64_a ) - return(1); - return(0); -#undef uint64_a -#undef uint64_b -} - int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) { int32_t i,j; int64_t price = 0; if ( n == 1 ) return(prices[0]); - //heapsort(prices,n,sizeof(*prices),_increasing_uint64); for (i=0; i %llu ht.%d\n",(long long)price,height); } -int64_t OracleCorrelatedPrice(int32_t height,char *format,std::vector datas[ORACLES_MAXPROVIDERS],int32_t n) +int64_t OracleCorrelatedPrice(std::vector origprices) { - int64_t prices[ORACLES_MAXPROVIDERS]; int32_t i,m=0; uint256 hash; int64_t val,price=0; - if ( format[0] == 'L' ) + std::vector sorted; int32_t i,n; int64_t *prices,price; + if ( (n= origprices.size()) == 1 ) + return(origprices[0]); + sorted = origprices.sorted(); + prices = calloc(n,sizeof(*prices)); + i = 0; + for (std::vector::const_iterator it=sorted.begin(); it!=sorted.end(); it++) + prices[i++] = it->first; + price = correlate_price(prices,i); + free(prices); + return(price); +} + +int32_t oracleprice_add(std::vector &publishers,CPubKey pk,int32_t height,std::vector data,int32_t maxheight) +{ + struct oracleprice_info item; int32_t flag = 0; + for (std::vector::const_iterator it=publishers.begin(); it!=publishers.end(); it++) { - for (i=0; ifirst.pk ) { - oracle_format(&hash,&val,0,'L',(uint8_t *)datas[i].data(),0,(int32_t)datas[i].size()); - if ( val != 0 ) - prices[m++] = val; + flag = 1; + if (height > it->first.height ) + { + it->first.height = height; + it->first.data = data; + return(height); + } } } - if ( m != 0 ) - price = correlate_price(height,prices,m); - return(0); + if ( flag == 0 ) + { + item.pk = pk; + item.data = data; + item.height = height; + publishers.push_back(item); + return(height); + } else return(0); } int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format) { std::vector > unspentOutputs; - CTransaction regtx,tx; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey pk,providers[ORACLES_MAXPROVIDERS]; int32_t i,j,n=0; int64_t datafee; char batonaddr[64]; std::vector data,datas[ORACLES_MAXPROVIDERS]; struct CCcontract_info *cp,C; + CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,height,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector providers; std::vector prices; + if ( format[0] != 'L' ) + return(0); cp = CCinit(&C,EVAL_ORACLES); SetCCunspents(unspentOutputs,markeraddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; - if ( myGetTransaction(txid,regtx,hashBlock) != 0 ) + height = (int32_t)it->second.blockHeight; + if ( myGetTransaction(txid,regtx,hash) != 0 ) { if ( regtx.vout.size() > 0 && DecodeOraclesOpRet(regtx.vout[regtx.vout.size()-1].scriptPubKey,oracletxid,pk,datafee) == 'R' && oracletxid == reforacletxid ) { - for (j=0; j maxht ) + maxheight = ht; } } } - return(OracleCorrelatedPrice(height,format,datas,n)); + if ( maxheight > 10 ) + { + for (std::vector::const_iterator it=publishers.begin(); it!=publishers.end(); it++) + { + if ( it->first.height >= maxheight-10 ) + { + oracle_format(&hash,&price,0,'L',(uint8_t *)it->first.data.data(),0,(int32_t)it->first.data.size()); + if ( price != 0 ) + prices.push_back(price); + } + } + return(OracleCorrelatedPrice(prices)); + } + return(0); } int64_t IsOraclesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) From a5faf9e9f860eb9c4462a6420705f5cb6b69b632 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 6 Sep 2018 23:53:55 -1100 Subject: [PATCH 008/306] Test --- src/cc/oracles.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index db34227d7..b128b1328 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -391,7 +391,7 @@ int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) else return(price); } -int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) +int64_t correlate_price(int64_t *prices,int32_t n) { int32_t i,j; int64_t price = 0; if ( n == 1 ) @@ -427,13 +427,13 @@ int32_t oracleprice_add(std::vector &publishers,CPubKey struct oracleprice_info item; int32_t flag = 0; for (std::vector::const_iterator it=publishers.begin(); it!=publishers.end(); it++) { - if ( pk == it->first.pk ) + if ( pk == it->pk ) { flag = 1; - if (height > it->first.height ) + if (height > it->height ) { - it->first.height = height; - it->first.data = data; + it->height = height; + it->data = data; return(height); } } @@ -475,9 +475,9 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * { for (std::vector::const_iterator it=publishers.begin(); it!=publishers.end(); it++) { - if ( it->first.height >= maxheight-10 ) + if ( it->height >= maxheight-10 ) { - oracle_format(&hash,&price,0,'L',(uint8_t *)it->first.data.data(),0,(int32_t)it->first.data.size()); + oracle_format(&hash,&price,0,'L',(uint8_t *)it->data.data(),0,(int32_t)it->data.size()); if ( price != 0 ) prices.push_back(price); } From d5f527a75cf033a262331c356eac36665d5a3b9d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 6 Sep 2018 23:55:41 -1100 Subject: [PATCH 009/306] Test --- src/cc/oracles.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index b128b1328..bd0411885 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -391,7 +391,7 @@ int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) else return(price); } -int64_t correlate_price(int64_t *prices,int32_t n) +int64_t correlate_price(int32_t height,int64_t *prices,int32_t n) { int32_t i,j; int64_t price = 0; if ( n == 1 ) @@ -407,7 +407,7 @@ int64_t correlate_price(int64_t *prices,int32_t n) fprintf(stderr,"-> %llu ht.%d\n",(long long)price,height); } -int64_t OracleCorrelatedPrice(std::vector origprices) +int64_t OracleCorrelatedPrice(int32_t height,std::vector origprices) { std::vector sorted; int32_t i,n; int64_t *prices,price; if ( (n= origprices.size()) == 1 ) @@ -417,7 +417,7 @@ int64_t OracleCorrelatedPrice(std::vector origprices) i = 0; for (std::vector::const_iterator it=sorted.begin(); it!=sorted.end(); it++) prices[i++] = it->first; - price = correlate_price(prices,i); + price = correlate_price(height,prices,i); free(prices); return(price); } @@ -451,7 +451,7 @@ int32_t oracleprice_add(std::vector &publishers,CPubKey int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format) { std::vector > unspentOutputs; - CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,height,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector providers; std::vector prices; + CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,height,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector publishers; std::vector prices; if ( format[0] != 'L' ) return(0); cp = CCinit(&C,EVAL_ORACLES); @@ -482,7 +482,7 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * prices.push_back(price); } } - return(OracleCorrelatedPrice(prices)); + return(OracleCorrelatedPrice(maxheight,prices)); } return(0); } From a912c7e8f2d3fc4432dec712ff71ce1a8300fae5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 7 Sep 2018 00:11:21 -1100 Subject: [PATCH 010/306] Test --- src/cc/oracles.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index bd0411885..9f6edb137 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -412,11 +412,11 @@ int64_t OracleCorrelatedPrice(int32_t height,std::vector origprices) std::vector sorted; int32_t i,n; int64_t *prices,price; if ( (n= origprices.size()) == 1 ) return(origprices[0]); - sorted = origprices.sorted(); - prices = calloc(n,sizeof(*prices)); + std::sort(origprices.begin(), origprices.end()); + prices = (int64_t *)calloc(n,sizeof(*prices)); i = 0; for (std::vector::const_iterator it=sorted.begin(); it!=sorted.end(); it++) - prices[i++] = it->first; + prices[i++] = *it; price = correlate_price(height,prices,i); free(prices); return(price); @@ -430,7 +430,7 @@ int32_t oracleprice_add(std::vector &publishers,CPubKey if ( pk == it->pk ) { flag = 1; - if (height > it->height ) + if ( height > it->height ) { it->height = height; it->data = data; @@ -451,7 +451,7 @@ int32_t oracleprice_add(std::vector &publishers,CPubKey int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format) { std::vector > unspentOutputs; - CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,height,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector publishers; std::vector prices; + CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector publishers; std::vector prices; if ( format[0] != 'L' ) return(0); cp = CCinit(&C,EVAL_ORACLES); @@ -459,14 +459,14 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; - height = (int32_t)it->second.blockHeight; + ht = (int32_t)it->second.blockHeight; if ( myGetTransaction(txid,regtx,hash) != 0 ) { if ( regtx.vout.size() > 0 && DecodeOraclesOpRet(regtx.vout[regtx.vout.size()-1].scriptPubKey,oracletxid,pk,datafee) == 'R' && oracletxid == reforacletxid ) { Getscriptaddress(batonaddr,regtx.vout[1].scriptPubKey); batontxid = OracleBatonUtxo(10000,cp,oracletxid,batonaddr,pk,data); - if ( batontxid != zeroid && (ht= oracleprice_add(publishers,pk,height,data,maxheight)) > maxht ) + if ( batontxid != zeroid && (ht= oracleprice_add(publishers,pk,ht,data,maxheight)) > maxheight ) maxheight = ht; } } @@ -482,7 +482,7 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * prices.push_back(price); } } - return(OracleCorrelatedPrice(maxheight,prices)); + return(OracleCorrelatedPrice(height,prices)); } return(0); } From bedac1d5c6a6bd2982603dff03ca117ba70f61ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 7 Sep 2018 00:17:47 -1100 Subject: [PATCH 011/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 9f6edb137..59a852462 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -425,7 +425,7 @@ int64_t OracleCorrelatedPrice(int32_t height,std::vector origprices) int32_t oracleprice_add(std::vector &publishers,CPubKey pk,int32_t height,std::vector data,int32_t maxheight) { struct oracleprice_info item; int32_t flag = 0; - for (std::vector::const_iterator it=publishers.begin(); it!=publishers.end(); it++) + for (std::vector::iterator it=publishers.begin(); it!=publishers.end(); it++) { if ( pk == it->pk ) { From 3515c101d43d42c8ae795beacfa50574abdfa16f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:07:02 -1100 Subject: [PATCH 012/306] Initial gateways CC --- src/cc/CCGateways.h | 5 + src/cc/CCassetstx.cpp | 20 +- src/cc/CCinclude.h | 23 ++ src/cc/CCtx.cpp | 42 ++++ src/cc/CCutils.cpp | 14 +- src/cc/gateways.cpp | 475 +++++++++++++++++++++++++++++++++------ src/cc/oracles.cpp | 39 +++- src/cc/prices.cpp | 177 +++++++++++++++ src/rpcserver.cpp | 6 + src/rpcserver.h | 8 +- src/wallet/rpcwallet.cpp | 92 ++++++++ 11 files changed, 815 insertions(+), 86 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 1b7852725..6d5df60ca 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -20,8 +20,13 @@ #include "CCinclude.h" bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); +std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector claimpubkey,int64_t amount); +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount); +std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); // CCcustom UniValue GatewaysInfo(); +UniValue GatewaysList(uint256 bindtxid); #endif diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 45b9d7d6e..82623d4b9 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -223,16 +223,16 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector des for (i=0; i 0 ) - { - if ( inputs > total ) - CCchange = (inputs - total); - //for (i=0; i 0 ) + { + if ( inputs > total ) + CCchange = (inputs - total); + //for (i=0; i data; + int32_t height; +}; + #ifdef ENABLE_WALLET extern CWallet* pwalletMain; #endif @@ -92,8 +105,15 @@ bool mySendrawtransaction(std::string res); int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp); int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp); +CScript GetScriptForMultisig(int nRequired, const std::vector& keys); +int64_t CCaddress_balance(char *coinaddr); int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format); +uint8_t DecodeOraclesCreateOpRet(const CScript &scriptPubKey,std::string &name,std::string &description,std::string &format); +uint256 OracleMerkle(int32_t height,uint256 reforacletxid,char *format,std::vectorpublishers); +uint256 OraclesBatontxid(uint256 oracletxid,CPubKey pk); +int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs); +bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); @@ -114,6 +134,9 @@ char *uint256_str(char *dest,uint256 txid); char *pubkey33_str(char *dest,uint8_t *pubkey33); uint256 Parseuint256(char *hexstr); CPubKey pubkey2pk(std::vector pubkey); +int64_t CCfullsupply(uint256 tokenid); +int64_t CCtoken_balance(char *destaddr,uint256 tokenid); +bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk); bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk); bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubKey pk2); bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,int64_t nValue); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 4764f4ff6..f1d6536cc 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -212,6 +212,48 @@ int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) return(0); } +int64_t CCaddress_balance(char *coinaddr) +{ + int64_t sum = 0; std::vector > unspentOutputs; + SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + sum += it->second.satoshis; + } + return(sum); +} + +int64_t CCfullsupply(uint256 tokenid) +{ + uint256 hashBlock; int32_t numvouts; CTransaction tx; std::vector origpubkey; std::string name,description; + if ( GetTransaction(tokenid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeAssetCreateOpRet(tx.vout[numvouts-1].scriptPubKey,origpubkey,name,description) > 0 ) + { + return(tx.vout[0].nValue); + } + } + return(0); +} + +int64_t CCtoken_balance(char *destaddr,uint256 tokenid) +{ + int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,hashBlock; std::vector origpubkey; std::vector > unspentOutputs; + SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 && assetid == tokenid ) + { + sum += it->second.satoshis; + } + } + } + return(sum); +} + int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,struct CC_utxo utxos[],int32_t numunspents,int64_t value) { int32_t i,abovei,belowi; int64_t above,below,gap,atx_value; diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index fea8e0ddf..cd7299bcf 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -181,13 +181,11 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) return(false); } -bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk) +bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk) { CC *payoutCond; destaddr[0] = 0; - if ( pk.size() == 0 ) - pk = GetUnspendable(cp,0); - if ( (payoutCond= MakeCCcond1(cp->evalcode,pk)) != 0 ) + if ( (payoutCond= MakeCCcond1(evalcode,pk)) != 0 ) { Getscriptaddress(destaddr,CCPubKey(payoutCond)); cc_free(payoutCond); @@ -195,6 +193,14 @@ bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk) return(destaddr[0] != 0); } +bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk) +{ + destaddr[0] = 0; + if ( pk.size() == 0 ) + pk = GetUnspendable(cp,0); + return(_GetCCaddress(destaddr,cp->evalcode,pk)); +} + bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubKey pk2) { CC *payoutCond; diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 8f5d00f26..80f076636 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -20,11 +20,80 @@ the potential pubkeys to be used would be based on active oracle data providers with recent activity. + bind asset <-> KMD gateway deposit address + KMD deposit -> globally spendable marker utxo + spend marker utxo and spend linked/locked asset to user's CC address + + redeem -> asset to global CC address with withdraw address -> gateway spendable marker utxo + spend market utxo and withdraw from gateway deposit address + + rpc calls: + GatewayList + GatewayInfo bindtxid + GatewayBind coin tokenid M N pubkey(s) + external: deposit to depositaddr with claimpubkey + GatewayDeposit coin tokenid external.deposittxid -> markertxid + GatewayClaim coin tokenid external.deposittxid markertxid -> spend marker and deposit asset + + GatewayWithdraw coin tokenid withdrawaddr + external: do withdraw to withdrawaddr and spend marker, support for partial signatures and autocomplete + + deposit addr can be 1 to MofN pubkeys + 1:1 gateway with native coin */ // start of consensus code +CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys,uint8_t taddr,uint8_t prefix,uint8_t prefix2) +{ + CScript opret; uint8_t evalcode = EVAL_GATEWAYS; + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << prefix << prefix2 << taddr << tokenid << totalsupply << M << N << pubkeys); + return(opret); +} + +CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +{ + CScript opret; uint8_t evalcode = EVAL_GATEWAYS; + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << height << cointxid << deposithex << proof << redeemscript << amount); + return(opret); +} + +uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector &publishers,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) +{ + std::vector vopret; uint8_t *script,e,f; + GetOpReturnData(scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> bindtxid; ss >> publishers; ss >> height; ss >> cointxid; ss >> deposithex; ss >> proof; ss >> redeemscript; ss >> amount) != 0 ) + { + return(f); + } + return(0); +} + +uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,std::string &coin,uint256 &tokenid,int64_t &totalsupply,uint256 &oracletxid,uint8_t &M,uint8_t &N,std::vector &pubkeys,uint8_t &taddr,uint8_t &prefix,uint8_t &prefix2) +{ + std::vector vopret; uint8_t *script,e,f; + GetOpReturnData(scriptPubKey, vopret); + script = (uint8_t *)vopret.data(); + depositaddr[0] = 0; + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> prefix; ss >> prefix2; ss >> taddr; ss >> tokenid; ss >> totalsupply; ss >> M; ss >> N; ss >> pubkeys) != 0 ) + { + if ( prefix == 60 ) + { + if ( N > 1 ) + Getscriptaddress(depositaddr,GetScriptForMultisig(M,pubkeys)); + else Getscriptaddress(depositaddr,CScript() << Mypubkey(pubkeys[0]) << OP_CHECKSIG); + } + else + { + fprintf(stderr,"need to generate non-KMD addresses\n"); + } + return(f); + } + return(0); +} + int64_t IsGatewaysvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; @@ -128,7 +197,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP // no need to prevent dup if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { - if ( (nValue= IsGatewaysvout(cp,vintx,vout)) > 1000000 && myIsutxo_spentinmempool(txid,vout) == 0 ) + if ( (nValue= IsGatewaysvout(cp,vintx,vout)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); @@ -143,73 +212,353 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP return(totalinputs); } -std::string GatewaysGet(uint64_t txfee,int64_t nValue) +UniValue GatewaysInfo(uint256 bindtxid) { - CMutableTransaction mtx,tmpmtx; CPubKey mypk,Gatewayspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash; - cp = CCinit(&C,EVAL_GATEWAYS); - if ( txfee == 0 ) - txfee = 10000; - Gatewayspk = GetUnspendable(cp,0); - mypk = pubkey2pk(Mypubkey()); - if ( (inputs= AddGatewaysInputs(cp,mtx,Gatewayspk,nValue+txfee,60)) > 0 ) - { - if ( inputs > nValue ) - CCchange = (inputs - nValue - txfee); - if ( CCchange != 0 ) - mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CCchange,Gatewayspk)); - mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - fprintf(stderr,"start at %u\n",(uint32_t)time(NULL)); - j = rand() & 0xfffffff; - for (i=0; i<1000000; i++,j++) - { - tmpmtx = mtx; - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_GATEWAYS << (uint8_t)'G' << j)); - if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) - { - len >>= 1; - decode_hex(buf,len,(char *)rawhex.c_str()); - hash = bits256_doublesha256(0,buf,len); - if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 ) - { - fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); - return(rawhex); - } - //fprintf(stderr,"%02x%02x ",hash.bytes[0],hash.bytes[31]); - } - } - fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); - return(""); - } else fprintf(stderr,"cant find Gateways inputs\n"); - return(""); -} - -std::string GatewaysFund(uint64_t txfee,int64_t funds) -{ - CMutableTransaction mtx; CPubKey mypk,Gatewayspk; CScript opret; struct CCcontract_info *cp,C; - cp = CCinit(&C,EVAL_GATEWAYS); - if ( txfee == 0 ) - txfee = 10000; - mypk = pubkey2pk(Mypubkey()); - Gatewayspk = GetUnspendable(cp,0); - if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 ) - { - mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,funds,Gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); - } - return(""); -} - -UniValue GatewaysInfo() -{ - UniValue result(UniValue::VOBJ); char numstr[64]; - CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t funding; + UniValue result(UniValue::VOBJ); std::string coin; char str[65],numstr[65],depositaddr[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; result.push_back(Pair("result","success")); result.push_back(Pair("name","Gateways")); cp = CCinit(&C,EVAL_GATEWAYS); Gatewayspk = GetUnspendable(cp,0); - funding = AddGatewaysInputs(cp,mtx,Gatewayspk,0,0); - sprintf(numstr,"%.8f",(double)funding/COIN); - result.push_back(Pair("funding",numstr)); + if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) + { + if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 0 ) + { + depositaddr[0] = 0; + if ( N > 1 ) + { + result.push_back(Pair("M",M)); + result.push_back(Pair("N",N)); + } + result.push_back(Pair("coin",coin)); + result.push_back(Pair("oracletxid",uint256_str(str,oracletxid))); + result.push_back(Pair("taddr",taddr)); + result.push_back(Pair("prefix",prefix)); + result.push_back(Pair("prefix2",prefix2)); + result.push_back(Pair("deposit",depositaddr)); + result.push_back(Pair("tokenid",uint256_str(str,tokenid))); + sprintf(numstr,"%.8f",(double)totalsupply/COIN); + result.push_back(Pair("totalsupply",numstr)); + remaining = CCaddress_balance(depositaddr); + sprintf(numstr,"%.8f",(double)remaining/COIN); + result.push_back(Pair("remaining",numstr)); + sprintf(numstr,"%.8f",(double)(totalsupply - remaining)/COIN); + result.push_back(Pair("issued",numstr)); + } + } return(result); } +UniValue GatewaysList() +{ + UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock,oracletxid,tokenid; CTransaction vintx; std::string coin,depositaddr; char str[65],depositaddr[64]; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; + cp = CCinit(&C,EVAL_GATEWAYS); + SetCCtxids(addressIndex,cp->unspendableCCaddr); + for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) + { + txid = it->first.txhash; + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) + { + if ( vintx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,vintx.vout[vintx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 ) + { + result.push_back(uint256_str(str,txid)); + } + } + } + return(result); +} + +std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys) +{ + CMutableTransaction mtx; CTransaction oracletx; uint8_t taddr,prefix,prefix2; CPubKey mypk,gatewayspk; CScript opret; uint256 hashBlock; struct CCcontract_info *cp,C; std::string name,description,format; int32_t i,numvouts; int64_t fullsupply; char coinaddr[64],str[65],*fstr; + cp = CCinit(&C,EVAL_GATEWAYS); + if ( N == 0 || N > 15 || M > N ) + { + fprintf(stderr,"illegal M.%d or N.%d\n",M,N); + return(""); + } + if ( strcmp((char *)"KMD",coin.c_str()) != 0 ) + { + fprintf(stderr,"only KMD supported for now\n"); + return(""); + } + taddr = 0; + prefix = 60; + prefix2 = 85; + if ( pubkeys.size() != N ) + { + fprintf(stderr,"M.%d N.%d but pubkeys[%d]\n",M,N,(int32_t)pubkeys.size()); + return(""); + } + for (i=0; i 0 ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,gatewayspk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysBindOpRet('B',coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2))); + } + fprintf(stderr,"cant find enough inputs\n"); + return(""); +} + +uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid) +{ + CTransaction tx; uint256 hash,mhash; int64_t val; int32_t numvouts,merkleht; CPubKey pk; std::vectordata; + txid = zeroid; + while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) + { + if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) + { + if ( oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()) == sizeof(hash) && + oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) + { + txid = batontxid; + return(mhash); + } else return(zeroid); + } + batontxid = hash; + } else break; + } + return(zeroid); +} + +int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) +{ + uint256 txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64]; int64_t nValue = 0; + if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) + { + fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); + return(0); + } + if ( DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,description,format) != 'C' || name != refcoin ) + { + fprintf(stderr,"GatewaysVerify mismatched oracle name %s != %s\n",name,refcoin); + return(0); + } + if ( DecodeHexTx(tx,deposithex) != 0 ) + { + scriptPubKey = CScript() << redeemscript; + Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); + if ( strcmp(refdepositaddr,destaddr) == 0 && scriptPubKey == tx.vout[1].scriptPubKey ) + { + txid = tx.GetHash(); + nValue = tx.vout[0].nValue; + } + else + { + Getscriptaddress(destaddr,tx.vout[1].scriptPubKey); + if ( strcmp(refdepositaddr,destaddr) == 0 && scriptPubKey == tx.vout[0].scriptPubKey ) + { + txid = tx.GetHash(); + nValue = tx.vout[1].nValue; + } + } + } + if ( txid == cointxid ) + { + fprintf(stderr,"verify proof for cointxid in merkleroot\n"); + return(nValue); + } else fprintf(stderr,"(%s) != (%s) or txid mismatch.%d or script mismatch.%d\n",refdepositaddr,destaddr,txid != cointxid,scriptPubKey != tx.vout[1].scriptPubKey); + return(0); +} + +int64_t GatewaysDepositval(CTransaction tx) +{ + int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; + if ( (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) + { + // coin, bindtxid, publishers + fprintf(stderr,"need to validate deposittxid more\n"); + return(amount); + } + } + return(0); +} + +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +{ + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid; int64_t totalsupply; int32_t i,m,n; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; + cp = CCinit(&C,EVAL_GATEWAYS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + gatewayspk = GetUnspendable(cp,0); + if ( GetTransaction(bindtxid,bindtx,hashBlock,false) == 0 || (numvouts= bindtx.vout.size()) <= 0 ) + { + fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + return(""); + } + if ( DecodeGatewaysBindOpRet(depositaddr,bindtx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || refcoin != coin ) + { + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + return(""); + } + n = (int32_t)pubkeys.size(); + merkleroot = zeroid; + for (i=m=0; i 0 ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,height,cointxid,deposithex,proof,redeemscript,amount))); + } + fprintf(stderr,"cant find enough inputs\n"); + return(""); +} + +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector claimpubkey,int64_t amount) +{ + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,inputs,CCchange=0; int32_t numvouts; uint256 assetid,oracletxid; char str[65],depositaddr[64]; + cp = CCinit(&C,EVAL_GATEWAYS); + assetscp = CCinit(&C2,EVAL_ASSETS); + memcpy(cp->unspendablepriv2,assetscp->CCpriv,32); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + gatewayspk = GetUnspendable(cp,0); + if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) + { + fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + return(""); + } + if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,assetid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || coin != refcoin ) + { + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + return(""); + } + if ( GetTransaction(deposittxid,tx,hashBlock,false) == 0 ) + { + fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + return(""); + } + if ( (total= GatewaysDepositval(tx)) == 0 ) + { + fprintf(stderr,"invalid Gateways deposittxid %s\n",uint256_str(str,deposittxid)); + return(""); + } + if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) + { + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,total,60)) > 0 ) + { + if ( inputs > total ) + CCchange = (inputs - total); + mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,total,mypk)); + if ( CCchange != 0 ) + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); + return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + } + } + fprintf(stderr,"cant find enough inputs or mismatched total\n"); + return(""); +} + +std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) +{ + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64]; + cp = CCinit(&C,EVAL_GATEWAYS); + assetscp = CCinit(&C2,EVAL_ASSETS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + gatewayspk = GetUnspendable(cp,0); + if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) + { + fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + return(""); + } + if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,assetid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || coin != refcoin ) + { + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + return(""); + } + if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) + { + if ( (inputs= AddAssetInputs(assetscp,mtx,mypk,assetid,amount,60)) > 0 ) + { + if ( inputs > amount ) + CCchange = (inputs - amount); + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,gatewayspk)); + if ( CCchange != 0 ) + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(withdrawpub)) << OP_CHECKSIG)); + return(FinalizeCCTx(mask,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + } + } + fprintf(stderr,"cant find enough inputs or mismatched total\n"); + return(""); +} + +// withdrawtxid used on external chain to create baton address, its existence in mempool (along with the withdraw) proof that the withdraw is pending + + diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 59a852462..df2e58e5a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -369,13 +369,6 @@ int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t return(offset); } -struct oracleprice_info -{ - CPubKey pk; - std::vector data; - int32_t height; -}; - int64_t _correlate_price(int64_t *prices,int32_t n,int64_t price) { int32_t i,count = 0; int64_t diff,threshold = (price >> 8); @@ -451,7 +444,7 @@ int32_t oracleprice_add(std::vector &publishers,CPubKey int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format) { std::vector > unspentOutputs; - CTransaction regtx,tx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector publishers; std::vector prices; + CTransaction regtx; uint256 hash,txid,oracletxid,batontxid; CPubKey pk; int32_t i,ht,maxheight=0; int64_t datafee,price; char batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; std::vector publishers; std::vector prices; if ( format[0] != 'L' ) return(0); cp = CCinit(&C,EVAL_ORACLES); @@ -487,6 +480,36 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * return(0); } +uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) +{ + std::vector > unspentOutputs; + CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk,markerpubkey; int32_t numvouts,ht,maxheight=0; int64_t datafee; uint8_t buf33[33]; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + rettxid = zeroid; + cp = CCinit(&C,EVAL_ORACLES); + buf33[0] = 0x02; + endiancpy(&buf33[1],(uint8_t *)&reforacletxid,32); + markerpubkey = buf2pk(buf33); + Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); + SetCCunspents(unspentOutputs,markeraddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + //ht = (int32_t)it->second.blockHeight; + if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk ) + { + if ( oracle_format(&hash,&ht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && ht > maxheight ) + { + maxheight = ht; + rettxid = txid; + } + } + } + } + return(rettxid); +} + int64_t IsOraclesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 5a19cd49c..995cd148a 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -33,6 +33,10 @@ it can be closed at anytime by the trader for cash settlement the house account can close it if rekt + Implementation Notes: + In order to eliminate the need for worrying about sybil attacks, each prices plan would be able to specific pubkey(s?) for whitelisted publishers. It would be possible to have a non-whitelisted plan that would use 50% correlation between publishers. + + delta neutral balancing of risk exposure */ @@ -155,3 +159,176 @@ int64_t AddPricesInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub } return(totalinputs); } + +UniValue PricesInfo(uint256 pricesid) +{ + UniValue result(UniValue::VOBJ); CPubKey pricepk; uint256 hashBlock,oracletxid; CTransaction vintx; int64_t minbet,maxbet,maxodds; uint64_t funding; char numstr[65]; struct CCcontract_info *cp,C; + if ( GetTransaction(pricesid,vintx,hashBlock,false) == 0 ) + { + fprintf(stderr,"cant find fundingtxid\n"); + ERR_RESULT("cant find fundingtxid"); + return(result); + } + if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,oracletxid,minbet,maxbet,maxodds) == 0 ) + { + fprintf(stderr,"fundingtxid isnt price creation txid\n"); + ERR_RESULT("fundingtxid isnt price creation txid"); + return(result); + } + result.push_back(Pair("result","success")); + result.push_back(Pair("pricesid",uint256_str(str,pricesid))); + result.push_back(Pair("oracletxid",uint256_str(str,oracletxid))); + sprintf(numstr,"%.8f",(double)minbet/COIN); + result.push_back(Pair("minbet",numstr)); + sprintf(numstr,"%.8f",(double)maxbet/COIN); + result.push_back(Pair("maxbet",numstr)); + result.push_back(Pair("maxodds",maxodds)); + cp = CCinit(&C,EVAL_PRICES); + pricepk = GetUnspendable(cp,0); + funding = PricePlanFunds(cp,pricepk,pricesid); + sprintf(numstr,"%.8f",(double)funding/COIN); + result.push_back(Pair("funding",numstr)); + return(result); +} + +UniValue PricesList() +{ + UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock,oracletxid; CTransaction vintx; int64_t minbet,maxbet,maxodds; char str[65]; + cp = CCinit(&C,EVAL_PRICES); + SetCCtxids(addressIndex,cp->normaladdr); + for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) + { + txid = it->first.txhash; + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) + { + if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,oracletxid,minbet,maxbet,maxodds) != 0 ) + { + result.push_back(uint256_str(str,txid)); + } + } + } + return(result); +} + +std::string PricesCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t minbet,int64_t maxbet,int64_t maxodds,int64_t timeoutblocks) +{ + CMutableTransaction mtx; uint256 zero; CScript fundingPubKey; CPubKey mypk,pricepk; int64_t a,b,c,d; uint64_t sbits; struct CCcontract_info *cp,C; + if ( funds < 0 || minbet < 0 || maxbet < 0 || maxodds < 1 || maxodds > 9999 || timeoutblocks < 0 || timeoutblocks > 1440 ) + { + CCerror = "invalid parameter error"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( funds < 100*COIN ) + { + CCerror = "price plan needs at least 100 coins"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + memset(&zero,0,sizeof(zero)); + if ( (cp= Pricesinit(fundingPubKey,zero,&C,planstr,txfee,mypk,pricepk,sbits,a,b,c,d)) == 0 ) + { + CCerror = "Priceinit error in create funding"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( AddNormalinputs(mtx,mypk,funds+3*txfee,60) > 0 ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,funds,pricepk)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricepk)) << OP_CHECKSIG)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesFundingOpRet('F',sbits,minbet,maxbet,maxodds,timeoutblocks))); + } + CCerror = "cant find enough inputs"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); +} + +std::string PricesAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount) +{ + CMutableTransaction mtx; CScript fundingPubKey,scriptPubKey; CPubKey mypk,pricepk; struct CCcontract_info *cp,C; int64_t minbet,maxbet,maxodds; + if ( amount < 0 ) + { + CCerror = "amount must be positive"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( (cp= Pricesinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,pricepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) + return(""); + scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG; + if ( scriptPubKey == fundingPubKey ) + { + if ( AddNormalinputs(mtx,mypk,amount+2*txfee,60) > 0 ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,pricepk)); + mtx.vout.push_back(CTxOut(txfee,fundingPubKey)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesOpRet('E',sbits,fundingtxid,hentropy,zeroid))); + } + else + { + CCerror = "cant find enough inputs"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + } + } + else + { + CCerror = "only fund creator can add more funds (entropy)"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + } + return(""); +} + +std::string PricesBet(uint64_t txfee,uint256 pricesid,int64_t bet,int32_t odds) +{ + CMutableTransaction mtx; CScript fundingPubKey; CPubKey mypk,pricepk; int64_t funding,minbet,maxbet,maxodds; struct CCcontract_info *cp,C; + if ( bet < 0 ) + { + CCerror = "bet must be positive"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( odds < 1 || odds > 9999 ) + { + CCerror = "odds must be between 1 and 9999"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( (cp= Pricesinit(fundingPubKey,pricesid,&C,txfee,mypk,pricepk,minbet,maxbet,maxodds)) == 0 ) + return(""); + if ( bet < minbet || bet > maxbet || odds > maxodds ) + { + CCerror = strprintf("Price plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds); + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( (funding= PricesPlanFunds(cp,pricepk,pricesid)) >= 2*bet*odds+txfee ) + { + if ( myIsutxo_spentinmempool(entropytxid,0) != 0 ) + { + CCerror = "entropy txid is spent"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); + } + if ( AddNormalinputs(mtx,mypk,bet+2*txfee+odds,60) > 0 ) + { + mtx.vout.push_back(MakeCC1vout(cp->evalcode,entropyval,pricepk)); + mtx.vout.push_back(MakeCC1vout(cp->evalcode,bet,pricepk)); + mtx.vout.push_back(CTxOut(txfee+odds,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesOpRet('B',pricesid))); + } else fprintf(stderr,"cant find enough normal inputs for %.8f, plan funding %.8f\n",(double)bet/COIN,(double)funding/COIN); + } + if ( entropyval == 0 && funding != 0 ) + CCerror = "cant find price entropy inputs"; + else CCerror = "cant find price input"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); +} + +std::string PricesBetFinish(int32_t *resultp,uint64_t txfee,uint256 pricesid,uint256 bettxid) +{ + *resultp = -1; + CCerror = "couldnt find bettx or entropytx"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + return(""); +} + diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 21d24e112..c2f307c21 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -411,6 +411,12 @@ static const CRPCCommand vRPCCommands[] = /* Gateways */ { "gateways", "gatewaysaddress", &gatewaysaddress, true }, + { "gateways", "gatewayslist", &gatewayslist, true }, + { "gateways", "gatewaysinfo", &gatewaysinfo, true }, + { "gateways", "gatewaysbind", &gatewaysbind, true }, + { "gateways", "gatewaysdeposit", &gatewaysdeposit, true }, + { "gateways", "gatewaysclaim", &gatewaysclaim, true }, + { "gateways", "gatewayswithdraw", &gatewayswithdraw, true }, /* dice */ { "dice", "dicelist", &dicelist, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 1cc68798c..2f9d74aed 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -236,7 +236,13 @@ extern UniValue pegsaddress(const UniValue& params, bool fHelp); extern UniValue triggersaddress(const UniValue& params, bool fHelp); extern UniValue paymentsaddress(const UniValue& params, bool fHelp); extern UniValue gatewaysaddress(const UniValue& params, bool fHelp); -extern UniValue channelsinfo(const UniValue& params, bool fHelp); +extern UniValue gatewayslist(const UniValue& params, bool fHelp); +extern UniValue gatewaysinfo(const UniValue& params, bool fHelp); +extern UniValue gatewaysbind(const UniValue& params, bool fHelp); +extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp); +extern UniValue gatewaysclaim(const UniValue& params, bool fHelp); +extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); +extern UniValue channelsbind(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); extern UniValue channelspayment(const UniValue& params, bool fHelp); extern UniValue channelscollect(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 980dede3a..61b376c15 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4875,6 +4875,11 @@ UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vectorunspendableCCaddr)); sprintf(str,"%smarker",name); result.push_back(Pair(str,cp->normaladdr)); + if ( _GetCCaddress(destaddr,EVAL_ASSETS,pubkey2pk(pubkey)) > 0 ) + { + sprintf(str,"%sCCassets",name); + result.push_back(Pair(str,destaddr)); + } if ( pubkey.size() == 33 ) { if ( GetCCaddress(cp,destaddr,pubkey2pk(pubkey)) != 0 ) @@ -5386,6 +5391,93 @@ UniValue rewardsinfo(const UniValue& params, bool fHelp) return(RewardsInfo(fundingtxid)); } +UniValue gatewayslist(const UniValue& params, bool fHelp) +{ + if ( fHelp || params.size() > 0 ) + throw runtime_error("gatewayslist\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"); + return(GatewaysList()); +} + +UniValue gatewaysinfo(const UniValue& params, bool fHelp) +{ + uint256 txid; + if ( fHelp || params.size() != 1 ) + throw runtime_error("gatewaysinfo bindtxid\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"); + txid = Parseuint256((char *)params[0].get_str().c_str()); + return(GatewaysInfo(txid)); +} + +UniValue gatewaysbind(const UniValue& params, bool fHelp) +{ + uint256 tokenid; int32_t i; int64_t totalsupply; std::vector pubkeys; uint8_t M,N; std::string hex,coin; std::vector pubkey; + if ( fHelp || params.size() < 5 ) + throw runtime_error("gatewaysbind tokenid coin tokensupply M N pubkey(s)\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"); + tokenid = Parseuint256((char *)params[0].get_str().c_str()); + coin = params[1].get_str(); + tokensupply = atol((char *)params[2].get_str().c_str()); + M = atoi((char *)params[3].get_str().c_str()); + N = atoi((char *)params[4].get_str().c_str()); + if ( M > N || N == 0 || N > 15 || tokensupply < COIN/100 || tokenid == zeroid ) + throw runtime_error("illegal M or N > 15 or tokensupply or invalid tokenid\n"); + pubkeys.resize(N); + for (i=0; i 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt gatewaysbind"); + return(result); +} + +UniValue gatewaysdeposit(const UniValue& params, bool fHelp) +{ + std::string hex; + //std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector claimpubkey,int64_t amount) + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt gatewaysdeposit"); + return(result); +} + +UniValue gatewaysclaim(const UniValue& params, bool fHelp) +{ + std::string hex; + // std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount) + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt gatewaysclaim"); + return(result); +} + +UniValue gatewayswithdraw(const UniValue& params, bool fHelp) +{ + std::string hex; + // std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt gatewayswithdraw"); + return(result); +} + UniValue oracleslist(const UniValue& params, bool fHelp) { if ( fHelp || params.size() > 0 ) From 185434218e3f17b89a16a9d1957e697ba86123af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:09:18 -1100 Subject: [PATCH 013/306] Fix --- src/cc/CCinclude.h | 1 + src/cc/CCtx.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 585786369..552c25e3e 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -114,6 +114,7 @@ uint256 OracleMerkle(int32_t height,uint256 reforacletxid,char *format,std::vect uint256 OraclesBatontxid(uint256 oracletxid,CPubKey pk); int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs); bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); +bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index f1d6536cc..7c18b9dbe 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -236,7 +236,7 @@ int64_t CCfullsupply(uint256 tokenid) return(0); } -int64_t CCtoken_balance(char *destaddr,uint256 tokenid) +int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) { int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,hashBlock; std::vector origpubkey; std::vector > unspentOutputs; SetCCunspents(unspentOutputs,coinaddr); From c68ab526f68f8108b1248cae2acf0435c7648dcd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:10:29 -1100 Subject: [PATCH 014/306] Fix --- src/cc/CCinclude.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 552c25e3e..cdbe573b4 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -115,6 +115,7 @@ uint256 OraclesBatontxid(uint256 oracletxid,CPubKey pk); int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs); bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); From d5db84c16cffc1ec476310af724c9312a1c20c54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:13:06 -1100 Subject: [PATCH 015/306] Fix --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index df2e58e5a..a5337e636 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -483,7 +483,7 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk,markerpubkey; int32_t numvouts,ht,maxheight=0; int64_t datafee; uint8_t buf33[33]; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk,markerpubkey; int32_t numvouts,maxheight=0; int64_t datafee,ht; uint8_t buf33[33]; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; rettxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); buf33[0] = 0x02; From 0eb136737bd90743a3cbba59606cbdd24e9ffe0d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:14:48 -1100 Subject: [PATCH 016/306] Skip prices --- src/cc/prices.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 995cd148a..1465c6ee6 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -160,6 +160,7 @@ int64_t AddPricesInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub return(totalinputs); } +#ifdef later UniValue PricesInfo(uint256 pricesid) { UniValue result(UniValue::VOBJ); CPubKey pricepk; uint256 hashBlock,oracletxid; CTransaction vintx; int64_t minbet,maxbet,maxodds; uint64_t funding; char numstr[65]; struct CCcontract_info *cp,C; @@ -331,4 +332,5 @@ std::string PricesBetFinish(int32_t *resultp,uint64_t txfee,uint256 pricesid,uin fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } +#endif From ea21fde92594764e5624998957c52486a9fc20c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:20:48 -1100 Subject: [PATCH 017/306] Fix --- src/cc/gateways.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 80f076636..0165c2f3e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -83,7 +83,7 @@ uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,st { if ( N > 1 ) Getscriptaddress(depositaddr,GetScriptForMultisig(M,pubkeys)); - else Getscriptaddress(depositaddr,CScript() << Mypubkey(pubkeys[0]) << OP_CHECKSIG); + else Getscriptaddress(depositaddr,CScript() << pubkeys[0] << OP_CHECKSIG); } else { @@ -214,7 +214,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP UniValue GatewaysInfo(uint256 bindtxid) { - UniValue result(UniValue::VOBJ); std::string coin; char str[65],numstr[65],depositaddr[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; + UniValue result(UniValue::VOBJ); std::string coin; char str[65],numstr[65],depositaddr[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; result.push_back(Pair("result","success")); result.push_back(Pair("name","Gateways")); cp = CCinit(&C,EVAL_GATEWAYS); @@ -250,7 +250,7 @@ UniValue GatewaysInfo(uint256 bindtxid) UniValue GatewaysList() { - UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock,oracletxid,tokenid; CTransaction vintx; std::string coin,depositaddr; char str[65],depositaddr[64]; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; + UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock,oracletxid,tokenid; CTransaction vintx; std::string coin; int64_t totalsupply; char str[65],depositaddr[64]; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; cp = CCinit(&C,EVAL_GATEWAYS); SetCCtxids(addressIndex,cp->unspendableCCaddr); for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) @@ -269,7 +269,7 @@ UniValue GatewaysList() std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys) { - CMutableTransaction mtx; CTransaction oracletx; uint8_t taddr,prefix,prefix2; CPubKey mypk,gatewayspk; CScript opret; uint256 hashBlock; struct CCcontract_info *cp,C; std::string name,description,format; int32_t i,numvouts; int64_t fullsupply; char coinaddr[64],str[65],*fstr; + CMutableTransaction mtx; CTransaction oracletx; uint8_t taddr,prefix,prefix2; CPubKey mypk,gatewayspk; CScript opret; uint256 hashBlock; struct CCcontract_info *cp,C; std::string name,description,format; int32_t i,numvouts; int64_t fullsupply; char destaddr[64],coinaddr[64],str[65],*fstr; cp = CCinit(&C,EVAL_GATEWAYS); if ( N == 0 || N > 15 || M > N ) { @@ -291,8 +291,8 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t } for (i=0; i Date: Sun, 9 Sep 2018 21:23:14 -1100 Subject: [PATCH 018/306] Fix --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 0165c2f3e..074f329d4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -83,7 +83,7 @@ uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,st { if ( N > 1 ) Getscriptaddress(depositaddr,GetScriptForMultisig(M,pubkeys)); - else Getscriptaddress(depositaddr,CScript() << pubkeys[0] << OP_CHECKSIG); + else Getscriptaddress(depositaddr,CScript() << ParseHex(HexStr(pubkeys[0])) << OP_CHECKSIG); } else { @@ -291,7 +291,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t } for (i=0; i Date: Sun, 9 Sep 2018 21:25:37 -1100 Subject: [PATCH 019/306] Fix --- src/cc/gateways.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 074f329d4..ad3a3ca7c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -304,17 +304,17 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t gatewayspk = GetUnspendable(cp,0); if ( _GetCCaddress(destaddr,EVAL_ASSETS,gatewayspk) == 0 ) { - fprintf(stderr,"Gateway bind.%s (%s) cant create globaladdr\n",coin,tokenid); + fprintf(stderr,"Gateway bind.%s (%s) cant create globaladdr\n",coin,uint256_str(str,tokenid)); return(""); } if ( (fullsupply= CCfullsupply(tokenid)) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin,tokenid,(double)totalsupply/COIN,(double)fullsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin,uint256_str(str,tokenid),(double)totalsupply/COIN,(double)fullsupply/COIN); return(""); } if ( CCtoken_balance(destaddr,tokenid) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin,tokenid,(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin,uint256_str(str,tokenid),(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); return(""); } if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= orcaletx.vout.size()) <= 0 ) @@ -324,7 +324,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t } if ( DecodeOraclesCreateOpRet(oracletx.vout[numvouts-1].scriptPubKey,name,description,format) != 'C' ) { - fprintf(stderr,"mismatched oracle name %s != %s\n",name,coin); + fprintf(stderr,"mismatched oracle name %s != %s\n",name.c_str(),coin.c_str()); return(""); } if ( (fstr= (char *)format.c_str()) == 0 || strncmp(fstr,"Ihh",3) != 0 ) @@ -334,7 +334,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t } if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! { - fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin,tokenid); + fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin.c_str(),uint256_str(str,tokenid)); return(""); } if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) From f9e754a85daa4fe4376f35ed211ac9a8400e187e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:27:21 -1100 Subject: [PATCH 020/306] Test --- src/cc/gateways.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index ad3a3ca7c..e1fe77f6f 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -304,20 +304,20 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t gatewayspk = GetUnspendable(cp,0); if ( _GetCCaddress(destaddr,EVAL_ASSETS,gatewayspk) == 0 ) { - fprintf(stderr,"Gateway bind.%s (%s) cant create globaladdr\n",coin,uint256_str(str,tokenid)); + fprintf(stderr,"Gateway bind.%s (%s) cant create globaladdr\n",coin.c_str(),uint256_str(str,tokenid)); return(""); } if ( (fullsupply= CCfullsupply(tokenid)) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin,uint256_str(str,tokenid),(double)totalsupply/COIN,(double)fullsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin.c_str(),uint256_str(str,tokenid),(double)totalsupply/COIN,(double)fullsupply/COIN); return(""); } if ( CCtoken_balance(destaddr,tokenid) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin,uint256_str(str,tokenid),(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); return(""); } - if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= orcaletx.vout.size()) <= 0 ) + if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= oracletx.vout.size()) <= 0 ) { fprintf(stderr,"cant find oracletxid %s\n",uint256_str(str,oracletxid)); return(""); From 382b39e2ac56643efdec18ae8535a9b0667b0fac Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:31:54 -1100 Subject: [PATCH 021/306] int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen) --- src/cc/CCinclude.h | 2 ++ src/cc/gateways.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index cdbe573b4..c1deb6248 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -116,6 +116,8 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); +uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint256 &batontxid,CPubKey &pk,std::vector &data); +int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index e1fe77f6f..be2b4f45f 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -309,12 +309,12 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t } if ( (fullsupply= CCfullsupply(tokenid)) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin.c_str(),uint256_str(str,tokenid),(double)totalsupply/COIN,(double)fullsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)totalsupply/COIN,(double)fullsupply/COIN); return(""); } if ( CCtoken_balance(destaddr,tokenid) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); return(""); } if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= oracletx.vout.size()) <= 0 ) @@ -332,11 +332,12 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t fprintf(stderr,"illegal format (%s) != (%s)\n",fstr,(char *)"Ihh"); return(""); } - if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! + fprintf(stderr,"implement GatewaysBindExists\n"); + /*if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! { fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin.c_str(),uint256_str(str,tokenid)); return(""); - } + }*/ if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,gatewayspk)); @@ -348,7 +349,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid) { - CTransaction tx; uint256 hash,mhash; int64_t val; int32_t numvouts,merkleht; CPubKey pk; std::vectordata; + CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts,merkleht; CPubKey pk; std::vectordata; txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { From db6b7e17e79ddc62a3dd592bd538b4936177c9b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:36:04 -1100 Subject: [PATCH 022/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index be2b4f45f..60ef5e825 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -349,7 +349,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid) { - CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts,merkleht; CPubKey pk; std::vectordata; + CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { @@ -372,7 +372,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) { - uint256 txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64]; int64_t nValue = 0; + uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64],str[65]; int32_t numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -380,7 +380,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refco } if ( DecodeOraclesCreateOpRet(tx.vout[numvouts-1].scriptPubKey,name,description,format) != 'C' || name != refcoin ) { - fprintf(stderr,"GatewaysVerify mismatched oracle name %s != %s\n",name,refcoin); + fprintf(stderr,"GatewaysVerify mismatched oracle name %s != %s\n",name.c_str(),refcoin.c_str()); return(0); } if ( DecodeHexTx(tx,deposithex) != 0 ) From 857346ef3d88aa6f0c75b083d4a7f82ec1f09777 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:37:32 -1100 Subject: [PATCH 023/306] Test --- src/cc/gateways.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 60ef5e825..7a6b8e410 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -427,7 +427,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid; int64_t totalsupply; int32_t i,m,n; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -440,7 +440,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector } if ( DecodeGatewaysBindOpRet(depositaddr,bindtx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || refcoin != coin ) { - fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } n = (int32_t)pubkeys.size(); @@ -460,7 +460,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector } if ( merkleroot == zeroid || m < n/2 ) { - fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin,uint256_str(str,oracletxid),m,n); + fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); return(""); } if ( GatewaysVerify(depositaddr,oracletxid,coin,cointxid,deposithex,proof,merkleroot,redeemscript) != amount ) @@ -494,7 +494,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui } if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,assetid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || coin != refcoin ) { - fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } if ( GetTransaction(deposittxid,tx,hashBlock,false) == 0 ) @@ -540,7 +540,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin } if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,assetid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || coin != refcoin ) { - fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin); + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) From c66988d0d90cbe5653f2997d66bc8ef64d96b93f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:41:50 -1100 Subject: [PATCH 024/306] Test --- src/cc/CCinclude.h | 1 + src/cc/gateways.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index c1deb6248..2405d2c11 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -118,6 +118,7 @@ bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &or uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint256 &batontxid,CPubKey &pk,std::vector &data); int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen); +CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t price,std::vector origpubkey); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7a6b8e410..cfca40f65 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -427,7 +427,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -447,13 +447,13 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector merkleroot = zeroid; for (i=m=0; i std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector claimpubkey,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,inputs,CCchange=0; int32_t numvouts; uint256 assetid,oracletxid; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,amount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); memcpy(cp->unspendablepriv2,assetscp->CCpriv,32); @@ -502,22 +502,22 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); return(""); } - if ( (total= GatewaysDepositval(tx)) == 0 ) + if ( (amount= GatewaysDepositval(tx)) == 0 ) { fprintf(stderr,"invalid Gateways deposittxid %s\n",uint256_str(str,deposittxid)); return(""); } if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,total,60)) > 0 ) + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { - if ( inputs > total ) - CCchange = (inputs - total); + if ( inputs > amount ) + CCchange = (inputs - amount); mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,total,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); @@ -526,7 +526,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) From 2f51e8fae5ebdd4b0c3b82b27cb0a24a7fa1d4cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:48:22 -1100 Subject: [PATCH 025/306] Test --- src/cc/gateways.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cfca40f65..26711483c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -479,7 +479,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector claimpubkey,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,amount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); memcpy(cp->unspendablepriv2,assetscp->CCpriv,32); @@ -502,9 +502,9 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); return(""); } - if ( (amount= GatewaysDepositval(tx)) == 0 ) + if ( (depositamount= GatewaysDepositval(tx)) != amount ) { - fprintf(stderr,"invalid Gateways deposittxid %s\n",uint256_str(str,deposittxid)); + fprintf(stderr,"invalid Gateways deposittxid %s %.8f != %.8f\n",uint256_str(str,deposittxid),(double)depositamount/COIN,(double)amount/COIN); return(""); } if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) @@ -514,7 +514,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui if ( inputs > amount ) CCchange = (inputs - amount); mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,total,mypk)); + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); @@ -526,7 +526,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) @@ -543,7 +543,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } - if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) + if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) { if ( (inputs= AddAssetInputs(assetscp,mtx,mypk,assetid,amount,60)) > 0 ) { @@ -553,7 +553,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(withdrawpub)) << OP_CHECKSIG)); - return(FinalizeCCTx(mask,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 4df0d20a8e1b14d44c322d9b5fd02fd162165b40 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 21:56:03 -1100 Subject: [PATCH 026/306] -oracle_merklepair --- src/cc/CCinclude.h | 6 ------ src/cc/gateways.cpp | 21 ++++++++++----------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 2405d2c11..79a1e0c75 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -76,12 +76,6 @@ struct CCcontract_info }; struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode); -struct oracle_merklepair -{ - CPubKey pk; - uint256 txid; -}; - struct oracleprice_info { CPubKey pk; diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 26711483c..7cc5ebdaf 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -52,19 +52,19 @@ CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid, return(opret); } -CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,std::vectortxids,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { CScript opret; uint8_t evalcode = EVAL_GATEWAYS; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << height << cointxid << deposithex << proof << redeemscript << amount); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << txids << height << cointxid << deposithex << proof << redeemscript << amount); return(opret); } -uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector &publishers,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) +uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) { std::vector vopret; uint8_t *script,e,f; GetOpReturnData(scriptPubKey, vopret); script = (uint8_t *)vopret.data(); - if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> bindtxid; ss >> publishers; ss >> height; ss >> cointxid; ss >> deposithex; ss >> proof; ss >> redeemscript; ss >> amount) != 0 ) + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> bindtxid; ss >> publishers; ss >> txids; ss >> height; ss >> cointxid; ss >> deposithex; ss >> proof; ss >> redeemscript; ss >> amount) != 0 ) { return(f); } @@ -412,10 +412,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refco int64_t GatewaysDepositval(CTransaction tx) { - int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; + int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; if ( (numvouts= tx.vout.size()) > 0 ) { - if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) + if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) { // coin, bindtxid, publishers fprintf(stderr,"need to validate deposittxid more\n"); @@ -427,7 +427,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys; std::vector publishers; struct oracle_merklepair P; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -453,9 +453,8 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector merkleroot = mhash, m = 1; else if ( mhash == merkleroot ) m++; - P.pk = pubkeys[i]; - P.txid = txid; - publishers.push_back(P); + publishers.push_back(pubkeys[i]); + txids.push_back(txid); } } if ( merkleroot == zeroid || m < n/2 ) @@ -471,7 +470,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,height,cointxid,deposithex,proof,redeemscript,amount))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,redeemscript,amount))); } fprintf(stderr,"cant find enough inputs\n"); return(""); From 65d1156ceb4451ca715b7e43ba655341b30acee8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 22:00:03 -1100 Subject: [PATCH 027/306] ,, --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7cc5ebdaf..d6efa150a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -59,7 +59,7 @@ CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std return(opret); } -uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) +uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) { std::vector vopret; uint8_t *script,e,f; GetOpReturnData(scriptPubKey, vopret); From c7719c4abfa447643fc353cde57edd93d4178f61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 22:03:07 -1100 Subject: [PATCH 028/306] UniValue channelsinfo(const UniValue& params, bool fHelp) --- src/rpcserver.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rpcserver.h b/src/rpcserver.h index 2f9d74aed..0061956ba 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -242,6 +242,7 @@ extern UniValue gatewaysbind(const UniValue& params, bool fHelp); extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp); extern UniValue gatewaysclaim(const UniValue& params, bool fHelp); extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); +extern UniValue channelsinfo(const UniValue& params, bool fHelp); extern UniValue channelsbind(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); extern UniValue channelspayment(const UniValue& params, bool fHelp); From 98a1f520ee249ebb2d473ce91ae1026d8c757882 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 22:08:57 -1100 Subject: [PATCH 029/306] Test --- src/wallet/rpcwallet.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 61b376c15..00a73a2fe 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4857,6 +4857,7 @@ int32_t ensure_CCrequirements() #include "../cc/CClotto.h" #include "../cc/CCchannels.h" #include "../cc/CCOracles.h" +#include "../cc/CCGateways.h" UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vector &pubkey) { @@ -5420,10 +5421,10 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); tokenid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); - tokensupply = atol((char *)params[2].get_str().c_str()); + totalsupply = atol((char *)params[2].get_str().c_str()); M = atoi((char *)params[3].get_str().c_str()); N = atoi((char *)params[4].get_str().c_str()); - if ( M > N || N == 0 || N > 15 || tokensupply < COIN/100 || tokenid == zeroid ) + if ( M > N || N == 0 || N > 15 || totalsupply < COIN/100 || tokenid == zeroid ) throw runtime_error("illegal M or N > 15 or tokensupply or invalid tokenid\n"); pubkeys.resize(N); for (i=0; ipubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector claimpubkey,int64_t amount) if ( hex.size() > 0 ) { @@ -5456,7 +5457,7 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) UniValue gatewaysclaim(const UniValue& params, bool fHelp) { - std::string hex; + UniValue result(UniValue::VOBJ); std::string hex; // std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount) if ( hex.size() > 0 ) { @@ -5468,7 +5469,7 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) UniValue gatewayswithdraw(const UniValue& params, bool fHelp) { - std::string hex; + UniValue result(UniValue::VOBJ); std::string hex; // std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) if ( hex.size() > 0 ) { From a463f03348501a415f594473e832159c743bc1f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 22:09:45 -1100 Subject: [PATCH 030/306] Test --- src/cc/CCGateways.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 6d5df60ca..11be897f6 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -26,7 +26,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint2 std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); // CCcustom -UniValue GatewaysInfo(); -UniValue GatewaysList(uint256 bindtxid); +UniValue GatewaysInfo(uint256 bindtxid); +UniValue GatewaysList(); #endif From dbf8484eeff44fbc5957bf66c10a029377235f10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 9 Sep 2018 22:12:35 -1100 Subject: [PATCH 031/306] Test --- src/wallet/rpcwallet.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 00a73a2fe..01180b69d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5414,16 +5414,17 @@ UniValue gatewaysinfo(const UniValue& params, bool fHelp) UniValue gatewaysbind(const UniValue& params, bool fHelp) { - uint256 tokenid; int32_t i; int64_t totalsupply; std::vector pubkeys; uint8_t M,N; std::string hex,coin; std::vector pubkey; - if ( fHelp || params.size() < 5 ) - throw runtime_error("gatewaysbind tokenid coin tokensupply M N pubkey(s)\n"); + UniValue result(UniValue::VOBJ); uint256 tokenid,oracletxid; int32_t i; int64_t totalsupply; std::vector pubkeys; uint8_t M,N; std::string hex,coin; std::vector pubkey; + if ( fHelp || params.size() < 6 ) + throw runtime_error("gatewaysbind tokenid oracletxid coin tokensupply M N pubkey(s)\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"); tokenid = Parseuint256((char *)params[0].get_str().c_str()); - coin = params[1].get_str(); - totalsupply = atol((char *)params[2].get_str().c_str()); - M = atoi((char *)params[3].get_str().c_str()); - N = atoi((char *)params[4].get_str().c_str()); + oracletxid = Parseuint256((char *)params[1].get_str().c_str()); + coin = params[2].get_str(); + totalsupply = atol((char *)params[3].get_str().c_str()); + M = atoi((char *)params[4].get_str().c_str()); + N = atoi((char *)params[5].get_str().c_str()); if ( M > N || N == 0 || N > 15 || totalsupply < COIN/100 || tokenid == zeroid ) throw runtime_error("illegal M or N > 15 or tokensupply or invalid tokenid\n"); pubkeys.resize(N); @@ -5434,7 +5435,7 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) pubkey = ParseHex(params[5+i].get_str().c_str()); pubkeys.push_back(pubkey2pk(pubkey)); } - hex = GatewaysBind(0,coin,tokenid,totalsupply,M,N,pubkeys); + hex = GatewaysBind(0,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 77fad4320d8f16e3fa5158910a8241dac51efbe1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 02:35:54 -1100 Subject: [PATCH 032/306] Test --- src/cc/gateways.cpp | 19 +++++++++++++++++++ src/wallet/rpcwallet.cpp | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d6efa150a..c91cc4763 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -41,6 +41,25 @@ deposit addr can be 1 to MofN pubkeys 1:1 gateway with native coin + usage: + ./c tokencreate KMD 1000000 KMD_equivalent_token_for_gatewaysCC + a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a + + transfer to gateways pubkey: 03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40 RDMqGyREkP1Gwub1Nr5Ye8a325LGZsWBCb + ./c tokentransfer a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a 03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40 100000000000000 + 2206fc39c0f384ca79819eb491ddbf889642cbfe4d0796bb6a8010ed53064a56 + + ./c oraclescreate KMD blockheaders Ihh + 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 + + ./c oraclesregister 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 1000000 + 83b59eac238cbe54616ee13b2fdde85a48ec869295eb04051671a1727c9eb402 + + ./c oraclessubscribe 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 1000 + f9499d8bb04ffb511fcec4838d72e642ec832558824a2ce5aed87f1f686f8102 + + ./c gatewaysbind a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 KMD 100000000000000 1 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 + */ // start of consensus code diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 01180b69d..bd3e5871f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5430,9 +5430,9 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) pubkeys.resize(N); for (i=0; i Date: Mon, 10 Sep 2018 02:40:35 -1100 Subject: [PATCH 033/306] Test --- src/wallet/rpcwallet.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bd3e5871f..83807da23 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5427,7 +5427,6 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) N = atoi((char *)params[5].get_str().c_str()); if ( M > N || N == 0 || N > 15 || totalsupply < COIN/100 || tokenid == zeroid ) throw runtime_error("illegal M or N > 15 or tokensupply or invalid tokenid\n"); - pubkeys.resize(N); for (i=0; i Date: Mon, 10 Sep 2018 02:53:02 -1100 Subject: [PATCH 034/306] Test --- src/cc/gateways.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index c91cc4763..d575c5559 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -41,6 +41,14 @@ deposit addr can be 1 to MofN pubkeys 1:1 gateway with native coin + In order to create a new gateway it is necessary to follow some strict steps. + 1. create a token with the max possible supply that will be issued + 2. transfer 100% of them to the gateways CC's global pubkey's asset CC address. (yes it is a bit confusing) + 3. create an oracle with the identical name, ie. KMD and format must start with Ihh (height, blockhash, merkleroot) + 4. register a publisher and fund it with a subscribe. there will be a special client app that will automatically publish the merkleroots. + 5. Now a gatewaysbind can bind an external coin to an asset, along with the oracle for the merkleroots + + usage: ./c tokencreate KMD 1000000 KMD_equivalent_token_for_gatewaysCC a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a @@ -59,6 +67,8 @@ f9499d8bb04ffb511fcec4838d72e642ec832558824a2ce5aed87f1f686f8102 ./c gatewaysbind a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 KMD 100000000000000 1 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 + abc09a431d6c720f56fd324f1d2ab23d42dc34fd9e0fa2fad40d6eddb903f9a4 + */ @@ -67,7 +77,7 @@ CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys,uint8_t taddr,uint8_t prefix,uint8_t prefix2) { CScript opret; uint8_t evalcode = EVAL_GATEWAYS; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << prefix << prefix2 << taddr << tokenid << totalsupply << M << N << pubkeys); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << prefix << prefix2 << taddr << tokenid << totalsupply << M << N << pubkeys << oracletxid); return(opret); } @@ -96,7 +106,7 @@ uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,st GetOpReturnData(scriptPubKey, vopret); script = (uint8_t *)vopret.data(); depositaddr[0] = 0; - if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> prefix; ss >> prefix2; ss >> taddr; ss >> tokenid; ss >> totalsupply; ss >> M; ss >> N; ss >> pubkeys) != 0 ) + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> prefix; ss >> prefix2; ss >> taddr; ss >> tokenid; ss >> totalsupply; ss >> M; ss >> N; ss >> pubkeys; ss >> oracletxid) != 0 ) { if ( prefix == 60 ) { @@ -233,11 +243,12 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP UniValue GatewaysInfo(uint256 bindtxid) { - UniValue result(UniValue::VOBJ); std::string coin; char str[65],numstr[65],depositaddr[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::string coin; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; result.push_back(Pair("result","success")); result.push_back(Pair("name","Gateways")); cp = CCinit(&C,EVAL_GATEWAYS); Gatewayspk = GetUnspendable(cp,0); + _GetCCaddress(gatewaysassets,EVAL_ASSETS,gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) { if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 0 ) @@ -247,7 +258,10 @@ UniValue GatewaysInfo(uint256 bindtxid) { result.push_back(Pair("M",M)); result.push_back(Pair("N",N)); - } + for (i=0; i Date: Mon, 10 Sep 2018 02:54:29 -1100 Subject: [PATCH 035/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d575c5559..3733d904f 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -243,12 +243,12 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP UniValue GatewaysInfo(uint256 bindtxid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::string coin; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int64_t totalsupply,remaining; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::string coin; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int32_t i; int64_t totalsupply,remaining; result.push_back(Pair("result","success")); result.push_back(Pair("name","Gateways")); cp = CCinit(&C,EVAL_GATEWAYS); Gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(gatewaysassets,EVAL_ASSETS,gatewayspk); + _GetCCaddress(gatewaysassets,EVAL_ASSETS,Gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) { if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 0 ) From 434e600cd406cfec0676361daae8b76de5e35db6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 02:56:42 -1100 Subject: [PATCH 036/306] (uint8_t *)& --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3733d904f..23d0ed948 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -259,9 +259,9 @@ UniValue GatewaysInfo(uint256 bindtxid) result.push_back(Pair("M",M)); result.push_back(Pair("N",N)); for (i=0; i Date: Mon, 10 Sep 2018 03:00:08 -1100 Subject: [PATCH 037/306] gatewaysCC up to bind debugged --- src/cc/gateways.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 23d0ed948..b582e2578 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -67,9 +67,25 @@ f9499d8bb04ffb511fcec4838d72e642ec832558824a2ce5aed87f1f686f8102 ./c gatewaysbind a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 KMD 100000000000000 1 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 - abc09a431d6c720f56fd324f1d2ab23d42dc34fd9e0fa2fad40d6eddb903f9a4 - + e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e + ./c gatewaysinfo e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e + { + "result": "success", + "name": "Gateways", + "pubkey": "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92", + "coin": "KMD", + "oracletxid": "1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808", + "taddr": 0, + "prefix": 60, + "prefix2": 85, + "deposit": "", + "tokenid": "a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a", + "totalsupply": "1000000.00000000", + "remaining": "1000000.00000000", + "issued": "0.00000000" + } + */ // start of consensus code From 9a63c0cfcdf648305f48a220f4e5a6387970f35e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 03:32:49 -1100 Subject: [PATCH 038/306] Fix nulled depositaddr --- src/cc/gateways.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b582e2578..a2172ddc2 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -46,8 +46,7 @@ 2. transfer 100% of them to the gateways CC's global pubkey's asset CC address. (yes it is a bit confusing) 3. create an oracle with the identical name, ie. KMD and format must start with Ihh (height, blockhash, merkleroot) 4. register a publisher and fund it with a subscribe. there will be a special client app that will automatically publish the merkleroots. - 5. Now a gatewaysbind can bind an external coin to an asset, along with the oracle for the merkleroots - + 5. Now a gatewaysbind can bind an external coin to an asset, along with the oracle for the merkleroots. the txid from the bind is used in most of the other gateways CC calls usage: ./c tokencreate KMD 1000000 KMD_equivalent_token_for_gatewaysCC @@ -132,10 +131,10 @@ uint8_t DecodeGatewaysBindOpRet(char *depositaddr,const CScript &scriptPubKey,st } else { - fprintf(stderr,"need to generate non-KMD addresses\n"); + fprintf(stderr,"need to generate non-KMD addresses prefix.%d\n",prefix); } return(f); - } + } else fprintf(stderr,"error decoding bind opret\n"); return(0); } @@ -267,9 +266,9 @@ UniValue GatewaysInfo(uint256 bindtxid) _GetCCaddress(gatewaysassets,EVAL_ASSETS,Gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) { + depositaddr[0] = 0; if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 0 ) { - depositaddr[0] = 0; if ( N > 1 ) { result.push_back(Pair("M",M)); From d73f18f5e4bcdf9a0f72bfb0f8c41286e4f34d02 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:10:19 -1100 Subject: [PATCH 039/306] gatewaysdeposit rpc --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 34 ++++++++++++++++++++-------------- src/wallet/rpcwallet.cpp | 27 +++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 11be897f6..9414ba0ed 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -21,7 +21,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); -std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector claimpubkey,int64_t amount); +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount); std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index a2172ddc2..6ad1352d2 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -85,6 +85,17 @@ "issued": "0.00000000" } + To make a gateway deposit, send the funds to the "deposit" address, along with any amount to the same pubkey address you want to get the assetized KMD to appear in. + + ./komodo-cli z_sendmany "" '[{"address":"RFpxgqff7FDHFuHa3jSX5NzqqWCcELz8ha","amount":0.0001},{"address":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","amount":7.6999}]' + bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 height.1003776 + + ./komodo-cli gettxoutproof '["bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009"]' + 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b + + ./komodo-cli getrawtransaction bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 + 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b + */ // start of consensus code @@ -418,9 +429,9 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u return(zeroid); } -int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) +int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) { - uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64],str[65]; int32_t numvouts; int64_t nValue = 0; + uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -434,19 +445,14 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,std::string refco if ( DecodeHexTx(tx,deposithex) != 0 ) { scriptPubKey = CScript() << redeemscript; - Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); - if ( strcmp(refdepositaddr,destaddr) == 0 && scriptPubKey == tx.vout[1].scriptPubKey ) + for (i=0; ipubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); @@ -510,7 +516,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); return(""); } - if ( GatewaysVerify(depositaddr,oracletxid,coin,cointxid,deposithex,proof,merkleroot,redeemscript) != amount ) + if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,redeemscript) != amount ) { fprintf(stderr,"deposittxid didnt validate\n"); return(""); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 83807da23..7136b2863 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5445,8 +5445,31 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex; - //std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector claimpubkey,int64_t amount) + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; + if ( fHelp || params.size() != 11 ) + throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\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"); + bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + height = atoi((char *)params[1].get_str().c_str()); + coin = params[2].get_str(); + cointxid = Parseuint256((char *)params[3].get_str().c_str()); + claimvout = atoi((char *)params[4].get_str().c_str()); + deposithex = params[5].get_str(); + proof = ParseHex(params[6].get_str()); + redeemscript = ParseHex(params[7].get_str()); + amount = atof((char *)params[8].get_str().c_str()) * COIN; + numpks = atoi((char *)params[9].get_str().c_str()); + if ( amount <= 0 || numpks <= 0 || claimvout < 0 ) + throw runtime_error("invalid param: amount, numpks or claimvout\n"); + for (i=0; i 0 ) { result.push_back(Pair("result", "success")); From b732e43f6adeb89ab1f16a4d00f69ad1129cba11 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:12:16 -1100 Subject: [PATCH 040/306] Proof --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 6ad1352d2..06dd3d32d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -107,14 +107,14 @@ CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid, return(opret); } -CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,std::vectortxids,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,std::vectortxids,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) { CScript opret; uint8_t evalcode = EVAL_GATEWAYS; opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << txids << height << cointxid << deposithex << proof << redeemscript << amount); return(opret); } -uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) +uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) { std::vector vopret; uint8_t *script,e,f; GetOpReturnData(scriptPubKey, vopret); @@ -466,7 +466,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout int64_t GatewaysDepositval(CTransaction tx) { - int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; + int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; if ( (numvouts= tx.vout.size()) > 0 ) { if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) From db37f5c3b4fadeebdc94507b58a9bfc54c8ac580 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:14:40 -1100 Subject: [PATCH 041/306] uint8_t --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7136b2863..c3e21fe1e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5445,7 +5445,7 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; if ( fHelp || params.size() != 11 ) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); if ( ensure_CCrequirements() < 0 ) From a985f63be8f19c9ce2a18755ab5cc2cdb80c8e10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:15:28 -1100 Subject: [PATCH 042/306] pubkey --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c3e21fe1e..1e79e2862 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5445,7 +5445,7 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; CPubKey pubkey; if ( fHelp || params.size() != 11 ) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); if ( ensure_CCrequirements() < 0 ) From fd83def100dc5eac640a8fa6eac9ecb2fe3be941 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:16:31 -1100 Subject: [PATCH 043/306] , --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1e79e2862..bf8ba4556 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5445,7 +5445,7 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript; CPubKey pubkey; + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript,pubkey; if ( fHelp || params.size() != 11 ) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); if ( ensure_CCrequirements() < 0 ) From 4dbdb873f211ee69b56412f24be5d92294892917 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:28:14 -1100 Subject: [PATCH 044/306] +print --- src/cc/gateways.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 06dd3d32d..b3296c17c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -96,6 +96,8 @@ ./komodo-cli getrawtransaction bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b + gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks +./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 */ // start of consensus code @@ -487,6 +489,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); + fprintf(stderr,"GatewaysDeposit ht.%d %s %.8f numpks.%d\n",height,refcoin.c_str(),(double)amount/COIN,(int32_t)pubkeys.size()); if ( GetTransaction(bindtxid,bindtx,hashBlock,false) == 0 || (numvouts= bindtx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); From a7fe9c6b4408eaf6c37b48c128670bac92d4bb0c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:53:39 -1100 Subject: [PATCH 045/306] Test --- src/cc/gateways.cpp | 2 +- src/rpcclient.cpp | 11 +++++++++++ src/wallet/rpcwallet.cpp | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b3296c17c..c05866d44 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -97,7 +97,7 @@ 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks -./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 */ // start of consensus code diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 9d1d0b336..2509494be 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -141,6 +141,17 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_importviewingkey", 2 }, { "z_getpaymentdisclosure", 1}, { "z_getpaymentdisclosure", 2}, + { "gatewaysdeposit", 0}, + { "gatewaysdeposit", 1}, + { "gatewaysdeposit", 2}, + { "gatewaysdeposit", 3}, + { "gatewaysdeposit", 4}, + { "gatewaysdeposit", 5}, + { "gatewaysdeposit", 6}, + { "gatewaysdeposit", 7}, + { "gatewaysdeposit", 8}, + { "gatewaysdeposit", 9}, + { "gatewaysdeposit", 10}, // crosschain { "assetchainproof", 1}, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bf8ba4556..5f4e81407 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5446,6 +5446,7 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript,pubkey; + fprintf(stderr,"params size.%d\n",(int32_t)params.size()); if ( fHelp || params.size() != 11 ) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); if ( ensure_CCrequirements() < 0 ) From eb7ef8473b87435a8fbea1194d20d0afb1c58925 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 05:57:15 -1100 Subject: [PATCH 046/306] strvals --- src/rpcclient.cpp | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 2509494be..16011c519 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -141,18 +141,6 @@ static const CRPCConvertParam vRPCConvertParams[] = { "z_importviewingkey", 2 }, { "z_getpaymentdisclosure", 1}, { "z_getpaymentdisclosure", 2}, - { "gatewaysdeposit", 0}, - { "gatewaysdeposit", 1}, - { "gatewaysdeposit", 2}, - { "gatewaysdeposit", 3}, - { "gatewaysdeposit", 4}, - { "gatewaysdeposit", 5}, - { "gatewaysdeposit", 6}, - { "gatewaysdeposit", 7}, - { "gatewaysdeposit", 8}, - { "gatewaysdeposit", 9}, - { "gatewaysdeposit", 10}, - // crosschain { "assetchainproof", 1}, { "crosschainproof", 1}, @@ -206,7 +194,7 @@ UniValue RPCConvertValues(const std::string &strMethod, const std::vector Date: Mon, 10 Sep 2018 06:03:37 -1100 Subject: [PATCH 047/306] Test --- src/bitcoin-cli.cpp | 1 + src/cc/gateways.cpp | 2 +- src/rpcclient.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index bf189e483..e5351f890 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -290,6 +290,7 @@ int CommandLineRPC(int argc, char *argv[]) string strMethod = argv[1]; // Parameters default to strings + fprintf(stderr,"argc.%d\n",argc); std::vector strParams(&argv[2], &argv[argc]); UniValue params = RPCConvertValues(strMethod, strParams); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index c05866d44..b32a98fbb 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -97,7 +97,7 @@ 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks -./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac '7.6999' 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 */ // start of consensus code diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 16011c519..0040b87f2 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -191,6 +191,7 @@ UniValue ParseNonRFCJSONValue(const std::string& strVal) UniValue RPCConvertValues(const std::string &strMethod, const std::vector &strParams) { UniValue params(UniValue::VARR); + fprintf(stderr,"size.%d %s\n",(int32_t)strParams.size(),strParams.c_str()); for (unsigned int idx = 0; idx < strParams.size(); idx++) { const std::string& strVal = strParams[idx]; From 0e86c9a1b64bb31f2b12b1d48493e6ebd2342f40 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:04:54 -1100 Subject: [PATCH 048/306] Test --- src/rpcclient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 0040b87f2..9f6ce59bc 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -191,7 +191,7 @@ UniValue ParseNonRFCJSONValue(const std::string& strVal) UniValue RPCConvertValues(const std::string &strMethod, const std::vector &strParams) { UniValue params(UniValue::VARR); - fprintf(stderr,"size.%d %s\n",(int32_t)strParams.size(),strParams.c_str()); + fprintf(stderr,"size.%d\n",(int32_t)strParams.size()); for (unsigned int idx = 0; idx < strParams.size(); idx++) { const std::string& strVal = strParams[idx]; From 73eda2cdbd83fb3c1aa5b975bb8f2146a3b08eae Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:39:49 -1100 Subject: [PATCH 049/306] -prints --- src/bitcoin-cli.cpp | 1 - src/cc/gateways.cpp | 4 ++-- src/rpcclient.cpp | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index e5351f890..bf189e483 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -290,7 +290,6 @@ int CommandLineRPC(int argc, char *argv[]) string strMethod = argv[1]; // Parameters default to strings - fprintf(stderr,"argc.%d\n",argc); std::vector strParams(&argv[2], &argv[argc]); UniValue params = RPCConvertValues(strMethod, strParams); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b32a98fbb..648e307bb 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -97,7 +97,7 @@ 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks -./c gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac '7.6999' 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 */ // start of consensus code @@ -514,7 +514,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector txids.push_back(txid); } } - if ( merkleroot == zeroid || m < n/2 ) + if ( 0 && (merkleroot == zeroid || m < n/2) ) { fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); return(""); diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 9f6ce59bc..a8b96d758 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -191,11 +191,9 @@ UniValue ParseNonRFCJSONValue(const std::string& strVal) UniValue RPCConvertValues(const std::string &strMethod, const std::vector &strParams) { UniValue params(UniValue::VARR); - fprintf(stderr,"size.%d\n",(int32_t)strParams.size()); for (unsigned int idx = 0; idx < strParams.size(); idx++) { const std::string& strVal = strParams[idx]; - fprintf(stderr,"%s\n",strVal.c_str()); if (!rpcCvtTable.convert(strMethod, idx)) { // insert string value directly params.push_back(strVal); From a609fa64ea2ce3f53bf3c675a48c542ba38511d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:46:00 -1100 Subject: [PATCH 050/306] Test --- src/cc/gateways.cpp | 15 +++++++++------ src/wallet/rpcwallet.cpp | 1 - 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 648e307bb..3842b15d7 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -97,7 +97,7 @@ 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks -./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b deadbeef 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b proofhere 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 */ // start of consensus code @@ -450,12 +450,15 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout for (i=0; ipubkeys; std::vectorproof,redeemscript,pubkey; - fprintf(stderr,"params size.%d\n",(int32_t)params.size()); if ( fHelp || params.size() != 11 ) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); if ( ensure_CCrequirements() < 0 ) From bfd5344dc8dacecb641838ab6aef0f2f19eea22e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:46:54 -1100 Subject: [PATCH 051/306] C --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3842b15d7..e1dc81186 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -457,7 +457,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout txid = tx.GetHash(); nValue = tx.vout[i].nValue; break; - } else fprintf(stderr,"claimvout.%d scriptPubKey mismatch\n",claimout); + } else fprintf(stderr,"claimvout.%d scriptPubKey mismatch\n",claimvout); } else fprintf(stderr,"i.%d %s vs %s\n",i,destaddr,refdepositaddr); } } From 3242301d146eafd59d681c77a357a8ecc0c9a684 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:55:02 -1100 Subject: [PATCH 052/306] Test --- src/cc/gateways.cpp | 12 +++++++++++- src/rpcserver.cpp | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index e1dc81186..a8db5f78d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -457,7 +457,17 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout txid = tx.GetHash(); nValue = tx.vout[i].nValue; break; - } else fprintf(stderr,"claimvout.%d scriptPubKey mismatch\n",claimvout); + } + else + { + int j; + for (j=0; j<25; j++) + fprintf(stderr,"%02x",((uint8_t *)&scriptPubKey)[j]); + fprintf(stderr," scriptPubKey\n"); + for (j=0; j<25; j++) + fprintf(stderr,"%02x",((uint8_t *)&tx.vout[claimvout].scriptPubKey)[j]); + fprintf(stderr," claimvout.%d scriptPubKey mismatch\n",claimvout); + } } else fprintf(stderr,"i.%d %s vs %s\n",i,destaddr,refdepositaddr); } } diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index c2f307c21..701696f75 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -356,9 +356,9 @@ static const CRPCCommand vRPCCommands[] = /* fsm */ { "FSM", "FSMaddress", &FSMaddress, true }, - { "FSMcreate", "FSMcreate", &FSMcreate, true }, - { "FSMlist", "FSMlist", &FSMlist, true }, - { "FSMinfo", "FSMinfo", &FSMinfo, true }, + { "FSM", "FSMcreate", &FSMcreate, true }, + { "FSM", "FSMlist", &FSMlist, true }, + { "FSM", "FSMinfo", &FSMinfo, true }, /* rewards */ { "rewards", "rewardslist", &rewardslist, true }, From 1a7ddacbaca6e5ff97c9dd28018786545ee372aa Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:58:13 -1100 Subject: [PATCH 053/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index a8db5f78d..27f858055 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -462,10 +462,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout { int j; for (j=0; j<25; j++) - fprintf(stderr,"%02x",((uint8_t *)&scriptPubKey)[j]); + fprintf(stderr,"%02x",((uint8_t *)&scriptPubKey.data())[j]); fprintf(stderr," scriptPubKey\n"); for (j=0; j<25; j++) - fprintf(stderr,"%02x",((uint8_t *)&tx.vout[claimvout].scriptPubKey)[j]); + fprintf(stderr,"%02x",((uint8_t *)&tx.vout[claimvout].scriptPubKey.data())[j]); fprintf(stderr," claimvout.%d scriptPubKey mismatch\n",claimvout); } } else fprintf(stderr,"i.%d %s vs %s\n",i,destaddr,refdepositaddr); From 7619e41a6cd756a8cf451c3d9d61dcd907c8777d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 06:59:03 -1100 Subject: [PATCH 054/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 27f858055..7918ccee1 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -462,10 +462,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout { int j; for (j=0; j<25; j++) - fprintf(stderr,"%02x",((uint8_t *)&scriptPubKey.data())[j]); + fprintf(stderr,"%02x",((uint8_t *)scriptPubKey.data())[j]); fprintf(stderr," scriptPubKey\n"); for (j=0; j<25; j++) - fprintf(stderr,"%02x",((uint8_t *)&tx.vout[claimvout].scriptPubKey.data())[j]); + fprintf(stderr,"%02x",((uint8_t *)tx.vout[claimvout].scriptPubKey.data())[j]); fprintf(stderr," claimvout.%d scriptPubKey mismatch\n",claimvout); } } else fprintf(stderr,"i.%d %s vs %s\n",i,destaddr,refdepositaddr); From 898dcc880cdb457b603bde8a90adea09963d8ae1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:02:14 -1100 Subject: [PATCH 055/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7918ccee1..faaa4bf9d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -446,7 +446,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout } if ( DecodeHexTx(tx,deposithex) != 0 ) { - scriptPubKey = CScript() << redeemscript; + scriptPubKey = redeemscript; for (i=0; i Date: Mon, 10 Sep 2018 07:04:52 -1100 Subject: [PATCH 056/306] Test --- src/cc/gateways.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index faaa4bf9d..d6a559cb4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -433,7 +433,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) { - uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; CScript scriptPubKey; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; + uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -452,7 +452,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); if ( strcmp(refdepositaddr,destaddr) == 0 ) { - if ( scriptPubKey == tx.vout[claimvout].scriptPubKey ) + if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript,&tx.vout[claimvout].scriptPubKey,redeemscript.size()) == 0 ) { txid = tx.GetHash(); nValue = tx.vout[i].nValue; @@ -461,10 +461,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout else { int j; - for (j=0; j<26; j++) - fprintf(stderr,"%02x",((uint8_t *)scriptPubKey.data())[j]); - fprintf(stderr," scriptPubKey\n"); - for (j=0; j<26; j++) + for (j=0; j<25; j++) + fprintf(stderr,"%02x",((uint8_t *)redeemscript.data())[j]); + fprintf(stderr," redeemscript\n"); + for (j=0; j<25; j++) fprintf(stderr,"%02x",((uint8_t *)tx.vout[claimvout].scriptPubKey.data())[j]); fprintf(stderr," claimvout.%d scriptPubKey mismatch\n",claimvout); } From 8aadfce6a5b7e59b4d8068ef3fb107462fe47f22 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:05:26 -1100 Subject: [PATCH 057/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d6a559cb4..490a9fb9d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -446,7 +446,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout } if ( DecodeHexTx(tx,deposithex) != 0 ) { - scriptPubKey = redeemscript; + //scriptPubKey = redeemscript; for (i=0; i Date: Mon, 10 Sep 2018 07:06:39 -1100 Subject: [PATCH 058/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 490a9fb9d..0d9704a13 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -475,7 +475,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout { fprintf(stderr,"verify proof for cointxid in merkleroot\n"); return(nValue); - } else fprintf(stderr,"(%s) != (%s) or txid mismatch.%d or script mismatch.%d\n",refdepositaddr,destaddr,txid != cointxid,scriptPubKey != tx.vout[1].scriptPubKey); + } else fprintf(stderr,"(%s) != (%s) or txid mismatch.%d or script mismatch\n",refdepositaddr,destaddr,txid != cointxid); return(0); } From 2aba50957a20d2de004bd5e457594cb86a8ed6e1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:08:45 -1100 Subject: [PATCH 059/306] Test --- src/cc/gateways.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 0d9704a13..b3c0f42b1 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -433,7 +433,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) { - uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; + uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,offset,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -452,7 +452,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); if ( strcmp(refdepositaddr,destaddr) == 0 ) { - if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript,&tx.vout[claimvout].scriptPubKey,redeemscript.size()) == 0 ) + if ( redeemscript.size() < 0x100 ) + offset = 1; + else offset = 2; + if ( redeemscript.size()-offset == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript+offset,&tx.vout[claimvout].scriptPubKey,redeemscript.size()) == 0 ) { txid = tx.GetHash(); nValue = tx.vout[i].nValue; From 03c7ae9ed98f9f66e038df2b2757e9fe5398cc97 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:12:36 -1100 Subject: [PATCH 060/306] Test --- src/cc/gateways.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b3c0f42b1..dc9234e40 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -433,7 +433,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) { - uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,offset,numvouts; int64_t nValue = 0; + uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -446,16 +446,12 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout } if ( DecodeHexTx(tx,deposithex) != 0 ) { - //scriptPubKey = redeemscript; for (i=0; i Date: Mon, 10 Sep 2018 07:14:35 -1100 Subject: [PATCH 061/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index dc9234e40..3699c2881 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -451,7 +451,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); if ( strcmp(refdepositaddr,destaddr) == 0 ) { - if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript,&tx.vout[claimvout].scriptPubKey,redeemscript.size()) == 0 ) + if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript.data(),tx.vout[claimvout].scriptPubKey.data(),redeemscript.size()) == 0 ) { txid = tx.GetHash(); nValue = tx.vout[i].nValue; @@ -462,10 +462,10 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout int j; for (j=0; j Date: Mon, 10 Sep 2018 07:15:14 -1100 Subject: [PATCH 062/306] & --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3699c2881..b77518172 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -451,7 +451,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); if ( strcmp(refdepositaddr,destaddr) == 0 ) { - if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(&redeemscript.data(),tx.vout[claimvout].scriptPubKey.data(),redeemscript.size()) == 0 ) + if ( redeemscript.size() == tx.vout[claimvout].scriptPubKey.size() && memcmp(redeemscript.data(),tx.vout[claimvout].scriptPubKey.data(),redeemscript.size()) == 0 ) { txid = tx.GetHash(); nValue = tx.vout[i].nValue; From f81291ae82be4dfa844dda630f856553a40bb928 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:28:33 -1100 Subject: [PATCH 063/306] Gateways claim --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 5 ++++- src/wallet/rpcwallet.cpp | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 9414ba0ed..799259f5c 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -22,7 +22,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount); -std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount); +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector redeemscript,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); // CCcustom diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b77518172..e3b53d40c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -98,6 +98,9 @@ gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b proofhere 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 + -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 + + */ // start of consensus code @@ -545,7 +548,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector return(""); } -std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector claimpubkey,int64_t amount) +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector redeemscript,int64_t amount) { CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index bf8ba4556..148501ac2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5480,8 +5480,18 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) UniValue gatewaysclaim(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex; - // std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string coin,uint256 deposittxid,std::string claimaddr,int64_t amount) + UniValue result(UniValue::VOBJ); std::string hex,coin; uint256 bindtxid,deposittxid; std::vectorredeemscript; int64_t amount; + if ( fHelp || params.size() != 11 ) + throw runtime_error("gatewaysclaim bindtxid coin deposittxid redeemscript amount\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"); + bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + coin = params[1].get_str(); + deposittxid = Parseuint256((char *)params[3].get_str().c_str()); + proof = ParseHex(params[4].get_str()); + redeemscript = ParseHex(params[5].get_str()); + amount = atof((char *)params[6].get_str().c_str()) * COIN; + hex = GatewaysClaim(0,bindtxid,coin,deposittxid,redeemscript,amount); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 72e3df0101beadccc3c0de3fcbd30e26636f820e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:29:35 -1100 Subject: [PATCH 064/306] Test --- src/wallet/rpcwallet.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 148501ac2..8dc884a57 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5481,16 +5481,15 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) UniValue gatewaysclaim(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); std::string hex,coin; uint256 bindtxid,deposittxid; std::vectorredeemscript; int64_t amount; - if ( fHelp || params.size() != 11 ) + if ( fHelp || params.size() != 5 ) throw runtime_error("gatewaysclaim bindtxid coin deposittxid redeemscript amount\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"); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); - deposittxid = Parseuint256((char *)params[3].get_str().c_str()); - proof = ParseHex(params[4].get_str()); - redeemscript = ParseHex(params[5].get_str()); - amount = atof((char *)params[6].get_str().c_str()) * COIN; + deposittxid = Parseuint256((char *)params[2].get_str().c_str()); + redeemscript = ParseHex(params[3].get_str()); + amount = atof((char *)params[4].get_str().c_str()) * COIN; hex = GatewaysClaim(0,bindtxid,coin,deposittxid,redeemscript,amount); if ( hex.size() > 0 ) { From e7c38612fdd9c5170c73c7600b2272647cdf82f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:35:27 -1100 Subject: [PATCH 065/306] Test --- src/cc/gateways.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index e3b53d40c..39f9626ff 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -100,7 +100,8 @@ ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b proofhere 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 - + gatewaysclaim bindtxid coin deposittxid redeemscript amount +./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 */ // start of consensus code @@ -554,6 +555,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); memcpy(cp->unspendablepriv2,assetscp->CCpriv,32); + memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); From e1529dc193a9f08b9145aeaa8d38e68dd2111f12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:39:20 -1100 Subject: [PATCH 066/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 39f9626ff..2a3e5c750 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -505,7 +505,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - fprintf(stderr,"GatewaysDeposit ht.%d %s %.8f numpks.%d\n",height,refcoin.c_str(),(double)amount/COIN,(int32_t)pubkeys.size()); + //fprintf(stderr,"GatewaysDeposit ht.%d %s %.8f numpks.%d\n",height,refcoin.c_str(),(double)amount/COIN,(int32_t)pubkeys.size()); if ( GetTransaction(bindtxid,bindtx,hashBlock,false) == 0 || (numvouts= bindtx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -554,12 +554,12 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); - memcpy(cp->unspendablepriv2,assetscp->CCpriv,32); memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); + _GetCCaddress(assetscp->unspendableaddr2,EVAL_ASSETS,gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); From 51266dd64c69369306aa84c35c136826e270c859 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:40:51 -1100 Subject: [PATCH 067/306] Fix --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 2a3e5c750..b8cf5f4c5 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -590,7 +590,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 9c95ed3339b9cb8bed636e460fcdedf104896da2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 07:45:59 -1100 Subject: [PATCH 068/306] Test --- src/cc/CCinclude.h | 2 +- src/cc/CCtx.cpp | 2 +- src/cc/gateways.cpp | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 79a1e0c75..ba57f2748 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -72,7 +72,7 @@ struct CCcontract_info CPubKey unspendablepk2; bool (*validate)(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); bool (*ismyvin)(CScript const& scriptSig); - uint8_t evalcode,didinit; + uint8_t evalcode,evalcode2,didinit; }; struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 7c18b9dbe..c9196e951 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -124,7 +124,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran //fprintf(stderr,"matched %s unspendable2!\n",cp->unspendableaddr2); privkey = cp->unspendablepriv2; if ( othercond2 == 0 ) - othercond2 = MakeCCcond1(cp->evalcode,cp->unspendablepk2); + othercond2 = MakeCCcond1(cp->evalcode2,cp->unspendablepk2); cond = othercond2; } else diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b8cf5f4c5..66c71fb4e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -554,12 +554,13 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); - memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(assetscp->unspendableaddr2,EVAL_ASSETS,gatewayspk); + _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); + memcpy(cp->unspendablepriv2,cp->CCpriv,32); + cp->evalcode2 = EVAL_ASSETS; if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -582,7 +583,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui } if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -590,7 +591,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 2b404a3d4aae115c9bac1afc9a4e22bcb11143b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:02:01 -1100 Subject: [PATCH 069/306] Test --- src/cc/CCassetsCore.cpp | 2 +- src/cc/gateways.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index a9361ede4..55a4ccdcb 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -354,7 +354,7 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans return(0); if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) { - fprintf(stderr,"null decodeopret\n"); + fprintf(stderr,"null decodeopret v.%d\n",v); return(0); } else if ( funcid == 'c' ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 66c71fb4e..b22360642 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -591,6 +591,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); + fprintf(stderr,"finalize CCtx\n"); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } From e0bea5459efeeeeef0e72c190be56086d565f612 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:07:10 -1100 Subject: [PATCH 070/306] Test --- src/cc/gateways.cpp | 7 +++++-- src/cc/oracles.cpp | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b22360642..4293eb066 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -560,7 +560,9 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui gatewayspk = GetUnspendable(cp,0); _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); memcpy(cp->unspendablepriv2,cp->CCpriv,32); - cp->evalcode2 = EVAL_ASSETS; + assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; + memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); + strcpy(assets->unspendableaddr2,cp->unspendableaddr2); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -581,9 +583,10 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui fprintf(stderr,"invalid Gateways deposittxid %s %.8f != %.8f\n",uint256_str(str,deposittxid),(double)depositamount/COIN,(double)amount/COIN); return(""); } + fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a5337e636..2fa5e5815 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -169,6 +169,7 @@ CPubKey OracleBatonPk(char *batonaddr,struct CCcontract_info *cp) if ( ctx == 0 ) ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); Myprivkey(priv); + cp->evalcode2 = EVAL_ORACLES; for (i=0; i<32; i++) cp->unspendablepriv2[i] = (priv[i] ^ cp->CCpriv[i]); while ( secp256k1_ec_seckey_verify(ctx,cp->unspendablepriv2) == 0 ) From d283511ce5360c63dd4e8c87ffaaf03a99af6bf7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:07:52 -1100 Subject: [PATCH 071/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 4293eb066..5c4ad1401 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -562,7 +562,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui memcpy(cp->unspendablepriv2,cp->CCpriv,32); assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); - strcpy(assets->unspendableaddr2,cp->unspendableaddr2); + strcpy(assetscp->unspendableaddr2,cp->unspendableaddr2); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); From 2dcf5c8b29c26b62fa12cb77773fdbf1323fbbd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:11:12 -1100 Subject: [PATCH 072/306] Test --- src/cc/CCtx.cpp | 2 +- src/cc/gateways.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index c9196e951..085274e56 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -121,7 +121,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran } else if ( strcmp(destaddr,cp->unspendableaddr2) == 0 ) { - //fprintf(stderr,"matched %s unspendable2!\n",cp->unspendableaddr2); + fprintf(stderr,"matched %s unspendable2!\n",cp->unspendableaddr2); privkey = cp->unspendablepriv2; if ( othercond2 == 0 ) othercond2 = MakeCCcond1(cp->evalcode2,cp->unspendablepk2); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5c4ad1401..3773cafd2 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -561,6 +561,8 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); memcpy(cp->unspendablepriv2,cp->CCpriv,32); assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; + assetscp->unspendablepk2 = gatewayspk; + cp->unspendablepk2 = gatewayspk; memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); strcpy(assetscp->unspendableaddr2,cp->unspendableaddr2); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) From bb81559fc7fa482c21bae70ffb95e4664244e327 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:12:41 -1100 Subject: [PATCH 073/306] Test --- src/cc/CCtx.cpp | 2 +- src/cc/gateways.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 085274e56..c9196e951 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -121,7 +121,7 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran } else if ( strcmp(destaddr,cp->unspendableaddr2) == 0 ) { - fprintf(stderr,"matched %s unspendable2!\n",cp->unspendableaddr2); + //fprintf(stderr,"matched %s unspendable2!\n",cp->unspendableaddr2); privkey = cp->unspendablepriv2; if ( othercond2 == 0 ) othercond2 = MakeCCcond1(cp->evalcode2,cp->unspendablepk2); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3773cafd2..3f2ac1f74 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -585,7 +585,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui fprintf(stderr,"invalid Gateways deposittxid %s %.8f != %.8f\n",uint256_str(str,deposittxid),(double)depositamount/COIN,(double)amount/COIN); return(""); } - fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); + //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) @@ -596,7 +596,6 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - fprintf(stderr,"finalize CCtx\n"); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } From 4f6afe81b1008ee9a1fd6057eeef969c65a02372 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:18:07 -1100 Subject: [PATCH 074/306] Test --- src/cc/assets.cpp | 2 +- src/cc/eval.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 8adecb3e4..e5a5af4e0 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -176,7 +176,7 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx //vout.n-1: opreturn [EVAL_ASSETS] ['t'] [assetid] if ( inputs == 0 ) return eval->Invalid("no asset inputs for transfer"); - fprintf(stderr,"transfer validated %.8f -> %.8f\n",(double)inputs/COIN,(double)outputs/COIN); + fprintf(stderr,"transfer validated %.8f -> %.8f (%d %d)\n",(double)inputs/COIN,(double)outputs/COIN,preventCCvins,preventCCvouts); break; case 'b': // buyoffer diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index b6fcf57dd..949728be4 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -38,7 +38,7 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) pthread_mutex_lock(&KOMODO_CC_mutex); bool out = eval->Dispatch(cond, tx, nIn); pthread_mutex_unlock(&KOMODO_CC_mutex); - //fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); + fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); assert(eval->state.IsValid() == out); if (eval->state.IsValid()) return true; From a8ed619fc385d8dd7c2b963579d3fb069ad72a2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:21:01 -1100 Subject: [PATCH 075/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3f2ac1f74..7c7d544bb 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -596,7 +596,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 48bde33c7c9a025478a72e278d90c0135e791a6a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:23:52 -1100 Subject: [PATCH 076/306] Test --- src/cc/eval.cpp | 2 +- src/cc/gateways.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 949728be4..b6fcf57dd 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -38,7 +38,7 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) pthread_mutex_lock(&KOMODO_CC_mutex); bool out = eval->Dispatch(cond, tx, nIn); pthread_mutex_unlock(&KOMODO_CC_mutex); - fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); + //fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); assert(eval->state.IsValid() == out); if (eval->state.IsValid()) return true; diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7c7d544bb..cd668f7ac 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -207,8 +207,8 @@ bool GatewaysExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransacti bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; - return(false); std::vector > txids; + fprintf(stderr,"return true without gateways validation\n"); numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; From c742ef4c93b0e130429ec51c8a77ce90f9a41764 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 10 Sep 2018 08:25:15 -1100 Subject: [PATCH 077/306] Test --- src/cc/gateways.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cd668f7ac..a4c9f8cbc 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -209,6 +209,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction & int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; std::vector > txids; fprintf(stderr,"return true without gateways validation\n"); + return(true); numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; From 7f9283e5b1b35a904ce74ca36fb8178283921cff Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 00:59:17 -1100 Subject: [PATCH 078/306] Valiate merkleroot --- src/cc/CCGateways.h | 5 ++- src/cc/gateways.cpp | 88 +++++++++++++++++++++++++--------------- src/rpcserver.cpp | 6 +-- src/wallet/rpcwallet.cpp | 14 +++---- 4 files changed, 68 insertions(+), 45 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 799259f5c..aee576116 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -18,11 +18,12 @@ #define CC_GATEWAYS_H #include "CCinclude.h" +#include "../merkleblock.h" bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); -std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount); -std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector redeemscript,int64_t amount); +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); // CCcustom diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index a4c9f8cbc..0307c854b 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -15,6 +15,16 @@ #include "CCGateways.h" +/* + prevent duplicate bindtxid via mempool scan +claim needs to create a marker that is checked or validate deposittxid spending is ok + +assets vin selector needs to filter by signable vins + +loop on merkle +string oracles + */ + /* Uses MofN CC's normal msig handling to create automated deposits -> token issuing. And partial signing by the selected pubkeys for releasing the funds. A user would be able to select which pubkeys to use to construct the automated deposit/redeem multisigs. @@ -88,7 +98,7 @@ To make a gateway deposit, send the funds to the "deposit" address, along with any amount to the same pubkey address you want to get the assetized KMD to appear in. ./komodo-cli z_sendmany "" '[{"address":"RFpxgqff7FDHFuHa3jSX5NzqqWCcELz8ha","amount":0.0001},{"address":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","amount":7.6999}]' - bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 height.1003776 + bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 height.1003776 merkle.90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f ./komodo-cli gettxoutproof '["bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009"]' 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b @@ -96,11 +106,11 @@ ./komodo-cli getrawtransaction bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b - gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks + gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b proofhere 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 - gatewaysclaim bindtxid coin deposittxid redeemscript amount + gatewaysclaim bindtxid coin deposittxid destpub amount ./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 */ @@ -113,19 +123,19 @@ CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid, return(opret); } -CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,std::vectortxids,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +CScript EncodeGatewaysOpRet(uint8_t funcid,std::string coin,uint256 bindtxid,std::vector publishers,std::vectortxids,int32_t height,uint256 cointxid,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { CScript opret; uint8_t evalcode = EVAL_GATEWAYS; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << txids << height << cointxid << deposithex << proof << redeemscript << amount); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << coin << bindtxid << publishers << txids << height << cointxid << deposithex << proof << destpub << amount); return(opret); } -uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,std::vector &redeemscript,int64_t &amount) +uint8_t DecodeGatewaysOpRet(const CScript &scriptPubKey,std::string &coin,uint256 &bindtxid,std::vector&publishers,std::vector&txids,int32_t &height,uint256 &cointxid,std::string &deposithex,std::vector &proof,CPubKey &destpub,int64_t &amount) { std::vector vopret; uint8_t *script,e,f; GetOpReturnData(scriptPubKey, vopret); script = (uint8_t *)vopret.data(); - if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> bindtxid; ss >> publishers; ss >> txids; ss >> height; ss >> cointxid; ss >> deposithex; ss >> proof; ss >> redeemscript; ss >> amount) != 0 ) + if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> coin; ss >> bindtxid; ss >> publishers; ss >> txids; ss >> height; ss >> cointxid; ss >> deposithex; ss >> proof; ss >> destpub; ss >> amount) != 0 ) { return(f); } @@ -399,11 +409,11 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t return(""); } fprintf(stderr,"implement GatewaysBindExists\n"); - /*if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! + if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! { fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin.c_str(),uint256_str(str,tokenid)); return(""); - }*/ + } if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,gatewayspk)); @@ -436,9 +446,22 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u return(zeroid); } -int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,std::vectorredeemscript) +/* Get the block merkle root for a proof + * IN: proofData + * OUT: merkle root + * OUT: transaction IDS + */ +uint256 BitcoinGetProofMerkleRoot(const std::vector &proofData, std::vector &txids) { - uint256 hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],str[65]; int32_t i,numvouts; int64_t nValue = 0; + CMerkleBlock merkleBlock; + if (!E_UNMARSHAL(proofData, ss >> merkleBlock)) + return uint256(); + return merkleBlock.txn.ExtractMatches(txids); +} + +int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,CPubKey destpub) +{ + uint256 txids,proofroot,hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],destpubaddr[64],claimaddr[64],str[65],str2[65]; int32_t i,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -449,31 +472,29 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout fprintf(stderr,"GatewaysVerify mismatched oracle name %s != %s\n",name.c_str(),refcoin.c_str()); return(0); } + proofroot = BitcoinGetProofMerkleRoot(proof,txids); + if ( proofroot != merleroot ) + { + fprintf(stderr,"GatewaysVerify mismatched merkleroot %s != %s\n",uint256_str(str,proofroot),uint256_str(str2,merkleroot)); + return(0); + } if ( DecodeHexTx(tx,deposithex) != 0 ) { - for (i=0; ipubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,std::vector redeemscript,int64_t amount) +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); @@ -531,12 +552,13 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector txids.push_back(txid); } } - if ( 0 && (merkleroot == zeroid || m < n/2) ) + if ( merkleroot == zeroid || m < n/2 ) { + decode_hex((uint8_t *)&merkleroot,32,"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); - return(""); + //return(""); } - if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,redeemscript) != amount ) + if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,destpub) != amount ) { fprintf(stderr,"deposittxid didnt validate\n"); return(""); @@ -544,13 +566,13 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,redeemscript,amount))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,destpub,amount))); } fprintf(stderr,"cant find enough inputs\n"); return(""); } -std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,std::vector redeemscript,int64_t amount) +std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount) { CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 701696f75..ee1d51568 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -299,9 +299,9 @@ static const CRPCCommand vRPCCommands[] = { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true }, { "blockchain", "verifychain", &verifychain, true }, { "blockchain", "getspentinfo", &getspentinfo, false }, - { "blockchain", "paxprice", &paxprice, true }, - { "blockchain", "paxpending", &paxpending, true }, - { "blockchain", "paxprices", &paxprices, true }, + //{ "blockchain", "paxprice", &paxprice, true }, + //{ "blockchain", "paxpending", &paxpending, true }, + //{ "blockchain", "paxprices", &paxprices, true }, { "blockchain", "notaries", ¬aries, true }, //{ "blockchain", "height_MoM", &height_MoM, true }, //{ "blockchain", "txMoMproof", &txMoMproof, true }, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 8dc884a57..14b667151 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5445,9 +5445,9 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,redeemscript,pubkey; + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,destpub,pubkey; if ( fHelp || params.size() != 11 ) - throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof redeemscript amount numpks oraclepks\n"); + throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks\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"); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); @@ -5457,7 +5457,7 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) claimvout = atoi((char *)params[4].get_str().c_str()); deposithex = params[5].get_str(); proof = ParseHex(params[6].get_str()); - redeemscript = ParseHex(params[7].get_str()); + destpub = ParseHex(params[7].get_str()); amount = atof((char *)params[8].get_str().c_str()) * COIN; numpks = atoi((char *)params[9].get_str().c_str()); if ( amount <= 0 || numpks <= 0 || claimvout < 0 ) @@ -5469,7 +5469,7 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) pubkey = ParseHex(params[10+i].get_str().c_str()); pubkeys.push_back(pubkey2pk(pubkey)); } - hex = GatewaysDeposit(0,bindtxid,pubkeys,height,coin,cointxid,claimvout,deposithex,proof,redeemscript,amount); + hex = GatewaysDeposit(0,bindtxid,pubkeys,height,coin,cointxid,claimvout,deposithex,proof,pubkey2pk(destpub),amount); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); @@ -5480,7 +5480,7 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) UniValue gatewaysclaim(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex,coin; uint256 bindtxid,deposittxid; std::vectorredeemscript; int64_t amount; + UniValue result(UniValue::VOBJ); std::string hex,coin; uint256 bindtxid,deposittxid; std::vectordestpub; int64_t amount; if ( fHelp || params.size() != 5 ) throw runtime_error("gatewaysclaim bindtxid coin deposittxid redeemscript amount\n"); if ( ensure_CCrequirements() < 0 ) @@ -5488,9 +5488,9 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); deposittxid = Parseuint256((char *)params[2].get_str().c_str()); - redeemscript = ParseHex(params[3].get_str()); + destpub = ParseHex(params[3].get_str()); amount = atof((char *)params[4].get_str().c_str()) * COIN; - hex = GatewaysClaim(0,bindtxid,coin,deposittxid,redeemscript,amount); + hex = GatewaysClaim(0,bindtxid,coin,deposittxid,pubkey2pk(destpub),amount); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 159a3dfa555ae31b7ddbc4a6d20808768462ee6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 01:02:57 -1100 Subject: [PATCH 079/306] Test --- src/cc/gateways.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 0307c854b..a6d7b61eb 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -409,11 +409,11 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t return(""); } fprintf(stderr,"implement GatewaysBindExists\n"); - if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! + /*if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! { fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin.c_str(),uint256_str(str,tokenid)); return(""); - } + }*/ if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,gatewayspk)); @@ -461,7 +461,7 @@ uint256 BitcoinGetProofMerkleRoot(const std::vector &proofData, std::ve int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout,std::string refcoin,uint256 cointxid,const std::string deposithex,std::vectorproof,uint256 merkleroot,CPubKey destpub) { - uint256 txids,proofroot,hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],destpubaddr[64],claimaddr[64],str[65],str2[65]; int32_t i,numvouts; int64_t nValue = 0; + std::vector txids; uint256 proofroot,hashBlock,txid = zeroid; CTransaction tx; std::string name,description,format; char destaddr[64],destpubaddr[64],claimaddr[64],str[65],str2[65]; int32_t i,numvouts; int64_t nValue = 0; if ( GetTransaction(oracletxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"GatewaysVerify cant find oracletxid %s\n",uint256_str(str,oracletxid)); @@ -473,7 +473,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout return(0); } proofroot = BitcoinGetProofMerkleRoot(proof,txids); - if ( proofroot != merleroot ) + if ( proofroot != merkleroot ) { fprintf(stderr,"GatewaysVerify mismatched merkleroot %s != %s\n",uint256_str(str,proofroot),uint256_str(str2,merkleroot)); return(0); From 8571958e86f1c98bfb76da546f0a721ba13a5435 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 01:05:33 -1100 Subject: [PATCH 080/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index a6d7b61eb..48927cb7d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -506,7 +506,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout int64_t GatewaysDepositval(CTransaction tx) { - int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; std::vector claimpubkey; + int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; CPubKey claimpubkey; if ( (numvouts= tx.vout.size()) > 0 ) { if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) @@ -554,7 +554,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector } if ( merkleroot == zeroid || m < n/2 ) { - decode_hex((uint8_t *)&merkleroot,32,"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); + decode_hex((uint8_t *)&merkleroot,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); //return(""); } From 612f676a5e035d3d8adbce3555b60649c4067c87 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:29:47 -1100 Subject: [PATCH 081/306] CCtxidaddr enforcement --- src/cc/CCinclude.h | 1 + src/cc/CCutils.cpp | 10 ++++++++ src/cc/gateways.cpp | 62 +++++++++++++++++++++++++++++++++++++-------- src/cc/oracles.cpp | 36 ++++++++------------------ 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index ba57f2748..afc113083 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -101,6 +101,7 @@ int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endian int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp); CScript GetScriptForMultisig(int nRequired, const std::vector& keys); int64_t CCaddress_balance(char *coinaddr); +CPubKey CCtxidaddr(char *txidaddr,uint256 txid); int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char *format); uint8_t DecodeOraclesCreateOpRet(const CScript &scriptPubKey,std::string &name,std::string &description,std::string &format); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index cd7299bcf..c11ae2d3b 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -181,6 +181,16 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) return(false); } +CPubKey CCtxidaddr(char *txidaddr,uint256 txid) +{ + uint8_t buf33[33]; CPubKey pk; + buf33[0] = 0x02; + endiancpy(&buf33[1],(uint8_t *)&txid,32); + pk = buf2pk(buf33); + Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); + return(pk); +} + bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk) { CC *payoutCond; diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 48927cb7d..9c7bdd35d 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -16,12 +16,11 @@ #include "CCGateways.h" /* - prevent duplicate bindtxid via mempool scan -claim needs to create a marker that is checked or validate deposittxid spending is ok + prevent duplicate bindtxid and cointxid via mempool scan assets vin selector needs to filter by signable vins -loop on merkle +loop on merkle oracle string oracles */ @@ -107,7 +106,7 @@ string oracles 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks -./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b proofhere 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 gatewaysclaim bindtxid coin deposittxid destpub amount @@ -214,7 +213,7 @@ bool GatewaysExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransacti else return(true); } -bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) +bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) { int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; std::vector > txids; @@ -284,6 +283,44 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP return(totalinputs); } +int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! +{ + char markeraddr[64]; std::string coin; int32_t numvouts; int64_t totalsupply; uint256 oracletxid,hashBlock; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; + std::vector > addressIndex; + _GetCCaddress(markeraddr,EVAL_GATEWAYS,gatewayspk); + fprintf(stderr,"bind markeraddr.(%s) need to scan mempool also\n",markeraddr); + SetCCtxids(addressIndex,markeraddr); + for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) + { + if ( GetTransaction(it->first.txhash,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeGatewaysBindOpRet(tx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) == 'B' ) + { + if ( tokenid == reftokenid ) + { + fprintf(stderr,"trying to bind an existing tokenid\n"); + return(1); + } + } + } + } + return(0); +} + +int32_t GatewaysCointxidExists(struct CCcontract_info *cp,uint256 cointxid) // dont forget to check mempool! +{ + char txidaddr[64]; std::string coin; int32_t numvouts; uint256 hashBlock; + std::vector > addressIndex; + CCtxidaddr(txidaddr,cointxid); + fprintf(stderr," txidaddr.(%s) need to scan mempool also\n",txidaddr); + SetCCtxids(addressIndex,txidaddr); + for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) + { + return(-1); + } + return(0); +} + UniValue GatewaysInfo(uint256 bindtxid) { UniValue result(UniValue::VOBJ),a(UniValue::VARR); std::string coin; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CMutableTransaction mtx; CPubKey Gatewayspk; struct CCcontract_info *cp,C; int32_t i; int64_t totalsupply,remaining; @@ -408,12 +445,11 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t fprintf(stderr,"illegal format (%s) != (%s)\n",fstr,(char *)"Ihh"); return(""); } - fprintf(stderr,"implement GatewaysBindExists\n"); - /*if ( GatewaysBindExists(cp,gatewayspk,coin,tokenid) != 0 ) // dont forget to check mempool! + if ( GatewaysBindExists(cp,gatewayspk,tokenid) != 0 ) // dont forget to check mempool! { fprintf(stderr,"Gateway bind.%s (%s) already exists\n",coin.c_str(),uint256_str(str,tokenid)); return(""); - }*/ + } if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,gatewayspk)); @@ -521,7 +557,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64],txidaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -538,6 +574,11 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } + if ( GatewaysCointxidExists(cp,cointxid) != 0 ) + { + fprintf(stderr,"cointxid.%s already exists\n",uint256_str(str,cointxid)); + return(""); + } n = (int32_t)pubkeys.size(); merkleroot = zeroid; for (i=m=0; i fprintf(stderr,"deposittxid didnt validate\n"); return(""); } - if ( AddNormalinputs(mtx,mypk,2*txfee,60) > 0 ) + if ( AddNormalinputs(mtx,mypk,3*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(CCtxidaddr(txidaddr,cointxid))) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeGatewaysOpRet('D',coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,destpub,amount))); } fprintf(stderr,"cant find enough inputs\n"); diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 2fa5e5815..82e1d4ab0 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -223,16 +223,12 @@ int64_t OracleCurrentDatafee(uint256 reforacletxid,char *markeraddr,CPubKey publ int64_t OracleDatafee(CScript &scriptPubKey,uint256 oracletxid,CPubKey publisher) { - CTransaction oracletx; char markeraddr[64]; CPubKey markerpubkey; uint8_t buf33[33]; uint256 hashBlock; std::string name,description,format; int32_t numvouts; int64_t datafee = 0; + CTransaction oracletx; char markeraddr[64]; uint256 hashBlock; std::string name,description,format; int32_t numvouts; int64_t datafee = 0; if ( myGetTransaction(oracletxid,oracletx,hashBlock) != 0 && (numvouts= oracletx.vout.size()) > 0 ) { if ( DecodeOraclesCreateOpRet(oracletx.vout[numvouts-1].scriptPubKey,name,description,format) == 'C' ) { - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&oracletxid,32); - markerpubkey = buf2pk(buf33); - scriptPubKey = CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG; - Getscriptaddress(markeraddr,scriptPubKey); + CCtxidaddr(markeraddr,oracletxid); datafee = OracleCurrentDatafee(oracletxid,markeraddr,publisher); } } @@ -484,13 +480,10 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk,markerpubkey; int32_t numvouts,maxheight=0; int64_t datafee,ht; uint8_t buf33[33]; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; rettxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&reforacletxid,32); - markerpubkey = buf2pk(buf33); - Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); + CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { @@ -721,7 +714,7 @@ std::string OracleCreate(int64_t txfee,std::string name,std::string description, std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee) { - CMutableTransaction mtx; CPubKey mypk,markerpubkey,batonpk; struct CCcontract_info *cp,C; uint8_t buf33[33]; char markeraddr[64],batonaddr[64]; + CMutableTransaction mtx; CPubKey mypk,markerpubkey,batonpk; struct CCcontract_info *cp,C; char markeraddr[64],batonaddr[64]; cp = CCinit(&C,EVAL_ORACLES); if ( txfee == 0 ) txfee = 10000; @@ -731,11 +724,8 @@ std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee) return(""); } mypk = pubkey2pk(Mypubkey()); - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&oracletxid,32); - markerpubkey = buf2pk(buf33); - Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); batonpk = OracleBatonPk(batonaddr,cp); + markerpubkey = CCtxidaddr(markeraddr,oracletxid); if ( AddNormalinputs(mtx,mypk,3*txfee,4) > 0 ) { mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG)); @@ -747,15 +737,12 @@ std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee) std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount) { - CMutableTransaction mtx; CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; uint8_t buf33[33]; char markeraddr[64]; + CMutableTransaction mtx; CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; char markeraddr[64]; cp = CCinit(&C,EVAL_ORACLES); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&oracletxid,32); - markerpubkey = buf2pk(buf33); - Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); + markerpubkey = CCtxidaddr(markeraddr,oracletxid); if ( AddNormalinputs(mtx,mypk,amount + 2*txfee,1) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,publisher)); @@ -849,12 +836,9 @@ UniValue OracleInfo(uint256 origtxid) { UniValue result(UniValue::VOBJ),a(UniValue::VARR),obj(UniValue::VOBJ); std::vector > unspentOutputs; - CMutableTransaction mtx; CTransaction regtx,tx; std::string name,description,format; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey markerpubkey,pk; struct CCcontract_info *cp,C; uint8_t buf33[33]; int64_t datafee,funding; char str[67],markeraddr[64],numstr[64],batonaddr[64]; std::vector data; + CMutableTransaction mtx; CTransaction regtx,tx; std::string name,description,format; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey pk; struct CCcontract_info *cp,C; int64_t datafee,funding; char str[67],markeraddr[64],numstr[64],batonaddr[64]; std::vector data; cp = CCinit(&C,EVAL_ORACLES); - buf33[0] = 0x02; - endiancpy(&buf33[1],(uint8_t *)&origtxid,32); - markerpubkey = buf2pk(buf33); - Getscriptaddress(markeraddr,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG); + CCtxidaddr(markeraddr,origtxid); if ( GetTransaction(origtxid,tx,hashBlock,false) != 0 ) { if ( tx.vout.size() > 0 && DecodeOraclesCreateOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,name,description,format) == 'C' ) From 384c05de7fdf0e13d6e54181fbb8ba37b7741c46 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:31:38 -1100 Subject: [PATCH 082/306] Test --- src/cc/CCutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index c11ae2d3b..3a448a92c 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -187,7 +187,7 @@ CPubKey CCtxidaddr(char *txidaddr,uint256 txid) buf33[0] = 0x02; endiancpy(&buf33[1],(uint8_t *)&txid,32); pk = buf2pk(buf33); - Getscriptaddress(coinaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); + Getscriptaddress(txidaddr,CScript() << ParseHex(HexStr(pk)) << OP_CHECKSIG); return(pk); } From cc002e63afcd44d9101117be81bf58e09e2291fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:34:05 -1100 Subject: [PATCH 083/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 9c7bdd35d..f28f1efbd 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -285,7 +285,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! { - char markeraddr[64]; std::string coin; int32_t numvouts; int64_t totalsupply; uint256 oracletxid,hashBlock; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; + char markeraddr[64]; std::string coin; int32_t numvouts; int64_t totalsupply; uint256 tokenid,oracletxid,hashBlock; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; CTransaction tx; std::vector > addressIndex; _GetCCaddress(markeraddr,EVAL_GATEWAYS,gatewayspk); fprintf(stderr,"bind markeraddr.(%s) need to scan mempool also\n",markeraddr); From 8c4abc12d883eeffbbbd0f2e412899ed66b4c9c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:35:18 -1100 Subject: [PATCH 084/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index f28f1efbd..628fd7cd4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -285,7 +285,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! { - char markeraddr[64]; std::string coin; int32_t numvouts; int64_t totalsupply; uint256 tokenid,oracletxid,hashBlock; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; CTransaction tx; + char markeraddr[64],depositaddr[64]; std::string coin; int32_t numvouts; int64_t totalsupply; uint256 tokenid,oracletxid,hashBlock; uint8_t M,N,taddr,prefix,prefix2; std::vector pubkeys; CTransaction tx; std::vector > addressIndex; _GetCCaddress(markeraddr,EVAL_GATEWAYS,gatewayspk); fprintf(stderr,"bind markeraddr.(%s) need to scan mempool also\n",markeraddr); @@ -294,7 +294,7 @@ int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 { if ( GetTransaction(it->first.txhash,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - if ( DecodeGatewaysBindOpRet(tx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) == 'B' ) + if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) == 'B' ) { if ( tokenid == reftokenid ) { From e2d99d8d682f8a05c693b6cc189608650bae5fd1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:38:58 -1100 Subject: [PATCH 085/306] Test --- src/cc/gateways.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 628fd7cd4..9282d6da5 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -96,6 +96,7 @@ string oracles To make a gateway deposit, send the funds to the "deposit" address, along with any amount to the same pubkey address you want to get the assetized KMD to appear in. + 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 pubkey for RFpxgqff7FDHFuHa3jSX5NzqqWCcELz8ha ./komodo-cli z_sendmany "" '[{"address":"RFpxgqff7FDHFuHa3jSX5NzqqWCcELz8ha","amount":0.0001},{"address":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","amount":7.6999}]' bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 height.1003776 merkle.90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f @@ -106,11 +107,11 @@ string oracles 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks -./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 +./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 gatewaysclaim bindtxid coin deposittxid destpub amount -./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 76a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac 7.6999 +./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 */ // start of consensus code @@ -595,7 +596,9 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector } if ( merkleroot == zeroid || m < n/2 ) { - decode_hex((uint8_t *)&merkleroot,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); + uint256 tmp; + decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); + endiancpy((uint8_t *)&merkleroot,(uint8_t *)&tmp,32); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); //return(""); } From 27eb08b64e691cc861e4ca3dbdc9cce09b750039 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 03:40:49 -1100 Subject: [PATCH 086/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 9282d6da5..40088abd2 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -598,7 +598,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector { uint256 tmp; decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); - endiancpy((uint8_t *)&merkleroot,(uint8_t *)&tmp,32); + merkleroot = revuint256(tmp); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); //return(""); } From 0b62b8072e553ecfe29c3cde4f89a6700ec76090 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 04:18:56 -1100 Subject: [PATCH 087/306] Update example --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 40088abd2..cde5e5453 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -108,10 +108,10 @@ string oracles gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 - -> acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 + -> 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 gatewaysclaim bindtxid coin deposittxid destpub amount -./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD acc58b4552c4696406b681eb853b0c9a80ef8f02e3ec0e7bbd407b9261ecba81 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 +./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 */ // start of consensus code From e5a5dadb61648ec19e1d98e7778434ba10404cc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 04:46:18 -1100 Subject: [PATCH 088/306] GatewaysCCassets --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 10 +++++----- src/wallet/rpcwallet.cpp | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index aee576116..b7c653ef3 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -22,7 +22,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys); -std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cde5e5453..b98b95111 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -106,8 +106,8 @@ string oracles ./komodo-cli getrawtransaction bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b - gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks -./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 + gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount +./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 -> 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 gatewaysclaim bindtxid coin deposittxid destpub amount @@ -556,9 +556,9 @@ int64_t GatewaysDepositval(CTransaction tx) return(0); } -std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vectorpubkeys,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) +std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector msigpubkeys,publishers; std::vectortxids; char str[65],depositaddr[64],txidaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector pubkeys,publishers; std::vectortxids; char str[65],depositaddr[64],txidaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -570,7 +570,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,std::vector fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); return(""); } - if ( DecodeGatewaysBindOpRet(depositaddr,bindtx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || refcoin != coin ) + if ( DecodeGatewaysBindOpRet(depositaddr,bindtx.vout[numvouts-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 'B' || refcoin != coin ) { fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 14b667151..358a62d9d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4876,6 +4876,7 @@ UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vectorunspendableCCaddr)); sprintf(str,"%smarker",name); result.push_back(Pair(str,cp->normaladdr)); + result.push_back(Pair("GatewaysPubkey","03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40")); if ( _GetCCaddress(destaddr,EVAL_ASSETS,pubkey2pk(pubkey)) > 0 ) { sprintf(str,"%sCCassets",name); @@ -5445,9 +5446,9 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) UniValue gatewaysdeposit(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); int32_t i,claimvout,height,numpks; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorpubkeys; std::vectorproof,destpub,pubkey; - if ( fHelp || params.size() != 11 ) - throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount numpks oraclepks\n"); + UniValue result(UniValue::VOBJ); int32_t i,claimvout,height; int64_t amount; std::string hex,coin,deposithex; uint256 bindtxid,cointxid; std::vectorproof,destpub,pubkey; + if ( fHelp || params.size() != 9 ) + throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount\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"); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); @@ -5459,17 +5460,16 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) proof = ParseHex(params[6].get_str()); destpub = ParseHex(params[7].get_str()); amount = atof((char *)params[8].get_str().c_str()) * COIN; - numpks = atoi((char *)params[9].get_str().c_str()); if ( amount <= 0 || numpks <= 0 || claimvout < 0 ) throw runtime_error("invalid param: amount, numpks or claimvout\n"); - for (i=0; i 0 ) { result.push_back(Pair("result", "success")); From a5ea3ded38fb380a9e85547e0d27f45ce693aaa0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 05:32:35 -1100 Subject: [PATCH 089/306] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 358a62d9d..4fb3f8beb 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5460,7 +5460,7 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) proof = ParseHex(params[6].get_str()); destpub = ParseHex(params[7].get_str()); amount = atof((char *)params[8].get_str().c_str()) * COIN; - if ( amount <= 0 || numpks <= 0 || claimvout < 0 ) + if ( amount <= 0 || claimvout < 0 ) throw runtime_error("invalid param: amount, numpks or claimvout\n"); /*for (i=0; i Date: Tue, 11 Sep 2018 06:46:58 -1100 Subject: [PATCH 090/306] Updated oracle feed --- src/cc/dapps/oraclefeed.c | 155 +++++++++++++++++++++++++++++++++----- 1 file changed, 135 insertions(+), 20 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index da8b9c4f2..967be380e 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -343,6 +343,106 @@ void komodobroadcast(char *acname,cJSON *hexjson) } } +int32_t get_KMDheight() +{ + cJSON *retjson; char *retstr; int32_t height; + if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) + { + height = jint(retjson,"blocks"); + fprintf(stderr,"KMDheight.%d\n",height); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); + free(retstr); + } + return(0); +} + +bits256 get_KMDblockhash(int32_t height) +{ + cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; + memset(hash.bytes,0,sizeof(hash)); + if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 ) + { + fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDblockhash.(%s)\n",retstr); + if ( strlen(retstr) == 64 ) + decode_hex(hash.bytes,32,retstr); + free(retstr); + } + return(hash); +} + +bits256 get_KMDmerkleroot(bits256 blockhash) +{ + cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; + memset(hash.bytes,0,sizeof(hash)); + if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) + { + merkleroot = jbits256(retjson,"merkleroot"); + fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr); + free(retstr); + } + return(hash); +} + +int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) +{ + int32_t height = 0; char str[65]; + if ( prevheight == 0 ) + height = get_KMDheight(); + else height = prevheight + 1; + if ( height > 0 ) + { + *blockhashp = get_KMDblockhash(height); + *merklerootp = get_KMDmerkleroot(*blockhashp); + return(height); + } + return(0); +} + +int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *format) +{ + uint32_t i,height; uint64_t price; bits256 blockhash,merkleroot; + hexstr[0] = 0; + if ( format[0] == 'L' || format[0] == 'l' ) + { + if ( (price= get_btcusd()) != 0 ) + { + for (i=0; i<8; i++) + sprintf(&hexstr[i*2],"%02x",(uint8_t)((price >> (i*8)) & 0xff)); + hexstr[16] = 0; + return(16); + } + } + else if ( strcmp(format,"Ihh") == 0 ) + { + if ( (height= get_KMDheader(&blockhash,&merkleroot,prevheight)) > prevheight ) + { + for (i=0; i<4; i++) + sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); + for (i=0; i<32; i++) + sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[i]); + for (i=0; i<32; i++) + sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[i]); + hexstr[8 + 64*2] = 0; + return(height); + } + } + return(0); +} + /* oraclescreate "BTCUSD" "coindeskpricedata" "L" -> 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3 oraclesregister 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3 1000000 -> 11c54d4ab17293217276396e27d86f714576ff55a3300dac34417047825edf93 @@ -365,39 +465,54 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 */ -#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3" -#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92" -#define ACNAME "ORCL" +//#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3" +//#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92" +//#define ACNAME "ORCL" int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,j,n; char *retstr,*retstr2,*pkstr,hexstr[64]; uint64_t price; - printf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*retstr,*retstr2,*pkstr,hexstr[4096]; uint64_t price; + if ( argc != 5 ) + { + printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + return(-1); + } + acname = argv[1]; + oraclestr = argv[2]; + pkstr = argv[3]; + format = argv[4]; + if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) + { + printf("only formats of L and Ihh are supported now\n"); + return(-1); + } while ( 1 ) { retstr = 0; - if ( (price= get_btcusd()) != 0 && (clijson= get_komodocli(&retstr,ACNAME,"oraclesinfo",ORACLETXID,"","")) != 0 ) + if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i> (j*8)) & 0xff)); - hexstr[16] = 0; - if ( (clijson2= get_komodocli(&retstr2,ACNAME,"oraclesdata",ORACLETXID,hexstr,"")) != 0 ) + if ( (height= get_oracledata(prevheight,hexstr,sizeof(hexstr),"Ihh")) != 0 ) { - //printf("data.(%s)\n",jprint(clijson2,0)); - komodobroadcast(ACNAME,clijson2); - free_json(clijson2); - } - else if ( retstr2 != 0 ) - { - printf("error parsing oraclesdata.(%s)\n",retstr2); - free(retstr2); + if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) + { + //printf("data.(%s)\n",jprint(clijson2,0)); + komodobroadcast(acname,clijson2); + free_json(clijson2); + prevheight = height; + printf("ht.%d <- %s\n",height,hexstr); + } + else if ( retstr2 != 0 ) + { + printf("error parsing oraclesdata.(%s)\n",retstr2); + free(retstr2); + } } break; } @@ -410,7 +525,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(60); + sleep(10); } return(0); } From cbb7f9336c8b2e436053cc4ba71126263759624a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 06:50:13 -1100 Subject: [PATCH 091/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 967be380e..fae9773a7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -382,7 +382,7 @@ bits256 get_KMDblockhash(int32_t height) bits256 get_KMDmerkleroot(bits256 blockhash) { cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; - memset(hash.bytes,0,sizeof(hash)); + memset(merkleroot.bytes,0,sizeof(merkleroot)); if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); @@ -394,7 +394,7 @@ bits256 get_KMDmerkleroot(bits256 blockhash) fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr); free(retstr); } - return(hash); + return(merkleroot); } int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) @@ -471,7 +471,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*retstr,*retstr2,*pkstr,hexstr[4096]; uint64_t price; + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -496,7 +496,7 @@ int32_t main(int32_t argc,char **argv) for (i=0; i Date: Tue, 11 Sep 2018 06:54:09 -1100 Subject: [PATCH 092/306] Test --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index fae9773a7..3a5dbed6b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -345,7 +345,7 @@ void komodobroadcast(char *acname,cJSON *hexjson) int32_t get_KMDheight() { - cJSON *retjson; char *retstr; int32_t height; + cJSON *retjson; char *retstr; int32_t height=0; if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); @@ -357,7 +357,7 @@ int32_t get_KMDheight() fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); free(retstr); } - return(0); + return(height); } bits256 get_KMDblockhash(int32_t height) From ca2a3a69f46613a10a5423f6e309312e6178da2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 06:56:15 -1100 Subject: [PATCH 093/306] Test --- src/cc/dapps/oraclefeed.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3a5dbed6b..a0bcfed1c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -364,6 +364,7 @@ bits256 get_KMDblockhash(int32_t height) { cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; memset(hash.bytes,0,sizeof(hash)); + sprintf(heightstr,"%d",height); if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 ) { fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); From 0c3c6589fc858a622941a2b6b96bd91acb36b389 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:00:46 -1100 Subject: [PATCH 094/306] Test --- src/cc/dapps/oraclefeed.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index a0bcfed1c..98bb8ffa4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -312,12 +312,14 @@ uint64_t get_btcusd() cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) { long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,*fname = "/tmp/komodocli"; - sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); + if ( acname[0] != 0 ) + sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); + else sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); system(cmdstr); *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { - //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); From e3e41fcfc44c76c7da58e199e7d54cc9f4f3e335 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:05:49 -1100 Subject: [PATCH 095/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 98bb8ffa4..935c3c59c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( jsonstr[0] != '{' && jsonstr[0] != '[' && (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From 804fd5cdaecc493accfeb5c6ac8b1752506d3263 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:07:57 -1100 Subject: [PATCH 096/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 935c3c59c..37e6320fc 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( jsonstr[0] != '{' && jsonstr[0] != '[' && (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( (jsonstr[0] == '{' || jsonstr[0] == '[') && (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From 4aa9ec468fc3bba22339e52d6cd3a7477b59b858 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:13:22 -1100 Subject: [PATCH 097/306] Test --- src/rpcblockchain.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index aac0c0f21..a799a5efc 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -107,6 +107,11 @@ static UniValue ValuePoolDesc( UniValue blockheaderToJSON(const CBlockIndex* blockindex) { UniValue result(UniValue::VOBJ); + if ( blockindex == 0 ) + { + result.push_back(Pair("error", "null blockhash")); + return(result); + } result.push_back(Pair("hash", blockindex->GetBlockHash().GetHex())); int confirmations = -1; // Only report confirmations if the block is on the main chain From 1801dc41e756e56d14c3fc993306decb77d1390d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:17:02 -1100 Subject: [PATCH 098/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 37e6320fc..729ad8ab5 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( (jsonstr[0] == '{' || jsonstr[0] == '[') && (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From f0b9742f41e6cd15fc1ac09cab37e7b50ea10761 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:20:22 -1100 Subject: [PATCH 099/306] Test --- src/cc/dapps/oraclefeed.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 729ad8ab5..cbef4b8ee 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -374,8 +374,8 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s)\n",retstr); - if ( strlen(retstr) == 64 ) + fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retjson)); + if ( strlen(retstr) >= 64 ) decode_hex(hash.bytes,32,retstr); free(retstr); } @@ -409,9 +409,15 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh if ( height > 0 ) { *blockhashp = get_KMDblockhash(height); - *merklerootp = get_KMDmerkleroot(*blockhashp); - return(height); + if ( bits256_nonz(*blockhashp) != 0 ) + { + *merklerootp = get_KMDmerkleroot(*blockhashp); + if ( bits256_nonz(*merklerootp) != 0 ) + return(height); + } } + memset(blockhashp,0,sizeof(*blockhashp)); + memset(merklerootp,0,sizeof(*merklerootp)); return(0); } From 910d72499955f7ea1831136cb4ee77c20028cc03 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:20:58 -1100 Subject: [PATCH 100/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index cbef4b8ee..bf8f3ac50 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -374,7 +374,7 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retjson)); + fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) decode_hex(hash.bytes,32,retstr); free(retstr); From 1760539bbe22959ad414e5b7bfc73f22272f3399 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:21:47 -1100 Subject: [PATCH 101/306] Test --- src/cc/dapps/oraclefeed.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index bf8f3ac50..7adc2e6e6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -376,7 +376,10 @@ bits256 get_KMDblockhash(int32_t height) { fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) + { + retstr[64] = 0; decode_hex(hash.bytes,32,retstr); + } free(retstr); } return(hash); From 509029e2980517d3b2c53fde31e60f1aa6f1b883 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:22:44 -1100 Subject: [PATCH 102/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 7adc2e6e6..0c9212f60 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -319,7 +319,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { - fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); @@ -374,7 +374,7 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); + //fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) { retstr[64] = 0; @@ -392,7 +392,7 @@ bits256 get_KMDmerkleroot(bits256 blockhash) if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); - fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); + //fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); free_json(retjson); } else if ( retstr != 0 ) From 656e082ae5664044d23647689ea0ef0d9575a799 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:24:53 -1100 Subject: [PATCH 103/306] Test --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 0c9212f60..f62c49a52 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -407,7 +407,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh { int32_t height = 0; char str[65]; if ( prevheight == 0 ) - height = get_KMDheight(); + height = get_KMDheight() - 20; else height = prevheight + 1; if ( height > 0 ) { @@ -537,7 +537,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(10); + sleep(60); } return(0); } From bcb5cd958f5c431f01c968f84ba3174a378a6f42 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:33:17 -1100 Subject: [PATCH 104/306] Test --- src/cc/dapps/oraclefeed.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index f62c49a52..2355e46a2 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -329,7 +329,8 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a void komodobroadcast(char *acname,cJSON *hexjson) { - char *hexstr,*retstr; cJSON *retjson; + char *hexstr,*retstr,str[65]; cJSON *retjson; bits256 txid; + memset(txid.bytes,0,sizeof(txid)); if ( (hexstr= jstr(hexjson,"hex")) != 0 ) { if ( (retjson= get_komodocli(&retstr,acname,"sendrawtransaction",hexstr,"","")) != 0 ) @@ -339,10 +340,16 @@ void komodobroadcast(char *acname,cJSON *hexjson) } else if ( retstr != 0 ) { - fprintf(stderr,"txid.(%s)\n",retstr); + if ( strlen(retstr) >= 64 ) + { + retstr[64] = 0; + decode_hex(txid.bytes,32,retstr); + } + fprintf(stderr,"txid.(%s)\n",bits256_str(str,txid)); free(retstr); } } + return(txid); } int32_t get_KMDheight() @@ -537,7 +544,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(60); + sleep(50); } return(0); } From f84fdb0c76fc8b40de42209eaa9943acc7d064c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:34:43 -1100 Subject: [PATCH 105/306] Test --- src/cc/dapps/oraclefeed.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 2355e46a2..199d3d5e4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -327,7 +327,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a return(retjson); } -void komodobroadcast(char *acname,cJSON *hexjson) +bits256 komodobroadcast(char *acname,cJSON *hexjson) { char *hexstr,*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); @@ -490,7 +490,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -522,10 +522,13 @@ int32_t main(int32_t argc,char **argv) if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) { //printf("data.(%s)\n",jprint(clijson2,0)); - komodobroadcast(acname,clijson2); + txid = komodobroadcast(acname,clijson2); + if ( bits256_nonz(txid) != 0 ) + { + prevheight = height; + printf("ht.%d <- %s\n",height,hexstr); + } free_json(clijson2); - prevheight = height; - printf("ht.%d <- %s\n",height,hexstr); } else if ( retstr2 != 0 ) { From f176fbbe505b7b5dc72f552f7e96c48f11bf2f4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:40:11 -1100 Subject: [PATCH 106/306] Test --- src/cc/dapps/oraclefeed.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 199d3d5e4..2dfe5e1c8 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -352,10 +352,10 @@ bits256 komodobroadcast(char *acname,cJSON *hexjson) return(txid); } -int32_t get_KMDheight() +int32_t get_KMDheight(char *acname) { cJSON *retjson; char *retstr; int32_t height=0; - if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) + if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); fprintf(stderr,"KMDheight.%d\n",height); @@ -363,7 +363,7 @@ int32_t get_KMDheight() } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); + fprintf(stderr,"get_KMDheight.(%s) error.(%s)\n",acname,retstr); free(retstr); } return(height); @@ -414,7 +414,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh { int32_t height = 0; char str[65]; if ( prevheight == 0 ) - height = get_KMDheight() - 20; + height = get_KMDheight("") - 20; else height = prevheight + 1; if ( height > 0 ) { @@ -490,7 +490,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -505,10 +505,11 @@ int32_t main(int32_t argc,char **argv) printf("only formats of L and Ihh are supported now\n"); return(-1); } + acheight = 0; while ( 1 ) { retstr = 0; - if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( acheight != get_KMDheight(acname) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { @@ -526,6 +527,7 @@ int32_t main(int32_t argc,char **argv) if ( bits256_nonz(txid) != 0 ) { prevheight = height; + acheight = get_KMDheight(acname); printf("ht.%d <- %s\n",height,hexstr); } free_json(clijson2); @@ -547,7 +549,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(50); + sleep(10); } return(0); } From 58173d2df018b6fe2619198a4c57f3ea94c7af5c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:41:13 -1100 Subject: [PATCH 107/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 2dfe5e1c8..ba8da8a35 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -358,7 +358,7 @@ int32_t get_KMDheight(char *acname) if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); - fprintf(stderr,"KMDheight.%d\n",height); + fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); free_json(retjson); } else if ( retstr != 0 ) From a69ea70d47f94cddb5f1083eade1e09f46f27582 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:42:21 -1100 Subject: [PATCH 108/306] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ba8da8a35..49fc06ec6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -509,8 +509,9 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( acheight != get_KMDheight(acname) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( acheight != (height= get_KMDheight(acname)) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { + acheight = height; if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Tue, 11 Sep 2018 07:45:40 -1100 Subject: [PATCH 109/306] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 49fc06ec6..521905e18 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -358,7 +358,7 @@ int32_t get_KMDheight(char *acname) if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); - fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); + //fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); free_json(retjson); } else if ( retstr != 0 ) @@ -551,6 +551,7 @@ int32_t main(int32_t argc,char **argv) free(retstr); } sleep(10); + // best check is for txid to not be in mempool, ie confirmed } return(0); } From 019206ff84d7594d29808484016c94a6f7b53073 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:14:18 -1100 Subject: [PATCH 110/306] Filter addassetinputs with signable addresses --- src/cc/CCassetstx.cpp | 6 +++++- src/cc/CCutils.cpp | 1 + src/cc/gateways.cpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 82623d4b9..a0f80dbc3 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -17,10 +17,11 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs) { - char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; + char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; @@ -32,6 +33,9 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK continue; if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { + Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); + if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strmp(destaddr,cp->unspendableaddr2) != 0 ) + continue; if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 3a448a92c..396b3211d 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -339,6 +339,7 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //if ( txid == cp->prevtxid ) // return(true); //fprintf(stderr,"process CC %02x\n",cp->evalcode); + cp->unspendableaddr2[0] = 0; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b98b95111..5b1201eae 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -17,10 +17,10 @@ /* prevent duplicate bindtxid and cointxid via mempool scan + baton from mempool for oracle assets vin selector needs to filter by signable vins -loop on merkle oracle string oracles */ From 32bf34f0ca8f586248be14e1e702a73977ab2f0d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:16:12 -1100 Subject: [PATCH 111/306] Test --- src/cc/CCassetstx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index a0f80dbc3..7d89c0216 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -34,7 +34,7 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); - if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strmp(destaddr,cp->unspendableaddr2) != 0 ) + if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { From 79d79ead57f0d69825341a971846795d38fe5adf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:43:49 -1100 Subject: [PATCH 112/306] Test --- src/cc/CCassetstx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 7d89c0216..cbf40d603 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -36,6 +36,7 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; + fprintf(stderr,"check %s %.8f\n",destaddr,(double)vintx.vout[vout].nValue/COIN); if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) From b1b5aa7a6f2ea348c9dc502b776b76c137db4c3c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:59:37 -1100 Subject: [PATCH 113/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5b1201eae..d4e755c8a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -656,7 +656,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -664,7 +664,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 23e0b80b6d5b64721645753a39e10835c613fec7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:17:13 -1100 Subject: [PATCH 114/306] Test --- src/cc/CCinclude.h | 10 ++++++---- src/cc/CCtx.cpp | 14 +++++++++++++- src/cc/CCutils.cpp | 19 ++++++++++++++++++- src/cc/gateways.cpp | 17 +++++++---------- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index afc113083..4beb722a1 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -67,12 +67,12 @@ struct CC_utxo struct CCcontract_info { uint256 prevtxid; - char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64]; - uint8_t CCpriv[32],unspendablepriv2[32]; - CPubKey unspendablepk2; + char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64],unspendableaddr3[64]; + uint8_t CCpriv[32],unspendablepriv2[32],unspendablepriv3[32]; + CPubKey unspendablepk2,unspendablepk3; bool (*validate)(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); bool (*ismyvin)(CScript const& scriptSig); - uint8_t evalcode,evalcode2,didinit; + uint8_t evalcode,evalcode2,evalcode3,didinit; }; struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode); @@ -126,6 +126,8 @@ CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue,CPubKey pk); CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk,CPubKey pk2); CC *MakeCCcond1(uint8_t evalcode,CPubKey pk); CC* GetCryptoCondition(CScript const& scriptSig); +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); bool IsCCInput(CScript const& scriptSig); int32_t unstringbits(char *buf,uint64_t bits); uint64_t stringbits(char *str); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index c9196e951..b92879359 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -41,7 +41,7 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScrip std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) { 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; 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,*cond; CPubKey unspendablepk; + 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; 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(); for (i=0; ievalcode2,cp->unspendablepk2); cond = othercond2; } + else if ( strcmp(destaddr,cp->unspendableaddr3) == 0 ) + { + //fprintf(stderr,"matched %s unspendable3!\n",cp->unspendableaddr3); + privkey = cp->unspendablepriv3; + if ( othercond3 == 0 ) + othercond3 = MakeCCcond1(cp->evalcode3,cp->unspendablepk3); + cond = othercond3; + } else { fprintf(stderr,"vini.%d has unknown CC address.(%s)\n",i,destaddr); @@ -155,6 +163,10 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran cc_free(mycond); if ( othercond != 0 ) cc_free(othercond); + if ( othercond2 != 0 ) + cc_free(othercond2); + if ( othercond3 != 0 ) + cc_free(othercond3); std::string strHex = EncodeHexTx(mtx); if ( strHex.size() > 0 ) return(strHex); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 396b3211d..a91d6ffdd 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -169,6 +169,22 @@ CPubKey pubkey2pk(std::vector pubkey) return(pk); } +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode2 = evalcode; + cp->unspendablepk2 = pk; + memcpy(cp->unspendablepriv2,priv,32); + strcpy(cp->unspendableaddr2,coinaddr); +} + +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode3 = evalcode; + cp->unspendablepk3 = pk; + memcpy(cp->unspendablepriv3,priv,32); + strcpy(cp->unspendableaddr3,coinaddr); +} + bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) { CTxDestination address; txnouttype whichType; @@ -339,7 +355,8 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //if ( txid == cp->prevtxid ) // return(true); //fprintf(stderr,"process CC %02x\n",cp->evalcode); - cp->unspendableaddr2[0] = 0; + cp->evalcode2 = cp->evalcode3 = 0; + cp->unspendableaddr2[0] = cp->unspendableaddr3[0] = 0; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d4e755c8a..53abb345e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -619,20 +619,17 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); - memcpy(cp->unspendablepriv2,cp->CCpriv,32); - assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; - assetscp->unspendablepk2 = gatewayspk; - cp->unspendablepk2 = gatewayspk; - memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); - strcpy(assetscp->unspendableaddr2,cp->unspendableaddr2); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,cp->unspendableCCaddr); + Myprivkey(mypriv); + _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); + CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -656,7 +653,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -664,7 +661,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From dfac32e4e193101267b784bbacf52271e843a995 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:22:11 -1100 Subject: [PATCH 115/306] Test --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 53abb345e..990fd3815 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -626,7 +626,8 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,cp->unspendableCCaddr); + _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,coinaddr); Myprivkey(mypriv); _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); From b4df8470f3925ecf92854b781a1ce2e73c0b09c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:39:10 -1100 Subject: [PATCH 116/306] Test --- src/cc/gateways.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 990fd3815..ed4b7118a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -19,8 +19,6 @@ prevent duplicate bindtxid and cointxid via mempool scan baton from mempool for oracle -assets vin selector needs to filter by signable vins - string oracles */ @@ -466,6 +464,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { + fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) @@ -596,11 +595,11 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: } if ( merkleroot == zeroid || m < n/2 ) { - uint256 tmp; - decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); - merkleroot = revuint256(tmp); + //uint256 tmp; + //decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); + //merkleroot = revuint256(tmp); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); - //return(""); + return(""); } if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,destpub) != amount ) { From 3a4fdc168949a6cbb1e17831873ac5ef1cc59dd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:39:48 -1100 Subject: [PATCH 117/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index ed4b7118a..1c6593520 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -464,7 +464,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); + char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) From 87904dc9ad9afdcfe51bb7af1360537003e71a2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:41:40 -1100 Subject: [PATCH 118/306] Test --- src/cc/gateways.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 1c6593520..37f8f84ba 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -574,11 +574,6 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } - if ( GatewaysCointxidExists(cp,cointxid) != 0 ) - { - fprintf(stderr,"cointxid.%s already exists\n",uint256_str(str,cointxid)); - return(""); - } n = (int32_t)pubkeys.size(); merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:44:22 -1100 Subject: [PATCH 119/306] Test --- src/cc/gateways.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 37f8f84ba..f4d67ef54 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -462,9 +462,10 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u { CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; txid = zeroid; + char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); + fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) @@ -557,7 +558,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector pubkeys,publishers; std::vectortxids; char str[65],depositaddr[64],txidaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector pubkeys,publishers; std::vectortxids; char str[67],depositaddr[64],txidaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -578,6 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:45:22 -1100 Subject: [PATCH 120/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index f4d67ef54..e711c0997 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -579,7 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:46:24 -1100 Subject: [PATCH 121/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index e711c0997..cabb2e2c0 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -579,7 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:54:31 -1100 Subject: [PATCH 122/306] Test --- src/cc/oracles.cpp | 51 ++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 82e1d4ab0..a8f6bd13a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -276,6 +276,30 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora return(batontxid); } +uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) +{ + std::vector > unspentOutputs; + CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + rettxid = zeroid; + cp = CCinit(&C,EVAL_ORACLES); + CCtxidaddr(markeraddr,reforacletxid); + SetCCunspents(unspentOutputs,markeraddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + height = (int32_t)it->second.blockHeight; + if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk && height > maxheight ) + { + maxheight = height; + rettxid = txid; + } + } + } + return(rettxid); +} + int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen) { char _str[65]; int32_t sflag = 0,i,val32,len = 0,slen = 0,dlen = 0; uint32_t uval32; uint16_t uval16; int16_t val16; int64_t val = 0; uint64_t uval = 0; @@ -477,33 +501,6 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * return(0); } -uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) -{ - std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; - rettxid = zeroid; - cp = CCinit(&C,EVAL_ORACLES); - CCtxidaddr(markeraddr,reforacletxid); - SetCCunspents(unspentOutputs,markeraddr); - for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) - { - txid = it->first.txhash; - //ht = (int32_t)it->second.blockHeight; - if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) - { - if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk ) - { - if ( oracle_format(&hash,&ht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && ht > maxheight ) - { - maxheight = ht; - rettxid = txid; - } - } - } - } - return(rettxid); -} - int64_t IsOraclesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; From 1410c4c8bdf3769dfd91bed273280986a431c644 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:04:04 -1100 Subject: [PATCH 123/306] Test --- src/cc/oracles.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a8f6bd13a..8a6fef624 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -279,25 +279,25 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; - rettxid = zeroid; + CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); - CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; height = (int32_t)it->second.blockHeight; - if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) + if ( myGetTransaction(txid,regtx,hash) != 0 ) { - if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk && height > maxheight ) + if ( regtx.vout.size() > 0 && DecodeOraclesOpRet(regtx.vout[regtx.vout.size()-1].scriptPubKey,oracletxid,pk,datafee) == 'R' && oracletxid == reforacletxid && pk == refpk ) { - maxheight = height; - rettxid = txid; + Getscriptaddress(batonaddr,regtx.vout[1].scriptPubKey); + batontxid = OracleBatonUtxo(10000,cp,oracletxid,batonaddr,pk,data); + break; } } } - return(rettxid); + return(batontxid); } int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen) From ccf003ff1c568c862d400abd58400fa251f808ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:05:06 -1100 Subject: [PATCH 124/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 8a6fef624..c6fb58759 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -279,7 +279,7 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64],batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); SetCCunspents(unspentOutputs,markeraddr); From d91c603c7592e32e146741188ccdf53a723e0bda Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:12:25 -1100 Subject: [PATCH 125/306] Test --- src/cc/dapps/oraclefeed.c | 5 ++--- src/cc/oracles.cpp | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 521905e18..46c2a305b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -19,7 +19,6 @@ #include #include "cJSON.c" - char hexbyte(int32_t c) { c &= 0xf; @@ -452,9 +451,9 @@ int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *for for (i=0; i<4; i++) sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); for (i=0; i<32; i++) - sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[i]); + sprintf(&hexstr[8 + (31-i)*2],"%02x",blockhash.bytes[i]); for (i=0; i<32; i++) - sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[i]); + sprintf(&hexstr[8 + 64 + (31-i)*2],"%02x",merkleroot.bytes[i]); hexstr[8 + 64*2] = 0; return(height); } diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index c6fb58759..ba1b148c3 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -283,9 +283,11 @@ uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); SetCCunspents(unspentOutputs,markeraddr); + char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; + fprintf(stderr,"check %s\n",uint256_str(str,txid)); height = (int32_t)it->second.blockHeight; if ( myGetTransaction(txid,regtx,hash) != 0 ) { From e06ad50dda6fc56ba54283bc2560ca89ab0758a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:15:30 -1100 Subject: [PATCH 126/306] Test --- src/cc/oracles.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index ba1b148c3..506605248 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -282,6 +282,7 @@ uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64],batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); + CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) From 50dfc2240371a716226470316b3ba99475872c83 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:39:43 -1100 Subject: [PATCH 127/306] Baton for data from mempool --- src/cc/oracles.cpp | 21 +++++++++++++++++++-- src/cc/rewards.cpp | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 506605248..442da7a30 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -235,6 +235,21 @@ int64_t OracleDatafee(CScript &scriptPubKey,uint256 oracletxid,CPubKey publisher return(datafee); } +static uint256 myIs_baton_spentinmempool(uint256 batontxid,int32_t batonvout) +{ + BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) + { + const CTransaction &tx = e.GetTx(); + if ( tx.vout.size() > 0 && tx.vin.size() > 1 && batontxid == tx.vin[1].prevout.hash && batonvout == tx.vin[1].prevout.n ) + { + const uint256 &hash = tx.GetHash(); + char str[65]; fprintf(stderr,"found baton spent in mempool %s\n",uint256_str(str,txid)); + return(txid); + } + } + return(batontxid); +} + uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 reforacletxid,char *batonaddr,CPubKey publisher,std::vector &dataarg) { uint256 txid,oracletxid,hashBlock,btxid,batontxid = zeroid; int64_t dfee; int32_t dheight=0,vout,height,numvouts; CTransaction tx; CPubKey pk; uint8_t *ptr; std::vector vopret,data; @@ -273,6 +288,8 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora } } } + while ( myIsutxo_spentinmempool(batontxid,1) != 0 ) + batontxid = myIs_baton_spentinmempool(batontxid,1); return(batontxid); } @@ -284,11 +301,11 @@ uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) cp = CCinit(&C,EVAL_ORACLES); CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); - char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); + //char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; - fprintf(stderr,"check %s\n",uint256_str(str,txid)); + //fprintf(stderr,"check %s\n",uint256_str(str,txid)); height = (int32_t)it->second.blockHeight; if ( myGetTransaction(txid,regtx,hash) != 0 ) { diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 61f10418c..a70071af9 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -294,7 +294,7 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t return(true); } -uint64_t myIs_unlockedtx_inmempool(uint256 &txid,int32_t &vout,uint64_t refsbits,uint256 reffundingtxid,uint64_t needed) +static uint64_t myIs_unlockedtx_inmempool(uint256 &txid,int32_t &vout,uint64_t refsbits,uint256 reffundingtxid,uint64_t needed) { uint8_t funcid; uint64_t sbits,nValue; uint256 fundingtxid; char str[65]; memset(&txid,0,sizeof(txid)); From 4ad414194ff4adbdb0e7421ec3d7394bb17f01f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:40:56 -1100 Subject: [PATCH 128/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 442da7a30..4226a23cd 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -242,7 +242,7 @@ static uint256 myIs_baton_spentinmempool(uint256 batontxid,int32_t batonvout) const CTransaction &tx = e.GetTx(); if ( tx.vout.size() > 0 && tx.vin.size() > 1 && batontxid == tx.vin[1].prevout.hash && batonvout == tx.vin[1].prevout.n ) { - const uint256 &hash = tx.GetHash(); + const uint256 &txid = tx.GetHash(); char str[65]; fprintf(stderr,"found baton spent in mempool %s\n",uint256_str(str,txid)); return(txid); } From f2b287a693fde4ee71637ba9906a2dcbea90cdb1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:44:29 -1100 Subject: [PATCH 129/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 46c2a305b..73bd0d7a8 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -508,7 +508,7 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( acheight != (height= get_KMDheight(acname)) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { acheight = height; if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) From 76722d74003255e1b041abd89902b7fe1c957ba1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:46:21 -1100 Subject: [PATCH 130/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 73bd0d7a8..94ea2965c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -522,7 +522,7 @@ int32_t main(int32_t argc,char **argv) { if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) { - //printf("data.(%s)\n",jprint(clijson2,0)); + printf("data.(%s)\n",jprint(clijson2,0)); txid = komodobroadcast(acname,clijson2); if ( bits256_nonz(txid) != 0 ) { From c46ccfc3faab36d2807783d6841b3e7ae7c4ee14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:48:58 -1100 Subject: [PATCH 131/306] Test --- src/cc/oracles.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 4226a23cd..39f14293a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -802,8 +802,8 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk)); mtx.vout.push_back(CTxOut(datafee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data))); - } - } + } else fprint(stderr,"couldnt add normal inputs\n"); + } else fprintf(stderr,"couldnt add normal inputs\n"); return(""); } From e349a608ccedb4e6827d5f03babbb59256d9fbec Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:49:30 -1100 Subject: [PATCH 132/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 39f14293a..3c33b8e6e 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -802,7 +802,7 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk)); mtx.vout.push_back(CTxOut(datafee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data))); - } else fprint(stderr,"couldnt add normal inputs\n"); + } else fprintf(stderr,"couldnt add normal inputs\n"); } else fprintf(stderr,"couldnt add normal inputs\n"); return(""); } From 55e1d9dcdf28115c1d21eb1f9eadf27e3ff368f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:55:38 -1100 Subject: [PATCH 133/306] Test --- src/cc/CCtx.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index b92879359..98ae31f58 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -331,6 +331,7 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 { txid = out.tx->GetHash(); vout = out.i; + char str[65]; fprintf(stderr,"check %s/v%d\n",uint256_str(str,txid),vout); if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && vout < tx.vout.size() && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 ) { if ( mtx.vin.size() > 0 ) @@ -349,8 +350,10 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 if ( i != n ) continue; } + fprintf(stderr,"check in mempool\n"); if ( myIsutxo_spentinmempool(txid,vout) == 0 ) { + fprintf(stderr,"add to vins array.%d of %d\n",n,maxutxos); up = &utxos[n++]; up->txid = txid; up->nValue = out.tx->vout[out.i].nValue; From 6ea9a80b94d5bbe91fabe8f10846784f5053cca3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:59:41 -1100 Subject: [PATCH 134/306] Test --- src/cc/CCtx.cpp | 5 ++--- src/cc/oracles.cpp | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 98ae31f58..dd6269eb2 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -331,7 +331,6 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 { txid = out.tx->GetHash(); vout = out.i; - char str[65]; fprintf(stderr,"check %s/v%d\n",uint256_str(str,txid),vout); if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && vout < tx.vout.size() && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 ) { if ( mtx.vin.size() > 0 ) @@ -350,14 +349,13 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 if ( i != n ) continue; } - fprintf(stderr,"check in mempool\n"); if ( myIsutxo_spentinmempool(txid,vout) == 0 ) { - fprintf(stderr,"add to vins array.%d of %d\n",n,maxutxos); up = &utxos[n++]; up->txid = txid; up->nValue = out.tx->vout[out.i].nValue; up->vout = vout; + fprintf(stderr,"add %.8f to vins array.%d of %d\n",(double)up->nValue/COIN,n,maxutxos); if ( n >= maxutxos ) break; } @@ -390,6 +388,7 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 remains -= up->nValue; utxos[ind] = utxos[--n]; memset(&utxos[n],0,sizeof(utxos[n])); + fprintf(stderr,"totalinputs %.8f vs total %.8f i.%d vs max.%d\n",(double)totalinputs/COIN,(double)total/COIN,i,maxinputs); if ( totalinputs >= total || (i+1) >= maxinputs ) break; } diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 3c33b8e6e..3e63fbd75 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -787,14 +787,14 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da if ( txfee == 0 ) txfee = 10000; GetCCaddress(cp,coinaddr,mypk); - if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) // have enough funds even if baton utxo not there + if ( AddNormalinputs(mtx,mypk,2*txfee,16) > 0 ) // have enough funds even if baton utxo not there { batonpk = OracleBatonPk(batonaddr,cp); batontxid = OracleBatonUtxo(txfee,cp,oracletxid,batonaddr,mypk,prevdata); if ( batontxid != zeroid ) // not impossible to fail, but hopefully a very rare event mtx.vin.push_back(CTxIn(batontxid,1,CScript())); else fprintf(stderr,"warning: couldnt find baton utxo %s\n",batonaddr); - if ( (inputs= AddOracleInputs(cp,mtx,mypk,datafee,60)) > 0 ) + if ( (inputs= AddOracleInputs(cp,mtx,mypk,datafee,40)) > 0 ) { if ( inputs > datafee ) CCchange = (inputs - datafee); From c5c1aaa1dccba096b049d4be0702e44c3def3ee6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:59:51 -1100 Subject: [PATCH 135/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 3e63fbd75..01d62ccf5 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -787,7 +787,7 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da if ( txfee == 0 ) txfee = 10000; GetCCaddress(cp,coinaddr,mypk); - if ( AddNormalinputs(mtx,mypk,2*txfee,16) > 0 ) // have enough funds even if baton utxo not there + if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) // have enough funds even if baton utxo not there { batonpk = OracleBatonPk(batonaddr,cp); batontxid = OracleBatonUtxo(txfee,cp,oracletxid,batonaddr,mypk,prevdata); From 4b19e1904e71a0ef2300c6a30d200ba44be23f7b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:06:41 -1100 Subject: [PATCH 136/306] Test --- src/cc/CCtx.cpp | 5 ++++- src/cc/oracles.cpp | 13 +++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index dd6269eb2..9b873dcc1 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -355,7 +355,7 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 up->txid = txid; up->nValue = out.tx->vout[out.i].nValue; up->vout = vout; - fprintf(stderr,"add %.8f to vins array.%d of %d\n",(double)up->nValue/COIN,n,maxutxos); + //fprintf(stderr,"add %.8f to vins array.%d of %d\n",(double)up->nValue/COIN,n,maxutxos); if ( n >= maxutxos ) break; } @@ -394,7 +394,10 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 } free(utxos); if ( totalinputs >= total ) + { + fprintf(stderr,"return totalinputs %.8f\n",(double)totalinputs/COIN); return(totalinputs); + } #endif return(0); } diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 01d62ccf5..41081f331 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -523,10 +523,10 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * int64_t IsOraclesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { - char destaddr[64]; + //char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 )// && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) + //if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) return(tx.vout[v].nValue); } return(0); @@ -669,6 +669,7 @@ int64_t AddOracleInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub { txid = it->first.txhash; vout = (int32_t)it->first.index; + char str[65]; fprintf(stderr,"oracle check %s/v%d\n",uint256_str(str,txid),vout); if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { // get valid CC payments @@ -681,8 +682,8 @@ int64_t AddOracleInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub n++; if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) break; - } - } + } else fprintf(stderr,"nValue %.8f or utxo memspent\n",(double)nValue/COIN); + } else fprintf(stderr,"couldnt find transaction\n"); } return(totalinputs); } @@ -794,7 +795,7 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da if ( batontxid != zeroid ) // not impossible to fail, but hopefully a very rare event mtx.vin.push_back(CTxIn(batontxid,1,CScript())); else fprintf(stderr,"warning: couldnt find baton utxo %s\n",batonaddr); - if ( (inputs= AddOracleInputs(cp,mtx,mypk,datafee,40)) > 0 ) + if ( (inputs= AddOracleInputs(cp,mtx,mypk,datafee,60)) > 0 ) { if ( inputs > datafee ) CCchange = (inputs - datafee); @@ -802,7 +803,7 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk)); mtx.vout.push_back(CTxOut(datafee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data))); - } else fprintf(stderr,"couldnt add normal inputs\n"); + } else fprintf(stderr,"couldnt add oracle inputs\n"); } else fprintf(stderr,"couldnt add normal inputs\n"); return(""); } From 7fb5e4aa6f2303fe198c42e54210d3602fe76d4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:11:24 -1100 Subject: [PATCH 137/306] -print --- src/cc/CCtx.cpp | 4 ++-- src/cc/oracles.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 9b873dcc1..50bb9616f 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -388,14 +388,14 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 remains -= up->nValue; utxos[ind] = utxos[--n]; memset(&utxos[n],0,sizeof(utxos[n])); - fprintf(stderr,"totalinputs %.8f vs total %.8f i.%d vs max.%d\n",(double)totalinputs/COIN,(double)total/COIN,i,maxinputs); + //fprintf(stderr,"totalinputs %.8f vs total %.8f i.%d vs max.%d\n",(double)totalinputs/COIN,(double)total/COIN,i,maxinputs); if ( totalinputs >= total || (i+1) >= maxinputs ) break; } free(utxos); if ( totalinputs >= total ) { - fprintf(stderr,"return totalinputs %.8f\n",(double)totalinputs/COIN); + //fprintf(stderr,"return totalinputs %.8f\n",(double)totalinputs/COIN); return(totalinputs); } #endif diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 41081f331..7a5f38c00 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -243,7 +243,7 @@ static uint256 myIs_baton_spentinmempool(uint256 batontxid,int32_t batonvout) if ( tx.vout.size() > 0 && tx.vin.size() > 1 && batontxid == tx.vin[1].prevout.hash && batonvout == tx.vin[1].prevout.n ) { const uint256 &txid = tx.GetHash(); - char str[65]; fprintf(stderr,"found baton spent in mempool %s\n",uint256_str(str,txid)); + //char str[65]; fprintf(stderr,"found baton spent in mempool %s\n",uint256_str(str,txid)); return(txid); } } @@ -669,7 +669,7 @@ int64_t AddOracleInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub { txid = it->first.txhash; vout = (int32_t)it->first.index; - char str[65]; fprintf(stderr,"oracle check %s/v%d\n",uint256_str(str,txid),vout); + //char str[65]; fprintf(stderr,"oracle check %s/v%d\n",uint256_str(str,txid),vout); if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { // get valid CC payments From b2da43cf03c4e839854dd220b9dfca5b5bc0067f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:15:17 -1100 Subject: [PATCH 138/306] Test --- src/cc/oracles.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 7a5f38c00..a74871d8a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -554,8 +554,8 @@ bool OraclesDataValidate(struct CCcontract_info *cp,Eval* eval,const CTransactio else { //fprintf(stderr,"vini.%d check hash and vout\n",i); - if ( hashBlock == zerohash ) - return eval->Invalid("cant Oracles from mempool"); + //if ( hashBlock == zerohash ) + // return eval->Invalid("cant Oracles from mempool"); if ( (assetoshis= IsOraclesvout(cp,vinTx,tx.vin[i].prevout.n)) != 0 ) { if ( i == 1 && vinTx.vout[1].scriptPubKey != tx.vout[1].scriptPubKey ) From 5b7e795919caa662d53f30a2b3fec784c4301d6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:21:23 -1100 Subject: [PATCH 139/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a74871d8a..bee27bffa 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -682,7 +682,7 @@ int64_t AddOracleInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub n++; if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) break; - } else fprintf(stderr,"nValue %.8f or utxo memspent\n",(double)nValue/COIN); + } //else fprintf(stderr,"nValue %.8f or utxo memspent\n",(double)nValue/COIN); } else fprintf(stderr,"couldnt find transaction\n"); } return(totalinputs); From 4084a149ed5490a732f70a022d6438ab47302d82 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:21:58 -1100 Subject: [PATCH 140/306] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index bee27bffa..c24ad5a8b 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -803,7 +803,7 @@ std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector da mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,batonpk)); mtx.vout.push_back(CTxOut(datafee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesData('D',oracletxid,batontxid,mypk,data))); - } else fprintf(stderr,"couldnt add oracle inputs\n"); + } else fprintf(stderr,"couldnt find enough oracle inputs, limit 1 per utxo\n"); } else fprintf(stderr,"couldnt add normal inputs\n"); return(""); } From 3420554d5c190bc980b8549e443bb55420916fe8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:39:13 -1100 Subject: [PATCH 141/306] Test --- src/cc/dapps/oraclefeed.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 94ea2965c..c8df5ead6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -508,9 +508,8 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( acheight < (get_KMDheight(acname) - 10) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { - acheight = height; if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 01:47:58 -1100 Subject: [PATCH 142/306] Fix oracle feed --- src/cc/dapps/oraclefeed.c | 10 +++++----- src/cc/gateways.cpp | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index c8df5ead6..19c7f140c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -432,7 +432,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *format) { - uint32_t i,height; uint64_t price; bits256 blockhash,merkleroot; + int32_t i; uint32_t height; uint64_t price; bits256 blockhash,merkleroot; hexstr[0] = 0; if ( format[0] == 'L' || format[0] == 'l' ) { @@ -450,10 +450,10 @@ int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *for { for (i=0; i<4; i++) sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); - for (i=0; i<32; i++) - sprintf(&hexstr[8 + (31-i)*2],"%02x",blockhash.bytes[i]); - for (i=0; i<32; i++) - sprintf(&hexstr[8 + 64 + (31-i)*2],"%02x",merkleroot.bytes[i]); + for (i=31; i>=0; i--) + sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[31-i]); + for (i=31; i>=0; i--) + sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[31-i]); hexstr[8 + 64*2] = 0; return(height); } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cabb2e2c0..4a1a5ea73 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -108,6 +108,9 @@ string oracles ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 -> 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 + to get the merkleroots onchain, from the multisig signers nodes run the oraclefeed program with acname oracletxid pubkey Ihh + ./oraclefeed AT5 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 Ihh + gatewaysclaim bindtxid coin deposittxid destpub amount ./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 */ From 156daf14759b846b1671af39c164d6fe424a6398 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:49:08 -1100 Subject: [PATCH 143/306] Test --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 19c7f140c..219f2d391 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -451,9 +451,9 @@ int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *for for (i=0; i<4; i++) sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); for (i=31; i>=0; i--) - sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[31-i]); + sprintf(&hexstr[8 + (31-i)*2],"%02x",blockhash.bytes[i]); for (i=31; i>=0; i--) - sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[31-i]); + sprintf(&hexstr[8 + 64 + (31-i)*2],"%02x",merkleroot.bytes[i]); hexstr[8 + 64*2] = 0; return(height); } From 02df0dce6fb38563dd90af6d759b2f0740dec785 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 01:57:51 -1100 Subject: [PATCH 144/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- src/cc/gateways.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 219f2d391..bd044ab62 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -508,7 +508,7 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( acheight < (get_KMDheight(acname) - 10) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( prevheight < (get_KMDheight("") - 10) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 4a1a5ea73..507e594ad 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -17,7 +17,6 @@ /* prevent duplicate bindtxid and cointxid via mempool scan - baton from mempool for oracle string oracles */ From 3f4351c9fb692cde3729cc280bc6b30ca754d176 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 02:30:51 -1100 Subject: [PATCH 145/306] gatewayswithdraw roc --- src/cc/gateways.cpp | 15 ++++++++++++--- src/wallet/rpcwallet.cpp | 21 +++++++++++---------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 507e594ad..c773674db 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -17,7 +17,11 @@ /* prevent duplicate bindtxid and cointxid via mempool scan - + wait for notarization for oraclefeed and validation of gatewaysdeposit + gatewayswithdraw + + validation + string oracles */ @@ -682,6 +686,11 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); + _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,coinaddr); + Myprivkey(mypriv); + _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); + CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -692,16 +701,16 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } - if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 ) + if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) { if ( (inputs= AddAssetInputs(assetscp,mtx,mypk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,gatewayspk)); + mtx.vout.push_back(CTxOut(txfee,CScript() << withdrawpub << OP_CHECKSIG)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); - mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(withdrawpub)) << OP_CHECKSIG)); return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 4fb3f8beb..aa29b7c46 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5462,13 +5462,6 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) amount = atof((char *)params[8].get_str().c_str()) * COIN; if ( amount <= 0 || claimvout < 0 ) throw runtime_error("invalid param: amount, numpks or claimvout\n"); - /*for (i=0; i 0 ) { @@ -5482,7 +5475,7 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); std::string hex,coin; uint256 bindtxid,deposittxid; std::vectordestpub; int64_t amount; if ( fHelp || params.size() != 5 ) - throw runtime_error("gatewaysclaim bindtxid coin deposittxid redeemscript amount\n"); + throw runtime_error("gatewaysclaim bindtxid coin deposittxid destpub amount\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"); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); @@ -5501,8 +5494,16 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) UniValue gatewayswithdraw(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex; - // std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) + UniValue result(UniValue::VOBJ); uint256 bindtxid; int64_t amount; std::string hex,coin; std::vector withdrawpub; + if ( fHelp || params.size() != 5 ) + throw runtime_error("gatewayswithdraw bindtxid coin withdrawpub amount\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"); + bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + coin = params[1].get_str(); + withdrawpub = ParseHex(params[2].get_str()); + amount = atof((char *)params[3].get_str().c_str()) * COIN; + hex = GatewaysWithdraw(0,bindtxid,coin,withdrawpub,amount); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From f978cd481657be744d9d75ccce1459ef1caacb36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 02:32:09 -1100 Subject: [PATCH 146/306] Fix --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index c773674db..09ae1dd7b 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -679,7 +679,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) From 9d860bd978950e681db874d6870011acd326e81b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 02:36:00 -1100 Subject: [PATCH 147/306] Fix --- src/cc/gateways.cpp | 6 ++++++ src/wallet/rpcwallet.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 09ae1dd7b..9cfe9c4c9 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -116,6 +116,12 @@ string oracles gatewaysclaim bindtxid coin deposittxid destpub amount ./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 + + now the asset is in the pubkey's asset address! + it can be used, traded freely and any node who has the asset can do a gatewayswithdraw + + gatewayswithdraw bindtxid coin withdrawpub amount + ./c gatewayswithdraw e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828 1 */ // start of consensus code diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index aa29b7c46..df2edee04 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5495,7 +5495,7 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) UniValue gatewayswithdraw(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); uint256 bindtxid; int64_t amount; std::string hex,coin; std::vector withdrawpub; - if ( fHelp || params.size() != 5 ) + if ( fHelp || params.size() != 4 ) throw runtime_error("gatewayswithdraw bindtxid coin withdrawpub amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); From 5955955d188f063f9375f2ee4a054ad9f233bd89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:49:09 -1100 Subject: [PATCH 148/306] gatewayspending --- src/cc/CCGateways.h | 1 + src/cc/gateways.cpp | 98 +++++++++++++++++++++++++++++++++++++--- src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/wallet/rpcwallet.cpp | 12 +++++ 5 files changed, 107 insertions(+), 6 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index b7c653ef3..e7ab74601 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -25,6 +25,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); +UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 9cfe9c4c9..df51e57bc 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -16,7 +16,7 @@ #include "CCGateways.h" /* - prevent duplicate bindtxid and cointxid via mempool scan + prevent duplicate bindtxid via mempool scan wait for notarization for oraclefeed and validation of gatewaysdeposit gatewayswithdraw @@ -122,8 +122,19 @@ string oracles gatewayswithdraw bindtxid coin withdrawpub amount ./c gatewayswithdraw e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 03b7621b44118017a16043f19b30cc8a4cfe068ac4e42417bae16ba460c80f3828 1 + ef3cc452da006eb2edda6b6ed3d3347664be51260f3e91f59ec44ec9701367f0 + + Now there is a withdraw pending, so it needs to be processed by the signing nodes on the KMD side */ + +int32_t GatewaysAddQueue(std::string coin,uint256 txid,CScript scriptPubKey,int64_t nValue) +{ + char destaddr[64],str[65]; + GetScriptAddress(destaddr,scriptPubKey); + fprintf(stderr,"GatewaysAddQueue: %s %s %s %.8f\n",coin.c_str(),uint256_str(str,txid),destaddr,(double)nValue/COIN); +} + // start of consensus code CScript EncodeGatewaysBindOpRet(uint8_t funcid,std::string coin,uint256 tokenid,int64_t totalsupply,uint256 oracletxid,uint8_t M,uint8_t N,std::vector pubkeys,uint8_t taddr,uint8_t prefix,uint8_t prefix2) @@ -318,18 +329,40 @@ int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 return(0); } +static int32_t myIs_coinaddr_inmempoolvout(char *coinaddr) +{ + int32_t i,n; char destaddr[64]; + BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) + { + const CTransaction &tx = e.GetTx(); + if ( (n= tx.vout.size()) > 0 ) + { + const uint256 &txid = tx.GetHash(); + for (i=0; i > addressIndex; CCtxidaddr(txidaddr,cointxid); - fprintf(stderr," txidaddr.(%s) need to scan mempool also\n",txidaddr); SetCCtxids(addressIndex,txidaddr); for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) { return(-1); } - return(0); + return(myIs_coinaddr_inmempoolvout(txidaddr)); } UniValue GatewaysInfo(uint256 bindtxid) @@ -707,7 +740,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } - if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) + if ( AddNormalinputs(mtx,mypk,3*txfee,3) > 0 ) { if ( (inputs= AddAssetInputs(assetscp,mtx,mypk,assetid,amount,60)) > 0 ) { @@ -715,6 +748,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin CCchange = (inputs - amount); mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,gatewayspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << withdrawpub << OP_CHECKSIG)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); @@ -724,6 +758,58 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin return(""); } -// withdrawtxid used on external chain to create baton address, its existence in mempool (along with the withdraw) proof that the withdraw is pending - +UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid) +{ + UniValue result(UniValue::VOBJ),pending(UniValue:VARR),obj(UniValue:VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,(i=0; i > unspentOutputs; + cp = CCinit(&C,EVAL_GATEWAYS); + mypk = pubkey2pk(Mypubkey()); + gatewayspk = GetUnspendable(cp,0); + _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); + if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) + { + fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + return(result); + } + if ( DecodeGatewaysBindOpRet(depositaddr,tx.vout[numvouts-1].scriptPubKey,coin,assetid,totalsupply,oracletxid,M,N,msigpubkeys,taddr,prefix,prefix2) != 'B' || coin != refcoin ) + { + fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); + return(result); + } + n = msigpubkeys.size(); + queueflag = 0; + for (i=0; i >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + if ( GetTransaction(txid,tx,hashBlock,false) != 0 ) + { + Getscriptaddress(destaddr,tx.vout[0].scriptPubKey); + Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); + if ( strcmp(destaddr,coinaddr) == 0 ) + { + obj.push_back("txid",uint256_str(str,txid)); + obj.push_back("withdrawaddr",withaddr); + sprintf(numstr,"%.8f",(double)tx.vout[0].nValue/COIN); + obj.push_back("amount",numstr); + pending.push_back(obj); + if ( queueflag != 0 ) + numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); + } + } + } + result.push_back(Pair("coin",refcoin)); + result.push_back(Pair("pending",pending)); + result.push_back(Pair("queueflag",queueflag)); + return(result); +} diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index ee1d51568..49b7d529c 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -417,6 +417,7 @@ static const CRPCCommand vRPCCommands[] = { "gateways", "gatewaysdeposit", &gatewaysdeposit, true }, { "gateways", "gatewaysclaim", &gatewaysclaim, true }, { "gateways", "gatewayswithdraw", &gatewayswithdraw, true }, + { "gateways", "gatewayspending", &gatewayspending, true }, /* dice */ { "dice", "dicelist", &dicelist, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 0061956ba..bb3266881 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -242,6 +242,7 @@ extern UniValue gatewaysbind(const UniValue& params, bool fHelp); extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp); extern UniValue gatewaysclaim(const UniValue& params, bool fHelp); extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); +extern UniValue gatewayspending(const UniValue& params, bool fHelp); extern UniValue channelsinfo(const UniValue& params, bool fHelp); extern UniValue channelsbind(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index df2edee04..eee5e0594 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5512,6 +5512,18 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp) return(result); } +UniValue gatewayspending(const UniValue& params, bool fHelp) +{ + uint256 bindtxid; std::string coin; + if ( fHelp || params.size() != 2 ) + throw runtime_error("gatewayspending bindtxid coin\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"); + bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + coin = params[1].get_str(); + return(GatewaysPendingWithdraws(bindtxid,coin)); +} + UniValue oracleslist(const UniValue& params, bool fHelp) { if ( fHelp || params.size() > 0 ) From d8c4018c888417270709c702b11ae36a3c6be2d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:50:16 -1100 Subject: [PATCH 149/306] : --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index df51e57bc..0e5c067d0 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -760,7 +760,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid) { - UniValue result(UniValue::VOBJ),pending(UniValue:VARR),obj(UniValue:VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,(i=0; i msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,(i=0; i > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); From 4f61de87de1c75e57bceba6b3495acb18127e834 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:51:22 -1100 Subject: [PATCH 150/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 0e5c067d0..09aea55cf 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -797,10 +797,10 @@ UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid) Getscriptaddress(withaddr,tx.vout[1].scriptPubKey); if ( strcmp(destaddr,coinaddr) == 0 ) { - obj.push_back("txid",uint256_str(str,txid)); - obj.push_back("withdrawaddr",withaddr); + obj.push_back(Pair("txid",uint256_str(str,txid))); + obj.push_back(Pair("withdrawaddr",withaddr)); sprintf(numstr,"%.8f",(double)tx.vout[0].nValue/COIN); - obj.push_back("amount",numstr); + obj.push_back(Pair("amount",numstr)); pending.push_back(obj); if ( queueflag != 0 ) numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); From 339c931241bbc3be8ce345b8c598276e87d2350d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:52:15 -1100 Subject: [PATCH 151/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 09aea55cf..647c4445a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -760,7 +760,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid) { - UniValue result(UniValue::VOBJ),pending(UniValue:VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,(i=0; i msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); From d808ad8e74d8ed8ce08a93d44746968b04b74ce6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:54:53 -1100 Subject: [PATCH 152/306] Test --- src/cc/gateways.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 647c4445a..58289d61c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -131,7 +131,7 @@ string oracles int32_t GatewaysAddQueue(std::string coin,uint256 txid,CScript scriptPubKey,int64_t nValue) { char destaddr[64],str[65]; - GetScriptAddress(destaddr,scriptPubKey); + Getscriptaddress(destaddr,scriptPubKey); fprintf(stderr,"GatewaysAddQueue: %s %s %s %.8f\n",coin.c_str(),uint256_str(str,txid),destaddr,(double)nValue/COIN); } @@ -340,10 +340,10 @@ static int32_t myIs_coinaddr_inmempoolvout(char *coinaddr) const uint256 &txid = tx.GetHash(); for (i=0; i msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); From e3cd34a4d1d263f0a24c886397cf62e92806fc9e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 03:58:04 -1100 Subject: [PATCH 153/306] Test --- src/cc/CCGateways.h | 2 +- src/cc/gateways.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index e7ab74601..f0c094080 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -25,7 +25,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount); std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); -UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid); +UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 58289d61c..6450b3c90 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -125,6 +125,12 @@ string oracles ef3cc452da006eb2edda6b6ed3d3347664be51260f3e91f59ec44ec9701367f0 Now there is a withdraw pending, so it needs to be processed by the signing nodes on the KMD side + + gatewayspending bindtxid coin + gatewayspending will display all pending withdraws and if it is done on one of the msigpubkeys, then it will queue it for processing + ./c gatewayspending e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD + + */ @@ -758,7 +764,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin return(""); } -UniValue GatewaysPendingWithdraws(std::string refcoin,uint256 bindtxid) +UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; From 2d16b4dbe69acf0411bc3311b3fc328aa3bc1c6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 05:13:00 -1100 Subject: [PATCH 154/306] Test --- src/cc/gateways.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 6450b3c90..7f639d4ba 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -130,7 +130,6 @@ string oracles gatewayspending will display all pending withdraws and if it is done on one of the msigpubkeys, then it will queue it for processing ./c gatewayspending e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD - */ @@ -139,6 +138,13 @@ int32_t GatewaysAddQueue(std::string coin,uint256 txid,CScript scriptPubKey,int6 char destaddr[64],str[65]; Getscriptaddress(destaddr,scriptPubKey); fprintf(stderr,"GatewaysAddQueue: %s %s %s %.8f\n",coin.c_str(),uint256_str(str,txid),destaddr,(double)nValue/COIN); + // check queue to prevent duplicate + // check KMD chain and mempool for txidaddr + // if txidaddr exists properly, spend the marker (txid.2) + // create withdraw tx and sign it + // if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) + /// if not enough sigs, post partially signed to acname with marker2 + /// monitor marker2, for the partially signed withdraws } // start of consensus code @@ -766,7 +772,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { - UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); @@ -804,12 +810,14 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) if ( strcmp(destaddr,coinaddr) == 0 ) { obj.push_back(Pair("txid",uint256_str(str,txid))); + CCtxidaddr(txidaddr,txid); + obj.push_back(Pair("txidaddr",txidaddr)); obj.push_back(Pair("withdrawaddr",withaddr)); sprintf(numstr,"%.8f",(double)tx.vout[0].nValue/COIN); obj.push_back(Pair("amount",numstr)); pending.push_back(obj); - if ( queueflag != 0 ) - numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); + //if ( queueflag != 0 ) + // numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); } } } From 62f0cedd3c5e359805e772e0a240e8bb7f707bd1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 06:00:40 -1100 Subject: [PATCH 155/306] Test --- src/cc/dapps/oraclefeed.c | 73 +++++++++++++++++++++++++++++++++++++++ src/cc/gateways.cpp | 18 +++++----- 2 files changed, 81 insertions(+), 10 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index bd044ab62..9eaa40964 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -430,6 +430,78 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh return(0); } +cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) +{ + cJSON *retjson; char *retstr; int32_t height=0; + if ( (retjson= get_komodocli(&retstr,acname,"gatewayspending",oraclestxidstr,coin,"")) != 0 ) + { + return(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_gatewayspending.(%s) error.(%s)\n",acname,retstr); + free(retstr); + } + return(0); +} + +cJSON *get_rawmempool(char *acname) +{ + cJSON *retjson; char *retstr; int32_t height=0; + if ( (retjson= get_komodocli(&retstr,acname,"getrawmempool","","","")) != 0 ) + { + return(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_rawmempool.(%s) error.(%s)\n",acname,retstr); + free(retstr); + } + return(0); +} + +void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) +{ + // check queue to prevent duplicate + // check KMD chain and mempool for txidaddr + // if txidaddr exists properly, spend the marker (txid.2) + // create withdraw tx and sign it + // if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) + // if not enough sigs, post partially signed to acname with marker2 + // monitor marker2, for the partially signed withdraws + cJSON *retjson,*pending; char *coinstr,*txidaddr; int32_t i,n; + if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) + { + if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) + { + if ( (pending= jarray(&n,retjson,"pending")) != 0 ) + { + for (i=0; i msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; + UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; std::vector > unspentOutputs; cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); @@ -816,8 +809,13 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) sprintf(numstr,"%.8f",(double)tx.vout[0].nValue/COIN); obj.push_back(Pair("amount",numstr)); pending.push_back(obj); - //if ( queueflag != 0 ) - // numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); + if ( queueflag != 0 ) + { + obj.push_back(Pair("depositaddr",depositaddr)); + Getscriptaddress(signeraddr,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG); + obj.push_back(Pair("signeraddr",signeraddr)); + // numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); + } } } } From f602ac985c26f10fbcd2d7aa7e9b9f1aa0db37a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 06:06:02 -1100 Subject: [PATCH 156/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index efb1847cb..3f9ee501e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -808,7 +808,6 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) obj.push_back(Pair("withdrawaddr",withaddr)); sprintf(numstr,"%.8f",(double)tx.vout[0].nValue/COIN); obj.push_back(Pair("amount",numstr)); - pending.push_back(obj); if ( queueflag != 0 ) { obj.push_back(Pair("depositaddr",depositaddr)); @@ -816,6 +815,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) obj.push_back(Pair("signeraddr",signeraddr)); // numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); } + pending.push_back(obj); } } } From e5c8c5c8e850d8dc94e3ee3f3181258e5bcbda36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:34:50 -1100 Subject: [PATCH 157/306] Process deposits in oraclefeed.c --- src/cc/dapps/oraclefeed.c | 170 ++++++++++++++++++++++++++++++++++---- 1 file changed, 155 insertions(+), 15 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 9eaa40964..e367539a1 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -351,6 +351,29 @@ bits256 komodobroadcast(char *acname,cJSON *hexjson) return(txid); } +bits256 sendtoaddress(char *acname,char *destaddr,int64_t satoshis) +{ + char numstr[32],*retstr,str[65]; cJSON *retjson; bits256 txid; + memset(txid.bytes,0,sizeof(txid)); + sprintf(numstr,"%.8f",(double)satoshis/SATOSHIDEN); + if ( (retjson= get_komodocli(&retstr,acname,"sendrawtransaction",destaddr,numstr,"")) != 0 ) + { + fprintf(stderr,"unexpected sendrawtransaction json.(%s)\n",jprint(retjson,0)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + if ( strlen(retstr) >= 64 ) + { + retstr[64] = 0; + decode_hex(txid.bytes,32,retstr); + } + fprintf(stderr,"sendtoaddress %s %.8f txid.(%s)\n",destaddr,(double)satoshis/SATOSHIDEN,bits256_str(str,txid)); + free(retstr); + } + return(txid); +} + int32_t get_KMDheight(char *acname) { cJSON *retjson; char *retstr; int32_t height=0; @@ -432,7 +455,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) { - cJSON *retjson; char *retstr; int32_t height=0; + cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"gatewayspending",oraclestxidstr,coin,"")) != 0 ) { return(retjson); @@ -447,7 +470,7 @@ cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) cJSON *get_rawmempool(char *acname) { - cJSON *retjson; char *retstr; int32_t height=0; + cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"getrawmempool","","","")) != 0 ) { return(retjson); @@ -460,16 +483,112 @@ cJSON *get_rawmempool(char *acname) return(0); } +cJSON *get_addressutxos(char *acname,char *coinaddr) +{ + //kcli getaddressutxos "{\"addresses\":[\"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz\"]}" + cJSON *retjson; char *retstr,jsonbuf[256]; + sprintf(jsonbuf,"{\"addresses\":[\"%s\"]}",coinaddr); + if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) + { + return(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_addressutxos.(%s) error.(%s)\n",acname,retstr); + free(retstr); + } + return(0); +} + +cJSON *get_rawtransaction(char *acname,bits256 txid) +{ + //kcli getaddressutxos "{\"addresses\":[\"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz\"]}" + cJSON *retjson; char *retstr,str[65]; + sprintf(jsonbuf,"{\"addresses\":[\"%s\"]}",coinaddr); + if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) + { + return(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_rawtransaction.(%s) error.(%s)\n",acname,retstr); + free(retstr); + } + return(0); +} + +int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) +{ + cJSON *txobj,*vouts,*vout,*sobj,*addresses; char str[65]; int32_t i,j,n,numvouts,retval = 0; + if ( (txobj= get_rawtransaction(acname,txid)) != 0 ) + { + if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) + { + for (i=0; i 0 ) + { + num = 1; + break; + } + } + } + free_json(array); + } else return(-1); + } + return(num); +} + void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) { // check queue to prevent duplicate // check KMD chain and mempool for txidaddr // if txidaddr exists properly, spend the marker (txid.2) // create withdraw tx and sign it - // if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) - // if not enough sigs, post partially signed to acname with marker2 + /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) + /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending; char *coinstr,*txidaddr; int32_t i,n; + cJSON *retjson,*pending; char *coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) @@ -478,23 +597,44 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) { for (i=0; i","amount":0.0001},{"address":"","amount":}]' + txid = sendtoaddress(acname,txidaddr,10000); + if ( bits256_nonz(txid) != 0 && coinaddrexists(acname,txidaddr) > 0 ) + { + withtxid = sendtoaddress(strcmp("KMD",coin)==0?"":coin,withdrawaddr,withdrawamount); + if ( bits256_nonz(withtxid) != 0 ) + { + fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); + // spend txid.2 + processed++; + } + else + { + fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); + } + } } - else + else if ( retval > 0 ) { - // spend acname txid.2 + fprintf(stderr,"already did withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); + // spend txid.2 } + } } } } @@ -561,7 +701,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); From 3efac93c2636b2b6b64223e60837aa929b4bbfc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:37:43 -1100 Subject: [PATCH 158/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index e367539a1..28b1519a0 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -473,6 +473,7 @@ cJSON *get_rawmempool(char *acname) cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"getrawmempool","","","")) != 0 ) { + printf("mempool.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) @@ -490,6 +491,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) sprintf(jsonbuf,"{\"addresses\":[\"%s\"]}",coinaddr); if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) { + printf("addressutxos.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) @@ -502,9 +504,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) cJSON *get_rawtransaction(char *acname,bits256 txid) { - //kcli getaddressutxos "{\"addresses\":[\"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz\"]}" cJSON *retjson; char *retstr,str[65]; - sprintf(jsonbuf,"{\"addresses\":[\"%s\"]}",coinaddr); if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) { return(retjson); @@ -588,7 +588,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending; char *coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char *coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) From 2c37b55deba34c2c0a671f93fe4f84c21e79a7c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:39:22 -1100 Subject: [PATCH 159/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 28b1519a0..7c0dd953b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -519,7 +519,7 @@ cJSON *get_rawtransaction(char *acname,bits256 txid) int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) { - cJSON *txobj,*vouts,*vout,*sobj,*addresses; char str[65]; int32_t i,j,n,numvouts,retval = 0; + cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; if ( (txobj= get_rawtransaction(acname,txid)) != 0 ) { if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) @@ -588,7 +588,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char *coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) @@ -616,10 +616,10 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) txid = sendtoaddress(acname,txidaddr,10000); if ( bits256_nonz(txid) != 0 && coinaddrexists(acname,txidaddr) > 0 ) { - withtxid = sendtoaddress(strcmp("KMD",coin)==0?"":coin,withdrawaddr,withdrawamount); + withtxid = sendtoaddress(strcmp("KMD",coin)==0?"":coin,withdrawaddr,satoshis); if ( bits256_nonz(withtxid) != 0 ) { - fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); // spend txid.2 processed++; } From 5135f3f49fa6a5c4595d0a45ad24ee42fd0bf691 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:40:20 -1100 Subject: [PATCH 160/306] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 7c0dd953b..b944182dc 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -458,6 +458,7 @@ cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"gatewayspending",oraclestxidstr,coin,"")) != 0 ) { + printf("pending.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) @@ -625,7 +626,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) } else { - fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } } } From 2e1bceb4468e1bb2dd983ab104be39d0fe150f36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:42:54 -1100 Subject: [PATCH 161/306] Test --- src/cc/dapps/oraclefeed.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index b944182dc..0a63c1530 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -518,6 +518,12 @@ cJSON *get_rawtransaction(char *acname,bits256 txid) return(0); } +void gatewaystxid2(char *acname,bits256 txid) +{ + char str[65]; + printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,txid)); +} + int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) { cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; @@ -621,7 +627,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) if ( bits256_nonz(withtxid) != 0 ) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - // spend txid.2 + gatewaystxid2(acname,txid); processed++; } else @@ -632,8 +638,8 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) } else if ( retval > 0 ) { - fprintf(stderr,"already did withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withaddr,(double)satoshis/SATOSHIDEN); - // spend txid.2 + fprintf(stderr,"already did withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaystxid2(acname,txid); } } } From 847837949cb28117433de474f7977be510636e13 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:46:44 -1100 Subject: [PATCH 162/306] Test --- src/cc/dapps/oraclefeed.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 0a63c1530..dc0be07ef 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -702,22 +702,21 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 */ -//#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3" -//#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92" -//#define ACNAME "ORCL" +// ./a.out AT5 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 Ihh e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; - if ( argc != 5 ) + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; + if ( argc != 6 ) { - printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); return(-1); } acname = argv[1]; oraclestr = argv[2]; pkstr = argv[3]; format = argv[4]; + bindtxidstr = argv[5]; if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) { printf("only formats of L and Ihh are supported now\n"); @@ -747,7 +746,7 @@ int32_t main(int32_t argc,char **argv) prevheight = height; acheight = get_KMDheight(acname); printf("ht.%d <- %s\n",height,hexstr); - update_gatewayspending(acname,oraclestr,"KMD"); + update_gatewayspending(acname,bindtxidstr,"KMD"); } free_json(clijson2); } From 2468e05229e417837b601b99b7879b00f73b724d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:50:26 -1100 Subject: [PATCH 163/306] Test --- src/cc/dapps/oraclefeed.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index dc0be07ef..3437d3e52 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -598,8 +598,10 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { + //pending.({"coin":"KMD","pending":[{"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"}],"queueflag":1}) if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) { + printf("check pending\n"); if ( (pending= jarray(&n,retjson,"pending")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 07:54:17 -1100 Subject: [PATCH 164/306] Test --- src/cc/dapps/oraclefeed.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3437d3e52..ee67812b4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -595,13 +595,11 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*srcaddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { - //pending.({"coin":"KMD","pending":[{"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"}],"queueflag":1}) if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) { - printf("check pending\n"); if ( (pending= jarray(&n,retjson,"pending")) != 0 ) { for (i=0; i","amount":0.0001},{"address":"","amount":}]' txid = sendtoaddress(acname,txidaddr,10000); @@ -637,7 +627,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) { fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } - } + } else fprintf(stderr,"error sending txidaddr.%s -> %s exists.%d\n",txidaddr,bits256_str(str,txid),coinaddrexists(acname,txidaddr)); } else if ( retval > 0 ) { From e4207d456f42d3000e7c6a7203886aa72470fb1c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 07:56:22 -1100 Subject: [PATCH 165/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ee67812b4..01c3a3c7f 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -489,7 +489,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) { //kcli getaddressutxos "{\"addresses\":[\"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz\"]}" cJSON *retjson; char *retstr,jsonbuf[256]; - sprintf(jsonbuf,"{\"addresses\":[\"%s\"]}",coinaddr); + sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr); if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) { printf("addressutxos.(%s)\n",jprint(retjson,0)); From b2a18a1ad9fdb5d22dbdfa3088c71589e7835d30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:00:43 -1100 Subject: [PATCH 166/306] Test --- src/cc/dapps/oraclefeed.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 01c3a3c7f..038efcafb 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -506,7 +506,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) cJSON *get_rawtransaction(char *acname,bits256 txid) { cJSON *retjson; char *retstr,str[65]; - if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) + if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"true","")) != 0 ) { return(retjson); } @@ -529,6 +529,7 @@ int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; if ( (txobj= get_rawtransaction(acname,txid)) != 0 ) { + printf("rawtx.(%s)\n",jprint(txobj,0)); if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) { for (i=0; i %s exists.%d\n",txidaddr,bits256_str(str,txid),coinaddrexists(acname,txidaddr)); + } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(acname,txidaddr)); } else if ( retval > 0 ) { From 32cfe054ca028d91b396dfd8b0384aa8b08bbd6c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:02:50 -1100 Subject: [PATCH 167/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 038efcafb..ca30d1940 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -310,7 +310,8 @@ uint64_t get_btcusd() cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) { - long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,*fname = "/tmp/komodocli"; + long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,fname[256]; + sprintf(fname,"/tmp/oraclefeed.%s",method); if ( acname[0] != 0 ) sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); else sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); @@ -487,7 +488,6 @@ cJSON *get_rawmempool(char *acname) cJSON *get_addressutxos(char *acname,char *coinaddr) { - //kcli getaddressutxos "{\"addresses\":[\"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz\"]}" cJSON *retjson; char *retstr,jsonbuf[256]; sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr); if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) @@ -506,7 +506,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) cJSON *get_rawtransaction(char *acname,bits256 txid) { cJSON *retjson; char *retstr,str[65]; - if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"true","")) != 0 ) + if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) { return(retjson); } From cfdf7b6b5e5e19706e503f0ada5e4e123523f78c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:06:01 -1100 Subject: [PATCH 168/306] Test --- src/cc/dapps/oraclefeed.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ca30d1940..79038d6ea 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -357,7 +357,7 @@ bits256 sendtoaddress(char *acname,char *destaddr,int64_t satoshis) char numstr[32],*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); sprintf(numstr,"%.8f",(double)satoshis/SATOSHIDEN); - if ( (retjson= get_komodocli(&retstr,acname,"sendrawtransaction",destaddr,numstr,"")) != 0 ) + if ( (retjson= get_komodocli(&retstr,acname,"sendtoaddress",destaddr,numstr,"")) != 0 ) { fprintf(stderr,"unexpected sendrawtransaction json.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -529,7 +529,6 @@ int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; if ( (txobj= get_rawtransaction(acname,txid)) != 0 ) { - printf("rawtx.(%s)\n",jprint(txobj,0)); if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 08:10:51 -1100 Subject: [PATCH 169/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 79038d6ea..af516e285 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -345,7 +345,7 @@ bits256 komodobroadcast(char *acname,cJSON *hexjson) retstr[64] = 0; decode_hex(txid.bytes,32,retstr); } - fprintf(stderr,"txid.(%s)\n",bits256_str(str,txid)); + fprintf(stderr,"broadcast %s txid.(%s)\n",acname,bits256_str(str,txid)); free(retstr); } } @@ -475,7 +475,7 @@ cJSON *get_rawmempool(char *acname) cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"getrawmempool","","","")) != 0 ) { - printf("mempool.(%s)\n",jprint(retjson,0)); + //printf("mempool.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) @@ -610,7 +610,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { - if ( (retval= coinaddrexists(acname,txidaddr)) == 0 && (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 ) + if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists(acname,txidaddr)) == 0 ) { // this is less errors but more expensive: ./komodo-cli z_sendmany "signeraddr" '[{"address":"","amount":0.0001},{"address":"","amount":}]' txid = sendtoaddress(acname,txidaddr,10000); @@ -631,7 +631,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) } else if ( retval > 0 ) { - fprintf(stderr,"already did withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"already did withdraw %s %s %.8f processed\n",coin,withdrawaddr,(double)satoshis/SATOSHIDEN); gatewaystxid2(acname,txid); } } From 7f131476cac7ea475cd3b845c846ed1af3e7fa19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:12:42 -1100 Subject: [PATCH 170/306] Test --- src/cc/dapps/oraclefeed.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index af516e285..64d4b191f 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -492,7 +492,7 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr); if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) { - printf("addressutxos.(%s)\n",jprint(retjson,0)); + //printf("addressutxos.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) @@ -595,7 +595,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid,origtxid; int64_t satoshis; if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) @@ -607,6 +607,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) if ( processed != 0 ) // avoid out of utxo conditions break; item = jitem(pending,i); + origtxid = jbits256(item,"txid"); //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { @@ -620,7 +621,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) if ( bits256_nonz(withtxid) != 0 ) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaystxid2(acname,txid); + gatewaystxid2(acname,origtxid); processed++; } else @@ -632,7 +633,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) else if ( retval > 0 ) { fprintf(stderr,"already did withdraw %s %s %.8f processed\n",coin,withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaystxid2(acname,txid); + gatewaystxid2(acname,origtxid); } } } From 40542921b714071d65d71ead9bef6952291077c6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:13:09 -1100 Subject: [PATCH 171/306] Test --- src/cc/gateways.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3f9ee501e..969018312 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -18,7 +18,6 @@ /* prevent duplicate bindtxid via mempool scan wait for notarization for oraclefeed and validation of gatewaysdeposit - gatewayswithdraw validation From 11ce33e84f06f9b3963f35d891fda9bf39d6bff0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:27:40 -1100 Subject: [PATCH 172/306] Test --- src/cc/dapps/oraclefeed.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 64d4b191f..37da19101 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -518,10 +518,20 @@ cJSON *get_rawtransaction(char *acname,bits256 txid) return(0); } -void gatewaystxid2(char *acname,bits256 txid) +void gatewaysmarkdone(char *acname,bits256 txid) { - char str[65]; + char str[65],*retstr; cJSON *retjson; printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,txid)); + if ( (retjson= get_komodocli(&retstr,acname,"gatewaysmarkdone",bits256_str(str,txid),"","")) != 0 ) + { + komodobroadcast(acname,retjson); + free_json(retjson); + } + else if ( retstr != 0 ) + { + printf("error parsing gatewaysmarkdone.(%s)\n",retstr); + free(retstr); + } } int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) @@ -543,7 +553,7 @@ int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) addr = jstri(addresses,j); if ( strcmp(addr,coinaddr) == 0 ) { - fprintf(stderr,"found %s in %s v%d\n",coinaddr,bits256_str(str,txid),i); + //fprintf(stderr,"found %s in %s v%d\n",coinaddr,bits256_str(str,txid),i); retval = 1; } } @@ -617,6 +627,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) txid = sendtoaddress(acname,txidaddr,10000); if ( bits256_nonz(txid) != 0 && coinaddrexists(acname,txidaddr) > 0 ) { + // the actual withdraw withtxid = sendtoaddress(strcmp("KMD",coin)==0?"":coin,withdrawaddr,satoshis); if ( bits256_nonz(withtxid) != 0 ) { From 6bde696a3136716adaaa2a1eb69e15fbf5ad2ed6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:36:01 -1100 Subject: [PATCH 173/306] Gatewaysmarkdone --- src/cc/CCGateways.h | 1 + src/cc/dapps/oraclefeed.c | 4 ++-- src/cc/gateways.cpp | 11 +++++++++++ src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/wallet/rpcwallet.cpp | 17 +++++++++++++++++ 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index f0c094080..1d7bef9d5 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -26,6 +26,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); +std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 37da19101..fa67989bf 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -632,7 +632,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) if ( bits256_nonz(withtxid) != 0 ) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaystxid2(acname,origtxid); + gatewaysmarkdone(acname,origtxid); processed++; } else @@ -644,7 +644,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) else if ( retval > 0 ) { fprintf(stderr,"already did withdraw %s %s %.8f processed\n",coin,withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaystxid2(acname,origtxid); + gatewaysmarkdone(acname,origtxid); } } } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 969018312..b366db6ba 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -762,6 +762,17 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin return(""); } +std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid) +{ + CMutableTransaction mtx; CScript opret; + cp = CCinit(&C,EVAL_GATEWAYS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + mtx.vin.push_back(CTxIn(withdrawtxid,2,CScript())); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); +} + UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) { UniValue result(UniValue::VOBJ),pending(UniValue::VARR),obj(UniValue::VOBJ); CTransaction tx; std::string coin; CPubKey mypk,gatewayspk; std::vector msigpubkeys; uint256 hashBlock,assetid,txid,oracletxid; uint8_t M,N,taddr,prefix,prefix2; char depositaddr[64],withmarker[64],coinaddr[64],destaddr[64],str[65],withaddr[64],numstr[32],txidaddr[64],signeraddr[64]; int32_t i,n,numvouts,vout,numqueued,queueflag; int64_t totalsupply; struct CCcontract_info *cp,C; diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 49b7d529c..c4c8d378b 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -418,6 +418,7 @@ static const CRPCCommand vRPCCommands[] = { "gateways", "gatewaysclaim", &gatewaysclaim, true }, { "gateways", "gatewayswithdraw", &gatewayswithdraw, true }, { "gateways", "gatewayspending", &gatewayspending, true }, + { "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true }, /* dice */ { "dice", "dicelist", &dicelist, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index bb3266881..a697ee4ee 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -243,6 +243,7 @@ extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp); extern UniValue gatewaysclaim(const UniValue& params, bool fHelp); extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); extern UniValue gatewayspending(const UniValue& params, bool fHelp); +extern UniValue gatewaysmarkdone(const UniValue& params, bool fHelp); extern UniValue channelsinfo(const UniValue& params, bool fHelp); extern UniValue channelsbind(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index eee5e0594..d3825388c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5512,6 +5512,23 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp) return(result); } +UniValue gatewaysmarkdone(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint256 withdrawtxid; std::string hex; + if ( fHelp || params.size() != 1 ) + throw runtime_error("gatewaysmarkdone withdrawtxid\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"); + withdrawtxid = Parseuint256((char *)params[0].get_str().c_str()); + hex = GatewaysMarkdone(0,withdrawtxid); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt gatewaysmarkdone"); + return(result); +} + UniValue gatewayspending(const UniValue& params, bool fHelp) { uint256 bindtxid; std::string coin; From b31844cbb55ca6bb10906eff5b769190b6df1db3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:37:02 -1100 Subject: [PATCH 174/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b366db6ba..7590e9cfc 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -764,7 +764,7 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid) { - CMutableTransaction mtx; CScript opret; + CMutableTransaction mtx; CScript opret; CPubKey mypk; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; From 9f72c41af3300ea18252ff5dc94498e5b599a7c8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:51:23 -1100 Subject: [PATCH 175/306] Test --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7590e9cfc..f21ee7c03 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -767,9 +767,10 @@ std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid) CMutableTransaction mtx; CScript opret; CPubKey mypk; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) - txfee = 10000; + txfee = 5000; mypk = pubkey2pk(Mypubkey()); mtx.vin.push_back(CTxIn(withdrawtxid,2,CScript())); + mtx.vout.push_back(CTxOut(5000,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } From b9de8352c77b33ceca80e2b5709d5271a0d9b59b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 08:54:22 -1100 Subject: [PATCH 176/306] Verify gatewaysmarkdone --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index fa67989bf..8af31c2e4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -459,7 +459,7 @@ cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) cJSON *retjson; char *retstr; if ( (retjson= get_komodocli(&retstr,acname,"gatewayspending",oraclestxidstr,coin,"")) != 0 ) { - printf("pending.(%s)\n",jprint(retjson,0)); + //printf("pending.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) From db09c7f6274f74644cdcc9bfb6f72ff8fc7b7593 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 21:49:12 -1100 Subject: [PATCH 177/306] RECOIN_CLI in oraclefeed.c --- src/cc/dapps/oraclefeed.c | 138 ++++++++++++++++++++++---------------- src/cc/gateways.cpp | 1 + 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 8af31c2e4..6a0f7d30a 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -308,13 +308,25 @@ uint64_t get_btcusd() return(btcusd); } -cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) +char *REFCOIN_CLI; + +cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) { long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,fname[256]; sprintf(fname,"/tmp/oraclefeed.%s",method); if ( acname[0] != 0 ) + { + if ( refcoin[0] != 0 && strcmp(refcoin,"KMD") != 0 ) + printf("unexpected: refcoin.(%s) acname.(%s)\n",refcoin,acname); sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); - else sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); + } + else if ( strcmp(refcoin,"KMD") == 0 ) + sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); + else if ( REFCOIN_CLI != 0 && REFCOIN_CLI[0] != 0 ) + { + sprintf(cmdstr,"%s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,fname); + printf("REFCOIN_CLI (%s)\n",cmdstr); + } system(cmdstr); *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) @@ -327,13 +339,13 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a return(retjson); } -bits256 komodobroadcast(char *acname,cJSON *hexjson) +bits256 komodobroadcast(char *refcoin,char *acname,cJSON *hexjson) { char *hexstr,*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); if ( (hexstr= jstr(hexjson,"hex")) != 0 ) { - if ( (retjson= get_komodocli(&retstr,acname,"sendrawtransaction",hexstr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendrawtransaction",hexstr,"","")) != 0 ) { //fprintf(stderr,"broadcast.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -352,12 +364,12 @@ bits256 komodobroadcast(char *acname,cJSON *hexjson) return(txid); } -bits256 sendtoaddress(char *acname,char *destaddr,int64_t satoshis) +bits256 sendtoaddress(char *refcoin,char *acname,char *destaddr,int64_t satoshis) { char numstr[32],*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); sprintf(numstr,"%.8f",(double)satoshis/SATOSHIDEN); - if ( (retjson= get_komodocli(&retstr,acname,"sendtoaddress",destaddr,numstr,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendtoaddress",destaddr,numstr,"")) != 0 ) { fprintf(stderr,"unexpected sendrawtransaction json.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -375,36 +387,34 @@ bits256 sendtoaddress(char *acname,char *destaddr,int64_t satoshis) return(txid); } -int32_t get_KMDheight(char *acname) +int32_t get_coinheight(char *refcoin,char *acname) { cJSON *retjson; char *retstr; int32_t height=0; - if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockchaininfo","","","")) != 0 ) { height = jint(retjson,"blocks"); - //fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); free_json(retjson); } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDheight.(%s) error.(%s)\n",acname,retstr); + fprintf(stderr,"%s get_coinheight.(%s) error.(%s)\n",refcoin,acname,retstr); free(retstr); } return(height); } -bits256 get_KMDblockhash(int32_t height) +bits256 get_coinblockhash(char *refcoin,char *acname,int32_t height) { cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; memset(hash.bytes,0,sizeof(hash)); sprintf(heightstr,"%d",height); - if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockhash",heightstr,"","")) != 0 ) { fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); free_json(retjson); } else if ( retstr != 0 ) { - //fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) { retstr[64] = 0; @@ -415,11 +425,11 @@ bits256 get_KMDblockhash(int32_t height) return(hash); } -bits256 get_KMDmerkleroot(bits256 blockhash) +bits256 get_coinmerkleroot(char *refcoin,char *acname,bits256 blockhash) { cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; memset(merkleroot.bytes,0,sizeof(merkleroot)); - if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockheader",bits256_str(str,blockhash),"","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); //fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); @@ -427,24 +437,24 @@ bits256 get_KMDmerkleroot(bits256 blockhash) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr); + fprintf(stderr,"%s %s get_coinmerkleroot error.(%s)\n",refcoin,acname,retstr); free(retstr); } return(merkleroot); } -int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) +int32_t get_coinheader(char *refcoin,char *acname,bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) { int32_t height = 0; char str[65]; if ( prevheight == 0 ) - height = get_KMDheight("") - 20; + height = get_coinheight(refcoin,acname) - 20; else height = prevheight + 1; if ( height > 0 ) { - *blockhashp = get_KMDblockhash(height); + *blockhashp = get_coinblockhash(refcoin,acname,height); if ( bits256_nonz(*blockhashp) != 0 ) { - *merklerootp = get_KMDmerkleroot(*blockhashp); + *merklerootp = get_coinmerkleroot(refcoin,acname,*blockhashp); if ( bits256_nonz(*merklerootp) != 0 ) return(height); } @@ -454,26 +464,26 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh return(0); } -cJSON *get_gatewayspending(char *acname,char *oraclestxidstr,char *coin) +cJSON *get_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(&retstr,acname,"gatewayspending",oraclestxidstr,coin,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspending",oraclestxidstr,refcoin,"")) != 0 ) { //printf("pending.(%s)\n",jprint(retjson,0)); return(retjson); } else if ( retstr != 0 ) { - fprintf(stderr,"get_gatewayspending.(%s) error.(%s)\n",acname,retstr); + fprintf(stderr,"%s get_gatewayspending.(%s) error.(%s)\n",refcoin,acname,retstr); free(retstr); } return(0); } -cJSON *get_rawmempool(char *acname) +cJSON *get_rawmempool(char *refcoin,char *acname) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(&retstr,acname,"getrawmempool","","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawmempool","","","")) != 0 ) { //printf("mempool.(%s)\n",jprint(retjson,0)); return(retjson); @@ -486,11 +496,13 @@ cJSON *get_rawmempool(char *acname) return(0); } -cJSON *get_addressutxos(char *acname,char *coinaddr) +cJSON *get_addressutxos(char *refcoin,char *acname,char *coinaddr) { cJSON *retjson; char *retstr,jsonbuf[256]; + if ( refcoin[0] != 0 && strcmp(refcoin,"KMD") != 0 ) + printf("warning: assumes %s has addressindex enabled\n",refcoin); sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr); - if ( (retjson= get_komodocli(&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) { //printf("addressutxos.(%s)\n",jprint(retjson,0)); return(retjson); @@ -503,10 +515,10 @@ cJSON *get_addressutxos(char *acname,char *coinaddr) return(0); } -cJSON *get_rawtransaction(char *acname,bits256 txid) +cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) { cJSON *retjson; char *retstr,str[65]; - if ( (retjson= get_komodocli(&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) { return(retjson); } @@ -518,11 +530,11 @@ cJSON *get_rawtransaction(char *acname,bits256 txid) return(0); } -void gatewaysmarkdone(char *acname,bits256 txid) +void gatewaysmarkdone(char *refcoin,char *acname,bits256 txid) { char str[65],*retstr; cJSON *retjson; printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,txid)); - if ( (retjson= get_komodocli(&retstr,acname,"gatewaysmarkdone",bits256_str(str,txid),"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,txid),"","")) != 0 ) { komodobroadcast(acname,retjson); free_json(retjson); @@ -534,10 +546,10 @@ void gatewaysmarkdone(char *acname,bits256 txid) } } -int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) +int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinaddr) { cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; - if ( (txobj= get_rawtransaction(acname,txid)) != 0 ) + if ( (txobj= get_rawtransaction(refcoin,acname,txid)) != 0 ) { if ( (vouts= jarray(&numvouts,txobj,"vout")) != 0 ) { @@ -566,24 +578,24 @@ int32_t tx_has_voutaddress(char *acname,bits256 txid,char *coinaddr) return(retval); } -int32_t coinaddrexists(char *acname,char *coinaddr) +int32_t coinaddrexists(char *refcoin,char *acname,char *coinaddr) { cJSON *array; bits256 txid; int32_t i,n,num=0; - if ( (array= get_addressutxos(acname,coinaddr)) != 0 ) + if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 ) { num = cJSON_GetArraySize(array); free_json(array); } else return(-1); if ( num == 0 ) { - if ( (array= get_rawmempool(acname)) != 0 ) + if ( (array= get_rawmempool(refcoin,acname)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) != 0 ) { for (i=0; i 0 ) + if ( tx_has_voutaddress(refcoin,acname,txid,coinaddr) > 0 ) { num = 1; break; @@ -596,7 +608,7 @@ int32_t coinaddrexists(char *acname,char *coinaddr) return(num); } -void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) +void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) { // check queue to prevent duplicate // check KMD chain and mempool for txidaddr @@ -606,9 +618,9 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid,origtxid; int64_t satoshis; - if ( (retjson= get_gatewayspending(acname,oraclestxidstr,coin)) != 0 ) + if ( (retjson= get_gatewayspending(refcoin,acname,oraclestxidstr)) != 0 ) { - if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,coin) == 0 ) + if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 ) { if ( (pending= jarray(&n,retjson,"pending")) != 0 ) { @@ -621,14 +633,14 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { - if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists(acname,txidaddr)) == 0 ) + if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists(refcoin,acname,txidaddr)) == 0 ) { // this is less errors but more expensive: ./komodo-cli z_sendmany "signeraddr" '[{"address":"","amount":0.0001},{"address":"","amount":}]' - txid = sendtoaddress(acname,txidaddr,10000); - if ( bits256_nonz(txid) != 0 && coinaddrexists(acname,txidaddr) > 0 ) + txid = sendtoaddress("KMD",acname,txidaddr,10000); + if ( bits256_nonz(txid) != 0 && coinaddrexists(refcoin,acname,txidaddr) > 0 ) { // the actual withdraw - withtxid = sendtoaddress(strcmp("KMD",coin)==0?"":coin,withdrawaddr,satoshis); + withtxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); if ( bits256_nonz(withtxid) != 0 ) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); @@ -639,7 +651,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) { fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } - } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(acname,txidaddr)); + } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } else if ( retval > 0 ) { @@ -654,7 +666,7 @@ void update_gatewayspending(char *acname,char *oraclestxidstr,char *coin) } } -int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *format) +int32_t get_oracledata(char *refcoin,char *acname,int32_t prevheight,char *hexstr,int32_t maxsize,char *format) { int32_t i; uint32_t height; uint64_t price; bits256 blockhash,merkleroot; hexstr[0] = 0; @@ -670,7 +682,7 @@ int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *for } else if ( strcmp(format,"Ihh") == 0 ) { - if ( (height= get_KMDheader(&blockhash,&merkleroot,prevheight)) > prevheight ) + if ( (height= get_coinheader(refcoin,acname,&blockhash,&merkleroot,prevheight)) > prevheight ) { for (i=0; i<4; i++) sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); @@ -711,17 +723,21 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; - if ( argc != 6 ) + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; + if ( argc < 6 ) { - printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n"); return(-1); } + printf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); acname = argv[1]; oraclestr = argv[2]; pkstr = argv[3]; format = argv[4]; bindtxidstr = argv[5]; + if ( argc > 6 ) + REFCOINCLI = argv[6]; + else REFCOINCLI = "./komodo_cli"; if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) { printf("only formats of L and Ihh are supported now\n"); @@ -731,8 +747,18 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( prevheight < (get_KMDheight("") - 10) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( (refcoin[0] == 0 || prevheight < (get_coinheight(refcoin,"") - 10)) && (clijson= get_komodocli("KMD",&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { + if ( refcoin[0] == 0 && jstr(clijson,"coin") != 0 ) + { + strcpy(refcoin,jstr(clijson,"coin")); + if ( strcmp("KMD",refcoin) != 0 && argc != 7 ) + { + printf("need to specify path to refcoin's cli as last argv\n"); + exit(0); + } + printf("set refcoin <- %s [%s]\n",refcoin,REFCOIN_CLI); + } if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 21:51:58 -1100 Subject: [PATCH 178/306] Test --- src/cc/dapps/oraclefeed.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 6a0f7d30a..f054ac234 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -536,7 +536,7 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 txid) printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,txid)); if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,txid),"","")) != 0 ) { - komodobroadcast(acname,retjson); + komodobroadcast(refcoin,acname,retjson); free_json(retjson); } else if ( retstr != 0 ) @@ -644,7 +644,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) if ( bits256_nonz(withtxid) != 0 ) { fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone(acname,origtxid); + gatewaysmarkdone("KMD",acname,origtxid); processed++; } else @@ -656,7 +656,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) else if ( retval > 0 ) { fprintf(stderr,"already did withdraw %s %s %.8f processed\n",coin,withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone(acname,origtxid); + gatewaysmarkdone("KMD",acname,origtxid); } } } @@ -736,8 +736,8 @@ int32_t main(int32_t argc,char **argv) format = argv[4]; bindtxidstr = argv[5]; if ( argc > 6 ) - REFCOINCLI = argv[6]; - else REFCOINCLI = "./komodo_cli"; + REFCOIN_CLI = argv[6]; + else REFCOIN_CLI = "./komodo_cli"; if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) { printf("only formats of L and Ihh are supported now\n"); From 932326dd45b2ea635cb62c33499e4c08b1fe50ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 21:53:04 -1100 Subject: [PATCH 179/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index f054ac234..8df1fd381 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -643,19 +643,19 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) withtxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); if ( bits256_nonz(withtxid) != 0 ) { - fprintf(stderr,"withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); gatewaysmarkdone("KMD",acname,origtxid); processed++; } else { - fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",coin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } else if ( retval > 0 ) { - fprintf(stderr,"already did withdraw %s %s %.8f processed\n",coin,withdrawaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"already did withdraw %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); gatewaysmarkdone("KMD",acname,origtxid); } } @@ -771,7 +771,7 @@ int32_t main(int32_t argc,char **argv) if ( (clijson2= get_komodocli("KMD",&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) { //printf("data.(%s)\n",jprint(clijson2,0)); - txid = komodobroadcast(acname,clijson2); + txid = komodobroadcast("KMD",acname,clijson2); if ( bits256_nonz(txid) != 0 ) { prevheight = height; From e726fec744e0d4ee73d2dbe718ee592a6d35bd8e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 21:54:31 -1100 Subject: [PATCH 180/306] - --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 8df1fd381..dc112a1e7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -737,7 +737,7 @@ int32_t main(int32_t argc,char **argv) bindtxidstr = argv[5]; if ( argc > 6 ) REFCOIN_CLI = argv[6]; - else REFCOIN_CLI = "./komodo_cli"; + else REFCOIN_CLI = "./komodo-cli"; if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) { printf("only formats of L and Ihh are supported now\n"); From 66bda9d6e5b06b8457594d3dde616d9e80c506da Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 21:57:19 -1100 Subject: [PATCH 181/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index dc112a1e7..1288b5dae 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -618,7 +618,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid,origtxid; int64_t satoshis; - if ( (retjson= get_gatewayspending(refcoin,acname,oraclestxidstr)) != 0 ) + if ( (retjson= get_gatewayspending("KMD",acname,oraclestxidstr)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 ) { @@ -633,11 +633,11 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { - if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists(refcoin,acname,txidaddr)) == 0 ) + if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists("KMD",acname,txidaddr)) == 0 ) { // this is less errors but more expensive: ./komodo-cli z_sendmany "signeraddr" '[{"address":"","amount":0.0001},{"address":"","amount":}]' txid = sendtoaddress("KMD",acname,txidaddr,10000); - if ( bits256_nonz(txid) != 0 && coinaddrexists(refcoin,acname,txidaddr) > 0 ) + if ( bits256_nonz(txid) != 0 && coinaddrexists("KMD",acname,txidaddr) > 0 ) { // the actual withdraw withtxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); From 7a85c397f8a8e78e8c4767c4e0410a4f8ccb762a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 21:59:31 -1100 Subject: [PATCH 182/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 1288b5dae..31493ffe0 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -325,7 +325,7 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char else if ( REFCOIN_CLI != 0 && REFCOIN_CLI[0] != 0 ) { sprintf(cmdstr,"%s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,fname); - printf("REFCOIN_CLI (%s)\n",cmdstr); + printf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr); } system(cmdstr); *retstrp = 0; From b07595f4f6d0000d26ec2089485ab7af7f572e0e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 22:01:09 -1100 Subject: [PATCH 183/306] Test --- src/cc/dapps/oraclefeed.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 31493ffe0..3ea8b3a59 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -744,6 +744,7 @@ int32_t main(int32_t argc,char **argv) return(-1); } acheight = 0; + refcoin[0] = 0; while ( 1 ) { retstr = 0; From e7795555f0adbcbaf56f868a55e9d472f304ecd5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 22:02:45 -1100 Subject: [PATCH 184/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3ea8b3a59..068119dec 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -759,7 +759,7 @@ int32_t main(int32_t argc,char **argv) exit(0); } printf("set refcoin <- %s [%s]\n",refcoin,REFCOIN_CLI); - } + } else printf("clijson.(%s)\n",jprint(clijson,0)); if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 22:03:30 -1100 Subject: [PATCH 185/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 068119dec..4fdbc2176 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -750,16 +750,16 @@ int32_t main(int32_t argc,char **argv) retstr = 0; if ( (refcoin[0] == 0 || prevheight < (get_coinheight(refcoin,"") - 10)) && (clijson= get_komodocli("KMD",&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { - if ( refcoin[0] == 0 && jstr(clijson,"coin") != 0 ) + if ( refcoin[0] == 0 && jstr(clijson,"name") != 0 ) { - strcpy(refcoin,jstr(clijson,"coin")); + strcpy(refcoin,jstr(clijson,"name")); if ( strcmp("KMD",refcoin) != 0 && argc != 7 ) { printf("need to specify path to refcoin's cli as last argv\n"); exit(0); } printf("set refcoin <- %s [%s]\n",refcoin,REFCOIN_CLI); - } else printf("clijson.(%s)\n",jprint(clijson,0)); + } //else printf("clijson.(%s)\n",jprint(clijson,0)); if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Wed, 12 Sep 2018 22:58:33 -1100 Subject: [PATCH 186/306] Markdone with cointxid --- src/cc/CCGateways.h | 2 +- src/cc/dapps/oraclefeed.c | 14 +++++++------- src/cc/gateways.cpp | 7 +++---- src/wallet/rpcwallet.cpp | 6 ++++-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 1d7bef9d5..d4b42f8e7 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -26,7 +26,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount); std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); -std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid); +std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 4fdbc2176..8107dc055 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -617,7 +617,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,withtxid,origtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,cointxid,origtxid; int64_t satoshis; if ( (retjson= get_gatewayspending("KMD",acname,oraclestxidstr)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 ) @@ -640,16 +640,16 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) if ( bits256_nonz(txid) != 0 && coinaddrexists("KMD",acname,txidaddr) > 0 ) { // the actual withdraw - withtxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); - if ( bits256_nonz(withtxid) != 0 ) + cointxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); + if ( bits256_nonz(cointxid) != 0 ) { - fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid); + fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); processed++; } else { - fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,withtxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } @@ -759,7 +759,7 @@ int32_t main(int32_t argc,char **argv) exit(0); } printf("set refcoin <- %s [%s]\n",refcoin,REFCOIN_CLI); - } //else printf("clijson.(%s)\n",jprint(clijson,0)); + } if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; ievalcode << 'M' << cointxid << refcoin); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } @@ -825,7 +825,6 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) obj.push_back(Pair("depositaddr",depositaddr)); Getscriptaddress(signeraddr,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG); obj.push_back(Pair("signeraddr",signeraddr)); - // numqueued += GatewaysAddQueue(refcoin,txid,tx.vout[1].scriptPubKey,tx.vout[0].nValue); } pending.push_back(obj); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d3825388c..8f94d84a5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5516,11 +5516,13 @@ UniValue gatewaysmarkdone(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); uint256 withdrawtxid; std::string hex; if ( fHelp || params.size() != 1 ) - throw runtime_error("gatewaysmarkdone withdrawtxid\n"); + throw runtime_error("gatewaysmarkdone withdrawtxid coin cointxid\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"); withdrawtxid = Parseuint256((char *)params[0].get_str().c_str()); - hex = GatewaysMarkdone(0,withdrawtxid); + coin = params[1].get_str(); + cointxid = Parseuint256((char *)params[2].get_str().c_str()); + hex = GatewaysMarkdone(0,withdrawtxid,coin,cointxid); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 518ae45859f314dc35efc790a70ee608e046150c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 22:59:28 -1100 Subject: [PATCH 187/306] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 8f94d84a5..e01d813c6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5514,7 +5514,7 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp) UniValue gatewaysmarkdone(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint256 withdrawtxid; std::string hex; + UniValue result(UniValue::VOBJ); uint256 withdrawtxid,cointxid; std::string hex,coin; if ( fHelp || params.size() != 1 ) throw runtime_error("gatewaysmarkdone withdrawtxid coin cointxid\n"); if ( ensure_CCrequirements() < 0 ) From 8c3015309f72129783f83f32fead9ee38575f85c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 23:01:38 -1100 Subject: [PATCH 188/306] Test --- src/cc/dapps/oraclefeed.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 8107dc055..536b2650b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -617,7 +617,8 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,cointxid,origtxid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; + memset(&zeroid,0,sizeof(zeroid)); if ( (retjson= get_gatewayspending("KMD",acname,oraclestxidstr)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 ) @@ -656,7 +657,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) else if ( retval > 0 ) { fprintf(stderr,"already did withdraw %s %s %.8f processed\n",refcoin,withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,zeroid); } } } From 1805ffc2fae8e804218cfec7c63f5faa02b0befa Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 23:03:54 -1100 Subject: [PATCH 189/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 536b2650b..04a08a1d4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -530,11 +530,11 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) return(0); } -void gatewaysmarkdone(char *refcoin,char *acname,bits256 txid) +void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid) { - char str[65],*retstr; cJSON *retjson; - printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,txid)); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,txid),"","")) != 0 ) + char str[65],str2[65],*retstr; cJSON *retjson; + printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,withtxid)); + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,withtxid),coin,bits256_str(str2,cointxid))) != 0 ) { komodobroadcast(refcoin,acname,retjson); free_json(retjson); From e2f37fc6c1d1ca96b23d8aa6d86d27bd9c115f89 Mon Sep 17 00:00:00 2001 From: Anton Lysakov Date: Thu, 13 Sep 2018 21:46:02 +0700 Subject: [PATCH 190/306] deprecated oraclefeed compilation script --- src/cc/dapps/oracle_dapp.sh | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100755 src/cc/dapps/oracle_dapp.sh diff --git a/src/cc/dapps/oracle_dapp.sh b/src/cc/dapps/oracle_dapp.sh deleted file mode 100755 index f6efd6a2b..000000000 --- a/src/cc/dapps/oracle_dapp.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# SET AC -read -p "Enter AC name you use : " acname -sed -i "/#define ACNAME */c\#define ACNAME \"$acname\"" oraclefeed.c -# Set ORACLETXID -read -p "Enter your oracle TXID (Oracle should have L data type) : " oracletxid -sed -i "/#define ORACLETXID */c\#define ORACLETXID \"$oracletxid\"" oraclefeed.c -# SET PUBKEY -read -p "Enter your pubkey : " pubkey -sed -i "/#define MYPUBKEY */c\#define MYPUBKEY \"$pubkey\"" oraclefeed.c -# COMPILATION -echo "Great, compiling !" -gcc oraclefeed.c -lm -o oracle_dapp -mv oracle_dapp ../../oracle_dapp -echo "Oracle is ready to use !" -while true; do - read -p "Would you like to run BTCUSD oracle app? [Y/N]" yn - case $yn in - [Yy]* ) cd ../..; ./oracle_dapp; break;; - [Nn]* ) exit;; - * ) echo "Please answer yes or no.";; - esac -done From e94993253a685344ad02d2d70910dd1312f5916f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 05:57:32 -1100 Subject: [PATCH 191/306] Gatewaysinfo --- src/cc/dapps/oraclefeed.c | 64 +++++++++++++++++++++++++++++++-------- src/cc/gateways.cpp | 1 + 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 04a08a1d4..80dd2be32 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -546,6 +546,32 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit } } +int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) +{ + char *oracle,*retstr,*name; cJSON *retjson; + *Np = *Mp = 0; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","")) != 0 ) + { + if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) + { + if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 ) + { + *Mp = jint(retjson,"M"); + *Np = jint(retjson,"N"); + } + } + free_json(retjson); + } + else if ( retstr != 0 ) + { + printf("error parsing get_gatewaysinfo.(%s)\n",retstr); + free(retstr); + } + if ( *Mp <= 0 || *Np <= 0 ) + return(-1); + else return(0); +} + int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinaddr) { cJSON *txobj,*vouts,*vout,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numvouts,retval = 0; @@ -608,7 +634,7 @@ int32_t coinaddrexists(char *refcoin,char *acname,char *coinaddr) return(num); } -void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) +void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr,int32_t M,int32_t N) { // check queue to prevent duplicate // check KMD chain and mempool for txidaddr @@ -617,7 +643,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*withdrawaddr; int32_t i,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; + cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; memset(&zeroid,0,sizeof(zeroid)); if ( (retjson= get_gatewayspending("KMD",acname,oraclestxidstr)) != 0 ) { @@ -632,7 +658,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) item = jitem(pending,i); origtxid = jbits256(item,"txid"); //process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"} - if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) + if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (depositaddr= jstr(item,"depositaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 ) { if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && (retval= coinaddrexists("KMD",acname,txidaddr)) == 0 ) { @@ -641,16 +667,24 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) if ( bits256_nonz(txid) != 0 && coinaddrexists("KMD",acname,txidaddr) > 0 ) { // the actual withdraw - cointxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); - if ( bits256_nonz(cointxid) != 0 ) + if ( strcmp(depositaddr,signeraddr) == 0 ) { - fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); - processed++; + cointxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis); + if ( bits256_nonz(cointxid) != 0 ) + { + fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); + processed++; + } + else + { + fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + } } else { - fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + // check msigmarkers + } } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } @@ -724,7 +758,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,M,N,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; if ( argc < 6 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n"); @@ -744,6 +778,7 @@ int32_t main(int32_t argc,char **argv) printf("only formats of L and Ihh are supported now\n"); return(-1); } + M = N = 1; acheight = 0; refcoin[0] = 0; while ( 1 ) @@ -759,7 +794,12 @@ int32_t main(int32_t argc,char **argv) printf("need to specify path to refcoin's cli as last argv\n"); exit(0); } - printf("set refcoin <- %s [%s]\n",refcoin,REFCOIN_CLI); + if ( get_gatewaysinfo("KMD",acname,&M,&N,bindtxidstr,refcoin,oraclestr) < 0 ) + { + printf("cant find bindtxid.(%s)\n",bindtxidstr); + exit(0); + } + printf("set refcoin <- %s [%s] M.%d of N.%d\n",refcoin,REFCOIN_CLI,M,N); } if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { @@ -779,7 +819,7 @@ int32_t main(int32_t argc,char **argv) prevheight = height; acheight = get_coinheight(refcoin,""); printf("%s ht.%d <- %s\n",refcoin,height,hexstr); - update_gatewayspending(refcoin,acname,bindtxidstr); + update_gatewayspending(refcoin,acname,bindtxidstr,M,N); } free_json(clijson2); } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 986608fb6..765121a44 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -74,6 +74,7 @@ string oracles ./c oraclessubscribe 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 1000 f9499d8bb04ffb511fcec4838d72e642ec832558824a2ce5aed87f1f686f8102 + gatewaysbind tokenid oracletxid coin tokensupply M N pubkey(s) ./c gatewaysbind a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 KMD 100000000000000 1 1 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e From 2a4078bb5cbd9661b0793901351ad628a06954d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 05:59:06 -1100 Subject: [PATCH 192/306] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 80dd2be32..b53c308f7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -552,6 +552,7 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char *Np = *Mp = 0; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","")) != 0 ) { + printf("got gatewaysinfo\n"); if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) { if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 ) @@ -559,7 +560,7 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); } - } + } else printf("%s != %s\n",oracle,oraclestr); free_json(retjson); } else if ( retstr != 0 ) From 81abf817501512c0d6293e740ead3e530a6ca04d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 06:02:15 -1100 Subject: [PATCH 193/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index b53c308f7..98c7a05fa 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -559,7 +559,7 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); - } + } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); } else printf("%s != %s\n",oracle,oraclestr); free_json(retjson); } From ea17adb690ebd47a38ef3069a130122c44a47ffd Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 06:04:41 -1100 Subject: [PATCH 194/306] Test --- src/cc/dapps/oraclefeed.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 98c7a05fa..9cb1af6cc 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -559,6 +559,7 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); + printf("(%s)\n",jprint(retjson,0)); } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); } else printf("%s != %s\n",oracle,oraclestr); free_json(retjson); From 1deabac47aa706ba7d5db62003af68e3d9686160 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 06:05:29 -1100 Subject: [PATCH 195/306] Test --- src/cc/dapps/oraclefeed.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 9cb1af6cc..0ae44d381 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -549,17 +549,15 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) { char *oracle,*retstr,*name; cJSON *retjson; - *Np = *Mp = 0; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","")) != 0 ) { - printf("got gatewaysinfo\n"); if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) { if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 ) { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); - printf("(%s)\n",jprint(retjson,0)); + //printf("(%s)\n",jprint(retjson,0)); } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); } else printf("%s != %s\n",oracle,oraclestr); free_json(retjson); From b71da7105ff7679f70850fea5683e34b15ac2c46 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 06:06:26 -1100 Subject: [PATCH 196/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 0ae44d381..9fa8845d5 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -553,7 +553,7 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char { if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) { - if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 ) + if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 && jint(retjson,"N") >= 1 ) { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); From d3be9b44708244d738658039972892f35fc1702c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Sep 2018 23:57:57 -1100 Subject: [PATCH 197/306] Initial channels CC doc --- src/cc/CC made easy | 46 ++++++++++++++++++++++++++++++++++++++- src/cc/dapps/oraclefeed.c | 6 ++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/cc/CC made easy b/src/cc/CC made easy index 4158e061e..5784c17c5 100644 --- a/src/cc/CC made easy +++ b/src/cc/CC made easy @@ -447,7 +447,51 @@ WARNING: there is an attack vector that precludes betting any large amounts, it In order to mitigate this, the disclosure of the house entropy needs to be delayed beyond a reasonable reorg depth (notarization). It is recommended for production dice game with significant amounts of money to use such a delayed disclosure method. -Chapter 10 - lotto example +Chapter 10 - channels example +It might be hard to believe, but channels CC implements an instant payment mechanism that is secured by dPoW in a way that is backward compatible with the existing wallets, explorers, etc. and channels CC does not require both nodes to be online. Its usecases are all the usecases for Lightning Network, it is just more secure, less expensive and backward compatible! The one aspect which some might consider a downside (and others another benefit) is that all payments are onchain. This means it would increase blockchain size, but the idea is for channels CC to be used on blockchains with relatively lower value coins, so a txfee of 0.0001 is not anything significant. + +Warning: very confusing blockchain reorganization issues described below. Will be confusing to most people + +From a distance, the blockchain is a chain of blocks. One block after the next, each referencing all the prior blocks. Each block containing a group of transactions. Prior to getting into a block, the transactions are broadcast to the network and if it is valid, it enters the memory pool. Each miner then constructs a valid block from these memory pool transactions and when a transaction gets mined (confirmed), it is removed from the memory pool. + +That is the simple version! + +The reality is quite a bit more complex, but the critical aspect is that the blockchain can (and is) reorganized as part of the expected protocol. This can happen even when there is no 51% attack happening and it is important to understand this process in detail, so here goes. + +What happens if two miners find a valid block at the same time? In this case the "same time" means within the time it takes for a block to propagate to the network. When a miner finds a new block, it is broadcast to the network and nodes update and start waiting for the next block. When there are two different (and valid) blocks propagating at the same time, some nodes update with one of the blocks and some the other, lets call it blockA and blockB. Now the nodes will know about both blockA and blockB, but some will consider blockA to be the chaintip and others will consider blockB to be the chaintip. + +This is where it gets confusing. Which is the correct chaintip (latest block?). It turns out that both blockA and blockB are valid at this moment in time. So there are actuall two blockchains. We have what is called a small fork! Now dont worry, the protocol will help us converge to a single chain, but in order to do that, we need the next block. + +Some miners will be mining from blockA and others from blockB. In most all cases, when the next block is found, it wont be at the "same time" again. So we will end up with a chain that is blockA+blockA2 or blockB+blockB2. Here comes the small reorg! Let's assuming blockA2 was found before blockB2, so that means all nodes that had blockB as the chaintip now see a longer chain blockA+blockA2, which trumps blockB. When that happens, it reorgs the chain so it is on blockA+blockA2. To do this properly, all the transactions that were in blockB are put back into the mempool and blockA is added, then blockA2. + +Of course, when blockB2 arrives, the nodes see it but blockB+blockB2 is the same length as blockA+blockA2, so no reorg happens. Since we postulated that blockAs arrived "before" blockB2, that means all nodes are on the same chaintip, including all the miners and the next block found would be blockA3, without any complications. + +Believe it or not, this sort of thing is happening all the time, one all blockchains. The chaintip is a volatile thing and that is why more than one confirmation is needed to avoid the small reorgs invalidating blockhash. However, it is possible for more than just the blockhash to change. When the reorg happens, all the transactions in the block are put back into the mempool and then the new blocks are processed in order. So what happens if one of the inputs to a transaction that happened in blockB, gets spent in blockA2? Based on random utxo allocation by wallets this is not impossible if an address has a lot of activity, but if it is part of a 51% attack, then this remote chance of an utxo being spent becomes a certainity! In fact, that is what a 51% attack is. + +The attack can go much deeper than just one block. For chains that use the longest chain rule, it can go quite deep indeed. So as all the reorged transactions are put back into the mempool, we feel good that it will get confirmed again. Unfortunately, there is no enforcement of a miner needing to mine any specific transaction in the mempool. And the 51% attacker is intent on mining the transaction that spends an already spent utxo in the reorganized chain. it is called a double spend, but in the reorganized chain, it is spent only once. So it is a bit of a misnomer. + +The important thing to understand is that if any transaction has inputs that are signed by a node, it is possible when the chain reorganizes for that transaction to become invalid. This is why dPoW is important as it doesnt strictly use the longest chain rule, but rather the longest notarized chain rule. Once a block is notarized, then it will refuse to reorganize that block (or any block before). So the risk is still there, but only until a notarization. Please see more detailed information about dPoW . + +Given the above, if you are wondering how can it be possible to have a mempool payment be secured by dPoW. Since it is explained how the reorgs can make valid transactions disappear, it seems unlikely any such solution is possible. However, the CC is very powerful and it can make unlikely things possible. + +The following describes how. + +We know that any payment that is utxo based can be invalidated via 51% attack, or even an unlikely but not impossible random utxo allocation from a busy wallet. Which means the payment cant be via a utxo. Since the CC system is utxo based, you might think that it means CC cant solve this. However, CC is very powerful and can implement payments that are not utxo based. But before this non-utxo payment method is explained, first we need to solve the mechanics of payment. + +At a high level, we want to lock funds into a channel, have this lock notarized so it cant be reorganized. Then payments can unlock funds. Additionally, if we are restricting the payment to just one destination, we also need a way for the sender to reclaim the unused funds. So there needs a way for a close channel notification, which when notarized allows the sender to reclaim all funds. After the channel close is notarized, then the only action possible should be a reclaim of sender funds. + +We need to assume that any payment, channel close, reclaim can be reorganized until it is notarized so great care needs to be made that a payment that is made will always be valid. With some allowances for blocks after a channelclose is notarized, we can protect the payments using the logic of "stop accepting payments after a channelclose is seen". It might be that a full notarization of wait time after the channelclose is notarized is needed to provide sufficient time for all the payments to be reprocessed. + +Now we can finally describe the requirements for the CC. The locked funds need to be able to be spent by either the sender or receiver, the former only after sufficient time after a channelclose and the latter only after a payment is seen (not just confirmed, but just seeing it should be enough). The protection from reorgs is that the payment itself reveals a secret that is needed for the payment and only the secret would be needed, so it wont matter what utxo is used. To lock funds into a CC address that can handle this we need a 1of2 CC address, which can accept a signature from either of two pubkeys. The additional CC constraints would be enforced to make sure payments are made until the channel is closed. + +A hashchain has the nice property of being able to encode a lot of secrets with a single hash. You can hash the hash, over and over and the final hash is the public value. By revealing the next to last hash, it can be verified that it hashes to the final hash. There is a restriction that a hashchain needs to be of reasonable maximum depth, say 1000. That means each iteration of the hashchain that is revealed is worth 1/1000th the total channelfunds. In fact, if the 500th hash value is revealed, half the channelfunds are released. this allows 1/1000th resolution that can be released with a single hash value. + +Now we can make the payment based on the hashvalue revealed at a specified depth before the prior released hashchain value. Both the sender and receiver can make a payment to the destination by attaching a hashchain secret. This means even if the sender's payment is reorganized, if the destination has the revealed secret, a replacement payment can be made that is valid. If the destination account isnt monitoring the blockchain, then it wont see the revealed secret, but in this case there shouldnt be value released for the payments that are reorganized. So it would be a case of no harm, no foul. In any event, all the payments end up verifiable on the blockchain to provide verifiability. + +Payments at the speed of the mempool, protected by dPoW! + +
+ Chapter 11 - oracles example Oracles CC is an example where it ended up being simpler than I first expected, but at the same time a lot more powerful. It is one of the smaller CC, but it enables creation of an arbitrary number of data markets, in a performant way. diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 9fa8845d5..915333aea 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -684,7 +684,11 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr,int3 else { // check msigmarkers - + // iterate for sigs depth and find the deepest + // if not already a signer, add signature and post to next + // if first one, then create a rawtx and sign it, ie. depth 1 + // if fully signed, broadcast + // iterate txidaddr, find highest nValue! } } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } From f4e843946908eb1ecdab527dcf49c7abef8b8f98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Sep 2018 00:16:16 -1100 Subject: [PATCH 198/306] - --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 765121a44..f3f872ebc 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -282,7 +282,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & // helper functions for rpc calls in rpcwallet.cpp -int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs) +/*int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs) { char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; std::vector > unspentOutputs; @@ -308,7 +308,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP } } return(totalinputs); -} +}*/ int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! { From f9d85c8f86401ede94a917d70bf46e7bba49f924 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 15 Sep 2018 21:46:46 -1100 Subject: [PATCH 199/306] Check for notarized in disconnect tip --- src/cc/CC made easy | 33 +++++++++++++++++++ src/cc/CCGateways.h | 1 + src/cc/dapps/oraclefeed.c | 69 +++++++++++++++++++++++++++++---------- src/cc/gateways.cpp | 62 +++++++++++++++++++++++++++++++++-- src/main.cpp | 9 +++++ 5 files changed, 155 insertions(+), 19 deletions(-) diff --git a/src/cc/CC made easy b/src/cc/CC made easy index 5784c17c5..895d84404 100644 --- a/src/cc/CC made easy +++ b/src/cc/CC made easy @@ -626,6 +626,39 @@ Conclusion I hope this document has helped you understand what a Komodo utxo based CC contract is and how it is different from the other smart contracts. If you are now able to dive into the cc directory and start making your own CC contract, then I am very happy! +gateways CC +gateways CC is the first CC that combines multiple CC into a single one. In order to achieve its goals, both the assets CC and the oracles CC is used, in addition to a dapp that issues regular transactions. This general approach can be used to solve quite a few different use cases, so it is important to understand how a multi-CC solution is put together. There are some tricky issues that only arise when using more than one CC at a time. + +Before the implementation details, first lets understand what the gateways CC does. At a high level it is similar to the old multigateway (from NXT AE 2014), but with improvements. The basic idea is to tokenize other crypto coins (like BTC) and then use the assets CC to transact/swap against the tokenized crypto. By enforcing a 1:1 peg between a specific token and BTC and an automated deposit/withdraw mechanism, it is possible to transact in the virtual BTC without the delay or expensive txfees. Then anybody that ends up having any of the BTC token would be able to withdraw actual BTC by redeeming the token. + +BTC -> deposit to special address -> receive token that represents BTC onchain +do onchain transactions with the BTC token +anybody who obtains the BTC token can redeem the token and get actual BTC in the withdraw address + +By bringing the operations onchain, it avoids the need for crosschain complications for each trade. The crosschain does still have to happen on the deposit and withdraw, but that is all. There is just one aspect that makes it not fully decentralized, which is the reliance on MofN multisig. However, with N trusted community members and a reasonable M value, it is not expected to be a big barrier. Since all operations are automated, the only trust needed is that M of the N multisig signers are running their nodes with the gateways dapp active and also that M of them wont collude to steal the funds locked in the multisig. In three years of operations, the MGW multigateway didnt have any incident of multisig signer misbehavior and it was only 2of3 multisig. + +How can the gatewaysCC work? First, it needs a dedicated token that can be used to represent the external crypto coin. In order to avoid any issues with misplaced tokens, it is simplest to require that 100% of all the tokens are all locked in the gatewaysCC address. We want to make it so that the only way the tokens can be released from the locked address is when a verified deposit is made. So, we also need a deposit address, which means there needs to be a set of pubkeys that control the deposit address. It turns out, we also need to post merkleroot data from the external coin so that the information is onchain to be able to validate the external deposit. Since we are already trusting the deposit address signers to safekeep the external coins via MofN multisig, trusting them to post the merkleroots doesnt increase the trust footprint needed. + +Now we have all the ingredients needed, a dedicated token, a set of multisig pubkeys and an oracle for merkleroots. + +gatewaysbind tokenid oracletxid coin tokensupply M N pubkey(s) + +With a gatewaysbind, a new gateway is defined. the pubkeys are for the custodians of the multisig funds and they also need to be posting merkleroots to the chain, so the oracle needs to be setup and funded and each of the signers needs to run the oraclefeed dapp. That posts each new merkleroot via oraclesdata and also responds to withdraw requests. + +The MofN pubkeys generates a deposit address and when funds are sent to that address along with a small amount to the claim address. With the txid from this external coin, along with the txproof and the rawtransaction, all is submitted with a gatewaysdeposit. This adds a special baton output which is a gateways CC output to invoke gateways validation and also prevents double claims by using the unspent status of the baton. + +gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount +gatewaysclaim bindtxid coin deposittxid destpub amount + +Once the gatewaysdeposit is validated, it can be claimed and now the token is sent to the claim address. A 1:1 pegging of the external crypto to the token is established. And as long as one of the deposit address signers is running the oraclefeed, then the deposit/claim process is fully automatic and under the control of the depositor. Nothing needs to be signed by any other party! Also by using the utxo from the deposittxid, double claims are prevented. + +On the withdraw side, the tokens are sent back to the address where the tokens are locked and this needs to create a redemption right that can only be used once. + +gatewayswithdraw bindtxid coin withdrawpub amount + + +And with a bit more magic in the oraclefeed, this is achieved. To be continued... + diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index d4b42f8e7..cfb3bd482 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -27,6 +27,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); +UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *unspentstr); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 915333aea..40db2882b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -524,12 +524,29 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) } else if ( retstr != 0 ) { - fprintf(stderr,"get_rawtransaction.(%s) error.(%s)\n",acname,retstr); + fprintf(stderr,"get_rawtransaction.(%s) %s error.(%s)\n",refcoin,acname,retstr); free(retstr); } return(0); } +void importaddress(char *refcoin,char *acname,char *depositaddr) +{ + cJSON *retjson; char *retstr; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","")) != 0 ) + { + printf("importaddress.(%s)\n",jprint(retjson,0)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"importaddress.(%s) %s error.(%s)\n",refcoin,acname,retstr); + free(retstr); + } + return(0); +} + + void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid) { char str[65],str2[65],*retstr; cJSON *retjson; @@ -546,17 +563,18 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit } } -int32_t get_gatewaysinfo(char *refcoin,char *acname,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) +int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) { - char *oracle,*retstr,*name; cJSON *retjson; + char *oracle,*retstr,*name,*deposit; cJSON *retjson; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","")) != 0 ) { if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) { - if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 && jint(retjson,"N") >= 1 ) + if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 && jint(retjson,"N") >= 1 && (deposit= jstr(retjson,"deposit")) != 0 ) { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); + strcpy(depositaddr,deposit); //printf("(%s)\n",jprint(retjson,0)); } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); } else printf("%s != %s\n",oracle,oraclestr); @@ -634,7 +652,7 @@ int32_t coinaddrexists(char *refcoin,char *acname,char *coinaddr) return(num); } -void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr,int32_t M,int32_t N) +void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t M,int32_t N) { // check queue to prevent duplicate // check KMD chain and mempool for txidaddr @@ -643,9 +661,9 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr,int3 /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item; char str[65],*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; + cJSON *retjson,*pending,*item,*clijson; char str[65],*unspentstr,*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; memset(&zeroid,0,sizeof(zeroid)); - if ( (retjson= get_gatewayspending("KMD",acname,oraclestxidstr)) != 0 ) + if ( (retjson= get_gatewayspending("KMD",acname,bindtxidstr)) != 0 ) { if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 ) { @@ -681,14 +699,30 @@ void update_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr,int3 fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } } - else + else if ( (unspentstr= get_listunspent(refcoin,"",depositaddr)) != 0 ) { - // check msigmarkers - // iterate for sigs depth and find the deepest - // if not already a signer, add signature and post to next - // if first one, then create a rawtx and sign it, ie. depth 1 - // if fully signed, broadcast - // iterate txidaddr, find highest nValue! + if ( (clijson= get_komodocli("KMD",&retstr2,acname,"gatewaysmultisig",bindtxidstr,bits256_str(str,origtxid),unspentstr)) != 0 ) + { + if ( jint(clijson,"complete") != 0 ) + { + cointxid = komodobroadcast(refcoin,"",clijson2); + if ( bits256_nonz(cointxid) != 0 ) + { + fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); + processed++; + } + } + else if ( jint(clijson,"partialtx") != 0 ) + { + // 10000 + ith -> txidaddr + txid = komodobroadcast("KMD",acname,clijson2); + fprintf(stderr,"%s M.%d of N.%d partialtx %s sent\n",refcoin,M,N,bits256_str(str,txid)); + processed++; + } + free_json(clijson); + } + free(unspentstr); } } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); } @@ -762,7 +796,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,M,N,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,retval,M,N,n,height,prevheight = 0; char *format,*acname,*oraclestr,*bindtxidstr,*pkstr,*pubstr,*retstr,*retstr2,depositaddr[64],hexstr[4096],refcoin[64]; uint64_t price; bits256 txid; if ( argc < 6 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT $BINDTXID [refcoin_cli]\n"); @@ -798,12 +832,13 @@ int32_t main(int32_t argc,char **argv) printf("need to specify path to refcoin's cli as last argv\n"); exit(0); } - if ( get_gatewaysinfo("KMD",acname,&M,&N,bindtxidstr,refcoin,oraclestr) < 0 ) + if ( get_gatewaysinfo("KMD",acname,depositaddr,&M,&N,bindtxidstr,refcoin,oraclestr) < 0 ) { printf("cant find bindtxid.(%s)\n",bindtxidstr); exit(0); } - printf("set refcoin <- %s [%s] M.%d of N.%d\n",refcoin,REFCOIN_CLI,M,N); + importaddress(refcoin,"",depositaddr); + printf("set refcoin %s <- %s [%s] M.%d of N.%d\n",depositaddr,refcoin,REFCOIN_CLI,M,N); } if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index f3f872ebc..58855d253 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -695,7 +695,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui } if ( GetTransaction(deposittxid,tx,hashBlock,false) == 0 ) { - fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); + fprintf(stderr,"cant find deposittxid %s\n",uint256_str(str,bindtxid)); return(""); } if ( (depositamount= GatewaysDepositval(tx)) != amount ) @@ -710,7 +710,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui { if ( inputs > amount ) CCchange = (inputs - amount); - mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); + mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); // triggers EVAL_GATEWAYS validation mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); @@ -837,3 +837,61 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) return(result); } +std::string GatewaysMultisigUpdate(struct CCcontract_info *cp,int32_t &complete,int32_t &partialtx,CPubKey mypk,int32_t ith,uint256 withdrawtxid,uint8_t M,uint8_t N,char *unspentstr) +{ + CMutableTransaction mtx; cJSON *unspents; std::string hex,rawtx; CScript opret; uint64_t txfee = 10000; + complete = partialtx = 0; + if ( biggestrawtx == 0 ) + { + if ( (unspents= cJSON_Parse(unspentstr)) != 0 ) + { + rawtx = construct_rawtx(withdrawaddr,nValue,unspents); + free_json(unspents); + } + } + { + // iterate txidaddr, extract signatures! + // iterate for sigs depth and find the deepest + // if not already a signer, add signature and post to next + // if first one, then create a rawtx and sign it, ie. depth 1 + // if fully signed, broadcast + + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); + } + return(hex); +} + +UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *unspentstr) +{ + UniValue result(UniValue::VOBJ); std::string coin,hex; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CPubKey Gatewayspk,mypk; struct CCcontract_info *cp,C; int32_t i,n,complete,partialtx; int64_t totalsupply; + cp = CCinit(&C,EVAL_GATEWAYS); + if ( txfee == 0 ) + txfee = 10000; + complete = partialtx = 0; + mypk = pubkey2pk(Mypubkey()); + Gatewayspk = GetUnspendable(cp,0); + _GetCCaddress(gatewaysassets,EVAL_ASSETS,Gatewayspk); + if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) + { + depositaddr[0] = 0; + if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 1 && coin == refcoin ) + { + n = pubkeys.size(); + for (i=0; i send tx to refcoin withdraw complete + // partialtx:1 -> send partialsig to txidaddr, satoshis 10000 + ith pubkey + 1 + result.push_back(Pair("result","success")); + result.push_back(Pair("coin",refcoin)); + result.push_back(Pair("complete",complete)); + result.push_back(Pair("partialtx",partialtx)); + result.push_back(Pair("hex",hex)); + return(result); +} diff --git a/src/main.cpp b/src/main.cpp index 82f39cbda..0fc1f7bb4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3375,6 +3375,15 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlock block; if (!ReadBlockFromDisk(block, pindexDelete,1)) return AbortNode(state, "Failed to read block"); + { + int32_t prevMoMheightp; uint256 notarizedhash,txid; + komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); + if ( block.GetHash() == notarizedhash ) + { + fprintf(stderr,"DisconnectTip trying to disconnect notarized block at ht.%d\n",(int32_t)pindexDelete->nHeight); + return(false); + } + } // Apply the block atomically to the chain state. uint256 anchorBeforeDisconnect = pcoinsTip->GetBestAnchor(); int64_t nStart = GetTimeMicros(); From a6a00b5ca262f9e68199c4fe5d941203dcfae95d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 15 Sep 2018 21:47:43 -1100 Subject: [PATCH 200/306] Test --- src/cc/gateways.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 58855d253..df5c24e7c 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -841,14 +841,6 @@ std::string GatewaysMultisigUpdate(struct CCcontract_info *cp,int32_t &complete, { CMutableTransaction mtx; cJSON *unspents; std::string hex,rawtx; CScript opret; uint64_t txfee = 10000; complete = partialtx = 0; - if ( biggestrawtx == 0 ) - { - if ( (unspents= cJSON_Parse(unspentstr)) != 0 ) - { - rawtx = construct_rawtx(withdrawaddr,nValue,unspents); - free_json(unspents); - } - } { // iterate txidaddr, extract signatures! // iterate for sigs depth and find the deepest From 8ccb74fb8eec7ae6851e9791719df9da423e8d9b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 15 Sep 2018 21:48:31 -1100 Subject: [PATCH 201/306] -p --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 0fc1f7bb4..4edb4f604 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3376,7 +3376,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { if (!ReadBlockFromDisk(block, pindexDelete,1)) return AbortNode(state, "Failed to read block"); { - int32_t prevMoMheightp; uint256 notarizedhash,txid; + int32_t prevMoMheight; uint256 notarizedhash,txid; komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); if ( block.GetHash() == notarizedhash ) { From 6b52965769535c6baf8d28633c4e26362b23c848 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 01:03:14 -1100 Subject: [PATCH 202/306] Stronger check for asset chain notarizations --- src/main.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index ce61a0e35..21c803754 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3370,6 +3370,15 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlock block; if (!ReadBlockFromDisk(block, pindexDelete,1)) return AbortNode(state, "Failed to read block"); + { + int32_t prevMoMheight; uint256 notarizedhash,txid; + komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); + if ( block.GetHash() == notarizedhash ) + { + fprintf(stderr,"DisconnectTip trying to disconnect notarized block at ht.%d\n",(int32_t)pindexDelete->nHeight); + return(false); + } + } // Apply the block atomically to the chain state. uint256 anchorBeforeDisconnect = pcoinsTip->GetBestAnchor(); int64_t nStart = GetTimeMicros(); From 12832b1d22add227ccd6bd8a72732d519dc6e64d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 01:04:30 -1100 Subject: [PATCH 203/306] notarization check for asset chains --- resolve.sh | 12 ++++++++++++ src/main.cpp | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100755 resolve.sh diff --git a/resolve.sh b/resolve.sh new file mode 100755 index 000000000..548e71dee --- /dev/null +++ b/resolve.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for f in $(git diff --name-only --diff-filter=U | cat); do + echo "Resolve conflict in $f ..." + git checkout --theirs $f +done + +for f in $(git diff --name-only --diff-filter=U | cat); do + echo "Adding file $f ..." + git add $f +done + diff --git a/src/main.cpp b/src/main.cpp index e25d6419b..f93cab2f5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3367,6 +3367,16 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { CBlock block; if (!ReadBlockFromDisk(block, pindexDelete,1)) return AbortNode(state, "Failed to read block"); + if ( ASSETCHAINS_SYMBOL[0] != 0 || pindexDelete->nHeight > 1400000 ) + { + int32_t prevMoMheight; uint256 notarizedhash,txid; + komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); + if ( block.GetHash() == notarizedhash ) + { + fprintf(stderr,"DisconnectTip trying to disconnect notarized block at ht.%d\n",(int32_t)pindexDelete->nHeight); + return(false); + } + } // Apply the block atomically to the chain state. uint256 anchorBeforeDisconnect = pcoinsTip->GetBestAnchor(); int64_t nStart = GetTimeMicros(); From 7fccea1dab7299ea0c715d8a8be01c393300558d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 03:08:28 -1100 Subject: [PATCH 204/306] Msig suppport --- src/cc/CCGateways.h | 2 +- src/cc/dapps/oraclefeed.c | 155 ++++++++++++++++++++++++++++++++------ src/cc/gateways.cpp | 30 +------- src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/wallet/rpcwallet.cpp | 20 +++++ 6 files changed, 159 insertions(+), 50 deletions(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index cfb3bd482..5d8e98228 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -27,7 +27,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); -UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *unspentstr); +UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 40db2882b..be7b14b81 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -546,6 +546,109 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) return(0); } +cJSON *getinputarray(int64_t *totalp,cJSON *unspents,int64_t required) +{ + cJSON *vin,*item,*vins = cJSON_CreateArray(); int32_t i,n,v; int64_t satoshis; bits256 txid; + *totalp = 0; + if ( (n= cJSON_GetArraySize(unspents)) > 0 ) + { + for (i=0; i= required ) + break; + } + } + } + return(vins); +} + +char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signeraddr,char *withdrawaddr,int64_t satoshis) +{ + char *retstr,*retstr2,array[128],*txstr = 0; cJSON *retjson2,*retjson,*vins,*vouts; int64_t txfee,total,change = 0; + if ( strcmp(refcoin,"BTC") == 0 ) + txfee = 20000; + else txfee = 10000; + if ( satoshis < txfee ) + { + printf("createmultisig satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIS); + return(0); + } + satoshis -= txfee; + sprintf(array,"[\"%s\"]",depositaddr); + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent",1,99999999,array,"")) != 0 ) + { + //createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} + if ( (vins= getinputarray(&total,retjson,satoshis)) != 0 ) + { + if ( total >= satoshis ) + { + vouts = cJSON_CreatObject(); + jaddstr(vouts,withdrawaddr,(double)satoshis/SATOSHIDEN); + if ( total > satoshis+txfee ) + { + change = (total - satoshis); + jaddstr(vouts,depositaddr,(double)change/SATOSHIDEN); + } + if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",jprint(vins,0),jprint(vouts,0),"","")) != 0 ) + { + printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); + free_json(retjson2); + } + else if ( txstr == 0 ) + printf("createmultisig: null txstr and JSON2\n"); + free_json(vins); + free_json(vouts); + } + } + } + else if ( retstr != 0 ) + { + printf("createmultisig: unexpected null JSON, retstr.(%s)\n",retstr); + free(retstr); + } + else printf("createmultisig: null retstr and JSON\n"); + return(txstr); +} + +cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx) +{ + char *retstr,*hexstr; cJSON *retjson; + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 ) + { + if ( jint(retjson,"complete") != 0 ) + return(retjson); + else if ( (hexstr= jstr(retjson,"hex")) != 0 && strlen(hexstr) > strlen(rawtx) ) + { + jadd(retjson,"partialtx",1)' + return(retjson); + } + free_json(retjson); + } + return(0); +} + +char *get_gatewaysmultisig(char *refcoin,char *acname,char *bindtxidstr,char *withtxidstr,char *txidaddr) +{ + char *retstr,*hexstr,*hex=0; cJSON *retjson; + if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",bindtxidstr,refcoin,withtxidstr,txidstr)) != 0 ) + { + if ( (hexstr= jstr(retjson,"hex")) != 0 ) + hex = clonestr(hexstr); + free_json(retjson); + } + return(hex); +} void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid) { @@ -661,7 +764,7 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t /// if enough sigs, sendrawtransaction and when it confirms spend marker (txid.2) /// if not enough sigs, post partially signed to acname with marker2 // monitor marker2, for the partially signed withdraws - cJSON *retjson,*pending,*item,*clijson; char str[65],*unspentstr,*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; + cJSON *retjson,*pending,*item,*clijson; char str[65],*rawtx,*coinstr,*txidaddr,*signeraddr,*depositaddr,*withdrawaddr; int32_t i,j,n,retval,processed = 0; bits256 txid,cointxid,origtxid,zeroid; int64_t satoshis; memset(&zeroid,0,sizeof(zeroid)); if ( (retjson= get_gatewayspending("KMD",acname,bindtxidstr)) != 0 ) { @@ -699,32 +802,38 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); } } - else if ( (unspentstr= get_listunspent(refcoin,"",depositaddr)) != 0 ) + else { - if ( (clijson= get_komodocli("KMD",&retstr2,acname,"gatewaysmultisig",bindtxidstr,bits256_str(str,origtxid),unspentstr)) != 0 ) + if ( (rawtx= get_gatewaysmultisig(refcoin,acname,bindtxidstr,bits256_str(str,origtxid),txidaddr)) == 0 ) { - if ( jint(clijson,"complete") != 0 ) - { - cointxid = komodobroadcast(refcoin,"",clijson2); - if ( bits256_nonz(cointxid) != 0 ) - { - fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); - gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); - processed++; - } - } - else if ( jint(clijson,"partialtx") != 0 ) - { - // 10000 + ith -> txidaddr - txid = komodobroadcast("KMD",acname,clijson2); - fprintf(stderr,"%s M.%d of N.%d partialtx %s sent\n",refcoin,M,N,bits256_str(str,txid)); - processed++; - } - free_json(clijson); + rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis); } - free(unspentstr); + if ( rawtx != 0 ) + { + if ( (clijson= addmultisignature(refcoin,"",signeraddr,rawtx)) != 0 ) + { + if ( jint(clijson,"complete") != 0 ) + { + cointxid = komodobroadcast(refcoin,"",clijson); + if ( bits256_nonz(cointxid) != 0 ) + { + fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN); + gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid); + } + } + else if ( jint(clijson,"partialtx") != 0 ) + { + // 10000 + ith -> txidaddr + txid = komodobroadcast("KMD",acname,clijson); + fprintf(stderr,"%s M.%d of N.%d partialtx %s sent\n",refcoin,M,N,bits256_str(str,txid)); + } + free_json(clijson); + } + processed++; + free(rawtx); + } else fprintf(stderr,"couldnt create msig rawtx\n"); } - } else fprintf(stderr,"error sending %s txidaddr.%s -> %s exists.%d\n",acname,txidaddr,bits256_str(str,txid),coinaddrexists(refcoin,acname,txidaddr)); + } } else if ( retval > 0 ) { diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index df5c24e7c..6a4f60413 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -837,23 +837,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) return(result); } -std::string GatewaysMultisigUpdate(struct CCcontract_info *cp,int32_t &complete,int32_t &partialtx,CPubKey mypk,int32_t ith,uint256 withdrawtxid,uint8_t M,uint8_t N,char *unspentstr) -{ - CMutableTransaction mtx; cJSON *unspents; std::string hex,rawtx; CScript opret; uint64_t txfee = 10000; - complete = partialtx = 0; - { - // iterate txidaddr, extract signatures! - // iterate for sigs depth and find the deepest - // if not already a signer, add signature and post to next - // if first one, then create a rawtx and sign it, ie. depth 1 - // if fully signed, broadcast - - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); - } - return(hex); -} - -UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *unspentstr) +std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr) { UniValue result(UniValue::VOBJ); std::string coin,hex; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CPubKey Gatewayspk,mypk; struct CCcontract_info *cp,C; int32_t i,n,complete,partialtx; int64_t totalsupply; cp = CCinit(&C,EVAL_GATEWAYS); @@ -868,22 +852,16 @@ UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,ui depositaddr[0] = 0; if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 1 && coin == refcoin ) { + // need a decentralized way to add signatures to msig tx n = pubkeys.size(); for (i=0; i send tx to refcoin withdraw complete - // partialtx:1 -> send partialsig to txidaddr, satoshis 10000 + ith pubkey + 1 - result.push_back(Pair("result","success")); - result.push_back(Pair("coin",refcoin)); - result.push_back(Pair("complete",complete)); - result.push_back(Pair("partialtx",partialtx)); - result.push_back(Pair("hex",hex)); - return(result); + return(hex); } diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index c4c8d378b..d268ed7fa 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -418,6 +418,7 @@ static const CRPCCommand vRPCCommands[] = { "gateways", "gatewaysclaim", &gatewaysclaim, true }, { "gateways", "gatewayswithdraw", &gatewayswithdraw, true }, { "gateways", "gatewayspending", &gatewayspending, true }, + { "gateways", "gatewaysmultisig", &gatewaysmultisig, true }, { "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true }, /* dice */ diff --git a/src/rpcserver.h b/src/rpcserver.h index a697ee4ee..1ebff82ef 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -244,6 +244,7 @@ extern UniValue gatewaysclaim(const UniValue& params, bool fHelp); extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp); extern UniValue gatewayspending(const UniValue& params, bool fHelp); extern UniValue gatewaysmarkdone(const UniValue& params, bool fHelp); +extern UniValue gatewaysmultisig(const UniValue& params, bool fHelp); extern UniValue channelsinfo(const UniValue& params, bool fHelp); extern UniValue channelsbind(const UniValue& params, bool fHelp); extern UniValue channelsopen(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ef5b33ab5..e0afbb982 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5543,6 +5543,26 @@ UniValue gatewayspending(const UniValue& params, bool fHelp) return(GatewaysPendingWithdraws(bindtxid,coin)); } +UniValue gatewaysmultisig(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint256 bindtxid,withtxid; std::string coin,hex; char *txidaddr; + if ( fHelp || params.size() != 2 ) + throw runtime_error("gatewaysmultisig bindtxid coin withtxid txidaddr\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + bindtxid = Parseuint256((char *)params[0].get_str().c_str()); + coin = params[1].get_str(); + withtxid = Parseuint256((char *)params[2].get_str().c_str()); + txidaddr = params[3].get_str().c_str(); + hex = GatewaysMultisig(0,coin,bindtxid,withdrawtxid,txidaddr); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex",hex)); + } else ERR_RESULT("couldnt gatewaysmultisig"); + return(result); +} + UniValue oracleslist(const UniValue& params, bool fHelp) { if ( fHelp || params.size() > 0 ) From 791ad592f1608180788e4d181c37ab37097faeed Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 03:09:39 -1100 Subject: [PATCH 205/306] Test --- src/cc/CCGateways.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCGateways.h b/src/cc/CCGateways.h index 5d8e98228..b584ba5d0 100644 --- a/src/cc/CCGateways.h +++ b/src/cc/CCGateways.h @@ -27,7 +27,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount); UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin); std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid); -UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr); +std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr); // CCcustom UniValue GatewaysInfo(uint256 bindtxid); From 4f80a29cc484443b3daa92092a48d9a094a9fae3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 03:12:56 -1100 Subject: [PATCH 206/306] Test --- 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 e0afbb982..57c9fabc1 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5553,8 +5553,8 @@ UniValue gatewaysmultisig(const UniValue& params, bool fHelp) bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); withtxid = Parseuint256((char *)params[2].get_str().c_str()); - txidaddr = params[3].get_str().c_str(); - hex = GatewaysMultisig(0,coin,bindtxid,withdrawtxid,txidaddr); + txidaddr = (char *)params[3].get_str().c_str(); + hex = GatewaysMultisig(0,coin,bindtxid,withtxid,txidaddr); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); From 9648870fdcdc1383567e3dac268059447b794a82 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 03:16:04 -1100 Subject: [PATCH 207/306] Sync gateways --- src/cc/gateways.cpp | 100 +++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index df5c24e7c..23b600930 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -21,7 +21,7 @@ debug multisig and do partial signing validation -string oracles + string oracles */ /* @@ -58,7 +58,7 @@ string oracles 5. Now a gatewaysbind can bind an external coin to an asset, along with the oracle for the merkleroots. the txid from the bind is used in most of the other gateways CC calls usage: - ./c tokencreate KMD 1000000 KMD_equivalent_token_for_gatewaysCC + ./c tokencreate KMD 1000000 KMD_equivalent_token_for_gatewaysCC a7398a8748354dd0a3f8d07d70e65294928ecc3674674bb2d9483011ccaa9a7a transfer to gateways pubkey: 03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40 RDMqGyREkP1Gwub1Nr5Ye8a325LGZsWBCb @@ -94,7 +94,7 @@ string oracles "remaining": "1000000.00000000", "issued": "0.00000000" } - + To make a gateway deposit, send the funds to the "deposit" address, along with any amount to the same pubkey address you want to get the assetized KMD to appear in. 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 pubkey for RFpxgqff7FDHFuHa3jSX5NzqqWCcELz8ha @@ -106,16 +106,16 @@ string oracles ./komodo-cli getrawtransaction bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b - + gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount -./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 + ./komodo-cli -ac_name=AT5 gatewaysdeposit e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e 1003776 KMD bc41a00e429db741c3199f17546a48012fd3b7eea45dfc6bc2f5228278133009 0 010000000149964cdcd17fe9b1cae4d0f3b5f5db301d9b4f54099fdf4d34498df281757094010000006a4730440220594f3a630dd73c123f44621aa8bb9968ab86734833453dd479af6d79ae6f584202207bb5e35f13b337ccc8a88d9a006c8c5ddb016c0a6f4f2dc44357a8128623d85d01210223154bf53cd3a75e64d86697070d6437c8f0010a09c1df35b659e31ce3d79b5dffffffff0310270000000000001976a91447d2e323a14b0c3be08698aa46a9b91489b189d688ac701de52d000000001976a91459fdba29ea85c65ad90f6d38f7a6646476b26b1688acb0a86a00000000001976a914f9a9daf5519dae38b8b61d945f075da895df441d88ace18d965b 04000000232524ea04b54489eb222f8b3f566ed35504e3050488a63f0ab7b1c2030000007f91615f04835822bf6984a56482aeeb11d03814352eca9afc0a20192fdcae900000000000000000000000000000000000000000000000000000000000000000268e965ba608071d0800038e16762900000000000000000000000000000000000000000042008dd6fd4005016b4292b05df6dfd316c458c53e28fb2befb96e4870a40c6c04e733d75d8a7a18cce34fe326005efdc403bfa4644e30eeafdaeff34419edc591299e6cc5933cb2eeecbab5c4dfe97cd413b75215999a3dd02b540373581e81d8512bff1640590a6b4da4aaa9b8adc0102c38ca0022daed997b53ed192ba326e212fba5e505ce29e3ad149cef7f48d0e00948a1acd81731d84008760759211eb4abbc7b037939a7964182edb59cf9065357e864188ee5fc7316e8796963036bb99eeb9f06c95d64f78749ecec7181c12eb5d83a3b9b1c1e8a0aae9a20ce04a250b28216620bfc99bb81a6de4db80b93a5aea916de97c1a272e26644abdd683f19c5e3174a2e4513ed767d8f11a4c3074295f697839c5d9139676a813451cc7da38f68cbae5d990a79075f98903233ca04fe1b4b099e433585e5adcc45d41d54a9c648179297359c75950a5e574f13f70b728bbbf552770256315cd0a00139d6ab6934cb5ed70a4fc01a92611b096dd0028f17f4cc687b75f37dca530aa47a18321c50528dbd9272eabb3e13a87021a05918a6d2627e2caba6d7cf1a9f0b831ea3337b9a6af92746d83140078d60c72b6beacf91c9e68a34cee209e08670be1d17ff8d80b7a2285b1325461a2e33f2ee675593f1900e066a5d212615cd8da18749b0e684eee73edcc9031709be715b889c6d015cf4bd4ad5ab7e21bd3492c208930a54d353ef36a437f507ead38855633c1b88d060d9e4221ca8ce2f698e8a6ae0d41e9ace3cbd401f1e0f07650e9c126d4ef20278c8be6e85c7637513643f8d02d7ad64c09da11c16429d60e5160c345844b8158ece62794e8ad280d4e4664150e74978609ece431e51a9f9e1ce8aa49c16f36c7fd12b71acc42d893e18476b8b1e144a8175519612efc93e0aecc61f3b21212c958b0e2331d76aaa62faf11a58fe2bd91ab9ab01b906406c9bbc02df2a106e67182aae0a20b538bf19f09c57f9de5e198ba254580fb1b11e22ad526550093420cb7c68628d4c3ad329c8acc6e219093d277810ed016b6099b7e3781de412a22dacedaa2acf29e8062debcd85c7b9529a20b2782a2470763ac27cf89611a527d43ac89b8063ffb93b6ed993425194f8ee821a8493a563072c896f9584f95db28e3f2fc5fb4a6f3c39d615cd563641717cd50afb73ed3989cbf504b2043882993ce9575f56402534173b1396fbc13df80920b46788ae340ad5a91f25177cc74aa69024d76f56166199d2e4d50a053555256c4e3137ea1cee1130e916a88b6ee5cf2c85652fb8824d5dacfa485e3ef6190591ac0c2fcacc4fc7deb65aca4b0b89b76e35a46b0627e2e967cc63a5d606a984c8e63eabb98fde3e69114340ae524c974cb936e57690e98a7a74533f6f7d1d0496976496b54d14a8163efb32b70dfbb79d80a3022c4f53571c08bf044270565716b435084376714b224ab23e9817c05af8223723afc0577af5c8fc28f71036ca82528aaa4ca9bcd18a50e25d2a528f183d3a2074d968d170876d8dce434c5937261b55173ab87e03d5632ca0834fdc5387c15ab3a17d75c0f274004f289ff1bf7d14e97fdf4172eb49adfb418cc2f4794806ae7c0111c97df4d65d38679ec93fea3ef738ed565e8906a8fe1861cafe3938c772fedcfab40159938e06ef414fd299f2355c6d3369bc1bd3c4db64ce205f0a1b70a40030f505b736e28230de82e97776b5ee7b10708bb3020d28cec7a8e124549ec80c547ac4e7b52bf397c72bcfce30820554ab8fb4d1f73b209bc32a0e7e878843cdbf5f01222728ccea7e6ab7cb5e3fee3234f5b85d1985f91492f6ceaa6454a658dab5074f163ce26ed753137fa61c940679de13bd7b212cd3cf2b334f5201cecbc7473342bd7a239e09169bccd56d03000000037a9068df0625e548e71263c8361b4e904c998378f6b9e32729c3f19b10ad752e093013788222f5c26bfc5da4eeb7d32f01486a54179f19c341b79d420ea041bc8878d22fad4692b2d609c3cf190903874d3682a714c7483518c9392e07c25035010b 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 -> 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 to get the merkleroots onchain, from the multisig signers nodes run the oraclefeed program with acname oracletxid pubkey Ihh ./oraclefeed AT5 1f1aefcca2bdea8196cfd77337fb21de22d200ddea977c2f9e8742c55829d808 02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92 Ihh gatewaysclaim bindtxid coin deposittxid destpub amount -./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 + ./c gatewaysclaim e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD 9d80ea79a65aaa0d464f8b762356fa01047e16e9793505a22ca04559f81a6eb6 0223d114dededb04f253816d6ad0ce78dd08c617c94ce3c53bf50dc74a5157bef8 7.6999 now the asset is in the pubkey's asset address! it can be used, traded freely and any node who has the asset can do a gatewayswithdraw @@ -126,11 +126,11 @@ string oracles Now there is a withdraw pending, so it needs to be processed by the signing nodes on the KMD side - gatewayspending bindtxid coin + gatewayspending bindtxid coin gatewayspending will display all pending withdraws and if it is done on one of the msigpubkeys, then it will queue it for processing ./c gatewayspending e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD -*/ + */ int32_t GatewaysAddQueue(std::string coin,uint256 txid,CScript scriptPubKey,int64_t nValue) @@ -283,32 +283,32 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & // helper functions for rpc calls in rpcwallet.cpp /*int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs) -{ - char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; - std::vector > unspentOutputs; - GetCCaddress(cp,coinaddr,pk); - SetCCunspents(unspentOutputs,coinaddr); - for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) - { - txid = it->first.txhash; - vout = (int32_t)it->first.index; - // no need to prevent dup - if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) - { - if ( (nValue= IsGatewaysvout(cp,vintx,vout)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) - { - if ( total != 0 && maxinputs != 0 ) - mtx.vin.push_back(CTxIn(txid,vout,CScript())); - nValue = it->second.satoshis; - totalinputs += nValue; - n++; - if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) - break; - } - } - } - return(totalinputs); -}*/ + { + char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; + std::vector > unspentOutputs; + GetCCaddress(cp,coinaddr,pk); + SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + // no need to prevent dup + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) + { + if ( (nValue= IsGatewaysvout(cp,vintx,vout)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) + { + if ( total != 0 && maxinputs != 0 ) + mtx.vin.push_back(CTxIn(txid,vout,CScript())); + nValue = it->second.satoshis; + totalinputs += nValue; + n++; + if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) + break; + } + } + } + return(totalinputs); + }*/ int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! { @@ -521,7 +521,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) { if ( oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()) == sizeof(hash) && - oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) + oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) { txid = batontxid; return(mhash); @@ -837,23 +837,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) return(result); } -std::string GatewaysMultisigUpdate(struct CCcontract_info *cp,int32_t &complete,int32_t &partialtx,CPubKey mypk,int32_t ith,uint256 withdrawtxid,uint8_t M,uint8_t N,char *unspentstr) -{ - CMutableTransaction mtx; cJSON *unspents; std::string hex,rawtx; CScript opret; uint64_t txfee = 10000; - complete = partialtx = 0; - { - // iterate txidaddr, extract signatures! - // iterate for sigs depth and find the deepest - // if not already a signer, add signature and post to next - // if first one, then create a rawtx and sign it, ie. depth 1 - // if fully signed, broadcast - - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); - } - return(hex); -} - -UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *unspentstr) +std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,uint256 withdrawtxid,char *txidaddr) { UniValue result(UniValue::VOBJ); std::string coin,hex; char str[67],numstr[65],depositaddr[64],gatewaysassets[64]; uint8_t M,N; std::vector pubkeys; uint8_t taddr,prefix,prefix2; uint256 tokenid,oracletxid,hashBlock; CTransaction tx; CPubKey Gatewayspk,mypk; struct CCcontract_info *cp,C; int32_t i,n,complete,partialtx; int64_t totalsupply; cp = CCinit(&C,EVAL_GATEWAYS); @@ -868,22 +852,16 @@ UniValue GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid,ui depositaddr[0] = 0; if ( tx.vout.size() > 0 && DecodeGatewaysBindOpRet(depositaddr,tx.vout[tx.vout.size()-1].scriptPubKey,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys,taddr,prefix,prefix2) != 0 && M <= N && N > 1 && coin == refcoin ) { + // need a decentralized way to add signatures to msig tx n = pubkeys.size(); for (i=0; i send tx to refcoin withdraw complete - // partialtx:1 -> send partialsig to txidaddr, satoshis 10000 + ith pubkey + 1 - result.push_back(Pair("result","success")); - result.push_back(Pair("coin",refcoin)); - result.push_back(Pair("complete",complete)); - result.push_back(Pair("partialtx",partialtx)); - result.push_back(Pair("hex",hex)); - return(result); + return(hex); } From c5164b3c7bd21c7dd5e6b476e33e40478811c45c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 17 Sep 2018 05:58:07 -1100 Subject: [PATCH 208/306] Skip human help if longer chain is invalid due to notarization --- src/main.cpp | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4edb4f604..c99f316f1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3626,23 +3626,34 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo // our genesis block. In practice this (probably) won't happen because of checks elsewhere. auto reorgLength = pindexOldTip ? pindexOldTip->nHeight - (pindexFork ? pindexFork->nHeight : -1) : 0; static_assert(MAX_REORG_LENGTH > 0, "We must be able to reorg some distance"); - if (reorgLength > MAX_REORG_LENGTH) { - auto msg = strprintf(_( - "A block chain reorganization has been detected that would roll back %d blocks! " - "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." - ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + - _("Reorganization details") + ":\n" + - "- " + strprintf(_("Current tip: %s, height %d, work %s"), - pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("New tip: %s, height %d, work %s"), - pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("Fork point: %s %s, height %d"), - ASSETCHAINS_SYMBOL,pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + - _("Please help, human!"); - LogPrintf("*** %s\n", msg); - uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); - StartShutdown(); - return false; + if (reorgLength > MAX_REORG_LENGTH) + { + int32_t notarizedht,prevMoMheight; uint256 notarizedhash,txid; + notarizedht = komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); + if ( pindexFork->nHeight < notarizedht ) + { + fprintf(stderr,"pindexFork->nHeight.%d is < notarizedht %d, so ignore it\n",(int32_t)pindexFork->nHeight,notarizedht); + pindexFork = pindexOldTip; + } + else + { + auto msg = strprintf(_( + "A block chain reorganization has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + + _("Reorganization details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d, work %s"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("New tip: %s, height %d, work %s"), + pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("Fork point: %s %s, height %d"), + ASSETCHAINS_SYMBOL,pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + + _("Please help, human!"); + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); + StartShutdown(); + return false; + } } // Disconnect active blocks which are no longer in the best chain. From 403b69675c0691138de17e0fe1c9fd219c099bca Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 18 Sep 2018 03:48:44 -1100 Subject: [PATCH 209/306] 1of2 CC --- src/cc/prices.cpp | 55 ++++++++++++++++++++++++---------------- src/wallet/rpcwallet.cpp | 5 ++++ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 1465c6ee6..40a777bcf 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -28,15 +28,31 @@ Funds work like with dice, ie. there is a Prices plan that traders bet against. - PricesOpen -> oracletxid start with 'L' price, leverage, amount - funds are locked into global CC address + PricesFunding oracletxid, priceaveraging, maxleverage, funding, longtoken, shorttoken, N [pubkeys] + + PricesBet -> oracletxid start with 'L', leverage, funding, direction + funds are locked into global CC address it can be closed at anytime by the trader for cash settlement the house account can close it if rekt Implementation Notes: In order to eliminate the need for worrying about sybil attacks, each prices plan would be able to specific pubkey(s?) for whitelisted publishers. It would be possible to have a non-whitelisted plan that would use 50% correlation between publishers. - delta neutral balancing of risk exposure + delta neutral balancing of riskexposure: fabs(long exposure - short exposure) + bet +B at leverage L + absval(sum(+BLi) - sum(-Bli)) + + validate: update riskexposure and it needs to be <= funds + + PricesProfits: limit withdraw to funds in excess of riskexposure + PricesFinish: payout (if winning) and update riskexposure + need long/short exposure assets + + exposure tokens + funding -> 1of2 CC global CC address and dealer address + pricebet -> user funds to 1of2 address. exposuretoken to exposure address + pricewin -> winnings from dealer funds, exposure token back to 1of2 address + priceloss -> exposuretoken back to 1of2 address + */ @@ -211,34 +227,29 @@ UniValue PricesList() return(result); } -std::string PricesCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t minbet,int64_t maxbet,int64_t maxodds,int64_t timeoutblocks) +// PricesFunding oracletxid, priceaveraging, maxleverage, funding, longtoken, shorttoken, N [pubkeys] + +std::string PricesCreateFunding(uint64_t txfee,uint256 oracletxid,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,CPubKey pubkeys) { - CMutableTransaction mtx; uint256 zero; CScript fundingPubKey; CPubKey mypk,pricepk; int64_t a,b,c,d; uint64_t sbits; struct CCcontract_info *cp,C; - if ( funds < 0 || minbet < 0 || maxbet < 0 || maxodds < 1 || maxodds > 9999 || timeoutblocks < 0 || timeoutblocks > 1440 ) + CMutableTransaction mtx; CPubKey mypk,pricespk; struct CCcontract_info *cp,C; + if ( funding < 100*COIN || maxleverage <= 0 || maxleverage > 10000 ) { CCerror = "invalid parameter error"; fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } - if ( funds < 100*COIN ) + cp = CCinit(&C,EVAL_REWARDS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + pricespk = GetUnspendable(cp,0); + // verify long and short assets + if ( AddNormalinputs(mtx,mypk,funding+3*txfee,60) > 0 ) { - CCerror = "price plan needs at least 100 coins"; - fprintf(stderr,"%s\n", CCerror.c_str() ); - return(""); - } - memset(&zero,0,sizeof(zero)); - if ( (cp= Pricesinit(fundingPubKey,zero,&C,planstr,txfee,mypk,pricepk,sbits,a,b,c,d)) == 0 ) - { - CCerror = "Priceinit error in create funding"; - fprintf(stderr,"%s\n", CCerror.c_str() ); - return(""); - } - if ( AddNormalinputs(mtx,mypk,funds+3*txfee,60) > 0 ) - { - mtx.vout.push_back(MakeCC1vout(cp->evalcode,funds,pricepk)); + mtx.vout.push_back(MakeCC1vout(cp->evalcode,funding,pricepk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricepk)) << OP_CHECKSIG)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesFundingOpRet('F',sbits,minbet,maxbet,maxodds,timeoutblocks))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesFundingOpRet('F',oracletxid,longtoken,shorttoken,funding,mode,maxleverage,pubkeys))); } CCerror = "cant find enough inputs"; fprintf(stderr,"%s\n", CCerror.c_str() ); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 57c9fabc1..48e1d75f3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4934,7 +4934,12 @@ UniValue pricesaddress(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"); if ( params.size() == 1 ) + { pubkey = ParseHex(params[0].get_str().c_str()); + char destaddr[64]; + GetCCaddress1of2(cp,destaddr,pubkey2pk(pubkey),pubkey2pk(pubkey)); + fprintf(stderr,"1of2 CC %s\n",destaddr); + } return(CCaddress(cp,(char *)"Prices",pubkey)); } From 08d66385b3d1802aee063ab3696846ec7f4575e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 18 Sep 2018 04:13:43 -1100 Subject: [PATCH 210/306] Test --- src/cc/prices.cpp | 8 ++++---- src/wallet/rpcwallet.cpp | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 40a777bcf..1db14d1b9 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -48,10 +48,10 @@ PricesFinish: payout (if winning) and update riskexposure need long/short exposure assets - exposure tokens + funding -> 1of2 CC global CC address and dealer address - pricebet -> user funds to 1of2 address. exposuretoken to exposure address - pricewin -> winnings from dealer funds, exposure token back to 1of2 address - priceloss -> exposuretoken back to 1of2 address + funding -> 1of2 CC global CC address and dealer address, exposure tokens to global 1of2 assets CC address + pricebet -> user funds and exposure token to 1of2 address. + pricewin -> winnings from dealer funds, exposure token back to global address + priceloss -> exposuretoken back to global address */ diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 48e1d75f3..44965db73 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4939,6 +4939,9 @@ UniValue pricesaddress(const UniValue& params, bool fHelp) char destaddr[64]; GetCCaddress1of2(cp,destaddr,pubkey2pk(pubkey),pubkey2pk(pubkey)); fprintf(stderr,"1of2 CC %s\n",destaddr); + cp->evalcode = EVAL_ASSETS; + GetCCaddress1of2(cp,destaddr,pubkey2pk(pubkey),pubkey2pk(pubkey)); + fprintf(stderr,"1of2 assets CC %s\n",destaddr); } return(CCaddress(cp,(char *)"Prices",pubkey)); } From f44cd67e8298122cf4dea84cff3685696553fb74 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:04:47 -1100 Subject: [PATCH 211/306] Prices stub --- src/cc/CCPrices.h | 9 +- src/cc/CCassets.h | 2 +- src/cc/CCassetsCore.cpp | 48 ++++- src/cc/CCassetstx.cpp | 4 +- src/cc/CCinclude.h | 4 +- src/cc/CCtx.cpp | 5 +- src/cc/assets.cpp | 4 +- src/cc/gateways.cpp | 26 ++- src/cc/prices.cpp | 401 ++++++++++++++++++++++++--------------- src/komodo_utils.h | 5 + src/rpcserver.cpp | 9 +- src/rpcserver.h | 7 + src/wallet/rpcwallet.cpp | 208 ++++++++++++++++++-- 13 files changed, 536 insertions(+), 196 deletions(-) diff --git a/src/cc/CCPrices.h b/src/cc/CCPrices.h index 8b09e9267..d35823838 100644 --- a/src/cc/CCPrices.h +++ b/src/cc/CCPrices.h @@ -22,6 +22,13 @@ bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); // CCcustom -UniValue PricesInfo(); +UniValue PricesList(); +UniValue PricesInfo(uint256 fundingtxid); +UniValue PricesStatus(uint64_t txfee,uint256 fundingtxid,uint256 bettxid); +std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletxid,uint64_t margin,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,std::vector pubkeys); +std::string PricesAddFunding(uint64_t txfee,uint256 bettoken,uint256 fundingtxid,int64_t amount); +std::string PricesBet(uint64_t txfee,uint256 bettoken,uint256 fundingtxid,int64_t amount,int32_t leverage); +std::string PricesFinish(uint64_t txfee,uint256 bettoken,uint256 fundingtxid,uint256 bettxid); + #endif diff --git a/src/cc/CCassets.h b/src/cc/CCassets.h index 9a0f2a0ea..afb3579cf 100644 --- a/src/cc/CCassets.h +++ b/src/cc/CCassets.h @@ -33,7 +33,7 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx CScript EncodeAssetCreateOpRet(uint8_t funcid,std::vector origpubkey,std::string name,std::string description); CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t price,std::vector origpubkey); bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage); bool SetAssetOrigpubkey(std::vector &origpubkey,int64_t &price,const CTransaction &tx); int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid); bool ValidateBidRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice); diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index 55a4ccdcb..cd2e267e1 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -274,7 +274,29 @@ bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &or return(0); } -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey) +CScript EncodeAssetOpRetExtra(uint8_t funcid,uint256 assetid,uint256 assetid2,uint256 bettxid,int32_t leverage) +{ + CScript opret; uint8_t evalcode = EVAL_ASSETS; + assetid = revuint256(assetid); + assetid2 = revuint256(assetid2); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << assetid << assetid2 << bettxid << leverage); + return(opret); +} + +uint8_t DecodeAssetOpRetExtra(CScript scriptPubKey,uint256 &assetid,uint256 &assetid2,uint256 &bettxid,int32_t leverage) +{ + std::vector vopret; uint8_t funcid=0,e,f; + GetOpReturnData(scriptPubKey, vopret); + if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> assetid2; ss >> bettxid; ss >> leverage) != 0 ) + { + assetid = revuint256(assetid); + assetid2 = revuint256(assetid2); + return(funcid); + } + return(0); +} + +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage) { std::vector vopret; uint8_t funcid=0,*script,e,f; GetOpReturnData(scriptPubKey, vopret); @@ -297,6 +319,14 @@ uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &a return(funcid); } break; + case 'T': + if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> assetid2; ss >> bettxid; ss >> leverage) != 0 ) + { + assetid = revuint256(assetid); + assetid2 = revuint256(assetid2); + return(funcid); + } + break; case 's': case 'b': case 'S': case 'B': if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> price; ss >> origpubkey) != 0 ) { @@ -325,17 +355,17 @@ uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &a bool SetAssetOrigpubkey(std::vector &origpubkey,int64_t &price,const CTransaction &tx) { - uint256 assetid,assetid2; - if ( tx.vout.size() > 0 && DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 ) + uint256 assetid,assetid2,bettxid; int32_t leverage; + if ( tx.vout.size() > 0 && DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage) != 0 ) return(true); else return(false); } bool GetAssetorigaddrs(struct CCcontract_info *cp,char *CCaddr,char *destaddr,const CTransaction& tx) { - uint256 assetid,assetid2; int64_t price,nValue=0; int32_t n; uint8_t funcid; std::vector origpubkey; CScript script; + uint256 assetid,assetid2,bettxid; int32_t leverage; int64_t price,nValue=0; int32_t n; uint8_t funcid; std::vector origpubkey; CScript script; n = tx.vout.size(); - if ( n == 0 || (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) + if ( n == 0 || (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) == 0 ) return(false); if ( GetCCaddress(cp,CCaddr,pubkey2pk(origpubkey)) != 0 && Getscriptaddress(destaddr,CScript() << origpubkey << OP_CHECKSIG) != 0 ) return(true); @@ -344,7 +374,7 @@ bool GetAssetorigaddrs(struct CCcontract_info *cp,char *CCaddr,char *destaddr,co int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid) { - uint256 assetid,assetid2; int64_t nValue=0; int32_t n; uint8_t funcid; + uint256 assetid,assetid2,bettxid; int64_t nValue=0; int32_t n,leverage; uint8_t funcid; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) // maybe check address too? { n = tx.vout.size(); @@ -352,7 +382,7 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans //fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); if ( v >= n-1 ) return(0); - if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) + if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) == 0 ) { fprintf(stderr,"null decodeopret v.%d\n",v); return(0); @@ -414,7 +444,7 @@ int64_t AssetValidateCCvin(struct CCcontract_info *cp,Eval* eval,char *CCaddr,ch int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid) { - CTransaction vinTx; int64_t nValue; uint256 assetid,assetid2; uint8_t funcid; + CTransaction vinTx; int64_t nValue; int32_t leverage; uint256 assetid,assetid2,bettxid; uint8_t funcid; CCaddr[0] = origaddr[0] = 0; if ( (nValue= AssetValidateCCvin(cp,eval,CCaddr,origaddr,tx,1,vinTx)) == 0 ) return(0); @@ -423,7 +453,7 @@ int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmppr else { //fprintf(stderr,"have %.8f checking assetid origaddr.(%s)\n",(double)nValue/COIN,origaddr); - if ( vinTx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,assetid,assetid2,tmpprice,tmporigpubkey)) != 'b' && funcid != 'B' ) + if ( vinTx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,assetid,assetid2,tmpprice,tmporigpubkey,bettxid,leverage)) != 'b' && funcid != 'B' ) return eval->Invalid("invalid opreturn for buyvin"); else if ( refassetid != assetid ) return eval->Invalid("invalid assetid for buyvin"); diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index cbf40d603..63d1a1089 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -106,7 +106,7 @@ UniValue AssetList() UniValue AssetOrders(uint256 refassetid) { static uint256 zero; - int64_t price; uint256 txid,hashBlock,assetid,assetid2; std::vector origpubkey; CTransaction vintx; UniValue result(UniValue::VARR); std::vector > unspentOutputs; uint8_t funcid; char numstr[32],funcidstr[16],origaddr[64],assetidstr[65]; struct CCcontract_info *cp,C; + int64_t price; uint256 txid,hashBlock,assetid,assetid2,bettxid; std::vector origpubkey; CTransaction vintx; UniValue result(UniValue::VARR); std::vector > unspentOutputs; int32_t leverage; uint8_t funcid; char numstr[32],funcidstr[16],origaddr[64],assetidstr[65]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_ASSETS); SetCCunspents(unspentOutputs,(char *)cp->unspendableCCaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) @@ -114,7 +114,7 @@ UniValue AssetOrders(uint256 refassetid) txid = it->first.txhash; if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { - if ( vintx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey)) != 0 ) + if ( vintx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) != 0 ) { if ( refassetid != zero && assetid != refassetid ) { diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 4beb722a1..4059191a7 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -110,10 +110,12 @@ uint256 OraclesBatontxid(uint256 oracletxid,CPubKey pk); int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs); bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx); bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage); uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint256 &batontxid,CPubKey &pk,std::vector &data); int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen); CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t price,std::vector origpubkey); +CScript EncodeAssetOpRetExtra(uint8_t funcid,uint256 assetid,uint256 assetid2,uint256 bettxid,int32_t leverage); +uint8_t DecodeAssetOpRetExtra(CScript scriptPubKey,uint256 &assetid,uint256 &assetid2,uint256 &bettxid,int32_t leverage); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 50bb9616f..b26ca7cfd 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -250,14 +250,15 @@ int64_t CCfullsupply(uint256 tokenid) int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) { - int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,hashBlock; std::vector origpubkey; std::vector > unspentOutputs; + int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,bettxid,hashBlock; std::vector origpubkey; int32_t leverage; + std::vector > unspentOutputs; SetCCunspents(unspentOutputs,coinaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 && assetid == tokenid ) + if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage) != 0 && assetid == tokenid ) { sum += it->second.satoshis; } diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index e5a5af4e0..bf979a1e0 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -132,12 +132,12 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { static uint256 zero; - CTxDestination address; CTransaction vinTx,createTx; uint256 hashBlock,assetid,assetid2; int32_t i,starti,numvins,numvouts,preventCCvins,preventCCvouts; int64_t remaining_price,nValue,assetoshis,outputs,inputs,tmpprice,totalunits,ignore; std::vector origpubkey,tmporigpubkey,ignorepubkey; uint8_t funcid; char destaddr[64],origaddr[64],CCaddr[64]; + CTxDestination address; CTransaction vinTx,createTx; uint256 bettxid,hashBlock,assetid,assetid2; int32_t i,starti,leverage,numvins,numvouts,preventCCvins,preventCCvouts; int64_t remaining_price,nValue,assetoshis,outputs,inputs,tmpprice,totalunits,ignore; std::vector origpubkey,tmporigpubkey,ignorepubkey; uint8_t funcid; char destaddr[64],origaddr[64],CCaddr[64]; numvins = tx.vin.size(); numvouts = tx.vout.size(); outputs = inputs = 0; preventCCvins = preventCCvouts = -1; - if ( (funcid= DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,remaining_price,origpubkey)) == 0 ) + if ( (funcid= DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,remaining_price,origpubkey,bettxid,leverage)) == 0 ) return eval->Invalid("Invalid opreturn payload"); fprintf(stderr,"AssetValidate (%c)\n",funcid); if ( funcid != 'o' && funcid != 'x' && eval->GetTxUnconfirmed(assetid,createTx,hashBlock) == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 23b600930..9146a864b 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -130,6 +130,11 @@ gatewayspending will display all pending withdraws and if it is done on one of the msigpubkeys, then it will queue it for processing ./c gatewayspending e6c99f79d4afb216aa8063658b4222edb773dd24bb0f8e91bd4ef341f3e47e5e KMD + + Implementation Issues: + When thinking about validation, it is clear that we cant use EVAL_ASSETS for the locked coins as there wont be any enforcement of the gateways locking. This means we need a way to transfer assets into gateways outputs and back. It seems a tokenconvert rpc will be needed and hopefully that will be enough to make it all work properly. + + */ @@ -433,19 +438,24 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t { CMutableTransaction mtx; CTransaction oracletx; uint8_t taddr,prefix,prefix2; CPubKey mypk,gatewayspk; CScript opret; uint256 hashBlock; struct CCcontract_info *cp,C; std::string name,description,format; int32_t i,numvouts; int64_t fullsupply; char destaddr[64],coinaddr[64],str[65],*fstr; cp = CCinit(&C,EVAL_GATEWAYS); + if ( strcmp((char *)"KMD",coin.c_str()) == 0 ) + { + taddr = 0; + prefix = 60; + prefix2 = 85; + } + else + { + fprintf(stderr,"set taddr, prefix, prefix2 for %s\n",coin.c_str()); + taddr = 0; + prefix = 60; + prefix2 = 85; + } if ( N == 0 || N > 15 || M > N ) { fprintf(stderr,"illegal M.%d or N.%d\n",M,N); return(""); } - if ( strcmp((char *)"KMD",coin.c_str()) != 0 ) - { - fprintf(stderr,"only KMD supported for now\n"); - return(""); - } - taddr = 0; - prefix = 60; - prefix2 = 85; if ( pubkeys.size() != N ) { fprintf(stderr,"M.%d N.%d but pubkeys[%d]\n",M,N,(int32_t)pubkeys.size()); diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 1db14d1b9..49e87127a 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -28,7 +28,7 @@ Funds work like with dice, ie. there is a Prices plan that traders bet against. - PricesFunding oracletxid, priceaveraging, maxleverage, funding, longtoken, shorttoken, N [pubkeys] + PricesFunding oracletxid, margin, priceaveraging, maxleverage, funding, longtoken, shorttoken, N [pubkeys] PricesBet -> oracletxid start with 'L', leverage, funding, direction funds are locked into global CC address @@ -53,58 +53,35 @@ pricewin -> winnings from dealer funds, exposure token back to global address priceloss -> exposuretoken back to global address + exposure address, funds address */ // start of consensus code -int64_t IsPricesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +int64_t PricesOraclePrice(int64_t &rektprice,uint64_t mode,uint256 oracletxid,std::vectorpubkeys,int32_t dir,int64_t amount,int32_t leverage) { - char destaddr[64]; - if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) - { - if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) - return(tx.vout[v].nValue); - } - return(0); + int64_t price; + // howto ensure price when block it confirms it not known + // get price from oracle + current chaintip + // normalize leveraged amount + if ( dir > 0 ) + rektprice = price * leverage / (leverage-1); + else rektprice = price * (leverage-1) / leverage; + return(price); } -bool PricesExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) +CScript EncodePricesFundingOpRet(uint8_t funcid,CPubKey planpk,uint256 oracletxid,uint256 longtoken,uint256 shorttoken,int32_t millimargin,uint64_t mode,int32_t maxleverage,std::vector pubkeys) { - 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 Prices from mempool"); - if ( (assetoshis= IsPricesvout(cp,vinTx,tx.vin[i].prevout.n)) != 0 ) - inputs += assetoshis; - } - } - } - for (i=0; iInvalid("mismatched inputs != outputs + txfee"); - } - else return(true); + CScript opret; + fprintf(stderr,"implement EncodePricesFundingOpRet\n"); + return(opret); +} + +uint8_t DecodePricesFundingOpRet(CScript scriptPubKey,CPubKey &planpk,uint256 &oracletxid,uint256 &longtoken,uint256 &shorttoken,int32_t &millimargin,uint64_t &mode,int32_t &maxleverage,std::vector &pubkeys,uint256 &bettoken) +{ + fprintf(stderr,"implement DecodePricesFundingOpRet\n"); + return(0); } bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) @@ -148,20 +125,20 @@ bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx // helper functions for rpc calls in rpcwallet.cpp -int64_t AddPricesInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs) +int64_t AddTokensInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,char *destaddr,uint256 tolenid,int64_t total,int32_t maxinputs) { - char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; + int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; std::vector > unspentOutputs; - GetCCaddress(cp,coinaddr,pk); - SetCCunspents(unspentOutputs,coinaddr); + SetCCunspents(unspentOutputs,destaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; vout = (int32_t)it->first.index; - // no need to prevent dup - if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) + // need to prevent dup + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 && vout < tx.vout.size() ) { - if ( (nValue= IsPricesvout(cp,vintx,vout)) > 1000000 && myIsutxo_spentinmempool(txid,vout) == 0 ) + // need to verify assetid + if ( (nValue= vintx.vout[vout].nValue)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); @@ -176,49 +153,18 @@ int64_t AddPricesInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub return(totalinputs); } -#ifdef later -UniValue PricesInfo(uint256 pricesid) -{ - UniValue result(UniValue::VOBJ); CPubKey pricepk; uint256 hashBlock,oracletxid; CTransaction vintx; int64_t minbet,maxbet,maxodds; uint64_t funding; char numstr[65]; struct CCcontract_info *cp,C; - if ( GetTransaction(pricesid,vintx,hashBlock,false) == 0 ) - { - fprintf(stderr,"cant find fundingtxid\n"); - ERR_RESULT("cant find fundingtxid"); - return(result); - } - if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,oracletxid,minbet,maxbet,maxodds) == 0 ) - { - fprintf(stderr,"fundingtxid isnt price creation txid\n"); - ERR_RESULT("fundingtxid isnt price creation txid"); - return(result); - } - result.push_back(Pair("result","success")); - result.push_back(Pair("pricesid",uint256_str(str,pricesid))); - result.push_back(Pair("oracletxid",uint256_str(str,oracletxid))); - sprintf(numstr,"%.8f",(double)minbet/COIN); - result.push_back(Pair("minbet",numstr)); - sprintf(numstr,"%.8f",(double)maxbet/COIN); - result.push_back(Pair("maxbet",numstr)); - result.push_back(Pair("maxodds",maxodds)); - cp = CCinit(&C,EVAL_PRICES); - pricepk = GetUnspendable(cp,0); - funding = PricePlanFunds(cp,pricepk,pricesid); - sprintf(numstr,"%.8f",(double)funding/COIN); - result.push_back(Pair("funding",numstr)); - return(result); -} - UniValue PricesList() { - UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint256 txid,hashBlock,oracletxid; CTransaction vintx; int64_t minbet,maxbet,maxodds; char str[65]; + UniValue result(UniValue::VARR); std::vector > addressIndex; struct CCcontract_info *cp,C; uint64_t mode; int32_t margin,maxleverage; std::vectorpubkeys; uint256 txid,hashBlock,oracletxid,longtoken,shorttoken,bettoken; CPubKey planpk,pricespk; char str[65]; CTransaction vintx; cp = CCinit(&C,EVAL_PRICES); + pricespk = GetUnspendable(cp,0); SetCCtxids(addressIndex,cp->normaladdr); for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) { txid = it->first.txhash; if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { - if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,oracletxid,minbet,maxbet,maxodds) != 0 ) + if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' ) { result.push_back(uint256_str(str,txid)); } @@ -227,54 +173,165 @@ UniValue PricesList() return(result); } -// PricesFunding oracletxid, priceaveraging, maxleverage, funding, longtoken, shorttoken, N [pubkeys] - -std::string PricesCreateFunding(uint64_t txfee,uint256 oracletxid,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,CPubKey pubkeys) +// longtoken satoshis limits long exposure +// shorttoken satoshis limits short exposure +// both must be in the 1of2 CC address with its total supply +// bettoken +std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletxid,uint64_t margin,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,std::vector pubkeys) { - CMutableTransaction mtx; CPubKey mypk,pricespk; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CTransaction oracletx; int64_t fullsupply,inputs,CCchange=0; uint256 hashBlock; char str[65],coinaddr[64],houseaddr[64]; CPubKey mypk,pricespk; int32_t i,N,numvouts; struct CCcontract_info *cp,C,*assetscp,C2; if ( funding < 100*COIN || maxleverage <= 0 || maxleverage > 10000 ) { CCerror = "invalid parameter error"; fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } - cp = CCinit(&C,EVAL_REWARDS); + cp = CCinit(&C,EVAL_PRICES); + assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); pricespk = GetUnspendable(cp,0); - // verify long and short assets - if ( AddNormalinputs(mtx,mypk,funding+3*txfee,60) > 0 ) + if ( (N= (int32_t)pubkeys.size()) || N > 15 ) { - mtx.vout.push_back(MakeCC1vout(cp->evalcode,funding,pricepk)); - mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricepk)) << OP_CHECKSIG)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesFundingOpRet('F',oracletxid,longtoken,shorttoken,funding,mode,maxleverage,pubkeys))); + fprintf(stderr,"too many pubkeys N.%d\n",N); + return(""); + } + for (i=0; i 0 ) + { + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesFundingOpRet('F',mypk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken))); + } + else + { + CCerror = "cant find enough inputs"; + fprintf(stderr,"%s\n", CCerror.c_str() ); } - CCerror = "cant find enough inputs"; - fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } -std::string PricesAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount) +UniValue PricesInfo(uint256 fundingtxid) { - CMutableTransaction mtx; CScript fundingPubKey,scriptPubKey; CPubKey mypk,pricepk; struct CCcontract_info *cp,C; int64_t minbet,maxbet,maxodds; - if ( amount < 0 ) + UniValue result(UniValue::VOBJ),a(UniValue::VARR); CPubKey pricespk,planpk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction vintx; int64_t balance,supply,exposure; uint64_t funding,mode; int32_t i,margin,maxleverage; char numstr[65],houseaddr[64],exposureaddr[64]; struct CCcontract_info *cp,C,*assetscp,C2; + cp = CCinit(&C,EVAL_PRICES); + assetscp = CCinit(&C2,EVAL_ASSETS); + pricespk = GetUnspendable(cp,0); + if ( GetTransaction(fundingtxid,vintx,hashBlock,false) == 0 ) + { + fprintf(stderr,"cant find fundingtxid\n"); + ERR_RESULT("cant find fundingtxid"); + return(result); + } + if ( vintx.vout.size() > 0 && DecodePricesFundingOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' ) + { + result.push_back(Pair("result","success")); + result.push_back(Pair("fundingtxid",uint256_str(str,fundingtxid))); + result.push_back(Pair("bettoken",uint256_str(str,bettoken))); + result.push_back(Pair("oracletxid",uint256_str(str,oracletxid))); + sprintf(numstr,"%.3f",(double)margin/1000); + result.push_back(Pair("profitmargin",numstr)); + result.push_back(Pair("maxleverage",maxleverage)); + result.push_back(Pair("mode",(int64_t)mode)); + for (i=0; i 0 ) + fprintf(stderr,"cant find fundingtxid\n"); + ERR_RESULT("cant find fundingtxid"); + return(result); + } + if ( tx.vout.size() > 0 && DecodePricesFundingOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' && bettoken == refbettoken ) + { + GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); + if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) { - mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,pricepk)); - mtx.vout.push_back(CTxOut(txfee,fundingPubKey)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesOpRet('E',sbits,fundingtxid,hentropy,zeroid))); + if ( (inputs= AddBetAssetInputs(assetscp,mtx,myaddr,bettoken,amount,60)) >= amount ) + { + mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,amount,pricespk,planpk)); + mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(planpk)) << OP_CHECKSIG)); + if ( inputs > amount+txfee ) + CCchange = (inputs - amount); + mtx.vout.push_back(MakeCCvout(assetscp->evalcode,CCchange,mypk)); + // add addr2 + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',bettoken,zeroid,0,Mypubkey()))); + } + else + { + CCerror = "cant find enough bet inputs"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + } } else { @@ -282,66 +339,106 @@ std::string PricesAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,in fprintf(stderr,"%s\n", CCerror.c_str() ); } } - else - { - CCerror = "only fund creator can add more funds (entropy)"; - fprintf(stderr,"%s\n", CCerror.c_str() ); - } return(""); } -std::string PricesBet(uint64_t txfee,uint256 pricesid,int64_t bet,int32_t odds) +std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount,int32_t leverage) { - CMutableTransaction mtx; CScript fundingPubKey; CPubKey mypk,pricepk; int64_t funding,minbet,maxbet,maxodds; struct CCcontract_info *cp,C; - if ( bet < 0 ) + CMutableTransaction mtx; struct CCcontract_info *cp,C,*asssetcp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; + if ( amount < 0 ) { - CCerror = "bet must be positive"; - fprintf(stderr,"%s\n", CCerror.c_str() ); + amount = -amount; + dir = -1; + } else dir = 1; + cp = CCinit(&C,EVAL_PRICES); + assetscp = CCinit(&C2,EVAL_ASSETS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + pricespk = GetUnspendable(cp,0); + GetCCaddress(myaddr,assetscp,mypk); + if ( GetTransaction(fundingtxid,tx,hashBlock,false) == 0 ) + { + fprintf(stderr,"cant find fundingtxid\n"); + ERR_RESULT("cant find fundingtxid"); return(""); } - if ( odds < 1 || odds > 9999 ) + if ( tx.vout.size() > 0 && DecodePricesFundingOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' && bettoken == refbettoken ) { - CCerror = "odds must be between 1 and 9999"; - fprintf(stderr,"%s\n", CCerror.c_str() ); - return(""); - } - if ( (cp= Pricesinit(fundingPubKey,pricesid,&C,txfee,mypk,pricepk,minbet,maxbet,maxodds)) == 0 ) - return(""); - if ( bet < minbet || bet > maxbet || odds > maxodds ) - { - CCerror = strprintf("Price plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds); - fprintf(stderr,"%s\n", CCerror.c_str() ); - return(""); - } - if ( (funding= PricesPlanFunds(cp,pricepk,pricesid)) >= 2*bet*odds+txfee ) - { - if ( myIsutxo_spentinmempool(entropytxid,0) != 0 ) + if ( leverage > maxleverage || leverage < 1 ) { - CCerror = "entropy txid is spent"; - fprintf(stderr,"%s\n", CCerror.c_str() ); + fprintf(stderr,"illegal leverage\n"); return(""); } - if ( AddNormalinputs(mtx,mypk,bet+2*txfee+odds,60) > 0 ) + GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); + GetCCaddress1of2(exposureaddr,assetscp,pricespk,pricespk); + if ( dir < 0 ) + tokenid = shorttoken; + else tokenid = longtoken; + exposure = leverage * amount; + longexposure = CCtoken_balance(exposureaddr,longtoken); + shortexposure = CCtoken_balance(exposureaddr,shorttoken); + netexposure = (longexposure - shortexposure + exposure*dir); + if ( netexposure < 0 ) + netexposure = -netexposure; + balance = CCtoken_balance(myaddr,bettoken) / COIN; + if ( balance < netexposure*9/10 ) // 10% extra room for dynamically closed bets in wrong direction { - mtx.vout.push_back(MakeCC1vout(cp->evalcode,entropyval,pricepk)); - mtx.vout.push_back(MakeCC1vout(cp->evalcode,bet,pricepk)); - mtx.vout.push_back(CTxOut(txfee+odds,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodePricesOpRet('B',pricesid))); - } else fprintf(stderr,"cant find enough normal inputs for %.8f, plan funding %.8f\n",(double)bet/COIN,(double)funding/COIN); + fprintf(stderr,"balance %lld < 90% netexposure %lld, refuse bet\n",(long long)balance,(long long)netexposure); + return(""); + } + if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 ) + { + if ( (inputs= AddTokensInputs(assetscp,mtx,houseaddr,tokenid,exposure,30)) >= exposure ) + { + if ( (inputs2= AddTokensInputs(assetscp,mtx,myaddr,bettoken,amount,30)) >= amount ) + { + mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,amount,pricespk,planpk)); + mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,exposure,pricespk,pricespk)); + if ( inputs > exposure+txfee ) + CCchange = (inputs - exposure); + if ( inputs2 > amount+txfee ) + CCchange2 = (inputs2 - amount); + mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,CCchange,pricespk,planpk)); + mtx.vout.push_back(MakeCCvout(assetscp->evalcode,CCchange2,mypk)); + // add addr2 and addr3 + return(FinalizeCCTx(mask,assetscp,mtx,mypk,txfee,EncodeAssetOpRetExtra('T',tokenid,bettoken,bettxid,dir*leverage))); + } + else + { + fprintf(stderr,"cant find enough bettoken inputs\n"); + return(""); + } + } + else + { + fprintf(stderr,"cant find enough exposure inputs\n"); + return(""); + } + } + else + { + CCerror = "cant find enough inputsB"; + fprintf(stderr,"%s\n", CCerror.c_str() ); + } } - if ( entropyval == 0 && funding != 0 ) - CCerror = "cant find price entropy inputs"; - else CCerror = "cant find price input"; - fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } -std::string PricesBetFinish(int32_t *resultp,uint64_t txfee,uint256 pricesid,uint256 bettxid) +UniValue PricesStatus(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,uint256 bettxid) +{ + UniValue result(UniValue::VOBJ); + // get height of bettxid + // get price and rekt + // get current height and price + // what about if rekt in the past? + return(result); +} + +std::string PricesFinish(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,uint256 bettxid) { - *resultp = -1; - CCerror = "couldnt find bettx or entropytx"; - fprintf(stderr,"%s\n", CCerror.c_str() ); return(""); } -#endif + + diff --git a/src/komodo_utils.h b/src/komodo_utils.h index d98418c82..2441da83d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1628,6 +1628,11 @@ void komodo_args(char *argv0) { int32_t komodo_baseid(char *origbase); extern int COINBASE_MATURITY; + if ( strcmp(ASSETCHAINS_SYMBOL,"KMD") == 0 ) + { + fprintf(stderr,"cant have assetchain named KMD\n"); + exit(0); + } if ( (port= komodo_userpass(ASSETCHAINS_USERPASS,ASSETCHAINS_SYMBOL)) != 0 ) ASSETCHAINS_RPCPORT = port; else komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_P2PPORT + 1); diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index d268ed7fa..77e53f7a1 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -398,7 +398,14 @@ static const CRPCCommand vRPCCommands[] = { "oracles", "oraclessamples", &oraclessamples, true }, /* Prices */ - { "prices", "pricesaddress", &pricesaddress, true }, + { "prices", "pricesaddress", &pricesaddress, true }, + { "prices", "priceslist", &priceslist, true }, + { "prices", "pricesinfo", &pricesinfo, true }, + { "prices", "pricescreate", &pricescreate, true }, + { "prices", "pricesaddfunding", &pricesaddfunding, true }, + { "prices", "pricesbet", &pricesbet, true }, + { "prices", "pricesstatus", &pricesstatus, true }, + { "prices", "pricesfinish", &pricesfinish, true }, /* Pegs */ { "pegs", "pegsaddress", &pegsaddress, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index 1ebff82ef..e0c87756f 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -232,6 +232,13 @@ extern UniValue oraclessubscribe(const UniValue& params, bool fHelp); extern UniValue oraclesdata(const UniValue& params, bool fHelp); extern UniValue oraclessamples(const UniValue& params, bool fHelp); extern UniValue pricesaddress(const UniValue& params, bool fHelp); +extern UniValue priceslist(const UniValue& params, bool fHelp); +extern UniValue pricesinfo(const UniValue& params, bool fHelp); +extern UniValue pricescreate(const UniValue& params, bool fHelp); +extern UniValue pricesaddfunding(const UniValue& params, bool fHelp); +extern UniValue pricesbet(const UniValue& params, bool fHelp); +extern UniValue pricesstatus(const UniValue& params, bool fHelp); +extern UniValue pricesfinish(const UniValue& params, bool fHelp); extern UniValue pegsaddress(const UniValue& params, bool fHelp); extern UniValue triggersaddress(const UniValue& params, bool fHelp); extern UniValue paymentsaddress(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 44965db73..397c4f3c3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4896,7 +4896,7 @@ UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vector destpubkey; CPubKey pk,pk2; char destaddr[64]; + UniValue result(UniValue::VOBJ); struct CCcontract_info *cp,C; std::vector destpubkey; CPubKey pk,pk2; char destaddr[64]; cp = CCinit(&C,EVAL_CHANNELS); if ( fHelp || params.size() != 1 ) throw runtime_error("channelsaddress destpubkey\n"); @@ -4927,23 +4927,25 @@ UniValue oraclesaddress(const UniValue& params, bool fHelp) UniValue pricesaddress(const UniValue& params, bool fHelp) { - struct CCcontract_info *cp,C; std::vector pubkey; + UniValue result(UniValue::VOBJ); struct CCcontract_info *cp,C,*assetscp,C2; std::vector pubkey; CPubKey mypk,pricespk; char myaddr[64],houseaddr[64],exposureaddr[64]; cp = CCinit(&C,EVAL_PRICES); + assetscp = CCinit(&C2,EVAL_PRICES); if ( fHelp || params.size() > 1 ) throw runtime_error("pricesaddress [pubkey]\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"); if ( params.size() == 1 ) - { pubkey = ParseHex(params[0].get_str().c_str()); - char destaddr[64]; - GetCCaddress1of2(cp,destaddr,pubkey2pk(pubkey),pubkey2pk(pubkey)); - fprintf(stderr,"1of2 CC %s\n",destaddr); - cp->evalcode = EVAL_ASSETS; - GetCCaddress1of2(cp,destaddr,pubkey2pk(pubkey),pubkey2pk(pubkey)); - fprintf(stderr,"1of2 assets CC %s\n",destaddr); - } - return(CCaddress(cp,(char *)"Prices",pubkey)); + result = CCaddress(cp,(char *)"Prices",pubkey); + mypk = pubkey2pk(Mypubkey()); + pricespk = GetUnspendable(cp,0); + GetCCaddress(myaddr,assetscp,mypk); + GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); + GetCCaddress1of2(exposureaddr,assetscp,pricespk,pricespk); + result.push_back(Pair("myaddr",myaddr)); // for holding my asssets + result.push_back(Pair("houseaddr",houseaddr)); // globally accessible house assets + result.push_back(Pair("exposureaddr",exposureaddr)); // tracking of exposure + return(result); } UniValue pegsaddress(const UniValue& params, bool fHelp) @@ -5121,7 +5123,8 @@ UniValue channelsopen(const UniValue& params, bool fHelp) throw runtime_error("channelsopen destpubkey numpayments payment\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"); - LOCK(cs_main); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); destpub = ParseHex(params[0].get_str().c_str()); numpayments = atoi(params[1].get_str().c_str()); payment = atol(params[2].get_str().c_str()); @@ -5142,7 +5145,8 @@ UniValue channelsstop(const UniValue& params, bool fHelp) throw runtime_error("channelsstop destpubkey origtxid\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"); - LOCK(cs_main); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); destpub = ParseHex(params[0].get_str().c_str()); origtxid = Parseuint256((char *)params[1].get_str().c_str()); hex = ChannelStop(0,pubkey2pk(destpub),origtxid); @@ -5162,7 +5166,8 @@ UniValue channelspayment(const UniValue& params, bool fHelp) throw runtime_error("channelspayment prevtxid origtxid n amount\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"); - LOCK(cs_main); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); prevtxid = Parseuint256((char *)params[0].get_str().c_str()); origtxid = Parseuint256((char *)params[1].get_str().c_str()); n = atoi((char *)params[2].get_str().c_str()); @@ -5184,7 +5189,8 @@ UniValue channelscollect(const UniValue& params, bool fHelp) throw runtime_error("channelscollect paytxid origtxid n amount\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"); - LOCK(cs_main); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); paytxid = Parseuint256((char *)params[0].get_str().c_str()); origtxid = Parseuint256((char *)params[1].get_str().c_str()); n = atoi((char *)params[2].get_str().c_str()); @@ -5206,7 +5212,8 @@ UniValue channelsrefund(const UniValue& params, bool fHelp) throw runtime_error("channelsrefund stoptxid origtxid\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"); - LOCK(cs_main); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); stoptxid = Parseuint256((char *)params[0].get_str().c_str()); origtxid = Parseuint256((char *)params[1].get_str().c_str()); hex = ChannelRefund(0,stoptxid,origtxid); @@ -5428,6 +5435,8 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp) throw runtime_error("gatewaysbind tokenid oracletxid coin tokensupply M N pubkey(s)\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); tokenid = Parseuint256((char *)params[0].get_str().c_str()); oracletxid = Parseuint256((char *)params[1].get_str().c_str()); coin = params[2].get_str(); @@ -5459,6 +5468,8 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp) throw runtime_error("gatewaysdeposit bindtxid height coin cointxid claimvout deposithex proof destpub amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); height = atoi((char *)params[1].get_str().c_str()); coin = params[2].get_str(); @@ -5486,6 +5497,8 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp) throw runtime_error("gatewaysclaim bindtxid coin deposittxid destpub amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); deposittxid = Parseuint256((char *)params[2].get_str().c_str()); @@ -5507,6 +5520,8 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp) throw runtime_error("gatewayswithdraw bindtxid coin withdrawpub amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); withdrawpub = ParseHex(params[2].get_str()); @@ -5527,6 +5542,8 @@ UniValue gatewaysmarkdone(const UniValue& params, bool fHelp) throw runtime_error("gatewaysmarkdone withdrawtxid coin cointxid\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); withdrawtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); cointxid = Parseuint256((char *)params[2].get_str().c_str()); @@ -5558,6 +5575,8 @@ UniValue gatewaysmultisig(const UniValue& params, bool fHelp) throw runtime_error("gatewaysmultisig bindtxid coin withtxid txidaddr\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); bindtxid = Parseuint256((char *)params[0].get_str().c_str()); coin = params[1].get_str(); withtxid = Parseuint256((char *)params[2].get_str().c_str()); @@ -5598,6 +5617,8 @@ UniValue oraclesregister(const UniValue& params, bool fHelp) throw runtime_error("oraclesregister oracletxid datafee\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); txid = Parseuint256((char *)params[0].get_str().c_str()); datafee = atol((char *)params[1].get_str().c_str()); hex = OracleRegister(0,txid,datafee); @@ -5616,6 +5637,8 @@ UniValue oraclessubscribe(const UniValue& params, bool fHelp) throw runtime_error("oraclessubscribe oracletxid publisher amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); txid = Parseuint256((char *)params[0].get_str().c_str()); pubkey = ParseHex(params[1].get_str().c_str()); amount = atof((char *)params[2].get_str().c_str()) * COIN; @@ -5648,6 +5671,8 @@ UniValue oraclesdata(const UniValue& params, bool fHelp) throw runtime_error("oraclesdata oracletxid hexstr\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); txid = Parseuint256((char *)params[0].get_str().c_str()); data = ParseHex(params[1].get_str().c_str()); hex = OracleData(0,txid,data); @@ -5784,6 +5809,156 @@ UniValue faucetget(const UniValue& params, bool fHelp) return(result); } +UniValue priceslist(const UniValue& params, bool fHelp) +{ + if ( fHelp || params.size() > 0 ) + throw runtime_error("priceslist\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"); + return(PricesList()); +} + +UniValue pricesinfo(const UniValue& params, bool fHelp) +{ + uint256 fundingtxid; + if ( fHelp || params.size() != 1 ) + throw runtime_error("pricesinfo fundingtxid\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"); + fundingtxid = Parseuint256((char *)params[0].get_str().c_str()); + return(PricesInfo(fundingtxid)); +} + +UniValue pricescreate(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint64_t margin,mode; int32_t i,n,margin,maxleverage; std::string hex; uint256 oracletxid,longtoken,shorttoken,bettoken; std::vector pubkeys; std::vectorpubkey; + if ( fHelp || params.size() < 8 ) + throw runtime_error("pricescreate bettoken oracletxid margin mode longtoken shorttoken maxleverage funding N [pubkeys]\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + bettoken = Parseuint256((char *)params[0].get_str().c_str()); + oracletxid = Parseuint256((char *)params[1].get_str().c_str()); + margin = atof(params[2].get_str().c_str()) * 1000; + mode = atol(params[3].get_str().c_str()); + longtoken = Parseuint256((char *)params[4].get_str().c_str()); + shorttoken = Parseuint256((char *)params[5].get_str().c_str()); + maxleverage = atol(params[6].get_str().c_str()); + funding = atof(params[7].get_str().c_str()) * COIN; + n = atoi(params[8].get_str().c_str()); + if ( n > 0 ) + { + for (i=0; i 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } + else + { + ERR_RESULT("couldnt create prices funding transaction"); + } + return(result); +} + +UniValue pricesaddfunding(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); std::string hex; uint256 fundingtxid,bettoken; int64_t amount; + if ( fHelp || params.size() != 3 ) + throw runtime_error("pricesaddfunding fundingtxid bettoken amount\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + fundingtxid = Parseuint256((char *)params[0].get_str().c_str()); + bettoken = Parseuint256((char *)params[1].get_str().c_str()); + amount = atof(params[2].get_str().c_str()) * COIN; + hex = PricesAddFunding(0,bettoken,fundingtxid,amount); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } + else + { + ERR_RESULT("couldnt create pricesaddfunding transaction"); + } + return(result); +} + +UniValue pricesbet(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); std::string hex; uint256 fundingtxid,bettoken; int64_t amount; int32_t leverage; + if ( fHelp || params.size() != 4 ) + throw runtime_error("pricesbet fundingtxid bettoken amount leverage\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + fundingtxid = Parseuint256((char *)params[0].get_str().c_str()); + bettoken = Parseuint256((char *)params[1].get_str().c_str()); + amount = atof(params[2].get_str().c_str()) * COIN; + leverage = atoi(params[3].get_str().c_str()); + hex = PricesBet(0,bettoken,fundingtxid,amount,leverage); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } + else + { + ERR_RESULT("couldnt create pricesbet transaction"); + } + return(result); +} + +UniValue pricesstatus(const UniValue& params, bool fHelp) +{ + uint256 fundingtxid,bettxid,bettoken; + if ( fHelp || params.size() != 3 ) + throw runtime_error("pricesstatus fundingtxid bettoken bettxid\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"); + fundingtxid = Parseuint256((char *)params[0].get_str().c_str()); + bettoken = Parseuint256((char *)params[1].get_str().c_str()); + bettxid = Parseuint256((char *)params[2].get_str().c_str()); + return(PricesStatus(0,bettoken,fundingtxid,bettxid)); +} + +UniValue pricesfinish(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); uint256 fundingtxid,bettxid,bettoken; std::string hex; + if ( fHelp || params.size() != 3 ) + throw runtime_error("pricesfinish fundingtxid bettoken bettxid\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + fundingtxid = Parseuint256((char *)params[0].get_str().c_str()); + bettoken = Parseuint256((char *)params[1].get_str().c_str()); + bettxid = Parseuint256((char *)params[2].get_str().c_str()); + hex = PricesFinish(0,bettoken,fundingtxid,bettxid); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } + else + { + ERR_RESULT("couldnt create pricesfinish transaction"); + } + return(result); +} + UniValue dicefund(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); int64_t funds,minbet,maxbet,maxodds,timeoutblocks; std::string hex; char *name; @@ -5955,7 +6130,6 @@ UniValue dicestatus(const UniValue& params, bool fHelp) UniValue dicelist(const UniValue& params, bool fHelp) { - uint256 tokenid; if ( fHelp || params.size() > 0 ) throw runtime_error("dicelist\n"); if ( ensure_CCrequirements() < 0 ) From bfd7858525db2e8b929d099b2406c940714afff2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:09:27 -1100 Subject: [PATCH 212/306] Syntax --- src/cc/prices.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 49e87127a..0c530d0aa 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -71,7 +71,7 @@ int64_t PricesOraclePrice(int64_t &rektprice,uint64_t mode,uint256 oracletxid,st return(price); } -CScript EncodePricesFundingOpRet(uint8_t funcid,CPubKey planpk,uint256 oracletxid,uint256 longtoken,uint256 shorttoken,int32_t millimargin,uint64_t mode,int32_t maxleverage,std::vector pubkeys) +CScript EncodePricesFundingOpRet(uint8_t funcid,CPubKey planpk,uint256 oracletxid,uint256 longtoken,uint256 shorttoken,int32_t millimargin,uint64_t mode,int32_t maxleverage,std::vector pubkeys,uint256 bettoken) { CScript opret; fprintf(stderr,"implement EncodePricesFundingOpRet\n"); @@ -104,12 +104,12 @@ bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx } } //fprintf(stderr,"check amounts\n"); - if ( PricesExactAmounts(cp,eval,tx,1,10000) == false ) + //if ( PricesExactAmounts(cp,eval,tx,1,10000) == false ) { fprintf(stderr,"Pricesget invalid amount\n"); return false; } - else + //else { txid = tx.GetHash(); memcpy(hash,&txid,sizeof(hash)); @@ -135,10 +135,10 @@ int64_t AddTokensInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,char txid = it->first.txhash; vout = (int32_t)it->first.index; // need to prevent dup - if ( GetTransaction(txid,vintx,hashBlock,false) != 0 && vout < tx.vout.size() ) + if ( GetTransaction(txid,vintx,hashBlock,false) != 0 && vout < vintx.vout.size() ) { // need to verify assetid - if ( (nValue= vintx.vout[vout].nValue)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) + if ( (nValue= vintx.vout[vout].nValue) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); @@ -208,7 +208,7 @@ std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletx } if ( GetCCaddress1of2(houseaddr,cp,pricespk,mypk) == 0 ) { - fprintf(stderr,"PricesCreateFunding (%s) cant create globaladdr\n",uint256_str(str,tokenid)); + fprintf(stderr,"PricesCreateFunding cant create globaladdr\n"); return(""); } if ( CCtoken_balance(houseaddr,longtoken) != CCfullsupply(longtoken) ) From 5efdb4f325c5ae29da5fa7cc17e36142ae548b34 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:10:58 -1100 Subject: [PATCH 213/306] N --- src/cc/prices.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 0c530d0aa..eb47c33db 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -206,7 +206,7 @@ std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletx return(""); } } - if ( GetCCaddress1of2(houseaddr,cp,pricespk,mypk) == 0 ) + if ( GetCCaddress1of2(cp,houseaddr,pricespk,mypk) == 0 ) { fprintf(stderr,"PricesCreateFunding cant create globaladdr\n"); return(""); @@ -266,8 +266,8 @@ UniValue PricesInfo(uint256 fundingtxid) for (i=0; i 0 && DecodePricesFundingOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' && bettoken == refbettoken ) { - GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); + GetCCaddress1of2(assetscp,houseaddr,pricespk,planpk); if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) { if ( (inputs= AddBetAssetInputs(assetscp,mtx,myaddr,bettoken,amount,60)) >= amount ) @@ -370,8 +370,8 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int fprintf(stderr,"illegal leverage\n"); return(""); } - GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); - GetCCaddress1of2(exposureaddr,assetscp,pricespk,pricespk); + GetCCaddress1of2(assetscp,houseaddr,pricespk,planpk); + GetCCaddress1of2(assetscp,exposureaddr,pricespk,pricespk); if ( dir < 0 ) tokenid = shorttoken; else tokenid = longtoken; From 816acd6719d67bb5a299e2fd9de22aacfe95dd7b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:14:25 -1100 Subject: [PATCH 214/306] Test --- src/cc/prices.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index eb47c33db..935986920 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -243,7 +243,7 @@ std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletx UniValue PricesInfo(uint256 fundingtxid) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); CPubKey pricespk,planpk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction vintx; int64_t balance,supply,exposure; uint64_t funding,mode; int32_t i,margin,maxleverage; char numstr[65],houseaddr[64],exposureaddr[64]; struct CCcontract_info *cp,C,*assetscp,C2; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); CPubKey pricespk,planpk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction vintx; int64_t balance,supply,exposure; uint64_t funding,mode; int32_t i,margin,maxleverage; char numstr[65],houseaddr[64],exposureaddr[64],str[65]; std::vectorpubkeys; struct CCcontract_info *cp,C,*assetscp,C2; cp = CCinit(&C,EVAL_PRICES); assetscp = CCinit(&C2,EVAL_ASSETS); pricespk = GetUnspendable(cp,0); @@ -292,7 +292,7 @@ UniValue PricesInfo(uint256 fundingtxid) std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount) { - CMutableTransaction mtx; struct CCcontract_info *cp,C,*assetscp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,CCchange = 0; uint64_t funding,mode; int32_t margin,maxleverage; char houseaddr[64],myaddr[64]; + CMutableTransaction mtx; struct CCcontract_info *cp,C,*assetscp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,CCchange = 0; uint64_t funding,mode; int32_t margin,maxleverage; char houseaddr[64],myaddr[64]; std::vectorpubkeys; if ( amount < 10000 ) { CCerror = "amount must be positive"; @@ -305,7 +305,7 @@ std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt txfee = 10000; mypk = pubkey2pk(Mypubkey()); pricespk = GetUnspendable(cp,0); - GetCCaddress(myaddr,assetscp,mypk); + GetCCaddress(assetscp,myaddr,mypk); if ( GetTransaction(fundingtxid,tx,hashBlock,false) == 0 ) { fprintf(stderr,"cant find fundingtxid\n"); @@ -344,7 +344,7 @@ std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount,int32_t leverage) { - CMutableTransaction mtx; struct CCcontract_info *cp,C,*asssetcp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; + CMutableTransaction mtx; struct CCcontract_info *cp,C,*asssetcp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; std::vectorpubkeys; if ( amount < 0 ) { amount = -amount; @@ -356,7 +356,7 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int txfee = 10000; mypk = pubkey2pk(Mypubkey()); pricespk = GetUnspendable(cp,0); - GetCCaddress(myaddr,assetscp,mypk); + GetCCaddress(assetscp,myaddr,mypk); if ( GetTransaction(fundingtxid,tx,hashBlock,false) == 0 ) { fprintf(stderr,"cant find fundingtxid\n"); From f6b969d4b419f8563bd13ad685da517528a2518e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:17:06 -1100 Subject: [PATCH 215/306] Test --- src/cc/prices.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 935986920..174c824f3 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -309,15 +309,14 @@ std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt if ( GetTransaction(fundingtxid,tx,hashBlock,false) == 0 ) { fprintf(stderr,"cant find fundingtxid\n"); - ERR_RESULT("cant find fundingtxid"); - return(result); + return(""); } if ( tx.vout.size() > 0 && DecodePricesFundingOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' && bettoken == refbettoken ) { GetCCaddress1of2(assetscp,houseaddr,pricespk,planpk); if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 ) { - if ( (inputs= AddBetAssetInputs(assetscp,mtx,myaddr,bettoken,amount,60)) >= amount ) + if ( (inputs= AddTokensInputs(assetscp,mtx,myaddr,bettoken,amount,60)) >= amount ) { mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,amount,pricespk,planpk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(planpk)) << OP_CHECKSIG)); @@ -344,7 +343,7 @@ std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount,int32_t leverage) { - CMutableTransaction mtx; struct CCcontract_info *cp,C,*asssetcp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; std::vectorpubkeys; + CMutableTransaction mtx; struct CCcontract_info *cp,C,*assetscp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; std::vectorpubkeys; if ( amount < 0 ) { amount = -amount; @@ -360,7 +359,6 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int if ( GetTransaction(fundingtxid,tx,hashBlock,false) == 0 ) { fprintf(stderr,"cant find fundingtxid\n"); - ERR_RESULT("cant find fundingtxid"); return(""); } if ( tx.vout.size() > 0 && DecodePricesFundingOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,planpk,oracletxid,longtoken,shorttoken,margin,mode,maxleverage,pubkeys,bettoken) == 'F' && bettoken == refbettoken ) @@ -384,7 +382,7 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int balance = CCtoken_balance(myaddr,bettoken) / COIN; if ( balance < netexposure*9/10 ) // 10% extra room for dynamically closed bets in wrong direction { - fprintf(stderr,"balance %lld < 90% netexposure %lld, refuse bet\n",(long long)balance,(long long)netexposure); + fprintf(stderr,"balance %lld < 90%% netexposure %lld, refuse bet\n",(long long)balance,(long long)netexposure); return(""); } if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 ) @@ -402,7 +400,7 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,CCchange,pricespk,planpk)); mtx.vout.push_back(MakeCCvout(assetscp->evalcode,CCchange2,mypk)); // add addr2 and addr3 - return(FinalizeCCTx(mask,assetscp,mtx,mypk,txfee,EncodeAssetOpRetExtra('T',tokenid,bettoken,bettxid,dir*leverage))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRetExtra('T',tokenid,bettoken,zeroid,dir*leverage))); } else { From feb11ae0389b15cc5650ebb0c65b1e9f0b21783a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:18:15 -1100 Subject: [PATCH 216/306] std::vectorpubkeys; --- src/cc/prices.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 174c824f3..d1ec9167a 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -322,7 +322,7 @@ std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(planpk)) << OP_CHECKSIG)); if ( inputs > amount+txfee ) CCchange = (inputs - amount); - mtx.vout.push_back(MakeCCvout(assetscp->evalcode,CCchange,mypk)); + mtx.vout.push_back(MakeCC1vout(assetscp->evalcode,CCchange,mypk)); // add addr2 return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',bettoken,zeroid,0,Mypubkey()))); } @@ -398,7 +398,7 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int if ( inputs2 > amount+txfee ) CCchange2 = (inputs2 - amount); mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,CCchange,pricespk,planpk)); - mtx.vout.push_back(MakeCCvout(assetscp->evalcode,CCchange2,mypk)); + mtx.vout.push_back(MakeCC1vout(assetscp->evalcode,CCchange2,mypk)); // add addr2 and addr3 return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRetExtra('T',tokenid,bettoken,zeroid,dir*leverage))); } From 06c4e87ff978dfd04b1c1e88e465a5fce9292d31 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:29:11 -1100 Subject: [PATCH 217/306] CCprices.h --- src/wallet/rpcwallet.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 397c4f3c3..68c13b2b3 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4858,6 +4858,7 @@ int32_t ensure_CCrequirements() #include "../cc/CCchannels.h" #include "../cc/CCOracles.h" #include "../cc/CCGateways.h" +#include "../cc/CCPrices.h" UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vector &pubkey) { From a51c08d1a193e609280e440e67cc6a27107c8dd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:32:22 -1100 Subject: [PATCH 218/306] Test --- src/cc/CCPrices.h | 2 +- src/wallet/rpcwallet.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/CCPrices.h b/src/cc/CCPrices.h index d35823838..f375ee10a 100644 --- a/src/cc/CCPrices.h +++ b/src/cc/CCPrices.h @@ -24,7 +24,7 @@ bool PricesValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx // CCcustom UniValue PricesList(); UniValue PricesInfo(uint256 fundingtxid); -UniValue PricesStatus(uint64_t txfee,uint256 fundingtxid,uint256 bettxid); +UniValue PricesStatus(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,uint256 bettxid); std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletxid,uint64_t margin,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,std::vector pubkeys); std::string PricesAddFunding(uint64_t txfee,uint256 bettoken,uint256 fundingtxid,int64_t amount); std::string PricesBet(uint64_t txfee,uint256 bettoken,uint256 fundingtxid,int64_t amount,int32_t leverage); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 68c13b2b3..c1dd1c3fb 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4928,7 +4928,7 @@ UniValue oraclesaddress(const UniValue& params, bool fHelp) UniValue pricesaddress(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); struct CCcontract_info *cp,C,*assetscp,C2; std::vector pubkey; CPubKey mypk,pricespk; char myaddr[64],houseaddr[64],exposureaddr[64]; + UniValue result(UniValue::VOBJ); struct CCcontract_info *cp,C,*assetscp,C2; std::vector pubkey; CPubKey mypk,planpk,pricespk; char myaddr[64],houseaddr[64],exposureaddr[64]; cp = CCinit(&C,EVAL_PRICES); assetscp = CCinit(&C2,EVAL_PRICES); if ( fHelp || params.size() > 1 ) @@ -4940,9 +4940,9 @@ UniValue pricesaddress(const UniValue& params, bool fHelp) result = CCaddress(cp,(char *)"Prices",pubkey); mypk = pubkey2pk(Mypubkey()); pricespk = GetUnspendable(cp,0); - GetCCaddress(myaddr,assetscp,mypk); - GetCCaddress1of2(houseaddr,assetscp,pricespk,planpk); - GetCCaddress1of2(exposureaddr,assetscp,pricespk,pricespk); + GetCCaddress(assetscp,myaddr,mypk); + GetCCaddress1of2(assetscp,houseaddr,pricespk,planpk); + GetCCaddress1of2(assetscp,exposureaddr,pricespk,pricespk); result.push_back(Pair("myaddr",myaddr)); // for holding my asssets result.push_back(Pair("houseaddr",houseaddr)); // globally accessible house assets result.push_back(Pair("exposureaddr",exposureaddr)); // tracking of exposure @@ -5832,7 +5832,7 @@ UniValue pricesinfo(const UniValue& params, bool fHelp) UniValue pricescreate(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint64_t margin,mode; int32_t i,n,margin,maxleverage; std::string hex; uint256 oracletxid,longtoken,shorttoken,bettoken; std::vector pubkeys; std::vectorpubkey; + UniValue result(UniValue::VOBJ); uint64_t mode; int64_t funding; int32_t i,n,margin,maxleverage; std::string hex; uint256 oracletxid,longtoken,shorttoken,bettoken; std::vector pubkeys; std::vectorpubkey; if ( fHelp || params.size() < 8 ) throw runtime_error("pricescreate bettoken oracletxid margin mode longtoken shorttoken maxleverage funding N [pubkeys]\n"); if ( ensure_CCrequirements() < 0 ) From 7d6f7d7ea5d7dee6e25e4abe65ac89607cf71230 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:34:25 -1100 Subject: [PATCH 219/306] PricesAddFunding --- src/cc/prices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index d1ec9167a..e8755b53e 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -290,7 +290,7 @@ UniValue PricesInfo(uint256 fundingtxid) return(result); } -std::string PricesAddfunding(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount) +std::string PricesAddFunding(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount) { CMutableTransaction mtx; struct CCcontract_info *cp,C,*assetscp,C2; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,CCchange = 0; uint64_t funding,mode; int32_t margin,maxleverage; char houseaddr[64],myaddr[64]; std::vectorpubkeys; if ( amount < 10000 ) From 541e5e92491cef6df3c6b5b2e87673ae31a96aa2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 21:51:56 -1100 Subject: [PATCH 220/306] Token convert --- src/cc/CCassets.h | 2 ++ src/cc/CCassetstx.cpp | 27 +++++++++++++++++++++++++++ src/cc/gateways.cpp | 2 +- src/rpcserver.cpp | 1 + src/rpcserver.h | 1 + src/wallet/rpcwallet.cpp | 36 ++++++++++++++++++++++++++++++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/cc/CCassets.h b/src/cc/CCassets.h index afb3579cf..0fb4ae6f7 100644 --- a/src/cc/CCassets.h +++ b/src/cc/CCassets.h @@ -54,6 +54,8 @@ UniValue AssetInfo(uint256 tokenid); UniValue AssetList(); std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std::string description); std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector destpubkey,int64_t total); +std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector destpubkey,int64_t total,int32_t evalcode); + std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64_t pricetotal); std::string CancelBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid); std::string FillBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid,int64_t fillamount); diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 63d1a1089..2ce13a1ff 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -243,6 +243,33 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector des return(""); } +std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector destpubkey,int64_t total,int32_t evalcode) +{ + CMutableTransaction mtx; CPubKey mypk; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C; + if ( total < 0 ) + { + fprintf(stderr,"negative total %lld\n",(long long)total); + return(""); + } + cp = CCinit(&C,EVAL_ASSETS); + if ( txfee == 0 ) + txfee = 10000; + mypk = pubkey2pk(Mypubkey()); + if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) + { + if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,total,60)) > 0 ) + { + if ( inputs > total ) + CCchange = (inputs - total); + mtx.vout.push_back(MakeCC1vout(evalcode,total,pubkey2pk(destpubkey))); + if ( CCchange != 0 ) + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + } else fprintf(stderr,"not enough CC asset inputs for %.8f\n",(double)total/COIN); + } + return(""); +} + std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64_t pricetotal) { CMutableTransaction mtx; CPubKey mypk; struct CCcontract_info *cp,C; uint256 hashBlock; CTransaction vintx; std::vector origpubkey; std::string name,description; diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 9146a864b..3acc69027 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -474,7 +474,7 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - if ( _GetCCaddress(destaddr,EVAL_ASSETS,gatewayspk) == 0 ) + if ( _GetCCaddress(destaddr,EVAL_GATEWAYS,gatewayspk) == 0 ) { fprintf(stderr,"Gateway bind.%s (%s) cant create globaladdr\n",coin.c_str(),uint256_str(str,tokenid)); return(""); diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 77e53f7a1..8934ae717 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -454,6 +454,7 @@ static const CRPCCommand vRPCCommands[] = { "tokens", "tokencancelask", &tokencancelask, true }, { "tokens", "tokenfillask", &tokenfillask, true }, //{ "tokens", "tokenfillswap", &tokenfillswap, true }, + { "tokens", "tokenconvert", &tokenconvert, true }, /* Address index */ { "addressindex", "getaddressmempool", &getaddressmempool, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index e0c87756f..f4c502d63 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -221,6 +221,7 @@ extern UniValue tokenfillbid(const UniValue& params, bool fHelp); extern UniValue tokenask(const UniValue& params, bool fHelp); extern UniValue tokencancelask(const UniValue& params, bool fHelp); extern UniValue tokenfillask(const UniValue& params, bool fHelp); +extern UniValue tokenconvert(const UniValue& params, bool fHelp); extern UniValue mofnaddress(const UniValue& params, bool fHelp); extern UniValue channelsaddress(const UniValue& params, bool fHelp); extern UniValue oraclesaddress(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c1dd1c3fb..e8fff8904 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -6279,6 +6279,42 @@ UniValue tokentransfer(const UniValue& params, bool fHelp) return(result); } +UniValue tokenconvert(const UniValue& params, bool fHelp) +{ + UniValue result(UniValue::VOBJ); std::string hex; int32_t evalcode; int64_t amount; uint256 tokenid; + if ( fHelp || params.size() != 3 ) + throw runtime_error("tokenconvert evalcode tokenid pubkey amount\n"); + if ( ensure_CCrequirements() < 0 ) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + evalcode = atoi(params[0].get_str().c_str()); + tokenid = Parseuint256((char *)params[1].get_str().c_str()); + std::vector pubkey(ParseHex(params[2].get_str().c_str())); + amount = atol(params[3].get_str().c_str()); + if ( tokenid == zeroid ) + { + ERR_RESULT("invalid tokenid"); + return(result); + } + if ( amount <= 0 ) + { + ERR_RESULT("amount must be positive"); + return(result); + } + hex = AssetConvert(0,tokenid,pubkey,amount,evalcode); + if (amount > 0) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt convert tokens"); + } else { + ERR_RESULT("amount must be positive"); + } + return(result); +} + UniValue tokenbid(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); int64_t bidamount,numtokens; std::string hex; double price; uint256 tokenid; From 009f09069b4433b53a8e559be2fed6f3435793cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 22:08:09 -1100 Subject: [PATCH 221/306] Remove dualmode for gateways --- src/cc/gateways.cpp | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3acc69027..8e9a04c62 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -134,6 +134,7 @@ Implementation Issues: When thinking about validation, it is clear that we cant use EVAL_ASSETS for the locked coins as there wont be any enforcement of the gateways locking. This means we need a way to transfer assets into gateways outputs and back. It seems a tokenconvert rpc will be needed and hopefully that will be enough to make it all work properly. + Care must be taken so that tokens are not lost and can be converted back */ @@ -382,7 +383,7 @@ UniValue GatewaysInfo(uint256 bindtxid) result.push_back(Pair("name","Gateways")); cp = CCinit(&C,EVAL_GATEWAYS); Gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(gatewaysassets,EVAL_ASSETS,Gatewayspk); + _GetCCaddress(gatewaysassets,EVAL_GATEWAYS,Gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) { depositaddr[0] = 0; @@ -681,18 +682,12 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64],coinaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); - assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); - CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,coinaddr); - Myprivkey(mypriv); - _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); - CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -716,15 +711,15 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddGatewaysInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); mtx.vin.push_back(CTxIn(deposittxid,0,CScript())); // triggers EVAL_GATEWAYS validation - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); // transfer back to normal token if ( CCchange != 0 ) - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CCchange,gatewayspk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); @@ -733,18 +728,12 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,std::vector withdrawpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C; uint256 assetid,hashBlock,oracletxid; int32_t numvouts; int64_t totalsupply,inputs,CCchange=0; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; char depositaddr[64],str[65],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); - assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); - CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,coinaddr); - Myprivkey(mypriv); - _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); - CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -757,16 +746,16 @@ std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin } if ( AddNormalinputs(mtx,mypk,3*txfee,3) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,mypk,assetid,amount,60)) > 0 ) + if ( (inputs= AddGatewaysInputs(cp,mtx,mypk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,gatewayspk)); + mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,amount,gatewayspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << withdrawpub << OP_CHECKSIG)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(gatewayspk)) << OP_CHECKSIG)); if ( CCchange != 0 ) - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + mtx.vout.push_back(MakeCC1vout(EVAL_GATEWAYS,CCchange,mypk)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); @@ -793,7 +782,7 @@ UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin) cp = CCinit(&C,EVAL_GATEWAYS); mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); + _GetCCaddress(coinaddr,EVAL_GATEWAYS,gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -856,7 +845,7 @@ std::string GatewaysMultisig(uint64_t txfee,std::string refcoin,uint256 bindtxid complete = partialtx = 0; mypk = pubkey2pk(Mypubkey()); Gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(gatewaysassets,EVAL_ASSETS,Gatewayspk); + _GetCCaddress(gatewaysassets,EVAL_GATEWAYS,Gatewayspk); if ( GetTransaction(bindtxid,tx,hashBlock,false) != 0 ) { depositaddr[0] = 0; From 9eece428bb7b48b53e3139301cc1e90a5783cb17 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 22:15:50 -1100 Subject: [PATCH 222/306] Test --- src/cc/gateways.cpp | 62 +++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 8e9a04c62..effc02ea8 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -288,33 +288,41 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & // helper functions for rpc calls in rpcwallet.cpp -/*int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs) - { - char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; - std::vector > unspentOutputs; - GetCCaddress(cp,coinaddr,pk); - SetCCunspents(unspentOutputs,coinaddr); - for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) - { - txid = it->first.txhash; - vout = (int32_t)it->first.index; - // no need to prevent dup - if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) - { - if ( (nValue= IsGatewaysvout(cp,vintx,vout)) > 10000 && myIsutxo_spentinmempool(txid,vout) == 0 ) - { - if ( total != 0 && maxinputs != 0 ) - mtx.vin.push_back(CTxIn(txid,vout,CScript())); - nValue = it->second.satoshis; - totalinputs += nValue; - n++; - if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) - break; - } - } - } - return(totalinputs); - }*/ +int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs) +{ + char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; + std::vector > unspentOutputs; + GetCCaddress(cp,coinaddr,pk); + SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + for (j=0; junspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) + continue; + // check for gatewaysassset + if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) + { + if ( total != 0 && maxinputs != 0 ) + mtx.vin.push_back(CTxIn(txid,vout,CScript())); + nValue = it->second.satoshis; + totalinputs += nValue; + n++; + if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) + break; + } + } + } + return(totalinputs); +} int32_t GatewaysBindExists(struct CCcontract_info *cp,CPubKey gatewayspk,uint256 reftokenid) // dont forget to check mempool! { From 1605948a06c64a9aac9e5da3553c9cdb6e814c58 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 22:18:51 -1100 Subject: [PATCH 223/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index effc02ea8..1d57e8bc4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -308,8 +308,8 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; - // check for gatewaysassset - if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) + // check for gatewaysassset assetid and 't' + if ( (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); From dceeaa3dc59dfe04d87896f85cf4c0ba276f46b5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 22:35:08 -1100 Subject: [PATCH 224/306] Test --- src/cc/gateways.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 1d57e8bc4..69594583a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -288,9 +288,9 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & // helper functions for rpc calls in rpcwallet.cpp -int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs) +int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 refassetid,int64_t total,int32_t maxinputs) { - char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; + char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; std::vector vopret; CTransaction vintx; int32_t j,vout,n = 0; uint8_t evalcode,funcid; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -308,16 +308,20 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; - // check for gatewaysassset assetid and 't' - if ( (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) + GetOpReturnData(vintx.vout[vintx.vout.size()-1].scriptPubKey, vopret); + if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { - if ( total != 0 && maxinputs != 0 ) - mtx.vin.push_back(CTxIn(txid,vout,CScript())); - nValue = it->second.satoshis; - totalinputs += nValue; - n++; - if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) - break; + assetid = revuint256(assetid); + if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) + { + if ( total != 0 && maxinputs != 0 ) + mtx.vin.push_back(CTxIn(txid,vout,CScript())); + nValue = it->second.satoshis; + totalinputs += nValue; + n++; + if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) + break; + } } } } From 2884a3f64add9fec0150167aa54a92d213a4b2b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 19 Sep 2018 22:35:50 -1100 Subject: [PATCH 225/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 69594583a..5c06a7c54 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -290,7 +290,7 @@ bool GatewaysValidate(struct CCcontract_info *cp,Eval *eval,const CTransaction & int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 refassetid,int64_t total,int32_t maxinputs) { - char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; std::vector vopret; CTransaction vintx; int32_t j,vout,n = 0; uint8_t evalcode,funcid; + char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 assetid,txid,hashBlock; std::vector origpubkey; std::vector vopret; CTransaction vintx; int32_t j,vout,n = 0; uint8_t evalcode,funcid; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); From ff3116ce3cd816007fba72e1ea8a4bd3c270eef0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 02:55:45 -1100 Subject: [PATCH 226/306] Chance for AssetConvert to validate --- src/cc/CCassetsCore.cpp | 3 ++- src/cc/CCassetstx.cpp | 3 +-- src/cc/assets.cpp | 1 - src/cc/gateways.cpp | 6 +++++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index cd2e267e1..e2bcf01ff 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -490,8 +490,9 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti fprintf(stderr,"i.%d starti.%d numvins.%d\n",i,starti,numvins); return eval->Invalid("always should find vin, but didnt"); } - else if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 ) + else if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 || vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 ) { + assetoshis = vinTx.vout[i].nValue; fprintf(stderr,"vin%d %llu, ",i,(long long)assetoshis); inputs += assetoshis; } diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 2ce13a1ff..70a2c76ee 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -261,9 +261,8 @@ std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector dest { if ( inputs > total ) CCchange = (inputs - total); + mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); mtx.vout.push_back(MakeCC1vout(evalcode,total,pubkey2pk(destpubkey))); - if ( CCchange != 0 ) - mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } else fprintf(stderr,"not enough CC asset inputs for %.8f\n",(double)total/COIN); } diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index bf979a1e0..fa6d87500 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -167,7 +167,6 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx //vout.n-1: opreturn [EVAL_ASSETS] ['c'] [{"":""}] return eval->Invalid("unexpected AssetValidate for createasset"); break; - case 't': // transfer //vin.0: normal input //vin.1 .. vin.n-1: valid CC outputs diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5c06a7c54..976cd1971 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -134,7 +134,11 @@ Implementation Issues: When thinking about validation, it is clear that we cant use EVAL_ASSETS for the locked coins as there wont be any enforcement of the gateways locking. This means we need a way to transfer assets into gateways outputs and back. It seems a tokenconvert rpc will be needed and hopefully that will be enough to make it all work properly. - Care must be taken so that tokens are not lost and can be converted back + Care must be taken so that tokens are not lost and can be converted back. + + This changes the usage to require tokenconvert before doing the bind and also tokenconvert before doing a withdraw. EVAL_GATEWAYS has evalcode of 251 + + The gatewaysclaim automatically converts the deposit amount of tokens back to EVAL_ASSETS. */ From 627cd0f5590ff1f66bfabb4f756ce7b36677896e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 03:45:37 -1100 Subject: [PATCH 227/306] Assets 't' exemption --- src/cc/CCassets.h | 2 +- src/cc/CCassetsCore.cpp | 71 +++++++++++++++++------------------------ src/cc/CCinclude.h | 4 +-- src/cc/CCtx.cpp | 4 +-- src/cc/assets.cpp | 4 +-- 5 files changed, 35 insertions(+), 50 deletions(-) diff --git a/src/cc/CCassets.h b/src/cc/CCassets.h index 0fb4ae6f7..4d4f30b3b 100644 --- a/src/cc/CCassets.h +++ b/src/cc/CCassets.h @@ -33,7 +33,7 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx CScript EncodeAssetCreateOpRet(uint8_t funcid,std::vector origpubkey,std::string name,std::string description); CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t price,std::vector origpubkey); bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &origpubkey,std::string &name,std::string &description); -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage); +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); bool SetAssetOrigpubkey(std::vector &origpubkey,int64_t &price,const CTransaction &tx); int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid); bool ValidateBidRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice); diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index e2bcf01ff..f53633813 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -274,29 +274,7 @@ bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector &or return(0); } -CScript EncodeAssetOpRetExtra(uint8_t funcid,uint256 assetid,uint256 assetid2,uint256 bettxid,int32_t leverage) -{ - CScript opret; uint8_t evalcode = EVAL_ASSETS; - assetid = revuint256(assetid); - assetid2 = revuint256(assetid2); - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << assetid << assetid2 << bettxid << leverage); - return(opret); -} - -uint8_t DecodeAssetOpRetExtra(CScript scriptPubKey,uint256 &assetid,uint256 &assetid2,uint256 &bettxid,int32_t leverage) -{ - std::vector vopret; uint8_t funcid=0,e,f; - GetOpReturnData(scriptPubKey, vopret); - if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> assetid2; ss >> bettxid; ss >> leverage) != 0 ) - { - assetid = revuint256(assetid); - assetid2 = revuint256(assetid2); - return(funcid); - } - return(0); -} - -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage) +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey) { std::vector vopret; uint8_t funcid=0,*script,e,f; GetOpReturnData(scriptPubKey, vopret); @@ -319,14 +297,6 @@ uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &a return(funcid); } break; - case 'T': - if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> assetid2; ss >> bettxid; ss >> leverage) != 0 ) - { - assetid = revuint256(assetid); - assetid2 = revuint256(assetid2); - return(funcid); - } - break; case 's': case 'b': case 'S': case 'B': if ( E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> assetid; ss >> price; ss >> origpubkey) != 0 ) { @@ -355,17 +325,17 @@ uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &a bool SetAssetOrigpubkey(std::vector &origpubkey,int64_t &price,const CTransaction &tx) { - uint256 assetid,assetid2,bettxid; int32_t leverage; - if ( tx.vout.size() > 0 && DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage) != 0 ) + uint256 assetid,assetid2; + if ( tx.vout.size() > 0 && DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 ) return(true); else return(false); } bool GetAssetorigaddrs(struct CCcontract_info *cp,char *CCaddr,char *destaddr,const CTransaction& tx) { - uint256 assetid,assetid2,bettxid; int32_t leverage; int64_t price,nValue=0; int32_t n; uint8_t funcid; std::vector origpubkey; CScript script; + uint256 assetid,assetid2; int64_t price,nValue=0; int32_t n; uint8_t funcid; std::vector origpubkey; CScript script; n = tx.vout.size(); - if ( n == 0 || (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) == 0 ) + if ( n == 0 || (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) return(false); if ( GetCCaddress(cp,CCaddr,pubkey2pk(origpubkey)) != 0 && Getscriptaddress(destaddr,CScript() << origpubkey << OP_CHECKSIG) != 0 ) return(true); @@ -374,7 +344,7 @@ bool GetAssetorigaddrs(struct CCcontract_info *cp,char *CCaddr,char *destaddr,co int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid) { - uint256 assetid,assetid2,bettxid; int64_t nValue=0; int32_t n,leverage; uint8_t funcid; + uint256 assetid,assetid2; int64_t nValue=0; int32_t n; uint8_t funcid; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) // maybe check address too? { n = tx.vout.size(); @@ -382,7 +352,7 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans //fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); if ( v >= n-1 ) return(0); - if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) == 0 ) + if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) { fprintf(stderr,"null decodeopret v.%d\n",v); return(0); @@ -444,7 +414,7 @@ int64_t AssetValidateCCvin(struct CCcontract_info *cp,Eval* eval,char *CCaddr,ch int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid) { - CTransaction vinTx; int64_t nValue; int32_t leverage; uint256 assetid,assetid2,bettxid; uint8_t funcid; + CTransaction vinTx; int64_t nValue; uint256 assetid,assetid2; uint8_t funcid; CCaddr[0] = origaddr[0] = 0; if ( (nValue= AssetValidateCCvin(cp,eval,CCaddr,origaddr,tx,1,vinTx)) == 0 ) return(0); @@ -453,7 +423,7 @@ int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmppr else { //fprintf(stderr,"have %.8f checking assetid origaddr.(%s)\n",(double)nValue/COIN,origaddr); - if ( vinTx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,assetid,assetid2,tmpprice,tmporigpubkey,bettxid,leverage)) != 'b' && funcid != 'B' ) + if ( vinTx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,assetid,assetid2,tmpprice,tmporigpubkey)) != 'b' && funcid != 'B' ) return eval->Invalid("invalid opreturn for buyvin"); else if ( refassetid != assetid ) return eval->Invalid("invalid assetid for buyvin"); @@ -477,7 +447,7 @@ int64_t AssetValidateSellvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpp bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti,int64_t &outputs,Eval* eval,const CTransaction &tx,uint256 assetid) { - CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; int64_t assetoshis; std::vector tmporigpubkey; int64_t tmpprice; + CTransaction vinTx; uint256 hashBlock,id,id2; int32_t i,flag,numvins,numvouts; int64_t assetoshis; std::vector tmporigpubkey; int64_t tmpprice; numvins = tx.vin.size(); numvouts = tx.vout.size(); inputs = outputs = 0; @@ -490,14 +460,25 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti fprintf(stderr,"i.%d starti.%d numvins.%d\n",i,starti,numvins); return eval->Invalid("always should find vin, but didnt"); } - else if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 || vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 ) + else if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 ) { - assetoshis = vinTx.vout[i].nValue; fprintf(stderr,"vin%d %llu, ",i,(long long)assetoshis); inputs += assetoshis; } + else + { + if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == asssetid ) + { + assetoshis = vinTx.vout[i].nValue; + fprintf(stderr,"vin%d %llu special case, ",(long long)assetoshi); + inputs += assetoshis; + } + } } } + if ( DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == asssetid ) + flag = 1; + else flag = 0; for (i=0; i &origpubkey,std::string &name,std::string &description); -uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey,uint256 &bettxid,int32_t &leverage); +uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector &origpubkey); uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint256 &batontxid,CPubKey &pk,std::vector &data); int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen); CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t price,std::vector origpubkey); -CScript EncodeAssetOpRetExtra(uint8_t funcid,uint256 assetid,uint256 assetid2,uint256 bettxid,int32_t leverage); -uint8_t DecodeAssetOpRetExtra(CScript scriptPubKey,uint256 &assetid,uint256 &assetid2,uint256 &bettxid,int32_t leverage); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index b26ca7cfd..d651537cf 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -250,7 +250,7 @@ int64_t CCfullsupply(uint256 tokenid) int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) { - int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,bettxid,hashBlock; std::vector origpubkey; int32_t leverage; + int64_t price,sum = 0; int32_t numvouts; CTransaction tx; uint256 assetid,assetid2,txid,hashBlock; std::vector origpubkey; std::vector > unspentOutputs; SetCCunspents(unspentOutputs,coinaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) @@ -258,7 +258,7 @@ int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) txid = it->first.txhash; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage) != 0 && assetid == tokenid ) + if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 && assetid == tokenid ) { sum += it->second.satoshis; } diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index fa6d87500..1ddbdc4f8 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -132,12 +132,12 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { static uint256 zero; - CTxDestination address; CTransaction vinTx,createTx; uint256 bettxid,hashBlock,assetid,assetid2; int32_t i,starti,leverage,numvins,numvouts,preventCCvins,preventCCvouts; int64_t remaining_price,nValue,assetoshis,outputs,inputs,tmpprice,totalunits,ignore; std::vector origpubkey,tmporigpubkey,ignorepubkey; uint8_t funcid; char destaddr[64],origaddr[64],CCaddr[64]; + CTxDestination address; CTransaction vinTx,createTx; uint256 hashBlock,assetid,assetid2; int32_t i,starti,numvins,numvouts,preventCCvins,preventCCvouts; int64_t remaining_price,nValue,assetoshis,outputs,inputs,tmpprice,totalunits,ignore; std::vector origpubkey,tmporigpubkey,ignorepubkey; uint8_t funcid; char destaddr[64],origaddr[64],CCaddr[64]; numvins = tx.vin.size(); numvouts = tx.vout.size(); outputs = inputs = 0; preventCCvins = preventCCvouts = -1; - if ( (funcid= DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,remaining_price,origpubkey,bettxid,leverage)) == 0 ) + if ( (funcid= DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,remaining_price,origpubkey)) == 0 ) return eval->Invalid("Invalid opreturn payload"); fprintf(stderr,"AssetValidate (%c)\n",funcid); if ( funcid != 'o' && funcid != 'x' && eval->GetTxUnconfirmed(assetid,createTx,hashBlock) == 0 ) From 4ab5f2f1d74883315ac93f1489166185aec4044c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 03:46:55 -1100 Subject: [PATCH 228/306] Test --- src/cc/CCassetsCore.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index f53633813..fadbe15ae 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -467,16 +467,16 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti } else { - if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == asssetid ) + if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid ) { assetoshis = vinTx.vout[i].nValue; - fprintf(stderr,"vin%d %llu special case, ",(long long)assetoshi); + fprintf(stderr,"vin%d %llu special case, ",(long long)assetoshis); inputs += assetoshis; } } } } - if ( DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == asssetid ) + if ( DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid ) flag = 1; else flag = 0; for (i=0; i Date: Thu, 20 Sep 2018 03:47:39 -1100 Subject: [PATCH 229/306] Test --- src/cc/CCassetsCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index fadbe15ae..3a9226a27 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -470,7 +470,7 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid ) { assetoshis = vinTx.vout[i].nValue; - fprintf(stderr,"vin%d %llu special case, ",(long long)assetoshis); + fprintf(stderr,"vin%d %llu special case, ",i,(long long)assetoshis); inputs += assetoshis; } } @@ -489,7 +489,7 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti else if ( flag != 0 && tx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 ) { assetoshis = vinTx.vout[i].nValue; - fprintf(stderr,"vout%d %llu special case, ",(long long)assetoshis); + fprintf(stderr,"vout%d %llu special case, ",i,(long long)assetoshis); outputs += assetoshis; } } From 66bee980b50965c558373fc6e733afb598e5205f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 03:49:07 -1100 Subject: [PATCH 230/306] Test --- src/cc/prices.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index e8755b53e..f458ab4cc 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -400,7 +400,8 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int mtx.vout.push_back(MakeCC1of2vout(assetscp->evalcode,CCchange,pricespk,planpk)); mtx.vout.push_back(MakeCC1vout(assetscp->evalcode,CCchange2,mypk)); // add addr2 and addr3 - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRetExtra('T',tokenid,bettoken,zeroid,dir*leverage))); + //return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodePricesExtra('T',tokenid,bettoken,zeroid,dir*leverage))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,CScript opret)); } else { From 8fc335afe130681ee2f08bf0384b45f30fe2c938 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 03:49:47 -1100 Subject: [PATCH 231/306] Test --- src/cc/prices.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index f458ab4cc..ca945d02f 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -401,7 +401,8 @@ std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int mtx.vout.push_back(MakeCC1vout(assetscp->evalcode,CCchange2,mypk)); // add addr2 and addr3 //return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodePricesExtra('T',tokenid,bettoken,zeroid,dir*leverage))); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,CScript opret)); + CScript opret; + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,opret)); } else { From 68da1c69bd9f3342d6f8fc66f718cc5ee7716648 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 03:50:58 -1100 Subject: [PATCH 232/306] Test --- src/cc/CCassetstx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 70a2c76ee..5c933bd77 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -106,7 +106,7 @@ UniValue AssetList() UniValue AssetOrders(uint256 refassetid) { static uint256 zero; - int64_t price; uint256 txid,hashBlock,assetid,assetid2,bettxid; std::vector origpubkey; CTransaction vintx; UniValue result(UniValue::VARR); std::vector > unspentOutputs; int32_t leverage; uint8_t funcid; char numstr[32],funcidstr[16],origaddr[64],assetidstr[65]; struct CCcontract_info *cp,C; + int64_t price; uint256 txid,hashBlock,assetid,assetid2; std::vector origpubkey; CTransaction vintx; UniValue result(UniValue::VARR); std::vector > unspentOutputs; uint8_t funcid; char numstr[32],funcidstr[16],origaddr[64],assetidstr[65]; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_ASSETS); SetCCunspents(unspentOutputs,(char *)cp->unspendableCCaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) @@ -114,7 +114,7 @@ UniValue AssetOrders(uint256 refassetid) txid = it->first.txhash; if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { - if ( vintx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey,bettxid,leverage)) != 0 ) + if ( vintx.vout.size() > 0 && (funcid= DecodeAssetOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey,assetid,assetid2,price,origpubkey)) != 0 ) { if ( refassetid != zero && assetid != refassetid ) { From 71d6712d8dbe06c17421ef846f341c8506072b3c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 06:47:08 -1100 Subject: [PATCH 233/306] Test --- src/wallet/rpcwallet.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e8fff8904..80f0e4e6b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4910,6 +4910,14 @@ UniValue channelsaddress(const UniValue& params, bool fHelp) result.push_back(Pair("otherpubkey", params[0].get_str())); GetCCaddress1of2(cp,destaddr,pk,pk2); result.push_back(Pair("channeladdress",destaddr)); + { + int32_t i; + for (i=0; i<100; i++) + { + GetCCaddress1of2(cp,destaddr,pk,pk2); + fprintf(stderr,"i.%d %s\n",i,destaddr); + } + } return(result); } From 44d8e00a25fbd877d06594eecde90cee56dfec4a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 20 Sep 2018 07:52:46 -1100 Subject: [PATCH 234/306] +print --- src/cc/CCutils.cpp | 1 + src/wallet/rpcwallet.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index a91d6ffdd..01e9d35ab 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -63,6 +63,7 @@ CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk1,CPubKey pk2) CTxOut vout; CC *payoutCond = MakeCCcond1of2(evalcode,pk1,pk2); vout = CTxOut(nValue,CCPubKey(payoutCond)); + fprintf(stderr,"payoutCond: %s\n",cc_conditionToJSONString(payoutCond)); cc_free(payoutCond); return(vout); } diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 80f0e4e6b..7c2314480 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4910,6 +4910,7 @@ UniValue channelsaddress(const UniValue& params, bool fHelp) result.push_back(Pair("otherpubkey", params[0].get_str())); GetCCaddress1of2(cp,destaddr,pk,pk2); result.push_back(Pair("channeladdress",destaddr)); + if ( 0 ) { int32_t i; for (i=0; i<100; i++) From 88b5d9e46aa28912531d7db1094e03c6b4ecafd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 03:34:39 -1100 Subject: [PATCH 235/306] Fix token convert --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7c2314480..5a14370c4 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -6291,7 +6291,7 @@ UniValue tokentransfer(const UniValue& params, bool fHelp) UniValue tokenconvert(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); std::string hex; int32_t evalcode; int64_t amount; uint256 tokenid; - if ( fHelp || params.size() != 3 ) + if ( fHelp || params.size() != 4 ) throw runtime_error("tokenconvert evalcode tokenid pubkey amount\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); From 8267beff37fe0a7ff2af7a41eb02e10b9432836e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 06:56:43 -1100 Subject: [PATCH 236/306] +print --- src/cc/CCassetsCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index 3a9226a27..a9bb5b71f 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -349,7 +349,7 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans { n = tx.vout.size(); nValue = tx.vout[v].nValue; - //fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); + fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); if ( v >= n-1 ) return(0); if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) From a4f7b6910f163282b566d5e99d89c8f4a91afdfd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 07:08:47 -1100 Subject: [PATCH 237/306] Fix silly bug --- src/cc/CCassetsCore.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index a9bb5b71f..c9b975c3c 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -349,7 +349,7 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans { n = tx.vout.size(); nValue = tx.vout[v].nValue; - fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); + //fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN); if ( v >= n-1 ) return(0); if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 ) @@ -367,7 +367,10 @@ int64_t IsAssetvout(int64_t &price,std::vector &origpubkey,const CTrans else if ( funcid != 'E' ) { if ( assetid == refassetid ) + { + //fprintf(stderr,"returning %.8f\n",(double)nValue/COIN); return(nValue); + } } else if ( funcid == 'E' ) { @@ -488,7 +491,7 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti } else if ( flag != 0 && tx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - assetoshis = vinTx.vout[i].nValue; + assetoshis = tx.vout[i].nValue; fprintf(stderr,"vout%d %llu special case, ",i,(long long)assetoshis); outputs += assetoshis; } From 9a59ff3ff14385d5323d5642b6d76197dd83458c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:25:10 -1100 Subject: [PATCH 238/306] Test --- src/rpcblockchain.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 5d73e8f6b..f66b1b204 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1417,7 +1417,10 @@ UniValue getchaintips(const UniValue& params, bool fHelp) of another block. */ std::set setTips; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) - setTips.insert(item.second); + { + if ( item != 0 ) + setTips.insert(item.second); + } BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { const CBlockIndex* pprev=0; From 2dd23a26175529a520961b544098458b2f2d5efe Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:29:18 -1100 Subject: [PATCH 239/306] Test --- src/rpcblockchain.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index f66b1b204..f280cfc72 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1410,16 +1410,18 @@ UniValue getchaintips(const UniValue& params, bool fHelp) + HelpExampleRpc("getchaintips", "") ); + if ( mapBlockIndex == 0 ) + throw runtime_error("mapBlockIndex is NULL\n"); LOCK(cs_main); /* Build up a list of chain tips. We start with the list of all known blocks, and successively remove blocks that appear as pprev of another block. */ + std::set setTips; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { - if ( item != 0 ) - setTips.insert(item.second); + setTips.insert(item.second); } BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { From c46c04b331e4fb8175b852b49c9a570f431e7471 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:29:58 -1100 Subject: [PATCH 240/306] Test --- src/rpcblockchain.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index f280cfc72..bec1692c6 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1410,8 +1410,6 @@ UniValue getchaintips(const UniValue& params, bool fHelp) + HelpExampleRpc("getchaintips", "") ); - if ( mapBlockIndex == 0 ) - throw runtime_error("mapBlockIndex is NULL\n"); LOCK(cs_main); /* Build up a list of chain tips. We start with the list of all From 35506c9ae6da43b94853025c9a9d0ca41f211d73 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:31:19 -1100 Subject: [PATCH 241/306] Test --- src/rpcblockchain.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index bec1692c6..b78d46e19 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1417,8 +1417,10 @@ UniValue getchaintips(const UniValue& params, bool fHelp) of another block. */ std::set setTips; + int32_t n = 0; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { + fprintf(stderr,"iterator %d\n",n++); setTips.insert(item.second); } BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) From a4602c8956b770dd0c483d130f2dfeaa29f9e5b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:33:54 -1100 Subject: [PATCH 242/306] Test --- src/rpcblockchain.cpp | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index b78d46e19..64f3d35e8 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1410,28 +1410,29 @@ UniValue getchaintips(const UniValue& params, bool fHelp) + HelpExampleRpc("getchaintips", "") ); - LOCK(cs_main); - - /* Build up a list of chain tips. We start with the list of all - known blocks, and successively remove blocks that appear as pprev - of another block. */ - - std::set setTips; - int32_t n = 0; - BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { - fprintf(stderr,"iterator %d\n",n++); - setTips.insert(item.second); + LOCK(cs_main); + + /* Build up a list of chain tips. We start with the list of all + known blocks, and successively remove blocks that appear as pprev + of another block. */ + + std::set setTips; + int32_t n = 0; + BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) + { + fprintf(stderr,"iterator %d\n",n++); + setTips.insert(item.second); + } + BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) + { + const CBlockIndex* pprev=0; + if ( item.second != 0 ) + pprev = item.second->pprev; + if (pprev) + setTips.erase(pprev); + } } - BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) - { - const CBlockIndex* pprev=0; - if ( item.second != 0 ) - pprev = item.second->pprev; - if (pprev) - setTips.erase(pprev); - } - // Always report the currently active tip. setTips.insert(chainActive.LastTip()); From 4eafa6062d91fa76b25d77dccf38d7dfcc4c6838 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:34:54 -1100 Subject: [PATCH 243/306] Test --- src/rpcblockchain.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 64f3d35e8..0ce01d09f 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1432,14 +1432,13 @@ UniValue getchaintips(const UniValue& params, bool fHelp) if (pprev) setTips.erase(pprev); } - } - // Always report the currently active tip. - setTips.insert(chainActive.LastTip()); - - /* Construct the output array. */ - UniValue res(UniValue::VARR); const CBlockIndex *forked; - BOOST_FOREACH(const CBlockIndex* block, setTips) - BOOST_FOREACH(const CBlockIndex* block, setTips) + // Always report the currently active tip. + setTips.insert(chainActive.LastTip()); + + /* Construct the output array. */ + UniValue res(UniValue::VARR); const CBlockIndex *forked; + BOOST_FOREACH(const CBlockIndex* block, setTips) + BOOST_FOREACH(const CBlockIndex* block, setTips) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("height", block->nHeight)); @@ -1449,7 +1448,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) { const int branchLen = block->nHeight - forked->nHeight; obj.push_back(Pair("branchlen", branchLen)); - + string status; if (chainActive.Contains(block)) { // This block is part of the currently active chain. @@ -1474,7 +1473,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) } res.push_back(obj); } - + } return res; } From bf8e9b4d66d6cae6f414a77b3263421a6459c419 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:36:22 -1100 Subject: [PATCH 244/306] Test --- src/rpcblockchain.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 0ce01d09f..3cfa22282 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1410,6 +1410,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) + HelpExampleRpc("getchaintips", "") ); + UniValue res(UniValue::VARR); { LOCK(cs_main); @@ -1436,7 +1437,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) setTips.insert(chainActive.LastTip()); /* Construct the output array. */ - UniValue res(UniValue::VARR); const CBlockIndex *forked; + const CBlockIndex *forked; BOOST_FOREACH(const CBlockIndex* block, setTips) BOOST_FOREACH(const CBlockIndex* block, setTips) { From 7108bc79f56ae810ac5f6b1e3f83db103e3120bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:44:55 -1100 Subject: [PATCH 245/306] Test --- src/komodo_gateway.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 379224b48..e355f3708 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -1378,6 +1378,8 @@ void komodo_passport_iteration() fprintf(stderr,"[%s] PASSPORT iteration waiting for KOMODO_INITDONE\n",ASSETCHAINS_SYMBOL); sleep(3); } +KOMODO_PASSPORT_INITDONE = 1; +return; if ( komodo_chainactive_timestamp() > lastinterest ) { komodo_interestsum(); From 5aad1637002062efc48f629ef38cdc30d4eb49b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:48:11 -1100 Subject: [PATCH 246/306] Test --- src/komodo_gateway.h | 2 -- src/rpcblockchain.cpp | 65 ++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index e355f3708..379224b48 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -1378,8 +1378,6 @@ void komodo_passport_iteration() fprintf(stderr,"[%s] PASSPORT iteration waiting for KOMODO_INITDONE\n",ASSETCHAINS_SYMBOL); sleep(3); } -KOMODO_PASSPORT_INITDONE = 1; -return; if ( komodo_chainactive_timestamp() > lastinterest ) { komodo_interestsum(); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 3cfa22282..357b88426 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1410,36 +1410,39 @@ UniValue getchaintips(const UniValue& params, bool fHelp) + HelpExampleRpc("getchaintips", "") ); - UniValue res(UniValue::VARR); + LOCK(cs_main); + + /* Build up a list of chain tips. We start with the list of all + known blocks, and successively remove blocks that appear as pprev + of another block. */ + + std::set setTips; + int32_t n = 0; + BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) { - LOCK(cs_main); - - /* Build up a list of chain tips. We start with the list of all - known blocks, and successively remove blocks that appear as pprev - of another block. */ - - std::set setTips; - int32_t n = 0; - BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) - { - fprintf(stderr,"iterator %d\n",n++); - setTips.insert(item.second); - } - BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) - { - const CBlockIndex* pprev=0; - if ( item.second != 0 ) - pprev = item.second->pprev; - if (pprev) - setTips.erase(pprev); - } - // Always report the currently active tip. - setTips.insert(chainActive.LastTip()); - - /* Construct the output array. */ - const CBlockIndex *forked; - BOOST_FOREACH(const CBlockIndex* block, setTips) - BOOST_FOREACH(const CBlockIndex* block, setTips) + n++; + setTips.insert(item.second); + } + fprintf(stderr,"iterations getchaintips %d\n",n); + n = 0; + BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) + { + const CBlockIndex* pprev=0; + n++; + if ( item.second != 0 ) + pprev = item.second->pprev; + if (pprev) + setTips.erase(pprev); + } + fprintf(stderr,"iterations getchaintips %d\n",n); + + // Always report the currently active tip. + setTips.insert(chainActive.LastTip()); + + /* Construct the output array. */ + UniValue res(UniValue::VARR); const CBlockIndex *forked; + BOOST_FOREACH(const CBlockIndex* block, setTips) + BOOST_FOREACH(const CBlockIndex* block, setTips) { UniValue obj(UniValue::VOBJ); obj.push_back(Pair("height", block->nHeight)); @@ -1449,7 +1452,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) { const int branchLen = block->nHeight - forked->nHeight; obj.push_back(Pair("branchlen", branchLen)); - + string status; if (chainActive.Contains(block)) { // This block is part of the currently active chain. @@ -1474,7 +1477,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) } res.push_back(obj); } - } + return res; } From 30ae7560030bde8432feaca53f80b080c27abc49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:50:42 -1100 Subject: [PATCH 247/306] Test --- src/rpcblockchain.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 357b88426..b5815ee0b 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1415,7 +1415,10 @@ UniValue getchaintips(const UniValue& params, bool fHelp) /* Build up a list of chain tips. We start with the list of all known blocks, and successively remove blocks that appear as pprev of another block. */ - + static pthread_mutex_t mutex; static int32_t didinit; + if ( didinit == 0 ) + portable_mutex_init(&mutex); + portable_mutex_lock(&mutex); std::set setTips; int32_t n = 0; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) @@ -1435,6 +1438,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) setTips.erase(pprev); } fprintf(stderr,"iterations getchaintips %d\n",n); + portable_mutex_unlock(&mutex); // Always report the currently active tip. setTips.insert(chainActive.LastTip()); From 79d44e8ab5bbf1f5de42537f81f8e9a0489dc34c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:51:43 -1100 Subject: [PATCH 248/306] Test --- src/rpcblockchain.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index b5815ee0b..92f0c07a8 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1377,6 +1377,8 @@ struct CompareBlocksByHeight } }; +#include + UniValue getchaintips(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 0) From 3036a2412d3cd67892193d56385281e912967e26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:52:38 -1100 Subject: [PATCH 249/306] Test --- src/rpcblockchain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 92f0c07a8..39f62dfa1 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1419,8 +1419,8 @@ UniValue getchaintips(const UniValue& params, bool fHelp) of another block. */ static pthread_mutex_t mutex; static int32_t didinit; if ( didinit == 0 ) - portable_mutex_init(&mutex); - portable_mutex_lock(&mutex); + pthread_mutex_init(&mutex); + pthread_mutex_lock(&mutex); std::set setTips; int32_t n = 0; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) @@ -1440,7 +1440,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) setTips.erase(pprev); } fprintf(stderr,"iterations getchaintips %d\n",n); - portable_mutex_unlock(&mutex); + pthread_mutex_unlock(&mutex); // Always report the currently active tip. setTips.insert(chainActive.LastTip()); From 9892eb8a590907d81a83920a6775d19d42d49972 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:53:44 -1100 Subject: [PATCH 250/306] Test --- src/rpcblockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 39f62dfa1..4915bd0cf 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1419,7 +1419,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) of another block. */ static pthread_mutex_t mutex; static int32_t didinit; if ( didinit == 0 ) - pthread_mutex_init(&mutex); + pthread_mutex_init(&mutex,NULL); pthread_mutex_lock(&mutex); std::set setTips; int32_t n = 0; From 4e90a436f6547e055c92fa6965701a4e612e9746 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:55:02 -1100 Subject: [PATCH 251/306] Test --- src/rpcblockchain.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 4915bd0cf..3c4b926a2 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1419,7 +1419,10 @@ UniValue getchaintips(const UniValue& params, bool fHelp) of another block. */ static pthread_mutex_t mutex; static int32_t didinit; if ( didinit == 0 ) + { pthread_mutex_init(&mutex,NULL); + didinit = 1; + } pthread_mutex_lock(&mutex); std::set setTips; int32_t n = 0; From 1313ac253d7ab52b94fba2cf9017227a2a44d39a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 20:56:23 -1100 Subject: [PATCH 252/306] Test --- src/rpcblockchain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 3c4b926a2..e9cf54bb4 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -1417,13 +1417,13 @@ UniValue getchaintips(const UniValue& params, bool fHelp) /* Build up a list of chain tips. We start with the list of all known blocks, and successively remove blocks that appear as pprev of another block. */ - static pthread_mutex_t mutex; static int32_t didinit; + /*static pthread_mutex_t mutex; static int32_t didinit; if ( didinit == 0 ) { pthread_mutex_init(&mutex,NULL); didinit = 1; } - pthread_mutex_lock(&mutex); + pthread_mutex_lock(&mutex);*/ std::set setTips; int32_t n = 0; BOOST_FOREACH(const PAIRTYPE(const uint256, CBlockIndex*)& item, mapBlockIndex) @@ -1443,7 +1443,7 @@ UniValue getchaintips(const UniValue& params, bool fHelp) setTips.erase(pprev); } fprintf(stderr,"iterations getchaintips %d\n",n); - pthread_mutex_unlock(&mutex); + //pthread_mutex_unlock(&mutex); // Always report the currently active tip. setTips.insert(chainActive.LastTip()); From 0c2c564c249d6333d36dc27a203aac7025e0a497 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 23:29:00 -1100 Subject: [PATCH 253/306] ac_private to allow notary p2pk bouts --- src/komodo_notary.h | 15 +++++++++++++++ src/main.cpp | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 4711a9afc..b619c5b29 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -198,6 +198,21 @@ const char *Notaries_elected1[][2] = {"xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, }; +int32_t komodo_isnotaryvout(CScript scriptPubKey) // from ac_private chains only +{ + uint8_t pubkey33[33],*ptr = scriptPubKey.data(); int32_t i; + if ( scriptPubKey.size() == 35 && ptr[0] == 33 && ptr[34] == 0xac ) + { + for (i=0; i 0 && iscoinbase == 0) || tx.GetJoinSplitValueOut() > 0 ) - return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); + { + if ( komodo_isnotaryvout(txout.scriptPubKey) == 0 ) + return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); + } } if ( txout.scriptPubKey.size() > IGUANA_MAXSCRIPTSIZE ) return state.DoS(100, error("CheckTransaction(): txout.scriptPubKey.size() too big"),REJECT_INVALID, "bad-txns-vout-negative"); From 2682c88a7a87a7374f834a0e4077b3a2fcd38528 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 23:30:34 -1100 Subject: [PATCH 254/306] Fix --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index b619c5b29..3d22a5734 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -206,7 +206,7 @@ int32_t komodo_isnotaryvout(CScript scriptPubKey) // from ac_private chains only for (i=0; i Date: Fri, 21 Sep 2018 23:33:11 -1100 Subject: [PATCH 255/306] Fix --- src/komodo_notary.h | 8 ++++---- src/main.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 3d22a5734..942612465 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -198,15 +198,15 @@ const char *Notaries_elected1[][2] = {"xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, }; -int32_t komodo_isnotaryvout(CScript scriptPubKey) // from ac_private chains only +int32_t komodo_isnotaryvout(uint8_t *script) // from ac_private chains only { - uint8_t pubkey33[33],*ptr = scriptPubKey.data(); int32_t i; - if ( scriptPubKey.size() == 35 && ptr[0] == 33 && ptr[34] == 0xac ) + uint8_t pubkey33[33]; int32_t i; + if ( script[0] == 33 && script[34] == 0xac ) { for (i=0; i 0 && iscoinbase == 0) || tx.GetJoinSplitValueOut() > 0 ) { - if ( komodo_isnotaryvout(txout.scriptPubKey) == 0 ) + if ( txout.scriptPubKey.size() == 35 && komodo_isnotaryvout((uint8_t *)txout.scriptPubKey.data()) == 0 ) return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); } } From fb110781377d9b55a559c1a15d3f71d2ebe9fc5e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 21 Sep 2018 23:40:08 -1100 Subject: [PATCH 256/306] Allow crypto777 pub key --- src/komodo_notary.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 942612465..7a6fb8a6b 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -197,15 +197,18 @@ const char *Notaries_elected1[][2] = {"webworker01_NA", "03bb7d005e052779b1586f071834c5facbb83470094cff5112f0072b64989f97d7" }, {"xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, }; +#define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9" int32_t komodo_isnotaryvout(uint8_t *script) // from ac_private chains only { uint8_t pubkey33[33]; int32_t i; if ( script[0] == 33 && script[34] == 0xac ) { - for (i=0; i Date: Sat, 22 Sep 2018 00:43:19 -1100 Subject: [PATCH 257/306] PRATE halving 5x --- src/komodo_utils.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 2441da83d..79c0b4671 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1704,6 +1704,8 @@ void komodo_args(char *argv0) { BITCOIND_RPCPORT = GetArg("-rpcport", ASSETCHAINS_RPCPORT); //fprintf(stderr,"(%s) port.%u chain params initialized\n",ASSETCHAINS_SYMBOL,BITCOIND_RPCPORT); + if ( strcmp("PIRATE",ASSETCHAINS_SYMBOL) == 0 && ASSETCHAINS_HALVING == 77777 ) + ASSETCHAINS_HALVING *= 5; } else BITCOIND_RPCPORT = GetArg("-rpcport", BaseParams().RPCPort()); } From 1dee00acbf0676cb40894efa1edee85e7f14ece9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 02:12:17 -1100 Subject: [PATCH 258/306] Test --- src/cc/CCinclude.h | 1 + src/cc/gateways.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 4beb722a1..7ac0bfb98 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -138,6 +138,7 @@ uint256 Parseuint256(char *hexstr); CPubKey pubkey2pk(std::vector pubkey); int64_t CCfullsupply(uint256 tokenid); int64_t CCtoken_balance(char *destaddr,uint256 tokenid); +int64_t CCtoken_balance2(char *destaddr,uint256 tokenid); bool _GetCCaddress(char *destaddr,uint8_t evalcode,CPubKey pk); bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk); bool GetCCaddress1of2(struct CCcontract_info *cp,char *destaddr,CPubKey pk,CPubKey pk2); diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 976cd1971..cf9f3ff27 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -501,9 +501,9 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)totalsupply/COIN,(double)fullsupply/COIN); return(""); } - if ( CCtoken_balance(destaddr,tokenid) != totalsupply ) + if ( CCtoken_balance2(destaddr,tokenid) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) destaddr.%s globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),destaddr,cp->unspendableCCaddr,(double)CCtoken_balance2(destaddr,tokenid)/COIN,(double)totalsupply/COIN); return(""); } if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= oracletx.vout.size()) <= 0 ) From 93f31c97304180c162c6ee9458932b63b4cd7d04 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 02:13:52 -1100 Subject: [PATCH 259/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cf9f3ff27..de01d9995 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -501,9 +501,9 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t fprintf(stderr,"Gateway bind.%s (%s) globaladdr.%s totalsupply %.8f != fullsupply %.8f\n",coin.c_str(),uint256_str(str,tokenid),cp->unspendableCCaddr,(double)totalsupply/COIN,(double)fullsupply/COIN); return(""); } - if ( CCtoken_balance2(destaddr,tokenid) != totalsupply ) + if ( CCtoken_balance(destaddr,tokenid) != totalsupply ) { - fprintf(stderr,"Gateway bind.%s (%s) destaddr.%s globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),destaddr,cp->unspendableCCaddr,(double)CCtoken_balance2(destaddr,tokenid)/COIN,(double)totalsupply/COIN); + fprintf(stderr,"Gateway bind.%s (%s) destaddr.%s globaladdr.%s token balance %.8f != %.8f\n",coin.c_str(),uint256_str(str,tokenid),destaddr,cp->unspendableCCaddr,(double)CCtoken_balance(destaddr,tokenid)/COIN,(double)totalsupply/COIN); return(""); } if ( GetTransaction(oracletxid,oracletx,hashBlock,false) == 0 || (numvouts= oracletx.vout.size()) <= 0 ) From f2f9d6aaf9846afe79075bd1384e871bb38ff8f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 02:28:53 -1100 Subject: [PATCH 260/306] +print --- src/cc/CCtx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index d651537cf..21f5a9cc9 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -258,6 +258,7 @@ int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) txid = it->first.txhash; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { + fprintf(stderr,"check %s %.8f\n",uint256_str(str,txid),(double)it->second.satoshis/COIN); if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 && assetid == tokenid ) { sum += it->second.satoshis; From cd40321aaf6c1cfbc3775f194c232a0070761059 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 02:31:17 -1100 Subject: [PATCH 261/306] Test --- 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 21f5a9cc9..a9d3f68e7 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -258,7 +258,7 @@ int64_t CCtoken_balance(char *coinaddr,uint256 tokenid) txid = it->first.txhash; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - fprintf(stderr,"check %s %.8f\n",uint256_str(str,txid),(double)it->second.satoshis/COIN); + char str[65]; fprintf(stderr,"check %s %.8f\n",uint256_str(str,txid),(double)it->second.satoshis/COIN); if ( DecodeAssetOpRet(tx.vout[numvouts-1].scriptPubKey,assetid,assetid2,price,origpubkey) != 0 && assetid == tokenid ) { sum += it->second.satoshis; From b07000b7fd60e2017af9d91f7f85d4cef774101c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:09:55 -1100 Subject: [PATCH 262/306] syntax --- src/cc/dapps/oraclefeed.c | 22 ++++++++++++---------- src/cc/gateways.cpp | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index be7b14b81..4a1ece19d 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -543,7 +543,6 @@ void importaddress(char *refcoin,char *acname,char *depositaddr) fprintf(stderr,"importaddress.(%s) %s error.(%s)\n",refcoin,acname,retstr); free(retstr); } - return(0); } cJSON *getinputarray(int64_t *totalp,cJSON *unspents,int64_t required) @@ -563,7 +562,7 @@ cJSON *getinputarray(int64_t *totalp,cJSON *unspents,int64_t required) vin = cJSON_CreateObject(); jaddbits256(vin,"txid",txid); jaddnum(vin,"vout",v); - jadd(vins,vin); + jaddi(vins,vin); *totalp += satoshis; if ( (*totalp) >= required ) break; @@ -581,34 +580,37 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad else txfee = 10000; if ( satoshis < txfee ) { - printf("createmultisig satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIS); + printf("createmultisig satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIDEN); return(0); } satoshis -= txfee; sprintf(array,"[\"%s\"]",depositaddr); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent",1,99999999,array,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array,"")) != 0 ) { //createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} if ( (vins= getinputarray(&total,retjson,satoshis)) != 0 ) { if ( total >= satoshis ) { - vouts = cJSON_CreatObject(); - jaddstr(vouts,withdrawaddr,(double)satoshis/SATOSHIDEN); + vouts = cJSON_CreateObject(); + jaddnum(vouts,withdrawaddr,(double)satoshis/SATOSHIDEN); if ( total > satoshis+txfee ) { change = (total - satoshis); - jaddstr(vouts,depositaddr,(double)change/SATOSHIDEN); + jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN); } - if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",jprint(vins,0),jprint(vouts,0),"","")) != 0 ) + char *argA,*argB; + argA = jprint(vins,1); + argB = jprint(vouts,1); + if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); free_json(retjson2); } else if ( txstr == 0 ) printf("createmultisig: null txstr and JSON2\n"); - free_json(vins); - free_json(vouts); + free(argA); + free(argB); } } } diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index de01d9995..283ba91a1 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -136,7 +136,7 @@ Care must be taken so that tokens are not lost and can be converted back. - This changes the usage to require tokenconvert before doing the bind and also tokenconvert before doing a withdraw. EVAL_GATEWAYS has evalcode of 251 + This changes the usage to require tokenconvert before doing the bind and also tokenconvert before doing a withdraw. EVAL_GATEWAYS has evalcode of 241 The gatewaysclaim automatically converts the deposit amount of tokens back to EVAL_ASSETS. From e2d84d81a710c950b31ae338dc5343f1f0701cbf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:11:46 -1100 Subject: [PATCH 263/306] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 4a1ece19d..3d395e91d 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -585,7 +585,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad } satoshis -= txfee; sprintf(array,"[\"%s\"]",depositaddr); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array)) != 0 ) { //createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} if ( (vins= getinputarray(&total,retjson,satoshis)) != 0 ) @@ -602,7 +602,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad char *argA,*argB; argA = jprint(vins,1); argB = jprint(vouts,1); - if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) + if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); free_json(retjson2); @@ -626,13 +626,13 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx) { char *retstr,*hexstr; cJSON *retjson; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","")) != 0 ) { if ( jint(retjson,"complete") != 0 ) return(retjson); else if ( (hexstr= jstr(retjson,"hex")) != 0 && strlen(hexstr) > strlen(rawtx) ) { - jadd(retjson,"partialtx",1)' + jaddnum(retjson,"partialtx",1); return(retjson); } free_json(retjson); From b72cac5111f92cf3b4ebe3e1dceeb5e519995ba5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:12:21 -1100 Subject: [PATCH 264/306] Fix --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3d395e91d..ee31709dc 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -643,7 +643,7 @@ cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx char *get_gatewaysmultisig(char *refcoin,char *acname,char *bindtxidstr,char *withtxidstr,char *txidaddr) { char *retstr,*hexstr,*hex=0; cJSON *retjson; - if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",bindtxidstr,refcoin,withtxidstr,txidstr)) != 0 ) + if ( (retjson= get_komodocli("KMD",&retstr,acname,"gatewaysmultisig",bindtxidstr,refcoin,withtxidstr,txidaddr)) != 0 ) { if ( (hexstr= jstr(retjson,"hex")) != 0 ) hex = clonestr(hexstr); From 2fe210a8802759c9a5d9dd19c9fd905a3f5442b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:14:37 -1100 Subject: [PATCH 265/306] Test --- src/cc/dapps/oraclefeed.c | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ee31709dc..673b841b6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -310,7 +310,7 @@ uint64_t get_btcusd() char *REFCOIN_CLI; -cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) +cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2,char *arg3) { long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,fname[256]; sprintf(fname,"/tmp/oraclefeed.%s",method); @@ -318,13 +318,13 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char { if ( refcoin[0] != 0 && strcmp(refcoin,"KMD") != 0 ) printf("unexpected: refcoin.(%s) acname.(%s)\n",refcoin,acname); - sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); + sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,arg3,fname); } else if ( strcmp(refcoin,"KMD") == 0 ) - sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); + sprintf(cmdstr,"./komodo-cli %s %s %s %s %s > %s\n",method,arg0,arg1,arg2,arg3,fname); else if ( REFCOIN_CLI != 0 && REFCOIN_CLI[0] != 0 ) { - sprintf(cmdstr,"%s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,fname); + sprintf(cmdstr,"%s %s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,arg3,fname); printf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr); } system(cmdstr); @@ -345,7 +345,7 @@ bits256 komodobroadcast(char *refcoin,char *acname,cJSON *hexjson) memset(txid.bytes,0,sizeof(txid)); if ( (hexstr= jstr(hexjson,"hex")) != 0 ) { - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendrawtransaction",hexstr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendrawtransaction",hexstr,"","","")) != 0 ) { //fprintf(stderr,"broadcast.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -369,7 +369,7 @@ bits256 sendtoaddress(char *refcoin,char *acname,char *destaddr,int64_t satoshis char numstr[32],*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); sprintf(numstr,"%.8f",(double)satoshis/SATOSHIDEN); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendtoaddress",destaddr,numstr,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"sendtoaddress",destaddr,numstr,"","")) != 0 ) { fprintf(stderr,"unexpected sendrawtransaction json.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -390,7 +390,7 @@ bits256 sendtoaddress(char *refcoin,char *acname,char *destaddr,int64_t satoshis int32_t get_coinheight(char *refcoin,char *acname) { cJSON *retjson; char *retstr; int32_t height=0; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockchaininfo","","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockchaininfo","","","","")) != 0 ) { height = jint(retjson,"blocks"); free_json(retjson); @@ -408,7 +408,7 @@ bits256 get_coinblockhash(char *refcoin,char *acname,int32_t height) cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; memset(hash.bytes,0,sizeof(hash)); sprintf(heightstr,"%d",height); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockhash",heightstr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockhash",heightstr,"","","")) != 0 ) { fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -429,7 +429,7 @@ bits256 get_coinmerkleroot(char *refcoin,char *acname,bits256 blockhash) { cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; memset(merkleroot.bytes,0,sizeof(merkleroot)); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockheader",bits256_str(str,blockhash),"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getblockheader",bits256_str(str,blockhash),"","","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); //fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); @@ -467,7 +467,7 @@ int32_t get_coinheader(char *refcoin,char *acname,bits256 *blockhashp,bits256 *m cJSON *get_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspending",oraclestxidstr,refcoin,"")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayspending",oraclestxidstr,refcoin,"","")) != 0 ) { //printf("pending.(%s)\n",jprint(retjson,0)); return(retjson); @@ -483,7 +483,7 @@ cJSON *get_gatewayspending(char *refcoin,char *acname,char *oraclestxidstr) cJSON *get_rawmempool(char *refcoin,char *acname) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawmempool","","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawmempool","","","","")) != 0 ) { //printf("mempool.(%s)\n",jprint(retjson,0)); return(retjson); @@ -502,7 +502,7 @@ cJSON *get_addressutxos(char *refcoin,char *acname,char *coinaddr) if ( refcoin[0] != 0 && strcmp(refcoin,"KMD") != 0 ) printf("warning: assumes %s has addressindex enabled\n",refcoin); sprintf(jsonbuf,"{\\\"addresses\\\":[\\\"%s\\\"]}",coinaddr); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getaddressutxos",jsonbuf,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getaddressutxos",jsonbuf,"","","")) != 0 ) { //printf("addressutxos.(%s)\n",jprint(retjson,0)); return(retjson); @@ -518,7 +518,7 @@ cJSON *get_addressutxos(char *refcoin,char *acname,char *coinaddr) cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) { cJSON *retjson; char *retstr,str[65]; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"getrawtransaction",bits256_str(str,txid),"1","","")) != 0 ) { return(retjson); } @@ -533,7 +533,7 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) void importaddress(char *refcoin,char *acname,char *depositaddr) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","","")) != 0 ) { printf("importaddress.(%s)\n",jprint(retjson,0)); free_json(retjson); @@ -585,7 +585,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad } satoshis -= txfee; sprintf(array,"[\"%s\"]",depositaddr); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array)) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"listunspent","1","99999999",array,"")) != 0 ) { //createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...} if ( (vins= getinputarray(&total,retjson,satoshis)) != 0 ) @@ -602,7 +602,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad char *argA,*argB; argA = jprint(vins,1); argB = jprint(vouts,1); - if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"")) != 0 ) + if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 ) { printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0)); free_json(retjson2); @@ -626,7 +626,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx) { char *retstr,*hexstr; cJSON *retjson; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 ) { if ( jint(retjson,"complete") != 0 ) return(retjson); @@ -656,7 +656,7 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit { char str[65],str2[65],*retstr; cJSON *retjson; printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,withtxid)); - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,withtxid),coin,bits256_str(str2,cointxid))) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,withtxid),coin,bits256_str(str2,cointxid),"")) != 0 ) { komodobroadcast(refcoin,acname,retjson); free_json(retjson); @@ -671,7 +671,7 @@ void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bit int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *Mp,int32_t *Np,char *bindtxidstr,char *coin,char *oraclestr) { char *oracle,*retstr,*name,*deposit; cJSON *retjson; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","","")) != 0 ) { if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) { @@ -933,7 +933,7 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( (refcoin[0] == 0 || prevheight < (get_coinheight(refcoin,"") - 10)) && (clijson= get_komodocli("KMD",&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( (refcoin[0] == 0 || prevheight < (get_coinheight(refcoin,"") - 10)) && (clijson= get_komodocli("KMD",&retstr,acname,"oraclesinfo",oraclestr,"","","")) != 0 ) { if ( refcoin[0] == 0 && jstr(clijson,"name") != 0 ) { @@ -960,7 +960,7 @@ int32_t main(int32_t argc,char **argv) { if ( (height= get_oracledata(refcoin,"",prevheight,hexstr,sizeof(hexstr),"Ihh")) != 0 ) { - if ( (clijson2= get_komodocli("KMD",&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) + if ( (clijson2= get_komodocli("KMD",&retstr2,acname,"oraclesdata",oraclestr,hexstr,"","")) != 0 ) { //printf("data.(%s)\n",jprint(clijson2,0)); txid = komodobroadcast("KMD",acname,clijson2); From 7d46fc67440bd128e263de0cbde0d34c33e2a934 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:34:42 -1100 Subject: [PATCH 266/306] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 673b841b6..fb32820e9 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -533,7 +533,7 @@ cJSON *get_rawtransaction(char *refcoin,char *acname,bits256 txid) void importaddress(char *refcoin,char *acname,char *depositaddr) { cJSON *retjson; char *retstr; - if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","","")) != 0 ) + if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","true","")) != 0 ) { printf("importaddress.(%s)\n",jprint(retjson,0)); free_json(retjson); From 3a9b6817573d3e949b09a8d929b106df4e6fea5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 22 Sep 2018 03:39:18 -1100 Subject: [PATCH 267/306] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index fb32820e9..297b92a01 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -673,13 +673,13 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *M char *oracle,*retstr,*name,*deposit; cJSON *retjson; if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysinfo",bindtxidstr,"","","")) != 0 ) { - if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 ) + if ( (oracle= jstr(retjson,"oracletxid")) != 0 && strcmp(oracle,oraclestr) == 0 && (deposit= jstr(retjson,"deposit")) != 0 ) { - if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 && jint(retjson,"N") >= 1 && (deposit= jstr(retjson,"deposit")) != 0 ) + strcpy(depositaddr,deposit); + if ( jstr(retjson,"coin") != 0 && strcmp(jstr(retjson,"coin"),coin) == 0 && jint(retjson,"N") >= 1 ) { *Mp = jint(retjson,"M"); *Np = jint(retjson,"N"); - strcpy(depositaddr,deposit); //printf("(%s)\n",jprint(retjson,0)); } else printf("coin.%s vs %s\n",jstr(retjson,"coin"),coin); } else printf("%s != %s\n",oracle,oraclestr); From ca865ad2d471c87091ef130406a9dfa411586cd5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 00:40:14 -1100 Subject: [PATCH 268/306] -prints --- src/main.cpp | 2 +- src/wallet/wallet.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a256e0f36..0fdf80892 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1118,7 +1118,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio } if ( ASSETCHAINS_PRIVATE != 0 ) { - fprintf(stderr,"private chain nValue %.8f iscoinbase.%d\n",(double)txout.nValue/COIN,iscoinbase); + //fprintf(stderr,"private chain nValue %.8f iscoinbase.%d\n",(double)txout.nValue/COIN,iscoinbase); if ( (txout.nValue > 0 && iscoinbase == 0) || tx.GetJoinSplitValueOut() > 0 ) { if ( txout.scriptPubKey.size() == 35 && komodo_isnotaryvout((uint8_t *)txout.scriptPubKey.data()) == 0 ) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 70375e663..47c93545b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2121,7 +2121,7 @@ std::vector CWallet::ResendWalletTransactionsBefore(int64_t nTime) { if ( wtx.nLockTime >= LOCKTIME_THRESHOLD && wtx.nLockTime < now-KOMODO_MAXMEMPOOLTIME ) { - LogPrintf("skip Relaying wtx %s nLockTime %u vs now.%u\n", wtx.GetHash().ToString(),(uint32_t)wtx.nLockTime,now); + //LogPrintf("skip Relaying wtx %s nLockTime %u vs now.%u\n", wtx.GetHash().ToString(),(uint32_t)wtx.nLockTime,now); continue; } } From 3372f7893c56e47d291780d8e594ba6f75ca83df Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 03:55:08 -1100 Subject: [PATCH 269/306] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5a14370c4..306ae36c8 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -459,7 +459,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) + HelpExampleRpc("sendtoaddress", "\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\", 0.1, \"donation\", \"seans outpost\"") ); - if ( ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) + if ( 0 && ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid " + strprintf("%s",komodo_chainname()) + " address"); LOCK2(cs_main, pwalletMain->cs_wallet); From a7e86f3a813b1e732c416276200d517816afb91d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 04:28:04 -1100 Subject: [PATCH 270/306] Revert --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 306ae36c8..5a14370c4 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -459,7 +459,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) + HelpExampleRpc("sendtoaddress", "\"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPV\", 0.1, \"donation\", \"seans outpost\"") ); - if ( 0 && ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) + if ( ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid " + strprintf("%s",komodo_chainname()) + " address"); LOCK2(cs_main, pwalletMain->cs_wallet); From 3a36ff17764be80774984a8daa786566c64f9d42 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 05:47:33 -1100 Subject: [PATCH 271/306] Test --- src/cc/CCutils.cpp | 8 ++++++++ src/komodo_globals.h | 1 + src/komodo_notary.h | 14 +++++++++----- src/main.cpp | 7 +++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 01e9d35ab..e03564971 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -198,6 +198,14 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) return(false); } +bool pubkey2addr(char *destaddr,uint8_t *pubkey33) +{ + std::vectorpk; int32_t i; + for (i=0; i<33; i++) + pk.push_back(pubkey33[i]); + return(Getscriptaddress(destaddr,CScript() << pk << OP_CHECKSIG)); +} + CPubKey CCtxidaddr(char *txidaddr,uint256 txid) { uint8_t buf33[33]; CPubKey pk; diff --git a/src/komodo_globals.h b/src/komodo_globals.h index cc5104d12..f352b5333 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -29,6 +29,7 @@ uint64_t komodo_paxtotal(); int32_t komodo_longestchain(); uint64_t komodo_maxallowed(int32_t baseid); int32_t komodo_bannedset(int32_t *indallvoutsp,uint256 *array,int32_t max); +bool pubkey2addr(char *destaddr,uint8_t *pubkey33); pthread_mutex_t komodo_mutex; diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 7a6fb8a6b..2f23bfbf7 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -199,20 +199,24 @@ const char *Notaries_elected1[][2] = }; #define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9" -int32_t komodo_isnotaryvout(uint8_t *script) // from ac_private chains only +int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only { - uint8_t pubkey33[33]; int32_t i; - if ( script[0] == 33 && script[34] == 0xac ) + static int32_t didinit; static char notaryaddrs[65][64]; + if ( didinit == 0 ) { + uint8_t pubkey33[33]; for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) { if ( i < sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) ) decode_hex(pubkey33,33,(char *)Notaries_elected1[i][1]); else decode_hex(pubkey33,33,(char *)CRYPTO777_PUBSECPSTR); - if ( memcmp(script+1,pubkey33,33) == 0 ) - return(1); + pubkey2addr(notaryaddrs[i],pubkey33); } + didinit = 1; } + for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) + if ( strcmp(coinaddr,notaryaddrs[i]) == 0 ) + return(1); return(0); } diff --git a/src/main.cpp b/src/main.cpp index 0fdf80892..dd3a054d1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,8 @@ extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN,KOMODO_INSYNC,KOMODO_CON int32_t KOMODO_NEWBLOCKS; int32_t komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); void komodo_broadcast(CBlock *pblock,int32_t limit); -int32_t komodo_isnotaryvout(CScript scriptPubKey); +int32_t komodo_isnotaryvout(char *destaddr); +bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey); BlockMap mapBlockIndex; CChain chainActive; @@ -1121,7 +1122,9 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio //fprintf(stderr,"private chain nValue %.8f iscoinbase.%d\n",(double)txout.nValue/COIN,iscoinbase); if ( (txout.nValue > 0 && iscoinbase == 0) || tx.GetJoinSplitValueOut() > 0 ) { - if ( txout.scriptPubKey.size() == 35 && komodo_isnotaryvout((uint8_t *)txout.scriptPubKey.data()) == 0 ) + char destaddr[65]; + Getscriptaddress(destaddr,txout.scriptPubKey); + if ( komodo_isnotaryvout(destaddr) == 0 ) return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); } } From 569bb55b5f039b8b006535c17b01b12ca2ce1926 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 05:48:40 -1100 Subject: [PATCH 272/306] Test --- src/komodo_notary.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 2f23bfbf7..2b929549f 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -201,7 +201,8 @@ const char *Notaries_elected1[][2] = int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only { - static int32_t didinit; static char notaryaddrs[65][64]; + static int32_t didinit; static char notaryaddrs[sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) + 1][64]; + int32_t i; if ( didinit == 0 ) { uint8_t pubkey33[33]; From a8c6526acff093ac93d55c9fa1b4944683d16147 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 05:51:51 -1100 Subject: [PATCH 273/306] Test --- src/komodo_notary.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 2b929549f..1bef3f8c6 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -211,7 +211,7 @@ int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only if ( i < sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) ) decode_hex(pubkey33,33,(char *)Notaries_elected1[i][1]); else decode_hex(pubkey33,33,(char *)CRYPTO777_PUBSECPSTR); - pubkey2addr(notaryaddrs[i],pubkey33); + pubkey2addr((char *)notaryaddrs[i],(uint8_t *)pubkey33); } didinit = 1; } From a2e2291e265e5f3bcb6e5bfecfcf9876dd23b008 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 05:53:54 -1100 Subject: [PATCH 274/306] Test --- src/komodo_notary.h | 22 ---------------------- src/main.cpp | 23 ++++++++++++++++++++++- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 1bef3f8c6..04fd30d5f 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -199,28 +199,6 @@ const char *Notaries_elected1[][2] = }; #define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9" -int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only -{ - static int32_t didinit; static char notaryaddrs[sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) + 1][64]; - int32_t i; - if ( didinit == 0 ) - { - uint8_t pubkey33[33]; - for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) - { - if ( i < sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) ) - decode_hex(pubkey33,33,(char *)Notaries_elected1[i][1]); - else decode_hex(pubkey33,33,(char *)CRYPTO777_PUBSECPSTR); - pubkey2addr((char *)notaryaddrs[i],(uint8_t *)pubkey33); - } - didinit = 1; - } - for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) - if ( strcmp(coinaddr,notaryaddrs[i]) == 0 ) - return(1); - return(0); -} - int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { static uint8_t elected_pubkeys0[64][33],elected_pubkeys1[64][33],did0,did1; static int32_t n0,n1; diff --git a/src/main.cpp b/src/main.cpp index dd3a054d1..8908e811e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,7 +60,6 @@ extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN,KOMODO_INSYNC,KOMODO_CON int32_t KOMODO_NEWBLOCKS; int32_t komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); void komodo_broadcast(CBlock *pblock,int32_t limit); -int32_t komodo_isnotaryvout(char *destaddr); bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey); BlockMap mapBlockIndex; @@ -1043,6 +1042,28 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, } } +int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only +{ + static int32_t didinit; static char notaryaddrs[sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) + 1][64]; + int32_t i; + if ( didinit == 0 ) + { + uint8_t pubkey33[33]; + for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) + { + if ( i < sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) ) + decode_hex(pubkey33,33,(char *)Notaries_elected1[i][1]); + else decode_hex(pubkey33,33,(char *)CRYPTO777_PUBSECPSTR); + pubkey2addr((char *)notaryaddrs[i],(uint8_t *)pubkey33); + } + didinit = 1; + } + for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) + if ( strcmp(coinaddr,notaryaddrs[i]) == 0 ) + return(1); + return(0); +} + bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state) { // Basic checks that don't depend on any context From a510b0f883aaf561ef58c728c463306b3b4dbe40 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Sun, 23 Sep 2018 10:49:46 -0700 Subject: [PATCH 275/306] Add Hush to dpowassets --- src/dpowassets | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dpowassets b/src/dpowassets index 88e6f72b8..f691533ba 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -40,3 +40,4 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"VRSC\",\"freq\":10,\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEC\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CCL\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUSH\",\"pubkey\":\"$pubkey\"}" From f425c7eea5e289f9e0e94845de461eb0033eabde Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 07:49:02 -1100 Subject: [PATCH 276/306] Support for notarizing PRIVATE --- src/komodo_notary.h | 1 + src/main.cpp | 78 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 4711a9afc..04fd30d5f 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -197,6 +197,7 @@ const char *Notaries_elected1[][2] = {"webworker01_NA", "03bb7d005e052779b1586f071834c5facbb83470094cff5112f0072b64989f97d7" }, {"xrobesx_NA", "03f0cc6d142d14a40937f12dbd99dbd9021328f45759e26f1877f2a838876709e1" }, }; +#define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9" int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp) { diff --git a/src/main.cpp b/src/main.cpp index 21c803754..e8d0acd98 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,6 +60,8 @@ extern int32_t KOMODO_LOADINGBLOCKS,KOMODO_LONGESTCHAIN,KOMODO_INSYNC,KOMODO_CON int32_t KOMODO_NEWBLOCKS; int32_t komodo_block2pubkey33(uint8_t *pubkey33,CBlock *block); void komodo_broadcast(CBlock *pblock,int32_t limit); +void komodo_broadcast(CBlock *pblock,int32_t limit); +bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey); BlockMap mapBlockIndex; CChain chainActive; @@ -1036,6 +1038,28 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, } } +int32_t komodo_isnotaryvout(char *coinaddr) // from ac_private chains only +{ + static int32_t didinit; static char notaryaddrs[sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) + 1][64]; + int32_t i; + if ( didinit == 0 ) + { + uint8_t pubkey33[33]; + for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) + { + if ( i < sizeof(Notaries_elected1)/sizeof(*Notaries_elected1) ) + decode_hex(pubkey33,33,(char *)Notaries_elected1[i][1]); + else decode_hex(pubkey33,33,(char *)CRYPTO777_PUBSECPSTR); + pubkey2addr((char *)notaryaddrs[i],(uint8_t *)pubkey33); + } + didinit = 1; + } + for (i=0; i<=sizeof(Notaries_elected1)/sizeof(*Notaries_elected1); i++) + if ( strcmp(coinaddr,notaryaddrs[i]) == 0 ) + return(1); + return(0); +} + bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state) { // Basic checks that don't depend on any context @@ -1112,9 +1136,14 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio } if ( ASSETCHAINS_PRIVATE != 0 ) { - fprintf(stderr,"private chain nValue %.8f iscoinbase.%d\n",(double)txout.nValue/COIN,iscoinbase); + //fprintf(stderr,"private chain nValue %.8f iscoinbase.%d\n",(double)txout.nValue/COIN,iscoinbase); if ( (txout.nValue > 0 && iscoinbase == 0) || tx.GetJoinSplitValueOut() > 0 ) - return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); + { + char destaddr[65]; + Getscriptaddress(destaddr,txout.scriptPubKey); + if ( komodo_isnotaryvout(destaddr) == 0 ) + return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); + } } if ( txout.scriptPubKey.size() > IGUANA_MAXSCRIPTSIZE ) return state.DoS(100, error("CheckTransaction(): txout.scriptPubKey.size() too big"),REJECT_INVALID, "bad-txns-vout-negative"); @@ -3621,23 +3650,34 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo // our genesis block. In practice this (probably) won't happen because of checks elsewhere. auto reorgLength = pindexOldTip ? pindexOldTip->nHeight - (pindexFork ? pindexFork->nHeight : -1) : 0; static_assert(MAX_REORG_LENGTH > 0, "We must be able to reorg some distance"); - if (reorgLength > MAX_REORG_LENGTH) { - auto msg = strprintf(_( - "A block chain reorganization has been detected that would roll back %d blocks! " - "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." - ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + - _("Reorganization details") + ":\n" + - "- " + strprintf(_("Current tip: %s, height %d, work %s"), - pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("New tip: %s, height %d, work %s"), - pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + - "- " + strprintf(_("Fork point: %s %s, height %d"), - ASSETCHAINS_SYMBOL,pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + - _("Please help, human!"); - LogPrintf("*** %s\n", msg); - uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); - StartShutdown(); - return false; + if (reorgLength > MAX_REORG_LENGTH) + { + int32_t notarizedht,prevMoMheight; uint256 notarizedhash,txid; + notarizedht = komodo_notarized_height(&prevMoMheight,¬arizedhash,&txid); + if ( pindexFork->nHeight < notarizedht ) + { + fprintf(stderr,"pindexFork->nHeight.%d is < notarizedht %d, so ignore it\n",(int32_t)pindexFork->nHeight,notarizedht); + pindexFork = pindexOldTip; + } + else + { + auto msg = strprintf(_( + "A block chain reorganization has been detected that would roll back %d blocks! " + "This is larger than the maximum of %d blocks, and so the node is shutting down for your safety." + ), reorgLength, MAX_REORG_LENGTH) + "\n\n" + + _("Reorganization details") + ":\n" + + "- " + strprintf(_("Current tip: %s, height %d, work %s"), + pindexOldTip->phashBlock->GetHex(), pindexOldTip->nHeight, pindexOldTip->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("New tip: %s, height %d, work %s"), + pindexMostWork->phashBlock->GetHex(), pindexMostWork->nHeight, pindexMostWork->nChainWork.GetHex()) + "\n" + + "- " + strprintf(_("Fork point: %s %s, height %d"), + ASSETCHAINS_SYMBOL,pindexFork->phashBlock->GetHex(), pindexFork->nHeight) + "\n\n" + + _("Please help, human!"); + LogPrintf("*** %s\n", msg); + uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); + StartShutdown(); + return false; + } } // Disconnect active blocks which are no longer in the best chain. From 54731d91b57d33de9108c25b7793dfab4478c013 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 07:51:25 -1100 Subject: [PATCH 277/306] Pubkey2addr --- src/cc/CCutils.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 3c38d04b3..6aceb5bf4 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -142,6 +142,14 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) return(false); } +bool pubkey2addr(char *destaddr,uint8_t *pubkey33) +{ + std::vectorpk; int32_t i; + for (i=0; i<33; i++) + pk.push_back(pubkey33[i]); + return(Getscriptaddress(destaddr,CScript() << pk << OP_CHECKSIG)); +} + bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk) { CC *payoutCond; From 2d450767051c8a23713ece076879b9f4498a1c78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 07:52:31 -1100 Subject: [PATCH 278/306] bool pubkey2addr(char *destaddr,uint8_t *pubkey33); --- src/komodo_globals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index 918e7c4f6..02c6a2f1d 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -29,6 +29,7 @@ uint64_t komodo_paxtotal(); int32_t komodo_longestchain(); uint64_t komodo_maxallowed(int32_t baseid); int32_t komodo_bannedset(int32_t *indallvoutsp,uint256 *array,int32_t max); +bool pubkey2addr(char *destaddr,uint8_t *pubkey33); pthread_mutex_t komodo_mutex; From 037c101c85229fa774fe481039cc7bc3ca5e30f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 08:11:42 -1100 Subject: [PATCH 279/306] +print --- src/komodo_utils.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 79c0b4671..75f68d87d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1705,7 +1705,10 @@ void komodo_args(char *argv0) BITCOIND_RPCPORT = GetArg("-rpcport", ASSETCHAINS_RPCPORT); //fprintf(stderr,"(%s) port.%u chain params initialized\n",ASSETCHAINS_SYMBOL,BITCOIND_RPCPORT); if ( strcmp("PIRATE",ASSETCHAINS_SYMBOL) == 0 && ASSETCHAINS_HALVING == 77777 ) + { ASSETCHAINS_HALVING *= 5; + fprintf(stderr,"PIRATE halving changed to %d %.1f days\n",(int32_t)ASSETCHAINS_HALVING,(double)ASSETCHAINS_HALVING/1440); + } } else BITCOIND_RPCPORT = GetArg("-rpcport", BaseParams().RPCPort()); } From b9281f45e7077b70706623fb85b43c8169a8fbdc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 08:36:47 -1100 Subject: [PATCH 280/306] 5x PIRATE halving --- src/komodo_utils.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 23e6b280e..64b283fb5 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1699,6 +1699,11 @@ void komodo_args(char *argv0) { BITCOIND_RPCPORT = GetArg("-rpcport", ASSETCHAINS_RPCPORT); //fprintf(stderr,"(%s) port.%u chain params initialized\n",ASSETCHAINS_SYMBOL,BITCOIND_RPCPORT); + if ( strcmp("PIRATE",ASSETCHAINS_SYMBOL) == 0 && ASSETCHAINS_HALVING == 77777 ) + { + ASSETCHAINS_HALVING *= 5; + fprintf(stderr,"PIRATE halving changed to %d %.1f days\n",(int32_t)ASSETCHAINS_HALVING,(double)ASSETCHAINS_HALVING/1440); + } } else BITCOIND_RPCPORT = GetArg("-rpcport", BaseParams().RPCPort()); } From 7097b79097a3241be3373725966a928dcac7f622 Mon Sep 17 00:00:00 2001 From: SHossain Date: Sun, 23 Sep 2018 20:52:43 +0100 Subject: [PATCH 281/306] Update assetchains.json --- src/assetchains.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/assetchains.json b/src/assetchains.json index ceda4cce1..0a9a6b93c 100644 --- a/src/assetchains.json +++ b/src/assetchains.json @@ -146,4 +146,14 @@ "195.201.22.89" ] } + { + "ac_name": "PIRATE", + "ac_supply": "0", + "ac_reward": "25600000000", + "ac_halving": "77777", + "ac_private": "1", + "addnode": [ + "136.243.102.225" + ] + } ] From 9630b8ec9630288477e637bce9e5786dd48e63d7 Mon Sep 17 00:00:00 2001 From: SHossain Date: Sun, 23 Sep 2018 20:53:54 +0100 Subject: [PATCH 282/306] Update assetchains.old --- src/assetchains.old | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assetchains.old b/src/assetchains.old index 158e62cad..2e9218d64 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -39,3 +39,4 @@ echo $pubkey ~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 & ./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 & ./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 & +./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=136.243.102.225 & From 426efacd34ea8d526e47f2d6cc9328ba0c06349b Mon Sep 17 00:00:00 2001 From: SHossain Date: Sun, 23 Sep 2018 20:55:23 +0100 Subject: [PATCH 283/306] Update dpowassets --- src/dpowassets | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dpowassets b/src/dpowassets index f691533ba..2b85f976f 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -41,3 +41,4 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEC\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CCL\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUSH\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PIRATE\",\"pubkey\":\"$pubkey\"}" From 40027428e40b1026f20ae17683d8e9f11ccac0d7 Mon Sep 17 00:00:00 2001 From: himu007 Date: Sun, 23 Sep 2018 21:52:56 +0100 Subject: [PATCH 284/306] add PIRATE --- src/ac/pirate | 2 ++ src/assetchains.json | 4 ++-- src/assetchains.old | 1 + src/fiat/pirate | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100755 src/ac/pirate create mode 100755 src/fiat/pirate diff --git a/src/ac/pirate b/src/ac/pirate new file mode 100755 index 000000000..9314209da --- /dev/null +++ b/src/ac/pirate @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=PIRATE $1 $2 $3 $4 $5 $6 diff --git a/src/assetchains.json b/src/assetchains.json index 0a9a6b93c..825f606df 100644 --- a/src/assetchains.json +++ b/src/assetchains.json @@ -145,8 +145,8 @@ "142.93.136.89", "195.201.22.89" ] - } - { + }, + { "ac_name": "PIRATE", "ac_supply": "0", "ac_reward": "25600000000", diff --git a/src/assetchains.old b/src/assetchains.old index 2e9218d64..96f680b03 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -40,3 +40,4 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 & ./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 & ./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=136.243.102.225 & + diff --git a/src/fiat/pirate b/src/fiat/pirate new file mode 100755 index 000000000..9314209da --- /dev/null +++ b/src/fiat/pirate @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=PIRATE $1 $2 $3 $4 $5 $6 From eff8c62cb321922dbf91a45eb74c4d86d8bdb78e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:04:40 -1100 Subject: [PATCH 285/306] Test --- src/cc/gateways.cpp | 4 ++-- src/komodo_utils.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 283ba91a1..a61fe2ba4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -554,8 +554,8 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u return(mhash); } else return(zeroid); } - batontxid = hash; - } else break; + } //else break; + batontxid = hash; } return(zeroid); } diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 79c0b4671..75f68d87d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1705,7 +1705,10 @@ void komodo_args(char *argv0) BITCOIND_RPCPORT = GetArg("-rpcport", ASSETCHAINS_RPCPORT); //fprintf(stderr,"(%s) port.%u chain params initialized\n",ASSETCHAINS_SYMBOL,BITCOIND_RPCPORT); if ( strcmp("PIRATE",ASSETCHAINS_SYMBOL) == 0 && ASSETCHAINS_HALVING == 77777 ) + { ASSETCHAINS_HALVING *= 5; + fprintf(stderr,"PIRATE halving changed to %d %.1f days\n",(int32_t)ASSETCHAINS_HALVING,(double)ASSETCHAINS_HALVING/1440); + } } else BITCOIND_RPCPORT = GetArg("-rpcport", BaseParams().RPCPort()); } From 8dab0bc78c6a9ff41bf3e34661e08bcdf1a78c12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:10:42 -1100 Subject: [PATCH 286/306] Test --- src/cc/oracles.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index c24ad5a8b..a0437ed0f 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -157,7 +157,8 @@ uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint25 { if ( e == EVAL_ORACLES && f == 'D' ) return(f); - } + else fprintf(stderr,"DecodeOraclesData evalcode.%d f.%c\n",e,f); + } else fprintf(stderr,"DecodeOraclesData not enough opereturn data\n"); return(0); } From d4f6cde55040c8e9beea6f410698c5ad92059afb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:18:37 -1100 Subject: [PATCH 287/306] Test --- src/cc/gateways.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index a61fe2ba4..5ec01b8fd 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -539,24 +539,32 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u { CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; txid = zeroid; - char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); + char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { + fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) { + fprintf(stderr,"found merkleht.%d\n",merkleht); if ( oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()) == sizeof(hash) && oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) { txid = batontxid; + fprintf(stderr,"set txid\n"); return(mhash); - } else return(zeroid); - } - } //else break; - batontxid = hash; + } + else + { + fprintf(stderr,"missing hash\n"); + return(zeroid); + } + } else fprintf(stderr,"height.%d vs search ht.%d\n",merkleht,height); + batontxid = hash; + } else break; } + fprintf(stderr,"end of loop\n"); return(zeroid); } From 36fbbfe6fcdfa56f17e4f01a5843724ff724d8dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:20:51 -1100 Subject: [PATCH 288/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5ec01b8fd..04c585cd3 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -547,7 +547,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) { - fprintf(stderr,"found merkleht.%d\n",merkleht); + fprintf(stderr,"found merkleht.%d\n",(int32_t)merkleht); if ( oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()) == sizeof(hash) && oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) { @@ -560,7 +560,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u fprintf(stderr,"missing hash\n"); return(zeroid); } - } else fprintf(stderr,"height.%d vs search ht.%d\n",merkleht,height); + } else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); batontxid = hash; } else break; } From 2ca4cd6e9a791bfd4b6bd022cb1650e55270718c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:25:15 -1100 Subject: [PATCH 289/306] Test --- src/cc/gateways.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 04c585cd3..2452825f3 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -542,6 +542,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { + fprintf(stderr,"check %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); @@ -562,6 +563,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u } } else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); batontxid = hash; + fprintf(stderr,"new hash %s\n",uint256_str(str,batontxid)); } else break; } fprintf(stderr,"end of loop\n"); From b73666e2ffa061ecac897e43462666101d552ca2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:26:42 -1100 Subject: [PATCH 290/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 2452825f3..ec0fb919b 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -537,13 +537,13 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid) { - CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; + CTransaction tx; uint256 hash,mhash,bhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; txid = zeroid; char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { fprintf(stderr,"check %s\n",uint256_str(str,batontxid)); - if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) + if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,bhash,pk,data) == 'D' && oracletxid == reforacletxid ) { fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) @@ -562,7 +562,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u return(zeroid); } } else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); - batontxid = hash; + batontxid = bhash; fprintf(stderr,"new hash %s\n",uint256_str(str,batontxid)); } else break; } From 11b0ed84d56ee172ca7639957c61123af7a9d5ca Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:33:18 -1100 Subject: [PATCH 291/306] Test --- src/cc/gateways.cpp | 15 ++++++++------- src/cc/oracles.cpp | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index ec0fb919b..7c70408d8 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -537,20 +537,21 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,uint256 batontxid) { - CTransaction tx; uint256 hash,mhash,bhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; + CTransaction tx; uint256 hash,mhash,bhash,hashBlock,oracletxid; int32_t len,len2,numvouts; int64_t val,merkleht; CPubKey pk; std::vectordata; txid = zeroid; - char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); + //char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - fprintf(stderr,"check %s\n",uint256_str(str,batontxid)); + //fprintf(stderr,"check %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,bhash,pk,data) == 'D' && oracletxid == reforacletxid ) { - fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); + //fprintf(stderr,"decoded %s\n",uint256_str(str,batontxid)); if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) { - fprintf(stderr,"found merkleht.%d\n",(int32_t)merkleht); - if ( oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()) == sizeof(hash) && - oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()) == sizeof(hash) && mhash != zeroid ) + len = oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()); + len2 = oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()); + char str2[65]; fprintf(stderr,"found merkleht.%d len.%d len2.%d %s %s\n",(int32_t)merkleht,len,len2,uint256_str(str,hash),uint256_str(str2,mhash)); + if ( len == sizeof(hash) && len2 == sizeof(mhash) && mhash != zeroid ) { txid = batontxid; fprintf(stderr,"set txid\n"); diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a0437ed0f..6af1453ce 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -157,8 +157,8 @@ uint8_t DecodeOraclesData(const CScript &scriptPubKey,uint256 &oracletxid,uint25 { if ( e == EVAL_ORACLES && f == 'D' ) return(f); - else fprintf(stderr,"DecodeOraclesData evalcode.%d f.%c\n",e,f); - } else fprintf(stderr,"DecodeOraclesData not enough opereturn data\n"); + //else fprintf(stderr,"DecodeOraclesData evalcode.%d f.%c\n",e,f); + } //else fprintf(stderr,"DecodeOraclesData not enough opereturn data\n"); return(0); } From e072837352c08975ce67eae86e5b68e6ca67b998 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:36:45 -1100 Subject: [PATCH 292/306] Test --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7c70408d8..68f639ff3 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -539,7 +539,8 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u { CTransaction tx; uint256 hash,mhash,bhash,hashBlock,oracletxid; int32_t len,len2,numvouts; int64_t val,merkleht; CPubKey pk; std::vectordata; txid = zeroid; - //char str[65]; fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); + char str[65]; + //fprintf(stderr,"start reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { //fprintf(stderr,"check %s\n",uint256_str(str,batontxid)); From b6283728906e81650d649bcc2d5fa879c83200cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:38:59 -1100 Subject: [PATCH 293/306] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 68f639ff3..7d886a5b7 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -552,7 +552,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u len = oracle_format(&hash,&val,0,'h',(uint8_t *)data.data(),sizeof(int32_t),(int32_t)data.size()); len2 = oracle_format(&mhash,&val,0,'h',(uint8_t *)data.data(),(int32_t)(sizeof(int32_t)+sizeof(uint256)),(int32_t)data.size()); char str2[65]; fprintf(stderr,"found merkleht.%d len.%d len2.%d %s %s\n",(int32_t)merkleht,len,len2,uint256_str(str,hash),uint256_str(str2,mhash)); - if ( len == sizeof(hash) && len2 == sizeof(mhash) && mhash != zeroid ) + if ( len == sizeof(hash)+sizeof(int32_t) && len2 == 2*sizeof(mhash)+sizeof(int32_t) && mhash != zeroid ) { txid = batontxid; fprintf(stderr,"set txid\n"); @@ -565,7 +565,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u } } else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); batontxid = bhash; - fprintf(stderr,"new hash %s\n",uint256_str(str,batontxid)); + //fprintf(stderr,"new hash %s\n",uint256_str(str,batontxid)); } else break; } fprintf(stderr,"end of loop\n"); From 186ce5d29dcbab3df4cc522cac33b9861bcc00fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:44:19 -1100 Subject: [PATCH 294/306] Test --- src/cc/gateways.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 7d886a5b7..53a4d8765 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -555,15 +555,15 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u if ( len == sizeof(hash)+sizeof(int32_t) && len2 == 2*sizeof(mhash)+sizeof(int32_t) && mhash != zeroid ) { txid = batontxid; - fprintf(stderr,"set txid\n"); + //fprintf(stderr,"set txid\n"); return(mhash); } else { - fprintf(stderr,"missing hash\n"); + //fprintf(stderr,"missing hash\n"); return(zeroid); } - } else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); + } //else fprintf(stderr,"height.%d vs search ht.%d\n",(int32_t)merkleht,(int32_t)height); batontxid = bhash; //fprintf(stderr,"new hash %s\n",uint256_str(str,batontxid)); } else break; @@ -626,7 +626,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout { fprintf(stderr,"verify proof for cointxid in merkleroot\n"); return(nValue); - } else fprintf(stderr,"(%s) != (%s) or txid mismatch.%d or script mismatch\n",refdepositaddr,destaddr,txid != cointxid); + } else fprintf(stderr,"(%s) != (%s) or txid %s mismatch.%d or script mismatch\n",refdepositaddr,destaddr,uint256_str(str,txid),txid != cointxid); return(0); } @@ -679,7 +679,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: txids.push_back(txid); } } - fprintf(stderr,"m.%d of n.%d\n",m,n); + fprintf(stderr,"cointxid.%s m.%d of n.%d\n",uint256_str(str,cointxid),m,n); if ( merkleroot == zeroid || m < n/2 ) { //uint256 tmp; From 1826284cb3b3d3a0202f554e3a6e645ed2526814 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 22:51:01 -1100 Subject: [PATCH 295/306] Print --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 53a4d8765..be61cffc4 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -624,7 +624,7 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout } if ( txid == cointxid ) { - fprintf(stderr,"verify proof for cointxid in merkleroot\n"); + fprintf(stderr,"verified proof for cointxid in merkleroot\n"); return(nValue); } else fprintf(stderr,"(%s) != (%s) or txid %s mismatch.%d or script mismatch\n",refdepositaddr,destaddr,uint256_str(str,txid),txid != cointxid); return(0); From 5c43df8b4836825a144ddaa87c0acde52785eacc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:14:55 -1100 Subject: [PATCH 296/306] Test --- src/cc/gateways.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index be61cffc4..345b00f7e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -298,6 +298,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); + fprintf(stderr,"check %s for gateway inputs\n",coinaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; @@ -316,6 +317,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); + char str[65]; fprintf(stderr,"check for assetid.%s\n",uint256_str(str,assetid)); if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) From 733b58f24921d5f67df9eff981715e3e944a5151 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:23:20 -1100 Subject: [PATCH 297/306] Test --- src/cc/gateways.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 345b00f7e..3ebe0e8e0 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -317,12 +317,13 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); - char str[65]; fprintf(stderr,"check for assetid.%s\n",uint256_str(str,assetid)); + char str[65]; fprintf(stderr,"%d:%d (%c) check for refassetid.%s vs %s %.8f\n",evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { + fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); - nValue = it->second.satoshis; + //nValue = it->second.satoshis; totalinputs += nValue; n++; if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) ) From c15c1ad2ef71a4ff991fc914a9ecb3d6a5f3fb38 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:25:22 -1100 Subject: [PATCH 298/306] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 3ebe0e8e0..aeeb85a8a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -317,7 +317,7 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); - char str[65]; fprintf(stderr,"%d:%d (%c) check for refassetid.%s vs %s %.8f\n",evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); + char str[65],str2[65]; fprintf(stderr,"%d:%d (%c) check for refassetid.%s vs %s %.8f\n",evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); From c884b0f0eabdbab44580ee7fcb7e3c632c40afc7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:30:19 -1100 Subject: [PATCH 299/306] Test --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index aeeb85a8a..cecb87b1a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -311,13 +311,14 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); + fprintf(stderr,"%s vout.%d %.8f\n",destaddr,vout,(double)vintx.vout[vout].nValue/COIN); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; GetOpReturnData(vintx.vout[vintx.vout.size()-1].scriptPubKey, vopret); if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); - char str[65],str2[65]; fprintf(stderr,"%d:%d (%c) check for refassetid.%s vs %s %.8f\n",evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); + char str[65],str2[65]; fprintf(stderr,"vout.%d %d:%d (%c) check for refassetid.%s vs %s %.8f\n",vout,evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); From 2511d10f8a55a728895d37f8bad910d846d316a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:33:24 -1100 Subject: [PATCH 300/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index cecb87b1a..b5c0ba6bd 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -311,15 +311,15 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); - fprintf(stderr,"%s vout.%d %.8f\n",destaddr,vout,(double)vintx.vout[vout].nValue/COIN); + fprintf(stderr,"%s vout.%d %.8f %.8f\n",destaddr,vout,(double)vintx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; GetOpReturnData(vintx.vout[vintx.vout.size()-1].scriptPubKey, vopret); if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); - char str[65],str2[65]; fprintf(stderr,"vout.%d %d:%d (%c) check for refassetid.%s vs %s %.8f\n",vout,evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)nValue/COIN); - if ( evalcode == cp->evalcode && assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) + char str[65],str2[65]; fprintf(stderr,"vout.%d %d:%d (%c) check for refassetid.%s vs %s %.8f\n",vout,evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)vintx.vout[vout].nValue/COIN); + if ( assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); if ( total != 0 && maxinputs != 0 ) From 983ff7f46d38c42acdbf11867f7931a7b61228ce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 23 Sep 2018 23:34:34 -1100 Subject: [PATCH 301/306] Test --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b5c0ba6bd..566177ea6 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -311,17 +311,17 @@ int64_t AddGatewaysInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); - fprintf(stderr,"%s vout.%d %.8f %.8f\n",destaddr,vout,(double)vintx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); + //fprintf(stderr,"%s vout.%d %.8f %.8f\n",destaddr,vout,(double)vintx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; GetOpReturnData(vintx.vout[vintx.vout.size()-1].scriptPubKey, vopret); if ( E_UNMARSHAL(vopret,ss >> evalcode; ss >> funcid; ss >> assetid) != 0 ) { assetid = revuint256(assetid); - char str[65],str2[65]; fprintf(stderr,"vout.%d %d:%d (%c) check for refassetid.%s vs %s %.8f\n",vout,evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)vintx.vout[vout].nValue/COIN); + //char str[65],str2[65]; fprintf(stderr,"vout.%d %d:%d (%c) check for refassetid.%s vs %s %.8f\n",vout,evalcode,cp->evalcode,funcid,uint256_str(str,refassetid),uint256_str(str2,assetid),(double)vintx.vout[vout].nValue/COIN); if ( assetid == refassetid && funcid == 't' && (nValue= vintx.vout[vout].nValue) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { - fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); + //fprintf(stderr,"total %llu maxinputs.%d %.8f\n",(long long)total,maxinputs,(double)it->second.satoshis/COIN); if ( total != 0 && maxinputs != 0 ) mtx.vin.push_back(CTxIn(txid,vout,CScript())); //nValue = it->second.satoshis; From 2ce154d60efed158f51d76eb6a8787e939097d37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 24 Sep 2018 00:36:18 -1100 Subject: [PATCH 302/306] Allow sendtoaddress for PIRATE to notary --- src/wallet/rpcwallet.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5a14370c4..e02cad35f 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -398,7 +398,7 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr // Parse Zcash address CScript scriptPubKey = GetScriptForDestination(address); - + // Create and send the transaction CReserveKey reservekey(pwalletMain); CAmount nFeeRequired; @@ -430,6 +430,8 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr throw JSONRPCError(RPC_WALLET_ERROR, "Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here."); } +int32_t komodo_isnotaryvout(char *coinaddr); + UniValue sendtoaddress(const UniValue& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) @@ -460,8 +462,12 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) ); if ( ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid " + strprintf("%s",komodo_chainname()) + " address"); - + { + if ( komodo_isnotaryvout((char *)params[0].get_str().c_ctr()) == 0 ) + { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid " + strprintf("%s",komodo_chainname()) + " address"); + } + } LOCK2(cs_main, pwalletMain->cs_wallet); CBitcoinAddress address(params[0].get_str()); From 10a5fd2cd0d813443fae9452cf1f616bb3f9e797 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 24 Sep 2018 00:37:09 -1100 Subject: [PATCH 303/306] Test --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e02cad35f..cf86a0ba5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -463,7 +463,7 @@ UniValue sendtoaddress(const UniValue& params, bool fHelp) if ( ASSETCHAINS_PRIVATE != 0 && AmountFromValue(params[1]) > 0 ) { - if ( komodo_isnotaryvout((char *)params[0].get_str().c_ctr()) == 0 ) + if ( komodo_isnotaryvout((char *)params[0].get_str().c_str()) == 0 ) { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid " + strprintf("%s",komodo_chainname()) + " address"); } From 594c9d12748b958f4c0a768fb522ae902bbc161f Mon Sep 17 00:00:00 2001 From: Jorian Date: Mon, 24 Sep 2018 15:41:03 +0200 Subject: [PATCH 304/306] add mgnx --- src/ac/mgnx | 2 ++ src/assetchains.json | 12 ++++++++++++ src/assetchains.old | 2 +- src/dpowassets | 1 + src/fiat/mgnx | 2 ++ 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100755 src/ac/mgnx create mode 100755 src/fiat/mgnx diff --git a/src/ac/mgnx b/src/ac/mgnx new file mode 100755 index 000000000..9bd85336e --- /dev/null +++ b/src/ac/mgnx @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=MGNX $1 $2 $3 $4 $5 $6 diff --git a/src/assetchains.json b/src/assetchains.json index 825f606df..7dbd7a473 100644 --- a/src/assetchains.json +++ b/src/assetchains.json @@ -155,5 +155,17 @@ "addnode": [ "136.243.102.225" ] + }, + { + "ac_name": "MGNX", + "ac_supply": "12465003", + "ac_staked": "90", + "ac_reward": "2000000000", + "ac_halving": "525960", + "ac_cc": "2", + "ac_end": "2629800", + "addnode": [ + "45.76.32.178" + ] } ] diff --git a/src/assetchains.old b/src/assetchains.old index 96f680b03..fcee4bf41 100755 --- a/src/assetchains.old +++ b/src/assetchains.old @@ -40,4 +40,4 @@ echo $pubkey ./komodod -pubkey=$pubkey -ac_name=SEC -ac_cc=333 -ac_supply=1000000000 -addnode=185.148.145.43 & ./komodod -pubkey=$pubkey -ac_name=CCL -ac_supply=200000000 -ac_end=1 -ac_cc=2 -addressindex=1 -spentindex=1 -addnode=142.93.136.89 -addnode=195.201.22.89 & ./komodod -pubkey=$pubkey -ac_name=PIRATE -ac_supply=0 -ac_reward=25600000000 -ac_halving=77777 -ac_private=1 -addnode=136.243.102.225 & - +./komodod -pubkey=$pubkey -ac_name=MGNX -ac_supply=12465003 -ac_staked=90 -ac_reward=2000000000 -ac_halving=525960 -ac_cc=2 -ac_end=2629800 -addnode=142.93.27.180 & diff --git a/src/dpowassets b/src/dpowassets index 2b85f976f..9bd17ff18 100755 --- a/src/dpowassets +++ b/src/dpowassets @@ -42,3 +42,4 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dp curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CCL\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUSH\",\"pubkey\":\"$pubkey\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PIRATE\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGNX\",\"pubkey\":\"$pubkey\"}" diff --git a/src/fiat/mgnx b/src/fiat/mgnx new file mode 100755 index 000000000..9bd85336e --- /dev/null +++ b/src/fiat/mgnx @@ -0,0 +1,2 @@ +#!/bin/bash +./komodo-cli -ac_name=MGNX $1 $2 $3 $4 $5 $6 From 966a1680374b22754393a4ed844743d6e9036512 Mon Sep 17 00:00:00 2001 From: Jorian Date: Mon, 24 Sep 2018 15:43:16 +0200 Subject: [PATCH 305/306] fix ip --- src/assetchains.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assetchains.json b/src/assetchains.json index 7dbd7a473..f78e19f87 100644 --- a/src/assetchains.json +++ b/src/assetchains.json @@ -165,7 +165,7 @@ "ac_cc": "2", "ac_end": "2629800", "addnode": [ - "45.76.32.178" + "142.93.27.180" ] } ] From 6b72038d2d7eb22798c2d587f9a06bb8425d978f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 24 Sep 2018 03:45:08 -1100 Subject: [PATCH 306/306] add claimpubkey check --- src/cc/gateways.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 566177ea6..a0b3a7210 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -634,12 +634,12 @@ int64_t GatewaysVerify(char *refdepositaddr,uint256 oracletxid,int32_t claimvout return(0); } -int64_t GatewaysDepositval(CTransaction tx) +int64_t GatewaysDepositval(CTransaction tx,CPubKey mypk) { int32_t numvouts,height; int64_t amount; std::string coin,deposithex; std::vector publishers; std::vectortxids; uint256 bindtxid,cointxid; std::vector proof; CPubKey claimpubkey; if ( (numvouts= tx.vout.size()) > 0 ) { - if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' ) + if ( DecodeGatewaysOpRet(tx.vout[numvouts-1].scriptPubKey,coin,bindtxid,publishers,txids,height,cointxid,deposithex,proof,claimpubkey,amount) == 'D' && claimpubkey == mypk ) { // coin, bindtxid, publishers fprintf(stderr,"need to validate deposittxid more\n"); @@ -735,7 +735,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui fprintf(stderr,"cant find deposittxid %s\n",uint256_str(str,bindtxid)); return(""); } - if ( (depositamount= GatewaysDepositval(tx)) != amount ) + if ( (depositamount= GatewaysDepositval(tx,mypk)) != amount ) { fprintf(stderr,"invalid Gateways deposittxid %s %.8f != %.8f\n",uint256_str(str,deposittxid),(double)depositamount/COIN,(double)amount/COIN); return("");