From dc5149ed0deceafd3855086ad56a6c057578852b Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Wed, 15 Nov 2017 04:56:35 +0400 Subject: [PATCH 01/45] added q/a in script use faq --- iguana/dexscripts.win32/how_to_use.md | 12 +++++++++--- iguana/dexscripts.win32/images/conemu_jq.png | Bin 0 -> 31836 bytes 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 iguana/dexscripts.win32/images/conemu_jq.png diff --git a/iguana/dexscripts.win32/how_to_use.md b/iguana/dexscripts.win32/how_to_use.md index 29fdcc537..5d1488885 100644 --- a/iguana/dexscripts.win32/how_to_use.md +++ b/iguana/dexscripts.win32/how_to_use.md @@ -1,15 +1,15 @@ ## DexScripts for Windows. How to use? ## -**1. ** Before start you should put scripts and following binaries into one folder: +**1.** Before start you should put scripts and following binaries into one folder: - curl.exe (required for all scripts) - marketmaker.exe - libcurl.dll (required to run marketmaker) - nanomsg.dll (required to run marketmaker) -**2. ** Don't forget to put `coins.json` file into a same folder. This file is available it this repo. +**2.** Don't forget to put `coins.json` file into a same folder. This file is available it this repo. -**3. ** Type your passphrase into passphrase file in this folder (you should create file with name `passphrase` and without extension) and run `1-client.cmd`. This will run marketmaker. Next step is to obtain userpass needed for other scripts, you can simply copy and paste it from marketmaker output on startup into userpass file. +**3.** Type your passphrase into passphrase file in this folder (you should create file with name `passphrase` and without extension) and run `1-client.cmd`. This will run marketmaker. Next step is to obtain userpass needed for other scripts, you can simply copy and paste it from marketmaker output on startup into userpass file. ![](./images/userpass.png) @@ -42,3 +42,9 @@ And nothing works. **A.** Before run `1-client.cmd` make sure in Task Manager that you haven't already running `marketmaker.exe`. If have - kill this process via Task Manager or via command line command `taskkill /f /im taskkill.exe` . +**Q.** How can i pretty print JSON answers of marketmaker? +**A.** You can get best results with 2 tools - [conemu](https://conemu.github.io/) and [jq](https://stedolan.github.io/jq/), conemu supports ANSI X3.64 and Xterm 256 colors and jq allow you to pretty-print json output with colors, like this: + +![](./images/conemu_jq.png) + +Also i'm always recommend to install [Far Manager](https://www.farmanager.com/index.php?l=en) - this is powerful console file manager for Windows, like Midnight Commander in *nix. \ No newline at end of file diff --git a/iguana/dexscripts.win32/images/conemu_jq.png b/iguana/dexscripts.win32/images/conemu_jq.png new file mode 100644 index 0000000000000000000000000000000000000000..e8eeaf523849b859d5b9a396090f3a3b59e4137b GIT binary patch literal 31836 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 IqWAj$0BxH_7ytkO literal 0 HcmV?d00001 From be324b6c5fabb94c86a462d9e3fdec26e1b877c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 12:17:10 +0200 Subject: [PATCH 02/45] Test --- iguana/exchanges/LP_include.h | 4 ++-- iguana/exchanges/LP_nativeDEX.c | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b7dd79e03..5e530f9c1 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -53,8 +53,8 @@ void emscripten_usleep(int32_t x); // returns immediate, no sense for sleeping #define LP_MIN_PEERS 8 #define LP_MAX_PEERS 32 -#define LP_MAXDESIRED_UTXOS 128 -#define LP_MINDESIRED_UTXOS 32 +#define LP_MAXDESIRED_UTXOS (IAMLP != 0 ? 128 : 64) +#define LP_MINDESIRED_UTXOS (IAMLP != 0 ? 32 : 16) #define LP_DUSTCOMBINE_THRESHOLD 1000000 // RTmetrics diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6232d159b..ae5fa57a7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -17,16 +17,15 @@ // LP_nativeDEX.c // marketmaker // -// single utxo allocations alice // gc cJSON -// more retries for swap sendrawtransaction +// more retries for swap sendrawtransaction? // pbca26 unfinished swaps -// alice waiting for bestprice -//if ( G.LP_pendingswaps != 0 ) -//return(-1); +// if ( G.LP_pendingswaps != 0 ) return(-1); // bot safe to exit? // // BCH signing +// single utxo allocations alice +// alice waiting for bestprice // previously, it used to show amount, kmd equiv, perc // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections // bigendian architectures need to use little endian for sighash calcs From 48ffd56a48f7843f33eb5c043a41d04da7b608b4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:04:17 +0200 Subject: [PATCH 03/45] Test --- crypto777/cJSON.c | 33 ++++++++++++++++++++++++++++++--- iguana/exchanges/mm.c | 1 + 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 8bce48b19..9674910b8 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -578,8 +578,6 @@ cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->t cJSON *cJSON_CreateBool(int32_t b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int64_t)num;}return item;} cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} -cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} -cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} /* Create Arrays: */ cJSON *cJSON_CreateIntArray(int64_t *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} @@ -1129,4 +1127,33 @@ cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num) return(array); } -void free_json(cJSON *json) { if ( json != 0 ) cJSON_Delete(json); } +cJSON *cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(); + if ( item ) + item->type = cJSON_Array; +#ifdef CJSON_GARBAGECOLLECTION + cJSON_register(item); +#endif + return(item); +} + +cJSON *cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(); + if ( item ) + item->type = cJSON_Object; +#ifdef CJSON_GARBAGECOLLECTION + cJSON_register(item); +#endif + return item; +} + +void free_json(cJSON *json) +{ +#ifdef CJSON_GARBAGECOLLECTION + cJSON_unregister(item); +#endif + if ( json != 0 ) + cJSON_Delete(json); +} diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 1d2a1bd5e..8ce073d1f 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -24,6 +24,7 @@ void PNACL_message(char *arg,...) } #define FROM_MARKETMAKER +#define CJSON_GARBAGECOLLECTION #include #include #ifndef NATIVE_WINDOWS From 7e999953c64612ea58110f01b0aa123621781814 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:16:29 +0200 Subject: [PATCH 04/45] Test --- crypto777/cJSON.c | 2 +- iguana/m_mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 9674910b8..404931fcf 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1144,7 +1144,7 @@ cJSON *cJSON_CreateObject(void) if ( item ) item->type = cJSON_Object; #ifdef CJSON_GARBAGECOLLECTION - cJSON_register(item); + cJSON_register(item); fff #endif return item; } diff --git a/iguana/m_mm b/iguana/m_mm index b5ba405ca..3905b5d84 100755 --- a/iguana/m_mm +++ b/iguana/m_mm @@ -1,3 +1,3 @@ cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -gcc -g -o marketmaker -I../crypto777 exchanges/mm.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm +gcc -DFROM_MARKETMAKER -g -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm From 32191a3f60704664049426d0242e0bf5753a36c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:26:24 +0200 Subject: [PATCH 05/45] Test --- crypto777/cJSON.c | 2 ++ iguana/exchanges/mm.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 404931fcf..a9bb74dd7 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -25,6 +25,8 @@ /* JSON parser in C. */ #include +#define CJSON_GARBAGECOLLECTION + #include "../includes/cJSON.h" #ifndef DBL_EPSILON diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 8ce073d1f..56498394a 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -23,7 +23,10 @@ void PNACL_message(char *arg,...) { } +#ifndef FROM_MARKETMAKER #define FROM_MARKETMAKER +#endif + #define CJSON_GARBAGECOLLECTION #include #include From 3df1acbc3b4bd1470d291f8c36c21d3a29477032 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:28:05 +0200 Subject: [PATCH 06/45] Test --- crypto777/cJSON.c | 2 -- iguana/exchanges/mm.c | 5 +++-- iguana/m_mm | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index a9bb74dd7..404931fcf 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -25,8 +25,6 @@ /* JSON parser in C. */ #include -#define CJSON_GARBAGECOLLECTION - #include "../includes/cJSON.h" #ifndef DBL_EPSILON diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 56498394a..e20b1dcb6 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -23,11 +23,12 @@ void PNACL_message(char *arg,...) { } -#ifndef FROM_MARKETMAKER #define FROM_MARKETMAKER -#endif +#ifndef CJSON_GARBAGECOLLECTION #define CJSON_GARBAGECOLLECTION +#endif + #include #include #ifndef NATIVE_WINDOWS diff --git a/iguana/m_mm b/iguana/m_mm index 3905b5d84..0609d842c 100755 --- a/iguana/m_mm +++ b/iguana/m_mm @@ -1,3 +1,3 @@ cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -gcc -DFROM_MARKETMAKER -g -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm +gcc -DCJSON_GARBAGECOLLECTION -g -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm From 62ff96b246815feebf2e2d55e39f75d96cec226b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:29:15 +0200 Subject: [PATCH 07/45] Test --- crypto777/cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 404931fcf..9674910b8 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1144,7 +1144,7 @@ cJSON *cJSON_CreateObject(void) if ( item ) item->type = cJSON_Object; #ifdef CJSON_GARBAGECOLLECTION - cJSON_register(item); fff + cJSON_register(item); #endif return item; } From 21b83eaf5fc3d5e978d247524c46dd2745834c15 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:31:20 +0200 Subject: [PATCH 08/45] Test --- includes/cJSON.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/includes/cJSON.h b/includes/cJSON.h index 77e0752e6..cd8e6d00f 100755 --- a/includes/cJSON.h +++ b/includes/cJSON.h @@ -218,6 +218,8 @@ extern "C" char *nxt64str2(uint64_t nxt64bits); cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num); int32_t myatoi(char *str,int32_t range); + void cJSON_register(cJSON *item); + void cJSON_unregister(cJSON *item); char *stringifyM(char *str); #define replace_backslashquotes unstringify From fc1c161db6650d8cd989ae00d742596606d1116d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:47:36 +0200 Subject: [PATCH 09/45] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- iguana/exchanges/LP_utxo.c | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ae5fa57a7..c7ba59d0b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -82,7 +82,7 @@ void LP_millistats_update(struct LP_millistats *mp) } #include "LP_include.h" -portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex,LP_coinmutex,LP_messagemutex,LP_portfoliomutex,LP_electrummutex,LP_butxomutex,LP_reservedmutex,LP_nanorecvsmutex,LP_tradebotsmutex,LP_gcmutex,LP_inusemutex; +portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex,LP_coinmutex,LP_messagemutex,LP_portfoliomutex,LP_electrummutex,LP_butxomutex,LP_reservedmutex,LP_nanorecvsmutex,LP_tradebotsmutex,LP_gcmutex,LP_inusemutex,LP_cJSONmutex; int32_t LP_canbind; char *Broadcaststr,*Reserved_msgs[2][1000]; int32_t num_Reserved_msgs[2],max_Reserved_msgs[2]; @@ -938,6 +938,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu portable_mutex_init(&LP_reservedmutex); portable_mutex_init(&LP_nanorecvsmutex); portable_mutex_init(&LP_tradebotsmutex); + portable_mutex_init(&LP_cJSONmutex); myipaddr = clonestr("127.0.0.1"); #ifndef _WIN32 #ifndef FROM_JS diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 6e49013b0..cdfff09a1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -27,6 +27,42 @@ struct LP_inuse_info } LP_inuse[1024]; int32_t LP_numinuse; +struct cJSON_list +{ + struct cJSON_list *next,*prev; + cJSON *item; + uint32_t timestamp; +} *LP_cJSONlist; + +void cJSON_register(cJSON *item) +{ + struct cJSON_list *ptr; + ptr = calloc(1,sizeof(*ptr)); + ptr->timestamp = (uint32_t)time(NULL); + ptr->item = item; + portable_mutex_lock(&LP_cJSONmutex); + DL_APPEND(LP_cJSONlist,ptr); + portable_mutex_unlock(&LP_cJSONmutex); +} + +void cJSON_unregister(cJSON *item) +{ + struct cJSON_list *ptr,*tmp; + DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) + { + if ( ptr->item == item ) + break; + ptr = 0; + } + if ( ptr != 0 ) + { + portable_mutex_lock(&LP_cJSONmutex); + DL_DELETE(LP_cJSONlist,ptr); + free(ptr); + portable_mutex_unlock(&LP_cJSONmutex); + } +} + struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) { int32_t i; From 5770810c609ab69de70d92bebe61a202bf8fcb5f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:48:38 +0200 Subject: [PATCH 10/45] Test --- crypto777/cJSON.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 9674910b8..28f02bafc 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1149,11 +1149,11 @@ cJSON *cJSON_CreateObject(void) return item; } -void free_json(cJSON *json) +void free_json(cJSON *item) { #ifdef CJSON_GARBAGECOLLECTION cJSON_unregister(item); #endif if ( json != 0 ) - cJSON_Delete(json); + cJSON_Delete(item); } From b86d13d6b503774c2c54b4c83c02560396b71f1c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 13:49:30 +0200 Subject: [PATCH 11/45] Test --- crypto777/cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 28f02bafc..555fdf29c 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1154,6 +1154,6 @@ void free_json(cJSON *item) #ifdef CJSON_GARBAGECOLLECTION cJSON_unregister(item); #endif - if ( json != 0 ) + if ( item != 0 ) cJSON_Delete(item); } From 2d23ba8dd6bf0d45f5bd5c8cb32d4498b354aa26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:15:08 +0200 Subject: [PATCH 12/45] Test --- iguana/exchanges/LP_utxo.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index cdfff09a1..6d22d3faf 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -45,9 +45,25 @@ void cJSON_register(cJSON *item) portable_mutex_unlock(&LP_cJSONmutex); } +char *mbstr(char *str,double n); void cJSON_unregister(cJSON *item) { - struct cJSON_list *ptr,*tmp; + static uint32_t lasttime; + char *tmpstr,str[65]; int32_t n; uint64_t total; struct cJSON_list *ptr,*tmp; + if ( time(NULL) > lasttime+600 ) + { + n = 0; + total = 0; + DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) + { + tmpstr = jprint(ptr->item,0); + total += strlen(tmpstr); + free(tmpstr); + n++; + } + printf("total %d cJSON pending %s\n",n,mbstr(str,total)); + lasttime = (uint32_t)time(NULL); + } DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { if ( ptr->item == item ) @@ -60,7 +76,7 @@ void cJSON_unregister(cJSON *item) DL_DELETE(LP_cJSONlist,ptr); free(ptr); portable_mutex_unlock(&LP_cJSONmutex); - } + } else printf("cJSON_unregister of unknown %p\n",item); } struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) From 19634a3c9afa042ef0b92574c8f608ed3a55770a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:18:04 +0200 Subject: [PATCH 13/45] Test --- iguana/exchanges/LP_utxo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 6d22d3faf..e36afaff5 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -72,11 +72,12 @@ void cJSON_unregister(cJSON *item) } if ( ptr != 0 ) { + printf("found %p\n",item); portable_mutex_lock(&LP_cJSONmutex); DL_DELETE(LP_cJSONlist,ptr); free(ptr); portable_mutex_unlock(&LP_cJSONmutex); - } else printf("cJSON_unregister of unknown %p\n",item); + } //else printf("cJSON_unregister of unknown %p\n",item); } struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) From ce6caefbed81964237feb6d8715a6ca8dfc41b78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:24:45 +0200 Subject: [PATCH 14/45] Test --- iguana/exchanges/LP_utxo.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index e36afaff5..a807f2fcc 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -37,6 +37,7 @@ struct cJSON_list void cJSON_register(cJSON *item) { struct cJSON_list *ptr; + printf(" register %p\n",item); ptr = calloc(1,sizeof(*ptr)); ptr->timestamp = (uint32_t)time(NULL); ptr->item = item; @@ -50,6 +51,7 @@ void cJSON_unregister(cJSON *item) { static uint32_t lasttime; char *tmpstr,str[65]; int32_t n; uint64_t total; struct cJSON_list *ptr,*tmp; + printf("unregister %p\n",item); if ( time(NULL) > lasttime+600 ) { n = 0; From 240d250f68c28d0cfe50022e381918f472870639 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:34:25 +0200 Subject: [PATCH 15/45] Test --- iguana/exchanges/LP_utxo.c | 2 +- iguana/exchanges/invreset | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index a807f2fcc..ce9c0f4ca 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -52,7 +52,7 @@ void cJSON_unregister(cJSON *item) static uint32_t lasttime; char *tmpstr,str[65]; int32_t n; uint64_t total; struct cJSON_list *ptr,*tmp; printf("unregister %p\n",item); - if ( time(NULL) > lasttime+600 ) + if ( time(NULL) > lasttime+6 ) { n = 0; total = 0; diff --git a/iguana/exchanges/invreset b/iguana/exchanges/invreset index f0b1c79e3..0304c7503 100755 --- a/iguana/exchanges/invreset +++ b/iguana/exchanges/invreset @@ -1,3 +1,4 @@ +#!/bin/bash source userpass source passphrase curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"inventory\",\"coin\":\"KMD\",\"reset\":1,\"passphrase\":\"$passphrase\"}" From d70d5c835db1c4661513f8b3c9b2280154c09b23 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:41:16 +0200 Subject: [PATCH 16/45] Test --- iguana/exchanges/LP_utxo.c | 13 ++++++------- includes/cJSON.h | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index ce9c0f4ca..a329aaef5 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -31,16 +31,17 @@ struct cJSON_list { struct cJSON_list *next,*prev; cJSON *item; - uint32_t timestamp; + uint32_t timestamp,cjsonid; } *LP_cJSONlist; void cJSON_register(cJSON *item) { struct cJSON_list *ptr; - printf(" register %p\n",item); ptr = calloc(1,sizeof(*ptr)); ptr->timestamp = (uint32_t)time(NULL); ptr->item = item; + item->cjsonid = rand(); + ptr->cjsonid = item->cjsonid; portable_mutex_lock(&LP_cJSONmutex); DL_APPEND(LP_cJSONlist,ptr); portable_mutex_unlock(&LP_cJSONmutex); @@ -51,8 +52,7 @@ void cJSON_unregister(cJSON *item) { static uint32_t lasttime; char *tmpstr,str[65]; int32_t n; uint64_t total; struct cJSON_list *ptr,*tmp; - printf("unregister %p\n",item); - if ( time(NULL) > lasttime+6 ) + //if ( time(NULL) > lasttime+6 ) { n = 0; total = 0; @@ -68,18 +68,17 @@ void cJSON_unregister(cJSON *item) } DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( ptr->item == item ) + if ( ptr->cjsonid == item->cjsonid )//ptr->item == item ) break; ptr = 0; } if ( ptr != 0 ) { - printf("found %p\n",item); portable_mutex_lock(&LP_cJSONmutex); DL_DELETE(LP_cJSONlist,ptr); free(ptr); portable_mutex_unlock(&LP_cJSONmutex); - } //else printf("cJSON_unregister of unknown %p\n",item); + } else printf("cJSON_unregister of unknown %p\n",item); } struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) diff --git a/includes/cJSON.h b/includes/cJSON.h index cd8e6d00f..3ecdadc69 100755 --- a/includes/cJSON.h +++ b/includes/cJSON.h @@ -73,6 +73,7 @@ extern "C" double valuedouble; /* The item's number, if type==cJSON_Number */ char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + uint32_t cjsonid; } cJSON; typedef struct cJSON_Hooks { From 006fcdaea0a39052d5ff699b02cb3ea0fcff5639 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:42:32 +0200 Subject: [PATCH 17/45] Test --- iguana/exchanges/LP_utxo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index a329aaef5..8a54d97ae 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -78,7 +78,7 @@ void cJSON_unregister(cJSON *item) DL_DELETE(LP_cJSONlist,ptr); free(ptr); portable_mutex_unlock(&LP_cJSONmutex); - } else printf("cJSON_unregister of unknown %p\n",item); + } else printf("cJSON_unregister of unknown %p %u\n",item,item->cjsonid); } struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) From 5e851f41eadad9b2f13beca5ef25db937970b535 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:46:40 +0200 Subject: [PATCH 18/45] Test --- iguana/exchanges/LP_utxo.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 8a54d97ae..d785ca933 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -58,9 +58,11 @@ void cJSON_unregister(cJSON *item) total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - tmpstr = jprint(ptr->item,0); - total += strlen(tmpstr); - free(tmpstr); + if ( (tmpstr= jprint(ptr->item,0)) != 0 ) + { + total += strlen(tmpstr); + free(tmpstr); + } n++; } printf("total %d cJSON pending %s\n",n,mbstr(str,total)); From 86e4295c24ea27dfd2528426d565f0f158bca475 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:50:28 +0200 Subject: [PATCH 19/45] Test --- crypto777/bitcoind_RPC.c | 2 +- iguana/exchanges/LP_utxo.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 4f0a9cdd4..98c7e7eb0 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -56,7 +56,7 @@ char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char * char *retstr = 0; cJSON *json,*result,*error; #ifdef FROM_MARKETMAKER - usleep(5000); + usleep(3000); #endif //printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr); if ( command == 0 || rpcstr == 0 || rpcstr[0] == 0 ) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index d785ca933..c78b475e7 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -58,10 +58,13 @@ void cJSON_unregister(cJSON *item) total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( (tmpstr= jprint(ptr->item,0)) != 0 ) + if ( ptr->item != 0 && ptr->item->child != 0 ) { - total += strlen(tmpstr); - free(tmpstr); + if ( (tmpstr= jprint(ptr->item,0)) != 0 ) + { + total += strlen(tmpstr); + free(tmpstr); + } } n++; } From 54a26a1ebad8d4f05dc943e21de0d681cac5b94a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:54:30 +0200 Subject: [PATCH 20/45] Test --- iguana/exchanges/LP_utxo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index c78b475e7..fa1210cfa 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -58,14 +58,14 @@ void cJSON_unregister(cJSON *item) total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( ptr->item != 0 && ptr->item->child != 0 ) + /*if ( ptr->item != 0 && ptr->item->child != 0 ) { if ( (tmpstr= jprint(ptr->item,0)) != 0 ) { total += strlen(tmpstr); free(tmpstr); } - } + }*/ n++; } printf("total %d cJSON pending %s\n",n,mbstr(str,total)); From 66c434d82d697843a93ff2bca53449cc9e7a1353 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 14:55:57 +0200 Subject: [PATCH 21/45] Test --- iguana/exchanges/LP_utxo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index fa1210cfa..de6660b86 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -58,14 +58,14 @@ void cJSON_unregister(cJSON *item) total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - /*if ( ptr->item != 0 && ptr->item->child != 0 ) + if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) { if ( (tmpstr= jprint(ptr->item,0)) != 0 ) { total += strlen(tmpstr); free(tmpstr); } - }*/ + } n++; } printf("total %d cJSON pending %s\n",n,mbstr(str,total)); From a25ab17cbbe7c727b44469f96794a3e0b56f3832 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:00:04 +0200 Subject: [PATCH 22/45] Test --- iguana/exchanges/LP_utxo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index de6660b86..933af800a 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -58,14 +58,14 @@ void cJSON_unregister(cJSON *item) total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) + /*if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) { if ( (tmpstr= jprint(ptr->item,0)) != 0 ) { total += strlen(tmpstr); free(tmpstr); } - } + }*/ n++; } printf("total %d cJSON pending %s\n",n,mbstr(str,total)); From 7c29efc217e67da5540e904df1fd2e96d933c7ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:08:29 +0200 Subject: [PATCH 23/45] Test --- iguana/exchanges/LP_utxo.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 933af800a..8512572e6 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -51,11 +51,10 @@ char *mbstr(char *str,double n); void cJSON_unregister(cJSON *item) { static uint32_t lasttime; - char *tmpstr,str[65]; int32_t n; uint64_t total; struct cJSON_list *ptr,*tmp; - //if ( time(NULL) > lasttime+6 ) + int32_t n; struct cJSON_list *ptr,*tmp; uint32_t now; + if ( (now= time(NULL)) > lasttime+6 ) { n = 0; - total = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { /*if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) @@ -68,13 +67,21 @@ void cJSON_unregister(cJSON *item) }*/ n++; } - printf("total %d cJSON pending %s\n",n,mbstr(str,total)); + printf("total %d cJSON pending\n",n); lasttime = (uint32_t)time(NULL); } DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( ptr->cjsonid == item->cjsonid )//ptr->item == item ) + if ( ptr->item == item ) break; + else if ( now > ptr->timestamp+60 ) + { + portable_mutex_lock(&LP_cJSONmutex); + DL_DELETE(LP_cJSONlist,ptr); + portable_mutex_unlock(&LP_cJSONmutex); + cJSON_Delete(ptr->item); + free(ptr); + } ptr = 0; } if ( ptr != 0 ) From 02df7289d30f72ab6d33331aeba4808a012da5ec Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:10:11 +0200 Subject: [PATCH 24/45] Test --- iguana/exchanges/LP_utxo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 8512572e6..4b0828a3b 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -79,6 +79,7 @@ void cJSON_unregister(cJSON *item) portable_mutex_lock(&LP_cJSONmutex); DL_DELETE(LP_cJSONlist,ptr); portable_mutex_unlock(&LP_cJSONmutex); + printf("free expired\n"); cJSON_Delete(ptr->item); free(ptr); } @@ -90,7 +91,7 @@ void cJSON_unregister(cJSON *item) DL_DELETE(LP_cJSONlist,ptr); free(ptr); portable_mutex_unlock(&LP_cJSONmutex); - } else printf("cJSON_unregister of unknown %p %u\n",item,item->cjsonid); + } //else printf("cJSON_unregister of unknown %p %u\n",item,item->cjsonid); } struct LP_inuse_info *_LP_inuse_find(bits256 txid,int32_t vout) From 49c0feed90b0686b8210d85d8d808e09f2240e19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:12:56 +0200 Subject: [PATCH 25/45] Test --- iguana/exchanges/LP_utxo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 4b0828a3b..1befc1dcf 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -72,9 +72,9 @@ void cJSON_unregister(cJSON *item) } DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - if ( ptr->item == item ) + if ( ptr->cjsonid == item->cjsonid ) break; - else if ( now > ptr->timestamp+60 ) + else if ( now > ptr->timestamp+60 && item->cjsonid != 0 ) { portable_mutex_lock(&LP_cJSONmutex); DL_DELETE(LP_cJSONlist,ptr); From bea2f74a87beb53592f02099935c6b01a883853b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:16:16 +0200 Subject: [PATCH 26/45] Test --- crypto777/cJSON.c | 18 +++++++++--------- iguana/m_mm | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index 555fdf29c..93438fe79 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -1132,9 +1132,9 @@ cJSON *cJSON_CreateArray(void) cJSON *item = cJSON_New_Item(); if ( item ) item->type = cJSON_Array; -#ifdef CJSON_GARBAGECOLLECTION - cJSON_register(item); -#endif +//#ifdef CJSON_GARBAGECOLLECTION +// cJSON_register(item); +//#endif return(item); } @@ -1143,17 +1143,17 @@ cJSON *cJSON_CreateObject(void) cJSON *item = cJSON_New_Item(); if ( item ) item->type = cJSON_Object; -#ifdef CJSON_GARBAGECOLLECTION - cJSON_register(item); -#endif +//#ifdef CJSON_GARBAGECOLLECTION +// cJSON_register(item); +//#endif return item; } void free_json(cJSON *item) { -#ifdef CJSON_GARBAGECOLLECTION - cJSON_unregister(item); -#endif +//#ifdef CJSON_GARBAGECOLLECTION +// cJSON_unregister(item); +//#endif if ( item != 0 ) cJSON_Delete(item); } diff --git a/iguana/m_mm b/iguana/m_mm index 0609d842c..36a0acad1 100755 --- a/iguana/m_mm +++ b/iguana/m_mm @@ -1,3 +1,3 @@ cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -gcc -DCJSON_GARBAGECOLLECTION -g -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm +gcc -g -o marketmaker -I../crypto777 exchanges/mm.c ../crypto777/cJSON.c mini-gmp.c secp256k1.o ../agents/libcrypto777.a -lnanomsg -lcurl -lpthread -lm From b435fe804c7af8da3ce399b9320346f851a2cf5c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:18:53 +0200 Subject: [PATCH 27/45] Test --- iguana/exchanges/LP_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 56ed047e4..a241aa4ab 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -35,7 +35,9 @@ char *LP_numutxos() char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; - //printf("stats_JSON(%s)\n",jprint(argjson,0)); + retstr = jprint(argjson,0); + printf("stats_JSON(%s)\n",retstr); + free(retstr), retstr = 0; method = jstr(argjson,"method"); /*if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 && (method == 0 || strcmp(method,"electrum") != 0) ) { From cd61cdb07f517ed47b0294890917cc67ae8bb53d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:25:35 +0200 Subject: [PATCH 28/45] Test --- iguana/exchanges/LP_commands.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a241aa4ab..b06fab289 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -35,10 +35,12 @@ char *LP_numutxos() char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; - retstr = jprint(argjson,0); - printf("stats_JSON(%s)\n",retstr); - free(retstr), retstr = 0; - method = jstr(argjson,"method"); +retstr = jprint(argjson,0); +printf("stats_JSON(%s)\n",retstr); +free(retstr), retstr = 0; +method = jstr(argjson,"method"); +if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 ) + return(clonestr("{}")); /*if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 && (method == 0 || strcmp(method,"electrum") != 0) ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) From db088b68ae6cafedf1e013d802ddc030ec2ecaea Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:28:56 +0200 Subject: [PATCH 29/45] Test --- iguana/exchanges/LP_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index b06fab289..c583c5346 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -35,12 +35,12 @@ char *LP_numutxos() char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; -retstr = jprint(argjson,0); -printf("stats_JSON(%s)\n",retstr); -free(retstr), retstr = 0; method = jstr(argjson,"method"); if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 ) return(clonestr("{}")); +retstr = jprint(argjson,0); +printf("stats_JSON(%s)\n",retstr); +free(retstr), retstr = 0; /*if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 && (method == 0 || strcmp(method,"electrum") != 0) ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) From ecce4d9c0855bc60f49b675836b7ea4ba5272383 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 15:49:57 +0200 Subject: [PATCH 30/45] Test --- iguana/exchanges/LP_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c583c5346..d4487782d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -36,7 +36,9 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *r { char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; method = jstr(argjson,"method"); -if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 ) +if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 + || strcmp(method,"notify") == 0 || strcmp(method,"postprice") == 0 + ) return(clonestr("{}")); retstr = jprint(argjson,0); printf("stats_JSON(%s)\n",retstr); From 3843e3d1e843b7cc034f8b2fad849016c976f60f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 16:02:17 +0200 Subject: [PATCH 31/45] Test --- iguana/exchanges/LP_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d4487782d..fdc2bc6ff 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -37,7 +37,8 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *r char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; method = jstr(argjson,"method"); if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 - || strcmp(method,"notify") == 0 || strcmp(method,"postprice") == 0 + || strcmp(method,"notify") == 0 + //|| strcmp(method,"postprice") == 0 ) return(clonestr("{}")); retstr = jprint(argjson,0); From 48623418bbeafdae3cc01059f872e52811e3a416 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 16:04:05 +0200 Subject: [PATCH 32/45] Test --- iguana/exchanges/LP_commands.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index fdc2bc6ff..3fc34e752 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -36,14 +36,11 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *r { char *method,*userpass,*base,*rel,*coin,*retstr = 0; int32_t changed,flag = 0; cJSON *retjson,*reqjson = 0; struct iguana_info *ptr; method = jstr(argjson,"method"); -if ( strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 - || strcmp(method,"notify") == 0 +if ( //strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 || + strcmp(method,"notify") == 0 //|| strcmp(method,"postprice") == 0 ) return(clonestr("{}")); -retstr = jprint(argjson,0); -printf("stats_JSON(%s)\n",retstr); -free(retstr), retstr = 0; /*if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 && (method == 0 || strcmp(method,"electrum") != 0) ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) From 12a6db1ac053c50ca87cde167292b5df8f11dcfc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 16:06:28 +0200 Subject: [PATCH 33/45] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 3fc34e752..40f7151c3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -38,7 +38,7 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *r method = jstr(argjson,"method"); if ( //strcmp(method,"uitem") == 0 || strcmp(method,"postutxos") == 0 || strcmp(method,"notify") == 0 - //|| strcmp(method,"postprice") == 0 + || strcmp(method,"postprice") == 0 ) return(clonestr("{}")); /*if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 && (method == 0 || strcmp(method,"electrum") != 0) ) From 8743a5701fb5265647f5f03f36e1dccfd9074061 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 16:37:34 +0200 Subject: [PATCH 34/45] Test --- iguana/exchanges/LP_cache.c | 6 +++--- iguana/exchanges/LP_commands.c | 6 +++--- iguana/exchanges/LP_swap.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_cache.c b/iguana/exchanges/LP_cache.c index a08828966..fdc734fe9 100644 --- a/iguana/exchanges/LP_cache.c +++ b/iguana/exchanges/LP_cache.c @@ -45,10 +45,10 @@ struct LP_transaction *LP_create_transaction(struct iguana_info *coin,bits256 tx vins = jarray(&numvins,txobj,"vin"); vouts = jarray(&numvouts,txobj,"vout"); tx = LP_transactionadd(coin,txid,height,numvouts,numvins); - tx->serialized = serialized; - //free(serialized); + tx->serialized = 0;//serialized; + free(serialized); tx->fpos = fpos; - tx->len = tx->len; + tx->len = 0;//tx->len; tx->SPV = tx->height = height; //printf("tx.%s numvins.%d numvouts.%d\n",bits256_str(str,txid),numvins,numvouts); for (i=0; i= 1000 ) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 03d08d69e..7e31d21e8 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -895,7 +895,7 @@ void LP_aliceloop(void *_swap) } basilisk_swap_finished(swap); printf("finish swap.%p\n",swap); - //free(swap); + free(swap); G.LP_pendingswaps--; } From 6b98102ea39de321667e0dac15bc985fc70bf047 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 16:39:27 +0200 Subject: [PATCH 35/45] Test --- iguana/exchanges/LP_utxo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 1befc1dcf..da6f97cc1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -51,20 +51,20 @@ char *mbstr(char *str,double n); void cJSON_unregister(cJSON *item) { static uint32_t lasttime; - int32_t n; struct cJSON_list *ptr,*tmp; uint32_t now; - if ( (now= time(NULL)) > lasttime+6 ) + int32_t n; char *tmpstr; uint64_t total = 0; struct cJSON_list *ptr,*tmp; uint32_t now; + if ( (now= (uint32_t)time(NULL)) > lasttime+6 ) { n = 0; DL_FOREACH_SAFE(LP_cJSONlist,ptr,tmp) { - /*if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) + if ( ptr->item != 0 && ptr->item->child != 0 && ptr->cjsonid != 0 ) { if ( (tmpstr= jprint(ptr->item,0)) != 0 ) { total += strlen(tmpstr); free(tmpstr); } - }*/ + } n++; } printf("total %d cJSON pending\n",n); From 3ef3f0603e5519e6f4c9e393270f272cf81f72c7 Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Wed, 15 Nov 2017 18:45:53 +0400 Subject: [PATCH 36/45] added batch script to automate Windows builds (both 32/64-bit) script can be used to automate Windows builds of marketmaker using MSVC 2015 without jenkins. just follow to repo directory and launch marketmaker_build_32_64.cmd . It will generate 32-bit and 64-bit executables in Release and x64/Release directories. Also it has example how to add executables into archive. You can add any custom automate actions, for example, put archive with release on FTP, or syncing it somewhere with rsync, or any other. --- marketmaker_build_32_64.cmd | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 marketmaker_build_32_64.cmd diff --git a/marketmaker_build_32_64.cmd b/marketmaker_build_32_64.cmd new file mode 100644 index 000000000..bac8df5e0 --- /dev/null +++ b/marketmaker_build_32_64.cmd @@ -0,0 +1,47 @@ +@echo off + +@REM Check for Visual Studio +call set "VSPATH=" +if defined VS140COMNTOOLS ( if not defined VSPATH ( + call set "VSPATH=%%VS140COMNTOOLS%%" +) ) + +@REM check if we already have the tools in the environment +if exist "%VCINSTALLDIR%" ( + goto compile +) + +if not defined VSPATH ( + echo You need Microsoft Visual Studio 15 installed + pause + exit +) + +@REM set up the environment +if exist "%VSPATH%..\..\vc\vcvarsall.bat" ( + call "%%VSPATH%%..\..\vc\vcvarsall.bat" amd64 + goto compile +) + +echo Unable to set up the environment +pause +exit + +:compile +rem MSBuild /help +MSBuild marketmaker.sln /t:Rebuild /p:Configuration=Release /p:Platform=x64 +MSBuild marketmaker.sln /t:Rebuild /p:Configuration=Release /p:Platform=x86 + +rem Using to add in marketmaker_release.7z +set host=%COMPUTERNAME% +IF "%host%"=="VM-81" ( + mkdir package_content\win32 + mkdir package_content\win64 + copy /y Release\marketmaker.exe package_content\win32 + copy /y x64\Release\marketmaker.exe package_content\win64 + cd package_content + "C:\Program Files\7-Zip\7z.exe" a C:\komodo\marketmaker_release\marketmaker_release.7z win32\marketmaker.exe + "C:\Program Files\7-Zip\7z.exe" a C:\komodo\marketmaker_release\marketmaker_release.7z win64\marketmaker.exe + cd .. + rd package_content /s /q + ) From 86e95d081609a713cd77fd95f73e3c051e879522 Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Wed, 15 Nov 2017 19:33:33 +0400 Subject: [PATCH 37/45] added new examples of dexscripts for windows and updated it's description --- iguana/dexscripts.win32/bot_buy.cmd | 7 ++++ iguana/dexscripts.win32/bot_list.cmd | 7 ++++ iguana/dexscripts.win32/bot_statuslist.cmd | 7 ++++ iguana/dexscripts.win32/bot_stop.cmd | 7 ++++ iguana/dexscripts.win32/electrum.cmd | 9 +++++ iguana/dexscripts.win32/help.cmd | 2 ++ iguana/dexscripts.win32/how_to_use.md | 33 +++++++++++++++++++ .../dexscripts.win32/sendrawtransaction.cmd | 5 +++ iguana/dexscripts.win32/withdraw.cmd | 8 +++++ iguana/dexscripts.win32/withdraw_10_send.cmd | 14 ++++++++ iguana/dexscripts.win32/withdraw_send.cmd | 14 ++++++++ 11 files changed, 113 insertions(+) create mode 100644 iguana/dexscripts.win32/bot_buy.cmd create mode 100644 iguana/dexscripts.win32/bot_list.cmd create mode 100644 iguana/dexscripts.win32/bot_statuslist.cmd create mode 100644 iguana/dexscripts.win32/bot_stop.cmd create mode 100644 iguana/dexscripts.win32/electrum.cmd create mode 100644 iguana/dexscripts.win32/help.cmd create mode 100644 iguana/dexscripts.win32/sendrawtransaction.cmd create mode 100644 iguana/dexscripts.win32/withdraw.cmd create mode 100644 iguana/dexscripts.win32/withdraw_10_send.cmd create mode 100644 iguana/dexscripts.win32/withdraw_send.cmd diff --git a/iguana/dexscripts.win32/bot_buy.cmd b/iguana/dexscripts.win32/bot_buy.cmd new file mode 100644 index 000000000..641ef1d7b --- /dev/null +++ b/iguana/dexscripts.win32/bot_buy.cmd @@ -0,0 +1,7 @@ +@echo off +set /p TMPUSERPASS= UTXO PAIRS to understand the basics. This script is just for example how you can split your coins in (X, X/777) to start trading them. + ## F.A.Q. ## **Q.** Is any simple way how i can display JSON results returned by all scripts, like orderbook and others, in human readable form? + **A.** Yes, you can use this service [JSON Editor Online](http://jsoneditoronline.org/), just copy and paste output of script in left column and see structured output in right. **Q.** I see an output like this when i'm start `1-client.cmd` : @@ -43,6 +75,7 @@ And nothing works. **A.** Before run `1-client.cmd` make sure in Task Manager that you haven't already running `marketmaker.exe`. If have - kill this process via Task Manager or via command line command `taskkill /f /im taskkill.exe` . **Q.** How can i pretty print JSON answers of marketmaker? + **A.** You can get best results with 2 tools - [conemu](https://conemu.github.io/) and [jq](https://stedolan.github.io/jq/), conemu supports ANSI X3.64 and Xterm 256 colors and jq allow you to pretty-print json output with colors, like this: ![](./images/conemu_jq.png) diff --git a/iguana/dexscripts.win32/sendrawtransaction.cmd b/iguana/dexscripts.win32/sendrawtransaction.cmd new file mode 100644 index 000000000..a19d77355 --- /dev/null +++ b/iguana/dexscripts.win32/sendrawtransaction.cmd @@ -0,0 +1,5 @@ +@echo off +set /p TMPUSERPASS= withdraw.txt +type withdraw.txt diff --git a/iguana/dexscripts.win32/withdraw_10_send.cmd b/iguana/dexscripts.win32/withdraw_10_send.cmd new file mode 100644 index 000000000..44a947787 --- /dev/null +++ b/iguana/dexscripts.win32/withdraw_10_send.cmd @@ -0,0 +1,14 @@ +@echo off +set /p TMPUSERPASS= withdraw.txt +type withdraw.txt +timeout /t 5 /nobreak +for /f "tokens=4 delims=:," %%a in (' find "hex" "withdraw.txt" ') do ( +rem echo [%%~a] +curl -s --url "http://127.0.0.1:7783" --data "{\"userpass\":\"%USERPASS%\",\"method\":\"sendrawtransaction\",\"coin\":\"%COIN%\",\"signedtx\":\"%%~a\"}" +) diff --git a/iguana/dexscripts.win32/withdraw_send.cmd b/iguana/dexscripts.win32/withdraw_send.cmd new file mode 100644 index 000000000..a26b9bf56 --- /dev/null +++ b/iguana/dexscripts.win32/withdraw_send.cmd @@ -0,0 +1,14 @@ +@echo off +set /p TMPUSERPASS= withdraw.txt +type withdraw.txt +timeout /t 5 /nobreak +for /f "tokens=4 delims=:," %%a in (' find "hex" "withdraw.txt" ') do ( +rem echo [%%~a] +curl -s --url "http://127.0.0.1:7783" --data "{\"userpass\":\"%USERPASS%\",\"method\":\"sendrawtransaction\",\"coin\":\"%COIN%\",\"signedtx\":\"%%~a\"}" +) + From 39d2c7a879c5cdfd281322b45ecf14b82730b60c Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Wed, 15 Nov 2017 19:56:36 +0400 Subject: [PATCH 38/45] append faq (q/a: required dlls) --- iguana/dexscripts.win32/how_to_use.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/iguana/dexscripts.win32/how_to_use.md b/iguana/dexscripts.win32/how_to_use.md index e04c14ac1..27b8af5be 100644 --- a/iguana/dexscripts.win32/how_to_use.md +++ b/iguana/dexscripts.win32/how_to_use.md @@ -80,4 +80,21 @@ And nothing works. ![](./images/conemu_jq.png) -Also i'm always recommend to install [Far Manager](https://www.farmanager.com/index.php?l=en) - this is powerful console file manager for Windows, like Midnight Commander in *nix. \ No newline at end of file +Also i'm always recommend to install [Far Manager](https://www.farmanager.com/index.php?l=en) - this is powerful console file manager for Windows, like Midnight Commander in *nix. + +**Q.** What additional dependencies required by marketmaker? + +**A.** Currently marketmaker (Windows) used the following DLLs: + +*32 bit:* +- libcrypto-1_1.dll +- libcurl.dll +- libssl-1_1.dll +- nanomsg.dll +- pthreadvc2.dll + +*64-bit:* +- libcurl.dll +- nanomsg.dll + +It already included in repo and in archive with release. \ No newline at end of file From 496a89c6aa32867a7f232aa49df69d26e932927a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 18:30:29 +0200 Subject: [PATCH 39/45] Test --- iguana/exchanges/LP_nativeDEX.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c7ba59d0b..6f90ed93c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -17,7 +17,6 @@ // LP_nativeDEX.c // marketmaker // -// gc cJSON // more retries for swap sendrawtransaction? // pbca26 unfinished swaps // if ( G.LP_pendingswaps != 0 ) return(-1); @@ -327,7 +326,7 @@ char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock, int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int32_t sock,char *remoteaddr,int32_t maxdepth) { - int32_t recvlen=1,nonz = 0; cJSON *argjson; void *ptr; char methodstr[64],*retstr,*str; struct nn_pollfd pfd; + int32_t recvlen=1,nonz = 0; cJSON *argjson; void *ptr,*buf; char methodstr[64],*retstr,*str; struct nn_pollfd pfd; if ( sock >= 0 ) { while ( nonz < maxdepth && recvlen > 0 ) @@ -339,8 +338,11 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int if ( nn_poll(&pfd,1,1) != 1 ) break; ptr = 0; - if ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) + buf = malloc(1000000); + if ( (recvlen= nn_recv(sock,buf,1000000,0)) > 0 ) + //if ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) { + ptr = buf; methodstr[0] = 0; //printf("%s.(%s)\n",typestr,(char *)ptr); if ( 0 ) @@ -390,7 +392,10 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int } } if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + { + //nn_freemsg(ptr), ptr = 0; + free(buf); + } } } return(nonz); From 401f4d8a35f67ceeb4ca8a2b134ac1f158f75b84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 18:58:29 +0200 Subject: [PATCH 40/45] Require requestid/quoteid match --- iguana/exchanges/LP_swap.c | 15 ++++++++++++--- iguana/exchanges/mm.c | 5 +++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 7e31d21e8..f551b862b 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -187,6 +187,8 @@ uint32_t basilisk_requestid(struct basilisk_request *rp) int32_t LP_pubkeys_data(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t i,datalen = 0; + datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.requestid),&swap->I.req.requestid); + datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); data[datalen++] = swap->I.aliceconfirms; data[datalen++] = swap->I.bobconfirms; data[datalen++] = swap->I.alicemaxconfirms; @@ -201,9 +203,16 @@ int32_t LP_pubkeys_data(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) int32_t LP_pubkeys_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datalen) { - int32_t i,nonz=0,alicemaxconfirms,bobmaxconfirms,aliceconfirms,bobconfirms,len = 0; uint8_t other33[33]; - if ( datalen == sizeof(swap->otherdeck)+38 ) + uint32_t requestid,quoteid; int32_t i,nonz=0,alicemaxconfirms,bobmaxconfirms,aliceconfirms,bobconfirms,len = 0; uint8_t other33[33]; + if ( datalen == sizeof(swap->otherdeck)+38+sizeof(uint32_t)*2 ) { + datalen += iguana_rwnum(0,&data[len],sizeof(requestid),&requestid); + datalen += iguana_rwnum(0,&data[len],sizeof(quoteid),"eid); + if ( requestid != swap->I.req.requestid || quoteid != swap->I.req.quoteid ) + { + printf("SWAP requestid.%u quoteid.%u mismatch received r.%u q.%u\n",swap->I.req.requestid,swap->I.req.quoteid,requestid,quoteid); + return(-1); + } aliceconfirms = data[len++]; bobconfirms = data[len++]; alicemaxconfirms = data[len++]; @@ -243,7 +252,7 @@ int32_t LP_pubkeys_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datal len += iguana_rwnum(0,&data[len],sizeof(swap->otherdeck[i>>1][i&1]),&swap->otherdeck[i>>1][i&1]); return(0); } - printf("pubkeys verify size mismatch %d != %d\n",datalen,(int32_t)sizeof(swap->otherdeck)+36); + printf("pubkeys verify size mismatch %d != %d\n",datalen,(int32_t)sizeof(swap->otherdeck)+38+sizeof(uint32_t)*2); return(-1); } diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index e20b1dcb6..f906390b8 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -19,6 +19,11 @@ // Copyright © 2017 SuperNET. All rights reserved. // +/* +#define malloc(n) LP_alloc(n) +#define calloc(a,b) LP_alloc((uint64_t)(a) * (b)) +#define free(ptr) LP_free(ptr)*/ + void PNACL_message(char *arg,...) { From cb8cdd25980f5f3117d0c97494cf064711df1c5d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 19:11:05 +0200 Subject: [PATCH 41/45] Test --- iguana/exchanges/LP_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f551b862b..1b6a17ab3 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -206,8 +206,8 @@ int32_t LP_pubkeys_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datal uint32_t requestid,quoteid; int32_t i,nonz=0,alicemaxconfirms,bobmaxconfirms,aliceconfirms,bobconfirms,len = 0; uint8_t other33[33]; if ( datalen == sizeof(swap->otherdeck)+38+sizeof(uint32_t)*2 ) { - datalen += iguana_rwnum(0,&data[len],sizeof(requestid),&requestid); - datalen += iguana_rwnum(0,&data[len],sizeof(quoteid),"eid); + len += iguana_rwnum(0,&data[len],sizeof(requestid),&requestid); + len += iguana_rwnum(0,&data[len],sizeof(quoteid),"eid); if ( requestid != swap->I.req.requestid || quoteid != swap->I.req.quoteid ) { printf("SWAP requestid.%u quoteid.%u mismatch received r.%u q.%u\n",swap->I.req.requestid,swap->I.req.quoteid,requestid,quoteid); @@ -252,7 +252,7 @@ int32_t LP_pubkeys_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datal len += iguana_rwnum(0,&data[len],sizeof(swap->otherdeck[i>>1][i&1]),&swap->otherdeck[i>>1][i&1]); return(0); } - printf("pubkeys verify size mismatch %d != %d\n",datalen,(int32_t)sizeof(swap->otherdeck)+38+sizeof(uint32_t)*2); + printf("pubkeys verify size mismatch %d != %d\n",datalen,(int32_t)(sizeof(swap->otherdeck)+38+sizeof(uint32_t)*2)); return(-1); } From a3d3b00649f363abf262567b47eed4f00cee86f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 19:15:09 +0200 Subject: [PATCH 42/45] Test --- iguana/exchanges/LP_swap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 1b6a17ab3..616ee46f7 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -189,6 +189,7 @@ int32_t LP_pubkeys_data(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) int32_t i,datalen = 0; datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.requestid),&swap->I.req.requestid); datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); + printf("send >>>>>>>>> r.%u q.%u\n",swap->I.req.requestid,swap->I.req.quoteid); data[datalen++] = swap->I.aliceconfirms; data[datalen++] = swap->I.bobconfirms; data[datalen++] = swap->I.alicemaxconfirms; From 46bd310f62dd4b7ae47ac79ae0079f5602415c3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 19:19:53 +0200 Subject: [PATCH 43/45] Test --- iguana/exchanges/LP_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 616ee46f7..1002517b0 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -189,7 +189,6 @@ int32_t LP_pubkeys_data(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) int32_t i,datalen = 0; datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.requestid),&swap->I.req.requestid); datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); - printf("send >>>>>>>>> r.%u q.%u\n",swap->I.req.requestid,swap->I.req.quoteid); data[datalen++] = swap->I.aliceconfirms; data[datalen++] = swap->I.bobconfirms; data[datalen++] = swap->I.alicemaxconfirms; @@ -199,6 +198,7 @@ int32_t LP_pubkeys_data(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) data[datalen++] = swap->persistent_pubkey33[i]; for (i=0; ideck)/sizeof(swap->deck[0][0]); i++) datalen += iguana_rwnum(1,&data[datalen],sizeof(swap->deck[i>>1][i&1]),&swap->deck[i>>1][i&1]); + printf("send >>>>>>>>> r.%u q.%u datalen.%d\n",swap->I.req.requestid,swap->I.req.quoteid,datalen); return(datalen); } From 3a84ed7eb6ee140ebbab59cb3e0deec871fa1c43 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Nov 2017 19:39:16 +0200 Subject: [PATCH 44/45] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_ordermatch.c | 11 ++++++++++ iguana/exchanges/LP_remember.c | 37 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 5e530f9c1..b1a78c694 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,7 +23,7 @@ #define LP_MAJOR_VERSION "0" #define LP_MINOR_VERSION "1" -#define LP_BUILD_NUMBER "14414" +#define LP_BUILD_NUMBER "14498" #ifdef FROM_JS #include diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0ab6faca0..7d60f336d 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -449,6 +449,11 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,cJSON *argjson,char *base,c if ( bits256_nonz(privkey) != 0 && bits256_cmp(G.LP_mypub25519,qp->srchash) == 0 ) { LP_requestinit(&qp->R,qp->srchash,qp->desthash,base,qp->satoshis-qp->txfee,rel,qp->destsatoshis-qp->desttxfee,qp->timestamp,qp->quotetime,DEXselector); + if ( LP_pendingswap(qp->R.requestid,qp->R.quoteid) > 0 ) + { + printf("requestid.%u quoteid.%u is already in progres\n",qp->R.requestid,qp->R.quoteid); + return(-1); + } if ( (swap= LP_swapinit(1,0,privkey,&qp->R,qp)) == 0 ) { printf("cant initialize swap\n"); @@ -611,6 +616,12 @@ char *LP_connectedalice(cJSON *argjson) // alice { retjson = cJSON_CreateObject(); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis-Q.txfee,Q.destcoin,Q.destsatoshis-Q.desttxfee,Q.timestamp,Q.quotetime,DEXselector); + if ( LP_pendingswap(Q.R.requestid,Q.R.quoteid) > 0 ) + { + printf("requestid.%u quoteid.%u is already in progres\n",Q.R.requestid,Q.R.quoteid); + jaddstr(retjson,"error","swap already in progress"); + return(jprint(retjson,1)); + } if ( (swap= LP_swapinit(0,0,Q.privkey,&Q.R,&Q)) == 0 ) { jaddstr(retjson,"error","couldnt swapinit"); diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index d8b264e7c..c0ef0efd7 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -1441,3 +1441,40 @@ char *basilisk_swapentries(char *refbase,char *refrel,int32_t limit) return(jprint(retarray,1)); } +int32_t LP_pendingswap(uint32_t requestid,uint32_t quoteid) +{ + cJSON *retjson,*array,*pending,*item; uint32_t r,q; char *retstr; int32_t i,n,retval = 0; + if ( (retstr= LP_recent_swaps(1000)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (array= jarray(&n,retjson,"swaps")) != 0 ) + { + for (i=0; i Date: Wed, 15 Nov 2017 19:43:04 +0200 Subject: [PATCH 45/45] Test --- iguana/exchanges/LP_include.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b1a78c694..b6c24be52 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,7 +23,7 @@ #define LP_MAJOR_VERSION "0" #define LP_MINOR_VERSION "1" -#define LP_BUILD_NUMBER "14498" +#define LP_BUILD_NUMBER "15000" #ifdef FROM_JS #include