From cc0acad6af3d53a23099aa304362536b92537e51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 23 Oct 2017 23:53:21 +0300 Subject: [PATCH 001/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index c7046072d..b90e14048 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,7 +522,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - //printf("LISTUNSPENT.(%s)\n",jprint(retjson,0)); + printf("LISTUNSPENT.(%s)\n",jprint(retjson,0)); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From 55ae020df812781fb14c39c1af08362c3d4a3452 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:08:39 +0300 Subject: [PATCH 002/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index b90e14048..9927ceca2 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,7 +522,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("LISTUNSPENT.(%s)\n",jprint(retjson,0)); + printf("%s -> %s LISTUNSPENT.(%s)\n",coin->lastunspent,addr,jprint(retjson,0)); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From 0d825e6ec552c0ab2218aebfc995b6d71c0684e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:12:33 +0300 Subject: [PATCH 003/176] test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 9927ceca2..5396442b1 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,7 +522,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s -> %s LISTUNSPENT.(%s)\n",coin->lastunspent,addr,jprint(retjson,0)); + printf("%s lag.%ld %s -> %s LISTUNSPENT.(%s)\n",coin->symbol,time(NULL) -( coin->unspenttime+30),coin->lastunspent,addr,jprint(retjson,0)); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From 0acab1f183c224c23b8163b9a3dde4a6b56d789e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:16:47 +0300 Subject: [PATCH 004/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 5396442b1..a7c3a81f2 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,7 +522,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s lag.%ld %s -> %s LISTUNSPENT.(%s)\n",coin->symbol,time(NULL) -( coin->unspenttime+30),coin->lastunspent,addr,jprint(retjson,0)); + printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%s)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,jprint(retjson,0)); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From 580069c98cf55b1e748756f4f493c5c111e886aa Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:22:59 +0300 Subject: [PATCH 005/176] Test --- iguana/exchanges/LP_socket.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index a7c3a81f2..195bb79b9 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,11 +522,12 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%s)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,jprint(retjson,0)); + printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); coin->unspenttime = (uint32_t)time(NULL); + printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); } } else retjson = LP_address_utxos(coin,addr,1); return(retjson); From e545bf3c24c1ea261c12896989f62a0b451314d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:25:31 +0300 Subject: [PATCH 006/176] Test --- iguana/exchanges/LP_socket.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 195bb79b9..0f652a105 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,12 +522,11 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); + printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); coin->unspenttime = (uint32_t)time(NULL); - printf("%s u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); } } else retjson = LP_address_utxos(coin,addr,1); return(retjson); From 3a4edcaeafbcd8eddab47adaa106c0ac268ef4de Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:28:21 +0300 Subject: [PATCH 007/176] Test --- iguana/exchanges/LP_socket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 0f652a105..16910cd3f 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -518,7 +518,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { cJSON *retjson=0; struct iguana_info *coin = LP_coinfind(symbol); //printf("electrum.%s/%s listunspent last.(%s lag %d)\n",ep->symbol,coin->symbol,coin->lastunspent,(int32_t)(time(NULL) - coin->unspenttime)); - if ( strcmp(coin->lastunspent,addr) != 0 || time(NULL) > coin->unspenttime+30 ) + if ( coin != 0 && (strcmp(coin->lastunspent,addr) != 0 || time(NULL) > coin->unspenttime+30) ) { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { @@ -526,7 +526,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); - coin->unspenttime = (uint32_t)time(NULL); + //coin->unspenttime = (uint32_t)time(NULL); } } else retjson = LP_address_utxos(coin,addr,1); return(retjson); From 6052f5f1bee6558725feb744e983502e5d5deccc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:30:18 +0300 Subject: [PATCH 008/176] Test --- iguana/exchanges/LP_socket.c | 2 +- iguana/exchanges/LP_utxos.c | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 16910cd3f..1d869244f 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -526,7 +526,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); - //coin->unspenttime = (uint32_t)time(NULL); + coin->unspenttime = (uint32_t)time(NULL); } } else retjson = LP_address_utxos(coin,addr,1); return(retjson); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 54b5aec3a..6c0f07440 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -453,10 +453,7 @@ cJSON *LP_inventory(char *symbol) myipaddr = LP_mypeer->ipaddr; else myipaddr = "127.0.0.1"; if ( (coin= LP_coinfind(symbol)) != 0 ) - { - coin->unspenttime = (uint32_t)time(NULL) - 777; LP_listunspent_both(symbol,coin->smartaddr,0); - } HASH_ITER(hh,G.LP_utxoinfos[iambob],utxo,tmp) { char str[65]; From 972be976c764b5ea8501d7c24baa459083777911 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 00:31:07 +0300 Subject: [PATCH 009/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 1d869244f..0116b7091 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -522,7 +522,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); + //printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From 91004439c840fe729a9f048d1fdfe3c4be656ac4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 11:57:13 +0300 Subject: [PATCH 010/176] Test --- iguana/exchanges/LP_nativeDEX.c | 1 + iguana/exchanges/LP_socket.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index bc9f16777..3e00a58d4 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,6 +18,7 @@ // LP_nativeDEX.c // marketmaker // +// electrum swaps efficiency // process stats.log local file -> map of realtime activity! // select oldest utxo first // handles <-> pubkeys, deal with offline pubkeys, reputations, bonds etc. diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 0116b7091..a71a21b99 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -373,6 +373,7 @@ cJSON *electrum_submit(char *symbol,struct electrum_info *ep,cJSON **retjsonp,ch { *retjsonp = 0; sprintf(stratumreq,"{ \"jsonrpc\":\"2.0\", \"id\": %u, \"method\":\"%s\", \"params\": %s }\n",ep->stratumid,method,params); +printf("%s\n",stratumreq); memset(ep->buf,0,ep->bufsize); sitem = (struct stritem *)queueitem(stratumreq); sitem->expiration = timeout; @@ -522,7 +523,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - //printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); + printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); From b851ae545784a255d339d9d77a200f2882a01e40 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 12:30:25 +0300 Subject: [PATCH 011/176] Test --- iguana/exchanges/LP_include.h | 8 +++++--- iguana/exchanges/LP_ordermatch.c | 6 ------ iguana/exchanges/LP_socket.c | 29 +++++++++++++++++++++++------ iguana/exchanges/LP_swap.c | 3 +++ 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 5ec7f2350..f66db99ff 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -185,9 +185,9 @@ struct iguana_info portable_mutex_t txmutex,addrmutex; struct LP_transaction *transactions; struct LP_address *addresses; uint64_t txfee; int32_t longestchain,firstrefht,firstscanht,lastscanht,bussock,height; uint16_t busport; - uint32_t lastutxosync,addr_listunspent_requested,lastutxos,updaterate,counter,inactive,lastmempool,lastgetinfo,ratetime,heighttime,lastmonitor,unspenttime,obooktime; + uint32_t lastutxosync,addr_listunspent_requested,lastutxos,updaterate,counter,inactive,lastmempool,lastgetinfo,ratetime,heighttime,lastmonitor,obooktime; uint8_t pubtype,p2shtype,isPoS,wiftype,wiftaddr,taddr,noimportprivkey_flag,userconfirms,isassetchain,maxconfirms; - char symbol[16],smartaddr[64],userpass[1024],serverport[128],lastunspent[64]; + char symbol[16],smartaddr[64],userpass[1024],serverport[128]; // portfolio double price_kmd,force,perc,goal,goalperc,relvolume,rate; void *electrum; void *ctx; @@ -231,7 +231,8 @@ struct LP_address struct LP_address_utxo *utxos; bits256 pubkey; int64_t balance,total; - uint32_t timestamp,n; + uint32_t timestamp,n,unspenttime; + int32_t unspentheight; char coinaddr[40]; uint8_t pubsecp[33],pad; }; @@ -287,6 +288,7 @@ struct LP_pubkeyinfo int32_t LP_pubkey_sigcheck(struct LP_pubkeyinfo *pubp,cJSON *item); int32_t LP_pubkey_sigadd(cJSON *item,uint32_t timestamp,bits256 priv,bits256 pub,uint8_t *rmd160,uint8_t *pubsecp); +struct LP_address *LP_address(struct iguana_info *coin,char *coinaddr); void LP_swap_coinaddr(struct iguana_info *coin,char *coinaddr,uint64_t *valuep,uint8_t *data,int32_t datalen,int32_t vout); void basilisk_dontforget_update(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx); uint32_t basilisk_requestid(struct basilisk_request *rp); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0aad4f785..93b8f7e75 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -485,7 +485,6 @@ char *LP_connectedalice(cJSON *argjson) // alice if ( (qprice= LP_quote_validate(autxo,butxo,&Q,0)) <= SMALLVAL ) { LP_availableset(autxo); - //G.LP_pendingswaps--; printf("quote validate error %.0f\n",qprice); return(clonestr("{\"error\":\"quote validation error\"}")); } @@ -493,16 +492,12 @@ char *LP_connectedalice(cJSON *argjson) // alice { printf("this node has no price for %s/%s (%.8f %.8f)\n",Q.destcoin,Q.srccoin,bid,ask); LP_availableset(autxo); - //G.LP_pendingswaps--; return(clonestr("{\"error\":\"no price set\"}")); } printf("%s/%s bid %.8f ask %.8f values %.8f %.8f\n",Q.srccoin,Q.destcoin,bid,ask,dstr(butxo->payment.value),dstr(butxo->deposit.value)); price = bid; if ( (coin= LP_coinfind(Q.destcoin)) == 0 ) - { - //G.LP_pendingswaps--; return(clonestr("{\"error\":\"cant get alicecoin\"}")); - } Q.privkey = LP_privkey(Q.destaddr,coin->taddr); if ( bits256_nonz(Q.privkey) != 0 )//&& Q.quotetime >= Q.timestamp-3 ) { @@ -531,7 +526,6 @@ char *LP_connectedalice(cJSON *argjson) // alice printf("connected result.(%s)\n",jprint(retjson,0)); if ( jobj(retjson,"error") != 0 ) LP_availableset(autxo); - else G.LP_pendingswaps++; return(jprint(retjson,1)); } else diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index a71a21b99..c074718a2 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -373,7 +373,7 @@ cJSON *electrum_submit(char *symbol,struct electrum_info *ep,cJSON **retjsonp,ch { *retjsonp = 0; sprintf(stratumreq,"{ \"jsonrpc\":\"2.0\", \"id\": %u, \"method\":\"%s\", \"params\": %s }\n",ep->stratumid,method,params); -printf("%s\n",stratumreq); +printf("%s %s\n",symbol,stratumreq); memset(ep->buf,0,ep->bufsize); sitem = (struct stritem *)queueitem(stratumreq); sitem->expiration = timeout; @@ -517,17 +517,34 @@ cJSON *electrum_address_getmempool(char *symbol,struct electrum_info *ep,cJSON * cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON **retjsonp,char *addr,int32_t electrumflag) { - cJSON *retjson=0; struct iguana_info *coin = LP_coinfind(symbol); + cJSON *retjson=0; struct LP_address *ap; struct iguana_info *coin; int32_t height,usecache=1; + if ( (coin= LP_coinfind(symbol)) == 0 ) + return(0); + if ( ep->heightp == 0 ) + height = coin->longestchain; + else height = *(ep->heightp); + if ( (ap= LP_address(coin,addr)) != 0 ) + { + if ( ap->unspenttime == 0 ) + usecache = 0; + else if ( ap->unspentheight < height ) + usecache = 0; + else if ( G.LP_pendingswaps != 0 && time(NULL) > ap->unspenttime+20 ) + usecache = 0; + } //printf("electrum.%s/%s listunspent last.(%s lag %d)\n",ep->symbol,coin->symbol,coin->lastunspent,(int32_t)(time(NULL) - coin->unspenttime)); - if ( coin != 0 && (strcmp(coin->lastunspent,addr) != 0 || time(NULL) > coin->unspenttime+30) ) + if ( usecache == 0 ) { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s %p u.%u t.%ld %s -> %s LISTUNSPENT.(%ld)\n",coin->symbol,&coin->unspenttime,coin->unspenttime,time(NULL),coin->lastunspent,addr,strlen(jprint(retjson,0))); + printf("%s u.%u t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,ap->unspenttime,time(NULL),addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); - safecopy(coin->lastunspent,addr,sizeof(coin->lastunspent)); - coin->unspenttime = (uint32_t)time(NULL); + if ( ap != 0 ) + { + ap->unspenttime = (uint32_t)time(NULL); + ap->unspentheight = height; + } } } else retjson = LP_address_utxos(coin,addr,1); return(retjson); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 9118b4b49..dfafa0499 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -746,6 +746,7 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t void LP_bobloop(void *_swap) { uint8_t *data; int32_t maxlen,m,n; uint32_t expiration; struct basilisk_swap *swap = _swap; + G.LP_pendingswaps++; fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -804,11 +805,13 @@ void LP_bobloop(void *_swap) basilisk_swap_finished(swap); //free(swap); } else printf("swap timed out\n"); + G.LP_pendingswaps--; } void LP_aliceloop(void *_swap) { uint8_t *data; int32_t maxlen,n,m; uint32_t expiration; struct basilisk_swap *swap = _swap; + G.LP_pendingswaps++; maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; From e6c3ea9022a6c8313b57894f11da323426bb1ebd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 12:33:06 +0300 Subject: [PATCH 012/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3e00a58d4..f683c22cb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -634,7 +634,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int LP_smartutxos_push(coin); coin->addr_listunspent_requested = 0; } - if ( time(NULL) > coin->lastgetinfo+LP_GETINFO_INCR ) + if ( coin->inactive == 0 && time(NULL) > coin->lastgetinfo+LP_GETINFO_INCR ) { nonz++; if ( (height= LP_getheight(coin)) > coin->longestchain ) From 2647c9cf3c93b7be40e6e89fbbe86a77daae068f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 12:36:52 +0300 Subject: [PATCH 013/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index c074718a2..6920826b4 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -537,7 +537,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s u.%u t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,ap->unspenttime,time(NULL),addr,strlen(jprint(retjson,0))); + printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); if ( ap != 0 ) From c014782566d0e4e7928b5afe2e08cba4b3f14161 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 12:55:08 +0300 Subject: [PATCH 014/176] Test --- iguana/exchanges/LP_signatures.c | 2 +- iguana/exchanges/LP_utxo.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 880d5e9ba..05e2b99ee 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -263,7 +263,7 @@ int32_t LP_utxos_sigcheck(uint32_t timestamp,char *sigstr,char *pubsecpstr,bits2 { static uint32_t counter; if ( counter++ < 100 ) - printf("LP_utxos_sigcheck failure, probably from %s with older version\n",bits256_str(str,pubkey)); + printf("LP_utxos_sigcheck failure, probably from %s with older version\n",bits256_str(str,pubkey)); retval = -1; } else retval = 0; } diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 999c9ec4e..027544a6d 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -242,7 +242,7 @@ int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid, DL_APPEND(ap->utxos,up); portable_mutex_unlock(&coin->addrmutex); retval = 1; - if ( 0 && height > 0 && strcmp("REVS",coin->symbol) == 0 ) + //if ( 0 && height > 0 && strcmp("REVS",coin->symbol) == 0 ) printf("ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); From cf29e3735021223633abb7756f35c996c021aaff Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 14:08:48 +0300 Subject: [PATCH 015/176] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 42 ++++++++++++++++++--- iguana/exchanges/LP_ordermatch.c | 65 +++++++++++++++++--------------- iguana/exchanges/LP_utxo.c | 30 ++------------- 4 files changed, 77 insertions(+), 62 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index f66db99ff..7849e40d9 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -44,7 +44,7 @@ #define LP_PEERGOOD_ERRORDECAY 0.9 #define LP_SWAPSTEP_TIMEOUT 30 -#define LP_AUTOTRADE_TIMEOUT 15 +#define LP_AUTOTRADE_TIMEOUT 10 #define LP_MIN_TXFEE 10000 #define LP_MINVOL 20 #define LP_MINCLIENTVOL 50 diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f683c22cb..a03d9f858 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,6 +18,10 @@ // LP_nativeDEX.c // marketmaker // +// variable timeout based on number of electrums in swap +// listunspent on each new block or 30 seconds if doing swap +// reject swap response from bob? +// // electrum swaps efficiency // process stats.log local file -> map of realtime activity! // select oldest utxo first @@ -397,7 +401,7 @@ int32_t LP_utxos_sync(struct LP_peerinfo *peer) return(0); HASH_ITER(hh,LP_coins,coin,ctmp) { - if ( IAMLP == 0 && coin->inactive != 0 )//|| (coin->electrum != 0 && coin->obooktime == 0) ) + if ( IAMLP == 0 && coin->inactive != 0 ) continue; if ( coin->smartaddr[0] == 0 ) continue; @@ -512,7 +516,7 @@ int32_t LP_utxos_sync(struct LP_peerinfo *peer) void LP_coinsloop(void *_coins) { - struct iguana_info *coin,*ctmp; bits256 zero; int32_t j,nonz; char *coins = _coins; + struct LP_address *ap=0,*atmp; struct LP_address_utxo *up,*tmp; struct iguana_info *coin,*ctmp; char str[65]; struct electrum_info *ep,*backupep=0; bits256 zero; int32_t oldht,j,nonz; char *coins = _coins; while ( 1 ) { nonz = 0; @@ -531,8 +535,37 @@ void LP_coinsloop(void *_coins) memset(&zero,0,sizeof(zero)); if ( coin->inactive != 0 ) continue; - if ( coin->electrum != 0 ) + if ( (ep= coin->electrum) != 0 ) + { + if ( (backupep= ep->prev) == 0 ) + backupep = ep; + HASH_ITER(hh,coin->addresses,ap,atmp) + { + DL_FOREACH_SAFE(ap->utxos,up,tmp) + { + if ( up->SPV == 0 ) + { + nonz++; + up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); + if ( up->SPV > 0 ) + printf("%s %s: SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); + } + else if ( up->SPV == -1 ) + { + nonz++; + printf("SPV failure for %s %s\n",coin->symbol,bits256_str(str,up->U.txid)); + oldht = up->U.height; + LP_txheight_check(coin,ap->coinaddr,up); + if ( oldht != up->U.height ) + up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); + if ( up->SPV <= 0 ) + up->SPV = -2; + else printf("%s %s: corrected SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); + } + } + } continue; + } if ( coin->firstrefht == 0 ) continue; else if ( coin->firstscanht == 0 ) @@ -557,6 +590,7 @@ void LP_coinsloop(void *_coins) coin->lastscanht = coin->firstscanht; continue; } + nonz++; //if ( (coin->lastscanht % 1000) == 0 ) printf("[%s]: %s ref.%d scan.%d to %d, longest.%d\n",coins,coin->symbol,coin->firstrefht,coin->firstscanht,coin->lastscanht,coin->longestchain); for (j=0; j<100; j++) @@ -570,8 +604,6 @@ void LP_coinsloop(void *_coins) if ( coin->lastscanht == coin->longestchain+1 ) break; } - nonz++; - continue; } if ( nonz == 0 ) usleep(1000); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 93b8f7e75..9899bf9bc 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -200,7 +200,7 @@ int32_t LP_nanobind(void *ctx,char *pairstr) int32_t LP_nearest_utxovalue(struct iguana_info *coin,char *coinaddr,struct LP_address_utxo **utxos,int32_t n,uint64_t targetval) { - int32_t i,oldht,mini = -1; struct LP_address_utxo *up; struct electrum_info *backupep=0,*ep; char str[65]; int64_t dist; uint64_t mindist = (1LL << 60); + int32_t i,mini = -1; struct LP_address_utxo *up; struct electrum_info *backupep=0,*ep; int64_t dist; uint64_t mindist = (1LL << 60); if ( (ep= coin->electrum) != 0 ) { if ( (backupep= ep->prev) == 0 ) @@ -215,25 +215,6 @@ int32_t LP_nearest_utxovalue(struct iguana_info *coin,char *coinaddr,struct LP_a //printf("nearest i.%d target %.8f val %.8f dist %.8f mindist %.8f mini.%d spent.%d\n",i,dstr(targetval),dstr(up->U.value),dstr(dist),dstr(mindist),mini,up->spendheight); if ( up->spendheight <= 0 ) { - if ( coin->electrum != 0 ) - { - if ( up->SPV == 0 || up->SPV == -1 ) - up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); - if ( up->SPV == 0 || up->SPV == -1 ) - { - printf("SPV failure for %s %s\n",coin->symbol,bits256_str(str,up->U.txid)); - if ( up->SPV == -1 ) - { - oldht = up->U.height; - LP_txheight_check(coin,coinaddr,up); - if ( oldht != up->U.height ) - up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); - if ( up->SPV < 0 ) - up->SPV = -2; - } - continue; - } //else printf("%s %s: SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); - } if ( (coin->electrum == 0 || up->SPV > 0) && dist >= 0 && dist < mindist ) { //printf("(%.8f %.8f %.8f).%d ",dstr(up->U.value),dstr(dist),dstr(mindist),mini); @@ -800,20 +781,30 @@ struct LP_utxoinfo *LP_buyutxo(double *ordermatchpricep,int64_t *bestsatoshisp,i if ( bits256_cmp(pubkey,G.LP_mypub25519) != 0 && (pubp= LP_pubkeyadd(pubkey)) != 0 ) { bitcoin_address(coinaddr,basecoin->taddr,basecoin->pubtype,pubp->rmd160,sizeof(pubp->rmd160)); - LP_listunspent_query(base,coinaddr); - LP_listunspent_both(base,coinaddr,1); asatoshis = autxo->S.satoshis; - for (j=0; jelectrum != 0 ) + { + price *= 1.01; + *ordermatchpricep = price; + *bestsatoshisp = LP_basesatoshis(dstr(asatoshis),price,txfee,desttxfee); + *bestdestsatoshisp = asatoshis; + } + else*/ { - if ( (bestutxo= LP_ordermatch_iter(utxos,max,ordermatchpricep,bestsatoshisp,bestdestsatoshisp,basecoin,coinaddr,asatoshis,price,txfee,desttxfee,pubp->pubkey,gui)) != 0 ) + LP_listunspent_query(base,coinaddr); + LP_listunspent_both(base,coinaddr,1); + for (j=0; jpubkey,gui)) != 0 ) + { + printf("j.%d/%d ordermatch %.8f best satoshis %.8f destsatoshis %.8f txfees (%.8f %.8f)\n",j,maxiters,price,dstr(*bestsatoshisp),dstr(*bestdestsatoshisp),dstr(txfee),dstr(desttxfee)); + break; + } + asatoshis = (asatoshis / 64) * 63; } - asatoshis = (asatoshis / 64) * 63; + if ( j < maxiters ) + break; } - if ( j < maxiters ) - break; } else printf("self trading or blacklisted peer\n"); } else @@ -838,7 +829,11 @@ struct LP_utxoinfo *LP_buyutxo(double *ordermatchpricep,int64_t *bestsatoshisp,i char *LP_autobuy(void *ctx,char *myipaddr,int32_t mypubsock,char *base,char *rel,double maxprice,double relvolume,int32_t timeout,int32_t duration,char *gui,uint32_t nonce) { - uint64_t desttxfee,txfee; uint32_t lastnonce; int32_t i,maxiters,numpubs = 0; int64_t bestsatoshis=0,destsatoshis,bestdestsatoshis=0; struct LP_utxoinfo *autxo,*bestutxo = 0; double qprice,ordermatchprice=0.; struct LP_quoteinfo Q; bits256 pubkeys[100]; + uint64_t desttxfee,txfee; uint32_t lastnonce; int32_t i,maxiters,numpubs = 0; int64_t bestsatoshis=0,destsatoshis,bestdestsatoshis=0; struct iguana_info *basecoin,*relcoin; struct LP_utxoinfo *autxo,*bestutxo = 0; double qprice,ordermatchprice=0.; struct LP_quoteinfo Q; bits256 pubkeys[100]; + basecoin = LP_coinfind(base); + relcoin = LP_coinfind(rel); + if ( basecoin == 0 || basecoin->inactive != 0 || relcoin == 0 || relcoin->inactive != 0 ) + return(clonestr("{\"error\":\"base or rel not found or inactive\"}")); if ( LP_aliceonly(base) > 0 ) return(clonestr("{\"error\":\"GAME can only be alice coin\"}")); printf("LP_autobuy %s/%s price %.8f vol %.8f nonce %u\n",base,rel,maxprice,relvolume,nonce); @@ -852,6 +847,16 @@ char *LP_autobuy(void *ctx,char *myipaddr,int32_t mypubsock,char *base,char *rel duration = LP_ORDERBOOK_DURATION; if ( timeout <= 0 ) timeout = LP_AUTOTRADE_TIMEOUT; + if ( basecoin->electrum != 0 && relcoin->electrum != 0 ) + { + if ( timeout < 3*LP_AUTOTRADE_TIMEOUT ) + timeout = 3*LP_AUTOTRADE_TIMEOUT; + } + else if ( basecoin->electrum != 0 || relcoin->electrum != 0 ) + { + if ( timeout < 2*LP_AUTOTRADE_TIMEOUT ) + timeout = 2*LP_AUTOTRADE_TIMEOUT; + } if ( time(NULL) < Alice_expiration ) return(clonestr("{\"error\":\"only one pending request at a time\"}")); else diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 027544a6d..998d12ce1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -18,19 +18,6 @@ // marketmaker // -// listunspent: valid for local node, mostly valid for electrum - -// full node + electrum for external listunspent, gettxout to validate -// pruned node + electrum for external listunspent, gettxout to validate -// full node, network for external listunspent, gettxout to validate -// pruned node, network for external listunspent, gettxout to validate -// electrum only, network for gettxout - -// handle spurious errors -// handle invalid data - -//REJECT KMD ccee27b53b52ca61bbc9fdc7de5feb0a12c14d4d92639414d372f002cc3d092f/v0 value.468169379 vs 468169380 ({"bestblock":"080400d4216c02d100004fd2f4f3505ddb507b643785e02703d3412feba39fb1","confirmations":2356,"value":4.68169380,"scriptPubKey":{"asm":"0224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842 OP_CHECKSIG","hex":"210224e31f93eff0cc30eaf0b2389fbc591085c0e122c4d11862c1729d090106c842ac","reqSigs":1,"type":"pubkey","addresses":["RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o"]},"version":1,"coinbase":true}) - uint64_t LP_value_extract(cJSON *obj,int32_t addinterest) { double val = 0.; uint64_t value = 0; int32_t electrumflag; @@ -208,12 +195,8 @@ int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid, if ( vout == up->U.vout && bits256_cmp(up->U.txid,txid) == 0 ) { flag = 1; - if ( height > 0 && up->U.height != height && up->SPV <= 0 ) - { - if ( up->U.height > 0 ) - printf("%s SPV.%d update %s/v%d up->U.height %d <- %d\n",coin->symbol,up->SPV,bits256_str(str,up->U.txid),up->U.vout,up->U.height,height); + if ( height > 0 && up->U.height != height ) up->U.height = height, flag |= 2; - } if ( spendheight > 0 && up->spendheight != spendheight ) up->spendheight = spendheight, flag |= 4; if ( up->U.value == 0 && up->U.value != value ) @@ -240,9 +223,9 @@ int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid, up->spendheight = spendheight; portable_mutex_lock(&coin->addrmutex); DL_APPEND(ap->utxos,up); - portable_mutex_unlock(&coin->addrmutex); + portable_mutex_unlock(&coin->addrmutex); retval = 1; - //if ( 0 && height > 0 && strcmp("REVS",coin->symbol) == 0 ) + if ( 0 && height > 0 && strcmp("REVS",coin->symbol) == 0 ) printf("ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); @@ -354,15 +337,10 @@ int32_t LP_merkleproof(struct iguana_info *coin,struct electrum_info *ep,bits256 cJSON *LP_address_utxos(struct iguana_info *coin,char *coinaddr,int32_t electrumret) { - cJSON *array,*item; int32_t n; uint64_t total; struct LP_address *ap=0,*atmp; struct LP_address_utxo *up,*tmp; cJSON *txobj; struct electrum_info *ep,*backupep=0; + cJSON *array,*item; int32_t n; uint64_t total; struct LP_address *ap=0,*atmp; struct LP_address_utxo *up,*tmp; cJSON *txobj; array = cJSON_CreateArray(); if ( coinaddr != 0 && coinaddr[0] != 0 ) { - if ( (ep= coin->electrum) != 0 ) - { - if ( (backupep= ep->prev) == 0 ) - backupep = ep; - } //portable_mutex_lock(&coin->addrmutex); if ( (ap= _LP_addressfind(coin,coinaddr)) != 0 ) { From 01e7fccd1ecf0a77f8d1df0d20aa4bad213505a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:07:24 +0300 Subject: [PATCH 016/176] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_ordermatch.c | 44 ++++++++++++-- iguana/exchanges/LP_statemachine.c | 30 +++++++++ iguana/exchanges/LP_utxo.c | 97 ++++++++++++++++-------------- iguana/exchanges/LP_utxos.c | 36 ----------- 5 files changed, 122 insertions(+), 86 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 7849e40d9..d66187044 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -306,6 +306,7 @@ struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); uint64_t LP_value_extract(cJSON *obj,int32_t addinterest); int32_t LP_swap_getcoinaddr(char *symbol,char *coinaddr,bits256 txid,int32_t vout); char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen); +int64_t LP_komodo_interest(bits256 txid,int64_t value); void LP_availableset(struct LP_utxoinfo *utxo); int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2); int32_t LP_pullsock_check(void *ctx,char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 9899bf9bc..afbcfc5a4 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -77,7 +77,7 @@ int32_t LP_quote_checkmempool(struct LP_quoteinfo *qp,struct LP_utxoinfo *autxo, double LP_quote_validate(struct LP_utxoinfo *autxo,struct LP_utxoinfo *butxo,struct LP_quoteinfo *qp,int32_t iambob) { - double qprice=0.; uint64_t txfee,desttxfee,srcvalue=0,srcvalue2=0,destvalue=0,destvalue2=0; + double qprice=0.; char str[65]; cJSON *txout; uint64_t txfee,desttxfee,srcvalue=0,srcvalue2=0,destvalue=0,destvalue2=0; printf(">>>>>>> quote satoshis.(%.8f %.8f) %s %.8f -> %s %.8f\n",dstr(qp->satoshis),dstr(qp->destsatoshis),qp->srccoin,dstr(qp->satoshis),qp->destcoin,dstr(qp->destsatoshis)); if ( butxo != 0 ) { @@ -86,6 +86,20 @@ double LP_quote_validate(struct LP_utxoinfo *autxo,struct LP_utxoinfo *butxo,str printf("bob not eligible %s\n",jprint(LP_quotejson(qp),1)); return(-2); } + if ( (txout= LP_gettxout(qp->srccoin,qp->coinaddr,qp->txid,qp->vout)) != 0 ) + free_json(txout); + else + { + printf("%s %s payment %s/v%d is spent\n",qp->srccoin,qp->coinaddr,bits256_str(str,qp->txid),qp->vout); + return(-21); + } + if ( (txout= LP_gettxout(qp->srccoin,qp->coinaddr,qp->txid2,qp->vout2)) != 0 ) + free_json(txout); + else + { + printf("%s %s deposit %s/v%d is spent\n",qp->srccoin,qp->coinaddr,bits256_str(str,qp->txid2),qp->vout2); + return(-22); + } if ( bits256_cmp(butxo->deposit.txid,qp->txid2) != 0 || butxo->deposit.vout != qp->vout2 ) { char str[65],str2[65]; printf("%s != %s v%d != %d\n",bits256_str(str,butxo->deposit.txid),bits256_str(str2,qp->txid2),butxo->deposit.vout,qp->vout2); @@ -97,10 +111,27 @@ double LP_quote_validate(struct LP_utxoinfo *autxo,struct LP_utxoinfo *butxo,str return(-7); } } - if ( autxo != 0 && LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) + if ( autxo != 0 ) { - char str[65]; printf("alice not eligible (%.8f %.8f) %s/v%d\n",dstr(destvalue),dstr(destvalue2),bits256_str(str,qp->feetxid),qp->feevout); - return(-3); + if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) + { + char str[65]; printf("alice not eligible (%.8f %.8f) %s/v%d\n",dstr(destvalue),dstr(destvalue2),bits256_str(str,qp->feetxid),qp->feevout); + return(-3); + } + if ( (txout= LP_gettxout(qp->destcoin,qp->destaddr,qp->desttxid,qp->destvout)) != 0 ) + free_json(txout); + else + { + printf("%s %s Apayment %s/v%d is spent\n",qp->destcoin,qp->destaddr,bits256_str(str,qp->desttxid),qp->destvout); + return(-23); + } + if ( (txout= LP_gettxout(qp->destcoin,qp->destaddr,qp->feetxid,qp->feevout)) != 0 ) + free_json(txout); + else + { + printf("%s %s dexfee %s/v%d is spent\n",qp->destcoin,qp->destaddr,bits256_str(str,qp->feetxid),qp->feevout); + return(-24); + } } if ( LP_quote_checkmempool(qp,autxo,butxo) < 0 ) return(-4); @@ -746,7 +777,7 @@ struct LP_utxoinfo *LP_ordermatch_iter(struct LP_address_utxo **utxos,int32_t ma struct LP_utxoinfo *LP_buyutxo(double *ordermatchpricep,int64_t *bestsatoshisp,int64_t *bestdestsatoshisp,struct LP_utxoinfo *autxo,char *base,double maxprice,int32_t duration,uint64_t txfee,uint64_t desttxfee,char *gui,bits256 *avoids,int32_t numavoids) { - bits256 pubkey; char *obookstr,coinaddr[64]; cJSON *orderbook,*asks,*item; int32_t maxiters,i,j,numasks,max = 10000; struct LP_address_utxo **utxos; double price; struct LP_pubkeyinfo *pubp; uint64_t asatoshis; struct iguana_info *basecoin; struct LP_utxoinfo *bestutxo = 0; + bits256 pubkey; char *obookstr,coinaddr[64]; cJSON *orderbook,*asks,*item; int32_t maxiters,i,j,numasks,max; struct LP_address_utxo **utxos; double price; struct LP_pubkeyinfo *pubp; uint64_t asatoshis; struct iguana_info *basecoin; struct LP_utxoinfo *bestutxo = 0; maxiters = 100; *ordermatchpricep = 0.; *bestsatoshisp = *bestdestsatoshisp = 0; @@ -755,6 +786,9 @@ struct LP_utxoinfo *LP_buyutxo(double *ordermatchpricep,int64_t *bestsatoshisp,i duration = LP_ORDERBOOK_DURATION; if ( maxprice <= 0. || LP_priceinfofind(base) == 0 || basecoin == 0 ) return(0); + if ( basecoin->electrum == 0 ) + max = 1000; + else max = 20; utxos = calloc(max,sizeof(*utxos)); LP_txfees(&txfee,&desttxfee,base,autxo->coin); printf("LP_buyutxo maxprice %.8f relvol %.8f %s/%s %.8f %.8f\n",maxprice,dstr(autxo->S.satoshis),base,autxo->coin,dstr(txfee),dstr(desttxfee)); diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index 7eafd0392..72ff7189d 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1831,6 +1831,36 @@ void LP_utxo_clientpublish(struct LP_utxoinfo *utxo) } } +/*char *LP_spentcheck(cJSON *argjson) + { + bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; int32_t iambob,retval = 0; + txid = jbits256(argjson,"txid"); + vout = jint(argjson,"vout"); + for (iambob=0; iambob<=1; iambob++) + { + if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 && utxo->T.spentflag == 0 ) + { + if ( jobj(argjson,"check") == 0 ) + checktxid = txid, checkvout = vout; + else + { + checktxid = jbits256(argjson,"checktxid"); + checkvout = jint(argjson,"checkvout"); + } + if ( LP_txvalue(0,utxo->coin,checktxid,checkvout) == 0 ) + { + //if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) + // LP_mypeer->numutxos--; + utxo->T.spentflag = (uint32_t)time(NULL); + retval++; + printf("indeed txid was spent\n"); + } + } + } + if ( retval > 0 ) + return(clonestr("{\"result\":\"marked as spent\"}")); + return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); + }*/ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; struct iguana_info *coin; char str[65]; uint32_t now = (uint32_t)time(NULL); diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 998d12ce1..7b8362aa1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -544,32 +544,6 @@ struct LP_transaction *LP_transactionadd(struct iguana_info *coin,bits256 txid,i return(tx); } -uint64_t LP_txinterestvalue(uint64_t *interestp,char *destaddr,struct iguana_info *coin,bits256 txid,int32_t vout) -{ - uint64_t interest,value = 0; cJSON *txobj; - *interestp = 0; - destaddr[0] = 0; - if ( (txobj= LP_gettxout(coin->symbol,destaddr,txid,vout)) != 0 ) - { - if ( (value= LP_value_extract(txobj,0)) == 0 ) - { - char str[65]; printf("%s LP_txvalue.%s strange utxo.(%s) vout.%d\n",coin->symbol,bits256_str(str,txid),jprint(txobj,0),vout); - } - else if ( strcmp(coin->symbol,"KMD") == 0 ) - { - if ( (interest= jdouble(txobj,"interest")) != 0. ) - { - //printf("add interest of %.8f to %.8f\n",interest,dstr(value)); - *interestp = SATOSHIDEN * interest; - } - } - LP_destaddr(destaddr,txobj); - //char str[65]; printf("dest.(%s) %.8f <- %s.(%s) txobj.(%s)\n",destaddr,dstr(value),coin->symbol,bits256_str(str,txid),jprint(txobj,0)); - free_json(txobj); - } //else { char str[65]; printf("null gettxout return %s/v%d\n",bits256_str(str,txid),vout); } - return(value); -} - cJSON *LP_transactioninit(struct iguana_info *coin,bits256 txid,int32_t iter,cJSON *txobj) { struct LP_transaction *tx; int32_t i,height,numvouts,numvins,spentvout; cJSON *vins,*vouts,*vout,*vin; bits256 spenttxid; char str[65]; @@ -692,6 +666,35 @@ int32_t LP_numconfirms(char *symbol,char *coinaddr,bits256 txid,int32_t vout,int return(numconfirms); } +uint64_t LP_txinterestvalue(uint64_t *interestp,char *destaddr,struct iguana_info *coin,bits256 txid,int32_t vout) +{ + uint64_t interest,value = 0; cJSON *txobj; + *interestp = 0; + destaddr[0] = 0; + if ( (txobj= LP_gettxout(coin->symbol,destaddr,txid,vout)) != 0 ) + { + if ( (value= LP_value_extract(txobj,0)) == 0 ) + { + char str[65]; printf("%s LP_txvalue.%s strange utxo.(%s) vout.%d\n",coin->symbol,bits256_str(str,txid),jprint(txobj,0),vout); + } + else if ( strcmp(coin->symbol,"KMD") == 0 ) + { + if ( coin->electrum == 0 ) + { + if ((interest= jdouble(txobj,"interest")) != 0. ) + { + //printf("add interest of %.8f to %.8f\n",interest,dstr(value)); + *interestp = SATOSHIDEN * interest; + } + } else *interestp = LP_komodo_interest(txid,value); + } + LP_destaddr(destaddr,txobj); + //char str[65]; printf("dest.(%s) %.8f <- %s.(%s) txobj.(%s)\n",destaddr,dstr(value),coin->symbol,bits256_str(str,txid),jprint(txobj,0)); + free_json(txobj); + } //else { char str[65]; printf("null gettxout return %s/v%d\n",bits256_str(str,txid),vout); } + return(value); +} + int64_t basilisk_txvalue(char *symbol,bits256 txid,int32_t vout) { char destaddr[64]; uint64_t value,interest = 0; struct iguana_info *coin; @@ -704,7 +707,7 @@ int64_t basilisk_txvalue(char *symbol,bits256 txid,int32_t vout) uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) { - struct LP_transaction *tx; cJSON *txobj=0; uint64_t value; struct iguana_info *coin; char str[65],_coinaddr[65]; + struct LP_transaction *tx; cJSON *txobj=0; struct iguana_info *coin; char str[65];//,_coinaddr[65]; uint64_t value; if ( bits256_nonz(txid) == 0 ) return(0); if ( (coin= LP_coinfind(symbol)) == 0 || coin->inactive != 0 ) @@ -723,7 +726,7 @@ uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) { if ( vout < tx->numvouts ) { - if ( bits256_nonz(tx->outpoints[vout].spendtxid) != 0 ) + /*if ( bits256_nonz(tx->outpoints[vout].spendtxid) != 0 ) { //printf("LP_txvalue %s/v%d is spent at %s\n",bits256_str(str,txid),vout,bits256_str(str2,tx->outpoints[vout].spendtxid)); return(0); @@ -738,12 +741,14 @@ uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) //printf("(%s) return value %.8f + interest %.8f\n",coinaddr,dstr(tx->outpoints[vout].value),dstr(tx->outpoints[vout].interest)); } return(tx->outpoints[vout].value + 0*tx->outpoints[vout].interest); - } + }*/ + return(tx->outpoints[vout].value); } else printf("LP_txvalue vout.%d >= tx->numvouts.%d\n",vout,tx->numvouts); } else { - if ( (txobj= LP_gettxout(coin->symbol,coinaddr,txid,vout)) != 0 ) + printf("LP_txvalue: unexpected null tx %s %s %s/v%d\n",coin->symbol,coinaddr,bits256_str(str,txid),vout); + /*if ( (txobj= LP_gettxout(coin->symbol,coinaddr,txid,vout)) != 0 ) { value = LP_value_extract(txobj,0);//SATOSHIDEN * (jdouble(txobj,"value") + jdouble(txobj,"interest")); if ( coinaddr == 0 ) @@ -758,15 +763,14 @@ uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) } printf("pruned node? LP_txvalue couldnt find %s tx %s/v%d (%s)\n",coin->symbol,bits256_str(str,txid),vout,txobj!=0?jprint(txobj,0):""); if ( txobj != 0 ) - free_json(txobj); + free_json(txobj);*/ } return(0); } int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { - //struct LP_utxoinfo *utxo; struct LP_address_utxo *up; - uint64_t val,val2=0,txfee,threshold=0; int32_t bypass = 0; char destaddr[64],destaddr2[64],str[65]; struct iguana_info *coin = LP_coinfind(symbol); + uint64_t val,val2=0,txfee,threshold=0; int32_t bypass = 0; char destaddr[64],destaddr2[64]; struct LP_transaction *tx; struct LP_address_utxo *up; struct iguana_info *coin = LP_coinfind(symbol); if ( bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 ) { printf("null txid not eligible\n"); @@ -778,16 +782,6 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol if ( bypass != 0 ) val = satoshis; else val = LP_txvalue(destaddr,symbol,txid,vout); - /*if ( (up= LP_address_utxofind(coin,destaddr,txid,vout)) != 0 && up->spendheight > 0 ) - { - //printf("%s/v%d spent %d\n",bits256_str(str,txid),vout,up->spendheight); - return(-2); - } - if ( (up= LP_address_utxofind(coin,destaddr,txid2,vout2)) != 0 && up->spendheight > 0 ) - { - //printf("%s/v%d spent %d\n",bits256_str(str,txid2),vout2,up->spendheight); - return(-3); - }*/ txfee = LP_txfeecalc(LP_coinfind(symbol),0,0); if ( val >= satoshis && val > (1+LP_MINSIZE_TXFEEMULT)*txfee ) { @@ -805,18 +799,31 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { *valp = val; *val2p = val2; + if ( destaddr[0] == 0 ) + strcpy(destaddr,destaddr2); + if ( coin != 0 ) + { + if ( (tx= LP_transactionfind(coin,txid)) != 0 && vout < tx->numvouts && tx->outpoints[vout].spendheight > 0 ) + return(0); + if ( (tx= LP_transactionfind(coin,txid2)) != 0 && vout2 < tx->numvouts && tx->outpoints[vout2].spendheight > 0 ) + return(0); + if ( (up= LP_address_utxofind(coin,destaddr,txid,vout)) != 0 && up->spendheight > 0 ) + return(0); + if ( (up= LP_address_utxofind(coin,destaddr,txid2,vout2)) != 0 && up->spendheight > 0 ) + return(0); + } return(1); } } // else printf("no val2\n"); } - char str2[65]; + /*char str2[65]; if ( val != 0 && val2 != 0 ) printf("spent.%d %s txid or value %.8f < %.8f or val2 %.8f < %.8f, %s/v%d %s/v%d or < 10x txfee %.8f\n",iambob,symbol,dstr(val),dstr(satoshis),dstr(val2),dstr(threshold),bits256_str(str,txid),vout,bits256_str(str2,txid2),vout2,dstr(txfee)); if ( val == 0 ) LP_address_utxoadd(coin,destaddr,txid,vout,satoshis,-1,1); if ( val2 == 0 ) LP_address_utxoadd(coin,destaddr,txid2,vout2,threshold,-1,1); - /*for (iter=0; iter<2; iter++) + for (iter=0; iter<2; iter++) { if ( (utxo= LP_utxofind(iter,txid,vout)) != 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6c0f07440..3cfd35c65 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -265,37 +265,6 @@ void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) utxo->T.spentflag = (uint32_t)time(NULL); } -/*char *LP_spentcheck(cJSON *argjson) -{ - bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; int32_t iambob,retval = 0; - txid = jbits256(argjson,"txid"); - vout = jint(argjson,"vout"); - for (iambob=0; iambob<=1; iambob++) - { - if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 && utxo->T.spentflag == 0 ) - { - if ( jobj(argjson,"check") == 0 ) - checktxid = txid, checkvout = vout; - else - { - checktxid = jbits256(argjson,"checktxid"); - checkvout = jint(argjson,"checkvout"); - } - if ( LP_txvalue(0,utxo->coin,checktxid,checkvout) == 0 ) - { - //if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) - // LP_mypeer->numutxos--; - utxo->T.spentflag = (uint32_t)time(NULL); - retval++; - printf("indeed txid was spent\n"); - } - } - } - if ( retval > 0 ) - return(clonestr("{\"result\":\"marked as spent\"}")); - return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); -}*/ - struct LP_utxoinfo *LP_utxoadd(int32_t iambob,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *coinaddr,bits256 pubkey,char *gui,uint32_t sessionid) { uint64_t val,val2=0,tmpsatoshis,txfee; int32_t spendvini,numconfirms,selector; bits256 spendtxid; struct iguana_info *coin; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; @@ -305,11 +274,6 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,char *symbol,bits256 txid,int32_t printf("session.%u addutxo %d %d %d %d %d %d %d %d\n",sessionid,symbol == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - /*if ( iambob != 0 ) - { - printf("deprecated bob utxos\n"); - return(0); - }*/ if ( (coin= LP_coinfind(symbol)) == 0 || (IAMLP == 0 && coin->inactive != 0) ) { //printf("LP_utxoadd reject inactive %s\n",symbol); From f7dc9a2ffbbbd5670011915c27a33eeb6ccad78b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:16:50 +0300 Subject: [PATCH 017/176] Test --- iguana/exchanges/LP_utxos.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 3cfd35c65..361aab14e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -483,7 +483,7 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri } //printf("privkey init.(%s) %s\n",coin->symbol,coin->smartaddr); if ( coin->inactive == 0 ) - LP_listunspent_issue(coin->symbol,coin->smartaddr,0); + LP_listunspent_issue(coin->symbol,coin->smartaddr,1); LP_address(coin,coin->smartaddr); if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { @@ -516,12 +516,12 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri } satoshis = LP_txvalue(destaddr,coin->symbol,txid,vout); if ( satoshis != 0 && satoshis != value ) - printf("unexpected privkey_init value mismatch %.8f vs %.8f (%s) %.8f %.8f\n",dstr(satoshis),dstr(value),jprint(item,0),jdouble(item,"amount"),jdouble(item,"interest")); + printf("%s %s unexpected privkey_init value mismatch %.8f vs %.8f (%s) %.8f %.8f\n",coin->symbol,coin->smartaddr,dstr(satoshis),dstr(value),jprint(item,0),jdouble(item,"amount"),jdouble(item,"interest")); if ( LP_inventory_prevent(iambob,coin->symbol,txid,vout) == 0 && height > 0 ) { //printf("%s\n",jprint(item,0)); values[i] = satoshis; - flag += LP_address_utxoadd(coin,destaddr,txid,vout,satoshis,height,-1); + //flag += LP_address_utxoadd(coin,destaddr,txid,vout,satoshis,height,-1); } else used++; } //printf("array.%d\n",n); From 0c55fbec5e444cee809462c858f68b00b557cde5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:24:25 +0300 Subject: [PATCH 018/176] Test --- iguana/exchanges/LP_nativeDEX.c | 35 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a03d9f858..8e0a3c045 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -543,24 +543,27 @@ void LP_coinsloop(void *_coins) { DL_FOREACH_SAFE(ap->utxos,up,tmp) { - if ( up->SPV == 0 ) + if ( up->U.height > 0 && up->spendheight < 0 ) { - nonz++; - up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); - if ( up->SPV > 0 ) - printf("%s %s: SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); - } - else if ( up->SPV == -1 ) - { - nonz++; - printf("SPV failure for %s %s\n",coin->symbol,bits256_str(str,up->U.txid)); - oldht = up->U.height; - LP_txheight_check(coin,ap->coinaddr,up); - if ( oldht != up->U.height ) + if ( up->SPV == 0 ) + { + nonz++; up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); - if ( up->SPV <= 0 ) - up->SPV = -2; - else printf("%s %s: corrected SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); + if ( up->SPV > 0 ) + printf("%s %s: SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); + } + else if ( up->SPV == -1 ) + { + nonz++; + printf("SPV failure for %s %s\n",coin->symbol,bits256_str(str,up->U.txid)); + oldht = up->U.height; + LP_txheight_check(coin,ap->coinaddr,up); + if ( oldht != up->U.height ) + up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); + if ( up->SPV <= 0 ) + up->SPV = -2; + else printf("%s %s: corrected SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); + } } } } From 9caae35da816a096e8f9de8b38daca66890ebcf9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:36:49 +0300 Subject: [PATCH 019/176] Test --- iguana/exchanges/LP_socket.c | 4 ++-- iguana/exchanges/LP_utxo.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 6920826b4..897a1ca86 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -339,7 +339,7 @@ int32_t electrum_process_array(struct iguana_info *coin,struct electrum_info *ep if (tx->height <= 0 ) { tx->height = ht; - //printf("%s %s >>>>>>>>>> set %s <- height %d\n",coin->symbol,coinaddr,bits256_str(str,txid),tx->height); + printf("%s %s >>>>>>>>>> set %s <- height %d\n",coin->symbol,coinaddr,bits256_str(str,txid),tx->height); } if ( v >= 0 && v < tx->numvouts ) { @@ -537,7 +537,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,strlen(jprint(retjson,0))); + printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%s)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); if ( ap != 0 ) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 7b8362aa1..c295cb171 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -566,7 +566,7 @@ cJSON *LP_transactioninit(struct iguana_info *coin,bits256 txid,int32_t iter,cJS tx->outpoints[i].value = LP_value_extract(vout,0); tx->outpoints[i].interest = SATOSHIDEN * jdouble(vout,"interest"); LP_destaddr(tx->outpoints[i].coinaddr,vout); - //printf("from transaction init\n"); + printf("from transaction init %s %s %s/v%d <- %.8f\n",coin->symbol,tx->outpoints[i].coinaddr,bits256_str(str,txid),i,dstr(tx->outpoints[i].value)); //LP_address_utxoadd(coin,tx->outpoints[i].coinaddr,txid,i,tx->outpoints[i].value,height,-1); } //printf("numvouts.%d\n",numvouts); From 14d763bcf3044f3cdfbd7e4f9b9f3460f628d98b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:45:59 +0300 Subject: [PATCH 020/176] Test --- iguana/exchanges/LP_socket.c | 7 ++++++- iguana/exchanges/LP_utxo.c | 3 ++- iguana/exchanges/LP_utxos.c | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 897a1ca86..d34358c6b 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -546,7 +546,12 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON ap->unspentheight = height; } } - } else retjson = LP_address_utxos(coin,addr,1); + } + else + { + retjson = LP_address_utxos(coin,addr,1); + printf("CACHED.%s\n",jprint(retjson,0)); + } return(retjson); } diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index c295cb171..8c32f526a 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -240,7 +240,8 @@ cJSON *LP_address_item(struct iguana_info *coin,struct LP_address_utxo *up,int32 { jaddbits256(item,"txid",up->U.txid); jaddnum(item,"vout",up->U.vout); - jaddnum(item,"confirmations",LP_getheight(coin) - up->U.height + 1); + if ( up->U.height > 0 ) + jaddnum(item,"confirmations",LP_getheight(coin) - up->U.height + 1); jaddnum(item,"amount",dstr(up->U.value)); jaddstr(item,"scriptPubKey",""); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 361aab14e..9287a7f8b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -483,7 +483,7 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri } //printf("privkey init.(%s) %s\n",coin->symbol,coin->smartaddr); if ( coin->inactive == 0 ) - LP_listunspent_issue(coin->symbol,coin->smartaddr,1); + LP_listunspent_issue(coin->symbol,coin->smartaddr,0); LP_address(coin,coin->smartaddr); if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { From 37f6ad2f391807939ecfd111a17044f5034097af Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 15:52:37 +0300 Subject: [PATCH 021/176] Test --- iguana/exchanges/LP_utxo.c | 4 ++-- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 8c32f526a..1a85a228c 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -225,8 +225,8 @@ int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid, DL_APPEND(ap->utxos,up); portable_mutex_unlock(&coin->addrmutex); retval = 1; - if ( 0 && height > 0 && strcmp("REVS",coin->symbol) == 0 ) - printf("ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); + if ( value == 0 ) + printf("null? ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); //printf("done %s add addr.%s ht.%d\n",coin->symbol,coinaddr,height); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9287a7f8b..bfcc45ccd 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -490,7 +490,7 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri txfee = LP_txfeecalc(coin,0,0); if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { - //printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0)); + printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0)); for (iambob=0; iambob<=1; iambob++) { if ( iambob == 0 ) From f3d8c4635570027911ac1ec151d1991a9a1c2019 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:08:53 +0300 Subject: [PATCH 022/176] Test --- iguana/exchanges/LP_nativeDEX.c | 42 ++---------------------------- iguana/exchanges/LP_statemachine.c | 38 ++++++++++++++++++++++++++- iguana/exchanges/LP_swap.c | 4 +-- iguana/exchanges/LP_utxo.c | 6 +++-- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 8e0a3c045..7be8e72cb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -396,7 +396,7 @@ void utxosQ_loop(void *myipaddr) int32_t LP_utxos_sync(struct LP_peerinfo *peer) { - int32_t i,j,n=0,m,v,posted=0; bits256 txid; cJSON *array,*item,*item2,*array2,*array3; uint64_t total,total2,metric; struct iguana_info *coin,*ctmp; struct LP_address *ap; char *retstr,*retstr2,*coinaddr; + int32_t i,j,n=0,m,v,posted=0; bits256 txid; cJSON *array,*item,*item2,*array2; uint64_t total,total2; struct iguana_info *coin,*ctmp; char *retstr,*retstr2; if ( strcmp(peer->ipaddr,LP_myipaddr) == 0 ) return(0); HASH_ITER(hh,LP_coins,coin,ctmp) @@ -473,43 +473,6 @@ int32_t LP_utxos_sync(struct LP_peerinfo *peer) } free_json(array); } - if ( 0 && (retstr= issue_LP_listunspent(peer->ipaddr,peer->port,coin->symbol,"")) != 0 ) - { - if ( (array2= cJSON_Parse(retstr)) != 0 ) - { - if ( (m= cJSON_GetArraySize(array2)) > 0 ) - { - for (j=0; j %.8f n.%d\n",coinaddr,dstr(metric>>16),(uint16_t)metric); - if ( (ap= LP_addressfind(coin,coinaddr)) == 0 || _LP_unspents_metric(ap->total,ap->n) != metric ) - { - if ( ap == 0 || ap->n < (metric & 0xffff) ) - { - if ( (retstr2= issue_LP_listunspent(peer->ipaddr,peer->port,coin->symbol,coinaddr)) != 0 ) - { - if ( (array3= cJSON_Parse(retstr2)) != 0 ) - { - LP_unspents_array(coin,coinaddr,array3); - //printf("pulled.(%s)\n",retstr2); - free_json(array3); - } - free(retstr2); - } - } //else printf("wait for %s to pull %d vs %d\n",peer->ipaddr,ap!=0?ap->n:-1,(uint16_t)metric); - } - } - } - } - free_json(array2); - } - //printf("processed.(%s)\n",retstr); - free(retstr); - } } return(posted); } @@ -645,14 +608,13 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport); peer->diduquery = 0; LP_peer_pricesquery(peer); - //LP_utxos_sync(peer); + LP_utxos_sync(peer); needpings++; } peer->lastpeers = now; } if ( peer->needping != 0 ) { - LP_utxos_sync(peer); peer->diduquery = now; nonz++; if ( (retstr= issue_LP_notify(peer->ipaddr,peer->port,"127.0.0.1",0,numpeers,G.LP_sessionid,G.LP_myrmd160str,G.LP_mypub25519)) != 0 ) diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index 72ff7189d..5db3f3c40 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1958,7 +1958,43 @@ if ( aliceutxo->S.swap == 0 ) LP_availableset(aliceutxo); return(jprint(bestitem,0)); } - +if ( 0 && (retstr= issue_LP_listunspent(peer->ipaddr,peer->port,coin->symbol,"")) != 0 ) +{ + if ( (array2= cJSON_Parse(retstr)) != 0 ) + { + if ( (m= cJSON_GetArraySize(array2)) > 0 ) + { + for (j=0; j %.8f n.%d\n",coinaddr,dstr(metric>>16),(uint16_t)metric); + if ( (ap= LP_addressfind(coin,coinaddr)) == 0 || _LP_unspents_metric(ap->total,ap->n) != metric ) + { + if ( ap == 0 || ap->n < (metric & 0xffff) ) + { + if ( (retstr2= issue_LP_listunspent(peer->ipaddr,peer->port,coin->symbol,coinaddr)) != 0 ) + { + if ( (array3= cJSON_Parse(retstr2)) != 0 ) + { + LP_unspents_array(coin,coinaddr,array3); + //printf("pulled.(%s)\n",retstr2); + free_json(array3); + } + free(retstr2); + } + } //else printf("wait for %s to pull %d vs %d\n",peer->ipaddr,ap!=0?ap->n:-1,(uint16_t)metric); + } + } + } + } + free_json(array2); + } + //printf("processed.(%s)\n",retstr); + free(retstr); +} /*if ( time(NULL) > coin->lastmonitor+60 ) { //portable_mutex_lock(&coin->addrmutex); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index dfafa0499..d09439a94 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -786,7 +786,7 @@ void LP_bobloop(void *_swap) while ( (n= LP_numconfirms(swap->alicecoin.symbol,swap->alicepayment.I.destaddr,swap->alicepayment.I.signedtxid,0,1)) < m ) // sync with alice { char str[65];printf("%d waiting for alicepayment %s to be confirmed.%d %s %s\n",n,swap->alicepayment.I.destaddr,m,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); - sleep(3); + sleep(10); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) printf("error sending bobpayment\n"); @@ -853,7 +853,7 @@ void LP_aliceloop(void *_swap) while ( (n= LP_numconfirms(swap->bobcoin.symbol,swap->bobpayment.I.destaddr,swap->bobpayment.I.signedtxid,0,1)) < swap->I.bobconfirms ) { char str[65];printf("%d waiting for bobpayment %s to be confirmed.%d %s %s\n",n,swap->bobpayment.I.destaddr,swap->I.bobconfirms,swap->bobcoin.symbol,bits256_str(str,swap->bobpayment.I.signedtxid)); - sleep(LP_SWAPSTEP_TIMEOUT); + sleep(10); } /*if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 1a85a228c..218e448f1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -251,6 +251,8 @@ cJSON *LP_address_item(struct iguana_info *coin,struct LP_address_utxo *up,int32 jaddnum(item,"tx_pos",up->U.vout); jaddnum(item,"height",up->U.height); jadd64bits(item,"value",up->U.value); + if ( up->U.value == 0 ) + printf("ERROR LP_address_item illegal.(%s)\n",jprint(item,0)); } return(item); } @@ -356,9 +358,9 @@ cJSON *LP_address_utxos(struct iguana_info *coin,char *coinaddr,int32_t electrum up->spendheight = 1; else free_json(txobj); } - if ( up->spendheight <= 0 ) + if ( up->spendheight <= 0 && up->U.value != 0 ) { - if ( up->SPV >= 0 ) + if ( coin->electrum == 0 || up->SPV > 0 ) { jaddi(array,LP_address_item(coin,up,electrumret)); n++; From 3fbf7f0cccccf3aa46f8e5a428c254f2bb6ad72d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:12:44 +0300 Subject: [PATCH 023/176] Test --- iguana/exchanges/LP_socket.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index d34358c6b..897a1ca86 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -546,12 +546,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON ap->unspentheight = height; } } - } - else - { - retjson = LP_address_utxos(coin,addr,1); - printf("CACHED.%s\n",jprint(retjson,0)); - } + } else retjson = LP_address_utxos(coin,addr,1); return(retjson); } From 9ca35efd1160f380c2f32b325b0b86f018eed9f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:16:32 +0300 Subject: [PATCH 024/176] Test --- iguana/exchanges/LP_commands.c | 1 + iguana/exchanges/LP_portfolio.c | 1 + iguana/exchanges/LP_utxos.c | 1 + 3 files changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2a45899ba..f2b605120 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -508,6 +508,7 @@ stop()\n\ LP_listunspent_issue(coin,coinaddr,1); if ( strcmp(coinaddr,ptr->smartaddr) == 0 && bits256_nonz(G.LP_privkey) != 0 ) { + printf("network invoked\n"); LP_privkey_init(-1,ptr,G.LP_privkey,G.LP_mypub25519); //LP_smartutxos_push(ptr); } diff --git a/iguana/exchanges/LP_portfolio.c b/iguana/exchanges/LP_portfolio.c index 99644a956..975fb66d4 100644 --- a/iguana/exchanges/LP_portfolio.c +++ b/iguana/exchanges/LP_portfolio.c @@ -93,6 +93,7 @@ char *LP_portfolio() continue; if ( iter == 0 ) { + printf("from portfolio\n"); LP_privkey_init(-1,coin,G.LP_privkey,G.LP_mypub25519); coin->balanceA = LP_balance(&coin->valuesumA,0,coin->symbol,coin->smartaddr); coin->balanceB = LP_balance(&coin->valuesumB,1,coin->symbol,coin->smartaddr); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bfcc45ccd..560fdce12 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -753,6 +753,7 @@ void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase) //printf("i.%d of %d\n",i,LP_numcoins); else if ( IAMLP == 0 || coin->inactive == 0 ) { + printf("from updates\n"); if ( LP_privkey_init(pubsock,coin,G.LP_privkey,G.LP_mypub25519) == 0 && (rand() % 10) == 0 ) LP_postutxos(coin->symbol,coin->smartaddr); } From 27cc5d9d17e7437f3dc50ad2163741539efdde0e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:19:34 +0300 Subject: [PATCH 025/176] Test --- iguana/exchanges/LP_portfolio.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_portfolio.c b/iguana/exchanges/LP_portfolio.c index 975fb66d4..05184ded6 100644 --- a/iguana/exchanges/LP_portfolio.c +++ b/iguana/exchanges/LP_portfolio.c @@ -635,6 +635,7 @@ void prices_loop(void *ignore) } free(retstr); } + sleep(60); } } From 294f16c9e39ba1f6325a792c571af329fba5c798 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:28:28 +0300 Subject: [PATCH 026/176] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_portfolio.c | 2 +- iguana/exchanges/LP_signatures.c | 4 ++-- iguana/exchanges/LP_socket.c | 8 ++++---- iguana/exchanges/LP_utxo.c | 10 +++++----- iguana/exchanges/LP_utxos.c | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index d66187044..371cb7bc5 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -335,7 +335,7 @@ int32_t LP_mempoolscan(char *symbol,bits256 searchtxid); int32_t LP_txheight(struct iguana_info *coin,bits256 txid); int32_t LP_numpeers(); uint64_t LP_KMDvalue(struct iguana_info *coin,uint64_t balance); -int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t height,int32_t spendheight); +int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t height,int32_t spendheight); void LP_smartutxos_push(struct iguana_info *coin); cJSON *LP_address_utxos(struct iguana_info *coin,char *coinaddr,int32_t electrumret); cJSON *LP_gettxout(char *symbol,char *coinaddr,bits256 txid,int32_t vout); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index afbcfc5a4..c999fe346 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -576,7 +576,7 @@ int32_t LP_listunspent_both(char *symbol,char *coinaddr,int32_t fullflag) value = LP_value_extract(item,0); height = LP_txheight(coin,txid); //char str[65]; printf("LP_listunspent_both: %s/v%d ht.%d %.8f\n",bits256_str(str,txid),v,height,dstr(value)); - LP_address_utxoadd(coin,coinaddr,txid,v,value,height,-1); + LP_address_utxoadd("LP_listunspent_both",coin,coinaddr,txid,v,value,height,-1); } } } diff --git a/iguana/exchanges/LP_portfolio.c b/iguana/exchanges/LP_portfolio.c index 05184ded6..f3492daf6 100644 --- a/iguana/exchanges/LP_portfolio.c +++ b/iguana/exchanges/LP_portfolio.c @@ -93,7 +93,7 @@ char *LP_portfolio() continue; if ( iter == 0 ) { - printf("from portfolio\n"); + //printf("from portfolio\n"); LP_privkey_init(-1,coin,G.LP_privkey,G.LP_mypub25519); coin->balanceA = LP_balance(&coin->valuesumA,0,coin->symbol,coin->smartaddr); coin->balanceB = LP_balance(&coin->valuesumB,1,coin->symbol,coin->smartaddr); diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 05e2b99ee..66a518465 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -591,8 +591,8 @@ char *LP_uitem_recv(cJSON *argjson) coinaddr = jstr(argjson,"coinaddr"); if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 ) { - //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",coin,coinaddr,bits256_str(str,txid),vout,dstr(value),height); - LP_address_utxoadd(LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); + char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",symbol,coinaddr,bits256_str(str,txid),vout,dstr(value),height); + LP_address_utxoadd("LP_uitem,recv",LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); } return(clonestr("{\"result\":\"success\"}")); } diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 897a1ca86..eb3adb6ab 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -315,7 +315,7 @@ int32_t electrum_process_array(struct iguana_info *coin,struct electrum_info *ep else { //printf("external unspent has no gettxout\n"); - flag += LP_address_utxoadd(coin,coinaddr,txid,v,value,0,1); + flag += LP_address_utxoadd("electrum process",coin,coinaddr,txid,v,value,0,1); } } else @@ -349,10 +349,10 @@ int32_t electrum_process_array(struct iguana_info *coin,struct electrum_info *ep tx->outpoints[v].value = value; } } - if ( value != 0 || tx->height > 0 ) + if ( tx->height > 0 ) { //printf("from electrum_process_array\n"); - flag += LP_address_utxoadd(coin,coinaddr,txid,v,value,tx->height,-1); + flag += LP_address_utxoadd("electrum process2",coin,coinaddr,txid,v,value,tx->height,-1); } //printf("v.%d numvouts.%d %.8f (%s)\n",v,tx->numvouts,dstr(tx->outpoints[jint(item,"tx_pos")].value),jprint(item,0)); } //else printf("cant find tx\n"); @@ -486,7 +486,7 @@ cJSON *electrum_address_gethistory(char *symbol,struct electrum_info *ep,cJSON * printf("update %s height.%d <- %d\n",bits256_str(str,txid),tx->height,height); tx->height = height; //printf("from history\n"); - LP_address_utxoadd(coin,addr,txid,0,0,height,-1); + LP_address_utxoadd("electrum history",coin,addr,txid,0,0,height,-1); } } } diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 218e448f1..9f20b7ab6 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -178,7 +178,7 @@ struct LP_address_utxo *LP_address_utxofind(struct iguana_info *coin,char *coina return(0); } -int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t height,int32_t spendheight) +int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t height,int32_t spendheight) { struct LP_address *ap; cJSON *txobj; struct LP_address_utxo *up,*tmp; int32_t flag,retval = 0; char str[65]; if ( coin == 0 ) @@ -226,7 +226,7 @@ int32_t LP_address_utxoadd(struct iguana_info *coin,char *coinaddr,bits256 txid, portable_mutex_unlock(&coin->addrmutex); retval = 1; if ( value == 0 ) - printf("null? ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); + printf("%s null? ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",debug,coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); //printf("done %s add addr.%s ht.%d\n",coin->symbol,coinaddr,height); @@ -446,7 +446,7 @@ int32_t LP_unspents_array(struct iguana_info *coin,char *coinaddr,cJSON *array) if ( errs == 0 ) { //printf("from LP_unspents_array\n"); - LP_address_utxoadd(coin,coinaddr,txid,v,val,height,-1); + LP_address_utxoadd("LP_unspents_array",coin,coinaddr,txid,v,val,height,-1); count++; } } @@ -570,7 +570,7 @@ cJSON *LP_transactioninit(struct iguana_info *coin,bits256 txid,int32_t iter,cJS tx->outpoints[i].interest = SATOSHIDEN * jdouble(vout,"interest"); LP_destaddr(tx->outpoints[i].coinaddr,vout); printf("from transaction init %s %s %s/v%d <- %.8f\n",coin->symbol,tx->outpoints[i].coinaddr,bits256_str(str,txid),i,dstr(tx->outpoints[i].value)); - //LP_address_utxoadd(coin,tx->outpoints[i].coinaddr,txid,i,tx->outpoints[i].value,height,-1); + LP_address_utxoadd("LP_transactioninit iter0",coin,tx->outpoints[i].coinaddr,txid,i,tx->outpoints[i].value,height,-1); } //printf("numvouts.%d\n",numvouts); } @@ -592,7 +592,7 @@ cJSON *LP_transactioninit(struct iguana_info *coin,bits256 txid,int32_t iter,cJS tx->outpoints[spentvout].spendtxid = txid; tx->outpoints[spentvout].spendvini = i; tx->outpoints[spentvout].spendheight = height > 0 ? height : 1; - LP_address_utxoadd(coin,tx->outpoints[spentvout].coinaddr,spenttxid,spentvout,tx->outpoints[spentvout].value,-1,height>0?height:1); + LP_address_utxoadd("LP_transactioninit iter1",coin,tx->outpoints[spentvout].coinaddr,spenttxid,spentvout,tx->outpoints[spentvout].value,-1,height>0?height:1); if ( 0 && strcmp(coin->symbol,"REVS") == 0 ) printf("spend %s %s/v%d at ht.%d\n",coin->symbol,bits256_str(str,tx->txid),spentvout,height); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 560fdce12..a305968c7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -753,7 +753,7 @@ void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase) //printf("i.%d of %d\n",i,LP_numcoins); else if ( IAMLP == 0 || coin->inactive == 0 ) { - printf("from updates\n"); + printf("from updates %s\n",coin->symbol); if ( LP_privkey_init(pubsock,coin,G.LP_privkey,G.LP_mypub25519) == 0 && (rand() % 10) == 0 ) LP_postutxos(coin->symbol,coin->smartaddr); } From 038edb1179a3aaebb71944c46e860509b6a57794 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:40:45 +0300 Subject: [PATCH 027/176] test --- iguana/exchanges/LP_signatures.c | 2 +- iguana/exchanges/LP_utxo.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 66a518465..ca32089d5 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -591,7 +591,7 @@ char *LP_uitem_recv(cJSON *argjson) coinaddr = jstr(argjson,"coinaddr"); if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 ) { - char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",symbol,coinaddr,bits256_str(str,txid),vout,dstr(value),height); + //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",symbol,coinaddr,bits256_str(str,txid),vout,dstr(value),height); LP_address_utxoadd("LP_uitem,recv",LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); } return(clonestr("{\"result\":\"success\"}")); diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 9f20b7ab6..cb3531baa 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -199,13 +199,13 @@ int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,b up->U.height = height, flag |= 2; if ( spendheight > 0 && up->spendheight != spendheight ) up->spendheight = spendheight, flag |= 4; - if ( up->U.value == 0 && up->U.value != value ) + if ( value != 0 && up->U.value == 0 && up->U.value != value ) up->U.value = value, flag |= 8; //printf("found >>>>>>>>>> %s %s %s/v%d ht.%d %.8f\n",coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); break; } } - if ( flag == 0 ) + if ( flag == 0 && value != 0 ) { if ( coin->electrum == 0 ) { @@ -569,7 +569,7 @@ cJSON *LP_transactioninit(struct iguana_info *coin,bits256 txid,int32_t iter,cJS tx->outpoints[i].value = LP_value_extract(vout,0); tx->outpoints[i].interest = SATOSHIDEN * jdouble(vout,"interest"); LP_destaddr(tx->outpoints[i].coinaddr,vout); - printf("from transaction init %s %s %s/v%d <- %.8f\n",coin->symbol,tx->outpoints[i].coinaddr,bits256_str(str,txid),i,dstr(tx->outpoints[i].value)); + //printf("from transaction init %s %s %s/v%d <- %.8f\n",coin->symbol,tx->outpoints[i].coinaddr,bits256_str(str,txid),i,dstr(tx->outpoints[i].value)); LP_address_utxoadd("LP_transactioninit iter0",coin,tx->outpoints[i].coinaddr,txid,i,tx->outpoints[i].value,height,-1); } //printf("numvouts.%d\n",numvouts); From a7dda988a6e717530faed8d613d7ad2a02f16d34 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 16:49:56 +0300 Subject: [PATCH 028/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_socket.c | 5 ++--- iguana/exchanges/LP_utxos.c | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7be8e72cb..0b7b60258 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -512,7 +512,7 @@ void LP_coinsloop(void *_coins) { nonz++; up->SPV = LP_merkleproof(coin,backupep,up->U.txid,up->U.height); - if ( up->SPV > 0 ) + if ( 0 && up->SPV > 0 ) printf("%s %s: SPV.%d\n",coin->symbol,bits256_str(str,up->U.txid),up->SPV); } else if ( up->SPV == -1 ) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index eb3adb6ab..1575ffec7 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -339,7 +339,7 @@ int32_t electrum_process_array(struct iguana_info *coin,struct electrum_info *ep if (tx->height <= 0 ) { tx->height = ht; - printf("%s %s >>>>>>>>>> set %s <- height %d\n",coin->symbol,coinaddr,bits256_str(str,txid),tx->height); + //printf("%s %s >>>>>>>>>> set %s <- height %d\n",coin->symbol,coinaddr,bits256_str(str,txid),tx->height); } if ( v >= 0 && v < tx->numvouts ) { @@ -373,7 +373,7 @@ cJSON *electrum_submit(char *symbol,struct electrum_info *ep,cJSON **retjsonp,ch { *retjsonp = 0; sprintf(stratumreq,"{ \"jsonrpc\":\"2.0\", \"id\": %u, \"method\":\"%s\", \"params\": %s }\n",ep->stratumid,method,params); -printf("%s %s\n",symbol,stratumreq); +printf("%s %s",symbol,stratumreq); memset(ep->buf,0,ep->bufsize); sitem = (struct stritem *)queueitem(stratumreq); sitem->expiration = timeout; @@ -485,7 +485,6 @@ cJSON *electrum_address_gethistory(char *symbol,struct electrum_info *ep,cJSON * if ( tx->height > 0 && tx->height != height ) printf("update %s height.%d <- %d\n",bits256_str(str,txid),tx->height,height); tx->height = height; - //printf("from history\n"); LP_address_utxoadd("electrum history",coin,addr,txid,0,0,height,-1); } } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a305968c7..676ae391c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -490,7 +490,7 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri txfee = LP_txfeecalc(coin,0,0); if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { - printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0)); + //printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0)); for (iambob=0; iambob<=1; iambob++) { if ( iambob == 0 ) @@ -753,7 +753,7 @@ void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase) //printf("i.%d of %d\n",i,LP_numcoins); else if ( IAMLP == 0 || coin->inactive == 0 ) { - printf("from updates %s\n",coin->symbol); + //printf("from updates %s\n",coin->symbol); if ( LP_privkey_init(pubsock,coin,G.LP_privkey,G.LP_mypub25519) == 0 && (rand() % 10) == 0 ) LP_postutxos(coin->symbol,coin->smartaddr); } From fb5e66b32ef65e04282b0bd26d351bacfc94e834 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 17:04:01 +0300 Subject: [PATCH 029/176] Test --- iguana/exchanges/LP_prices.c | 4 ++-- iguana/exchanges/LP_socket.c | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 7fb1cac2c..d3ad1432b 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -776,7 +776,7 @@ char *LP_orderbook(char *base,char *rel,int32_t duration) for (i=n=0; inumutxos == 0 ) + if ( suppress_prefetch == 0 && n < 3 && bids[i]->numutxos == 0 ) { //printf("bid ping %s %s\n",rel,bids[i]->coinaddr); LP_address(relcoin,bids[i]->coinaddr); @@ -796,7 +796,7 @@ char *LP_orderbook(char *base,char *rel,int32_t duration) for (i=n=0; inumutxos == 0 ) + if ( suppress_prefetch == 0 && n < 3 && asks[i]->numutxos == 0 ) { //printf("ask ping %s %s\n",base,asks[i]->coinaddr); LP_address(basecoin,asks[i]->coinaddr); diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 1575ffec7..c5e16dd47 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -373,7 +373,7 @@ cJSON *electrum_submit(char *symbol,struct electrum_info *ep,cJSON **retjsonp,ch { *retjsonp = 0; sprintf(stratumreq,"{ \"jsonrpc\":\"2.0\", \"id\": %u, \"method\":\"%s\", \"params\": %s }\n",ep->stratumid,method,params); -printf("%s %s",symbol,stratumreq); +//printf("%s %s",symbol,stratumreq); memset(ep->buf,0,ep->bufsize); sitem = (struct stritem *)queueitem(stratumreq); sitem->expiration = timeout; @@ -536,7 +536,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%s)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,(jprint(retjson,0))); + printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); if ( ap != 0 ) @@ -558,9 +558,13 @@ cJSON *electrum_addpeer(char *symbol,struct electrum_info *ep,cJSON **retjsonp,c cJSON *electrum_sendrawtransaction(char *symbol,struct electrum_info *ep,cJSON **retjsonp,char *rawtx) { return(electrum_strarg(symbol,ep,retjsonp,"blockchain.transaction.broadcast",rawtx,ELECTRUM_TIMEOUT)); } cJSON *electrum_estimatefee(char *symbol,struct electrum_info *ep,cJSON **retjsonp,int32_t numblocks) { return(electrum_intarg(symbol,ep,retjsonp,"blockchain.estimatefee",numblocks,ELECTRUM_TIMEOUT)); } -cJSON *electrum_getheader(char *symbol,struct electrum_info *ep,cJSON **retjsonp,int32_t n) { return(electrum_intarg(symbol,ep,retjsonp,"blockchain.block.get_header",n,ELECTRUM_TIMEOUT)); } cJSON *electrum_getchunk(char *symbol,struct electrum_info *ep,cJSON **retjsonp,int32_t n) { return(electrum_intarg(symbol,ep,retjsonp,"blockchain.block.get_chunk",n,ELECTRUM_TIMEOUT)); } +cJSON *electrum_getheader(char *symbol,struct electrum_info *ep,cJSON **retjsonp,int32_t n) +{ + return(electrum_intarg(symbol,ep,retjsonp,"blockchain.block.get_header",n,ELECTRUM_TIMEOUT)); +} + cJSON *LP_transaction_fromdata(struct iguana_info *coin,bits256 txid,uint8_t *serialized,int32_t len) { uint8_t *extraspace; cJSON *txobj; char str[65],str2[65]; struct iguana_msgtx msgtx; bits256 checktxid; From e939bd745a72583fc0293f9b5b8ffe5119eb6e6a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 17:19:24 +0300 Subject: [PATCH 030/176] 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 371cb7bc5..e418a2b47 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -72,7 +72,7 @@ #define LP_RESERVETIME 60 #define LP_AVETXSIZE 256 #define LP_CACHEDURATION 60 -#define BASILISK_DEFAULT_NUMCONFIRMS 3 +#define BASILISK_DEFAULT_NUMCONFIRMS 1 #define BASILISK_DEFAULT_MAXCONFIRMS 6 #define DEX_SLEEP 3 #define BASILISK_KEYSIZE ((int32_t)(2*sizeof(bits256)+sizeof(uint32_t)*2)) From 1659f308716a06d96cc65226974874d921d6104f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 17:58:43 +0300 Subject: [PATCH 031/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ---- iguana/exchanges/LP_signatures.c | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0b7b60258..8c187dd4a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,11 +18,7 @@ // LP_nativeDEX.c // marketmaker // -// variable timeout based on number of electrums in swap -// listunspent on each new block or 30 seconds if doing swap -// reject swap response from bob? // -// electrum swaps efficiency // process stats.log local file -> map of realtime activity! // select oldest utxo first // handles <-> pubkeys, deal with offline pubkeys, reputations, bonds etc. diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index ca32089d5..42a20cc82 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -92,6 +92,10 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) jaddnum(retjson,"price",price); } } + if ( qp->R.requestid != 0 ) + jaddnum(retjson,"requestid",qp->R.requestid); + if ( qp->R.quoteid != 0 ) + jaddnum(retjson,"quoteid",qp->R.quoteid); return(retjson); } From 731148d6ae39eae674fb965d5fc399f1f46fa7a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 18:04:15 +0300 Subject: [PATCH 032/176] Test --- iguana/exchanges/LP_signatures.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 42a20cc82..34fe9ca32 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -101,6 +101,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) { + uint32_t rid,qid; safecopy(qp->gui,LP_gui,sizeof(qp->gui)); safecopy(qp->srccoin,jstr(argjson,"base"),sizeof(qp->srccoin)); safecopy(qp->coinaddr,jstr(argjson,"address"),sizeof(qp->coinaddr)); @@ -122,6 +123,18 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->destsatoshis = j64bits(argjson,"destsatoshis"); qp->txfee = j64bits(argjson,"txfee"); qp->desttxfee = j64bits(argjson,"desttxfee"); + qp->R.requestid = juint(argjson,"requestid"); + qp->R.quoteid = juint(argjson,"quoteid"); + if ( qp->R.requestid != (rid= basilisk_requestid(&qp->R)) ) + { + printf("requestid.%u -> %u\n",qp->R.requestid,rid); + qp->R.requestid = rid; + } + if ( qp->R.quoteid != (qid= basilisk_quoteid(&qp->R)) ) + { + printf("quoteid.%u -> %u\n",qp->R.quoteid,qid); + qp->R.quoteid = qid; + } return(0); } From 4b00693c01f06b6dae5342f82999e5618ba57a5c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 18:31:23 +0300 Subject: [PATCH 033/176] Test --- iguana/exchanges/LP_prices.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index d3ad1432b..ae42cd6c8 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -776,7 +776,7 @@ char *LP_orderbook(char *base,char *rel,int32_t duration) for (i=n=0; inumutxos == 0 ) + if ( suppress_prefetch == 0 && n < 7 && bids[i]->numutxos == 0 ) { //printf("bid ping %s %s\n",rel,bids[i]->coinaddr); LP_address(relcoin,bids[i]->coinaddr); @@ -796,7 +796,7 @@ char *LP_orderbook(char *base,char *rel,int32_t duration) for (i=n=0; inumutxos == 0 ) + if ( suppress_prefetch == 0 && n < 7 && asks[i]->numutxos == 0 ) { //printf("ask ping %s %s\n",base,asks[i]->coinaddr); LP_address(basecoin,asks[i]->coinaddr); From b4002e8fb76ce847856c3a7bfff75e9612ec1e27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 18:38:09 +0300 Subject: [PATCH 034/176] Test --- iguana/exchanges/LP_utxo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index cb3531baa..12a33173a 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -748,10 +748,10 @@ uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) return(tx->outpoints[vout].value); } else printf("LP_txvalue vout.%d >= tx->numvouts.%d\n",vout,tx->numvouts); } - else + else if ( coin->electrum == 0 ) { - printf("LP_txvalue: unexpected null tx %s %s %s/v%d\n",coin->symbol,coinaddr,bits256_str(str,txid),vout); - /*if ( (txobj= LP_gettxout(coin->symbol,coinaddr,txid,vout)) != 0 ) + uint64_t value; char _coinaddr[64]; + if ( (txobj= LP_gettxout(coin->symbol,coinaddr,txid,vout)) != 0 ) { value = LP_value_extract(txobj,0);//SATOSHIDEN * (jdouble(txobj,"value") + jdouble(txobj,"interest")); if ( coinaddr == 0 ) @@ -764,9 +764,9 @@ uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) return(value); } } - printf("pruned node? LP_txvalue couldnt find %s tx %s/v%d (%s)\n",coin->symbol,bits256_str(str,txid),vout,txobj!=0?jprint(txobj,0):""); + //printf("pruned node? LP_txvalue couldnt find %s tx %s/v%d (%s)\n",coin->symbol,bits256_str(str,txid),vout,txobj!=0?jprint(txobj,0):""); if ( txobj != 0 ) - free_json(txobj);*/ + free_json(txobj); } return(0); } From bab43df20e9bff0cd958ee7043016bd38e3bce51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:10:03 +0300 Subject: [PATCH 035/176] Statslog parse --- iguana/exchanges/LP_commands.c | 2 + iguana/exchanges/LP_nativeDEX.c | 8 ++-- iguana/exchanges/LP_remember.c | 18 -------- iguana/exchanges/LP_stats.c | 81 +++++++++++++++++++++++++++++++++ iguana/exchanges/LP_utxo.c | 2 +- 5 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 iguana/exchanges/LP_stats.c diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f2b605120..078bfebb3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -214,6 +214,8 @@ stop()\n\ { return(LP_portfolio()); } + else if ( strcmp(method,"") == 0 ) + return(LP_statslog_parse()); else if ( strcmp(method,"secretaddresses") == 0 ) { uint8_t taddr,pubtype; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 8c187dd4a..089150cd8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,12 +18,11 @@ // LP_nativeDEX.c // marketmaker // -// // process stats.log local file -> map of realtime activity! -// select oldest utxo first // handles <-> pubkeys, deal with offline pubkeys, reputations, bonds etc. -// -// verify portfolio, pricearray, interest to KMD withdraw, reliable networking +// select oldest utxo first + +// verify portfolio, pricearray, interest to KMD withdraw // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections // bigendian architectures need to use little endian for sighash calcs @@ -100,6 +99,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_prices.c" #include "LP_scan.c" #include "LP_transaction.c" +#include "LP_stats.c" #include "LP_remember.c" #include "LP_swap.c" #include "LP_peers.c" diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index c0887eea8..59361bd37 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -1228,24 +1228,6 @@ char *basilisk_swapentry(uint32_t requestid,uint32_t quoteid) return(retstr); } -void LP_tradecommand_log(cJSON *argjson) -{ - static FILE *logfp; char *jsonstr; - if ( logfp == 0 ) - { - if ( (logfp= fopen("stats.log","rb+")) != 0 ) - fseek(logfp,0,SEEK_END); - else logfp = fopen("stats.log","wb"); - } - if ( logfp != 0 ) - { - jsonstr = jprint(argjson,0); - fprintf(logfp,"%s\n",jsonstr); - free(jsonstr); - fflush(logfp); - } -} - extern struct LP_quoteinfo LP_Alicequery; extern uint32_t Alice_expiration; diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c new file mode 100644 index 000000000..10bc0ce55 --- /dev/null +++ b/iguana/exchanges/LP_stats.c @@ -0,0 +1,81 @@ + +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ +// +// LP_stats.c +// marketmaker +// + +#define LP_STATSLOG_FNAME "stats.log" + +void LP_tradecommand_log(cJSON *argjson) +{ + static FILE *logfp; char *jsonstr; + if ( logfp == 0 ) + { + if ( (logfp= fopen(LP_STATSLOG_FNAME,"rb+")) != 0 ) + fseek(logfp,0,SEEK_END); + else logfp = fopen(LP_STATSLOG_FNAME,"wb"); + } + if ( logfp != 0 ) + { + jsonstr = jprint(argjson,0); + fprintf(logfp,"%s\n",jsonstr); + free(jsonstr); + fflush(logfp); + } +} + +char *LP_statslog_disp(int32_t n) +{ + cJSON *retjson; + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddnum(retjson,"newlines",n); + return(jprint(retjson,1)); +} + +char *LP_statslog_parse() +{ + static long lastpos; FILE *fp; char line[8192]; cJSON *lineobj; int32_t n = 0; + if ( (fp= fopen(LP_STATSLOG_FNAME,"rb")) != 0 ) + { + if ( lastpos > 0 ) + { + fseek(fp,0,SEEK_END); + if ( ftell(fp) > lastpos ) + fseek(fp,lastpos,SEEK_SET); + else + { + fclose(fp); + return(clonestr("{\"result\":\"success\"}")); + } + } + while ( fgets(line,sizeof(line),fp) > 0 ) + { + lastpos = ftell(fp); + if ( (lineobj= cJSON_Parse(line)) != 0 ) + { + n++; + printf("%s\n",jprint(lineobj,0)); + free_json(lineobj); + } + } + fclose(fp); + } + return(LP_statslog_disp(n)); +} + + diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 12a33173a..3ed28c5b3 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -710,7 +710,7 @@ int64_t basilisk_txvalue(char *symbol,bits256 txid,int32_t vout) uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) { - struct LP_transaction *tx; cJSON *txobj=0; struct iguana_info *coin; char str[65];//,_coinaddr[65]; uint64_t value; + struct LP_transaction *tx; cJSON *txobj=0; struct iguana_info *coin; if ( bits256_nonz(txid) == 0 ) return(0); if ( (coin= LP_coinfind(symbol)) == 0 || coin->inactive != 0 ) From 220343b56f778033ed82dc45e2a880201075e71a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:11:19 +0300 Subject: [PATCH 036/176] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/parselog | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100755 iguana/exchanges/parselog diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 078bfebb3..26e27e7b0 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -214,7 +214,7 @@ stop()\n\ { return(LP_portfolio()); } - else if ( strcmp(method,"") == 0 ) + else if ( strcmp(method,"parselog") == 0 ) return(LP_statslog_parse()); else if ( strcmp(method,"secretaddresses") == 0 ) { diff --git a/iguana/exchanges/parselog b/iguana/exchanges/parselog new file mode 100755 index 000000000..c594944e9 --- /dev/null +++ b/iguana/exchanges/parselog @@ -0,0 +1,3 @@ +#!/bin/bash +source userpass +curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"parselog\"}" From 07df88b9938dd215d7c523806e0260620be0606b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:27:22 +0300 Subject: [PATCH 037/176] Test --- iguana/exchanges/LP_commands.c | 2 ++ iguana/exchanges/LP_stats.c | 36 ++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 26e27e7b0..9674d95a3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -104,6 +104,8 @@ goal(coin=*, val=)\n\ myprice(base, rel)\n\ enable(coin)\n\ disable(coin)\n\ +notarizations(coin)\n\ +parselog()\n\ getrawtransaction(coin, txid)\n\ inventory(coin)\n\ bestfit(rel, relvolume)\n\ diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 10bc0ce55..082c7e2fd 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,12 +38,43 @@ void LP_tradecommand_log(cJSON *argjson) } } +uint32_t LP_requests,LP_requesteds,LP_connects,LP_connecteds,LP_tradestatuses,LP_unknowns; + +void LP_statslog_parseline(cJSON *lineobj) +{ + char *method; + if ( (method= jstr(lineobj,"method")) != 0 ) + { + if ( strcmp(method,"request") == 0 ) + LP_requests++; + else if ( strcmp(method,"requested") == 0 ) + LP_requesteds++; + if ( strcmp(method,"connect") == 0 ) + LP_connects++; + else if ( strcmp(method,"connected") == 0 ) + LP_connecteds++; + else if ( strcmp(method,"tradestatus") == 0 ) + LP_tradestatuses++; + else + { + LP_unknowns++; + printf("parseline unknown method.(%s)\n",jprint(lineobj,0)); + } + } else printf("parseline no method.(%s)\n",jprint(lineobj,0)); +} + char *LP_statslog_disp(int32_t n) { cJSON *retjson; retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddnum(retjson,"newlines",n); + jaddnum(retjson,"request",LP_requests); + jaddnum(retjson,"requested",LP_requesteds); + jaddnum(retjson,"connect",LP_connects); + jaddnum(retjson,"connected",LP_connecteds); + jaddnum(retjson,"tradestatus",LP_tradestatuses); + jaddnum(retjson,"unknown",LP_unknowns); return(jprint(retjson,1)); } @@ -60,7 +91,7 @@ char *LP_statslog_parse() else { fclose(fp); - return(clonestr("{\"result\":\"success\"}")); + return(clonestr("{\"result\":\"success\",\"newlines\":0}")); } } while ( fgets(line,sizeof(line),fp) > 0 ) @@ -69,7 +100,8 @@ char *LP_statslog_parse() if ( (lineobj= cJSON_Parse(line)) != 0 ) { n++; - printf("%s\n",jprint(lineobj,0)); + LP_statslog_parseline(lineobj); + //printf("%s\n",jprint(lineobj,0)); free_json(lineobj); } } From ea50361704520cb54fd369a9f51754b881052204 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:32:26 +0300 Subject: [PATCH 038/176] Test --- iguana/exchanges/LP_remember.c | 1 + iguana/exchanges/LP_stats.c | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 59361bd37..3a68982ae 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -1110,6 +1110,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti jaddstr(item,"method","tradestatus"); itemstr = jprint(item,0); fprintf(fp,"%s\n",itemstr); + LP_tradecommand_log(item); LP_reserved_msg(rswap.src,rswap.dest,zero,clonestr(itemstr)); LP_broadcast_message(LP_mypubsock,rswap.src,rswap.dest,zero,itemstr); fclose(fp); diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 082c7e2fd..8644b9f3c 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,7 +38,7 @@ void LP_tradecommand_log(cJSON *argjson) } } -uint32_t LP_requests,LP_requesteds,LP_connects,LP_connecteds,LP_tradestatuses,LP_unknowns; +uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_unknowns; void LP_statslog_parseline(cJSON *lineobj) { @@ -47,8 +47,8 @@ void LP_statslog_parseline(cJSON *lineobj) { if ( strcmp(method,"request") == 0 ) LP_requests++; - else if ( strcmp(method,"requested") == 0 ) - LP_requesteds++; + else if ( strcmp(method,"reserved") == 0 ) + LP_reserveds++; if ( strcmp(method,"connect") == 0 ) LP_connects++; else if ( strcmp(method,"connected") == 0 ) @@ -58,7 +58,7 @@ void LP_statslog_parseline(cJSON *lineobj) else { LP_unknowns++; - printf("parseline unknown method.(%s)\n",jprint(lineobj,0)); + printf("parseline unknown method.(%s) (%s)\n",method,jprint(lineobj,0)); } } else printf("parseline no method.(%s)\n",jprint(lineobj,0)); } @@ -70,7 +70,7 @@ char *LP_statslog_disp(int32_t n) jaddstr(retjson,"result","success"); jaddnum(retjson,"newlines",n); jaddnum(retjson,"request",LP_requests); - jaddnum(retjson,"requested",LP_requesteds); + jaddnum(retjson,"reserved",LP_reserveds); jaddnum(retjson,"connect",LP_connects); jaddnum(retjson,"connected",LP_connecteds); jaddnum(retjson,"tradestatus",LP_tradestatuses); From 9a3abf84a120cbaa841a8608aa4187259f67ff76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:33:44 +0300 Subject: [PATCH 039/176] Test --- iguana/exchanges/LP_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 8644b9f3c..06e5c4597 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -49,7 +49,7 @@ void LP_statslog_parseline(cJSON *lineobj) LP_requests++; else if ( strcmp(method,"reserved") == 0 ) LP_reserveds++; - if ( strcmp(method,"connect") == 0 ) + else if ( strcmp(method,"connect") == 0 ) LP_connects++; else if ( strcmp(method,"connected") == 0 ) LP_connecteds++; From f96f67705a834da85e5881016244a15a32428449 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:42:21 +0300 Subject: [PATCH 040/176] Test --- iguana/exchanges/LP_commands.c | 3 +++ iguana/exchanges/statsdisp | 3 +++ 2 files changed, 6 insertions(+) create mode 100755 iguana/exchanges/statsdisp diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9674d95a3..f2c641d94 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -106,6 +106,7 @@ enable(coin)\n\ disable(coin)\n\ notarizations(coin)\n\ parselog()\n\ +statsdisp()\n\ getrawtransaction(coin, txid)\n\ inventory(coin)\n\ bestfit(rel, relvolume)\n\ @@ -218,6 +219,8 @@ stop()\n\ } else if ( strcmp(method,"parselog") == 0 ) return(LP_statslog_parse()); + else if ( strcmp(method,"statsdisp") == 0 ) + return(LP_statslog_disp(0)); else if ( strcmp(method,"secretaddresses") == 0 ) { uint8_t taddr,pubtype; diff --git a/iguana/exchanges/statsdisp b/iguana/exchanges/statsdisp new file mode 100755 index 000000000..d322235a2 --- /dev/null +++ b/iguana/exchanges/statsdisp @@ -0,0 +1,3 @@ +#!/bin/bash +source userpass +curl --url "http://127.0.0.1:7783" --data "{\"userpass\":\"$userpass\",\"method\":\"statsdisp\"}" From da65a390e93238a5e897593d11804098325e84ba Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:52:42 +0300 Subject: [PATCH 041/176] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_stats.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index e418a2b47..7bdddd748 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -288,6 +288,7 @@ struct LP_pubkeyinfo int32_t LP_pubkey_sigcheck(struct LP_pubkeyinfo *pubp,cJSON *item); int32_t LP_pubkey_sigadd(cJSON *item,uint32_t timestamp,bits256 priv,bits256 pub,uint8_t *rmd160,uint8_t *pubsecp); +int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson); struct LP_address *LP_address(struct iguana_info *coin,char *coinaddr); void LP_swap_coinaddr(struct iguana_info *coin,char *coinaddr,uint64_t *valuep,uint8_t *data,int32_t datalen,int32_t vout); void basilisk_dontforget_update(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx); diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 06e5c4597..adc14b7ff 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,11 +38,11 @@ void LP_tradecommand_log(cJSON *argjson) } } -uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_unknowns; +uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns; void LP_statslog_parseline(cJSON *lineobj) { - char *method; + char *method; struct LP_quoteinfo Q; if ( (method= jstr(lineobj,"method")) != 0 ) { if ( strcmp(method,"request") == 0 ) @@ -52,7 +52,18 @@ void LP_statslog_parseline(cJSON *lineobj) else if ( strcmp(method,"connect") == 0 ) LP_connects++; else if ( strcmp(method,"connected") == 0 ) + { LP_connecteds++; + if ( LP_quoteparse(&Q,lineobj) < 0 ) + { + printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); + LP_parse_errors++; + } + else + { + printf("connected requestid.%u quoteid.%u\n",Q.R.requestid,Q.R.quoteid); + } + } else if ( strcmp(method,"tradestatus") == 0 ) LP_tradestatuses++; else @@ -73,6 +84,7 @@ char *LP_statslog_disp(int32_t n) jaddnum(retjson,"reserved",LP_reserveds); jaddnum(retjson,"connect",LP_connects); jaddnum(retjson,"connected",LP_connecteds); + jaddnum(retjson,"parse_errors",LP_parse_errors); jaddnum(retjson,"tradestatus",LP_tradestatuses); jaddnum(retjson,"unknown",LP_unknowns); return(jprint(retjson,1)); From fe053423cffebc6cc979a2ec4488adfb93ae684f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:56:35 +0300 Subject: [PATCH 042/176] Test --- iguana/exchanges/LP_signatures.c | 4 ++-- iguana/exchanges/LP_stats.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 34fe9ca32..4bc33de4d 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -125,7 +125,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->desttxfee = j64bits(argjson,"desttxfee"); qp->R.requestid = juint(argjson,"requestid"); qp->R.quoteid = juint(argjson,"quoteid"); - if ( qp->R.requestid != (rid= basilisk_requestid(&qp->R)) ) + /*if ( qp->R.requestid != (rid= basilisk_requestid(&qp->R)) ) { printf("requestid.%u -> %u\n",qp->R.requestid,rid); qp->R.requestid = rid; @@ -134,7 +134,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) { printf("quoteid.%u -> %u\n",qp->R.quoteid,qid); qp->R.quoteid = qid; - } + }*/ return(0); } diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index adc14b7ff..330ea60d8 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -54,6 +54,7 @@ void LP_statslog_parseline(cJSON *lineobj) else if ( strcmp(method,"connected") == 0 ) { LP_connecteds++; + memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); From b6e1b459faccd84696710293f4c8970418c057ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 19:57:45 +0300 Subject: [PATCH 043/176] Test --- iguana/exchanges/LP_signatures.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 4bc33de4d..2e62cb482 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -125,16 +125,18 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->desttxfee = j64bits(argjson,"desttxfee"); qp->R.requestid = juint(argjson,"requestid"); qp->R.quoteid = juint(argjson,"quoteid"); - /*if ( qp->R.requestid != (rid= basilisk_requestid(&qp->R)) ) + if ( qp->R.requestid == 0 ) { + rid= basilisk_requestid(&qp->R); printf("requestid.%u -> %u\n",qp->R.requestid,rid); qp->R.requestid = rid; } - if ( qp->R.quoteid != (qid= basilisk_quoteid(&qp->R)) ) + if ( qp->R.quoteid == 0 ) { + qid= basilisk_quoteid(&qp->R); printf("quoteid.%u -> %u\n",qp->R.quoteid,qid); qp->R.quoteid = qid; - }*/ + } return(0); } From 526b3ed0222f9a622c4a22b3cf3bc5c88a4c428b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 20:05:35 +0300 Subject: [PATCH 044/176] Test --- iguana/exchanges/LP_signatures.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 2e62cb482..7dd0fdf55 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -128,13 +128,13 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) if ( qp->R.requestid == 0 ) { rid= basilisk_requestid(&qp->R); - printf("requestid.%u -> %u\n",qp->R.requestid,rid); + //printf("requestid.%u -> %u\n",qp->R.requestid,rid); qp->R.requestid = rid; } if ( qp->R.quoteid == 0 ) { qid= basilisk_quoteid(&qp->R); - printf("quoteid.%u -> %u\n",qp->R.quoteid,qid); + //printf("quoteid.%u -> %u\n",qp->R.quoteid,qid); qp->R.quoteid = qid; } return(0); From 559b6834d3ce9449b8ba44e4c15bddcf482c9f81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 20:15:54 +0300 Subject: [PATCH 045/176] Test --- iguana/exchanges/LP_stats.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 330ea60d8..94cdd655d 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,11 +38,12 @@ void LP_tradecommand_log(cJSON *argjson) } } -uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns; +uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates; +uint64_t Ridqids[128]; void LP_statslog_parseline(cJSON *lineobj) { - char *method; struct LP_quoteinfo Q; + char *method; int32_t i,duplicate; struct LP_quoteinfo Q; uint64_t ridqid; if ( (method= jstr(lineobj,"method")) != 0 ) { if ( strcmp(method,"request") == 0 ) @@ -53,7 +54,6 @@ void LP_statslog_parseline(cJSON *lineobj) LP_connects++; else if ( strcmp(method,"connected") == 0 ) { - LP_connecteds++; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -62,8 +62,23 @@ void LP_statslog_parseline(cJSON *lineobj) } else { - printf("connected requestid.%u quoteid.%u\n",Q.R.requestid,Q.R.quoteid); + ridqid = (((uint64_t)Q.R.requestid << 32) | Q.R.quoteid); + for (i=duplicate=0; i Date: Tue, 24 Oct 2017 20:18:19 +0300 Subject: [PATCH 046/176] Test --- iguana/exchanges/LP_stats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 94cdd655d..41c2e308e 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -75,7 +75,7 @@ void LP_statslog_parseline(cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_connecteds % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; - printf("connected requestid.%u quoteid.%u\n",Q.R.requestid,Q.R.quoteid); + printf("connected requestid.%u quoteid.%u -> %d\n",Q.R.requestid,Q.R.quoteid,(int32_t)(LP_connecteds % (sizeof(Ridqids)/sizeof(*Ridqids)))); } } LP_connecteds++; @@ -102,7 +102,7 @@ char *LP_statslog_disp(int32_t n) jaddnum(retjson,"connected",LP_connecteds); jaddnum(retjson,"duplicates",LP_duplicates); jaddnum(retjson,"parse_errors",LP_parse_errors); - jaddnum(retjson,"uniqes",LP_connecteds-LP_duplicates); + jaddnum(retjson,"uniques",LP_connecteds-LP_duplicates); jaddnum(retjson,"tradestatus",LP_tradestatuses); jaddnum(retjson,"unknown",LP_unknowns); return(jprint(retjson,1)); From dd117d47f1de57792da5f16fa5bb332b4f95b710 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 20:59:02 +0300 Subject: [PATCH 047/176] Test --- iguana/exchanges/LP_signatures.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 7dd0fdf55..703f70c5b 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -348,7 +348,15 @@ struct LP_utxos_qitem { struct queueitem DL; cJSON *argjson; }; char *LP_postutxos_recv(cJSON *argjson) { - struct LP_utxos_qitem *uitem; bits256 utxoshash; cJSON *obj; + struct LP_utxos_qitem *uitem; struct iguana_info *coin; char *coinaddr,*symbol; bits256 utxoshash; cJSON *obj; + if ( (coinaddr= jstr(argjson,"coinaddr")) != 0 && (symbol= jstr(argjson,"coin")) != 0 && (coin= LP_coinfind(symbol)) != 0 ) + { + if ( strcmp(coinaddr,coin->smartaddr) == 0 ) + { + printf("ignore my utxo from external source %s %s\n",symbol,coinaddr); + return(clonestr("{\"result\":\"success\"}")); + } + } if ( (obj= jobj(argjson,"utxos")) != 0 ) { utxoshash = LP_utxoshash_calc(obj); @@ -602,16 +610,18 @@ void LP_smartutxos_push(struct iguana_info *coin) char *LP_uitem_recv(cJSON *argjson) { - bits256 txid; int32_t vout,height; uint64_t value; char *coinaddr,*symbol; + bits256 txid; int32_t vout,height; uint64_t value; struct iguana_info *coin; char *coinaddr,*symbol; txid = jbits256(argjson,"txid"); vout = jint(argjson,"vout"); height = jint(argjson,"ht"); value = j64bits(argjson,"value"); coinaddr = jstr(argjson,"coinaddr"); - if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 ) + if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 && (coin= LP_coinfind(symbol)) != 0 ) { //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",symbol,coinaddr,bits256_str(str,txid),vout,dstr(value),height); - LP_address_utxoadd("LP_uitem,recv",LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); + if ( strcmp(coin->smartaddr,coinaddr) != 0 ) + LP_address_utxoadd("LP_uitem,recv",coin,coinaddr,txid,vout,value,height,-1); + else printf("ignore external uitem %s %s\n",symbol,coin->smartaddr); } return(clonestr("{\"result\":\"success\"}")); } From f3fcd4aa755d01998d00c890223a5a035af4ceec Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:05:57 +0300 Subject: [PATCH 048/176] Test --- iguana/exchanges/LP_stats.c | 65 ++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 41c2e308e..6bb3fa3f1 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,12 +38,43 @@ void LP_tradecommand_log(cJSON *argjson) } } -uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates; +uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_numridqids; uint64_t Ridqids[128]; +int32_t LP_statslog_parsequote(cJSON *lineobj) +{ + int32_t i,duplicate=0; struct LP_quoteinfo Q; uint64_t ridqid; + memset(&Q,0,sizeof(Q)); + if ( LP_quoteparse(&Q,lineobj) < 0 ) + { + printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); + LP_parse_errors++; + } + else + { + ridqid = (((uint64_t)Q.R.requestid << 32) | Q.R.quoteid); + for (i=0; i %d\n",Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids)))); + } + } + return(duplicate == 0); +} + void LP_statslog_parseline(cJSON *lineobj) { - char *method; int32_t i,duplicate; struct LP_quoteinfo Q; uint64_t ridqid; + char *method; if ( (method= jstr(lineobj,"method")) != 0 ) { if ( strcmp(method,"request") == 0 ) @@ -51,33 +82,13 @@ void LP_statslog_parseline(cJSON *lineobj) else if ( strcmp(method,"reserved") == 0 ) LP_reserveds++; else if ( strcmp(method,"connect") == 0 ) + { + LP_statslog_parsequote(lineobj); LP_connects++; + } else if ( strcmp(method,"connected") == 0 ) { - memset(&Q,0,sizeof(Q)); - if ( LP_quoteparse(&Q,lineobj) < 0 ) - { - printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); - LP_parse_errors++; - } - else - { - ridqid = (((uint64_t)Q.R.requestid << 32) | Q.R.quoteid); - for (i=duplicate=0; i %d\n",Q.R.requestid,Q.R.quoteid,(int32_t)(LP_connecteds % (sizeof(Ridqids)/sizeof(*Ridqids)))); - } - } + LP_statslog_parsequote(lineobj); LP_connecteds++; } else if ( strcmp(method,"tradestatus") == 0 ) @@ -102,7 +113,7 @@ char *LP_statslog_disp(int32_t n) jaddnum(retjson,"connected",LP_connecteds); jaddnum(retjson,"duplicates",LP_duplicates); jaddnum(retjson,"parse_errors",LP_parse_errors); - jaddnum(retjson,"uniques",LP_connecteds-LP_duplicates); + jaddnum(retjson,"uniques",LP_numridqids); jaddnum(retjson,"tradestatus",LP_tradestatuses); jaddnum(retjson,"unknown",LP_unknowns); return(jprint(retjson,1)); From 0b02309a32feb8ca3fa694e10be7cda9d08bcec9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:09:43 +0300 Subject: [PATCH 049/176] Test --- iguana/exchanges/LP_stats.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 6bb3fa3f1..989fc96ae 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -39,9 +39,9 @@ void LP_tradecommand_log(cJSON *argjson) } uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_numridqids; -uint64_t Ridqids[128]; +uint64_t Ridqids[16]; -int32_t LP_statslog_parsequote(cJSON *lineobj) +int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { int32_t i,duplicate=0; struct LP_quoteinfo Q; uint64_t ridqid; memset(&Q,0,sizeof(Q)); @@ -66,7 +66,7 @@ int32_t LP_statslog_parsequote(cJSON *lineobj) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; LP_numridqids++; - printf("connected requestid.%u quoteid.%u -> %d\n",Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids)))); + printf("%10s requestid.%-10u quoteid.%-10u -> %d\n",method,Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids)))); } } return(duplicate == 0); @@ -83,12 +83,12 @@ void LP_statslog_parseline(cJSON *lineobj) LP_reserveds++; else if ( strcmp(method,"connect") == 0 ) { - LP_statslog_parsequote(lineobj); + LP_statslog_parsequote(method,lineobj); LP_connects++; } else if ( strcmp(method,"connected") == 0 ) { - LP_statslog_parsequote(lineobj); + LP_statslog_parsequote(method,lineobj); LP_connecteds++; } else if ( strcmp(method,"tradestatus") == 0 ) From b6dc3c5dccf26637187f493f00b39d2e7acbb491 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:12:23 +0300 Subject: [PATCH 050/176] Test --- iguana/exchanges/LP_stats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 989fc96ae..8cfd5868c 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -39,7 +39,7 @@ void LP_tradecommand_log(cJSON *argjson) } uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_numridqids; -uint64_t Ridqids[16]; +uint64_t Ridqids[128]; int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { @@ -66,7 +66,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; LP_numridqids++; - printf("%10s requestid.%-10u quoteid.%-10u -> %d\n",method,Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids)))); + char str[65]; printf("%10s requestid.%-10u quoteid.%-10u -> %d %s/v%d\n",method,Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,jbits256(lineobj,"desttxid")),jint(lineobj,"destvout")); } } return(duplicate == 0); From 9507067022c347a3027566c5df8061b9602c085d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:21:24 +0300 Subject: [PATCH 051/176] Test --- iguana/exchanges/LP_stats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 8cfd5868c..e4c072493 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -52,7 +52,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) } else { - ridqid = (((uint64_t)Q.R.requestid << 32) | Q.R.quoteid); + ridqid = (((uint64_t)Q.desttxid.uints[0] << 48) | ((uint64_t)Q.destvout << 32) || ((uint64_t)Q.feetxid.uints[0] << 16) | (uint32_t)Q.feevout); for (i=0; i %d %s/v%d\n",method,Q.R.requestid,Q.R.quoteid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,jbits256(lineobj,"desttxid")),jint(lineobj,"destvout")); + char str[65]; printf("%10s ridqid.%-16llx -> %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,jbits256(lineobj,"desttxid")),jint(lineobj,"destvout")); } } return(duplicate == 0); From b4879162337d8bc823a5b2354e78a08aff36db2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:34:21 +0300 Subject: [PATCH 052/176] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_stats.c | 10 +++++++--- iguana/exchanges/LP_transaction.c | 2 +- iguana/exchanges/LP_utxo.c | 17 +++++++++++++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c999fe346..71a5eeefc 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -272,7 +272,7 @@ struct LP_utxoinfo *LP_address_utxopair(int32_t iambob,struct LP_address_utxo ** struct LP_address *ap; uint64_t targetval,targetval2; int32_t m,mini; struct LP_address_utxo *up,*up2; struct LP_utxoinfo *utxo = 0; if ( coin != 0 && (ap= LP_addressfind(coin,coinaddr)) != 0 ) { - if ( (m= LP_address_utxo_ptrs(iambob,utxos,max,ap,coinaddr)) > 1 ) + if ( (m= LP_address_utxo_ptrs(coin,iambob,utxos,max,ap,coinaddr)) > 1 ) { targetval = LP_basesatoshis(relvolume,price,txfee,desttxfee); if ( 0 ) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index e4c072493..3e9510754 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -43,7 +43,7 @@ uint64_t Ridqids[128]; int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - int32_t i,duplicate=0; struct LP_quoteinfo Q; uint64_t ridqid; + int32_t i,destvout,feevout,duplicate=0; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -52,7 +52,11 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) } else { - ridqid = (((uint64_t)Q.desttxid.uints[0] << 48) | ((uint64_t)Q.destvout << 32) || ((uint64_t)Q.feetxid.uints[0] << 16) | (uint32_t)Q.feevout); + desttxid = jbits256(lineobj,"desttxid"); + destvout = jint(lineobj,"destvout"); + feetxid = jbits256(lineobj,"feetxid"); + feevout = jint(lineobj,"feevout"); + ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) || ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,jbits256(lineobj,"desttxid")),jint(lineobj,"destvout")); + char str[65]; printf("%10s ridqid.%-16llx -> %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,desttxid),destvout); } } return(duplicate == 0); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index b72cb111a..b1ad63380 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -955,7 +955,7 @@ char *LP_createrawtransaction(cJSON **txobjp,int32_t *numvinsp,struct iguana_inf return(0); } memset(utxos,0,sizeof(utxos)); - if ( (numutxos= LP_address_utxo_ptrs(0,utxos,max,ap,coin->smartaddr)) <= 0 ) + if ( (numutxos= LP_address_utxo_ptrs(coin,0,utxos,max,ap,coin->smartaddr)) <= 0 ) { printf("LP_createrawtransaction: address_utxo_ptrs %d, error\n",numutxos); return(0); diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 3ed28c5b3..bada9ffe2 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -138,9 +138,9 @@ struct LP_utxoinfo *LP_allocated(bits256 txid,int32_t vout) return(0); } -int32_t LP_address_utxo_ptrs(int32_t iambob,struct LP_address_utxo **utxos,int32_t max,struct LP_address *ap,char *coinaddr) +int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_address_utxo **utxos,int32_t max,struct LP_address *ap,char *coinaddr) { - struct LP_address_utxo *up,*tmp; int32_t n = 0; + struct LP_address_utxo *up,*tmp; struct LP_transaction *tx; cJSON *txout; int32_t n = 0; //printf("LP_address_utxo_ptrs for (%s).(%s)\n",ap->coinaddr,coinaddr); if ( strcmp(ap->coinaddr,coinaddr) != 0 ) printf("UNEXPECTED coinaddr mismatch (%s) != (%s)\n",ap->coinaddr,coinaddr); @@ -150,6 +150,19 @@ int32_t LP_address_utxo_ptrs(int32_t iambob,struct LP_address_utxo **utxos,int32 //char str[65]; printf("LP_address_utxo_ptrs %s n.%d %.8f %s v%d spendheight.%d allocated.%p\n",ap->coinaddr,n,dstr(up->U.value),bits256_str(str,up->U.txid),up->U.vout,up->spendheight,LP_allocated(up->U.txid,up->U.vout)); if ( up->spendheight <= 0 ) { + if ( coin->electrum == 0 ) + { + if ( (txout= LP_gettxout(coin->symbol,coinaddr,up->U.txid,up->U.vout)) != 0 ) + free_json(txout); + else + { + char str[65]; printf("%s %s payment %s/v%d is spent\n",coin->symbol,coinaddr,bits256_str(str,up->U.txid),up->U.vout); + up->spendheight = 1; + if ( (tx= LP_transactionfind(coin,up->U.txid)) != 0 && up->U.vout < tx->numvouts ) + tx->outpoints[up->U.vout].spendheight = 1; + continue; + } + } if ( LP_allocated(up->U.txid,up->U.vout) == 0 ) { utxos[n++] = up; From 9e35b677f9a29d1b0eb54ab5693d53d433c65d0a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:36:44 +0300 Subject: [PATCH 053/176] Test --- iguana/exchanges/LP_signatures.c | 2 +- iguana/exchanges/LP_stats.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 703f70c5b..64a6fe72e 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -353,7 +353,7 @@ char *LP_postutxos_recv(cJSON *argjson) { if ( strcmp(coinaddr,coin->smartaddr) == 0 ) { - printf("ignore my utxo from external source %s %s\n",symbol,coinaddr); + //printf("ignore my utxo from external source %s %s\n",symbol,coinaddr); return(clonestr("{\"result\":\"success\"}")); } } diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 3e9510754..2b195e146 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -56,6 +56,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) destvout = jint(lineobj,"destvout"); feetxid = jbits256(lineobj,"feetxid"); feevout = jint(lineobj,"feevout"); + printf("%s\n",jprint(lineobj,0)); ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) || ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i Date: Tue, 24 Oct 2017 21:42:13 +0300 Subject: [PATCH 054/176] Test --- iguana/exchanges/LP_stats.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 2b195e146..076f97005 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -52,11 +52,12 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) } else { + char str[65],str2[65]; desttxid = jbits256(lineobj,"desttxid"); destvout = jint(lineobj,"destvout"); feetxid = jbits256(lineobj,"feetxid"); feevout = jint(lineobj,"feevout"); - printf("%s\n",jprint(lineobj,0)); + printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) || ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,desttxid),destvout); + printf("%10s ridqid.%-16llx -> %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,desttxid),destvout); } } return(duplicate == 0); From 8d5e11479055450849dbb82bfd1887ecd3917bc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:44:01 +0300 Subject: [PATCH 055/176] test --- iguana/exchanges/LP_stats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 076f97005..d2f6e80d2 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -58,7 +58,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) feetxid = jbits256(lineobj,"feetxid"); feevout = jint(lineobj,"feevout"); printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); - ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) || ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); + ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,desttxid),destvout); + LP_numridqids++; } } return(duplicate == 0); From 315b351d70918d6e573d15857a8591ec1ef0ee1d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:51:16 +0300 Subject: [PATCH 056/176] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_socket.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 7bdddd748..6bb3e54a5 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -193,6 +193,7 @@ struct iguana_info void *electrum; void *ctx; uint64_t maxamount,kmd_equiv,balanceA,balanceB,valuesumA,valuesumB; uint8_t pubkey33[33]; + bits256 cachedtxid; uint8_t *cachedtxiddata; int32_t cachedtxidlen; }; struct _LP_utxoinfo { bits256 txid; uint64_t value; int32_t vout,height; }; diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index c5e16dd47..f00d83a07 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -597,6 +597,14 @@ cJSON *electrum_transaction(char *symbol,struct electrum_info *ep,cJSON **retjso return(txobj); } } + if ( bits256_cmp(txid,coin->cachedtxid) == 0 ) + { + if ( (txobj= LP_transaction_fromdata(coin,txid,coin->cachedtxiddata,coin->cachedtxidlen)) != 0 ) + { + *retjsonp = txobj; + return(txobj); + } + } hexjson = electrum_hasharg(symbol,ep,&hexjson,"blockchain.transaction.get",txid,ELECTRUM_TIMEOUT); hexstr = jprint(hexjson,0); if ( strlen(hexstr) > 60000 ) @@ -615,7 +623,12 @@ cJSON *electrum_transaction(char *symbol,struct electrum_info *ep,cJSON **retjso { len = (int32_t)strlen(hexstr+1) >> 1; serialized = malloc(len); + if ( coin->cachedtxiddata != 0 ) + free(coin->cachedtxiddata); + coin->cachedtxiddata = malloc(len); + coin->cachedtxidlen = len; decode_hex(serialized,len,hexstr+1); + memcpy(coin->cachedtxiddata,serialized,len); free(hexstr); //printf("DATA.(%s) from (%s)\n",hexstr+1,jprint(hexjson,0)); txobj = LP_transaction_fromdata(coin,txid,serialized,len); From e12b514e1ce2f2010bb871bbbf03fac2b3b646e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 21:52:59 +0300 Subject: [PATCH 057/176] Test --- iguana/exchanges/LP_stats.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index d2f6e80d2..a0cadda7e 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -52,12 +52,12 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) } else { - char str[65],str2[65]; + char str[65]; desttxid = jbits256(lineobj,"desttxid"); destvout = jint(lineobj,"destvout"); feetxid = jbits256(lineobj,"feetxid"); feevout = jint(lineobj,"feevout"); - printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); + //printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i Date: Tue, 24 Oct 2017 21:59:25 +0300 Subject: [PATCH 058/176] Test --- iguana/exchanges/LP_stats.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index a0cadda7e..5d6d91e97 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -43,20 +43,32 @@ uint64_t Ridqids[128]; int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - int32_t i,destvout,feevout,duplicate=0; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; + double qprice; int32_t i,destvout,feevout,duplicate=0; char *base,*rel; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); LP_parse_errors++; + return(-1); } else { - char str[65]; + base = jstr(lineobj,"base"); + rel = jstr(lineobj,"rel"); + satoshis = j64bits(lineobj,"satoshis"); + if ( base == 0 || rel == 0 || satoshis == 0 ) + { + printf("quoteparse_error.(%s)\n",jprint(lineobj,0)); + LP_parse_errors++; + return(-1); + } + txfee = j64bits(lineobj,"txfee"); + destsatoshis = j64bits(lineobj,"destsatoshis"); desttxid = jbits256(lineobj,"desttxid"); destvout = jint(lineobj,"destvout"); feetxid = jbits256(lineobj,"feetxid"); feevout = jint(lineobj,"feevout"); + qprice = ((double)destsatoshis / (satoshis - txfee)); //printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); for (i=0; i %d %s/v%d\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),bits256_str(str,desttxid),destvout); + printf("%10s ridqid.%-16llx -> [%d] %.8f %s -> %.8f %s %.8f\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From 7b4ccb2560e46c49dd1275298137534fb8260124 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:09:44 +0300 Subject: [PATCH 059/176] Test --- iguana/exchanges/LP_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 5d6d91e97..57d088e16 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -83,7 +83,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; - printf("%10s ridqid.%-16llx -> [%d] %.8f %s -> %.8f %s %.8f\n",method,(long long)ridqid,(int32_t)(LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))),dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%-4d %8s ridqid.%-16llx -> %.8f %5s -> %.8f %5s %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From f5364496af23f37555fa9fad8e612dae2726fd84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:11:52 +0300 Subject: [PATCH 060/176] Test --- iguana/exchanges/LP_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 57d088e16..513804070 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -83,7 +83,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; - printf("%-4d %8s ridqid.%-16llx -> %.8f %5s -> %.8f %5s %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%-4d %9s swap.%-16llx -> %.8f %5s -> %.8f %5s %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From 9d142be4a4f02cf797c3fdf327f76fb510c34aff Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:15:45 +0300 Subject: [PATCH 061/176] Test --- iguana/exchanges/LP_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 513804070..869f93dd2 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -83,7 +83,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; - printf("%-4d %9s swap.%-16llx -> %.8f %5s -> %.8f %5s %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From 900f1504b9ef4d5056eb36d8cc4396a05019a405 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:21:37 +0300 Subject: [PATCH 062/176] Test --- iguana/exchanges/LP_stats.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 869f93dd2..72b25d4dd 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -43,7 +43,7 @@ uint64_t Ridqids[128]; int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - double qprice; int32_t i,destvout,feevout,duplicate=0; char *base,*rel; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; + double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -63,6 +63,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) return(-1); } txfee = j64bits(lineobj,"txfee"); + timestamp = juint(lineobj,"timestamp"); destsatoshis = j64bits(lineobj,"destsatoshis"); desttxid = jbits256(lineobj,"desttxid"); destvout = jint(lineobj,"destvout"); @@ -83,7 +84,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = ridqid; - printf("%-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%s %-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From a7651d88fe3a3799e3fe9b98fc3891e179f43c0f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:38:37 +0300 Subject: [PATCH 063/176] Test --- iguana/exchanges/LP_include.h | 4 ++-- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_remember.c | 7 +++++-- iguana/exchanges/LP_signatures.c | 2 ++ iguana/exchanges/LP_stats.c | 15 ++++++++++----- iguana/exchanges/LP_swap.c | 1 + 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 6bb3e54a5..ab48099b2 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -252,7 +252,7 @@ struct LP_quoteinfo { struct basilisk_request R; bits256 srchash,desthash,txid,txid2,desttxid,feetxid,privkey; - uint64_t satoshis,txfee,destsatoshis,desttxfee; + uint64_t satoshis,txfee,destsatoshis,desttxfee,aliceid; uint32_t timestamp,quotetime; int32_t vout,vout2,destvout,feevout,pair; char srccoin[16],coinaddr[64],destcoin[16],destaddr[64],gui[64]; }; @@ -272,7 +272,7 @@ struct basilisk_swap bits256 privkeys[INSTANTDEX_DECKSIZE]; struct basilisk_swapmessage *messages; int32_t nummessages,sentflag; char Bdeposit[64],Bpayment[64]; - uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint64_t aliceid,otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],persistent_other33[33],changermd160[20],pad[15],verifybuf[100000]; }; diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 71a5eeefc..33ccbb20e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -611,7 +611,7 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, LP_quoteparse(&Q,argjson); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis-2*Q.txfee,Q.destcoin,Q.destsatoshis-2*Q.desttxfee,Q.timestamp,Q.quotetime,DEXselector); LP_tradecommand_log(argjson); - printf("LP_tradecommand: check received method %s\n",method); + printf("LP_tradecommand: check received method %s aliceid.%u\n",method,(long long)Q.aliceid); retval = 1; if ( strcmp(method,"reserved") == 0 ) { diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 3a68982ae..669d55102 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -93,7 +93,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - fprintf(fp,"{\"src\":\"%s\",\"srcamount\":%.8f,\"dest\":\"%s\",\"destamount\":%.8f,\"requestid\":%u,\"quoteid\":%u,\"iambob\":%d,\"state\":%u,\"otherstate\":%u,\"expiration\":%u,\"dlocktime\":%u,\"plocktime\":%u,\"Atxfee\":%llu,\"Btxfee\":%llu",swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.requestid,swap->I.req.quoteid,swap->I.iambob,swap->I.statebits,swap->I.otherstatebits,swap->I.expiration,swap->bobdeposit.I.locktime,swap->bobpayment.I.locktime,(long long)swap->I.Atxfee,(long long)swap->I.Btxfee); + fprintf(fp,"{\"aliceid\":\"%llu\",\"src\":\"%s\",\"srcamount\":%.8f,\"dest\":\"%s\",\"destamount\":%.8f,\"requestid\":%u,\"quoteid\":%u,\"iambob\":%d,\"state\":%u,\"otherstate\":%u,\"expiration\":%u,\"dlocktime\":%u,\"plocktime\":%u,\"Atxfee\":%llu,\"Btxfee\":%llu",(long long)swap->aliceid,swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.requestid,swap->I.req.quoteid,swap->I.iambob,swap->I.statebits,swap->I.otherstatebits,swap->I.expiration,swap->bobdeposit.I.locktime,swap->bobpayment.I.locktime,(long long)swap->I.Atxfee,(long long)swap->I.Btxfee); if ( memcmp(zeroes,swap->I.secretAm,20) != 0 ) { init_hexbytes_noT(secretAmstr,swap->I.secretAm,20); @@ -463,7 +463,8 @@ void LP_totals_update(int32_t iambob,char *alicecoin,char *bobcoin,int64_t *KMDt struct LP_swap_remember { bits256 pubA0,pubB0,pubB1,privAm,privBn,paymentspent,Apaymentspent,depositspent,myprivs[2],txids[sizeof(txnames)/sizeof(*txnames)]; - uint64_t Atxfee,Btxfee,srcamount,destamount; int64_t values[sizeof(txnames)/sizeof(*txnames)]; + uint64_t Atxfee,Btxfee,srcamount,destamount,aliceid; + int64_t values[sizeof(txnames)/sizeof(*txnames)]; uint32_t requestid,quoteid,plocktime,dlocktime,expiration,state,otherstate; int32_t iambob,finishedflag,origfinishedflag,Predeemlen,Dredeemlen,sentflags[sizeof(txnames)/sizeof(*txnames)]; uint8_t secretAm[20],secretAm256[32],secretBn[20],secretBn256[32],Predeemscript[1024],Dredeemscript[1024],pubkey33[33],other33[33]; @@ -483,6 +484,7 @@ cJSON *LP_swap_json(struct LP_swap_remember *rswap) jaddstr(item,"alice",rswap->dest); jaddnum(item,"destamount",dstr(rswap->destamount)); jaddnum(item,"alicetxfee",dstr(rswap->Atxfee)); + jadd64bits(item,"aliceid",rswap->aliceid); array = cJSON_CreateArray(); for (i=0; iiambob = jint(item,"iambob"); + rswap->aliceid = j64bits(item,"aliceid"); if ( (secretstr= jstr(item,"secretAm")) != 0 && strlen(secretstr) == 40 ) decode_hex(rswap->secretAm,20,secretstr); if ( (secretstr= jstr(item,"secretAm256")) != 0 && strlen(secretstr) == 64 ) diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 64a6fe72e..97fad7b84 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -43,6 +43,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) { double price; cJSON *retjson = cJSON_CreateObject(); jaddstr(retjson,"gui",qp->gui[0] != 0 ? qp->gui : LP_gui); + jadd64bits(retjson,"aliceid",qp->aliceid); jaddstr(retjson,"base",qp->srccoin); jaddstr(retjson,"rel",qp->destcoin); if ( qp->coinaddr[0] != 0 ) @@ -107,6 +108,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) safecopy(qp->coinaddr,jstr(argjson,"address"),sizeof(qp->coinaddr)); safecopy(qp->destcoin,jstr(argjson,"rel"),sizeof(qp->destcoin)); safecopy(qp->destaddr,jstr(argjson,"destaddr"),sizeof(qp->destaddr)); + qp->aliceid = j64bits(argjson,"aliceid"); qp->timestamp = juint(argjson,"timestamp"); qp->quotetime = juint(argjson,"quotetime"); qp->txid = jbits256(argjson,"txid"); diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 72b25d4dd..c5e741116 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -41,9 +41,14 @@ void LP_tradecommand_log(cJSON *argjson) uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_numridqids; uint64_t Ridqids[128]; +uint64_t LP_aliceid_calc(bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout) +{ + return((((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout)); +} + int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t ridqid; + double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t aliceid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -71,10 +76,10 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) feevout = jint(lineobj,"feevout"); qprice = ((double)destsatoshis / (satoshis - txfee)); //printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); - ridqid = (((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout); + aliceid = LP_aliceid_calc(desttxid,destvout,feetxid,feevout); for (i=0; i (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),LP_numridqids,method,(long long)ridqid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = aliceid; + printf("%s %-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index d09439a94..6e7a8b7bc 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -1134,6 +1134,7 @@ struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 { struct basilisk_swap *swap; bits256 pubkey25519; uint8_t pubkey33[33]; swap = calloc(1,sizeof(*swap)); + swap->aliceid = LP_aliceid_calc(qp->desttxid,qp->destvout,qp->feetxid,qp->feevout); swap->I.req.quoteid = rp->quoteid; swap->ctx = bitcoin_ctx(); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); From 6dba9d1b987e9efb33d1e390114f3874424ca187 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:41:09 +0300 Subject: [PATCH 064/176] Test --- iguana/exchanges/LP_stats.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index c5e741116..d47a0033f 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -48,7 +48,7 @@ uint64_t LP_aliceid_calc(bits256 desttxid,int32_t destvout,bits256 feetxid,int32 int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t aliceid; + double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *gui,*base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t aliceid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -60,6 +60,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { base = jstr(lineobj,"base"); rel = jstr(lineobj,"rel"); + gui = jstr(lineobj,"gui"); satoshis = j64bits(lineobj,"satoshis"); if ( base == 0 || rel == 0 || satoshis == 0 ) { @@ -89,7 +90,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = aliceid; - printf("%s %-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%s %8s %-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),gui!=0?gui:"",LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From 23339d6359ea6785b23e99676684c5ab72e6d948 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:47:34 +0300 Subject: [PATCH 065/176] Test --- iguana/exchanges/LP_ordermatch.c | 10 +++++----- iguana/exchanges/LP_stats.c | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 33ccbb20e..66a2dbb04 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -371,8 +371,8 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJ retjson = LP_quotejson(qp); jaddstr(retjson,"method","connected"); jaddstr(retjson,"pair",pairstr); - jaddnum(retjson,"requestid",qp->R.requestid); - jaddnum(retjson,"quoteid",qp->R.quoteid); + //jaddnum(retjson,"requestid",qp->R.requestid); + //jaddnum(retjson,"quoteid",qp->R.quoteid); // LP_addsig char str[65]; printf("BOB pubsock.%d binds to %d (%s)\n",pubsock,pair,bits256_str(str,utxo->S.otherpubkey)); LP_reserved_msg(base,rel,utxo->S.otherpubkey,jprint(retjson,0)); @@ -529,10 +529,10 @@ char *LP_connectedalice(cJSON *argjson) // alice printf("alice pairstr.(%s) pairsock.%d\n",pairstr,pairsock); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) { + retjson = LP_quotejson(&Q); jaddstr(retjson,"result","success"); - jadd(retjson,"trade",LP_quotejson(&Q)); - jaddnum(retjson,"requestid",Q.R.requestid); - jaddnum(retjson,"quoteid",Q.R.quoteid); + //jaddnum(retjson,"requestid",Q.R.requestid); + //jaddnum(retjson,"quoteid",Q.R.quoteid); } else jaddstr(retjson,"error","couldnt aliceloop"); } else printf("connect error %s\n",nn_strerror(nn_errno())); printf("connected result.(%s)\n",jprint(retjson,0)); diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index d47a0033f..64b4a92de 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -99,7 +99,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) void LP_statslog_parseline(cJSON *lineobj) { - char *method; + char *method; cJSON *obj; if ( (method= jstr(lineobj,"method")) != 0 ) { if ( strcmp(method,"request") == 0 ) @@ -108,7 +108,9 @@ void LP_statslog_parseline(cJSON *lineobj) LP_reserveds++; else if ( strcmp(method,"connect") == 0 ) { - LP_statslog_parsequote(method,lineobj); + if ( (obj= jobj(lineobj,"trade")) == 0 ) + obj = lineobj; + LP_statslog_parsequote(method,obj); LP_connects++; } else if ( strcmp(method,"connected") == 0 ) From 42ffca6733b2378fa6fd8e138e0a0f8026f67986 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 22:55:25 +0300 Subject: [PATCH 066/176] Test --- iguana/exchanges/LP_utxo.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index bada9ffe2..6e7292c91 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -140,7 +140,7 @@ struct LP_utxoinfo *LP_allocated(bits256 txid,int32_t vout) int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_address_utxo **utxos,int32_t max,struct LP_address *ap,char *coinaddr) { - struct LP_address_utxo *up,*tmp; struct LP_transaction *tx; cJSON *txout; int32_t n = 0; + struct LP_address_utxo *up,*tmp; struct LP_transaction *tx; cJSON *txout; int32_t n = 0; char str[65]; //printf("LP_address_utxo_ptrs for (%s).(%s)\n",ap->coinaddr,coinaddr); if ( strcmp(ap->coinaddr,coinaddr) != 0 ) printf("UNEXPECTED coinaddr mismatch (%s) != (%s)\n",ap->coinaddr,coinaddr); @@ -156,13 +156,20 @@ int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_a free_json(txout); else { - char str[65]; printf("%s %s payment %s/v%d is spent\n",coin->symbol,coinaddr,bits256_str(str,up->U.txid),up->U.vout); + printf("LP_address_utxo_ptrs skips %s %s payment %s/v%d is spent\n",coin->symbol,coinaddr,bits256_str(str,up->U.txid),up->U.vout); up->spendheight = 1; if ( (tx= LP_transactionfind(coin,up->U.txid)) != 0 && up->U.vout < tx->numvouts ) tx->outpoints[up->U.vout].spendheight = 1; continue; } } + else + { + if ( up->SPV <= 0 || up->U.height == 0 ) + { + printf("LP_address_utxo_ptrs skips %s/v%u due to SPV.%d ht.%d\n",bits256_str(str,up->U.txid),up->U.vout,up->SPV,up->U.height); + } + } if ( LP_allocated(up->U.txid,up->U.vout) == 0 ) { utxos[n++] = up; From c45cc8c615f130cc137c0d7a54f6633291a25bb9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 23:01:39 +0300 Subject: [PATCH 067/176] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 66a2dbb04..03793b9eb 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -611,7 +611,7 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, LP_quoteparse(&Q,argjson); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis-2*Q.txfee,Q.destcoin,Q.destsatoshis-2*Q.desttxfee,Q.timestamp,Q.quotetime,DEXselector); LP_tradecommand_log(argjson); - printf("LP_tradecommand: check received method %s aliceid.%u\n",method,(long long)Q.aliceid); + printf("LP_tradecommand: check received method %s aliceid.%llx\n",method,(long long)Q.aliceid); retval = 1; if ( strcmp(method,"reserved") == 0 ) { From 58a5ee194de7e3ad26282c4e3ee9f53f6fbe66de Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 23:20:09 +0300 Subject: [PATCH 068/176] Test --- iguana/exchanges/LP_swap.c | 9 ++++++++- iguana/exchanges/LP_transaction.c | 6 ++++-- iguana/exchanges/LP_utxo.c | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 6e7a8b7bc..a7be85525 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -1123,9 +1123,16 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 swap->bobpayment.utxotxid = qp->txid, swap->bobpayment.utxovout = qp->vout; swap->bobdeposit.utxotxid = qp->txid2, swap->bobdeposit.utxovout = qp->vout2; swap->alicepayment.utxotxid = qp->desttxid, swap->alicepayment.utxovout = qp->destvout; + LP_mark_spent(swap->bobcoin.symbol,qp->txid,qp->vout); + LP_mark_spent(swap->bobcoin.symbol,qp->txid2,qp->vout2); + LP_mark_spent(swap->alicecoin.symbol,qp->desttxid,qp->destvout); if ( swap->I.iambob != 0 ) swap->otherfee.utxotxid = qp->feetxid, swap->otherfee.utxovout = qp->feevout; - else swap->myfee.utxotxid = qp->feetxid, swap->myfee.utxovout = qp->feevout; + else + { + swap->myfee.utxotxid = qp->feetxid, swap->myfee.utxovout = qp->feevout; + LP_mark_spent(swap->alicecoin.symbol,qp->feetxid,qp->feevout); + } char str[65],str2[65],str3[65]; printf("IAMBOB.%d %s %s %s\n",swap->I.iambob,bits256_str(str,qp->txid),bits256_str(str2,qp->txid2),bits256_str(str3,qp->feetxid)); return(swap); } diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index b1ad63380..96dcfa42a 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -604,6 +604,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t wiftaddr,uint8_ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,uint8_t wiftaddr,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,void *ctx,bits256 privkey,bits256 *privkey2p,uint8_t *redeemscript,int32_t redeemlen,uint8_t *userdata,int32_t userdatalen,bits256 utxotxid,int32_t utxovout,char *destaddr,uint8_t *pubkey33,int32_t finalseqid,uint32_t expiration,int64_t *destamountp,uint64_t satoshis,char *changeaddr,char *vinaddr,int32_t suppress_pubkeys) { char *rawtxbytes=0,*signedtx=0,str[65],tmpaddr[64],hexstr[999],wifstr[128],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*obj,*vouts,*item,*privkeys; int32_t completed,spendlen,n,ignore_cltverr=1; struct vin_info V[2]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value=0,change = 0; struct iguana_msgtx msgtx; struct iguana_info *coin; + LP_mark_spent(symbol,utxotxid,utxovout); if ( txfee > 0 && txfee < 10000 ) txfee = 10000; *destamountp = 0; @@ -1176,7 +1177,7 @@ int32_t basilisk_alicescript(uint8_t *redeemscript,int32_t *redeemlenp,uint8_t * return(n); } -char *basilisk_swap_Aspend(char *name,char *symbol,uint64_t Atxfee,uint8_t wiftaddr,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,void *ctx,bits256 privAm,bits256 privBn,bits256 utxotxid,int32_t vout,uint8_t pubkey33[33],uint32_t expiration,int64_t *destamountp,char *vinaddr) +char *basilisk_swap_Aspend(char *name,char *symbol,uint64_t Atxfee,uint8_t wiftaddr,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,void *ctx,bits256 privAm,bits256 privBn,bits256 utxotxid,int32_t utxovout,uint8_t pubkey33[33],uint32_t expiration,int64_t *destamountp,char *vinaddr) { char msigaddr[64],*signedtx = 0; int32_t spendlen,redeemlen; uint8_t tmp33[33],redeemscript[512],spendscript[128]; bits256 pubAm,pubBn,signedtxid; uint64_t txfee; if ( bits256_nonz(privAm) != 0 && bits256_nonz(privBn) != 0 ) @@ -1200,7 +1201,8 @@ char *basilisk_swap_Aspend(char *name,char *symbol,uint64_t Atxfee,uint8_t wifta txfee = LP_MIN_TXFEE; } //txfee = LP_txfee(symbol); - signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,vout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1); + signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,utxovout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1); + LP_mark_spent(symbol,utxotxid,utxovout); } return(signedtx); } diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 6e7292c91..89ac0aa72 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -198,6 +198,23 @@ struct LP_address_utxo *LP_address_utxofind(struct iguana_info *coin,char *coina return(0); } +void LP_mark_spent(char *symbol,bits256 txid,int32_t vout) +{ + struct iguana_info *coin; struct LP_transaction *tx; struct LP_address_utxo *up; + if ( (coin= LP_coinfind(symbol)) != 0 ) + { + if ( (tx= LP_transactionfind(coin,txid)) != 0 ) + { + if ( vout < tx->numvouts ) + { + tx->outpoints[vout].spendheight = 1; + if ( (up= LP_address_utxofind(coin,tx->outpoints[vout].coinaddr,txid,vout)) != 0 ) + up->spendheight = 1; + } + } + } +} + int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t height,int32_t spendheight) { struct LP_address *ap; cJSON *txobj; struct LP_address_utxo *up,*tmp; int32_t flag,retval = 0; char str[65]; From 4d93553297a83c6b9ecb4696f5d5e7e9a94e126e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 23:29:59 +0300 Subject: [PATCH 069/176] Test --- iguana/exchanges/LP_stats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 64b4a92de..f5b244822 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -90,7 +90,7 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) if ( duplicate == 0 ) { Ridqids[LP_numridqids % (sizeof(Ridqids)/sizeof(*Ridqids))] = aliceid; - printf("%s %8s %-4d %9s swap.%-16llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),gui!=0?gui:"",LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); + printf("%s %8s %-4d %9s swap.%016llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),gui!=0?gui:"",LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); LP_numridqids++; } } From 652ea55b86dab55f05cfee451ac89260df920fd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 23:36:45 +0300 Subject: [PATCH 070/176] Test --- iguana/exchanges/LP_ordermatch.c | 1 + iguana/exchanges/LP_signatures.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 03793b9eb..b60ffaef5 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -408,6 +408,7 @@ char *LP_trade(void *ctx,char *myipaddr,int32_t mypubsock,struct LP_quoteinfo *q return(clonestr("{\"error\":\"cant find alice utxopair\"}")); } price = 0.; + qp->aliceid = LP_aliceid_calc(qp->desttxid,qp->destvout,qp->feetxid,qp->feevout); LP_query(ctx,myipaddr,mypubsock,"request",qp); LP_Alicequery = *qp, LP_Alicemaxprice = maxprice, Alice_expiration = qp->timestamp + timeout; return(clonestr("{\"result\":\"success\"}")); diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 97fad7b84..a53c1ef6e 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -623,7 +623,7 @@ char *LP_uitem_recv(cJSON *argjson) //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",symbol,coinaddr,bits256_str(str,txid),vout,dstr(value),height); if ( strcmp(coin->smartaddr,coinaddr) != 0 ) LP_address_utxoadd("LP_uitem,recv",coin,coinaddr,txid,vout,value,height,-1); - else printf("ignore external uitem %s %s\n",symbol,coin->smartaddr); + //else printf("ignore external uitem %s %s\n",symbol,coin->smartaddr); } return(clonestr("{\"result\":\"success\"}")); } From 5e4d6beeba5742fbd25a23327720230b9746257b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 24 Oct 2017 23:42:56 +0300 Subject: [PATCH 071/176] Test --- iguana/exchanges/LP_utxo.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 89ac0aa72..f8e20742a 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -153,7 +153,18 @@ int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_a if ( coin->electrum == 0 ) { if ( (txout= LP_gettxout(coin->symbol,coinaddr,up->U.txid,up->U.vout)) != 0 ) + { + if ( LP_value_extract(txout,0) == 0 ) + { + printf("LP_address_utxo_ptrs skip zero value %s/v%d\n",bits256_str(str,up->U.txid),up->U.vout); + free_json(txout); + up->spendheight = 1; + if ( (tx= LP_transactionfind(coin,up->U.txid)) != 0 && up->U.vout < tx->numvouts ) + tx->outpoints[up->U.vout].spendheight = 1; + continue; + } free_json(txout); + } else { printf("LP_address_utxo_ptrs skips %s %s payment %s/v%d is spent\n",coin->symbol,coinaddr,bits256_str(str,up->U.txid),up->U.vout); @@ -168,6 +179,9 @@ int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_a if ( up->SPV <= 0 || up->U.height == 0 ) { printf("LP_address_utxo_ptrs skips %s/v%u due to SPV.%d ht.%d\n",bits256_str(str,up->U.txid),up->U.vout,up->SPV,up->U.height); + if ( (tx= LP_transactionfind(coin,up->U.txid)) != 0 && up->U.vout < tx->numvouts ) + tx->outpoints[up->U.vout].spendheight = 1; + continue; } } if ( LP_allocated(up->U.txid,up->U.vout) == 0 ) From 03007dfbe1f1bb94f64fd40cf72573969c2ee36c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:25:33 +0300 Subject: [PATCH 072/176] Test --- iguana/exchanges/LP_socket.c | 4 +--- iguana/exchanges/LP_utxo.c | 9 +++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index f00d83a07..cd7a89620 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -519,9 +519,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON cJSON *retjson=0; struct LP_address *ap; struct iguana_info *coin; int32_t height,usecache=1; if ( (coin= LP_coinfind(symbol)) == 0 ) return(0); - if ( ep->heightp == 0 ) - height = coin->longestchain; - else height = *(ep->heightp); + height = coin->longestchain; if ( (ap= LP_address(coin,addr)) != 0 ) { if ( ap->unspenttime == 0 ) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index f8e20742a..22d8142a1 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -191,6 +191,11 @@ int32_t LP_address_utxo_ptrs(struct iguana_info *coin,int32_t iambob,struct LP_a break; } } + else + { + if ( (tx= LP_transactionfind(coin,up->U.txid)) != 0 && up->U.vout < tx->numvouts ) + tx->outpoints[up->U.vout].spendheight = 1; + } } portable_mutex_unlock(&LP_utxomutex); //printf("return n.%d\n",n); @@ -276,8 +281,8 @@ int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,b DL_APPEND(ap->utxos,up); portable_mutex_unlock(&coin->addrmutex); retval = 1; - if ( value == 0 ) - printf("%s null? ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",debug,coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); + //if ( value == 0 ) + printf("%s ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",debug,coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); //printf("done %s add addr.%s ht.%d\n",coin->symbol,coinaddr,height); From ccc69318a008d8d7e2338e3d6cb763a7deb8cee9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:27:19 +0300 Subject: [PATCH 073/176] Test --- iguana/exchanges/LP_socket.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index cd7a89620..6585b8fe1 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -519,7 +519,9 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON cJSON *retjson=0; struct LP_address *ap; struct iguana_info *coin; int32_t height,usecache=1; if ( (coin= LP_coinfind(symbol)) == 0 ) return(0); - height = coin->longestchain; + if ( ep->heightp == 0 ) + height = coin->longestchain; + else height = *(ep->heightp); if ( (ap= LP_address(coin,addr)) != 0 ) { if ( ap->unspenttime == 0 ) @@ -807,7 +809,8 @@ int32_t LP_recvfunc(struct electrum_info *ep,char *str,int32_t len) { if ( (height= jint(resultjson,"block_height")) > 0 && ep->heightp != 0 && ep->heighttimep != 0 ) { - *(ep->heightp) = height; + if ( height > *(ep->heightp) ) + *(ep->heightp) = height; *(ep->heighttimep) = (uint32_t)time(NULL); if ( (coin= LP_coinfind(ep->symbol)) != 0 ) coin->updaterate = (uint32_t)time(NULL); From 7caebb999477d95600363eca2700a21a87733d7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:32:52 +0300 Subject: [PATCH 074/176] Test --- iguana/exchanges/LP_bitcoin.c | 2 +- iguana/exchanges/LP_socket.c | 2 +- iguana/exchanges/LP_utxo.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 3874991b7..3ab402856 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -3561,7 +3561,7 @@ cJSON *bitcoin_data2json(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t if ( n != len ) { int32_t i; - for (i=0; i<=len; i++) + for (i=0; i<=len&&i<200; i++) printf("%02x",serialized[i]); printf(" data2json n.%d vs len.%d\n",n,len); } diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 6585b8fe1..5ac39bc15 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -575,7 +575,7 @@ cJSON *LP_transaction_fromdata(struct iguana_info *coin,bits256 txid,uint8_t *se free(extraspace); if ( bits256_cmp(txid,checktxid) != 0 ) { - printf("LP_transaction_fromdata mismatched txid %s vs %s\n",bits256_str(str,txid),bits256_str(str2,checktxid)); + printf("%s LP_transaction_fromdata mismatched txid %s vs %s\n",coin->symbol,bits256_str(str,txid),bits256_str(str2,checktxid)); free_json(txobj); txobj = 0; } diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 22d8142a1..a17e9445c 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -281,7 +281,7 @@ int32_t LP_address_utxoadd(char *debug,struct iguana_info *coin,char *coinaddr,b DL_APPEND(ap->utxos,up); portable_mutex_unlock(&coin->addrmutex); retval = 1; - //if ( value == 0 ) + if ( value == 0 ) printf("%s ADD UTXO >> %s %s %s/v%d ht.%d %.8f\n",debug,coin->symbol,coinaddr,bits256_str(str,txid),vout,height,dstr(value)); } } // else printf("cant get ap %s %s\n",coin->symbol,coinaddr); From c5e455d56c5a82cb195c558832bcc4c56e7e47e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:38:55 +0300 Subject: [PATCH 075/176] Test --- iguana/exchanges/LP_rpc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 4f3084b4e..97d214400 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -345,7 +345,7 @@ cJSON *LP_gettxout(char *symbol,char *coinaddr,bits256 txid,int32_t vout) { if ( tx->outpoints[vout].spendheight > 0 ) return(0); - return(LP_gettxout_json(txid,vout,tx->height,tx->outpoints[vout].coinaddr,tx->outpoints[vout].value)); + //return(LP_gettxout_json(txid,vout,tx->height,tx->outpoints[vout].coinaddr,tx->outpoints[vout].value)); } if ( coinaddr[0] == 0 ) { @@ -362,7 +362,7 @@ cJSON *LP_gettxout(char *symbol,char *coinaddr,bits256 txid,int32_t vout) { if ( up->spendheight > 0 ) return(0); - return(LP_gettxout_json(txid,vout,up->U.height,coinaddr,up->U.value)); + //return(LP_gettxout_json(txid,vout,up->U.height,coinaddr,up->U.value)); } if ( (array= electrum_address_listunspent(coin->symbol,0,&array,coinaddr,1)) != 0 ) { From 7f252fcd49ec99207683f486d6e7b394c1a83c42 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:43:58 +0300 Subject: [PATCH 076/176] Test --- iguana/exchanges/LP_nativeDEX.c | 3 +++ iguana/exchanges/LP_utxo.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 089150cd8..ae01c92f3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,6 +18,9 @@ // LP_nativeDEX.c // marketmaker // +// ZEC LP_transaction_fromdata mismatched txid e2a3eebcf5bef6fe63296f53ce35d2f2c6e3b29c7c907da4171a580f50c93c74 vs 1ed5c15bbf991ff42c73b1492d1bb50e91d1d731c86cb3058405cff95cd9bd70 +//0200000000018c343500000000001976a9141462c3dd3f936d595c9af55978003b27c250441f88ac000000000100000000000000009c5b3500000000005a6c707fc604699d0166b2a750c8a2ff21c8aed0b6e6fe160f651da8cf865c2aa079a7f71f7782604785e1f9a7300cd6c89ca50b5d91f6c0ae5f293ea5a72e62bb0f05da84510e6431c5d4be7a372221265fd98dbccee11f5ed064c5afaa19eff27fd12c30a7a5205f70c99f22b7090c00048c1c9767eea1c79e54ed60c08c138758ad73d43f2692fcb05f data2json n.44 vs len. + // process stats.log local file -> map of realtime activity! // handles <-> pubkeys, deal with offline pubkeys, reputations, bonds etc. // select oldest utxo first diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index a17e9445c..77d8cadfa 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -388,7 +388,11 @@ int32_t LP_merkleproof(struct iguana_info *coin,struct electrum_info *ep,bits256 } else printf("couldnt get header for ht.%d\n",height); } if ( SPV < 0 ) + { printf("MERKLE DIDNT VERIFY.(%s)\n",jprint(merkobj,0)); + if ( jobj(merkobj,"error") != 0 ) + SPV = 0; // try again later + } free_json(merkobj); } return(SPV); From c63460f15b8f3b12bb7a94aa34495df8184fcab9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:49:34 +0300 Subject: [PATCH 077/176] Test --- iguana/exchanges/LP_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 5ac39bc15..5b0b5b549 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -519,7 +519,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON cJSON *retjson=0; struct LP_address *ap; struct iguana_info *coin; int32_t height,usecache=1; if ( (coin= LP_coinfind(symbol)) == 0 ) return(0); - if ( ep->heightp == 0 ) + if ( ep == 0 || ep->heightp == 0 ) height = coin->longestchain; else height = *(ep->heightp); if ( (ap= LP_address(coin,addr)) != 0 ) From cee6f90ef0177d94a031c654579e593269596edf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 00:53:47 +0300 Subject: [PATCH 078/176] Test --- iguana/exchanges/LP_include.h | 8 +++++--- iguana/exchanges/LP_socket.c | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index ab48099b2..4abb60065 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,6 +23,11 @@ //#define LP_STRICTPEERS +#define LP_HTTP_TIMEOUT 3 // 1 is too small due to edge cases of time(NULL) +#define LP_AUTOTRADE_TIMEOUT 10 +#define ELECTRUM_TIMEOUT 15 +#define LP_MEMPOOL_TIMEINCR 10 + #define LP_COMMAND_SENDSOCK NN_PUSH #define LP_COMMAND_RECVSOCK NN_PULL @@ -34,17 +39,14 @@ #define MAINLOOP_PERSEC 100 #define MAX_PSOCK_PORT 60000 #define MIN_PSOCK_PORT 10000 -#define LP_MEMPOOL_TIMEINCR 10 #define LP_GETINFO_INCR 30 #define LP_ORDERBOOK_DURATION 120 -#define LP_HTTP_TIMEOUT 2 // 1 is too small due to edge cases of time(NULL) #define LP_MAXPEER_ERRORS 3 #define LP_MINPEER_GOOD 20 #define LP_PEERGOOD_ERRORDECAY 0.9 #define LP_SWAPSTEP_TIMEOUT 30 -#define LP_AUTOTRADE_TIMEOUT 10 #define LP_MIN_TXFEE 10000 #define LP_MINVOL 20 #define LP_MINCLIENTVOL 50 diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 5b0b5b549..8f0283812 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -26,8 +26,6 @@ #include #endif -#define ELECTRUM_TIMEOUT 10 - int32_t LP_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; @@ -652,7 +650,7 @@ cJSON *electrum_transaction(char *symbol,struct electrum_info *ep,cJSON **retjso free_json(hexjson); //printf("return from electrum_transaction\n"); return(*retjsonp); - } else printf("non-hex tx.(%s)\n",jprint(hexjson,0)); + } else printf("%s %s non-hex tx.(%s)\n",coin->symbol,bits256_str(str,txid),jprint(hexjson,0)); free(hexstr); free_json(hexjson); } From ed1f1c072dc0d2c54c18c5db0eda33eec6ab6114 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:12:01 +0300 Subject: [PATCH 079/176] Test --- iguana/exchanges/LP_remember.c | 60 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 669d55102..c5dfc1c56 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -931,9 +931,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti { if ( rswap.sentflags[BASILISK_BOBPAYMENT] != 0 && bits256_nonz(rswap.paymentspent) == 0 ) { - if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobpaymentaddr,rswap.txids[BASILISK_BOBPAYMENT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.paymentspent = deadtxid; + flag = 0; + if ( bob->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobpaymentaddr,rswap.txids[BASILISK_BOBPAYMENT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.paymentspent = deadtxid; + } if ( flag == 0 ) { if ( bits256_nonz(rswap.txids[BASILISK_BOBPAYMENT]) != 0 ) @@ -967,9 +971,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti { if ( time(NULL) > rswap.expiration ) { - if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobdepositaddr,rswap.txids[BASILISK_BOBDEPOSIT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.depositspent = deadtxid; + flag = 0; + if ( bob->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobdepositaddr,rswap.txids[BASILISK_BOBDEPOSIT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.depositspent = deadtxid; + } if ( flag == 0 ) { if ( rswap.Dredeemlen != 0 ) @@ -992,9 +1000,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( rswap.sentflags[BASILISK_ALICEPAYMENT] != 0 && bits256_nonz(rswap.Apaymentspent) == 0 && rswap.sentflags[BASILISK_ALICECLAIM] == 0 ) { - if ( (txoutobj= LP_gettxout(rswap.alicecoin,rswap.alicepaymentaddr,rswap.txids[BASILISK_ALICEPAYMENT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.Apaymentspent = deadtxid; + flag = 0; + if ( alice->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.alicecoin,rswap.alicepaymentaddr,rswap.txids[BASILISK_ALICEPAYMENT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.Apaymentspent = deadtxid; + } if ( flag == 0 ) { rswap.privBn = basilisk_swap_privBn_extract(&rswap.txids[BASILISK_BOBREFUND],rswap.bobcoin,rswap.txids[BASILISK_BOBDEPOSIT],rswap.privBn); @@ -1014,9 +1026,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti //printf("try to bobspend aspend.%s have privAm.%d\n",bits256_str(str,rswap.txids[BASILISK_ALICESPEND]),bits256_nonz(rswap.privAm)); if ( bits256_nonz(rswap.txids[BASILISK_ALICESPEND]) != 0 || bits256_nonz(rswap.privAm) != 0 ) { - if ( (txoutobj= LP_gettxout(rswap.alicecoin,rswap.alicepaymentaddr,rswap.txids[BASILISK_ALICEPAYMENT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.Apaymentspent = deadtxid; + flag = 0; + if ( alice->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.alicecoin,rswap.alicepaymentaddr,rswap.txids[BASILISK_ALICEPAYMENT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.Apaymentspent = deadtxid; + } if ( flag == 0 ) { if ( bits256_nonz(rswap.privAm) == 0 ) @@ -1035,9 +1051,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( rswap.sentflags[BASILISK_BOBRECLAIM] == 0 && rswap.sentflags[BASILISK_BOBPAYMENT] != 0 && bits256_nonz(rswap.txids[BASILISK_BOBPAYMENT]) != 0 && bits256_nonz(rswap.paymentspent) == 0 ) { - if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobpaymentaddr,rswap.txids[BASILISK_BOBPAYMENT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.paymentspent = deadtxid; + flag = 0; + if ( bob->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobpaymentaddr,rswap.txids[BASILISK_BOBPAYMENT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.paymentspent = deadtxid; + } if ( flag == 0 && time(NULL) > rswap.expiration ) { // bobreclaim @@ -1060,9 +1080,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( rswap.sentflags[BASILISK_BOBREFUND] == 0 && rswap.sentflags[BASILISK_BOBDEPOSIT] != 0 && bits256_nonz(rswap.txids[BASILISK_BOBDEPOSIT]) != 0 && bits256_nonz(rswap.depositspent) == 0 ) { - if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobdepositaddr,rswap.txids[BASILISK_BOBDEPOSIT],0)) != 0 ) - free_json(txoutobj), flag = 0; - else flag = -1, rswap.depositspent = deadtxid; + flag = 0; + if ( bob->electrum == 0 ) + { + if ( (txoutobj= LP_gettxout(rswap.bobcoin,rswap.bobdepositaddr,rswap.txids[BASILISK_BOBDEPOSIT],0)) != 0 ) + free_json(txoutobj), flag = 0; + else flag = -1, rswap.depositspent = deadtxid; + } if ( flag == 0 && (bits256_nonz(rswap.Apaymentspent) != 0 || time(NULL) > rswap.expiration) ) { printf("do the refund! paymentspent.%s now.%u vs expiration.%u\n",bits256_str(str,rswap.paymentspent),(uint32_t)time(NULL),rswap.expiration); From 0f02571e88c44632f6d71767ccb4a3888aa6c1de Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:16:44 +0300 Subject: [PATCH 080/176] Test --- iguana/exchanges/LP_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 97d214400..a039e6a70 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -290,7 +290,7 @@ cJSON *LP_gettx(char *symbol,bits256 txid) { if ( (retjson= electrum_transaction(symbol,coin->electrum,&retjson,txid)) != 0 ) return(retjson); - else printf("failed blockchain.transaction.get %s %s\n",coin->symbol,buf); + else printf("failed blockchain.transaction.get %s %s\n",coin->symbol,bits256_str(str,txid)); return(cJSON_Parse("{\"error\":\"no transaction bytes\"}")); } } From 07ebe8aa2030b8db6c63b4a9032447c50999c414 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:22:42 +0300 Subject: [PATCH 081/176] Test --- iguana/exchanges/LP_utxos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 676ae391c..2666c1abb 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -270,7 +270,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,char *symbol,bits256 txid,int32_t uint64_t val,val2=0,tmpsatoshis,txfee; int32_t spendvini,numconfirms,selector; bits256 spendtxid; struct iguana_info *coin; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 )//|| sessionid == 0 ) { - char str[65],str2[65]; printf("REJECT %s iambob.%d %s utxoadd.(%.8f %.8f) %s %s\n",coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + char str[65],str2[65]; printf("REJECT %s iambob.%d %s utxoadd.(%.8f %.8f) %s/v%d %s/v%d\n",coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),vout,bits256_str(str2,txid2),vout2); printf("session.%u addutxo %d %d %d %d %d %d %d %d\n",sessionid,symbol == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } From 27d0f23921c6f7d6cb4f848bbb7222cb214b8eee Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:27:41 +0300 Subject: [PATCH 082/176] Test --- iguana/exchanges/LP_ordermatch.c | 25 +++++-------------------- iguana/exchanges/LP_statemachine.c | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index b60ffaef5..912242c36 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -475,26 +475,6 @@ char *LP_connectedalice(cJSON *argjson) // alice butxo = &B; memset(butxo,0,sizeof(*butxo)); LP_abutxo_set(0,butxo,&Q); - /*if ( (butxo= LP_utxopairfind(1,Q.txid,Q.vout,Q.txid2,Q.vout2)) == 0 ) - { - value = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid,Q.vout); - value2 = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid2,Q.vout2); - if ( value == 0 || value2 == 0 ) - { - printf("zero value %.8f or value2 %.8f\n",dstr(value),dstr(value2)); - return(clonestr("{\"error\":\"spent txid or txid2 for bob?\"}")); - } - if ( (butxo= LP_utxoadd(1,Q.srccoin,Q.txid,Q.vout,value,Q.txid2,Q.vout2,value2,Q.coinaddr,Q.srchash,LP_gui,0)) == 0 ) - { - printf("cant find or create butxo\n"); - return(clonestr("{\"error\":\"cant find or create butxo\"}")); - } - if ( value < Q.satoshis ) - { - printf("butxo value %.8f less satoshis %.8f\n",dstr(value),dstr(Q.satoshis)); - return(clonestr("{\"error\":\"butxo value less than satoshis\"}")); - } - }*/ if ( (qprice= LP_quote_validate(autxo,butxo,&Q,0)) <= SMALLVAL ) { LP_availableset(autxo); @@ -652,6 +632,11 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, printf("{\"error\":\"GAME can only be alice coin\"}\n"); return(retval); } + if ( strcmp(Q.coinaddr,coin->smartaddr) != 0 ) + { + printf("bob is patching Q.coinaddr %s mismatch != %s\n",Q.coinaddr,coin->smartaddr); + strcpy(Q.coinaddr,coin->smartaddr); + } price = ask; autxo = &A; butxo = &B; diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index 5db3f3c40..b84c79843 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1433,6 +1433,27 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu } return(-1); }*/ +/*if ( (butxo= LP_utxopairfind(1,Q.txid,Q.vout,Q.txid2,Q.vout2)) == 0 ) + { + value = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid,Q.vout); + value2 = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid2,Q.vout2); + if ( value == 0 || value2 == 0 ) + { + printf("zero value %.8f or value2 %.8f\n",dstr(value),dstr(value2)); + return(clonestr("{\"error\":\"spent txid or txid2 for bob?\"}")); + } + if ( (butxo= LP_utxoadd(1,Q.srccoin,Q.txid,Q.vout,value,Q.txid2,Q.vout2,value2,Q.coinaddr,Q.srchash,LP_gui,0)) == 0 ) + { + printf("cant find or create butxo\n"); + return(clonestr("{\"error\":\"cant find or create butxo\"}")); + } + if ( value < Q.satoshis ) + { + printf("butxo value %.8f less satoshis %.8f\n",dstr(value),dstr(Q.satoshis)); + return(clonestr("{\"error\":\"butxo value less than satoshis\"}")); + } + }*/ + /*if ( addflag != 0 && LP_utxofind(1,Q.txid,Q.vout) == 0 ) { LP_utxoadd(1,-1,Q.srccoin,Q.txid,Q.vout,Q.value,Q.txid2,Q.vout2,Q.value2,"",Q.srcaddr,Q.srchash,0.); From 001ee87cf3a5492c396cd4184aea2debe0c10205 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:30:33 +0300 Subject: [PATCH 083/176] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 912242c36..91a8a6530 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -680,7 +680,7 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, butxo = LP_utxopairfind(1,Q.txid,Q.vout,Q.txid2,Q.vout2); if ( butxo == 0 || bits256_cmp(Q.txid,butxo->payment.txid) != 0 || bits256_cmp(Q.txid2,butxo->deposit.txid) != 0 ) { - printf("null butxo.%p case\n",butxo); + printf("%s %s null butxo.%p case\n",Q.srccoin,Q.coinaddr,butxo); value = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid,Q.vout); value2 = LP_txvalue(Q.coinaddr,Q.srccoin,Q.txid2,Q.vout2); butxo = LP_utxoadd(1,Q.srccoin,Q.txid,Q.vout,value,Q.txid2,Q.vout2,value2,Q.coinaddr,Q.srchash,LP_gui,0); From 11a61816eaa44c6c2bedc35df1cc302e8dad36a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 01:51:24 +0300 Subject: [PATCH 084/176] Test --- iguana/exchanges/LP_utxo.c | 2 +- iguana/exchanges/m_js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100755 iguana/exchanges/m_js diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index 77d8cadfa..6d5daecb4 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -389,7 +389,7 @@ int32_t LP_merkleproof(struct iguana_info *coin,struct electrum_info *ep,bits256 } if ( SPV < 0 ) { - printf("MERKLE DIDNT VERIFY.(%s)\n",jprint(merkobj,0)); + printf("MERKLE DIDNT VERIFY.%s %s ht.%d (%s)\n",coin->symbol,bits256_str(str,txid),height,jprint(merkobj,0)); if ( jobj(merkobj,"error") != 0 ) SPV = 0; // try again later } diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js new file mode 100755 index 000000000..69a39ea70 --- /dev/null +++ b/iguana/exchanges/m_js @@ -0,0 +1 @@ +emcc -DFROM_JS -O2 -I../../includes -I../../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/bartderDEX.html mm.c ../../crypto777/*.c ../../crypto777/jpeg/*.c ../../crypto777/jpeg/unix/*.c ../mini-gmp.c ../secp256k1/src/secp256k1.c -lm -lcurl.js From 9ee6baf20bce4232d799b2a255f37bdaf2053d64 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 11:39:22 +0300 Subject: [PATCH 085/176] Test --- iguana/exchanges/LP_nativeDEX.c | 14 +++++++++++--- iguana/exchanges/install | 2 +- iguana/exchanges/m_js | 3 ++- iguana/exchanges/mm.c | 8 ++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ae01c92f3..08946729d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -789,6 +789,11 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) return(n); } +void LP_fromjs_iter(void *arg) +{ + printf("LP_fromjs_iter got arg.%p\n",arg); +} + void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybusport,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); @@ -851,7 +856,9 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu portable_mutex_init(&LP_butxomutex); portable_mutex_init(&LP_reservedmutex); portable_mutex_init(&LP_nanorecvsmutex); + myipaddr = clonestr("127.0.0.1"); #ifndef _WIN32 +#ifndef FROM_JS if ( system("curl -s4 checkip.amazonaws.com > myipaddr") == 0 ) { char ipfname[64]; @@ -865,7 +872,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); #else - myipaddr = clonestr("127.0.0.1"); + IAMLP = 0; +#endif #endif if ( IAMLP != 0 ) { @@ -982,8 +990,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu printf("error launching LP_swapsloop for port.%u\n",myport); exit(-1); } - //if ( (retstr= basilisk_swapentry(0,0)) != 0 ) - // free(retstr); +#ifndef FROM_JS int32_t nonz; printf("start mainloop\n"); while ( 1 ) @@ -1002,6 +1009,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu else if ( IAMLP == 0 ) usleep(1000); } +#endif } diff --git a/iguana/exchanges/install b/iguana/exchanges/install index 561a3063e..92842953c 100755 --- a/iguana/exchanges/install +++ b/iguana/exchanges/install @@ -1,5 +1,5 @@ #!/bin/bash -cp trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts +cp notarizations getrawtransaction parselog statsdisp m_js trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts cp coins.json .. cd ../dexscripts #cp ../exchanges/passphrase ../exchanges/userpass . diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 69a39ea70..75da7febd 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1 +1,2 @@ -emcc -DFROM_JS -O2 -I../../includes -I../../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/bartderDEX.html mm.c ../../crypto777/*.c ../../crypto777/jpeg/*.c ../../crypto777/jpeg/unix/*.c ../mini-gmp.c ../secp256k1/src/secp256k1.c -lm -lcurl.js +~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../../includes -I../../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html mm.c ../../crypto777/*.c ../../crypto777/jpeg/*.c ../../crypto777/jpeg/unix/*.c ../mini-gmp.c ../secp256k1/src/secp256k1.c -lm libnanomsg.so + diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 73d998990..582518ac8 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -878,6 +878,13 @@ int main(int argc, const char * argv[]) sprintf(dirname,"%s",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/SWAPS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/PRICES",GLOBAL_DBDIR), OS_ensure_directory(dirname); +#ifdef FROM_JS + argc = 2; + retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); + printf("calling LP_main(%s)\n",jprint(retjson,0)); + LP_main(retjson); + emscripten_set_main_loop(LP_mainiter,0,0); +#else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { if ( (passphrase= jstr(retjson,"passphrase")) == 0 ) @@ -949,5 +956,6 @@ int main(int argc, const char * argv[]) } free_json(retjson); } +#endif return 0; } From bbab493208bd99161ee207777a319e358604ba41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 11:52:06 +0300 Subject: [PATCH 086/176] Test --- iguana/exchanges/m_js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 75da7febd..da426889e 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,2 +1,3 @@ -~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../../includes -I../../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html mm.c ../../crypto777/*.c ../../crypto777/jpeg/*.c ../../crypto777/jpeg/unix/*.c ../mini-gmp.c ../secp256k1/src/secp256k1.c -lm libnanomsg.so +cd .. +~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 57d7999aceb00c897947e27853daecdaa74580cc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 11:53:50 +0300 Subject: [PATCH 087/176] Test --- OSlibs/js/libnanomsg.so | Bin 0 -> 335660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 OSlibs/js/libnanomsg.so diff --git a/OSlibs/js/libnanomsg.so b/OSlibs/js/libnanomsg.so new file mode 100644 index 0000000000000000000000000000000000000000..a8f7ea8ef5c7c3da83b1d159fbcd2d5d6ec8b864 GIT binary patch literal 335660 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%0AhoC(fzl3%az}4#-5m(7U-bKHo2q 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 Date: Wed, 25 Oct 2017 11:55:01 +0300 Subject: [PATCH 088/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index da426889e..00b5d32e5 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,3 +1,3 @@ cd .. -~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 7666d3d493bd9f37dad2dce42faa89765c5bc552 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 11:56:11 +0300 Subject: [PATCH 089/176] Test --- iguana/exchanges/m_js | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 00b5d32e5..a4ee63f0b 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,3 +1,4 @@ cd .. +echo building... ~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 0defb999c71641f20467404cb75d56da6c59bf19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:04:43 +0300 Subject: [PATCH 090/176] Test --- iguana/exchanges/LP_socket.c | 2 +- iguana/exchanges/LP_transaction.c | 2 +- iguana/exchanges/m_js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_socket.c b/iguana/exchanges/LP_socket.c index 8f0283812..c56c15323 100644 --- a/iguana/exchanges/LP_socket.c +++ b/iguana/exchanges/LP_socket.c @@ -534,7 +534,7 @@ cJSON *electrum_address_listunspent(char *symbol,struct electrum_info *ep,cJSON { if ( (retjson= electrum_strarg(symbol,ep,retjsonp,"blockchain.address.listunspent",addr,ELECTRUM_TIMEOUT)) != 0 ) { - printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%ld)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,strlen(jprint(retjson,0))); + printf("%s.%d u.%u/%d t.%ld %s LISTUNSPENT.(%d)\n",coin->symbol,height,ap->unspenttime,ap->unspentheight,time(NULL),addr,(int32_t)strlen(jprint(retjson,0))); if ( electrum_process_array(coin,ep,addr,retjson,electrumflag) != 0 ) LP_postutxos(coin->symbol,addr); if ( ap != 0 ) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 96dcfa42a..20db0afd0 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -917,7 +917,7 @@ char *LP_createrawtransaction(cJSON **txobjp,int32_t *numvinsp,struct iguana_inf *txobjp = 0; if ( sizeof(utxos)/sizeof(*utxos) != max ) { - printf("LP_createrawtransaction: internal error %ld != max.%d\n",sizeof(utxos)/sizeof(*utxos),max); + printf("LP_createrawtransaction: internal error %d != max.%d\n",(int32_t)(sizeof(utxos)/sizeof(*utxos)),max); return(0); } if ( coin == 0 || outputs == 0 || (numvouts= cJSON_GetArraySize(outputs)) <= 0 ) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index a4ee63f0b..b536383df 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -~/emsdk/emscripten/1.37.21/emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 2c43e79971ffaf8e6de806636c29e4103886359f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:05:50 +0300 Subject: [PATCH 091/176] Test --- iguana/exchanges/LP_include.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 4abb60065..b64a072f3 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -21,6 +21,9 @@ #ifndef LP_INCLUDE_H #define LP_INCLUDE_H +#ifdef FROM_JS +#include +#endif //#define LP_STRICTPEERS #define LP_HTTP_TIMEOUT 3 // 1 is too small due to edge cases of time(NULL) From b29057c6371f316c7c2bff93ac9f0b3eb060c916 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:06:32 +0300 Subject: [PATCH 092/176] Test --- iguana/exchanges/mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 582518ac8..acacfa4d2 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -883,7 +883,7 @@ int main(int argc, const char * argv[]) retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); printf("calling LP_main(%s)\n",jprint(retjson,0)); LP_main(retjson); - emscripten_set_main_loop(LP_mainiter,0,0); + emscripten_set_main_loop(LP_fromjs_iter,0,0); #else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { From 8c62fb2041ed1eeb566cdff4d901dfea950db164 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:06:48 +0300 Subject: [PATCH 093/176] Test --- iguana/exchanges/mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index acacfa4d2..a84c15c5d 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -883,7 +883,7 @@ int main(int argc, const char * argv[]) retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); printf("calling LP_main(%s)\n",jprint(retjson,0)); LP_main(retjson); - emscripten_set_main_loop(LP_fromjs_iter,0,0); + emscripten_set_main_loop(LP_fromjs_iter,5,0); #else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { From ed92f0bb8240371f5e54fd084acbddde7479d74f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:07:56 +0300 Subject: [PATCH 094/176] Test --- iguana/exchanges/LP_nativeDEX.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 08946729d..b3a1751f4 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -789,11 +789,6 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) return(n); } -void LP_fromjs_iter(void *arg) -{ - printf("LP_fromjs_iter got arg.%p\n",arg); -} - void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybusport,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); @@ -1012,5 +1007,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu #endif } +#ifdef FROM_JS + +em_callback_func LP_fromjs_iter(void *arg) +{ + printf("LP_fromjs_iter got arg.%p\n",arg); +} +#endif From a95139fe33fbda051ffac8c50b3db33235eab512 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:09:49 +0300 Subject: [PATCH 095/176] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b3a1751f4..19d7bd071 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1009,9 +1009,11 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu #ifdef FROM_JS -em_callback_func LP_fromjs_iter(void *arg) +uint32_t LP_counter; +void LP_fromjs_iter() { - printf("LP_fromjs_iter got arg.%p\n",arg); + printf("LP_fromjs_iter got called LP_counter.%d\n",LP_counter); + LP_counter++; } #endif From bf559d6f5f81ce7f2d9789083e8d0cac3950b9df Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:13:29 +0300 Subject: [PATCH 096/176] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 19d7bd071..e5a425d3e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1015,6 +1015,12 @@ void LP_fromjs_iter() printf("LP_fromjs_iter got called LP_counter.%d\n",LP_counter); LP_counter++; } + +char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params) +{ + return(clonestr("{\"error\":\"curl is disabled\"}")); +} + #endif From 16a3909619799e64df7c8b05dab217626d24c9d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:14:16 +0300 Subject: [PATCH 097/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e5a425d3e..6fa621f60 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1016,7 +1016,7 @@ void LP_fromjs_iter() LP_counter++; } -char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params) +char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { return(clonestr("{\"error\":\"curl is disabled\"}")); } From 0d80000c2a32d0f2a9a8b4d2e4ecd82fe208d84a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:22:03 +0300 Subject: [PATCH 098/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index b536383df..9b17a5011 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc --preload-file coins -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 068d234686dc31b096525868a69427c587ee8091 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:22:25 +0300 Subject: [PATCH 099/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 9b17a5011..90da10472 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc --preload-file coins -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc --preload-file exchanges/coins -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From c9c34f4cd64db1d608c37ee13e9891dabcb09bbc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:24:54 +0300 Subject: [PATCH 100/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/m_js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6fa621f60..34cedb5bd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -903,7 +903,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu printf("canbind.%d my command address is (%s) pullsock.%d pullport.%u\n",LP_canbind,pushaddr,LP_mypullsock,mypullport); if ( (coinsjson= jobj(argjson,"coins")) == 0 ) { - if ( (coins_str= OS_filestr(&filesize,"coins.json")) != 0 ) + if ( (coins_str= OS_filestr(&filesize,"coins.json")) != 0 || (coins_str= OS_filestr(&filesize,"exchanges/coins.json")) != 0 ) { unstringify(coins_str); printf("UNSTRINGIFIED.(%s)\n",coins_str); diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 90da10472..c302eeae5 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc --preload-file exchanges/coins -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 026392431a7e95f2d4264891c180800554ea2043 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:26:14 +0300 Subject: [PATCH 101/176] Test --- iguana/exchanges/coins.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/coins.json b/iguana/exchanges/coins.json index 576547207..cadc82f08 100644 --- a/iguana/exchanges/coins.json +++ b/iguana/exchanges/coins.json @@ -1,3 +1,2 @@ -[{\"coin\":\"BTCZ\",\"name\":\"bitcoinz\",\"rpcport\":1979,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"MAGA\",\"name\":\"magacoin\",\"rpcport\":5332,\"pubtype\":23,\"p2shtype\":50,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"BLK\",\"name\":\"blackcoin\",\"rpcport\":15715,\"pubtype\":25,\"p2shtype\":85,\"wiftype\":153,\"txfee\":10000}, {\"coin\":\"ZEN\",\"name\":\"zen\",\"rpcport\":8231,\"pubtype\":137,\"taddr\":32,\"p2shtype\":150,\"wiftype\":128,\"txfee\":10000},{\"coin\":\"BSD\",\"name\":\"bitsend\",\"rpcport\":8800,\"pubtype\":102,\"p2shtype\":5,\"wiftype\":204,\"txfee\":10000}, {\"coin\":\"IOP\",\"name\":\"IoP\",\"rpcport\":8337,\"pubtype\":117,\"p2shtype\":174,\"wiftype\":49,\"txfee\":10000}, {\"coin\":\"BLOCK\",\"name\":\"blocknetdx\",\"rpcport\":41414,\"pubtype\":26,\"p2shtype\":28,\"wiftype\":154,\"txfee\":10000}, {\"coin\":\"CHIPS\", \"name\": \"chips\", \"rpcport\":57776,\"pubtype\":60, \"p2shtype\":85, \"wiftype\":188, \"txfee\":10000}, {\"coin\":\"888\",\"name\":\"octocoin\",\"rpcport\":22888,\"pubtype\":18,\"p2shtype\":5,\"wiftype\":176,\"txfee\":2000000}, {\"coin\":\"ARG\",\"name\":\"argentum\",\"rpcport\":13581,\"pubtype\":23,\"p2shtype\":5,\"wiftype\":151,\"txfee\":50000}, {\"coin\":\"GLT\",\"name\":\"globaltoken\",\"rpcport\":9320,\"pubtype\":38,\"p2shtype\":5,\"wiftype\":166,\"txfee\":10000}, {\"coin\":\"ZER\",\"name\":\"zero\",\"rpcport\":23801,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"HODLC\",\"name\":\"hodlcoin\",\"rpcport\":11989,\"pubtype\":40,\"p2shtype\":5,\"wiftype\":168,\"txfee\":5000}, {\"coin\":\"UIS\",\"name\":\"unitus\",\"rpcport\":50604,\"pubtype\":68,\"p2shtype\":10,\"wiftype\":132,\"txfee\":2000000}, {\"coin\":\"CRW\",\"name\":\"crown\",\"rpcport\":9341,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"HUC\",\"name\":\"huntercoin\",\"rpcport\":8399,\"pubtype\":40,\"p2shtype\":13,\"wiftype\":168,\"txfee\":100000}, {\"coin\":\"PIVX\",\"name\":\"pivx\",\"rpcport\":51473,\"pubtype\":30,\"p2shtype\":13,\"wiftype\":212,\"txfee\":10000}, {\"coin\":\"BDL\",\"name\":\"bitdeal\",\"rpcport\":9332,\"pubtype\":38,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"ARC\",\"name\":\"arcticcoin\",\"confpath\":\"${HOME#}/.arcticcore/arcticcoin.conf\",\"rpcport\":7208,\"pubtype\":23,\"p2shtype\":8,\"wiftype\":176,\"txfee\":10000}, {\"coin\":\"ZCL\",\"name\":\"zclassic\",\"rpcport\":8023,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"VIA\",\"name\":\"viacoin\",\"rpcport\":5222,\"pubtype\":71,\"p2shtype\":33,\"wiftype\":199,\"txfee\":100000}, {\"coin\":\"ERC\",\"name\":\"europecoin\",\"rpcport\":11989,\"pubtype\":33,\"p2shtype\":5,\"wiftype\":168,\"txfee\":10000},{\"coin\":\"FAIR\",\"name\":\"faircoin\",\"confpath\":\"${HOME#}/.faircoin2/faircoin.conf\",\"rpcport\":40405,\"pubtype\":95,\"p2shtype\":36,\"wiftype\":223,\"txfee\":1000000}, {\"coin\":\"FLO\",\"name\":\"florincoin\",\"rpcport\":7313,\"pubtype\":35,\"p2shtype\":8,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"SXC\",\"name\":\"sexcoin\",\"rpcport\":9561,\"pubtype\":62,\"p2shtype\":5,\"wiftype\":190,\"txfee\":100000}, {\"coin\":\"CREA\",\"name\":\"creativecoin\",\"rpcport\":17711,\"pubtype\":28,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"TRC\",\"name\":\"terracoin\",\"confpath\":\"${HOME#}/.terracoincore/terracoin.conf\",\"rpcport\":13332,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"BTA\",\"name\":\"bata\",\"rpcport\":5493,\"pubtype\":25,\"p2shtype\":5,\"wiftype\":188,\"txfee\":100000}, {\"coin\":\"SMC\",\"name\":\"smartcoin\",\"rpcport\":58583,\"pubtype\":63,\"p2shtype\":5,\"wiftype\":191,\"txfee\":1000000}, {\"coin\":\"NMC\",\"name\":\"namecoin\",\"rpcport\":8336,\"pubtype\":52,\"p2shtype\":13,\"wiftype\":180,\"txfee\":100000}, {\"coin\":\"NAV\",\"name\":\"navcoin\",\"isPoS\":1,\"confpath\":\"${HOME#}/.navcoin4/navcoin.conf\",\"rpcport\":44444,\"pubtype\":53,\"p2shtype\":85,\"wiftype\":150,\"txfee\":10000}, {\"coin\":\"MOON\",\"name\":\"Mooncoin\",\"rpcport\":44663,\"pubtype\":3,\"p2shtype\":22,\"wiftype\":131,\"txfee\":100000}, {\"coin\":\"EMC2\",\"name\":\"einsteinium\",\"rpcport\":41879,\"pubtype\":33,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000},{\"coin\":\"SYS\",\"name\":\"syscoin\",\"rpcport\":8370,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"I0C\",\"name\":\"i0coin\",\"rpcport\":7332,\"pubtype\":105,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"DASH\",\"confpath\":\"${HOME#}/.dashcore/dash.conf\",\"name\":\"dashcore\",\"rpcport\":9998,\"pubtype\":76,\"p2shtype\":16,\"wiftype\":204,\"txfee\":10000}, {\"coin\":\"STRAT\", \"name\": \"stratis\", \"active\":0, \"rpcport\":16174,\"pubtype\":63, \"p2shtype\":125, \"wiftype\":191, \"txfee\":10000}, {\"confpath\":\"${HOME#}/.muecore/mue.conf\",\"coin\":\"MUE\",\"name\":\"muecore\",\"rpcport\":29683,\"pubtype\":16,\"p2shtype\":76,\"wiftype\":126,\"txfee\":10000}, {\"coin\":\"MONA\",\"name\":\"monacoin\",\"rpcport\":9402,\"pubtype\":50,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000},{\"coin\":\"XMY\",\"name\":\"myriadcoin\",\"rpcport\":10889,\"pubtype\":50,\"p2shtype\":9,\"wiftype\":178,\"txfee\":5000}, {\"coin\":\"MAC\",\"name\":\"machinecoin\",\"rpcport\":40332,\"pubtype\":50,\"p2shtype\":5,\"wiftype\":178,\"txfee\":50000}, {\"coin\":\"BTX\",\"name\":\"bitcore\",\"rpcport\":8556,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":50000}, {\"coin\":\"XRE\",\"name\":\"revolvercoin\",\"rpcport\":8775,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"LBC\",\"name\":\"lbrycrd\",\"rpcport\":9245,\"pubtype\":85,\"p2shtype\":122,\"wiftype\":28,\"txfee\":1000}, {\"coin\":\"SIB\",\"name\":\"sibcoin\",\"rpcport\":1944,\"pubtype\":63,\"p2shtype\":40,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"VTC\", \"name\":\"vertcoin\", \"rpcport\":5888, \"pubtype\":71, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000 }, {\"coin\":\"REVS\",\"active\":0, \"asset\":\"REVS\",\"rpcport\":10196}, {\"coin\":\"JUMBLR\",\"active\":0, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\",\"name\":\"dogecoin\",\"rpcport\":22555,\"pubtype\":30,\"p2shtype\":22,\"wiftype\":158,\"txfee\":100000000}, {\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000 }, {\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\",\"name\":\"digibyte\",\"rpcport\":14022,\"pubtype\":30,\"p2shtype\":5,\"wiftype\":128,\"txfee\":100000}, {\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9,\"rpcport\":8332, \"wiftype\":224, \"txfee\":10000}, {\"coin\":\"GAME\", \"rpcport\":40001, \"name\":\"gamecredits\", \"pubtype\":38, \"p2shtype\":5, \"wiftype\":166, \"txfee\":100000}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }, {\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341}, {\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":12167}, {\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":14068}, {\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":11890}, {\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":14250}, {\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":8516}, {\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":14431}, {\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":10114}, {\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":11964}, {\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":12386}, {\"coin\":\"COQUI\",\"asset\":\"COQUI\",\"rpcport\":14276}, {\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299}, {\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116}, {\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455}] -#, {\"coin\":\"AUD\",\"asset\":\"AUD\",\"rpcport\":8045}, {\"coin\":\"BGN\",\"asset\":\"BGN\",\"rpcport\":9110}, {\"coin\":\"CAD\",\"asset\":\"CAD\",\"rpcport\":8720}, {\"coin\":\"CHF\",\"asset\":\"CHF\",\"rpcport\":15312}, {\"coin\":\"CNY\",\"asset\":\"CNY\",\"rpcport\":10384}, {\"coin\":\"CZK\",\"asset\":\"CZK\",\"rpcport\":9482}, {\"coin\":\"DKK\",\"asset\":\"DKK\",\"rpcport\":13830}, {\"coin\":\"EUR\",\"asset\":\"EUR\",\"rpcport\":8065}, {\"coin\":\"GBP\",\"asset\":\"GBP\",\"rpcport\":11505}, {\"coin\":\"HKD\",\"asset\":\"HKD\",\"rpcport\":15409}, {\"coin\":\"HRK\",\"asset\":\"HRK\",\"rpcport\":12617}, {\"coin\":\"HUF\",\"asset\":\"HUF\",\"rpcport\":13699}, {\"coin\":\"IDR\",\"asset\":\"IDR\",\"rpcport\":14459}, {\"coin\":\"ILS\",\"asset\":\"ILS\",\"rpcport\":14638}, {\"coin\":\"INR\",\"asset\":\"INR\",\"rpcport\":10536}, {\"coin\":\"JPY\",\"asset\":\"JPY\",\"rpcport\":13145}, {\"coin\":\"KRW\",\"asset\":\"KRW\",\"rpcport\":14020}, {\"coin\":\"MXN\",\"asset\":\"MXN\",\"rpcport\":13970}, {\"coin\":\"MYR\",\"asset\":\"MYR\",\"rpcport\":10688}, {\"coin\":\"NOK\",\"asset\":\"NOK\",\"rpcport\":11588}, {\"coin\":\"NZD\",\"asset\":\"NZD\",\"rpcport\":10915}, {\"coin\":\"PHP\",\"asset\":\"PHP\",\"rpcport\":11181}, {\"coin\":\"PLN\",\"asset\":\"PLN\",\"rpcport\":13493}, {\"coin\":\"BRL\",\"asset\":\"BRL\",\"rpcport\":9914}, {\"coin\":\"RON\",\"asset\":\"RON\",\"rpcport\":8675}, {\"coin\":\"RUB\",\"asset\":\"RUB\",\"rpcport\":8199}, {\"coin\":\"SEK\",\"asset\":\"SEK\",\"rpcport\":11447}, {\"coin\":\"SGD\",\"asset\":\"SGD\",\"rpcport\":14475}, {\"coin\":\"THB\",\"asset\":\"THB\",\"rpcport\":11847}, {\"coin\":\"TRY\",\"asset\":\"TRY\",\"rpcport\":13924}, {\"coin\":\"USD\",\"asset\":\"USD\",\"rpcport\":13967}, {\"coin\":\"ZAR\",\"asset\":\"ZAR\",\"rpcport\":15160}]" - +[{\"coin\":\"DSR\",\"name\":\"desire\",\"confpath\":\"${HOME#}/.desirecore/desire.conf\",\"rpcport\":9918,\"pubtype\":30,\"p2shtype\":16,\"wiftype\":204,\"txfee\":10000}, {\"coin\":\"MNZ\",\"asset\":\"MNZ\",\"rpcport\":14337},{\"coin\":\"BTCZ\",\"name\":\"bitcoinz\",\"rpcport\":1979,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"MAGA\",\"name\":\"magacoin\",\"rpcport\":5332,\"pubtype\":23,\"p2shtype\":50,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"BSD\",\"name\":\"bitsend\",\"rpcport\":8800,\"pubtype\":102,\"p2shtype\":5,\"wiftype\":204,\"txfee\":10000}, {\"coin\":\"IOP\",\"name\":\"IoP\",\"rpcport\":8337,\"pubtype\":117,\"p2shtype\":174,\"wiftype\":49,\"txfee\":10000}, {\"coin\":\"BLOCK\",\"name\":\"blocknetdx\",\"rpcport\":41414,\"pubtype\":26,\"p2shtype\":28,\"wiftype\":154,\"txfee\":10000}, {\"coin\":\"CHIPS\", \"name\": \"chips\", \"rpcport\":57776,\"pubtype\":60, \"p2shtype\":85, \"wiftype\":188, \"txfee\":10000}, {\"coin\":\"888\",\"name\":\"octocoin\",\"rpcport\":22888,\"pubtype\":18,\"p2shtype\":5,\"wiftype\":176,\"txfee\":2000000}, {\"coin\":\"ARG\",\"name\":\"argentum\",\"rpcport\":13581,\"pubtype\":23,\"p2shtype\":5,\"wiftype\":151,\"txfee\":50000}, {\"coin\":\"GLT\",\"name\":\"globaltoken\",\"rpcport\":9320,\"pubtype\":38,\"p2shtype\":5,\"wiftype\":166,\"txfee\":10000}, {\"coin\":\"ZER\",\"name\":\"zero\",\"rpcport\":23801,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"HODLC\",\"name\":\"hodlcoin\",\"rpcport\":11989,\"pubtype\":40,\"p2shtype\":5,\"wiftype\":168,\"txfee\":5000}, {\"coin\":\"UIS\",\"name\":\"unitus\",\"rpcport\":50604,\"pubtype\":68,\"p2shtype\":10,\"wiftype\":132,\"txfee\":2000000}, {\"coin\":\"CRW\",\"name\":\"crown\",\"rpcport\":9341,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"HUC\",\"name\":\"huntercoin\",\"rpcport\":8399,\"pubtype\":40,\"p2shtype\":13,\"wiftype\":168,\"txfee\":100000}, {\"coin\":\"PIVX\",\"name\":\"pivx\",\"rpcport\":51473,\"pubtype\":30,\"p2shtype\":13,\"wiftype\":212,\"txfee\":10000}, {\"coin\":\"BDL\",\"name\":\"bitdeal\",\"rpcport\":9332,\"pubtype\":38,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"ARC\",\"name\":\"arcticcoin\",\"confpath\":\"${HOME#}/.arcticcore/arcticcoin.conf\",\"rpcport\":7208,\"pubtype\":23,\"p2shtype\":8,\"wiftype\":176,\"txfee\":10000}, {\"coin\":\"ZCL\",\"name\":\"zclassic\",\"rpcport\":8023,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"VIA\",\"name\":\"viacoin\",\"rpcport\":5222,\"pubtype\":71,\"p2shtype\":33,\"wiftype\":199,\"txfee\":100000}, {\"coin\":\"ERC\",\"name\":\"europecoin\",\"rpcport\":11989,\"pubtype\":33,\"p2shtype\":5,\"wiftype\":168,\"txfee\":10000},{\"coin\":\"FAIR\",\"name\":\"faircoin\",\"confpath\":\"${HOME#}/.faircoin2/faircoin.conf\",\"rpcport\":40405,\"pubtype\":95,\"p2shtype\":36,\"wiftype\":223,\"txfee\":1000000}, {\"coin\":\"FLO\",\"name\":\"florincoin\",\"rpcport\":7313,\"pubtype\":35,\"p2shtype\":8,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"SXC\",\"name\":\"sexcoin\",\"rpcport\":9561,\"pubtype\":62,\"p2shtype\":5,\"wiftype\":190,\"txfee\":100000}, {\"coin\":\"CREA\",\"name\":\"creativecoin\",\"rpcport\":17711,\"pubtype\":28,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000}, {\"coin\":\"TRC\",\"name\":\"terracoin\",\"confpath\":\"${HOME#}/.terracoincore/terracoin.conf\",\"rpcport\":13332,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"BTA\",\"name\":\"bata\",\"rpcport\":5493,\"pubtype\":25,\"p2shtype\":5,\"wiftype\":188,\"txfee\":100000}, {\"coin\":\"SMC\",\"name\":\"smartcoin\",\"rpcport\":58583,\"pubtype\":63,\"p2shtype\":5,\"wiftype\":191,\"txfee\":1000000}, {\"coin\":\"NMC\",\"name\":\"namecoin\",\"rpcport\":8336,\"pubtype\":52,\"p2shtype\":13,\"wiftype\":180,\"txfee\":100000}, {\"coin\":\"NAV\",\"name\":\"navcoin\",\"isPoS\":1,\"confpath\":\"${HOME#}/.navcoin4/navcoin.conf\",\"rpcport\":44444,\"pubtype\":53,\"p2shtype\":85,\"wiftype\":150,\"txfee\":10000}, {\"coin\":\"MOON\",\"name\":\"Mooncoin\",\"rpcport\":44663,\"pubtype\":3,\"p2shtype\":22,\"wiftype\":131,\"txfee\":100000}, {\"coin\":\"EMC2\",\"name\":\"einsteinium\",\"rpcport\":41879,\"pubtype\":33,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000},{\"coin\":\"SYS\",\"name\":\"syscoin\",\"rpcport\":8370,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"I0C\",\"name\":\"i0coin\",\"rpcport\":7332,\"pubtype\":105,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"DASH\",\"confpath\":\"${HOME#}/.dashcore/dash.conf\",\"name\":\"dashcore\",\"rpcport\":9998,\"pubtype\":76,\"p2shtype\":16,\"wiftype\":204,\"txfee\":10000}, {\"coin\":\"STRAT\", \"name\": \"stratis\", \"active\":0, \"rpcport\":16174,\"pubtype\":63, \"p2shtype\":125, \"wiftype\":191, \"txfee\":10000}, {\"confpath\":\"${HOME#}/.muecore/mue.conf\",\"coin\":\"MUE\",\"name\":\"muecore\",\"rpcport\":29683,\"pubtype\":16,\"p2shtype\":76,\"wiftype\":126,\"txfee\":10000}, {\"coin\":\"MONA\",\"name\":\"monacoin\",\"rpcport\":9402,\"pubtype\":50,\"p2shtype\":5,\"wiftype\":176,\"txfee\":100000},{\"coin\":\"XMY\",\"name\":\"myriadcoin\",\"rpcport\":10889,\"pubtype\":50,\"p2shtype\":9,\"wiftype\":178,\"txfee\":5000}, {\"coin\":\"MAC\",\"name\":\"machinecoin\",\"rpcport\":40332,\"pubtype\":50,\"p2shtype\":5,\"wiftype\":178,\"txfee\":50000}, {\"coin\":\"BTX\",\"name\":\"bitcore\",\"rpcport\":8556,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":50000}, {\"coin\":\"XRE\",\"name\":\"revolvercoin\",\"rpcport\":8775,\"pubtype\":0,\"p2shtype\":5,\"wiftype\":128,\"txfee\":1000}, {\"coin\":\"LBC\",\"name\":\"lbrycrd\",\"rpcport\":9245,\"pubtype\":85,\"p2shtype\":122,\"wiftype\":28,\"txfee\":1000}, {\"coin\":\"SIB\",\"name\":\"sibcoin\",\"rpcport\":1944,\"pubtype\":63,\"p2shtype\":40,\"wiftype\":128,\"txfee\":10000}, {\"coin\":\"VTC\", \"name\":\"vertcoin\", \"rpcport\":5888, \"pubtype\":71, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000 }, {\"coin\":\"REVS\",\"active\":0, \"asset\":\"REVS\",\"rpcport\":10196}, {\"coin\":\"JUMBLR\",\"active\":0, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\",\"name\":\"dogecoin\",\"rpcport\":22555,\"pubtype\":30,\"p2shtype\":22,\"wiftype\":158,\"txfee\":100000000}, {\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":1000 }, {\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\",\"name\":\"digibyte\",\"rpcport\":14022,\"pubtype\":30,\"p2shtype\":5,\"wiftype\":128,\"txfee\":100000}, {\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9,\"rpcport\":8332, \"wiftype\":224, \"txfee\":10000}, {\"coin\":\"GAME\", \"rpcport\":40001, \"name\":\"gamecredits\", \"pubtype\":38, \"p2shtype\":5, \"wiftype\":166, \"txfee\":100000}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }, {\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341}, {\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":12167}, {\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":14068}, {\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":11890}, {\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":14250}, {\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":8516}, {\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":14431}, {\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":10114}, {\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":11964}, {\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":12386}, {\"coin\":\"COQUI\",\"asset\":\"COQUI\",\"rpcport\":14276}, {\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299}, {\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116}, {\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455}]" +#, {\"coin\":\"AUD\",\"asset\":\"AUD\",\"rpcport\":8045}, {\"coin\":\"BGN\",\"asset\":\"BGN\",\"rpcport\":9110}, {\"coin\":\"CAD\",\"asset\":\"CAD\",\"rpcport\":8720}, {\"coin\":\"CHF\",\"asset\":\"CHF\",\"rpcport\":15312}, {\"coin\":\"CNY\",\"asset\":\"CNY\",\"rpcport\":10384}, {\"coin\":\"CZK\",\"asset\":\"CZK\",\"rpcport\":9482}, {\"coin\":\"DKK\",\"asset\":\"DKK\",\"rpcport\":13830}, {\"coin\":\"EUR\",\"asset\":\"EUR\",\"rpcport\":8065}, {\"coin\":\"GBP\",\"asset\":\"GBP\",\"rpcport\":11505}, {\"coin\":\"HKD\",\"asset\":\"HKD\",\"rpcport\":15409}, {\"coin\":\"HRK\",\"asset\":\"HRK\",\"rpcport\":12617}, {\"coin\":\"HUF\",\"asset\":\"HUF\",\"rpcport\":13699}, {\"coin\":\"IDR\",\"asset\":\"IDR\",\"rpcport\":14459}, {\"coin\":\"ILS\",\"asset\":\"ILS\",\"rpcport\":14638}, {\"coin\":\"INR\",\"asset\":\"INR\",\"rpcport\":10536}, {\"coin\":\"JPY\",\"asset\":\"JPY\",\"rpcport\":13145}, {\"coin\":\"KRW\",\"asset\":\"KRW\",\"rpcport\":14020}, {\"coin\":\"MXN\",\"asset\":\"MXN\",\"rpcport\":13970}, {\"coin\":\"MYR\",\"asset\":\"MYR\",\"rpcport\":10688}, {\"coin\":\"NOK\",\"asset\":\"NOK\",\"rpcport\":11588}, {\"coin\":\"NZD\",\"asset\":\"NZD\",\"rpcport\":10915}, {\"coin\":\"PHP\",\"asset\":\"PHP\",\"rpcport\":11181}, {\"coin\":\"PLN\",\"asset\":\"PLN\",\"rpcport\":13493}, {\"coin\":\"BRL\",\"asset\":\"BRL\",\"rpcport\":9914}, {\"coin\":\"RON\",\"asset\":\"RON\",\"rpcport\":8675}, {\"coin\":\"RUB\",\"asset\":\"RUB\",\"rpcport\":8199}, {\"coin\":\"SEK\",\"asset\":\"SEK\",\"rpcport\":11447}, {\"coin\":\"SGD\",\"asset\":\"SGD\",\"rpcport\":14475}, {\"coin\":\"THB\",\"asset\":\"THB\",\"rpcport\":11847}, {\"coin\":\"TRY\",\"asset\":\"TRY\",\"rpcport\":13924}, {\"coin\":\"USD\",\"asset\":\"USD\",\"rpcport\":13967}, {\"coin\":\"ZAR\",\"asset\":\"ZAR\",\"rpcport\":15160}] From 15790df94e7420ba87f85c5fea2c9d4fbd64f104 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:29:57 +0300 Subject: [PATCH 102/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/m_js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 34cedb5bd..cf4f2e78e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -914,7 +914,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu } if ( coinsjson == 0 ) { - printf("no coins object or coins file, must abort\n"); + printf("no coins object or coins.json file, must abort\n"); exit(-1); } LP_initcoins(ctx,pubsock,coinsjson); diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index c302eeae5..7377c2ed0 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s ALLOW_MEMORY_GROWTH=1 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc -s TOTAL_MEMORY=1000000000 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 68e187a126c6366e17634b76c1cc3b826967e5eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:31:41 +0300 Subject: [PATCH 103/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 7377c2ed0..92d80067c 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -s TOTAL_MEMORY=1000000000 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc -s TOTAL_MEMORY=536870912 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 0d1ed642640ba2a04b47a960f68d8e2a4c5b65f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:49:38 +0300 Subject: [PATCH 104/176] Test --- iguana/exchanges/LP_nativeDEX.c | 18 +++++++++++++++++- iguana/exchanges/mm.c | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index cf4f2e78e..d69c6ec47 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -713,6 +713,7 @@ void LP_pubkeysloop(void *ctx) sleep(10); while ( 1 ) { + printf("LP_pubkeysloop\n"); LP_notify_pubkeys(ctx,LP_mypubsock); sleep(60); } @@ -723,6 +724,7 @@ void LP_privkeysloop(void *ctx) sleep(20); while ( 1 ) { + printf("LP_privkeysloop\n"); LP_privkey_updates(ctx,LP_mypubsock,0); sleep(60); } @@ -734,6 +736,7 @@ void LP_swapsloop(void *ignore) sleep(50); while ( 1 ) { + printf("LP_swapsloop\n"); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) free(retstr); sleep(600); @@ -1010,14 +1013,27 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu #ifdef FROM_JS uint32_t LP_counter; + void LP_fromjs_iter() { - printf("LP_fromjs_iter got called LP_counter.%d\n",LP_counter); + static void *ctx; + if ( G.initializing != 0 ) + { + printf("LP_fromjs_iter during G.initializing, skip\n"); + return; + } + if ( ctx == 0 ) + ctx = bitcoin_ctx(); + printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); + LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; } char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { + char fullurl[512]; + sprintf(fullurl,"%s@%s",userpass,url); + printf("bitcoind_RPC(%s)\n",fullurl); return(clonestr("{\"error\":\"curl is disabled\"}")); } diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index a84c15c5d..2a7415d2c 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -883,7 +883,7 @@ int main(int argc, const char * argv[]) retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); printf("calling LP_main(%s)\n",jprint(retjson,0)); LP_main(retjson); - emscripten_set_main_loop(LP_fromjs_iter,5,0); + emscripten_set_main_loop(LP_fromjs_iter,1,0); #else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { From e6f17dd4a8875d0c6782f7321ddecc21af260bd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 12:58:40 +0300 Subject: [PATCH 105/176] Test --- iguana/exchanges/LP_nativeDEX.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d69c6ec47..833117b9e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -50,7 +50,7 @@ char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.25 //uint32_t LP_deadman_switch; uint16_t LP_fixed_pairport,LP_publicport; -uint32_t LP_lastnonce; +uint32_t LP_lastnonce,LP_counter; int32_t LP_mybussock = -1; int32_t LP_mypubsock = -1; int32_t LP_mypullsock = -1; @@ -481,6 +481,7 @@ void LP_coinsloop(void *_coins) struct LP_address *ap=0,*atmp; struct LP_address_utxo *up,*tmp; struct iguana_info *coin,*ctmp; char str[65]; struct electrum_info *ep,*backupep=0; bits256 zero; int32_t oldht,j,nonz; char *coins = _coins; while ( 1 ) { + printf("coinsloop\n"); nonz = 0; HASH_ITER(hh,LP_coins,coin,ctmp) // firstrefht,firstscanht,lastscanht { @@ -713,7 +714,8 @@ void LP_pubkeysloop(void *ctx) sleep(10); while ( 1 ) { - printf("LP_pubkeysloop\n"); + LP_counter += 100; + printf("LP_pubkeysloop %d\n",LP_counter); LP_notify_pubkeys(ctx,LP_mypubsock); sleep(60); } @@ -724,7 +726,8 @@ void LP_privkeysloop(void *ctx) sleep(20); while ( 1 ) { - printf("LP_privkeysloop\n"); + LP_counter += 1000; + printf("LP_privkeysloop %u\n",LP_counter); LP_privkey_updates(ctx,LP_mypubsock,0); sleep(60); } @@ -736,7 +739,8 @@ void LP_swapsloop(void *ignore) sleep(50); while ( 1 ) { - printf("LP_swapsloop\n"); + LP_counter += 10000; + printf("LP_swapsloop %u\n",LP_counter); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) free(retstr); sleep(600); @@ -1012,7 +1016,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu #ifdef FROM_JS -uint32_t LP_counter; void LP_fromjs_iter() { @@ -1024,7 +1027,8 @@ void LP_fromjs_iter() } if ( ctx == 0 ) ctx = bitcoin_ctx(); - printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); + if ( (LP_counter % 100) == 0 ) + printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; } From 91b05c755c6bf5f0c7ed837fc03491e023fcaf6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:00:38 +0300 Subject: [PATCH 106/176] Test --- iguana/exchanges/LP_coins.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 5ef612669..53ef70c1f 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -326,7 +326,9 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse coin->noimportprivkey_flag = 1; printf("truncate importprivkey for %s\n",symbol); } +#ifndef FROM_JS port = LP_userpass(coin->userpass,symbol,assetname,name,name2,confpath,port); +#endif sprintf(coin->serverport,"127.0.0.1:%u",port); return(port); } From 0a4f35a22ee777b65d0804d7bfc7f10ad3f79621 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:08:12 +0300 Subject: [PATCH 107/176] Test --- iguana/exchanges/LP_coins.c | 4 ++-- iguana/exchanges/LP_include.h | 2 ++ iguana/exchanges/LP_nativeDEX.c | 6 +++--- iguana/exchanges/m_js | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 53ef70c1f..0495c8a38 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -315,7 +315,7 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse coin->ctx = bitcoin_ctx(); if ( assetname != 0 && strcmp(name,assetname) == 0 ) { - printf("%s is assetchain\n",symbol); + //printf("%s is assetchain\n",symbol); coin->isassetchain = 1; } if ( strcmp(symbol,"KMD") == 0 || (assetname != 0 && assetname[0] != 0) ) @@ -436,7 +436,7 @@ struct iguana_info *LP_coincreate(cJSON *item) } } else coin->inactive = 0; } - if ( coin != 0 && coin->inactive != 0 ) + if ( 0 && coin != 0 && coin->inactive != 0 ) printf("LPnode.%d %s inactive.%u %p vs %p\n",IAMLP,coin->symbol,coin->inactive,assetname,name); return(0); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b64a072f3..426b9453b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,6 +23,8 @@ #ifdef FROM_JS #include +#define sleep(x) emscripten_sleep(x) + #endif //#define LP_STRICTPEERS diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 833117b9e..b41574868 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1035,9 +1035,9 @@ void LP_fromjs_iter() char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { - char fullurl[512]; - sprintf(fullurl,"%s@%s",userpass,url); - printf("bitcoind_RPC(%s)\n",fullurl); + //char fullurl[512]; + //sprintf(fullurl,"%s@%s",userpass,url); + printf("bitcoind_RPC(%s)\n",url); return(clonestr("{\"error\":\"curl is disabled\"}")); } diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 92d80067c..0cf198f34 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -s TOTAL_MEMORY=536870912 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so From 720f9dd2b6313a38a304f3e9d27f62dea1e7f7f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:16:47 +0300 Subject: [PATCH 108/176] Test --- iguana/exchanges/LP_coins.c | 4 +++- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_nativeDEX.c | 11 +++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 0495c8a38..706016806 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -397,6 +397,7 @@ struct iguana_info *LP_coinfind(char *symbol) struct iguana_info *LP_coincreate(cJSON *item) { struct iguana_info cdata,*coin=0; int32_t isPoS,longestchain = 1; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name=0,*symbol,*assetname=0; + printf("LP_coincreate\n"); if ( (symbol= jstr(item,"coin")) != 0 && symbol[0] != 0 && strlen(symbol) < 16 && LP_coinfind(symbol) == 0 && (port= juint(item,"rpcport")) != 0 ) { isPoS = jint(item,"isPoS"); @@ -415,6 +416,7 @@ struct iguana_info *LP_coincreate(cJSON *item) } else if ( (name= jstr(item,"name")) == 0 ) name = symbol; + printf("LP_coininit\n"); if ( LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,juint(item,"wiftaddr"),juint(item,"taddr"),LP_busport(port),jstr(item,"confpath")) < 0 ) { coin = LP_coinadd(&cdata); @@ -436,7 +438,7 @@ struct iguana_info *LP_coincreate(cJSON *item) } } else coin->inactive = 0; } - if ( 0 && coin != 0 && coin->inactive != 0 ) + if ( coin != 0 && coin->inactive != 0 ) printf("LPnode.%d %s inactive.%u %p vs %p\n",IAMLP,coin->symbol,coin->inactive,assetname,name); return(0); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 426b9453b..dd9df70f1 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,6 +24,7 @@ #ifdef FROM_JS #include #define sleep(x) emscripten_sleep(x) +#define usleep #endif //#define LP_STRICTPEERS diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b41574868..d0d6c61fd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1035,10 +1035,13 @@ void LP_fromjs_iter() char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { - //char fullurl[512]; - //sprintf(fullurl,"%s@%s",userpass,url); - printf("bitcoind_RPC(%s)\n",url); - return(clonestr("{\"error\":\"curl is disabled\"}")); + static uint32_t counter; char fname[512],retstr; long fsize; + sprintf(fname,"bitcoind_RPC/req.%u",counter); + counter++; + emscripten_wget(url,fname); + retstr = OS_filestr(&fsize,fname); + printf("bitcoind_RPC(%s) -> fname.(%s) %s\n",url,fname,retstr); + return(retstr); } #endif From 39399e61a67b93fabf10e7e8e833d221f34e2543 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:18:05 +0300 Subject: [PATCH 109/176] Test --- iguana/exchanges/LP_include.h | 3 ++- iguana/exchanges/LP_nativeDEX.c | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index dd9df70f1..7c10880f2 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,7 +24,8 @@ #ifdef FROM_JS #include #define sleep(x) emscripten_sleep(x) -#define usleep +void emscripten_usleep(int32_t x); +#define usleep(x) emscripten_usleep(x) #endif //#define LP_STRICTPEERS diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d0d6c61fd..fc1cda7d0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1016,6 +1016,9 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu #ifdef FROM_JS +void emscripten_usleep(int32_t x) +{ +} void LP_fromjs_iter() { @@ -1035,7 +1038,7 @@ void LP_fromjs_iter() char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { - static uint32_t counter; char fname[512],retstr; long fsize; + static uint32_t counter; char fname[512],*retstr; long fsize; sprintf(fname,"bitcoind_RPC/req.%u",counter); counter++; emscripten_wget(url,fname); From 19c11e2ee42b05eb8414e884dfced585eae4a3e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:29:05 +0300 Subject: [PATCH 110/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 0cf198f34..cf3fcf757 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so +emcc -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so -lc -lpthread From 295ea7807e7e4da5ab3a9dea716fd3025d02933c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:31:06 +0300 Subject: [PATCH 111/176] Test --- iguana/exchanges/m_js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index cf3fcf757..11e57fce0 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so -lc -lpthread +emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=40 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.so -lc -lpthread From 54124e0160452c9245ab7421ef7921b621cdceaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 13:51:00 +0300 Subject: [PATCH 112/176] Test --- OSlibs/js/libnanomsg.a | Bin 0 -> 590614 bytes iguana/exchanges/m_js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 OSlibs/js/libnanomsg.a diff --git a/OSlibs/js/libnanomsg.a b/OSlibs/js/libnanomsg.a new file mode 100644 index 0000000000000000000000000000000000000000..fb2a83981c4c5e8500b0027f5c957539e4b076b6 GIT binary patch literal 590614 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

DsV3{;L7uJS1bbE|_VujJ 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�Vv4p>{rtHhtJwK1h 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

1{PN$iH<(%alh^ta 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 &x`I1z6ZUr+-m>n7I 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 yF7jJA1(cP;n7gw-Za Date: Wed, 25 Oct 2017 14:00:49 +0300 Subject: [PATCH 113/176] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/m_js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 7c10880f2..a306dde6b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,7 +23,7 @@ #ifdef FROM_JS #include -#define sleep(x) emscripten_sleep(x) +#define sleep(x) emscripten_sleep((x) * 1000) void emscripten_usleep(int32_t x); #define usleep(x) emscripten_usleep(x) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index c173788af..fb99a2126 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,4 @@ cd .. echo building... -emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=2 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread +emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread From b28f665679767b601a75ae4a5468034a7e2ccfa6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:10:50 +0300 Subject: [PATCH 114/176] Test --- iguana/exchanges/LP_include.h | 6 +++++- iguana/exchanges/LP_nativeDEX.c | 8 +++----- iguana/exchanges/LP_peers.c | 2 ++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index a306dde6b..69944e7b4 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -26,7 +26,11 @@ #define sleep(x) emscripten_sleep((x) * 1000) void emscripten_usleep(int32_t x); #define usleep(x) emscripten_usleep(x) - +// ./autogen.sh +// emconfigure ./configure CFLAGS="-s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1" +// Edit src/core/sock.c and add here #include for INT_MAX support +// emmake make +// cp .libs/libnanomsg.a ~/SuperNET/OSlibs/js #endif //#define LP_STRICTPEERS diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fc1cda7d0..0952f5679 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -481,7 +481,6 @@ void LP_coinsloop(void *_coins) struct LP_address *ap=0,*atmp; struct LP_address_utxo *up,*tmp; struct iguana_info *coin,*ctmp; char str[65]; struct electrum_info *ep,*backupep=0; bits256 zero; int32_t oldht,j,nonz; char *coins = _coins; while ( 1 ) { - printf("coinsloop\n"); nonz = 0; HASH_ITER(hh,LP_coins,coin,ctmp) // firstrefht,firstscanht,lastscanht { @@ -715,7 +714,7 @@ void LP_pubkeysloop(void *ctx) while ( 1 ) { LP_counter += 100; - printf("LP_pubkeysloop %d\n",LP_counter); + //printf("LP_pubkeysloop %d\n",LP_counter); LP_notify_pubkeys(ctx,LP_mypubsock); sleep(60); } @@ -727,7 +726,7 @@ void LP_privkeysloop(void *ctx) while ( 1 ) { LP_counter += 1000; - printf("LP_privkeysloop %u\n",LP_counter); + //printf("LP_privkeysloop %u\n",LP_counter); LP_privkey_updates(ctx,LP_mypubsock,0); sleep(60); } @@ -740,7 +739,7 @@ void LP_swapsloop(void *ignore) while ( 1 ) { LP_counter += 10000; - printf("LP_swapsloop %u\n",LP_counter); + //printf("LP_swapsloop %u\n",LP_counter); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) free(retstr); sleep(600); @@ -994,7 +993,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu } #ifndef FROM_JS int32_t nonz; - printf("start mainloop\n"); while ( 1 ) { nonz = 0; diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index a7ffdf846..1da51a464 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -83,6 +83,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char else peer->sessionid = sessionid; peer->pushsock = peer->subsock = pushsock = subsock = -1; strcpy(peer->ipaddr,ipaddr); +#ifndef FROM_JS if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { nanomsg_transportname(0,pushaddr,peer->ipaddr,pushport); @@ -114,6 +115,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char printf("error connecting to push.(%s)\n",pushaddr); } } else printf("%s pushport.%u subport.%u pushsock.%d\n",ipaddr,pushport,subport,pushsock); +#endif //peer->profitmargin = profitmargin; peer->ipbits = ipbits; peer->port = port; From 1ffe9e6b48f9ffaf7341153a3fe92e5363e72e18 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:20:38 +0300 Subject: [PATCH 115/176] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_peers.c | 48 +++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 69944e7b4..01872157f 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -27,7 +27,7 @@ void emscripten_usleep(int32_t x); #define usleep(x) emscripten_usleep(x) // ./autogen.sh -// emconfigure ./configure CFLAGS="-s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1" +// emconfigure ./configure CFLAGS="-s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -O2" // Edit src/core/sock.c and add here #include for INT_MAX support // emmake make // cp .libs/libnanomsg.a ~/SuperNET/OSlibs/js diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 1da51a464..92b56cb74 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -83,6 +83,11 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char else peer->sessionid = sessionid; peer->pushsock = peer->subsock = pushsock = subsock = -1; strcpy(peer->ipaddr,ipaddr); + //peer->profitmargin = profitmargin; + peer->ipbits = ipbits; + peer->port = port; + peer->ip_port = ((uint64_t)port << 32) | ipbits; + printf("allocated peer\n"); #ifndef FROM_JS if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { @@ -116,32 +121,31 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char } } else printf("%s pushport.%u subport.%u pushsock.%d\n",ipaddr,pushport,subport,pushsock); #endif - //peer->profitmargin = profitmargin; - peer->ipbits = ipbits; - peer->port = port; - peer->ip_port = ((uint64_t)port << 32) | ipbits; - portable_mutex_lock(&LP_peermutex); - HASH_ADD(hh,LP_peerinfos,ip_port,sizeof(peer->ip_port),peer); - if ( mypeer != 0 ) + if ( peer->pushsock >= 0 && peer->subsock >= 0 ) { - mypeer->numpeers++; - printf("_LPaddpeer %s -> numpeers.%d mypubsock.%d other.(%d %d)\n",ipaddr,mypeer->numpeers,mypubsock,numpeers,numutxos); - } else peer->numpeers = 1; // will become mypeer - portable_mutex_unlock(&LP_peermutex); - if ( IAMLP != 0 && mypubsock >= 0 ) - { - struct iguana_info *coin,*ctmp; bits256 zero; char busaddr[64]; - memset(zero.bytes,0,sizeof(zero)); - //LP_send(mypubsock,msg,(int32_t)strlen(msg)+1,1); - LP_reserved_msg("","",zero,jprint(LP_peerjson(peer),1)); - if ( 0 ) + portable_mutex_lock(&LP_peermutex); + HASH_ADD(hh,LP_peerinfos,ip_port,sizeof(peer->ip_port),peer); + if ( mypeer != 0 ) + { + mypeer->numpeers++; + printf("_LPaddpeer %s -> numpeers.%d mypubsock.%d other.(%d %d)\n",ipaddr,mypeer->numpeers,mypubsock,numpeers,numutxos); + } else peer->numpeers = 1; // will become mypeer + portable_mutex_unlock(&LP_peermutex); + if ( IAMLP != 0 && mypubsock >= 0 ) { - HASH_ITER(hh,LP_coins,coin,ctmp) + struct iguana_info *coin,*ctmp; bits256 zero; char busaddr[64]; + memset(zero.bytes,0,sizeof(zero)); + //LP_send(mypubsock,msg,(int32_t)strlen(msg)+1,1); + LP_reserved_msg("","",zero,jprint(LP_peerjson(peer),1)); + if ( 0 ) { - if ( coin->bussock >= 0 ) + HASH_ITER(hh,LP_coins,coin,ctmp) { - nanomsg_transportname(0,busaddr,peer->ipaddr,coin->busport); - nn_connect(coin->bussock,busaddr); + if ( coin->bussock >= 0 ) + { + nanomsg_transportname(0,busaddr,peer->ipaddr,coin->busport); + nn_connect(coin->bussock,busaddr); + } } } } From 100313889c80bd3aa509d6f1aecb4ba4f9593b56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:26:02 +0300 Subject: [PATCH 116/176] Test --- iguana/exchanges/LP_coins.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 706016806..9f00cbaff 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -285,13 +285,16 @@ struct iguana_info *LP_coinsearch(char *symbol) struct iguana_info *LP_coinadd(struct iguana_info *cdata) { struct iguana_info *coin = calloc(1,sizeof(*coin)); - //printf("%s: (%s) (%s)\n",symbol,cdata.serverport,cdata.userpass); *coin = *cdata; portable_mutex_init(&coin->txmutex); portable_mutex_init(&coin->addrmutex); + printf("mutexlock\n"); portable_mutex_lock(&LP_coinmutex); + printf("mutexlocked\n"); HASH_ADD_KEYPTR(hh,LP_coins,coin->symbol,strlen(coin->symbol),coin); + printf("mutexunlock\n"); portable_mutex_unlock(&LP_coinmutex); + printf("mutexunlocked\n"); return(coin); } @@ -419,11 +422,18 @@ struct iguana_info *LP_coincreate(cJSON *item) printf("LP_coininit\n"); if ( LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,juint(item,"wiftaddr"),juint(item,"taddr"),LP_busport(port),jstr(item,"confpath")) < 0 ) { + printf("LP_coinadd\n"); coin = LP_coinadd(&cdata); coin->inactive = (uint32_t)time(NULL); - } else coin = LP_coinadd(&cdata); + } + else + { + printf("LP_coinadd\n"); + coin = LP_coinadd(&cdata); + } } else if ( symbol != 0 && jobj(item,"rpcport") == 0 ) printf("SKIP %s, missing rpcport field in coins array\n",symbol); + printf("end of coininit\n"); if ( coin != 0 && item != 0 ) { if ( strcmp("KMD",coin->symbol) != 0 ) From 1e4991a9817d1f3d0f0e8d296e4477b7f7263ba0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:30:08 +0300 Subject: [PATCH 117/176] Test --- iguana/exchanges/LP_coins.c | 4 ++++ iguana/exchanges/LP_nativeDEX.c | 1 + 2 files changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 9f00cbaff..1bc94d905 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -301,6 +301,7 @@ struct iguana_info *LP_coinadd(struct iguana_info *cdata) uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetname,int32_t isPoS,uint16_t port,uint8_t pubtype,uint8_t p2shtype,uint8_t wiftype,uint64_t txfee,double estimatedrate,int32_t longestchain,uint8_t wiftaddr,uint8_t taddr,uint16_t busport,char *confpath) { char *name2; + printf("clear coin\n"); memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); coin->updaterate = (uint32_t)time(NULL); @@ -314,8 +315,11 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse coin->p2shtype = p2shtype; coin->wiftype = wiftype; coin->inactive = (uint32_t)time(NULL); + printf("call coinbus\n"); coin->bussock = LP_coinbus(busport); + printf("call bitcoin_ctx\n"); coin->ctx = bitcoin_ctx(); + printf("back from bitcoin_ctx\n"); if ( assetname != 0 && strcmp(name,assetname) == 0 ) { //printf("%s is assetchain\n",symbol); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0952f5679..74cd98855 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1039,6 +1039,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * static uint32_t counter; char fname[512],*retstr; long fsize; sprintf(fname,"bitcoind_RPC/req.%u",counter); counter++; + printf("issue.(%s)\n",url); emscripten_wget(url,fname); retstr = OS_filestr(&fsize,fname); printf("bitcoind_RPC(%s) -> fname.(%s) %s\n",url,fname,retstr); From e5067302a8c70cee981d3d714f739efd12b46698 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:31:47 +0300 Subject: [PATCH 118/176] Test --- iguana/exchanges/LP_coins.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 1bc94d905..11c89ae74 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -300,6 +300,7 @@ struct iguana_info *LP_coinadd(struct iguana_info *cdata) uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetname,int32_t isPoS,uint16_t port,uint8_t pubtype,uint8_t p2shtype,uint8_t wiftype,uint64_t txfee,double estimatedrate,int32_t longestchain,uint8_t wiftaddr,uint8_t taddr,uint16_t busport,char *confpath) { + static void *ctx; char *name2; printf("clear coin\n"); memset(coin,0,sizeof(*coin)); @@ -318,7 +319,9 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse printf("call coinbus\n"); coin->bussock = LP_coinbus(busport); printf("call bitcoin_ctx\n"); - coin->ctx = bitcoin_ctx(); + if ( ctx == 0 ) + ctx = bitcoin_ctx(); + coin->ctx = ctx; printf("back from bitcoin_ctx\n"); if ( assetname != 0 && strcmp(name,assetname) == 0 ) { From 1da066e988dedbe9829b45bf5c10fce03265d6c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:36:46 +0300 Subject: [PATCH 119/176] Test --- iguana/exchanges/LP_coins.c | 18 +----------------- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 11c89ae74..15b8f5ea0 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -288,13 +288,9 @@ struct iguana_info *LP_coinadd(struct iguana_info *cdata) *coin = *cdata; portable_mutex_init(&coin->txmutex); portable_mutex_init(&coin->addrmutex); - printf("mutexlock\n"); portable_mutex_lock(&LP_coinmutex); - printf("mutexlocked\n"); HASH_ADD_KEYPTR(hh,LP_coins,coin->symbol,strlen(coin->symbol),coin); - printf("mutexunlock\n"); portable_mutex_unlock(&LP_coinmutex); - printf("mutexunlocked\n"); return(coin); } @@ -316,13 +312,10 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse coin->p2shtype = p2shtype; coin->wiftype = wiftype; coin->inactive = (uint32_t)time(NULL); - printf("call coinbus\n"); coin->bussock = LP_coinbus(busport); - printf("call bitcoin_ctx\n"); if ( ctx == 0 ) ctx = bitcoin_ctx(); coin->ctx = ctx; - printf("back from bitcoin_ctx\n"); if ( assetname != 0 && strcmp(name,assetname) == 0 ) { //printf("%s is assetchain\n",symbol); @@ -407,7 +400,6 @@ struct iguana_info *LP_coinfind(char *symbol) struct iguana_info *LP_coincreate(cJSON *item) { struct iguana_info cdata,*coin=0; int32_t isPoS,longestchain = 1; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name=0,*symbol,*assetname=0; - printf("LP_coincreate\n"); if ( (symbol= jstr(item,"coin")) != 0 && symbol[0] != 0 && strlen(symbol) < 16 && LP_coinfind(symbol) == 0 && (port= juint(item,"rpcport")) != 0 ) { isPoS = jint(item,"isPoS"); @@ -426,21 +418,13 @@ struct iguana_info *LP_coincreate(cJSON *item) } else if ( (name= jstr(item,"name")) == 0 ) name = symbol; - printf("LP_coininit\n"); if ( LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,juint(item,"wiftaddr"),juint(item,"taddr"),LP_busport(port),jstr(item,"confpath")) < 0 ) { - printf("LP_coinadd\n"); coin = LP_coinadd(&cdata); coin->inactive = (uint32_t)time(NULL); - } - else - { - printf("LP_coinadd\n"); - coin = LP_coinadd(&cdata); - } + } else coin = LP_coinadd(&cdata); } else if ( symbol != 0 && jobj(item,"rpcport") == 0 ) printf("SKIP %s, missing rpcport field in coins array\n",symbol); - printf("end of coininit\n"); if ( coin != 0 && item != 0 ) { if ( strcmp("KMD",coin->symbol) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 74cd98855..e56ad0a0a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -926,6 +926,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu LP_initcoins(ctx,pubsock,coinsjson); G.waiting = 1; LP_passphrase_init(passphrase,jstr(argjson,"gui")); +#ifndef FROM_JS if ( IAMLP != 0 && OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_psockloop,(void *)myipaddr) != 0 ) { printf("error launching LP_psockloop for (%s)\n",myipaddr); @@ -991,7 +992,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu printf("error launching LP_swapsloop for port.%u\n",myport); exit(-1); } -#ifndef FROM_JS int32_t nonz; while ( 1 ) { From 27e17866e460d3989788b16b910281f9bdb273bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:40:18 +0300 Subject: [PATCH 120/176] Test --- iguana/exchanges/LP_coins.c | 3 +-- iguana/exchanges/LP_nativeDEX.c | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 15b8f5ea0..0d97c0f81 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -298,7 +298,6 @@ uint16_t LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *asse { static void *ctx; char *name2; - printf("clear coin\n"); memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); coin->updaterate = (uint32_t)time(NULL); @@ -439,7 +438,7 @@ struct iguana_info *LP_coincreate(cJSON *item) } } else coin->inactive = 0; } - if ( coin != 0 && coin->inactive != 0 ) + if ( 0 && coin != 0 && coin->inactive != 0 ) printf("LPnode.%d %s inactive.%u %p vs %p\n",IAMLP,coin->symbol,coin->inactive,assetname,name); return(0); } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e56ad0a0a..9200abb34 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1037,6 +1037,8 @@ void LP_fromjs_iter() char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params,int32_t timeout) { static uint32_t counter; char fname[512],*retstr; long fsize; + if ( strncmp("http://",url,strlen("http://")) != 0 ) + return(clonestr("{\"error\":\"only http allowed\"}")); sprintf(fname,"bitcoind_RPC/req.%u",counter); counter++; printf("issue.(%s)\n",url); From 40b5a52175a76d7010f39e8fd1d10cd987d9ea98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:43:06 +0300 Subject: [PATCH 121/176] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9200abb34..7f745d099 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -798,6 +798,12 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybusport,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); + { + int32_t sock; + printf("call nn_socket\n"); + sock = nn_socket(AF_SP,NN_PAIR); + printf("nn_socket(PAIR) %d\n",sock); + } LP_showwif = juint(argjson,"wif"); if ( passphrase == 0 || passphrase[0] == 0 ) { From 5aee2dfd6a23b31ac364c07496d2f27f60db1b30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:45:40 +0300 Subject: [PATCH 122/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_peers.c | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7f745d099..2f1e14e5d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -801,8 +801,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu { int32_t sock; printf("call nn_socket\n"); - sock = nn_socket(AF_SP,NN_PAIR); - printf("nn_socket(PAIR) %d\n",sock); + sock = nn_socket(AF_SP,NN_PUSH); + printf("nn_socket(NN_PUSH) %d\n",sock); } LP_showwif = juint(argjson,"wif"); if ( passphrase == 0 || passphrase[0] == 0 ) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 92b56cb74..c922d981d 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -57,7 +57,7 @@ char *LP_peers() struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,int32_t numpeers,int32_t numutxos,uint32_t sessionid) { uint32_t ipbits; int32_t pushsock,subsock,timeout; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; - printf("addpeer (%s:%u)\n",ipaddr,port); + printf("addpeer (%s:%u) pushport.%u subport.%u\n",ipaddr,port,pushport,subport); #ifdef LP_STRICTPEERS if ( strncmp("5.9.253",ipaddr,strlen("5.9.253")) != 0 ) return(0); @@ -87,8 +87,6 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char peer->ipbits = ipbits; peer->port = port; peer->ip_port = ((uint64_t)port << 32) | ipbits; - printf("allocated peer\n"); -#ifndef FROM_JS if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { nanomsg_transportname(0,pushaddr,peer->ipaddr,pushport); @@ -120,7 +118,6 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char printf("error connecting to push.(%s)\n",pushaddr); } } else printf("%s pushport.%u subport.%u pushsock.%d\n",ipaddr,pushport,subport,pushsock); -#endif if ( peer->pushsock >= 0 && peer->subsock >= 0 ) { portable_mutex_lock(&LP_peermutex); From 4b8c79a66fcd919ea4107b86ca07bfb5a81f8f4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:48:39 +0300 Subject: [PATCH 123/176] Test --- iguana/exchanges/LP_nativeDEX.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 2f1e14e5d..9364d43bd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -799,10 +799,17 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); { - int32_t sock; + int32_t sock,timeout,val; printf("call nn_socket\n"); sock = nn_socket(AF_SP,NN_PUSH); printf("nn_socket(NN_PUSH) %d\n",sock); + if ( nn_connect(sock,pushaddr) >= 0 ) + { + timeout = 1; + printf("call setsockopt\n"); + val = nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + printf("nn_setsockopt val.%d\n",val); + } else printf("nn_connect error\n"); } LP_showwif = juint(argjson,"wif"); if ( passphrase == 0 || passphrase[0] == 0 ) From c759b5cc16fb886d13899777b7d02e9fed62a266 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:50:31 +0300 Subject: [PATCH 124/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9364d43bd..a64f4478e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -803,7 +803,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu printf("call nn_socket\n"); sock = nn_socket(AF_SP,NN_PUSH); printf("nn_socket(NN_PUSH) %d\n",sock); - if ( nn_connect(sock,pushaddr) >= 0 ) + if ( nn_connect(sock,"tcp://5.9.253.199:7784") >= 0 ) { timeout = 1; printf("call setsockopt\n"); From 37c75e7f86977d5095ccc1fb3c4a25deb76dab30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:57:21 +0300 Subject: [PATCH 125/176] Test --- iguana/exchanges/m_js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index fb99a2126..fff063e89 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,4 +1,7 @@ cd .. -echo building... -emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread +source ../crypto777/crypto777.sources +echo building... $(CRYPTO777_SRCS) + +#emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread +#emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm From c57e0ede2fc10802691b31cde4c8b56b8d7dba54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 14:59:15 +0300 Subject: [PATCH 126/176] Test --- crypto777/crypto777.sources | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/crypto777/crypto777.sources b/crypto777/crypto777.sources index 7c30d39d4..a539f95e7 100755 --- a/crypto777/crypto777.sources +++ b/crypto777/crypto777.sources @@ -1,46 +1,46 @@ -NANOSRC = ../crypto777/nanosrc +export NANOSRC = ../crypto777/nanosrc -NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c +export NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c -NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c +export NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c -NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c +export NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c -NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c +export NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c -PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c +export PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c -PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c +export PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c -PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c +export PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c -PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c +export PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c -PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c +export PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c -PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c +export PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c -PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c +export PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c -TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c +export TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c -TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c +export TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c -TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c +export TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c -TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c +export TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c -TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c +export TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c -TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c +export TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c -NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) +export NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) -NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) +export NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) -NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) +export NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) -JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c +export JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c -CRYPTO777_SRCS := ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) +export CRYPTO777_SRCS := ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) From c89c0f5a8db8514f7636cef734b2b2a13652b378 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:02:03 +0300 Subject: [PATCH 127/176] Test --- crypto777/crypto777.sources | 46 +++++++++++++++++------------------ iguana/exchanges/m_js | 48 ++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/crypto777/crypto777.sources b/crypto777/crypto777.sources index a539f95e7..7c30d39d4 100755 --- a/crypto777/crypto777.sources +++ b/crypto777/crypto777.sources @@ -1,46 +1,46 @@ -export NANOSRC = ../crypto777/nanosrc +NANOSRC = ../crypto777/nanosrc -export NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c +NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c -export NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c +NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c -export NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c +NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c -export NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c +NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c -export PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c +PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c -export PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c +PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c -export PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c +PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c -export PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c +PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c -export PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c +PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c -export PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c +PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c -export PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c +PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c -export TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c +TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c -export TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c +TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c -export TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c +TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c -export TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c +TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c -export TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c +TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c -export TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c +TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c -export NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) +NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) -export NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) +NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) -export NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) +NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) -export JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c +JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c -export CRYPTO777_SRCS := ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) +CRYPTO777_SRCS := ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index fff063e89..1b42bfe3c 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,5 +1,51 @@ +#!/bin/sh cd .. -source ../crypto777/crypto777.sources +NANOSRC = ../crypto777/nanosrc + +NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c + +NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c + +NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c + +NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c + +PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c + +PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c + +PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c + +PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c + +PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c + +PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c + +PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c + +TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c + +TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c + +TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c + +TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c + +TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c + +TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c + +NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) + +NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) + +NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) + +JPEG_SRCS = ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c + +CRYPTO777_SRCS = ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) + echo building... $(CRYPTO777_SRCS) #emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread From 3c194d7de3da264eb66f7c960bb346318662ed45 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:03:56 +0300 Subject: [PATCH 128/176] Test --- iguana/exchanges/m_js | 46 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 1b42bfe3c..8deb66e8f 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,50 +1,50 @@ #!/bin/sh cd .. -NANOSRC = ../crypto777/nanosrc +NANOSRC=../crypto777/nanosrc -NANOMSG_CORE = $(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c +NANOMSG_CORE=$(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c -NANOMSG_DEVICES = $(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c +NANOMSG_DEVICES=$(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c -NANOMSG_AIO = $(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c +NANOMSG_AIO=$(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c -NANOMSG_UTILS = $(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c +NANOMSG_UTILS=$(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c -PROTOCOLS_UTILS = $(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c +PROTOCOLS_UTILS=$(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c -PROTOCOLS_BUS = $(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c +PROTOCOLS_BUS=$(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c -PROTOCOLS_PIPELINE = $(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c +PROTOCOLS_PIPELINE=$(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c -PROTOCOLS_PUBSUB = $(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c +PROTOCOLS_PUBSUB=$(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c -PROTOCOLS_PAIR = $(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c +PROTOCOLS_PAIR=$(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c -PROTOCOLS_REQREP = $(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c +PROTOCOLS_REQREP=$(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c -PROTOCOLS_SURVEY = $(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c +PROTOCOLS_SURVEY=$(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c -TRANSPORTS_UTILS = $(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c +TRANSPORTS_UTILS=$(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c -TRANSPORTS_IPC = $(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c +TRANSPORTS_IPC=$(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c -TRANSPORTS_TCP = $(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c +TRANSPORTS_TCP=$(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c -TRANSPORTS_INPROC = $(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c +TRANSPORTS_INPROC=$(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c -TRANSPORTS_WS = $(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c +TRANSPORTS_WS=$(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c -TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c +TRANSPORTS_TCPMUX=$(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c -NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) +NANOMSG_PROTOCOLS=$(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) -NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) +NANOMSG_TRANSPORTS= $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) -NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) +NANOMSG=$(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) -JPEG_SRCS = ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c +JPEG_SRCS=../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c -CRYPTO777_SRCS = ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) +CRYPTO777_SRCS=../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) echo building... $(CRYPTO777_SRCS) From f04ec00f9fbcbfdf4a6bed528aec960233784d63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:09:29 +0300 Subject: [PATCH 129/176] Test --- crypto777/crypto777.sources | 4 +-- iguana/exchanges/Makefile | 9 +++++++ iguana/exchanges/m_js | 51 +------------------------------------ 3 files changed, 12 insertions(+), 52 deletions(-) create mode 100644 iguana/exchanges/Makefile diff --git a/crypto777/crypto777.sources b/crypto777/crypto777.sources index 7c30d39d4..f7bcd6bcc 100755 --- a/crypto777/crypto777.sources +++ b/crypto777/crypto777.sources @@ -40,7 +40,7 @@ NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $( NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) -JPEG_SRCS := ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c +JPEG_SRCS = ../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c -CRYPTO777_SRCS := ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) +CRYPTO777_SRCS = ../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) diff --git a/iguana/exchanges/Makefile b/iguana/exchanges/Makefile new file mode 100644 index 000000000..0b70a94bf --- /dev/null +++ b/iguana/exchanges/Makefile @@ -0,0 +1,9 @@ +#cd .. +#emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread + +include ../crypto777/crypto777.sources + +all: + echo building... $(CRYPTO777_SRCS) + emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm + diff --git a/iguana/exchanges/m_js b/iguana/exchanges/m_js index 8deb66e8f..37e18a0c5 100755 --- a/iguana/exchanges/m_js +++ b/iguana/exchanges/m_js @@ -1,53 +1,4 @@ #!/bin/sh cd .. -NANOSRC=../crypto777/nanosrc - -NANOMSG_CORE=$(NANOSRC)/core/global.c $(NANOSRC)/core/ep.c $(NANOSRC)/core/epbase.c $(NANOSRC)/core/pipe.c $(NANOSRC)/core/poll.c $(NANOSRC)/core/sock.c $(NANOSRC)/core/sockbase.c $(NANOSRC)/core/symbol.c - -NANOMSG_DEVICES=$(NANOSRC)/devices/device.c $(NANOSRC)/devices/tcpmuxd.c - -NANOMSG_AIO=$(NANOSRC)/aio/ctx.c $(NANOSRC)/aio/fsm.c $(NANOSRC)/aio/poller.c $(NANOSRC)/aio/pool.c $(NANOSRC)/aio/timer.c $(NANOSRC)/aio/usock.c $(NANOSRC)/aio/timerset.c $(NANOSRC)/aio/worker.c - -NANOMSG_UTILS=$(NANOSRC)/utils/alloc.c $(NANOSRC)/utils/atomic.c $(NANOSRC)/utils/chunk.c $(NANOSRC)/utils/chunkref.c $(NANOSRC)/utils/clock.c $(NANOSRC)/utils/closefd.c $(NANOSRC)/utils/efd.c $(NANOSRC)/utils/err.c $(NANOSRC)/utils/glock.c $(NANOSRC)/utils/hash.c $(NANOSRC)/utils/list.c $(NANOSRC)/utils/msg.c $(NANOSRC)/utils/mutex.c $(NANOSRC)/utils/queue.c $(NANOSRC)/utils/random.c $(NANOSRC)/utils/sem.c $(NANOSRC)/utils/sleep.c $(NANOSRC)/utils/stopwatch.c $(NANOSRC)/utils/thread.c $(NANOSRC)/utils/wire.c - -PROTOCOLS_UTILS=$(NANOSRC)/protocols/utils/dist.c $(NANOSRC)/protocols/utils/excl.c $(NANOSRC)/protocols/utils/fq.c $(NANOSRC)/protocols/utils/lb.c $(NANOSRC)/protocols/utils/priolist.c - -PROTOCOLS_BUS=$(NANOSRC)/protocols/bus/bus.c $(NANOSRC)/protocols/bus/xbus.c - -PROTOCOLS_PIPELINE=$(NANOSRC)/protocols/pipeline/push.c $(NANOSRC)/protocols/pipeline/pull.c $(NANOSRC)/protocols/pipeline/xpull.c $(NANOSRC)/protocols/pipeline/xpush.c - -PROTOCOLS_PUBSUB=$(NANOSRC)/protocols/pubsub/pub.c $(NANOSRC)/protocols/pubsub/sub.c $(NANOSRC)/protocols/pubsub/trie.c $(NANOSRC)/protocols/pubsub/xpub.c $(NANOSRC)/protocols/pubsub/xsub.c - -PROTOCOLS_PAIR=$(NANOSRC)/protocols/pair/pair.c $(NANOSRC)/protocols/pair/xpair.c - -PROTOCOLS_REQREP=$(NANOSRC)/protocols/reqrep/req.c $(NANOSRC)/protocols/reqrep/rep.c $(NANOSRC)/protocols/reqrep/task.c $(NANOSRC)/protocols/reqrep/xrep.c $(NANOSRC)/protocols/reqrep/xreq.c - -PROTOCOLS_SURVEY=$(NANOSRC)/protocols/survey/respondent.c $(NANOSRC)/protocols/survey/surveyor.c $(NANOSRC)/protocols/survey/xrespondent.c $(NANOSRC)/protocols/survey/xsurveyor.c - -TRANSPORTS_UTILS=$(NANOSRC)/transports/utils/backoff.c $(NANOSRC)/transports/utils/dns.c $(NANOSRC)/transports/utils/iface.c $(NANOSRC)/transports/utils/literal.c $(NANOSRC)/transports/utils/port.c $(NANOSRC)/transports/utils/streamhdr.c $(NANOSRC)/transports/utils/base64.c - -TRANSPORTS_IPC=$(NANOSRC)/transports/ipc/aipc.c $(NANOSRC)/transports/ipc/bipc.c $(NANOSRC)/transports/ipc/cipc.c $(NANOSRC)/transports/ipc/ipc.c $(NANOSRC)/transports/ipc/sipc.c - -TRANSPORTS_TCP=$(NANOSRC)/transports/tcp/atcp.c $(NANOSRC)/transports/tcp/btcp.c $(NANOSRC)/transports/tcp/ctcp.c $(NANOSRC)/transports/tcp/stcp.c $(NANOSRC)/transports/tcp/tcp.c - -TRANSPORTS_INPROC=$(NANOSRC)/transports/inproc/binproc.c $(NANOSRC)/transports/inproc/cinproc.c $(NANOSRC)/transports/inproc/inproc.c $(NANOSRC)/transports/inproc/ins.c $(NANOSRC)/transports/inproc/msgqueue.c $(NANOSRC)/transports/inproc/sinproc.c - -TRANSPORTS_WS=$(NANOSRC)/transports/ws/aws.c $(NANOSRC)/transports/ws/bws.c $(NANOSRC)/transports/ws/cws.c $(NANOSRC)/transports/ws/sws.c $(NANOSRC)/transports/ws/ws.c $(NANOSRC)/transports/ws/ws_handshake.c $(NANOSRC)/transports/ws/sha1.c - -TRANSPORTS_TCPMUX=$(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports/tcpmux/btcpmux.c $(NANOSRC)/transports/tcpmux/ctcpmux.c $(NANOSRC)/transports/tcpmux/stcpmux.c $(NANOSRC)/transports/tcpmux/tcpmux.c - -NANOMSG_PROTOCOLS=$(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) - -NANOMSG_TRANSPORTS= $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) - -NANOMSG=$(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) - -JPEG_SRCS=../crypto777/jpeg/jaricom.c ../crypto777/jpeg/jcapimin.c ../crypto777/jpeg/jcapistd.c ../crypto777/jpeg/jcarith.c ../crypto777/jpeg/jccoefct.c ../crypto777/jpeg/jccolor.c ../crypto777/jpeg/jcdctmgr.c ../crypto777/jpeg/jchuff.c ../crypto777/jpeg/jcinit.c ../crypto777/jpeg/jcmainct.c ../crypto777/jpeg/jcmarker.c ../crypto777/jpeg/jcmaster.c ../crypto777/jpeg/jcomapi.c ../crypto777/jpeg/jcparam.c ../crypto777/jpeg/jcprepct.c ../crypto777/jpeg/jcsample.c ../crypto777/jpeg/jctrans.c ../crypto777/jpeg/jdapimin.c ../crypto777/jpeg/jdapistd.c ../crypto777/jpeg/jdarith.c ../crypto777/jpeg/jdatadst.c ../crypto777/jpeg/jdatasrc.c ../crypto777/jpeg/jdcoefct.c ../crypto777/jpeg/jdcolor.c ../crypto777/jpeg/jddctmgr.c ../crypto777/jpeg/jdhuff.c ../crypto777/jpeg/jdinput.c ../crypto777/jpeg/jdmainct.c ../crypto777/jpeg/jdmarker.c ../crypto777/jpeg/jdmaster.c ../crypto777/jpeg/jdmerge.c ../crypto777/jpeg/jdpostct.c ../crypto777/jpeg/jdsample.c ../crypto777/jpeg/jdtrans.c ../crypto777/jpeg/jerror.c ../crypto777/jpeg/jfdctflt.c ../crypto777/jpeg/jfdctfst.c ../crypto777/jpeg/jfdctint.c ../crypto777/jpeg/jidctflt.c ../crypto777/jpeg/jidctfst.c ../crypto777/jpeg/jidctint.c ../crypto777/jpeg/jquant1.c ../crypto777/jpeg/jquant2.c ../crypto777/jpeg/jutils.c ../crypto777/jpeg/misc/jmemnobs.c ../crypto777/jpeg/jmemmgr.c - -CRYPTO777_SRCS=../crypto777/tweetnacl.c ../crypto777/scrypt.c ../crypto777/bitcoind_RPC.c ../crypto777/cJSON.c ../crypto777/iguana_utils.c ../crypto777/OS_nonportable.c ../crypto777/curve25519-donna.c ../crypto777/inet.c ../crypto777/OS_portable.c ../crypto777/curve25519.c ../crypto777/OS_time.c ../crypto777/hmac_sha512.c ../crypto777/ramcoder.c ../crypto777/SaM.c ../crypto777/iguana_OS.c ../crypto777/iguana_serdes.c $(JPEG_SRCS) $(NANOMSG) - -echo building... $(CRYPTO777_SRCS) - -#emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c ../crypto777/*.c ../crypto777/jpeg/*.c ../crypto777/jpeg/unix/*.c mini-gmp.c secp256k1/src/secp256k1.c -lm ../OSlibs/js/libnanomsg.a -lc -lpthread -#emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm +make -f exchanges/Makefile From 471f732cf747713927c96ee33068d4b7f9d22ae5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:10:47 +0300 Subject: [PATCH 130/176] Test --- crypto777/nanosrc/nn.h | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto777/nanosrc/nn.h b/crypto777/nanosrc/nn.h index 3d6e7c598..0127338f3 100755 --- a/crypto777/nanosrc/nn.h +++ b/crypto777/nanosrc/nn.h @@ -30,6 +30,7 @@ extern "C" { #include #include +#include #include "nn_config.h" /* Handle DSO symbol visibility */ From b917c0a3fdccfcc412ca82d8cc5967dfe0e60168 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:13:10 +0300 Subject: [PATCH 131/176] Test --- iguana/exchanges/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/Makefile b/iguana/exchanges/Makefile index 0b70a94bf..6d629ce54 100644 --- a/iguana/exchanges/Makefile +++ b/iguana/exchanges/Makefile @@ -5,5 +5,5 @@ include ../crypto777/crypto777.sources all: echo building... $(CRYPTO777_SRCS) - emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm + emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -D__PNACL -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm From ceb6df9d3103a8e4f2ca0f2ea034e4dd605c4fbb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:14:24 +0300 Subject: [PATCH 132/176] Test --- crypto777/nanosrc/nn_config.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index d9e9c6468..f25bb74f7 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -50,9 +50,12 @@ #ifdef __PNACL //#define FD_CLOEXEC 1 -void PNACL_message(const char* format, ...); -#include -#include +#define PNACL_message printf +//void PNACL_message(const char* format, ...); +#include +#include +//#include +//#include #else #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 From d62e8e2ba6f5eeef95da8e5cbc4a07829912ec9c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:19:04 +0300 Subject: [PATCH 133/176] Test --- crypto777/nanosrc/aio/usock_posix.c_dev | 8 ++++---- crypto777/nanosrc/aio/usock_posix.h | 6 +++--- crypto777/nanosrc/devices/tcpmuxd.c | 10 +++++----- crypto777/nanosrc/transports/ipc/bipc.c | 8 ++++---- crypto777/nanosrc/transports/ipc/cipc.c | 10 +++++----- crypto777/nanosrc/transports/ipc/ipc.c | 8 ++++---- crypto777/nanosrc/transports/tcpmux/btcpmux.c | 8 ++++---- crypto777/nanosrc/transports/utils/tcpmux.c | 8 ++++---- iguana/exchanges/stats.c | 2 +- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c_dev b/crypto777/nanosrc/aio/usock_posix.c_dev index 954b3045f..1d000ee3b 100755 --- a/crypto777/nanosrc/aio/usock_posix.c_dev +++ b/crypto777/nanosrc/aio/usock_posix.c_dev @@ -31,11 +31,11 @@ #include #include #include -#ifndef __PNACL +//#ifndef __PNACL #include -#else -#include -#endif +//#else +//#include +//#endif #define NN_USOCK_STATE_IDLE 1 #define NN_USOCK_STATE_STARTING 2 diff --git a/crypto777/nanosrc/aio/usock_posix.h b/crypto777/nanosrc/aio/usock_posix.h index 4a189a2bb..de3095f20 100755 --- a/crypto777/nanosrc/aio/usock_posix.h +++ b/crypto777/nanosrc/aio/usock_posix.h @@ -25,10 +25,10 @@ #include #include -#ifndef __PNACL +//#ifndef __PNACL #include -#else -#include +//#else +//#include #endif struct nn_usock { diff --git a/crypto777/nanosrc/devices/tcpmuxd.c b/crypto777/nanosrc/devices/tcpmuxd.c index c95c2a899..aea9c5139 100755 --- a/crypto777/nanosrc/devices/tcpmuxd.c +++ b/crypto777/nanosrc/devices/tcpmuxd.c @@ -53,12 +53,12 @@ int nn_tcpmuxd (int port) #include #include #include -#ifndef __PNACL +//#ifndef __PNACL #include -#else -#include -#include -#endif +//#else +//#include +//#include +//#endif #include #include #include diff --git a/crypto777/nanosrc/transports/ipc/bipc.c b/crypto777/nanosrc/transports/ipc/bipc.c index 76a6f9256..6dac6eae1 100755 --- a/crypto777/nanosrc/transports/ipc/bipc.c +++ b/crypto777/nanosrc/transports/ipc/bipc.c @@ -39,12 +39,12 @@ #include "../../utils/win.h" #else #include -#ifndef __PNACL +//#ifndef __PNACL #include #include -#else -#include -#endif +//#else +//#include +//#endif #include #endif diff --git a/crypto777/nanosrc/transports/ipc/cipc.c b/crypto777/nanosrc/transports/ipc/cipc.c index 56dcbc83d..95dbea034 100755 --- a/crypto777/nanosrc/transports/ipc/cipc.c +++ b/crypto777/nanosrc/transports/ipc/cipc.c @@ -39,13 +39,13 @@ #include "../../utils/win.h" #else #include -#ifndef __PNACL +//#ifndef __PNACL #include #include -#else -#include -#include -#endif +//#else +//#include +//#include +//#endif #endif #define NN_CIPC_STATE_IDLE 1 diff --git a/crypto777/nanosrc/transports/ipc/ipc.c b/crypto777/nanosrc/transports/ipc/ipc.c index 1421ec276..444db69fb 100755 --- a/crypto777/nanosrc/transports/ipc/ipc.c +++ b/crypto777/nanosrc/transports/ipc/ipc.c @@ -37,11 +37,11 @@ #include "../../utils/win.h" #else #include -#ifndef __PNACL +//#ifndef __PNACL #include -#else -#include -#endif +//#else +//#include +//#endif #include #endif diff --git a/crypto777/nanosrc/transports/tcpmux/btcpmux.c b/crypto777/nanosrc/transports/tcpmux/btcpmux.c index 51fd16a64..8093b611b 100755 --- a/crypto777/nanosrc/transports/tcpmux/btcpmux.c +++ b/crypto777/nanosrc/transports/tcpmux/btcpmux.c @@ -44,12 +44,12 @@ #include "../../utils/win.h" #else #include -#ifndef __PNACL +//#ifndef __PNACL #include #include -#else -#include -#endif +//#else +//#include +//#endif #include #endif diff --git a/crypto777/nanosrc/transports/utils/tcpmux.c b/crypto777/nanosrc/transports/utils/tcpmux.c index b4f7f0105..1b8b03942 100755 --- a/crypto777/nanosrc/transports/utils/tcpmux.c +++ b/crypto777/nanosrc/transports/utils/tcpmux.c @@ -28,11 +28,11 @@ #else #include #include -#ifndef __PNACL +//#ifndef __PNACL #include -#else -#include -#endif +//#else +//#include +//#endif #endif #include "tcpmux.h" diff --git a/iguana/exchanges/stats.c b/iguana/exchanges/stats.c index 83f837c54..4a0ef48ec 100644 --- a/iguana/exchanges/stats.c +++ b/iguana/exchanges/stats.c @@ -328,7 +328,7 @@ char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *po j = i = 0; filetype[0] = 0; //printf("url.(%s) method.(%s)\n",&url[i],urlmethod); -#ifdef __PNACL__ +#ifdef __PNACL snprintf(furl,sizeof(furl),"%s/%s",GLOBAL_DBDIR,url+1); #else snprintf(furl,sizeof(furl),"%s",url+1); From 92b1db4fe112b7b374d059fcaf1fafe4ece69a1a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:19:47 +0300 Subject: [PATCH 134/176] Test --- iguana/exchanges/stats.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iguana/exchanges/stats.c b/iguana/exchanges/stats.c index 4a0ef48ec..3a76f3e48 100644 --- a/iguana/exchanges/stats.c +++ b/iguana/exchanges/stats.c @@ -328,11 +328,7 @@ char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *po j = i = 0; filetype[0] = 0; //printf("url.(%s) method.(%s)\n",&url[i],urlmethod); -#ifdef __PNACL - snprintf(furl,sizeof(furl),"%s/%s",GLOBAL_DBDIR,url+1); -#else snprintf(furl,sizeof(furl),"%s",url+1); -#endif if ( strcmp(&url[i],"/") == 0 && strcmp(urlmethod,"GET") == 0 ) { *jsonflagp = 1; From 98bb859eed9f61934f2782d80cddece4ca5fa735 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:22:22 +0300 Subject: [PATCH 135/176] Test --- crypto777/nanosrc/aio/usock_posix.h | 4 ---- crypto777/nanosrc/devices/tcpmuxd.c | 5 ----- crypto777/nanosrc/nn_config.h | 11 ----------- crypto777/nanosrc/tests/testutil.h | 6 +++--- crypto777/nanosrc/transports/ipc/bipc.c | 4 ---- crypto777/nanosrc/transports/ipc/cipc.c | 5 ----- crypto777/nanosrc/transports/ipc/ipc.c | 4 ---- crypto777/nanosrc/transports/tcpmux/btcpmux.c | 4 ---- crypto777/nanosrc/transports/utils/tcpmux.c | 4 ---- 9 files changed, 3 insertions(+), 44 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.h b/crypto777/nanosrc/aio/usock_posix.h index de3095f20..9286dcf24 100755 --- a/crypto777/nanosrc/aio/usock_posix.h +++ b/crypto777/nanosrc/aio/usock_posix.h @@ -25,11 +25,7 @@ #include #include -//#ifndef __PNACL #include -//#else -//#include -#endif struct nn_usock { diff --git a/crypto777/nanosrc/devices/tcpmuxd.c b/crypto777/nanosrc/devices/tcpmuxd.c index aea9c5139..ba2ba3a23 100755 --- a/crypto777/nanosrc/devices/tcpmuxd.c +++ b/crypto777/nanosrc/devices/tcpmuxd.c @@ -53,12 +53,7 @@ int nn_tcpmuxd (int port) #include #include #include -//#ifndef __PNACL #include -//#else -//#include -//#include -//#endif #include #include #include diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index f25bb74f7..52c9107c4 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -47,23 +47,12 @@ #define NN_HAVE_MSG_CONTROL 0 //#define STANDALONE 1 -#ifdef __PNACL -//#define FD_CLOEXEC 1 - -#define PNACL_message printf -//void PNACL_message(const char* format, ...); -#include -#include -//#include -//#include -#else #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 #define PNACL_message printf #include #include #endif -#endif /* Size of the buffer used for batch-reads of inbound data. To keep the performance optimal make sure that this value is larger than network MTU. */ diff --git a/crypto777/nanosrc/tests/testutil.h b/crypto777/nanosrc/tests/testutil.h index fd3d5b68c..04d26edbb 100755 --- a/crypto777/nanosrc/tests/testutil.h +++ b/crypto777/nanosrc/tests/testutil.h @@ -26,9 +26,9 @@ #include #include -#ifdef __PNACL -#define printf PostMessage -#endif +//#ifdef __PNACL +//#define printf PostMessage +//#endif #include "../utils/attr.h" #include "../utils/err.h" diff --git a/crypto777/nanosrc/transports/ipc/bipc.c b/crypto777/nanosrc/transports/ipc/bipc.c index 6dac6eae1..8527e45a6 100755 --- a/crypto777/nanosrc/transports/ipc/bipc.c +++ b/crypto777/nanosrc/transports/ipc/bipc.c @@ -39,12 +39,8 @@ #include "../../utils/win.h" #else #include -//#ifndef __PNACL #include #include -//#else -//#include -//#endif #include #endif diff --git a/crypto777/nanosrc/transports/ipc/cipc.c b/crypto777/nanosrc/transports/ipc/cipc.c index 95dbea034..1f6c3b7de 100755 --- a/crypto777/nanosrc/transports/ipc/cipc.c +++ b/crypto777/nanosrc/transports/ipc/cipc.c @@ -39,13 +39,8 @@ #include "../../utils/win.h" #else #include -//#ifndef __PNACL #include #include -//#else -//#include -//#include -//#endif #endif #define NN_CIPC_STATE_IDLE 1 diff --git a/crypto777/nanosrc/transports/ipc/ipc.c b/crypto777/nanosrc/transports/ipc/ipc.c index 444db69fb..45d3851ce 100755 --- a/crypto777/nanosrc/transports/ipc/ipc.c +++ b/crypto777/nanosrc/transports/ipc/ipc.c @@ -37,11 +37,7 @@ #include "../../utils/win.h" #else #include -//#ifndef __PNACL #include -//#else -//#include -//#endif #include #endif diff --git a/crypto777/nanosrc/transports/tcpmux/btcpmux.c b/crypto777/nanosrc/transports/tcpmux/btcpmux.c index 8093b611b..2dd554272 100755 --- a/crypto777/nanosrc/transports/tcpmux/btcpmux.c +++ b/crypto777/nanosrc/transports/tcpmux/btcpmux.c @@ -44,12 +44,8 @@ #include "../../utils/win.h" #else #include -//#ifndef __PNACL #include #include -//#else -//#include -//#endif #include #endif diff --git a/crypto777/nanosrc/transports/utils/tcpmux.c b/crypto777/nanosrc/transports/utils/tcpmux.c index 1b8b03942..b6cd7c24b 100755 --- a/crypto777/nanosrc/transports/utils/tcpmux.c +++ b/crypto777/nanosrc/transports/utils/tcpmux.c @@ -28,11 +28,7 @@ #else #include #include -//#ifndef __PNACL #include -//#else -//#include -//#endif #endif #include "tcpmux.h" From 8dc560162f832f06eda5172e29693b9067ef81da Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:24:44 +0300 Subject: [PATCH 136/176] Test --- crypto777/nanosrc/nn_config.h | 2 +- crypto777/nanosrc/utils/err.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index 52c9107c4..6326a0f72 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -46,10 +46,10 @@ #define NN_HAVE_MSG_CONTROL 0 //#define STANDALONE 1 +#define PNACL_message printf #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 -#define PNACL_message printf #include #include #endif diff --git a/crypto777/nanosrc/utils/err.h b/crypto777/nanosrc/utils/err.h index a9485549e..e57e57c02 100755 --- a/crypto777/nanosrc/utils/err.h +++ b/crypto777/nanosrc/utils/err.h @@ -26,6 +26,7 @@ #include #include #include +#define PNACL_message printf /* Include nn.h header to define nanomsg-specific error codes. */ #include "../nn.h" From 10c7c8f6ea31513a5c5f4ecef6f353580aa86ebb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:27:38 +0300 Subject: [PATCH 137/176] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a64f4478e..25354a4c6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1061,6 +1061,11 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * return(retstr); } +void PNACL_message(...) +{ + +} + #endif From 3d380c646a7fb090ef588960e21a139751d780dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:28:21 +0300 Subject: [PATCH 138/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 25354a4c6..7d41836f6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1061,7 +1061,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * return(retstr); } -void PNACL_message(...) +void PNACL_message(char *fmt,...) { } From 3829b2f5580f24cf94aabdf4ba2d7f651caafcdf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:33:01 +0300 Subject: [PATCH 139/176] Test --- crypto777/nanosrc/aio/worker_posix.c | 1 - crypto777/nanosrc/utils/efd_eventfd.c | 4 ++-- crypto777/nanosrc/utils/efd_socketpair.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crypto777/nanosrc/aio/worker_posix.c b/crypto777/nanosrc/aio/worker_posix.c index 070a87a86..73dd81955 100755 --- a/crypto777/nanosrc/aio/worker_posix.c +++ b/crypto777/nanosrc/aio/worker_posix.c @@ -103,7 +103,6 @@ int nn_worker_init(struct nn_worker *self) { int32_t rc; PNACL_message("nn_worker_init %p\n",self); - //sleep(1); rc = nn_efd_init(&self->efd); PNACL_message("efd init: rc.%d\n",rc); if ( rc < 0 ) diff --git a/crypto777/nanosrc/utils/efd_eventfd.c b/crypto777/nanosrc/utils/efd_eventfd.c index ae3449c15..f659296e7 100755 --- a/crypto777/nanosrc/utils/efd_eventfd.c +++ b/crypto777/nanosrc/utils/efd_eventfd.c @@ -32,9 +32,9 @@ int nn_efd_init(struct nn_efd *self) { int rc; int flags; - //PostMessage("inside efd_init eventfd\n"); + PNACL_msg("inside efd_init eventfd\n"); self->efd = eventfd(0, EFD_CLOEXEC); - //PostMessage("self->efd: %d\n",self->efd); + PNACL_msg("self->efd: %d\n",self->efd); if (self->efd == -1 && (errno == EMFILE || errno == ENFILE)) return -EMFILE; errno_assert(self->efd != -1); diff --git a/crypto777/nanosrc/utils/efd_socketpair.c b/crypto777/nanosrc/utils/efd_socketpair.c index aba164fa7..e04a4935e 100755 --- a/crypto777/nanosrc/utils/efd_socketpair.c +++ b/crypto777/nanosrc/utils/efd_socketpair.c @@ -35,7 +35,7 @@ int nn_efd_init (struct nn_efd *self) int rc; int flags; int sp [2]; - + PNACL_msg("socketpair efdinit\n"); #if defined SOCK_CLOEXEC rc = socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sp); #else From 83c73c3fbe9fb499f637656743cdbf77a3648a68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:33:54 +0300 Subject: [PATCH 140/176] Test --- crypto777/nanosrc/utils/efd_eventfd.c | 4 ++-- crypto777/nanosrc/utils/efd_socketpair.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto777/nanosrc/utils/efd_eventfd.c b/crypto777/nanosrc/utils/efd_eventfd.c index f659296e7..abbb904f1 100755 --- a/crypto777/nanosrc/utils/efd_eventfd.c +++ b/crypto777/nanosrc/utils/efd_eventfd.c @@ -32,9 +32,9 @@ int nn_efd_init(struct nn_efd *self) { int rc; int flags; - PNACL_msg("inside efd_init eventfd\n"); + PNACL_message("inside efd_init eventfd\n"); self->efd = eventfd(0, EFD_CLOEXEC); - PNACL_msg("self->efd: %d\n",self->efd); + PNACL_message("self->efd: %d\n",self->efd); if (self->efd == -1 && (errno == EMFILE || errno == ENFILE)) return -EMFILE; errno_assert(self->efd != -1); diff --git a/crypto777/nanosrc/utils/efd_socketpair.c b/crypto777/nanosrc/utils/efd_socketpair.c index e04a4935e..6221aef4c 100755 --- a/crypto777/nanosrc/utils/efd_socketpair.c +++ b/crypto777/nanosrc/utils/efd_socketpair.c @@ -35,7 +35,7 @@ int nn_efd_init (struct nn_efd *self) int rc; int flags; int sp [2]; - PNACL_msg("socketpair efdinit\n"); + PNACL_message("socketpair efdinit\n"); #if defined SOCK_CLOEXEC rc = socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sp); #else From a3b000cbfb87fcf59e963280cde29fd34e42658e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:35:50 +0300 Subject: [PATCH 141/176] Test --- crypto777/nanosrc/nn_config.h | 4 ++-- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/Makefile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index 6326a0f72..f8646becb 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -31,9 +31,9 @@ #define NN_HAVE_SEMAPHORE 1 // must have // need one of following 3, listed in order of precedence, used by efd* -//#define NN_HAVE_EVENTFD 1 +#define NN_HAVE_EVENTFD 1 //#define NN_HAVE_PIPE 1 -#define NN_HAVE_SOCKETPAIR 1 +//#define NN_HAVE_SOCKETPAIR 1 // need one of following 3, listed in order of precedence, used by poller* #define NN_USE_POLL 1 diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7d41836f6..0da118036 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1063,7 +1063,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * void PNACL_message(char *fmt,...) { - + printf(fmt); } #endif diff --git a/iguana/exchanges/Makefile b/iguana/exchanges/Makefile index 6d629ce54..a7b10c035 100644 --- a/iguana/exchanges/Makefile +++ b/iguana/exchanges/Makefile @@ -4,6 +4,6 @@ include ../crypto777/crypto777.sources all: - echo building... $(CRYPTO777_SRCS) + #echo building... $(CRYPTO777_SRCS) emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -D__PNACL -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm From 879f4a0669b61efa56a6d8f69455494f424d2bd9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:36:42 +0300 Subject: [PATCH 142/176] Test --- crypto777/nanosrc/nn_config.h | 4 ++-- iguana/exchanges/LP_nativeDEX.c | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index f8646becb..4b085c748 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -31,8 +31,8 @@ #define NN_HAVE_SEMAPHORE 1 // must have // need one of following 3, listed in order of precedence, used by efd* -#define NN_HAVE_EVENTFD 1 -//#define NN_HAVE_PIPE 1 +//#define NN_HAVE_EVENTFD 1 +#define NN_HAVE_PIPE 1 //#define NN_HAVE_SOCKETPAIR 1 // need one of following 3, listed in order of precedence, used by poller* diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0da118036..293cd6a49 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1063,7 +1063,6 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * void PNACL_message(char *fmt,...) { - printf(fmt); } #endif From b12fcd8967305561c41c788d5d19b44c6af2bf63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:46:37 +0300 Subject: [PATCH 143/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 4 +++- crypto777/nanosrc/aio/usock_win.c | 2 +- crypto777/nanosrc/aio/worker_posix.c | 22 +++++++++++----------- crypto777/nanosrc/core/global.c | 8 ++++---- iguana/exchanges/mm.c | 2 +- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index 44a8acb65..f58345031 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -286,11 +286,13 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, /* Allow re-using the address. */ opt = 1; + printf("call setsockopt in nn_usock_bind\n"); rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); + printf("called setsockopt in nn_usock_bind returns %d\n",rc); errno_assert (rc == 0); rc = bind (self->s, addr, (socklen_t) addrlen); - //printf("usock.%d -> bind rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); + printf("usock.%d -> bind rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); if (nn_slow (rc != 0)) return -errno; diff --git a/crypto777/nanosrc/aio/usock_win.c b/crypto777/nanosrc/aio/usock_win.c index 5eedfb60f..6e9f92427 100755 --- a/crypto777/nanosrc/aio/usock_win.c +++ b/crypto777/nanosrc/aio/usock_win.c @@ -126,7 +126,7 @@ int nn_usock_start (struct nn_usock *self, int domain, int type, int protocol) #if defined HANDLE_FLAG_INHERIT BOOL brc; #endif - +printf("nn_usock_start protocol %d\n",protocol); /* NamedPipes aren't sockets. They don't need all the socket initialisation stuff. */ if (domain != AF_UNIX) { diff --git a/crypto777/nanosrc/aio/worker_posix.c b/crypto777/nanosrc/aio/worker_posix.c index 73dd81955..5e8ada54c 100755 --- a/crypto777/nanosrc/aio/worker_posix.c +++ b/crypto777/nanosrc/aio/worker_posix.c @@ -102,28 +102,28 @@ void nn_worker_task_term (struct nn_worker_task *self) int nn_worker_init(struct nn_worker *self) { int32_t rc; - PNACL_message("nn_worker_init %p\n",self); + //PNACL_message("nn_worker_init %p\n",self); rc = nn_efd_init(&self->efd); - PNACL_message("efd init: rc.%d\n",rc); + //PNACL_message("efd init: rc.%d\n",rc); if ( rc < 0 ) return rc; - PNACL_message("nn_mutex_init\n"); + //PNACL_message("nn_mutex_init\n"); nn_mutex_init(&self->sync); - PNACL_message("nn_queue_init\n"); + //PNACL_message("nn_queue_init\n"); nn_queue_init(&self->tasks); - PNACL_message("nn_queue_item_init\n"); + //PNACL_message("nn_queue_item_init\n"); nn_queue_item_init(&self->stop); - PNACL_message("nn_poller_init\n"); + //PNACL_message("nn_poller_init\n"); nn_poller_init(&self->poller); - PNACL_message("nn_poller_add\n"); + //PNACL_message("nn_poller_add\n"); nn_poller_add(&self->poller,nn_efd_getfd(&self->efd),&self->efd_hndl); - PNACL_message("nn_poller_set_in\n"); + //PNACL_message("nn_poller_set_in\n"); nn_poller_set_in(&self->poller, &self->efd_hndl); - PNACL_message("nn_timerset_init\n"); + //PNACL_message("nn_timerset_init\n"); nn_timerset_init(&self->timerset); - PNACL_message("nn_thread_init\n"); + //PNACL_message("nn_thread_init\n"); nn_thread_init(&self->thread,nn_worker_routine, self); - PNACL_message("finished nn_worker_init\n"); + //PNACL_message("finished nn_worker_init\n"); return 0; } diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index e8f750f88..31db0c38d 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -243,11 +243,11 @@ PNACL_message("list init\n"); //sleep(1); PNACL_message("transports init\n"); // Plug in individual transports. - //nn_global_add_transport(nn_ipc); +nn_global_add_transport(nn_ipc); nn_global_add_transport(nn_tcp); - //nn_global_add_transport(nn_inproc); - //nn_global_add_transport(nn_ws); - //nn_global_add_transport(nn_tcpmux); +nn_global_add_transport(nn_inproc); +nn_global_add_transport(nn_ws); +nn_global_add_transport(nn_tcpmux); //sleep(1); PNACL_message("socktypes init\n"); // Plug in individual socktypes diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 2a7415d2c..72bc7a5ad 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -35,7 +35,7 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,char *r void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); //defined(__APPLE__) || -#if defined(WIN32) || defined(USE_STATIC_NANOMSG) +#ifdef FROM_JS // defined(WIN32) || defined(USE_STATIC_NANOMSG) #include "../../crypto777/nanosrc/nn.h" #include "../../crypto777/nanosrc/bus.h" #include "../../crypto777/nanosrc/pubsub.h" From 1ea700cf882f3248d794fa399643758c809f9908 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:47:35 +0300 Subject: [PATCH 144/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 293cd6a49..a64f4478e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1061,10 +1061,6 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * return(retstr); } -void PNACL_message(char *fmt,...) -{ -} - #endif From 6578d99aeb08a4d118fc55d7ce7f6c919667f719 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:51:10 +0300 Subject: [PATCH 145/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 54 ++++++++++---------- crypto777/nanosrc/aio/worker_posix.c | 42 ++++++++-------- crypto777/nanosrc/core/global.c | 64 ++++++++++++------------ crypto777/nanosrc/core/pipe.c | 8 +-- crypto777/nanosrc/core/sock.c | 8 +-- crypto777/nanosrc/nn_config.h | 2 +- crypto777/nanosrc/utils/efd_eventfd.c | 4 +- crypto777/nanosrc/utils/efd_pipe.c | 12 ++--- crypto777/nanosrc/utils/efd_socketpair.c | 2 +- crypto777/nanosrc/utils/err.c | 4 +- crypto777/nanosrc/utils/err.h | 14 +++--- crypto777/nanosrc/utils/thread_posix.c | 4 +- iguana/exchanges/Makefile | 1 - 13 files changed, 109 insertions(+), 110 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index f58345031..fd3ab0332 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -167,7 +167,7 @@ int nn_usock_start (struct nn_usock *self, int domain, int type, int protocol) s = socket (domain, type, protocol); if (nn_slow (s < 0)) return -errno; - //PNACL_message("got socket s.%d\n",s); + //PNACL_msg("got socket s.%d\n",s); nn_usock_init_from_fd (self, s); /* Start the state machine. */ @@ -368,7 +368,7 @@ void nn_usock_accept (struct nn_usock *self, struct nn_usock *listener) and allow processing other events in the meantime */ if (nn_slow (errno != EAGAIN && errno != EWOULDBLOCK && errno != ECONNABORTED && errno != listener->errnum)) { - PNACL_message("listen errno.%d\n",errno); + PNACL_msg("listen errno.%d\n",errno); listener->errnum = errno; listener->state = NN_USOCK_STATE_ACCEPTING_ERROR; nn_fsm_raise (&listener->fsm, @@ -406,7 +406,7 @@ void nn_usock_connect (struct nn_usock *self, const struct sockaddr *addr, if ( nn_slow(errno != EINPROGRESS) ) { self->errnum = errno; - PNACL_message("error.%d not EINPROGRESS\n",errno); + PNACL_msg("error.%d not EINPROGRESS\n",errno); nn_fsm_action (&self->fsm, NN_USOCK_ACTION_ERROR); return; } @@ -435,9 +435,9 @@ void nn_usock_send (struct nn_usock *self, const struct nn_iovec *iov, self->out.iov [out].iov_base = iov [i].iov_base; self->out.iov [out].iov_len = iov [i].iov_len; out++; - //PNACL_message("{%d} ",(int)iov [i].iov_len); + //PNACL_msg("{%d} ",(int)iov [i].iov_len); } - //PNACL_message("iov[%d]\n",out); + //PNACL_msg("iov[%d]\n",out); self->out.hdr.msg_iovlen = out; /* Try to send the data immediately. */ @@ -474,17 +474,17 @@ void nn_usock_recv (struct nn_usock *self, void *buf, size_t len, int *fd) rc = nn_usock_recv_raw (self, buf, &nbytes); if (nn_slow (rc < 0)) { errnum_assert (rc == -ECONNRESET, -rc); - //PNACL_message("rc.%d vs ECONNRESET\n",rc,ECONNRESET); + //PNACL_msg("rc.%d vs ECONNRESET\n",rc,ECONNRESET); nn_fsm_action (&self->fsm, NN_USOCK_ACTION_ERROR); return; } //int i; //for (i=0; i<16&&ifsm, &self->event_received, NN_USOCK_RECEIVED); return; } @@ -1023,19 +1023,19 @@ int32_t nn_getiovec_size(uint8_t *buf,int32_t maxlen,struct msghdr *hdr) if ( nn_slow(iov->iov_len == NN_MSG) ) { errno = EINVAL; - PNACL_message("ERROR: iov->iov_len == NN_MSG\n"); + PNACL_msg("ERROR: iov->iov_len == NN_MSG\n"); return(-1); } if ( nn_slow(!iov->iov_base && iov->iov_len) ) { errno = EFAULT; - PNACL_message("ERROR: !iov->iov_base && iov->iov_len\n"); + PNACL_msg("ERROR: !iov->iov_base && iov->iov_len\n"); return(-1); } if ( maxlen > 0 && nn_slow(size + iov->iov_len > maxlen) ) { errno = EINVAL; - PNACL_message("ERROR: sz.%d + iov->iov_len.%d < maxlen.%d\n",(int32_t)size,(int32_t)iov->iov_len,maxlen); + PNACL_msg("ERROR: sz.%d + iov->iov_len.%d < maxlen.%d\n",(int32_t)size,(int32_t)iov->iov_len,maxlen); return(-1); } if ( iov->iov_len > 0 ) @@ -1071,10 +1071,10 @@ ssize_t mysendmsg(int32_t usock,struct msghdr *hdr,int32_t flags) if ( nn_getiovec_size(&buf[offset],veclen,hdr) == veclen ) { nbytes = send(usock,buf,offset + veclen,0); - //PNACL_message(">>>>>>>>> send.[%d %d %d %d] (n.%d v.%d c.%d)-> usock.%d nbytes.%d\n",buf[offset],buf[offset+1],buf[offset+2],buf[offset+3],(int32_t)offset+veclen,veclen,clen,usock,(int32_t)nbytes); + //PNACL_msg(">>>>>>>>> send.[%d %d %d %d] (n.%d v.%d c.%d)-> usock.%d nbytes.%d\n",buf[offset],buf[offset+1],buf[offset+2],buf[offset+3],(int32_t)offset+veclen,veclen,clen,usock,(int32_t)nbytes); if ( nbytes != offset + veclen ) { - //PNACL_message("nbytes.%d != offset.%d veclen.%d errno.%d usock.%d\n",(int32_t)nbytes,(int32_t)offset,veclen,errno,usock); + //PNACL_msg("nbytes.%d != offset.%d veclen.%d errno.%d usock.%d\n",(int32_t)nbytes,(int32_t)offset,veclen,errno,usock); } if ( nbytes >= offset ) nbytes -= offset; @@ -1082,19 +1082,19 @@ ssize_t mysendmsg(int32_t usock,struct msghdr *hdr,int32_t flags) else { err = -errno; - PNACL_message("mysendmsg: unexpected nn_getiovec_size error %d\n",err); + PNACL_msg("mysendmsg: unexpected nn_getiovec_size error %d\n",err); } if ( buf != _buf ) free(buf); if ( err != 0 ) { - PNACL_message("nn_usock_send_raw errno.%d err.%d\n",errno,err); + PNACL_msg("nn_usock_send_raw errno.%d err.%d\n",errno,err); return(-errno); } } else { - PNACL_message("nn_usock_send_raw errno.%d invalid iovec size\n",errno); + PNACL_msg("nn_usock_send_raw errno.%d invalid iovec size\n",errno); return(-errno); } return(nbytes); @@ -1106,32 +1106,32 @@ ssize_t myrecvmsg(int32_t usock,struct msghdr *hdr,int32_t flags,int32_t len) iov = hdr->msg_iov; /*if ( (n= (int32_t)recv(usock,lens,sizeof(lens),0)) != sizeof(lens) ) { - PNACL_message("error getting veclen/clen n.%d vs %d from usock.%d\n",n,(int32_t)sizeof(lens),usock); + PNACL_msg("error getting veclen/clen n.%d vs %d from usock.%d\n",n,(int32_t)sizeof(lens),usock); return(0); - } else PNACL_message("GOT %d bytes from usock.%d\n",n,usock); + } else PNACL_msg("GOT %d bytes from usock.%d\n",n,usock); offset = 0; veclen = lens[offset++]; veclen |= ((int32_t)lens[offset++] << 8); veclen |= ((int32_t)lens[offset++] << 16); clen = lens[offset++]; clen |= ((int32_t)lens[offset++] << 8); - PNACL_message("veclen.%d clen.%d waiting in usock.%d\n",veclen,clen,usock); + PNACL_msg("veclen.%d clen.%d waiting in usock.%d\n",veclen,clen,usock); if ( clen > 0 ) { if ( (cbytes= (int32_t)recv(usock,hdr->msg_control,clen,0)) != clen ) { - PNACL_message("myrecvmsg: unexpected cbytes.%d vs clen.%d\n",cbytes,clen); + PNACL_msg("myrecvmsg: unexpected cbytes.%d vs clen.%d\n",cbytes,clen); } } else cbytes = 0;*/ hdr->msg_controllen = 0; if ( (nbytes= (int32_t)recv(usock,iov->iov_base,len,0)) != len ) { - //PNACL_message("myrecvmsg: partial nbytes.%d vs veclen.%d\n",(int32_t)nbytes,len); + //PNACL_msg("myrecvmsg: partial nbytes.%d vs veclen.%d\n",(int32_t)nbytes,len); } - //PNACL_message("GOT nbytes.%d of len.%d from usock.%d\n",(int32_t)nbytes,len,usock); + //PNACL_msg("GOT nbytes.%d of len.%d from usock.%d\n",(int32_t)nbytes,len,usock); if ( 0 && nbytes > 0 ) { - PNACL_message("got nbytes.%d from usock.%d [%d %d %d %d]\n",(int32_t)nbytes,usock,((uint8_t *)iov->iov_base)[0],((uint8_t *)iov->iov_base)[1],((uint8_t *)iov->iov_base)[2],((uint8_t *)iov->iov_base)[3]); + PNACL_msg("got nbytes.%d from usock.%d [%d %d %d %d]\n",(int32_t)nbytes,usock,((uint8_t *)iov->iov_base)[0],((uint8_t *)iov->iov_base)[1],((uint8_t *)iov->iov_base)[2],((uint8_t *)iov->iov_base)[3]); } return(nbytes); } @@ -1201,13 +1201,13 @@ int32_t nn_process_cmsg(struct nn_usock *self,struct msghdr *hdr) memcpy(&retval,(int32_t *)CMSG_DATA(cmsg),sizeof(int32_t)); if ( self->in.pfd ) { - PNACL_message("CMSG set self->in.pfd (%d)\n",retval); + PNACL_msg("CMSG set self->in.pfd (%d)\n",retval); *self->in.pfd = retval; self->in.pfd = NULL; } else { - PNACL_message("CMSG nn_closefd(%d)\n",retval); + PNACL_msg("CMSG nn_closefd(%d)\n",retval); nn_closefd(retval); } break; @@ -1312,7 +1312,7 @@ static int nn_usock_recv_raw(struct nn_usock *self, void *buf, size_t *len) } } else if ( hdr.msg_controllen > 0 ) nn_process_cmsg(self,&hdr); - //PNACL_message("nbytes.%d length.%d *len %d\n",(int)nbytes,(int)length,(int)*len); + //PNACL_msg("nbytes.%d length.%d *len %d\n",(int)nbytes,(int)length,(int)*len); // If the data were received directly into the place we can return straight away if ( usebuf != 0 ) diff --git a/crypto777/nanosrc/aio/worker_posix.c b/crypto777/nanosrc/aio/worker_posix.c index 5e8ada54c..8d3ed2a46 100755 --- a/crypto777/nanosrc/aio/worker_posix.c +++ b/crypto777/nanosrc/aio/worker_posix.c @@ -102,28 +102,28 @@ void nn_worker_task_term (struct nn_worker_task *self) int nn_worker_init(struct nn_worker *self) { int32_t rc; - //PNACL_message("nn_worker_init %p\n",self); + //PNACL_msg("nn_worker_init %p\n",self); rc = nn_efd_init(&self->efd); - //PNACL_message("efd init: rc.%d\n",rc); + //PNACL_msg("efd init: rc.%d\n",rc); if ( rc < 0 ) return rc; - //PNACL_message("nn_mutex_init\n"); + //PNACL_msg("nn_mutex_init\n"); nn_mutex_init(&self->sync); - //PNACL_message("nn_queue_init\n"); + //PNACL_msg("nn_queue_init\n"); nn_queue_init(&self->tasks); - //PNACL_message("nn_queue_item_init\n"); + //PNACL_msg("nn_queue_item_init\n"); nn_queue_item_init(&self->stop); - //PNACL_message("nn_poller_init\n"); + //PNACL_msg("nn_poller_init\n"); nn_poller_init(&self->poller); - //PNACL_message("nn_poller_add\n"); + //PNACL_msg("nn_poller_add\n"); nn_poller_add(&self->poller,nn_efd_getfd(&self->efd),&self->efd_hndl); - //PNACL_message("nn_poller_set_in\n"); + //PNACL_msg("nn_poller_set_in\n"); nn_poller_set_in(&self->poller, &self->efd_hndl); - //PNACL_message("nn_timerset_init\n"); + //PNACL_msg("nn_timerset_init\n"); nn_timerset_init(&self->timerset); - //PNACL_message("nn_thread_init\n"); + //PNACL_msg("nn_thread_init\n"); nn_thread_init(&self->thread,nn_worker_routine, self); - //PNACL_message("finished nn_worker_init\n"); + //PNACL_msg("finished nn_worker_init\n"); return 0; } @@ -173,7 +173,7 @@ static void nn_worker_routine (void *arg) struct nn_worker_task *task; struct nn_worker_fd *fd; struct nn_worker_timer *timer; - PNACL_message("nn_worker_routine started\n"); + PNACL_msg("nn_worker_routine started\n"); self = (struct nn_worker*) arg; while ( 1 ) // Infinite loop. It will be interrupted only when the object is shut down. { @@ -185,7 +185,7 @@ static void nn_worker_routine (void *arg) rc = nn_timerset_event(&self->timerset, &thndl); if ( rc == -EAGAIN ) break; - PNACL_message("nn_worker process expired user\n"); + PNACL_msg("nn_worker process expired user\n"); errnum_assert(rc == 0, -rc); timer = nn_cont(thndl, struct nn_worker_timer, hndl); nn_ctx_enter(timer->owner->ctx); @@ -197,7 +197,7 @@ static void nn_worker_routine (void *arg) rc = nn_poller_event(&self->poller,&pevent,&phndl); // Get next poller event, such as IN or OUT if ( nn_slow(rc == -EAGAIN) ) break; - PNACL_message("nn_worker process all events from the poller\n"); + PNACL_msg("nn_worker process all events from the poller\n"); if ( phndl == &self->efd_hndl ) // If there are any new incoming worker tasks, process them { nn_assert (pevent == NN_POLLER_IN); @@ -212,14 +212,14 @@ static void nn_worker_routine (void *arg) item = nn_queue_pop(&tasks); // Next worker task if ( nn_slow(!item) ) break; - PNACL_message("nn_worker next worker task\n"); + PNACL_msg("nn_worker next worker task\n"); if ( nn_slow(item == &self->stop) ) // If the worker thread is asked to stop, do so { nn_queue_term(&tasks); return; } // It's a user-defined task. Notify the user that it has arrived in the worker thread - PNACL_message("nn_worker user defined task\n"); + PNACL_msg("nn_worker user defined task\n"); task = nn_cont(item,struct nn_worker_task,item); nn_ctx_enter(task->owner->ctx); nn_fsm_feed(task->owner,task->src,NN_WORKER_TASK_EXECUTE,task); @@ -228,15 +228,15 @@ static void nn_worker_routine (void *arg) nn_queue_term (&tasks); continue; } - PNACL_message("nn_worker true i/o, invoke handler\n"); + PNACL_msg("nn_worker true i/o, invoke handler\n"); fd = nn_cont(phndl,struct nn_worker_fd,hndl); // It's a true I/O event. Invoke the handler - PNACL_message("nn_worker true i/o, fd.%p\n",fd); + PNACL_msg("nn_worker true i/o, fd.%p\n",fd); nn_ctx_enter(fd->owner->ctx); - PNACL_message("nn_worker true i/o, after nn_ctx_enter\n"); + PNACL_msg("nn_worker true i/o, after nn_ctx_enter\n"); nn_fsm_feed(fd->owner,fd->src,pevent,fd); - PNACL_message("nn_worker true i/o, after nn_fsm_feed leave.%p\n",fd->owner->ctx); + PNACL_msg("nn_worker true i/o, after nn_fsm_feed leave.%p\n",fd->owner->ctx); nn_ctx_leave(fd->owner->ctx); - PNACL_message("nn_worker true i/o, after nn_ctx_leave\n"); + PNACL_msg("nn_worker true i/o, after nn_ctx_leave\n"); } } } diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 31db0c38d..00a5c48d3 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -201,9 +201,9 @@ static void nn_global_add_transport (struct nn_transport *transport) static void nn_global_add_socktype (struct nn_socktype *socktype) { - PNACL_message("add socktype %p -> %p\n",socktype,&SELF.socktypes); + PNACL_msg("add socktype %p -> %p\n",socktype,&SELF.socktypes); nn_list_insert (&SELF.socktypes, &socktype->item,nn_list_end (&SELF.socktypes)); - PNACL_message("added socktype %p -> %p\n",socktype,&SELF.socktypes); + PNACL_msg("added socktype %p -> %p\n",socktype,&SELF.socktypes); } void nn_global_init (void) { @@ -218,7 +218,7 @@ void nn_global_init (void) nn_assert (LOBYTE (data.wVersion) == 2 && HIBYTE (data.wVersion) == 2); #endif - PNACL_message("nn_global_init\n"); + PNACL_msg("nn_global_init\n"); nn_alloc_init(); // Initialise the memory allocation subsystem nn_random_seed(); // Seed the pseudo-random number generator // Allocate the global table of SP sockets. @@ -227,7 +227,7 @@ void nn_global_init (void) for (i=0; imsg_iov[0].iov_base) = chunk; sz = nn_chunk_size(chunk); - //PNACL_message("got message -> iov_base.%p sz.%d\n",msghdr->msg_iov[0].iov_base,(int32_t)sz); + //PNACL_msg("got message -> iov_base.%p sz.%d\n",msghdr->msg_iov[0].iov_base,(int32_t)sz); } else // Copy the message content into the supplied gather array { data = nn_chunkref_data(&msg.body); sz = nn_chunkref_size(&msg.body); - //PNACL_message("got message -> data.%p sz.%d\n",data,(int32_t)sz); + //PNACL_msg("got message -> data.%p sz.%d\n",data,(int32_t)sz); for (i=0; i!=msghdr->msg_iovlen; i++) { iov = &msghdr->msg_iov[i]; @@ -809,7 +809,7 @@ int32_t nn_recvmsg(int32_t s,struct nn_msghdr *msghdr,int32_t flags) int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) { int32_t rc,i,nnmsg; size_t sz,spsz; struct nn_iovec *iov; struct nn_msg msg; void *chunk; struct nn_cmsghdr *cmsg; - //PNACL_message("nn_sendmsg.(%d) \n",s); + //PNACL_msg("nn_sendmsg.(%d) \n",s); NN_BASIC_CHECKS; if ( nn_slow(!msghdr) ) { @@ -928,7 +928,7 @@ int32_t nn_recvmsg(int32_t s,struct nn_msghdr *msghdr,int32_t flags) { struct nn_msg msg; uint8_t *data; struct nn_iovec *iov; void *chunk,*ctrl; struct nn_cmsghdr *chdr; int32_t i,rc; size_t sz,hdrssz,ctrlsz,spsz,sptotalsz; - //PNACL_message("nn_recvmsg.(%d) \n",s); + //PNACL_msg("nn_recvmsg.(%d) \n",s); NN_BASIC_CHECKS; if ( nn_slow(!msghdr) ) { @@ -940,7 +940,7 @@ int32_t nn_recvmsg(int32_t s,struct nn_msghdr *msghdr,int32_t flags) errno = EMSGSIZE; return -1; } - //PNACL_message("get a message from sock.%d\n",s); + //PNACL_msg("get a message from sock.%d\n",s); rc = nn_sock_recv(SELF.socks[s],&msg,flags); // Get a message if ( nn_slow(rc < 0) ) { @@ -952,13 +952,13 @@ int32_t nn_recvmsg(int32_t s,struct nn_msghdr *msghdr,int32_t flags) chunk = nn_chunkref_getchunk(&msg.body); *(void **)(msghdr->msg_iov[0].iov_base) = chunk; sz = nn_chunk_size(chunk); - //PNACL_message("got message -> iov_base.%p sz.%d\n",msghdr->msg_iov[0].iov_base,(int32_t)sz); + //PNACL_msg("got message -> iov_base.%p sz.%d\n",msghdr->msg_iov[0].iov_base,(int32_t)sz); } else // Copy the message content into the supplied gather array { data = nn_chunkref_data(&msg.body); sz = nn_chunkref_size (&msg.body); - //PNACL_message("got message -> data.%p sz.%d\n",data,(int32_t)sz); + //PNACL_msg("got message -> data.%p sz.%d\n",data,(int32_t)sz); for (i=0; i!=msghdr->msg_iovlen; i++) { iov = &msghdr->msg_iov[i]; @@ -1150,7 +1150,7 @@ static void nn_global_submit_errors (int i, struct nn_sock *s, len = snprintf (curbuf, buf_left, " nanomsg: Endpoint %d [%s] error: %s\n", ep->eid, nn_ep_getaddr (ep), nn_strerror (ep->last_errno)); - PNACL_message("%s\n",curbuf); + PNACL_msg("%s\n",curbuf); #endif if (buf_left < len) break; @@ -1247,7 +1247,7 @@ static int nn_global_create_ep (int s, const char *addr, int bind) #ifdef NN_USE_MYMSG if ( strncmp("inproc",proto,strlen("inproc")) != 0 && strncmp("ipc",proto,strlen("ipc")) != 0 && strncmp("tcp",proto,strlen("tcp")) != 0 ) { - PNACL_message("only ipc, inproc and tcp transport is supported\n"); + PNACL_msg("only ipc, inproc and tcp transport is supported\n"); printf("only ipc, inproc and tcp transport is supported\n"); fprintf(stderr,"only ipc, inproc and tcp transport is supported\n"); exit(-1); @@ -1324,12 +1324,12 @@ static void nn_global_handler (struct nn_fsm *myself,int src, int type, NN_UNUSE nn_timer_start (&global->stat_timer, 10000); // Start statistics collection timer return; default: - PNACL_message("bad action %d type %d\n",src,type); + PNACL_msg("bad action %d type %d\n",src,type); nn_fsm_bad_action(global->state, src, type); } default: - PNACL_message("bad source %d\n",src); + PNACL_msg("bad source %d\n",src); nn_fsm_bad_source(global->state, src, type); } diff --git a/crypto777/nanosrc/core/pipe.c b/crypto777/nanosrc/core/pipe.c index 2b674db44..a025d1f00 100755 --- a/crypto777/nanosrc/core/pipe.c +++ b/crypto777/nanosrc/core/pipe.c @@ -58,7 +58,7 @@ void nn_pipebase_init(struct nn_pipebase *self,const struct nn_pipebase_vfptr *v memcpy(&self->options,&epbase->ep->options,sizeof(struct nn_ep_options)); nn_fsm_event_init(&self->in); nn_fsm_event_init(&self->out); - PNACL_message("pipebase_init vfptr.%p recv.%p rcvprio.%d\n",vfptr,vfptr->recv,self->options.rcvprio); + PNACL_msg("pipebase_init vfptr.%p recv.%p rcvprio.%d\n",vfptr,vfptr->recv,self->options.rcvprio); } void nn_pipebase_term (struct nn_pipebase *self) @@ -78,7 +78,7 @@ int nn_pipebase_start (struct nn_pipebase *self) self->instate = NN_PIPEBASE_INSTATE_ASYNC; self->outstate = NN_PIPEBASE_OUTSTATE_IDLE; rc = nn_sock_add(self->sock,(struct nn_pipe *)self); - PNACL_message("nn_pipebase_start self.%p rc.%d\n",self,rc); + PNACL_msg("nn_pipebase_start self.%p rc.%d\n",self,rc); if ( nn_slow(rc < 0) ) { self->state = NN_PIPEBASE_STATE_FAILED; @@ -98,7 +98,7 @@ void nn_pipebase_stop(struct nn_pipebase *self) void nn_pipebase_received(struct nn_pipebase *self) { - PNACL_message("nn_pipebase_received\n"); + PNACL_msg("nn_pipebase_received\n"); if ( nn_fast(self->instate == NN_PIPEBASE_INSTATE_RECEIVING) ) { self->instate = NN_PIPEBASE_INSTATE_RECEIVED; @@ -196,7 +196,7 @@ int nn_pipe_recv(struct nn_pipe *self,struct nn_msg *msg) pipebase = (struct nn_pipebase*) self; nn_assert (pipebase->instate == NN_PIPEBASE_INSTATE_IDLE); pipebase->instate = NN_PIPEBASE_INSTATE_RECEIVING; - PNACL_message("call pipebase recv\n"); + PNACL_msg("call pipebase recv\n"); rc = pipebase->vfptr->recv (pipebase,msg); errnum_assert (rc >= 0, -rc); if ( nn_fast(pipebase->instate == NN_PIPEBASE_INSTATE_RECEIVED) ) diff --git a/crypto777/nanosrc/core/sock.c b/crypto777/nanosrc/core/sock.c index 6ba4bf5b1..83e8afce7 100755 --- a/crypto777/nanosrc/core/sock.c +++ b/crypto777/nanosrc/core/sock.c @@ -489,11 +489,11 @@ int nn_sock_add_ep(struct nn_sock *self,struct nn_transport *transport,int32_t b return rc; } nn_ep_start(ep); - PNACL_message("ep sock.(%s) started %s://(%s) bind.%d\n",self->socket_name,transport->name,addr,bind); + PNACL_msg("ep sock.(%s) started %s://(%s) bind.%d\n",self->socket_name,transport->name,addr,bind); eid = self->eid++; // Increase the endpoint ID for the next endpoint nn_list_insert(&self->eps,&ep->item,nn_list_end(&self->eps)); // Add to the list of active endpoints nn_ctx_leave (&self->ctx); - } else PNACL_message("self->sock.(%s) %p already has (%s)\n",self->socket_name,self->sockbase->sock,addr); + } else PNACL_msg("self->sock.(%s) %p already has (%s)\n",self->socket_name,self->sockbase->sock,addr); return(ep->eid); } @@ -973,12 +973,12 @@ void nn_sock_report_error(struct nn_sock *self,struct nn_ep *ep,int32_t errnum,c if ( ep != 0 ) { fprintf(stderr,"nanomsg: socket.%s[%s]: Error: %s\n",self->socket_name,nn_ep_getaddr(ep),nn_strerror(errnum)); - PNACL_message("nanomsg: socket.%s[%s]: [%s:%d] Error: %s\n",self->socket_name,nn_ep_getaddr(ep),fname,linenum,nn_strerror(errnum)); + PNACL_msg("nanomsg: socket.%s[%s]: [%s:%d] Error: %s\n",self->socket_name,nn_ep_getaddr(ep),fname,linenum,nn_strerror(errnum)); } else { fprintf(stderr,"nanomsg: socket.%s: Error: %s\n",self->socket_name, nn_strerror(errnum)); - PNACL_message("nanomsg: socket.%s: [%s:%d] Error: %s\n",self->socket_name,fname,linenum,nn_strerror(errnum)); + PNACL_msg("nanomsg: socket.%s: [%s:%d] Error: %s\n",self->socket_name,fname,linenum,nn_strerror(errnum)); } } diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index 4b085c748..39ac68eb1 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -46,7 +46,7 @@ #define NN_HAVE_MSG_CONTROL 0 //#define STANDALONE 1 -#define PNACL_message printf +#define PNACL_msg printf #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 diff --git a/crypto777/nanosrc/utils/efd_eventfd.c b/crypto777/nanosrc/utils/efd_eventfd.c index abbb904f1..f659296e7 100755 --- a/crypto777/nanosrc/utils/efd_eventfd.c +++ b/crypto777/nanosrc/utils/efd_eventfd.c @@ -32,9 +32,9 @@ int nn_efd_init(struct nn_efd *self) { int rc; int flags; - PNACL_message("inside efd_init eventfd\n"); + PNACL_msg("inside efd_init eventfd\n"); self->efd = eventfd(0, EFD_CLOEXEC); - PNACL_message("self->efd: %d\n",self->efd); + PNACL_msg("self->efd: %d\n",self->efd); if (self->efd == -1 && (errno == EMFILE || errno == ENFILE)) return -EMFILE; errno_assert(self->efd != -1); diff --git a/crypto777/nanosrc/utils/efd_pipe.c b/crypto777/nanosrc/utils/efd_pipe.c index 4df5fd3b3..59472d5d8 100755 --- a/crypto777/nanosrc/utils/efd_pipe.c +++ b/crypto777/nanosrc/utils/efd_pipe.c @@ -33,14 +33,14 @@ int nn_efd_init(struct nn_efd *self) { int rc,flags,p[2]; - PNACL_message("inside efd_init: pipe\n"); + PNACL_msg("inside efd_init: pipe\n"); //sleep(1); #if defined NN_HAVE_PIPE2 rc = pipe2(p, O_NONBLOCK | O_CLOEXEC); #else rc = pipe(p); #endif - PNACL_message("rc efd_init: %d\n",rc); + PNACL_msg("rc efd_init: %d\n",rc); //sleep(1); if (rc != 0 && (errno == EMFILE || errno == ENFILE)) return -EMFILE; @@ -50,20 +50,20 @@ int nn_efd_init(struct nn_efd *self) #if !defined NN_HAVE_PIPE2 && defined FD_CLOEXEC rc = fcntl (self->r, F_SETFD, FD_CLOEXEC); - PNACL_message("pipe efd_init: F_SETFDr rc %d\n",rc); + PNACL_msg("pipe efd_init: F_SETFDr rc %d\n",rc); errno_assert(rc != -1); rc = fcntl(self->w, F_SETFD, FD_CLOEXEC); - PNACL_message("pipe efd_init: F_SETFDw rc %d\n",rc); + PNACL_msg("pipe efd_init: F_SETFDw rc %d\n",rc); errno_assert(rc != -1); #endif #if !defined NN_HAVE_PIPE2 flags = fcntl(self->r, F_GETFL, 0); - PNACL_message("pipe efd_init: flags %d\n",flags); + PNACL_msg("pipe efd_init: flags %d\n",flags); if ( flags == -1 ) flags = 0; rc = fcntl(self->r, F_SETFL, flags | O_NONBLOCK); - PNACL_message("pipe efd_init: rc %d flags.%d\n",rc,flags); + PNACL_msg("pipe efd_init: rc %d flags.%d\n",rc,flags); errno_assert (rc != -1); #endif diff --git a/crypto777/nanosrc/utils/efd_socketpair.c b/crypto777/nanosrc/utils/efd_socketpair.c index 6221aef4c..e04a4935e 100755 --- a/crypto777/nanosrc/utils/efd_socketpair.c +++ b/crypto777/nanosrc/utils/efd_socketpair.c @@ -35,7 +35,7 @@ int nn_efd_init (struct nn_efd *self) int rc; int flags; int sp [2]; - PNACL_message("socketpair efdinit\n"); + PNACL_msg("socketpair efdinit\n"); #if defined SOCK_CLOEXEC rc = socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sp); #else diff --git a/crypto777/nanosrc/utils/err.c b/crypto777/nanosrc/utils/err.c index 6f5bc42a6..afca3471b 100755 --- a/crypto777/nanosrc/utils/err.c +++ b/crypto777/nanosrc/utils/err.c @@ -30,7 +30,7 @@ void nn_err_abort(void) { - PNACL_message("nn_err_abort\n"); + PNACL_msg("nn_err_abort\n"); while ( 1 ) { printf("exit due to error\n"); @@ -111,7 +111,7 @@ const char *nn_err_strerror(int32_t errnum) #pragma warning (push) #pragma warning (disable:4996) #endif - PNACL_message("nanomsg: errno.%d (%s)\n",errnum,strerror(errnum)); + PNACL_msg("nanomsg: errno.%d (%s)\n",errnum,strerror(errnum)); getchar(); return strerror (errnum); #if defined _MSC_VER diff --git a/crypto777/nanosrc/utils/err.h b/crypto777/nanosrc/utils/err.h index e57e57c02..be9f94204 100755 --- a/crypto777/nanosrc/utils/err.h +++ b/crypto777/nanosrc/utils/err.h @@ -26,7 +26,7 @@ #include #include #include -#define PNACL_message printf +#define PNACL_msg printf /* Include nn.h header to define nanomsg-specific error codes. */ #include "../nn.h" @@ -45,7 +45,7 @@ #define nn_assert(x) \ do {\ if (nn_slow (!(x))) {\ - PNACL_message("Assertion failed: %s (%s:%d)\n", #x, \ + PNACL_msg("Assertion failed: %s (%s:%d)\n", #x, \ __FILE__, __LINE__);\ fflush (stderr);\ nn_err_abort ();\ @@ -55,7 +55,7 @@ #define nn_assert_state(obj, state_name) \ do {\ if (nn_slow ((obj)->state != state_name)) {\ - PNACL_message( \ + PNACL_msg( \ "Assertion failed: %d == %s (%s:%d)\n", \ (obj)->state, #state_name, \ __FILE__, __LINE__);\ @@ -67,7 +67,7 @@ #define alloc_assert(x) \ do {\ if (nn_slow (!x)) {\ - PNACL_message("Out of memory (%s:%d)\n",\ + PNACL_msg("Out of memory (%s:%d)\n",\ __FILE__, __LINE__);\ nn_err_abort ();\ }\ @@ -77,7 +77,7 @@ #define errno_assert(x) \ do {\ if (nn_slow (!(x))) {\ - PNACL_message("%s [%d] (%s:%d)\n", nn_err_strerror (errno),\ + PNACL_msg("%s [%d] (%s:%d)\n", nn_err_strerror (errno),\ (int) errno, __FILE__, __LINE__);\ nn_err_abort ();\ }\ @@ -87,7 +87,7 @@ #define errnum_assert(cond, err) \ do {\ if (nn_slow (!(cond))) {\ - PNACL_message("%s [%d] (%s:%d)\n", nn_err_strerror (err),(int) (err), __FILE__, __LINE__);\ + PNACL_msg("%s [%d] (%s:%d)\n", nn_err_strerror (err),(int) (err), __FILE__, __LINE__);\ nn_err_abort ();\ }\ } while (0) @@ -119,7 +119,7 @@ /* Assertion-like macros for easier fsm debugging. */ #define nn_fsm_error(message, state, src, type) \ do {\ - PNACL_message("%s: state=%d source=%d action=%d (%s:%d)\n", \ + PNACL_msg("%s: state=%d source=%d action=%d (%s:%d)\n", \ message, state, src, type, __FILE__, __LINE__);\ nn_err_abort ();\ } while (0) diff --git a/crypto777/nanosrc/utils/thread_posix.c b/crypto777/nanosrc/utils/thread_posix.c index 93c81b6cb..32c8428e4 100755 --- a/crypto777/nanosrc/utils/thread_posix.c +++ b/crypto777/nanosrc/utils/thread_posix.c @@ -30,7 +30,7 @@ static void *nn_thread_main_routine(void *arg) { struct nn_thread *self; self = (struct nn_thread *)arg; - PNACL_message("nn_thread_main_routine arg.%p self->routine(%p) at %p\n",arg,self->arg,self->routine); + PNACL_msg("nn_thread_main_routine arg.%p self->routine(%p) at %p\n",arg,self->arg,self->routine); self->routine(self->arg); // Run the thread routine return NULL; } @@ -47,7 +47,7 @@ void nn_thread_init(struct nn_thread *self,nn_thread_routine *routine,void *arg) { int32_t rc; // No signals should be processed by this thread. The library doesn't use signals and thus all the signals should be delivered to application threads, not to worker threads. - PNACL_message("nn_thread_init routine.%p arg.%p\n",routine,arg); + PNACL_msg("nn_thread_init routine.%p arg.%p\n",routine,arg); self->routine = routine; self->arg = arg; rc = pthread_create(&self->handle,NULL,nn_thread_main_routine,(void *)self); diff --git a/iguana/exchanges/Makefile b/iguana/exchanges/Makefile index a7b10c035..0048287e2 100644 --- a/iguana/exchanges/Makefile +++ b/iguana/exchanges/Makefile @@ -4,6 +4,5 @@ include ../crypto777/crypto777.sources all: - #echo building... $(CRYPTO777_SRCS) emcc -s ASSERTIONS=1 -s ASYNCIFY=1 -s TOTAL_MEMORY=134217728 --preload-file coins.json -D__PNACL -DFROM_JS -O2 -I../includes -I../crypto777 -s PTHREAD_POOL_SIZE=8 -s USE_PTHREADS=1 -o /var/www/html/index.html exchanges/mm.c $(CRYPTO777_SRCS) mini-gmp.c secp256k1/src/secp256k1.c -lm From 5d7288e9b3cde6028b11f2229c23b51c7215b7bc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:56:16 +0300 Subject: [PATCH 146/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a64f4478e..c6ee2ecbc 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -29,6 +29,10 @@ // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections // bigendian architectures need to use little endian for sighash calcs +void PNACL_msg(char *arg,...) +{ + +} #include #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; From b1e87908b997e31fb2400cca0329839d8130922e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:57:03 +0300 Subject: [PATCH 147/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ---- iguana/exchanges/mm.c | 8 ++++++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c6ee2ecbc..a64f4478e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -29,10 +29,6 @@ // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections // bigendian architectures need to use little endian for sighash calcs -void PNACL_msg(char *arg,...) -{ - -} #include #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; diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 72bc7a5ad..1e91b621a 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -19,13 +19,17 @@ // Copyright © 2017 SuperNET. All rights reserved. // +void PNACL_msg(char *arg,...) +{ + +} #define FROM_MARKETMAKER #include #include #ifndef NATIVE_WINDOWS - #include "OS_portable.h" +#include "OS_portable.h" #else - #include "../../crypto777/OS_portable.h" +#include "../../crypto777/OS_portable.h" #endif // !_WIN_32 From 45e7d1aeb82b167d38c93ffb405de5fd54248b6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 15:57:50 +0300 Subject: [PATCH 148/176] Test --- iguana/exchanges/mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 1e91b621a..296e25647 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -19,7 +19,7 @@ // Copyright © 2017 SuperNET. All rights reserved. // -void PNACL_msg(char *arg,...) +void PNACL_message(char *arg,...) { } From 22b2bcb311724ba0afa3c706bc40ce7369568674 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:04:27 +0300 Subject: [PATCH 149/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index fd3ab0332..ef088eb88 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -286,7 +286,7 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, /* Allow re-using the address. */ opt = 1; - printf("call setsockopt in nn_usock_bind\n"); + printf("call setsockopt %s SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); printf("called setsockopt in nn_usock_bind returns %d\n",rc); errno_assert (rc == 0); From be141e771c327133d62307fe2932fc4326b5d592 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:05:12 +0300 Subject: [PATCH 150/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index ef088eb88..be8103dc5 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -286,7 +286,7 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, /* Allow re-using the address. */ opt = 1; - printf("call setsockopt %s SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); + printf("call setsockopt %d SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); printf("called setsockopt in nn_usock_bind returns %d\n",rc); errno_assert (rc == 0); From 28441bfb0e7ea545d0137ee69ea8116c6c764a47 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:05:42 +0300 Subject: [PATCH 151/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index be8103dc5..202a9c920 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -286,13 +286,13 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, /* Allow re-using the address. */ opt = 1; - printf("call setsockopt %d SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); + PNACL_msg("call setsockopt %d SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); - printf("called setsockopt in nn_usock_bind returns %d\n",rc); + PNACL_msg("called setsockopt in nn_usock_bind returns %d\n",rc); errno_assert (rc == 0); rc = bind (self->s, addr, (socklen_t) addrlen); - printf("usock.%d -> bind rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); + PNACL_msg("usock.%d -> bind rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); if (nn_slow (rc != 0)) return -errno; @@ -308,7 +308,7 @@ int nn_usock_listen (struct nn_usock *self, int backlog) /* Start listening for incoming connections. */ rc = listen (self->s, backlog); - //printf("usock.%d -> listen rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); + //PNACL_msg("usock.%d -> listen rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); if (nn_slow (rc != 0)) return -errno; @@ -335,7 +335,7 @@ void nn_usock_accept (struct nn_usock *self, struct nn_usock *listener) #else s = accept (listener->s, NULL, NULL); #endif - //printf("usock.%d -> accept errno.%d s.%d %s\n",self->s,errno,s,nn_strerror(errno)); + //PNACL_msg("usock.%d -> accept errno.%d s.%d %s\n",self->s,errno,s,nn_strerror(errno)); /* Immediate success. */ if (nn_fast (s >= 0)) { @@ -395,7 +395,7 @@ void nn_usock_connect (struct nn_usock *self, const struct sockaddr *addr, /* Do the connect itself. */ rc = connect(self->s,addr,(socklen_t)addrlen); - //printf("usock.%d <- connect (%llx) rc.%d errno.%d %s\n",self->s,*(long long *)addr,rc,errno,nn_strerror(errno)); + //PNACL_msg("usock.%d <- connect (%llx) rc.%d errno.%d %s\n",self->s,*(long long *)addr,rc,errno,nn_strerror(errno)); /* Immediate success. */ if ( nn_fast(rc == 0) ) { @@ -1146,7 +1146,7 @@ static int nn_usock_send_raw (struct nn_usock *self, struct msghdr *hdr) nbytes = sendmsg(self->s,hdr,MSG_NOSIGNAL); #else nbytes = sendmsg(self->s,hdr,0); - //printf("sendmsg nbytes.%d\n",(int32_t)nbytes); + //PNACL_msg("sendmsg nbytes.%d\n",(int32_t)nbytes); #endif #endif /* Handle errors. */ @@ -1288,7 +1288,7 @@ static int nn_usock_recv_raw(struct nn_usock *self, void *buf, size_t *len) #if NN_USE_MYMSG nbytes = myrecvmsg(self->s,&hdr,0,(int32_t)iov.iov_len); - //printf("got nbytes.%d from recvmsg errno.%d %s\n",(int32_t)nbytes,errno,nn_strerror(errno)); + //PNACL_msg("got nbytes.%d from recvmsg errno.%d %s\n",(int32_t)nbytes,errno,nn_strerror(errno)); #else nbytes = recvmsg (self->s, &hdr, 0); #endif @@ -1300,7 +1300,7 @@ static int nn_usock_recv_raw(struct nn_usock *self, void *buf, size_t *len) nbytes = 0; else { - printf("recvraw errno.%d %s\n",errno,nn_strerror(errno)); + PNACL_msg("recvraw errno.%d %s\n",errno,nn_strerror(errno)); // If the peer closes the connection, return ECONNRESET errno_assert(errno == ECONNRESET || errno == ENOTCONN || errno == ECONNREFUSED || errno == ETIMEDOUT || errno == EHOSTUNREACH #if NN_USE_MYMSG From bccd17943ad0fbc8fff16402cad957caef11685e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:22:30 +0300 Subject: [PATCH 152/176] Test --- crypto777/nanosrc/aio/usock_posix.c | 3 ++- crypto777/nanosrc/aio/usock_posix.c_dev | 3 ++- crypto777/nanosrc/devices/tcpmuxd.c | 3 ++- crypto777/nanosrc/utils/efd_win.c | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/crypto777/nanosrc/aio/usock_posix.c b/crypto777/nanosrc/aio/usock_posix.c index 202a9c920..3989d3a22 100755 --- a/crypto777/nanosrc/aio/usock_posix.c +++ b/crypto777/nanosrc/aio/usock_posix.c @@ -289,7 +289,8 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, PNACL_msg("call setsockopt %d SOL_SOCKET.%d SO_REUSEADDR.%d in nn_usock_bind\n",self->s,SOL_SOCKET,SO_REUSEADDR); rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); PNACL_msg("called setsockopt in nn_usock_bind returns %d\n",rc); - errno_assert (rc == 0); + // ignore SO_REUSEADDR failures + //errno_assert (rc == 0); rc = bind (self->s, addr, (socklen_t) addrlen); PNACL_msg("usock.%d -> bind rc.%d errno.%d %s\n",self->s,rc,errno,nn_strerror(errno)); diff --git a/crypto777/nanosrc/aio/usock_posix.c_dev b/crypto777/nanosrc/aio/usock_posix.c_dev index 1d000ee3b..e5b8a1c35 100755 --- a/crypto777/nanosrc/aio/usock_posix.c_dev +++ b/crypto777/nanosrc/aio/usock_posix.c_dev @@ -287,7 +287,8 @@ int nn_usock_bind (struct nn_usock *self, const struct sockaddr *addr, /* Allow re-using the address. */ opt = 1; rc = setsockopt (self->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); - errno_assert (rc == 0); + // ignore SO_REUSEADDR failures + //errno_assert (rc == 0); rc = bind (self->s, addr, (socklen_t) addrlen); if (nn_slow (rc != 0)) diff --git a/crypto777/nanosrc/devices/tcpmuxd.c b/crypto777/nanosrc/devices/tcpmuxd.c index ba2ba3a23..abd3b7706 100755 --- a/crypto777/nanosrc/devices/tcpmuxd.c +++ b/crypto777/nanosrc/devices/tcpmuxd.c @@ -96,7 +96,8 @@ int nn_tcpmuxd (int port) opt = 1; rc = setsockopt (tcp_listener, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt)); - if (rc != 0) { return -1; } + // ignore SO_REUSEADDR failures + //if (rc != 0) { return -1; } memset (&tcp_addr, 0, sizeof (tcp_addr)); tcp_addr.sin_family = AF_INET; tcp_addr.sin_port = htons (port); diff --git a/crypto777/nanosrc/utils/efd_win.c b/crypto777/nanosrc/utils/efd_win.c index 8d253408f..5678ba7d5 100755 --- a/crypto777/nanosrc/utils/efd_win.c +++ b/crypto777/nanosrc/utils/efd_win.c @@ -84,8 +84,9 @@ int nn_efd_init (struct nn_efd *self) reuseaddr = 1; rc = setsockopt (listener, SOL_SOCKET, SO_REUSEADDR, (char*) &reuseaddr, sizeof (reuseaddr)); - if (nn_slow (rc == SOCKET_ERROR)) - goto wsafail; + // ignore SO_REUSEADDR failures + // if (nn_slow (rc == SOCKET_ERROR)) + // goto wsafail; /* Bind the listening socket to the local port. */ memset (&addr, 0, sizeof (addr)); From e4e2ce534efeb90b6df340605dade78e13897f43 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:29:21 +0300 Subject: [PATCH 153/176] Test --- iguana/exchanges/LP_nativeDEX.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a64f4478e..7824b2ad3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1041,7 +1041,7 @@ void LP_fromjs_iter() } if ( ctx == 0 ) ctx = bitcoin_ctx(); - if ( (LP_counter % 100) == 0 ) + if ( 0 && (LP_counter % 100) == 0 ) printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; @@ -1054,10 +1054,10 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * return(clonestr("{\"error\":\"only http allowed\"}")); sprintf(fname,"bitcoind_RPC/req.%u",counter); counter++; - printf("issue.(%s)\n",url); + //printf("issue.(%s)\n",url); emscripten_wget(url,fname); retstr = OS_filestr(&fsize,fname); - printf("bitcoind_RPC(%s) -> fname.(%s) %s\n",url,fname,retstr); + //printf("bitcoind_RPC(%s) -> fname.(%s) %s\n",url,fname,retstr); return(retstr); } From f4bf243ea8efee3d7d1d706fc307573f8ba09ff5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:32:06 +0300 Subject: [PATCH 154/176] Test --- crypto777/nanosrc/nn_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index 39ac68eb1..98ec95121 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -46,7 +46,7 @@ #define NN_HAVE_MSG_CONTROL 0 //#define STANDALONE 1 -#define PNACL_msg printf +#define PNACL_msg #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 From 3fb1d8e1328f99ad8be911a9295f468cfa51f173 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:32:59 +0300 Subject: [PATCH 155/176] Test --- crypto777/nanosrc/utils/err.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/nanosrc/utils/err.h b/crypto777/nanosrc/utils/err.h index be9f94204..dd3972a86 100755 --- a/crypto777/nanosrc/utils/err.h +++ b/crypto777/nanosrc/utils/err.h @@ -26,7 +26,7 @@ #include #include #include -#define PNACL_msg printf +#define PNACL_msg /* Include nn.h header to define nanomsg-specific error codes. */ #include "../nn.h" From 79decf2aeea07c8ba1f63e012cd951ff775633f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:34:06 +0300 Subject: [PATCH 156/176] test --- crypto777/nanosrc/nn_config.h | 2 +- crypto777/nanosrc/utils/err.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index 98ec95121..74edc6229 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -46,7 +46,7 @@ #define NN_HAVE_MSG_CONTROL 0 //#define STANDALONE 1 -#define PNACL_msg +#define PNACL_msg(...) #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 diff --git a/crypto777/nanosrc/utils/err.h b/crypto777/nanosrc/utils/err.h index dd3972a86..e932766e1 100755 --- a/crypto777/nanosrc/utils/err.h +++ b/crypto777/nanosrc/utils/err.h @@ -26,7 +26,7 @@ #include #include #include -#define PNACL_msg +#define PNACL_msg(...) /* Include nn.h header to define nanomsg-specific error codes. */ #include "../nn.h" From 7aa01538435f7c61ad44f9e75dd940d726b4580e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:37:32 +0300 Subject: [PATCH 157/176] Test --- crypto777/crypto777.sources | 2 +- iguana/exchanges/LP_nativeDEX.c | 13 ------------- iguana/exchanges/LP_network.c | 2 +- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/crypto777/crypto777.sources b/crypto777/crypto777.sources index f7bcd6bcc..3d5142a01 100755 --- a/crypto777/crypto777.sources +++ b/crypto777/crypto777.sources @@ -36,7 +36,7 @@ TRANSPORTS_TCPMUX = $(NANOSRC)/transports/tcpmux/atcpmux.c $(NANOSRC)/transports NANOMSG_PROTOCOLS = $(PROTOCOLS_UTILS) $(PROTOCOLS_PUBSUB) $(PROTOCOLS_PAIR) $(PROTOCOLS_REQREP) $(PROTOCOLS_BUS) $(PROTOCOLS_PIPELINE) $(PROTOCOLS_SURVEY) -NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) +NANOMSG_TRANSPORTS = $(TRANSPORTS_UTILS) $(TRANSPORTS_TCP) $(TRANSPORTS_IPC) $(TRANSPORTS_INPROC) $(TRANSPORTS_WS) NANOMSG = $(NANOMSG_CORE) $(NANOMSG_AIO) $(NANOMSG_UTILS) $(NANOMSG_DEVICES) $(NANOMSG_TRANSPORTS) $(NANOMSG_PROTOCOLS) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7824b2ad3..87e222656 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -798,19 +798,6 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybusport,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); - { - int32_t sock,timeout,val; - printf("call nn_socket\n"); - sock = nn_socket(AF_SP,NN_PUSH); - printf("nn_socket(NN_PUSH) %d\n",sock); - if ( nn_connect(sock,"tcp://5.9.253.199:7784") >= 0 ) - { - timeout = 1; - printf("call setsockopt\n"); - val = nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - printf("nn_setsockopt val.%d\n",val); - } else printf("nn_connect error\n"); - } LP_showwif = juint(argjson,"wif"); if ( passphrase == 0 || passphrase[0] == 0 ) { diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f947b9f03..8fb8e4743 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -30,7 +30,7 @@ uint16_t Numpsocks,Psockport = MIN_PSOCK_PORT; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); // ws is worse + sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); // ws is worse return(str); } From f13d393b91267c924c7e45542eba91388c168566 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:40:09 +0300 Subject: [PATCH 158/176] Test --- crypto777/nanosrc/transports/ws/ws_handshake.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/nanosrc/transports/ws/ws_handshake.c b/crypto777/nanosrc/transports/ws/ws_handshake.c index 52b8e3f40..eca21d44a 100755 --- a/crypto777/nanosrc/transports/ws/ws_handshake.c +++ b/crypto777/nanosrc/transports/ws/ws_handshake.c @@ -1213,7 +1213,7 @@ static void nn_ws_handshake_client_request (struct nn_ws_handshake *self) nn_random_generate (rand_key, sizeof (rand_key)); - rc = nn_base64_encode (rand_key, sizeof (rand_key), + rc = _nn_base64_encode (rand_key, sizeof (rand_key), encoded_key, sizeof (encoded_key)); encoded_key_len = strlen (encoded_key); @@ -1355,7 +1355,7 @@ static int nn_ws_handshake_hash_key (const char *key, size_t key_len, for (i = 0; i < strlen (NN_WS_HANDSHAKE_MAGIC_GUID); i++) nn_sha1_hashbyte (&hash, NN_WS_HANDSHAKE_MAGIC_GUID [i]); - rc = nn_base64_encode (nn_sha1_result (&hash), + rc = _nn_base64_encode (nn_sha1_result (&hash), sizeof (hash.state), hashed, hashed_len); return rc; From 1b37018f37734b683a63cf6bc3953548aab39e5d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:42:59 +0300 Subject: [PATCH 159/176] Test --- crypto777/nanosrc/core/global.c | 2 +- crypto777/nanosrc/transports/ws/sws.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 00a5c48d3..0a11f17cf 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -246,7 +246,7 @@ PNACL_msg("transports init\n"); nn_global_add_transport(nn_ipc); nn_global_add_transport(nn_tcp); nn_global_add_transport(nn_inproc); -//nn_global_add_transport(nn_ws); +nn_global_add_transport(nn_ws); //nn_global_add_transport(nn_tcpmux); //sleep(1); PNACL_msg("socktypes init\n"); diff --git a/crypto777/nanosrc/transports/ws/sws.h b/crypto777/nanosrc/transports/ws/sws.h index d83f3f0fd..b482d1f19 100755 --- a/crypto777/nanosrc/transports/ws/sws.h +++ b/crypto777/nanosrc/transports/ws/sws.h @@ -152,7 +152,7 @@ struct nn_sws { uint8_t inmsg_control [NN_SWS_PAYLOAD_MAX_LENGTH]; /* Reason this connection is closing to send as closing handshake. */ - char fail_msg [NN_SWS_PAYLOAD_MAX_LENGTH]; + uint8_t fail_msg [NN_SWS_PAYLOAD_MAX_LENGTH]; size_t fail_msg_len; /* State of the outbound state machine. */ From fa7708468c7b6380bfef8871f29d9eeabb629450 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:44:34 +0300 Subject: [PATCH 160/176] Test --- crypto777/nanosrc/core/global.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 0a11f17cf..9435442ba 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -1245,11 +1245,11 @@ static int nn_global_create_ep (int s, const char *addr, int bind) protosz = delim - addr; addr += protosz + 3; #ifdef NN_USE_MYMSG - if ( strncmp("inproc",proto,strlen("inproc")) != 0 && strncmp("ipc",proto,strlen("ipc")) != 0 && strncmp("tcp",proto,strlen("tcp")) != 0 ) + if ( strncmp("inproc",proto,strlen("inproc")) != 0 && strncmp("ipc",proto,strlen("ipc")) != 0 && strncmp("tcp",proto,strlen("tcp") && strncmp("ws",proto,strlen("ws")) != 0 ) { - PNACL_msg("only ipc, inproc and tcp transport is supported\n"); - printf("only ipc, inproc and tcp transport is supported\n"); - fprintf(stderr,"only ipc, inproc and tcp transport is supported\n"); + PNACL_msg("only ipc, inproc, ws and tcp transport is supported\n"); + printf("only ipc, inproc, ws and tcp transport is supported\n"); + fprintf(stderr,"only ipc, inproc, ws and tcp transport is supported\n"); exit(-1); return -EPROTONOSUPPORT; } From 8a6eb3753d3ffb2b92f69f5153499be8286e4d04 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:45:27 +0300 Subject: [PATCH 161/176] Test --- crypto777/nanosrc/core/global.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 9435442ba..324b266f7 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -1245,7 +1245,7 @@ static int nn_global_create_ep (int s, const char *addr, int bind) protosz = delim - addr; addr += protosz + 3; #ifdef NN_USE_MYMSG - if ( strncmp("inproc",proto,strlen("inproc")) != 0 && strncmp("ipc",proto,strlen("ipc")) != 0 && strncmp("tcp",proto,strlen("tcp") && strncmp("ws",proto,strlen("ws")) != 0 ) + if ( strncmp("inproc",proto,strlen("inproc")) != 0 && strncmp("ipc",proto,strlen("ipc")) != 0 && strncmp("tcp",proto,strlen("tcp")) && strncmp("ws",proto,strlen("ws")) != 0 ) { PNACL_msg("only ipc, inproc, ws and tcp transport is supported\n"); printf("only ipc, inproc, ws and tcp transport is supported\n"); From 68dc6444819636103096db3593aff37e3010f301 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:53:28 +0300 Subject: [PATCH 162/176] Test --- iguana/exchanges/LP_peers.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index c922d981d..064086a03 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -120,6 +120,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char } else printf("%s pushport.%u subport.%u pushsock.%d\n",ipaddr,pushport,subport,pushsock); if ( peer->pushsock >= 0 && peer->subsock >= 0 ) { + printf("add peer %s\n",peer->ipaddr); portable_mutex_lock(&LP_peermutex); HASH_ADD(hh,LP_peerinfos,ip_port,sizeof(peer->ip_port),peer); if ( mypeer != 0 ) @@ -146,7 +147,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char } } } - } + } else printf("%s invalid pushsock.%d or subsock.%d\n",peer->ipaddr,peer->pushsock,peer->subsock); } } else printf("LP_addpeer: checkip.(%s) vs (%s)\n",checkip,ipaddr); return(peer); From 32ac594da34f7fdb5b31ff221b8183d43291e1b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 16:56:06 +0300 Subject: [PATCH 163/176] Test --- iguana/exchanges/LP_nativeDEX.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 87e222656..9bbee8b59 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -288,6 +288,7 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int cJSON *recvjson; //char *mstr,*cstr; if ( (recvjson= cJSON_Parse((char *)ptr)) != 0 ) { + printf("%s RECV.(%s)\n",typestr,(char *)ptr); /*if ( (mstr= jstr(recvjson,"method")) != 0 && strcmp(mstr,"uitem") == 0 && (cstr= jstr(recvjson,"coin")) != 0 && strcmp(cstr,"REVS") == 0 ) { From 41292f2cc2e7e45cc5e1c44b7364eb6490f2e69e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:07:30 +0300 Subject: [PATCH 164/176] Test --- iguana/exchanges/LP_nativeDEX.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9bbee8b59..adb64ea4d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1031,6 +1031,7 @@ void LP_fromjs_iter() ctx = bitcoin_ctx(); if ( 0 && (LP_counter % 100) == 0 ) printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); + LP_nanomsg_recvs(ctx); LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; } From f99dcf0a0c95ade37626f2d2294a7dcad67a073d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:10:24 +0300 Subject: [PATCH 165/176] Test --- iguana/exchanges/LP_nativeDEX.c | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index adb64ea4d..9f9ac3ae7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -288,7 +288,6 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int cJSON *recvjson; //char *mstr,*cstr; if ( (recvjson= cJSON_Parse((char *)ptr)) != 0 ) { - printf("%s RECV.(%s)\n",typestr,(char *)ptr); /*if ( (mstr= jstr(recvjson,"method")) != 0 && strcmp(mstr,"uitem") == 0 && (cstr= jstr(recvjson,"coin")) != 0 && strcmp(cstr,"REVS") == 0 ) { From 057ed4c396287ec1df1e57fc8420f49eebcba772 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:21:50 +0300 Subject: [PATCH 166/176] Test --- iguana/exchanges/LP_nativeDEX.c | 17 ++++++++++++++++- iguana/exchanges/LP_network.c | 3 +++ iguana/exchanges/mm.c | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9f9ac3ae7..5f7bfff7e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -275,16 +275,21 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int while ( nonz < maxdepth && recvlen > 0 ) { nonz++; +#ifndef FROM_JS memset(&pfd,0,sizeof(pfd)); pfd.fd = sock; pfd.events = NN_POLLIN; if ( nn_poll(&pfd,1,1) != 1 ) break; +#endif if ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) { methodstr[0] = 0; if ( 1 ) { +#ifdef FROM_JS + printf("%s RECV.(%s)\n",typestr,(char *)ptr); +#endif cJSON *recvjson; //char *mstr,*cstr; if ( (recvjson= cJSON_Parse((char *)ptr)) != 0 ) { @@ -297,6 +302,9 @@ int32_t LP_sock_check(char *typestr,void *ctx,char *myipaddr,int32_t pubsock,int free_json(recvjson); } } +#ifdef FROM_JS + else printf("%s got recv.%d\n",typestr,recvlen); +#endif double millis = OS_milliseconds(); if ( (retstr= LP_process_message(ctx,typestr,myipaddr,pubsock,ptr,recvlen,sock)) != 0 ) free(retstr); @@ -767,12 +775,16 @@ void LP_reserved_msgs(void *ignore) { portable_mutex_lock(&LP_reservedmutex); num_Reserved_msgs--; - //printf("%d BROADCASTING RESERVED.(%s)\n",num_Reserved_msgs,Reserved_msgs[num_Reserved_msgs]); +#ifdef FROM_JS + printf("%d BROADCASTING RESERVED.(%s)\n",num_Reserved_msgs,Reserved_msgs[num_Reserved_msgs]); +#endif LP_broadcast_message(LP_mypubsock,"","",zero,Reserved_msgs[num_Reserved_msgs]); Reserved_msgs[num_Reserved_msgs] = 0; portable_mutex_unlock(&LP_reservedmutex); } } + if ( ignore == 0 ) + break; usleep(3000); } } @@ -1030,6 +1042,9 @@ void LP_fromjs_iter() ctx = bitcoin_ctx(); if ( 0 && (LP_counter % 100) == 0 ) printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); + LP_pubkeys_query(); + LP_utxosQ_process(); + LP_reserved_msgs(0); LP_nanomsg_recvs(ctx); LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 8fb8e4743..0b4c875e2 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -157,6 +157,9 @@ void queue_loop(void *ignore) { if ( (sentbytes= nn_send(ptr->sock,ptr->msg,ptr->msglen,0)) != ptr->msglen ) printf("%d LP_send sent %d instead of %d\n",n,sentbytes,ptr->msglen); +#ifdef FROM_JS + else printf("sent %d bytes of %d to sock.%d\n",sentbytes,ptr->msglen,ptr->sock); +#endif ptr->sock = -1; if ( ptr->peerind > 0 ) ptr->starttime = (uint32_t)time(NULL); diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 296e25647..ed9683eb3 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -887,7 +887,7 @@ int main(int argc, const char * argv[]) retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); printf("calling LP_main(%s)\n",jprint(retjson,0)); LP_main(retjson); - emscripten_set_main_loop(LP_fromjs_iter,1,0); + emscripten_set_main_loop(LP_fromjs_iter,10,0); #else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { From 95848e89d70558238185d34036d70667730d1bae Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:27:00 +0300 Subject: [PATCH 167/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 ++ iguana/exchanges/LP_prices.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5f7bfff7e..657235bb3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -612,7 +612,9 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int if ( strcmp(peer->ipaddr,myipaddr) != 0 ) { nonz++; +#ifndef FROM_JS LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport); +#endif peer->diduquery = 0; LP_peer_pricesquery(peer); LP_utxos_sync(peer); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index ae42cd6c8..f1dae8cde 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -344,6 +344,9 @@ void LP_peer_pricesquery(struct LP_peerinfo *peer) peer->needping = (uint32_t)time(NULL); if ( (retstr= issue_LP_getprices(peer->ipaddr,peer->port)) != 0 ) { +#ifdef FROM_JS + printf("%s\n",retstr); +#endif if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(array) && (n= cJSON_GetArraySize(array)) > 0 ) From 9fcb13501e717f4fe8f9b3eb3a66c08e903d8c24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:32:33 +0300 Subject: [PATCH 168/176] Test --- iguana/exchanges/LP_commands.c | 8 ++++---- iguana/exchanges/LP_nativeDEX.c | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f2c641d94..32c84a180 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -450,13 +450,13 @@ stop()\n\ } // received response if ( strcmp(method,"postprice") == 0 ) - retstr = LP_postprice_recv(argjson); + return(LP_postprice_recv(argjson)); else if ( strcmp(method,"postutxos") == 0 ) - retstr = LP_postutxos_recv(argjson); + return(LP_postutxos_recv(argjson)); else if ( strcmp(method,"uitem") == 0 ) - retstr = LP_uitem_recv(argjson); + return(LP_uitem_recv(argjson)); else if ( strcmp(method,"notify") == 0 ) - retstr = LP_notify_recv(argjson); + return(LP_notify_recv(argjson)); // end received response // public access, even from http diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 657235bb3..157979314 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -794,6 +794,7 @@ void LP_reserved_msgs(void *ignore) int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) { int32_t n = 0; +#ifndef FROM_JS portable_mutex_lock(&LP_reservedmutex); if ( num_Reserved_msgs < sizeof(Reserved_msgs)/sizeof(*Reserved_msgs) ) { @@ -801,6 +802,9 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) n = num_Reserved_msgs; } else LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); portable_mutex_unlock(&LP_reservedmutex); +#else + LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); +#endif if ( num_Reserved_msgs > max_Reserved_msgs ) { max_Reserved_msgs = num_Reserved_msgs; @@ -1046,7 +1050,6 @@ void LP_fromjs_iter() printf("LP_fromjs_iter got called LP_counter.%d userpass.(%s) ctx.%p\n",LP_counter,G.USERPASS,ctx); LP_pubkeys_query(); LP_utxosQ_process(); - LP_reserved_msgs(0); LP_nanomsg_recvs(ctx); LP_mainloop_iter(ctx,LP_myipaddr,0,LP_mypubsock,LP_publicaddr,LP_RPCPORT); LP_counter++; From b752274a38b63436899ed083636d8b0f66bc5760 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:38:14 +0300 Subject: [PATCH 169/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 157979314..03dd4f25a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -626,8 +626,10 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int { peer->diduquery = now; nonz++; +#ifndef FROM_JS if ( (retstr= issue_LP_notify(peer->ipaddr,peer->port,"127.0.0.1",0,numpeers,G.LP_sessionid,G.LP_myrmd160str,G.LP_mypub25519)) != 0 ) free(retstr); +#endif peer->needping = 0; needpings++; } From 050700fcbd843c060c7d09a0f2ca6358d9481b39 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:51:02 +0300 Subject: [PATCH 170/176] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +--- iguana/exchanges/LP_prices.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 03dd4f25a..3840a913d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -779,9 +779,6 @@ void LP_reserved_msgs(void *ignore) { portable_mutex_lock(&LP_reservedmutex); num_Reserved_msgs--; -#ifdef FROM_JS - printf("%d BROADCASTING RESERVED.(%s)\n",num_Reserved_msgs,Reserved_msgs[num_Reserved_msgs]); -#endif LP_broadcast_message(LP_mypubsock,"","",zero,Reserved_msgs[num_Reserved_msgs]); Reserved_msgs[num_Reserved_msgs] = 0; portable_mutex_unlock(&LP_reservedmutex); @@ -806,6 +803,7 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) portable_mutex_unlock(&LP_reservedmutex); #else LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); + printf("reserved_msg.(%s)\n",msg); #endif if ( num_Reserved_msgs > max_Reserved_msgs ) { diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index f1dae8cde..4b4113f42 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -685,7 +685,7 @@ void LP_pubkeys_query() reqjson = cJSON_CreateObject(); jaddstr(reqjson,"method","wantnotify"); jaddbits256(reqjson,"pub",pubp->pubkey); - //printf("%s\n",jprint(reqjson,0)); + printf("LP_pubkeys_query %s\n",jprint(reqjson,0)); LP_reserved_msg("","",zero,jprint(reqjson,1)); } } From 6b82dbc9f9e9241eb894af10c5f030d76f1b3ecf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 17:54:03 +0300 Subject: [PATCH 171/176] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3840a913d..aceba1ffd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -802,8 +802,8 @@ int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) } else LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); portable_mutex_unlock(&LP_reservedmutex); #else - LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); printf("reserved_msg.(%s)\n",msg); + LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); #endif if ( num_Reserved_msgs > max_Reserved_msgs ) { From fdf17a70ec5c18680dcb9b07757aa92d299e8e24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 18:00:03 +0300 Subject: [PATCH 172/176] Test --- iguana/exchanges/LP_network.c | 19 +++++++++++++++---- iguana/exchanges/mm.c | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 0b4c875e2..a7d516a7f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -157,9 +157,6 @@ void queue_loop(void *ignore) { if ( (sentbytes= nn_send(ptr->sock,ptr->msg,ptr->msglen,0)) != ptr->msglen ) printf("%d LP_send sent %d instead of %d\n",n,sentbytes,ptr->msglen); -#ifdef FROM_JS - else printf("sent %d bytes of %d to sock.%d\n",sentbytes,ptr->msglen,ptr->sock); -#endif ptr->sock = -1; if ( ptr->peerind > 0 ) ptr->starttime = (uint32_t)time(NULL); @@ -290,7 +287,21 @@ void LP_broadcast_finish(int32_t pubsock,char *base,char *rel,uint8_t *msg,cJSON // add signature here msg = (void *)jprint(argjson,0); msglen = (int32_t)strlen((char *)msg) + 1; +#ifdef FROM_JS + int32_t sentbytes,sock,peerind,maxind; + if ( (maxind= LP_numpeers()) > 0 ) + peerind = (rand() % maxind) + 1; + else peerind = 1; + sock = LP_peerindsock(&peerind); + if ( sock >= 0 ) + { + if ( (sentbytes= nn_send(sock,msg,msglen,0)) != msglen ) + printf("%d LP_send sent %d instead of %d\n",n,sentbytes,msglen); + else printf("sent %d bytes of %d to sock.%d\n",sentbytes,msglen,sock); + } else printf("couldnt get valid sock\n"); +#else LP_queuesend(crc32,-1,base,rel,msg,msglen); +#endif } else LP_queuesend(crc32,pubsock,base,rel,msg,msglen); free(msg); } @@ -335,7 +346,7 @@ void LP_broadcast_message(int32_t pubsock,char *base,char *rel,bits256 destpub25 // printf("finished %u\n",crc32); } // else printf("no valid method in (%s)\n",msgstr); free_json(argjson); - } else printf("couldnt parse (%s)\n",msgstr); + } else printf("couldnt parse %p (%s)\n",msgstr,msgstr); } else { diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index ed9683eb3..296e25647 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -887,7 +887,7 @@ int main(int argc, const char * argv[]) retjson = cJSON_Parse("{\"client\":1,\"passphrase\":\"test\"}"); printf("calling LP_main(%s)\n",jprint(retjson,0)); LP_main(retjson); - emscripten_set_main_loop(LP_fromjs_iter,10,0); + emscripten_set_main_loop(LP_fromjs_iter,1,0); #else if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { From 46a3031b77312c4402ed7b02209577b0e792156d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 18:00:49 +0300 Subject: [PATCH 173/176] Test --- iguana/exchanges/LP_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index a7d516a7f..eeb23603f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -296,7 +296,7 @@ void LP_broadcast_finish(int32_t pubsock,char *base,char *rel,uint8_t *msg,cJSON if ( sock >= 0 ) { if ( (sentbytes= nn_send(sock,msg,msglen,0)) != msglen ) - printf("%d LP_send sent %d instead of %d\n",n,sentbytes,msglen); + printf("LP_send sent %d instead of %d\n",sentbytes,msglen); else printf("sent %d bytes of %d to sock.%d\n",sentbytes,msglen,sock); } else printf("couldnt get valid sock\n"); #else From 1fd97e7c5b0ac22a1e5e9a02d4fca89c66d3af2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 18:05:57 +0300 Subject: [PATCH 174/176] Test --- crypto777/nanosrc/core/global.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 324b266f7..4edab59f8 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -809,15 +809,17 @@ int32_t nn_recvmsg(int32_t s,struct nn_msghdr *msghdr,int32_t flags) int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) { int32_t rc,i,nnmsg; size_t sz,spsz; struct nn_iovec *iov; struct nn_msg msg; void *chunk; struct nn_cmsghdr *cmsg; - //PNACL_msg("nn_sendmsg.(%d) \n",s); + printf("nn_sendmsg.(%d) \n",s); NN_BASIC_CHECKS; if ( nn_slow(!msghdr) ) { + printf("nn_sendmsg.EINVAL\n"); errno = EINVAL; return -1; } if ( nn_slow(msghdr->msg_iovlen < 0) ) { + printf("nn_sendmsg.EMSGSIZE\n"); errno = EMSGSIZE; return -1; } @@ -827,6 +829,7 @@ int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) if ( nn_slow(chunk == NULL) ) { errno = EFAULT; + printf("nn_sendmsg.EFAULT\n"); return -1; } sz = nn_chunk_size(chunk); @@ -905,6 +908,7 @@ int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) /* Send it further down the stack. */ rc = nn_sock_send (SELF.socks [s], &msg, flags); + printf("nn_sock_send rc.%d\n",rc); if (nn_slow (rc < 0)) { /* If we are dealing with user-supplied buffer, detach it from From c079c4ccc353b33ab4edebb5a568de3540a54b0c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 18:08:32 +0300 Subject: [PATCH 175/176] Test --- crypto777/nanosrc/core/global.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 4edab59f8..6a276cc8a 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -652,6 +652,7 @@ int32_t nn_send(int32_t s,const void *buf,size_t len,int32_t flags) hdr.msg_iovlen = 1; hdr.msg_control = NULL; hdr.msg_controllen = 0; + printf("nn_send calling nn_sendmsg\n"); return nn_sendmsg(s,&hdr,flags); } From c5d47328135bf806ec666c430928b51126102225 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 25 Oct 2017 18:11:25 +0300 Subject: [PATCH 176/176] Test --- crypto777/nanosrc/core/global.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 6a276cc8a..3c6f07011 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -673,15 +673,17 @@ int32_t nn_recv(int32_t s,void *buf,size_t len,int32_t flags) int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) { int32_t rc,i,nnmsg; size_t sz; struct nn_iovec *iov; struct nn_msg msg; void *chunk; - //PNACL_msg("nn_sendmsg.(%d) \n",s); + printf("nn_sendmsg.(%d) \n",s); NN_BASIC_CHECKS; if ( nn_slow(!msghdr) ) { + printf("nn_sendmsg.(%d) einval\n",s); errno = EINVAL; return -1; } if ( nn_slow(msghdr->msg_iovlen < 0) ) { + printf("nn_sendmsg.(%d) emsgsize\n",s); errno = EMSGSIZE; return -1; } @@ -690,6 +692,7 @@ int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) chunk = *(void **)msghdr->msg_iov[0].iov_base; if ( nn_slow(chunk == NULL) ) { + printf("nn_sendmsg.(%d) efault\n",s); errno = EFAULT; return -1; } @@ -732,6 +735,7 @@ int32_t nn_sendmsg(int32_t s,const struct nn_msghdr *msghdr,int32_t flags) } nn_assert(msghdr->msg_control == 0); // cant support msgs until sendmsg()/recvmsg() native to pnacl rc = nn_sock_send(SELF.socks[s],&msg,flags); // Send it further down the stack + printf("rc from nn_socksend.%d\n",rc); if ( nn_slow(rc < 0) ) { // If we are dealing with user-supplied buffer, detach it from the message object

VUiLZ6|Bs*k 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