From 809c59831813259bbc421670449ee38259f32450 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 14:08:49 +0300 Subject: [PATCH 001/910] 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 11fe76813..319c91ed8 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -144,8 +144,8 @@ int32_t LP_mypriceset(char *base,char *rel,double price) struct LP_priceinfo *basepp,*relpp; if ( price != 0. && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { - basepp->myprices[relpp->ind] = price * LP_profitratio; // ask - relpp->myprices[basepp->ind] = (1. / price) * LP_profitratio; // bid + basepp->myprices[relpp->ind] = price; // ask + relpp->myprices[basepp->ind] = (1. / price); // bid return(0); } else return(-1); } From c4ea4ef0537bc2bc454a23c4a9f4a07aff7a7b55 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 14:20:21 +0300 Subject: [PATCH 002/910] Test --- iguana/exchanges/LP_transaction.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 193c20475..fafabb418 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1443,6 +1443,11 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->depositunconf = 1; basilisk_dontforget_update(swap,&swap->bobdeposit); len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); + for (i=0; ibobdeposit.I.redeemlen; i++) + printf("%02x",swap->bobdeposit.redeemscript[i]); + printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); memcpy(swap->I.userdata_aliceclaim,userdata,len); swap->I.userdata_aliceclaimlen = len; retval = 0; @@ -1489,6 +1494,11 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); + for (i=0; ibobpayment.I.redeemlen; i++) + printf("%02x",swap->bobpayment.redeemscript[i]); + printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); memcpy(swap->I.userdata_alicespend,userdata,len); swap->I.userdata_alicespendlen = len; retval = 0; @@ -1504,7 +1514,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->I.alicespent = 1; //basilisk_txlog(swap,&swap->alicespend,-1); return(retval); - } + } else printf("error signing aliceclaim suppress.%d vin.(%s)\n",swap->alicespend.I.suppress_pubkeys,swap->bobpayment.I.destaddr); } printf("error validating bobpayment\n"); return(-1); From 644b5a89b9df3ad46d134f9b7562881567813c81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 14:27:06 +0300 Subject: [PATCH 003/910] Test --- iguana/exchanges/LP_swap.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b6e91d625..d4066b050 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -257,6 +257,10 @@ int32_t LP_choosei_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datal vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(swap->ctx,pubkey33,swap->I.privAm); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); + swap->bobdeposit.I.pubkey33[0] = 2; + for (i=0; i<32; i++) + swap->bobdeposit.I.pubkey33[i+1] = swap->I.pubA0.bytes[i]; + printf("SET bobdeposit pubkey33.(02%s)\n",bits256_str(str,swap->I.pubA0)); //basilisk_bobscripts_set(swap,0); } return(0); From 0ce87644ee12a2cc95ced762ed98589668171bc1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:11:47 +0300 Subject: [PATCH 004/910] Test --- iguana/exchanges/LP_transaction.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index fafabb418..de2d4f0c4 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -725,7 +725,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ printf(" pubkey33.%s, suppress.%d\n",rawtx->name,rawtx->I.suppress_pubkeys); for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,0,0,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys)) != 0 ) { rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) ) @@ -1443,13 +1443,15 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->depositunconf = 1; basilisk_dontforget_update(swap,&swap->bobdeposit); len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + memcpy(swap->I.userdata_aliceclaim,userdata,len); + swap->I.userdata_aliceclaimlen = len; bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); for (i=0; ibobdeposit.I.redeemlen; i++) printf("%02x",swap->bobdeposit.redeemscript[i]); printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); - memcpy(swap->I.userdata_aliceclaim,userdata,len); - swap->I.userdata_aliceclaimlen = len; + memcpy(swap->aliceclaim.redeemscript,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + swap->aliceclaim.I.redeemlen = swap->bobdeposit.I.redeemlen; retval = 0; if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) { From 24337934a7fabe43502cfe654acbd118d2f888e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:18:31 +0300 Subject: [PATCH 005/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index de2d4f0c4..55d1afb2b 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -536,7 +536,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t } } finalized = iguana_vininfo_create(pubtype,p2shtype,isPoS,serialized2,maxsize,msgtx,vins,numinputs,V); - printf("finalized.%d\n",finalized); + printf("finalized.%d ignore_cltverr.%d\n",finalized,V[0].ignore_cltverr); if ( (complete= bitcoin_verifyvins(ctx,symbol,pubtype,p2shtype,isPoS,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; //char str[65]; From b4b1c35819ef8472b354f14d8af3e422b0273ea0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:26:17 +0300 Subject: [PATCH 006/910] Test --- iguana/exchanges/LP_transaction.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 55d1afb2b..951c7e52b 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -536,7 +536,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t } } finalized = iguana_vininfo_create(pubtype,p2shtype,isPoS,serialized2,maxsize,msgtx,vins,numinputs,V); - printf("finalized.%d ignore_cltverr.%d\n",finalized,V[0].ignore_cltverr); + printf("finalized.%d ignore_cltverr.%d suppress.%d\n",finalized,V[0].ignore_cltverr,V[0].suppress_pubkeys); if ( (complete= bitcoin_verifyvins(ctx,symbol,pubtype,p2shtype,isPoS,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; //char str[65]; @@ -1449,7 +1449,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); for (i=0; ibobdeposit.I.redeemlen; i++) printf("%02x",swap->bobdeposit.redeemscript[i]); - printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); + printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys); memcpy(swap->aliceclaim.redeemscript,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); swap->aliceclaim.I.redeemlen = swap->bobdeposit.I.redeemlen; retval = 0; From 3c25903df089c68743ffad272afcce686ccc14b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:32:32 +0300 Subject: [PATCH 007/910] Test --- iguana/exchanges/LP_transaction.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 951c7e52b..919a4d4ea 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -225,6 +225,7 @@ int32_t iguana_interpreter(struct iguana_info *coin,cJSON *logarray,int64_t nLoc if ( activescriptlen < 16 ) continue; //printf("interpreter.(%s)\n",jprint(spendscript,0)); + printf("bitcoin_assembler ignore_cltverr.%d suppress.%d\n",V[vini].ignore_cltverr,V[vini].suppress_pubkeys); if ( (scriptlen= bitcoin_assembler(coin,logarray,script,spendscript,1,nLockTime,&V[vini])) < 0 ) { //printf("bitcoin_assembler error scriptlen.%d\n",scriptlen); @@ -722,10 +723,10 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ } for (iter=0; iter<33; iter++) printf("%02x",rawtx->I.pubkey33[iter]); - printf(" pubkey33.%s, suppress.%d\n",rawtx->name,rawtx->I.suppress_pubkeys); + printf(" pubkey33.%s, suppress.%d\n",rawtx->name,dest->I.suppress_pubkeys); for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) { rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) ) From 799a31f25bf5a038a6f938a016262bcf27b7c001 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:47:29 +0300 Subject: [PATCH 008/910] Test --- iguana/exchanges/LP_swap.c | 3 ++- iguana/exchanges/LP_transaction.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index d4066b050..eb6026c1a 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -258,8 +258,9 @@ int32_t LP_choosei_verify(struct basilisk_swap *swap,uint8_t *data,int32_t datal swap->I.pubAm = bitcoin_pubkey33(swap->ctx,pubkey33,swap->I.privAm); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); swap->bobdeposit.I.pubkey33[0] = 2; + swap->bobpayment.I.pubkey33[0] = 2; for (i=0; i<32; i++) - swap->bobdeposit.I.pubkey33[i+1] = swap->I.pubA0.bytes[i]; + swap->bobpayment.I.pubkey33[i+1] = swap->bobdeposit.I.pubkey33[i+1] = swap->I.pubA0.bytes[i]; printf("SET bobdeposit pubkey33.(02%s)\n",bits256_str(str,swap->I.pubA0)); //basilisk_bobscripts_set(swap,0); } diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 919a4d4ea..6c1a8b5b0 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1448,6 +1448,9 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->I.userdata_aliceclaimlen = len; bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); + for (i=0; ibobdeposit.I.datalen; i++) + printf("%02x",swap->bobdeposit.txbytes[i]); + printf(" <- bobdeposit.%d\n",swap->bobdeposit.I.datalen); for (i=0; ibobdeposit.I.redeemlen; i++) printf("%02x",swap->bobdeposit.redeemscript[i]); printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys); @@ -1499,6 +1502,9 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); + for (i=0; ibobpayment.I.datalen; i++) + printf("%02x",swap->bobpayment.txbytes[i]); + printf(" <- bobpayment.%d\n",swap->bobpayment.I.datalen); for (i=0; ibobpayment.I.redeemlen; i++) printf("%02x",swap->bobpayment.redeemscript[i]); printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); From 88c8ff6355cec3202e46e724a31bb8dc9ca23cd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 15:57:05 +0300 Subject: [PATCH 009/910] Test --- iguana/exchanges/LP_swap.c | 1 + iguana/exchanges/LP_transaction.c | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index eb6026c1a..a6b6a2d91 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -501,6 +501,7 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 sendbuf[sendlen++] = rawtx->I.datalen & 0xff; sendbuf[sendlen++] = (rawtx->I.datalen >> 8) & 0xff; sendbuf[sendlen++] = rawtx->I.redeemlen; + int32_t z; for (z=0; zI.datalen; z++) printf("%02x",rawtx->txbytes[z]); printf(" >>>>>>> send %s\n",rawtx->name); //printf("datalen.%d redeemlen.%d\n",rawtx->I.datalen,rawtx->I.redeemlen); memcpy(&sendbuf[sendlen],rawtx->txbytes,rawtx->I.datalen), sendlen += rawtx->I.datalen; if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 6c1a8b5b0..ae6d37329 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1382,15 +1382,14 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); if ( rawtx->I.datalen == 0 ) { - //rawtx->txbytes = calloc(1,datalen); + int32_t i; for (i=0; itxbytes,data,datalen); rawtx->I.datalen = datalen; } else if ( datalen != rawtx->I.datalen || memcmp(rawtx->txbytes,data,datalen) != 0 ) { - int32_t i; for (i=0; iI.datalen; i++) printf("%02x",rawtx->txbytes[i]); printf(" <- rawtx\n"); From 71339b69b3466021f76993354b9609468da4fba4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 16:12:23 +0300 Subject: [PATCH 010/910] Test --- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index a6b6a2d91..b0afeedb6 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -501,7 +501,7 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 sendbuf[sendlen++] = rawtx->I.datalen & 0xff; sendbuf[sendlen++] = (rawtx->I.datalen >> 8) & 0xff; sendbuf[sendlen++] = rawtx->I.redeemlen; - int32_t z; for (z=0; zI.datalen; z++) printf("%02x",rawtx->txbytes[z]); printf(" >>>>>>> send %s\n",rawtx->name); + int32_t z; for (z=0; zI.datalen; z++) printf("%02x",rawtx->txbytes[z]); printf(" >>>>>>> send.%d %s\n",rawtx->I.datalen,rawtx->name); //printf("datalen.%d redeemlen.%d\n",rawtx->I.datalen,rawtx->I.redeemlen); memcpy(&sendbuf[sendlen],rawtx->txbytes,rawtx->I.datalen), sendlen += rawtx->I.datalen; if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index ae6d37329..a50430dd1 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -48,15 +48,14 @@ bits256 LP_broadcast_tx(char *name,char *symbol,uint8_t *data,int32_t datalen) if ( data != 0 && datalen != 0 ) { char str[65]; -#ifdef BASILISK_DISABLESENDTX - txid = bits256_doublesha256(0,data,datalen); - printf("%s <- dont sendrawtransaction (%s)\n",name,bits256_str(str,txid)); - return(txid); -#endif signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); +#ifdef BASILISK_DISABLESENDTX + txid = bits256_doublesha256(0,data,datalen); + printf("%s <- dont sendrawtransaction (%s) %s\n",name,bits256_str(str,txid),signedtx); +#else txid = LP_broadcast(name,symbol,signedtx); - // sent to nn_socket! +#endif free(signedtx); } return(txid); From 5c5ba00bc3dc1760d674c595bc0998fffe0d99b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 16:23:28 +0300 Subject: [PATCH 011/910] Test --- iguana/exchanges/LP_swap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b0afeedb6..4e38f9f32 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -547,6 +547,7 @@ void LP_bobloop(void *_utxo) printf("error bobscripts deposit\n"); else { + printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); if ( LP_waitfor(utxo->pair,swap,10,LP_verify_otherfee) < 0 ) printf("error waiting for alicefee\n"); From 476a9c94f201402a50d128db4873c2e001abc49f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 16:31:23 +0300 Subject: [PATCH 012/910] Test --- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 22 +++++++++------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 4e38f9f32..6a1def41e 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -411,7 +411,7 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i { if ( (datalen= nn_recv(pairsock,&data,NN_MSG,0)) >= 0 ) { - printf("wait for got.%d\n",datalen); + //printf("wait for got.%d\n",datalen); retval = (*verify)(swap,data,datalen); nn_freemsg(data); return(retval); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index a50430dd1..309232afe 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -536,15 +536,15 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t } } finalized = iguana_vininfo_create(pubtype,p2shtype,isPoS,serialized2,maxsize,msgtx,vins,numinputs,V); - printf("finalized.%d ignore_cltverr.%d suppress.%d\n",finalized,V[0].ignore_cltverr,V[0].suppress_pubkeys); + //printf("finalized.%d ignore_cltverr.%d suppress.%d\n",finalized,V[0].ignore_cltverr,V[0].suppress_pubkeys); if ( (complete= bitcoin_verifyvins(ctx,symbol,pubtype,p2shtype,isPoS,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { - int32_t tmp; //char str[65]; + /*int32_t tmp; //char str[65]; if ( (tmp= iguana_interpreter(ctx,cJSON_CreateArray(),iguana_lockval(finalized,jint(txobj,"locktime")),V,numinputs)) < 0 ) { printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); complete = 0; - } else printf("interpreter passed\n"); + } else printf("interpreter passed\n");*/ } else printf("complete.%d\n",complete); } else printf("rwmsgtx error\n"); } else fprintf(stderr,"no inputs in vins.(%s)\n",vins!=0?jprint(vins,0):"null"); @@ -707,7 +707,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr,uint8_t *changermd160,char *vinaddr) { - char *signedtx,*changeaddr = 0,_changeaddr[64]; int64_t txfee,newtxfee=0,destamount; uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; int32_t iter,len,retval = -1; double estimatedrate; + char *signedtx,*changeaddr = 0,_changeaddr[64]; int64_t txfee,newtxfee=0,destamount; uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; int32_t iter,retval = -1; double estimatedrate; timestamp = swap->I.started; if ( dest == &swap->aliceclaim ) locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; @@ -720,24 +720,20 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ bitcoin_address(changeaddr,pubtype,changermd160,20); printf("changeaddr.(%s)\n",changeaddr); } - for (iter=0; iter<33; iter++) - printf("%02x",rawtx->I.pubkey33[iter]); - printf(" pubkey33.%s, suppress.%d\n",rawtx->name,dest->I.suppress_pubkeys); for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) { - rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; - if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) ) + dest->I.datalen = (int32_t)strlen(signedtx) >> 1; + if ( dest->I.datalen <= sizeof(dest->txbytes) ) { - decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); - rawtx->I.completed = 1; + decode_hex(dest->txbytes,dest->I.datalen,signedtx); + dest->I.completed = 1; retval = 0; } free(signedtx); if ( strcmp(symbol,"BTC") != 0 ) return(retval); - len = rawtx->I.datalen; estimatedrate = LP_getestimatedrate(symbol); newtxfee = estimatedrate * len; } else break; From 60b6bfdb9ebe40a80c590b31e6836aa5b96d2e88 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 16:32:05 +0300 Subject: [PATCH 013/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 309232afe..f04387b18 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -735,7 +735,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ if ( strcmp(symbol,"BTC") != 0 ) return(retval); estimatedrate = LP_getestimatedrate(symbol); - newtxfee = estimatedrate * len; + newtxfee = estimatedrate * dest->I.datalen; } else break; } return(retval); From 294a2341aa9866c788b1a25cfa398beb38473c13 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 16:51:51 +0300 Subject: [PATCH 014/910] Test --- iguana/exchanges/LP_transaction.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index f04387b18..d5cded1ad 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1171,9 +1171,9 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobpayment.I.spendlen = basilisk_bobscript(swap->bobpayment.I.rmd160,swap->bobpayment.redeemscript,&swap->bobpayment.I.redeemlen,swap->bobpayment.spendscript,0,&swap->bobpayment.I.locktime,&swap->bobpayment.I.secretstart,&swap->I,0); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); - int32_t i; for (i=0; ibobpayment.I.redeemlen; i++) - printf("%02x",swap->bobpayment.redeemscript[i]); - printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); + //int32_t i; for (i=0; ibobpayment.I.redeemlen; i++) + // printf("%02x",swap->bobpayment.redeemscript[i]); + //printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); if ( genflag != 0 && bits256_nonz(*(bits256 *)swap->I.secretBn256) != 0 && swap->bobpayment.I.datalen == 0 ) { basilisk_rawtx_gen(swap->ctx,"payment",swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr); @@ -1204,9 +1204,9 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); - int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) - printf("%02x",swap->bobdeposit.redeemscript[i]); - printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); + //int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) + // printf("%02x",swap->bobdeposit.redeemscript[i]); + //printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); if ( genflag != 0 && (swap->bobdeposit.I.datalen == 0 || swap->bobrefund.I.datalen == 0) ) { basilisk_rawtx_gen(swap->ctx,"deposit",swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr); @@ -1392,7 +1392,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba return(-1); } txid = bits256_doublesha256(0,data,datalen); - char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); + //char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) rawtx->I.actualtxid = txid; if ( (txobj= bitcoin_data2json(rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) @@ -1450,6 +1450,8 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys); memcpy(swap->aliceclaim.redeemscript,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); swap->aliceclaim.I.redeemlen = swap->bobdeposit.I.redeemlen; + memcpy(swap->aliceclaim.I.pubkey33,swap->persistent_pubkey33,33); + bitcoin_address(swap->aliceclaim.I.destaddr,swap->alicecoin.pubtype,swap->persistent_pubkey33,33); retval = 0; if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) { @@ -1505,6 +1507,8 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da memcpy(swap->I.userdata_alicespend,userdata,len); swap->I.userdata_alicespendlen = len; retval = 0; + memcpy(swap->alicespend.I.pubkey33,swap->persistent_pubkey33,33); + bitcoin_address(swap->alicespend.I.destaddr,swap->bobcoin.pubtype,swap->persistent_pubkey33,33); char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->alicepayment.I.destaddr)) == 0 ) { From 5c6a00cbcaf8d3286ee39c1aef56ac2157446336 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:07:23 +0300 Subject: [PATCH 015/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 8b7eac1a6..4514803ca 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -310,7 +310,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) } if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) bestprice = price; - char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice); + char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); } if ( bestprice != 0. ) { @@ -332,7 +332,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) bestmetric = metric; } } - } + } else printf("(%f %f) ",price,dstr(Q[i].destsatoshis)); } printf("metrics, best %f\n",bestmetric); if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) From a481781cc2eb4731cab2325e3ea6f7436e3455fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:12:49 +0300 Subject: [PATCH 016/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 4514803ca..70cfedd82 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -112,9 +112,9 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->destvout = jint(argjson,"destvout"); qp->desthash = jbits256(argjson,"desthash"); if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) - qp->satoshis = j64bits(argjson,"value"); + qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); if ( (qp->satoshis2= j64bits(argjson,"satoshis2")) == 0 ) - qp->satoshis2 = j64bits(argjson,"value2"); + qp->satoshis = SATOSHIDEN * jdouble(argjson,"value2"); qp->destsatoshis = j64bits(argjson,"destsatoshis"); qp->change = SATOSHIDEN * jdouble(argjson,"change"); qp->txfee = j64bits(argjson,"txfee"); From 2b2173daab4f6a4579ce2e600fa4fb2fc7d7b75c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:20:15 +0300 Subject: [PATCH 017/910] Test --- iguana/exchanges/LP_commands.c | 5 ++--- iguana/exchanges/LP_transaction.c | 8 +++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 70cfedd82..d9a343110 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -113,9 +113,8 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->desthash = jbits256(argjson,"desthash"); if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); - if ( (qp->satoshis2= j64bits(argjson,"satoshis2")) == 0 ) - qp->satoshis = SATOSHIDEN * jdouble(argjson,"value2"); - qp->destsatoshis = j64bits(argjson,"destsatoshis"); + if ( (qp->destsatoshis= j64bits(argjson,"destsatoshis")) == 0 ) + qp->destsatoshis = SATOSHIDEN * jdouble(argjson,"value2"); qp->change = SATOSHIDEN * jdouble(argjson,"change"); qp->txfee = j64bits(argjson,"txfee"); qp->desttxfee = j64bits(argjson,"desttxfee"); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index d5cded1ad..42ffb64d2 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -639,6 +639,12 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch if ( addrtype == p2shtype ) spendlen = bitcoin_p2shspend(spendscript,0,rmd160); else spendlen = bitcoin_standardspend(spendscript,0,rmd160); + if ( change != 0 && strcmp(changeaddr,destaddr) == 0 ) + { + printf("combine change %.8f -> %s\n",dstr(change),changeaddr); + satoshis += change; + change = 0; + } txobj = bitcoin_txoutput(txobj,spendscript,spendlen,satoshis); if ( change != 0 ) { @@ -722,7 +728,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ } for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->p2shaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( dest->I.datalen <= sizeof(dest->txbytes) ) From 8914ff996c1583ab06bd189a8bf8d61d467b9bec Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:32:09 +0300 Subject: [PATCH 018/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_transaction.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d9a343110..f1815bcbf 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -323,7 +323,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) printf("%f ",metric); if ( metric > 0.9 ) { - metric = Q[i].destsatoshis / metric * metric * metric; + metric = Q[i].destsatoshis * metric * metric * metric; printf("%f, ",metric); if ( metric > bestmetric ) { diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index ed3784b55..96096072d 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -160,7 +160,7 @@ int32_t LP_importaddress(char *symbol,char *address) double LP_getestimatedrate(char *symbol) { - char buf[512],*retstr; double rate = 200; struct iguana_info *coin = LP_coinfind(symbol); + char buf[512],*retstr; double rate = 20; struct iguana_info *coin = LP_coinfind(symbol); if ( coin != 0 ) { sprintf(buf,"[%d]",3); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 42ffb64d2..71d254fd0 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -705,6 +705,8 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub if ( coin->estimatedrate == 0. ) coin->estimatedrate = LP_getestimatedrate(coin->symbol); newtxfee = coin->estimatedrate * len; + if ( newtxfee < 10000 ) + newtxfee = 10000; printf("txfee %.8f -> newtxfee %.8f\n",dstr(txfee),dstr(newtxfee)); } else break; } From 3d58453b5b4c421455827058fa98a8d9615eccf5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:35:04 +0300 Subject: [PATCH 019/910] Test --- iguana/exchanges/LP_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f1815bcbf..716ca306e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -320,10 +320,10 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) if ( (price= prices[i]) != 0. && Q[i].destsatoshis != 0 ) { metric = price / bestprice; - printf("%f ",metric); - if ( metric > 0.9 ) + printf("%f %f ",price,metric); + if ( metric < 1.1 ) { - metric = Q[i].destsatoshis * metric * metric * metric; + metric = dstr(Q[i].destsatoshis) / metric * metric * metric; printf("%f, ",metric); if ( metric > bestmetric ) { From bce4383086996f3aa52b4c00dcc712384e7c598a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:38:35 +0300 Subject: [PATCH 020/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 716ca306e..11fe322aa 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -323,9 +323,9 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) printf("%f %f ",price,metric); if ( metric < 1.1 ) { - metric = dstr(Q[i].destsatoshis) / metric * metric * metric; + metric = dstr(Q[i].destsatoshis) * metric * metric * metric; printf("%f, ",metric); - if ( metric > bestmetric ) + if ( bestmetric == 0. || metric < bestmetric ) { besti = i; bestmetric = metric; From 8682106cfe0bb86b4cc1c886bfc67fed4800f59e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 17:43:03 +0300 Subject: [PATCH 021/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 11fe322aa..c839c5182 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -320,11 +320,11 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) if ( (price= prices[i]) != 0. && Q[i].destsatoshis != 0 ) { metric = price / bestprice; - printf("%f %f ",price,metric); + printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); if ( metric < 1.1 ) { metric = dstr(Q[i].destsatoshis) * metric * metric * metric; - printf("%f, ",metric); + printf("%f\n",metric); if ( bestmetric == 0. || metric < bestmetric ) { besti = i; From 47db38a0a6ae57c6f5b0113b460987e53ed2b59e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 18:05:20 +0300 Subject: [PATCH 022/910] Test --- iguana/exchanges/LP_transaction.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 71d254fd0..9058d3a12 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1438,10 +1438,11 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t datalen) { - uint8_t userdata[512]; int32_t i,retval=-1,len = 0; static bits256 zero; + uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; static bits256 zero; if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { - swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); + swap->bobdeposit.utxovout = 0; + swap->bobdeposit.utxotxid = swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); if ( bits256_nonz(swap->bobdeposit.I.signedtxid) != 0 ) swap->depositunconf = 1; basilisk_dontforget_update(swap,&swap->bobdeposit); @@ -1452,7 +1453,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); - printf(" <- bobdeposit.%d\n",swap->bobdeposit.I.datalen); + printf(" <- bobdeposit.%d %s\n",swap->bobdeposit.I.datalen,bits256_str(str,swap->bobdeposit.I.signedtxid)); for (i=0; ibobdeposit.I.redeemlen; i++) printf("%02x",swap->bobdeposit.redeemscript[i]); printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys); @@ -1481,7 +1482,10 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t { if ( LP_rawtx_spendscript(swap,swap->alicecoin.longestchain,&swap->alicepayment,0,data,datalen,0) == 0 ) { - swap->alicepayment.I.signedtxid = LP_broadcast_tx(swap->alicepayment.name,swap->alicecoin.symbol,swap->alicepayment.txbytes,swap->alicepayment.I.datalen); + swap->alicepayment.utxovout = 0; + swap->alicepayment.utxotxid = swap->alicepayment.I.signedtxid = LP_broadcast_tx(swap->alicepayment.name,swap->alicecoin.symbol,swap->alicepayment.txbytes,swap->alicepayment.I.datalen); + bitcoin_address(swap->alicepayment.p2shaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); + strcpy(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); if ( bits256_nonz(swap->alicepayment.I.signedtxid) != 0 ) swap->aliceunconf = 1; basilisk_dontforget_update(swap,&swap->alicepayment); @@ -1493,11 +1497,12 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t datalen) { - uint8_t userdata[512]; int32_t i,retval=-1,len = 0; bits256 revAm; + uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; bits256 revAm; memset(revAm.bytes,0,sizeof(revAm)); if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobpayment,0,data,datalen,0) == 0 ) { - swap->bobpayment.I.signedtxid = LP_broadcast_tx(swap->bobpayment.name,swap->bobpayment.coin->symbol,swap->bobpayment.txbytes,swap->bobpayment.I.datalen); + swap->bobpayment.utxovout = 0; + swap->bobpayment.utxotxid = swap->bobpayment.I.signedtxid = LP_broadcast_tx(swap->bobpayment.name,swap->bobpayment.coin->symbol,swap->bobpayment.txbytes,swap->bobpayment.I.datalen); if ( bits256_nonz(swap->bobpayment.I.signedtxid) != 0 ) swap->paymentunconf = 1; basilisk_dontforget_update(swap,&swap->bobpayment); @@ -1511,7 +1516,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da printf(" <- bobpayment.%d\n",swap->bobpayment.I.datalen); for (i=0; ibobpayment.I.redeemlen; i++) printf("%02x",swap->bobpayment.redeemscript[i]); - printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); + printf(" <- bobpayment redeem %d %s %s\n",i,swap->bobpayment.I.destaddr,bits256_str(str,swap->bobpayment.I.signedtxid)); memcpy(swap->I.userdata_alicespend,userdata,len); swap->I.userdata_alicespendlen = len; retval = 0; From 504dc20fc4af2fc56349b1fe02fc3e10d9410670 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 18:14:18 +0300 Subject: [PATCH 023/910] Test --- iguana/exchanges/LP_transaction.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 9058d3a12..3b464cc21 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -559,7 +559,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,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 vout,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,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[16]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; + char *rawtxbytes=0,*signedtx=0,tmpaddr[64],hexstr[999],wifstr[128],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[16]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; *destamountp = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); if ( finalseqid == 0 ) @@ -567,11 +567,16 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch //printf("bobtxspend.%s redeem.[%d]\n",symbol,redeemlen); if ( redeemlen < 0 ) return(0); +#ifndef BASILISK_DISABLESENDTX if ( (value= LP_txvalue(symbol,utxotxid,vout)) == 0 ) { + char str[65]; printf("basilisk_swap_bobtxspend.%s %s utxo.(%s) already spent or doesnt exist\n",name,symbol,bits256_str(str,utxotxid)); return(0); } +#else + value = satoshis; +#endif if ( satoshis != 0 ) { if ( value > satoshis+txfee ) From 1d8efc6fa0f9cd320a12720001138e85ec04524d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 18:24:33 +0300 Subject: [PATCH 024/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 3b464cc21..26c81dc64 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -735,7 +735,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ } for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,rawtx->utxotxid,rawtx->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,dest->utxotxid,dest->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( dest->I.datalen <= sizeof(dest->txbytes) ) From 2671da72308fe7be71f50a13fb6f46515b7b4ba8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 18:33:10 +0300 Subject: [PATCH 025/910] Test --- iguana/exchanges/LP_transaction.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 26c81dc64..11ed036e7 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1446,8 +1446,8 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; static bits256 zero; if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { - swap->bobdeposit.utxovout = 0; - swap->bobdeposit.utxotxid = swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); + swap->bobrefund.utxovout = 0; + swap->bobrefund.utxotxid = swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); if ( bits256_nonz(swap->bobdeposit.I.signedtxid) != 0 ) swap->depositunconf = 1; basilisk_dontforget_update(swap,&swap->bobdeposit); @@ -1487,8 +1487,8 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t { if ( LP_rawtx_spendscript(swap,swap->alicecoin.longestchain,&swap->alicepayment,0,data,datalen,0) == 0 ) { - swap->alicepayment.utxovout = 0; - swap->alicepayment.utxotxid = swap->alicepayment.I.signedtxid = LP_broadcast_tx(swap->alicepayment.name,swap->alicecoin.symbol,swap->alicepayment.txbytes,swap->alicepayment.I.datalen); + swap->bobspend.utxovout = 0; + swap->bobspend.utxotxid = swap->alicepayment.I.signedtxid = LP_broadcast_tx(swap->alicepayment.name,swap->alicecoin.symbol,swap->alicepayment.txbytes,swap->alicepayment.I.datalen); bitcoin_address(swap->alicepayment.p2shaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); strcpy(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); if ( bits256_nonz(swap->alicepayment.I.signedtxid) != 0 ) @@ -1506,8 +1506,8 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da memset(revAm.bytes,0,sizeof(revAm)); if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobpayment,0,data,datalen,0) == 0 ) { - swap->bobpayment.utxovout = 0; - swap->bobpayment.utxotxid = swap->bobpayment.I.signedtxid = LP_broadcast_tx(swap->bobpayment.name,swap->bobpayment.coin->symbol,swap->bobpayment.txbytes,swap->bobpayment.I.datalen); + swap->alicespend.utxovout = 0; + swap->alicespend.utxotxid = swap->bobpayment.I.signedtxid = LP_broadcast_tx(swap->bobpayment.name,swap->bobpayment.coin->symbol,swap->bobpayment.txbytes,swap->bobpayment.I.datalen); if ( bits256_nonz(swap->bobpayment.I.signedtxid) != 0 ) swap->paymentunconf = 1; basilisk_dontforget_update(swap,&swap->bobpayment); From d791ed57d3a34071f4c5c0fe94f4d668bf09080d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 20:40:24 +0300 Subject: [PATCH 026/910] Test --- iguana/exchanges/LP_commands.c | 3 ++- iguana/tests/dexlistunspent | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c839c5182..da9a8c07e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -252,6 +252,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { item = jitem(array,i); //printf("%s\n",jprint(item,0)); + printf("i.%d %.8f %.8f, %.8f %.8f\n",i,dstr(estimatedbase),dstr(j64bits(item,"satoshis")),dstr(myutxo->satoshis),dstr(Q.destsatoshis)); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 && LP_sizematch(estimatedbase,j64bits(item,"satoshis")) == 0 ) { @@ -289,7 +290,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) maxprice = LP_price(base,myutxo->coin) / 0.975; if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) { - printf("candidates.(%s)\n",jprint(array,0)); + //printf("candidates.(%s)\n",jprint(array,0)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 4c06d2429..4e13419d8 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RYZx1e7kVNTuQ6RTrvTkYeZAz5uJobC3pg\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"symbol\":\"KMD\"}" From 45329552923cb8683f6b2bf761f2a449e474c759 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 20:45:00 +0300 Subject: [PATCH 027/910] Test --- iguana/exchanges/LP_commands.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index da9a8c07e..af38ac4e0 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -228,7 +228,7 @@ int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*icopy,*retarray=0,*item; int32_t i,n; double price; int64_t estimatedbase; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*icopy,*retarray=0,*item; int32_t i,n; double price; int64_t estimatedbase,satoshis; if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); @@ -251,10 +251,12 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) for (i=0; isatoshis),dstr(Q.destsatoshis)); + LP_quoteparse(&Q,item); + if ( (satoshis= j64bits(item,"satoshis")) == 0 ) + satoshis = SATOSHIDEN * jdouble(item,"value"); + printf("i.%d %.8f %.8f, %.8f %.8f\n",i,dstr(estimatedbase),dstr(satoshis),dstr(myutxo->satoshis),dstr(Q.destsatoshis)); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); - if ( strcmp(coinstr,base) == 0 && LP_sizematch(estimatedbase,j64bits(item,"satoshis")) == 0 ) + if ( strcmp(coinstr,base) == 0 && LP_sizematch(estimatedbase,satoshis) == 0 ) { icopy = 0; if ( (price= LP_pricecache(&Q,base,myutxo->coin,jbits256(item,"txid"),jint(item,"vout"))) != 0. ) From c6c4e931a29e706bd374e5a808f4f7bb5aa65c37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 20:49:53 +0300 Subject: [PATCH 028/910] Test --- iguana/exchanges/LP_commands.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index af38ac4e0..a81a51a82 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -228,16 +228,12 @@ int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*icopy,*retarray=0,*item; int32_t i,n; double price; int64_t estimatedbase,satoshis; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*icopy,*retarray=0,*item; int32_t i,n; double price; int64_t satoshis; if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); return(0); } - estimatedbase = myutxo->satoshis / price; - printf("%s -> %s price %.8f mysatoshis %llu estimated base %llu\n",base,myutxo->coin,price,(long long)myutxo->satoshis,(long long)estimatedbase); - if ( estimatedbase <= 0 ) - return(0); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) @@ -254,9 +250,9 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) LP_quoteparse(&Q,item); if ( (satoshis= j64bits(item,"satoshis")) == 0 ) satoshis = SATOSHIDEN * jdouble(item,"value"); - printf("i.%d %.8f %.8f, %.8f %.8f\n",i,dstr(estimatedbase),dstr(satoshis),dstr(myutxo->satoshis),dstr(Q.destsatoshis)); + printf("i.%d %.8f %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis)); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); - if ( strcmp(coinstr,base) == 0 && LP_sizematch(estimatedbase,satoshis) == 0 ) + if ( strcmp(coinstr,base) == 0 ) { icopy = 0; if ( (price= LP_pricecache(&Q,base,myutxo->coin,jbits256(item,"txid"),jint(item,"vout"))) != 0. ) @@ -270,7 +266,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) jaddnum(icopy,"price",price); jaddi(retarray,icopy); } - } else printf("skip %s estimated %.8f vs %.8f\n",coinstr,dstr(estimatedbase),dstr(j64bits(item,"satoshis"))); + } else printf("skip %s estimated %.8f\n",coinstr,dstr(satoshis)); } } free_json(array); From 47194ad67baa21e4994531a4255707d2402caa3c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 20:52:04 +0300 Subject: [PATCH 029/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a81a51a82..e146bcc0d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -250,7 +250,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) LP_quoteparse(&Q,item); if ( (satoshis= j64bits(item,"satoshis")) == 0 ) satoshis = SATOSHIDEN * jdouble(item,"value"); - printf("i.%d %.8f %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis)); + printf(">>>> i.%d %.8f %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis)); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { From cad80ddcdd604dddbef8ca4bd32ffcd8a52af266 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 20:56:00 +0300 Subject: [PATCH 030/910] Test --- iguana/exchanges/LP_commands.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index e146bcc0d..591b1e9ff 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -114,7 +114,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); if ( (qp->destsatoshis= j64bits(argjson,"destsatoshis")) == 0 ) - qp->destsatoshis = SATOSHIDEN * jdouble(argjson,"value2"); + qp->destsatoshis = qp->satoshis * jdouble(argjson,"price"); qp->change = SATOSHIDEN * jdouble(argjson,"change"); qp->txfee = j64bits(argjson,"txfee"); qp->desttxfee = j64bits(argjson,"desttxfee"); @@ -248,8 +248,6 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { item = jitem(array,i); LP_quoteparse(&Q,item); - if ( (satoshis= j64bits(item,"satoshis")) == 0 ) - satoshis = SATOSHIDEN * jdouble(item,"value"); printf(">>>> i.%d %.8f %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis)); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) From bf7d9c60d45c3a385365cb851ca97e8a3360ced0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:03:18 +0300 Subject: [PATCH 031/910] Test --- iguana/exchanges/LP_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 591b1e9ff..38016a30a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -248,7 +248,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { item = jitem(array,i); LP_quoteparse(&Q,item); - printf(">>>> i.%d %.8f %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis)); + printf(">>>> i.%d %.8f %.8f Q: price %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis),jdouble(item,"price")); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { @@ -264,7 +264,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) jaddnum(icopy,"price",price); jaddi(retarray,icopy); } - } else printf("skip %s estimated %.8f\n",coinstr,dstr(satoshis)); + } } } free_json(array); @@ -306,7 +306,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) } if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) bestprice = price; - char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); + //char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); } if ( bestprice != 0. ) { From 6efaf41a9f4f472d2d2208c8a0285f4766f7f95d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:06:45 +0300 Subject: [PATCH 032/910] Test --- iguana/exchanges/LP_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 38016a30a..6390f541d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -248,13 +248,14 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { item = jitem(array,i); LP_quoteparse(&Q,item); - printf(">>>> i.%d %.8f %.8f Q: price %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis),jdouble(item,"price")); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { icopy = 0; if ( (price= LP_pricecache(&Q,base,myutxo->coin,jbits256(item,"txid"),jint(item,"vout"))) != 0. ) { + if ( Q.destsatoshis == 0 ) + Q.destsatoshis = Q.satoshis * price; if ( LP_sizematch(myutxo->satoshis,Q.destsatoshis) == 0 ) icopy = jduplicate(item); } else icopy = jduplicate(item); @@ -264,6 +265,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) jaddnum(icopy,"price",price); jaddi(retarray,icopy); } + printf(">>>> i.%d %.8f %.8f Q: price %.8f -> %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis),price,price * dstr(Q.satoshis)); } } } From ff093b08e380059cde986e31ec3630206e45a24e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:26:08 +0300 Subject: [PATCH 033/910] Test --- iguana/exchanges/LP_commands.c | 28 ++++------------------------ iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_utxos.c | 6 +++++- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6390f541d..b75ae40f6 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -228,7 +228,7 @@ int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*icopy,*retarray=0,*item; int32_t i,n; double price; int64_t satoshis; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n; double price; if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); @@ -250,23 +250,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) LP_quoteparse(&Q,item); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) - { - icopy = 0; - if ( (price= LP_pricecache(&Q,base,myutxo->coin,jbits256(item,"txid"),jint(item,"vout"))) != 0. ) - { - if ( Q.destsatoshis == 0 ) - Q.destsatoshis = Q.satoshis * price; - if ( LP_sizematch(myutxo->satoshis,Q.destsatoshis) == 0 ) - icopy = jduplicate(item); - } else icopy = jduplicate(item); - if ( icopy != 0 ) - { - if ( price != 0. ) - jaddnum(icopy,"price",price); - jaddi(retarray,icopy); - } - printf(">>>> i.%d %.8f %.8f Q: price %.8f -> %.8f\n",i,dstr(myutxo->satoshis),dstr(Q.destsatoshis),price,price * dstr(Q.satoshis)); - } + jaddi(retarray,jduplicate(item)); } } free_json(array); @@ -300,11 +284,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) if ( (price= jdouble(item,"price")) == 0. ) { price = LP_query("price",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,zero); - if ( Q[i].destsatoshis != 0 && (double)j64bits(item,"satoshis")/Q[i].destsatoshis > price ) - { - printf("adjustprice %.8f -> %.8f\n",price,(double)j64bits(item,"satoshis")/Q[i].destsatoshis); - price = (double)j64bits(item,"satoshis")/Q[i].destsatoshis; - } + Q[i].destsatoshis = price * Q[i].satoshis; } if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) bestprice = price; @@ -316,7 +296,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) besti = -1; for (i=0; isatoshis > Q[i].destsatoshis ) { metric = price / bestprice; printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 9dc21ab9b..cef33e7b0 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -164,6 +164,7 @@ struct LP_utxoinfo UT_hash_handle hh; bits256 txid,txid2,feetxid,otherpubkey,mypub; void *swap; + double value; uint64_t satoshis,satoshis2; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; int32_t vout,vout2,pair; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b10a7d93f..2a3d74ec7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -116,7 +116,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); utxo->txid = txid; utxo->vout = vout; - utxo->satoshis = satoshis; + utxo->value = dstr(satoshis); + if ( IAMCLIENT == 0 ) + utxo->satoshis = satoshis; + else if ( depositsatoshis < 9 * (satoshis >> 3) ) + utxo->satoshis = (depositsatoshis / 9) << 3; utxo->txid2 = deposittxid; utxo->vout2 = depositvout; utxo->satoshis2 = depositsatoshis; From 71c6f5356ca0868e4188a14c778d2520ec9eab73 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:30:28 +0300 Subject: [PATCH 034/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index b75ae40f6..53bacf653 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -310,7 +310,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) bestmetric = metric; } } - } else printf("(%f %f) ",price,dstr(Q[i].destsatoshis)); + } else printf("(%f %f) ",dstr(myutxo->satoshis),dstr(Q[i].destsatoshis)); } printf("metrics, best %f\n",bestmetric); if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) From 2f3e3b0446a8639527f0577af535db07b45dc885 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:42:30 +0300 Subject: [PATCH 035/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index dbda8d683..6cb4673fb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -171,7 +171,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0 ) + if ( peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { if ( peer->numpeers != mypeer->numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2a3d74ec7..d84e93386 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -35,7 +35,8 @@ cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) jaddstr(item,"address",utxo->coinaddr); jaddbits256(item,"txid",utxo->txid); jaddnum(item,"vout",utxo->vout); - jaddnum(item,"value",dstr(utxo->satoshis)); + jaddnum(item,"value",utxo->value); + jadd64bits(item,"satoshis",utxo->satoshis); jaddbits256(item,"txid2",utxo->txid2); jaddnum(item,"vout2",utxo->vout2); jaddnum(item,"value2",dstr(utxo->satoshis2)); From 3dafc58ac0e1d0a870b1fbe609a27820da17f6f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:51:21 +0300 Subject: [PATCH 036/910] 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 d84e93386..c552a3a3f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -118,7 +118,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 utxo->txid = txid; utxo->vout = vout; utxo->value = dstr(satoshis); - if ( IAMCLIENT == 0 ) + if ( IAMCLIENT != 0 ) utxo->satoshis = satoshis; else if ( depositsatoshis < 9 * (satoshis >> 3) ) utxo->satoshis = (depositsatoshis / 9) << 3; From 09ad6e3a2b24b2e236cd86906e642fb55bfb582b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 21:57:02 +0300 Subject: [PATCH 037/910] 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 cef33e7b0..f7b123941 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -32,7 +32,7 @@ #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" #define BASILISK_DISABLEWAITTX -#define BASILISK_DISABLESENDTX +//#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 From 834cf55ccc0492e0ed054f0a1393117881689ecf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 4 Jun 2017 22:05:48 +0300 Subject: [PATCH 038/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_transaction.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 53bacf653..ab180768b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -363,7 +363,7 @@ int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double p utxo->swappending = 0; if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_price(utxo->coin,rel)) != 0. ) { - price *= (1. + profitmargin); + //price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); Q.timestamp = (uint32_t)time(NULL); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 11ed036e7..11d029d72 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1446,8 +1446,8 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; static bits256 zero; if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { - swap->bobrefund.utxovout = 0; - swap->bobrefund.utxotxid = swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); + swap->aliceclaim.utxovout = 0; + swap->aliceclaim.utxotxid = swap->bobdeposit.I.signedtxid = LP_broadcast_tx(swap->bobdeposit.name,swap->bobcoin.symbol,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); if ( bits256_nonz(swap->bobdeposit.I.signedtxid) != 0 ) swap->depositunconf = 1; basilisk_dontforget_update(swap,&swap->bobdeposit); From 5ba40582c8a69dbdff4b091785add307f25ab173 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 10:53:17 +0300 Subject: [PATCH 039/910] Test --- iguana/exchanges/LP_coins.c | 24 +- iguana/exchanges/LP_commands.c | 323 +-------------------------- iguana/exchanges/LP_include.h | 3 +- iguana/exchanges/LP_nativeDEX.c | 3 +- iguana/exchanges/LP_prices.c | 27 +-- iguana/exchanges/LP_quotes.c | 344 +++++++++++++++++++++++++++++ iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_statemachine.c | 9 +- iguana/exchanges/LP_transaction.c | 3 +- iguana/exchanges/LP_utxos.c | 25 +-- 10 files changed, 393 insertions(+), 370 deletions(-) create mode 100644 iguana/exchanges/LP_quotes.c diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index f397ee075..6f32b9372 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -141,9 +141,29 @@ uint16_t LP_rpcport(char *symbol) return(0); } +cJSON *LP_coinjson(struct iguana_info *coin) +{ + cJSON *item = cJSON_CreateObject(); + jaddstr(item,"coin",coin->symbol); + jaddstr(item,"smartaddress",coin->smartaddr); + jaddstr(item,"rpc",coin->serverport); + jaddnum(item,"pubtype",coin->pubtype); + jaddnum(item,"p2shtype",coin->p2shtype); + jaddnum(item,"wiftype",coin->wiftype); + return(item); +} + +static struct iguana_info *LP_coins; static int32_t LP_numcoins; +cJSON *LP_coinsjson() +{ + int32_t i; cJSON *array = cJSON_CreateArray(); + for (i=0; isrchash = srchash; - rp->srcamount = srcsatoshis; - rp->timestamp = timestamp; - rp->DEXselector = DEXselector; - safecopy(rp->src,src,sizeof(rp->src)); - safecopy(rp->dest,dest,sizeof(rp->dest)); - R = *rp; - rp->requestid = basilisk_requestid(rp); - rp->quotetime = quotetime; - rp->desthash = desthash; - rp->destamount = destsatoshis; - rp->quoteid = basilisk_quoteid(rp); - return(rp); -} - -cJSON *LP_quotejson(struct LP_quoteinfo *qp) -{ - double price; cJSON *retjson = cJSON_CreateObject(); - jaddstr(retjson,"base",qp->srccoin); - jaddstr(retjson,"rel",qp->destcoin); - if ( qp->coinaddr[0] != 0 ) - jaddstr(retjson,"address",qp->coinaddr); - if ( qp->timestamp != 0 ) - jaddnum(retjson,"timestamp",qp->timestamp); - if ( bits256_nonz(qp->txid) != 0 ) - { - jaddbits256(retjson,"txid",qp->txid); - jaddnum(retjson,"vout",qp->vout); - } - if ( bits256_nonz(qp->srchash) != 0 ) - jaddbits256(retjson,"srchash",qp->srchash); - if ( qp->txfee != 0 ) - jadd64bits(retjson,"txfee",qp->txfee); - if ( qp->quotetime != 0 ) - jaddnum(retjson,"quotetime",qp->quotetime); - if ( qp->satoshis != 0 ) - { - jadd64bits(retjson,"satoshis",qp->satoshis); - price = (double)(qp->destsatoshis+qp->desttxfee) / qp->satoshis; - jaddnum(retjson,"price",price); - } - if ( bits256_nonz(qp->desthash) != 0 ) - jaddbits256(retjson,"desthash",qp->desthash); - if ( bits256_nonz(qp->txid2) != 0 ) - { - jaddbits256(retjson,"txid2",qp->txid2); - jaddnum(retjson,"vout2",qp->vout2); - if ( qp->satoshis2 != 0 ) - jadd64bits(retjson,"satoshis2",qp->satoshis2); - } - if ( bits256_nonz(qp->desttxid) != 0 ) - { - if ( qp->destaddr[0] != 0 ) - jaddstr(retjson,"destaddr",qp->destaddr); - jaddbits256(retjson,"desttxid",qp->desttxid); - jaddnum(retjson,"destvout",qp->destvout); - } - if ( bits256_nonz(qp->feetxid) != 0 ) - { - jaddbits256(retjson,"feetxid",qp->feetxid); - jaddnum(retjson,"feevout",qp->feevout); - } - if ( qp->destsatoshis != 0 ) - jadd64bits(retjson,"destsatoshis",qp->destsatoshis); - if ( qp->desttxfee != 0 ) - jadd64bits(retjson,"desttxfee",qp->desttxfee); - if ( qp->change != 0 ) - jaddnum(retjson,"change",dstr(qp->change)); - return(retjson); -} - -int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) -{ - safecopy(qp->srccoin,jstr(argjson,"base"),sizeof(qp->srccoin)); - 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->timestamp = juint(argjson,"timestamp"); - qp->quotetime = juint(argjson,"quotetime"); - qp->txid = jbits256(argjson,"txid"); - qp->txid2 = jbits256(argjson,"txid2"); - qp->vout = jint(argjson,"vout"); - qp->vout2 = jint(argjson,"vout2"); - qp->feevout = jint(argjson,"feevout"); - qp->srchash = jbits256(argjson,"srchash"); - qp->desttxid = jbits256(argjson,"desttxid"); - qp->feetxid = jbits256(argjson,"feetxid"); - qp->destvout = jint(argjson,"destvout"); - qp->desthash = jbits256(argjson,"desthash"); - if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) - qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); - if ( (qp->destsatoshis= j64bits(argjson,"destsatoshis")) == 0 ) - qp->destsatoshis = qp->satoshis * jdouble(argjson,"price"); - qp->change = SATOSHIDEN * jdouble(argjson,"change"); - qp->txfee = j64bits(argjson,"txfee"); - qp->desttxfee = j64bits(argjson,"desttxfee"); - return(0); -} - -int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char *destcoin,double price) -{ - memset(qp,0,sizeof(*qp)); - qp->timestamp = (uint32_t)time(NULL); - safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); - if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) - qp->txfee = 10000; - if ( qp->txfee >= utxo->satoshis || qp->txfee >= utxo->satoshis2 ) - return(-1); - qp->txid = utxo->txid; - qp->vout = utxo->vout; - qp->txid2 = utxo->txid2; - qp->vout2 = utxo->vout2; - qp->satoshis2 = utxo->satoshis2 - qp->txfee; - qp->satoshis = utxo->satoshis - qp->txfee; - qp->destsatoshis = qp->satoshis * price; - if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) - qp->desttxfee = 10000; - if ( qp->desttxfee >= qp->destsatoshis ) - return(-2); - qp->destsatoshis -= qp->desttxfee; - safecopy(qp->srccoin,utxo->coin,sizeof(qp->srccoin)); - safecopy(qp->coinaddr,utxo->coinaddr,sizeof(qp->coinaddr)); - qp->srchash = LP_pubkey(LP_privkey(utxo->coinaddr)); - return(0); -} - -int32_t LP_quoteinfoset(struct LP_quoteinfo *qp,uint32_t timestamp,uint32_t quotetime,uint64_t value,uint64_t txfee,uint64_t destsatoshis,uint64_t desttxfee,bits256 desttxid,int32_t destvout,bits256 desthash,char *destaddr) -{ - if ( txfee != qp->txfee ) - { - if ( txfee >= value ) - return(-1); - qp->txfee = txfee; - qp->satoshis = value - txfee; - } - qp->timestamp = timestamp; - qp->quotetime = quotetime; - qp->destsatoshis = destsatoshis; - qp->desttxfee = desttxfee; - qp->desttxid = desttxid; - qp->destvout = destvout; - qp->desthash = desthash; - safecopy(qp->destaddr,destaddr,sizeof(qp->destaddr)); - return(0); -} - -char *LP_quotereceived(cJSON *argjson) -{ - struct LP_cacheinfo *ptr; double price; struct LP_quoteinfo Q; - LP_quoteparse(&Q,argjson); - price = (double)(Q.destsatoshis + Q.desttxfee) / (Q.satoshis + Q.txfee); - if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) - { - ptr->Q = Q; - return(clonestr("{\"result\":\"updated\"}")); - } else return(clonestr("{\"error\":\"nullptr\"}")); -} - double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub) { cJSON *reqjson; struct LP_peerinfo *peer; int32_t i,flag = 0,pushsock = -1; double price = 0.; @@ -219,164 +57,6 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port, return(price); } -int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) -{ - if ( mysatoshis >= othersatoshis ) - return(0); - else return(-1); -} - -cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) -{ - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n; double price; - if ( (price= LP_price(base,myutxo->coin)) == .0 ) - { - printf("no LP_price (%s -> %s)\n",base,myutxo->coin); - return(0); - } - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) - { - //printf("%s:%u %s\n",peer->ipaddr,peer->port,utxostr); - if ( (array= cJSON_Parse(utxostr)) != 0 ) - { - if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) - { - retarray = cJSON_CreateArray(); - for (i=0; icoin) / 0.975; - if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) - { - //printf("candidates.(%s)\n",jprint(array,0)); - if ( (n= cJSON_GetArraySize(array)) > 0 ) - { - memset(prices,0,sizeof(prices)); - memset(Q,0,sizeof(Q)); - for (i=0; icoin,zero); - Q[i].destsatoshis = price * Q[i].satoshis; - } - if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) - bestprice = price; - //char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); - } - if ( bestprice != 0. ) - { - bestmetric = 0.; - besti = -1; - for (i=0; isatoshis > Q[i].destsatoshis ) - { - metric = price / bestprice; - printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); - if ( metric < 1.1 ) - { - metric = dstr(Q[i].destsatoshis) * metric * metric * metric; - printf("%f\n",metric); - if ( bestmetric == 0. || metric < bestmetric ) - { - besti = i; - bestmetric = metric; - } - } - } else printf("(%f %f) ",dstr(myutxo->satoshis),dstr(Q[i].destsatoshis)); - } - printf("metrics, best %f\n",bestmetric); - if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) - { - i = besti; - bestprice = prices[i]; - item = jitem(array,i); - bestitem = LP_quotejson(&Q[i]); - printf("bestprice %f vs maxprice %f\n",bestprice,maxprice); - if ( maxprice == 0. || bestprice <= maxprice ) - { - Q[i].desttxid = myutxo->txid; - Q[i].destvout = myutxo->vout; - Q[i].feetxid = myutxo->txid2; - Q[i].feevout = myutxo->vout2; - strcpy(Q[i].destaddr,myutxo->coinaddr); - price = LP_query("request",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); - if ( jobj(bestitem,"price") != 0 ) - jdelete(bestitem,"price"); - jaddnum(bestitem,"price",prices[i]); - if ( price <= maxprice ) - { - Q[i].desttxid = myutxo->txid; - Q[i].destvout = myutxo->vout; - Q[i].feetxid = myutxo->txid2; - Q[i].feevout = myutxo->vout2; - strcpy(Q[i].destaddr,myutxo->coinaddr); - price = LP_query("connect",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); - LP_requestinit(&R,Q[i].srchash,Q[i].desthash,base,Q[i].satoshis,Q[i].destcoin,Q[i].destsatoshis,Q[i].timestamp,Q[i].quotetime,DEXselector); - jaddstr(bestitem,"status","connected"); - jaddnum(bestitem,"requestid",R.requestid); - jaddnum(bestitem,"quoteid",R.quoteid); - printf("Alice r.%u q.%u\n",R.requestid,R.quoteid); - } else jaddstr(bestitem,"status","too expensive"); - } - } - } - free_json(array); - } - } - if ( bestitem == 0 ) - return(cJSON_Parse("{\"error\":\"no match found\"}")); - return(bestitem); -} - -int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) -{ - double price; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; - if ( (now= (uint32_t)time(NULL)) > utxo->swappending ) - utxo->swappending = 0; - if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_price(utxo->coin,rel)) != 0. ) - { - //price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - Q.timestamp = (uint32_t)time(NULL); - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","quote"); - retstr = jprint(retjson,1); - LP_send(pubsock,retstr,1); - utxo->published = now; - return(0); - } - return(-1); -} - int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { char *method,*base,*rel,*retstr,pairstr[512]; cJSON *retjson; double price; bits256 privkey,txid; struct LP_utxoinfo *utxo; int32_t retval = -1,DEXselector = 0; uint64_t destvalue; struct basilisk_request R; struct LP_quoteinfo Q; @@ -523,8 +203,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port USERPASS_COUNTER = 1; retjson = cJSON_CreateObject(); jaddstr(retjson,"userpass",USERPASS); - jaddstr(retjson,"BTC",BTCADDR); - jaddstr(retjson,"KMD",KMDADDR); + jadd(retjson,"coins",LP_coinsjson()); return(jprint(retjson,1)); } if ( (userpass= jstr(argjson,"userpass")) == 0 || strcmp(userpass,USERPASS) != 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index f7b123941..1ffa32cb7 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -139,7 +139,7 @@ struct iguana_info uint64_t txfee; double estimatedrate; int32_t longestchain; uint8_t pubtype,p2shtype,isPoS,wiftype; - char symbol[16],changeaddr[64],userpass[1024],serverport[128]; + char symbol[16],smartaddr[64],userpass[1024],serverport[128]; }; struct basilisk_swap @@ -200,5 +200,6 @@ uint32_t basilisk_quoteid(struct basilisk_request *rp); struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 privkey,struct basilisk_request *rp,struct LP_quoteinfo *qp); char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params); uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend); +double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub); #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6cb4673fb..ab7251b68 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -28,7 +28,7 @@ struct LP_peerinfo *LP_peerinfos,*LP_mypeer; char *activecoins[] = { "BTC", "KMD", "REVS", "JUMBLR" };//"LTC", "USD", }; char GLOBAL_DBDIR[] = { "DB" }; -char USERPASS[65],USERPASS_WIFSTR[64],BTCADDR[64],KMDADDR[64],USERHOME[512] = { "/root" }; +char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", @@ -74,6 +74,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_swap.c" #include "LP_peers.c" #include "LP_utxos.c" +#include "LP_quotes.c" #include "LP_commands.c" void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 319c91ed8..999ed3c2b 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -130,13 +130,20 @@ void LP_priceinfoupdate(char *base,char *rel,double price) double LP_myprice(double *bidp,double *askp,char *base,char *rel) { - struct LP_priceinfo *basepp,*relpp; + struct LP_priceinfo *basepp,*relpp; double val; + *bidp = *askp = 0.; if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { - *askp = basepp->myprices[relpp->ind]; - *bidp = relpp->myprices[basepp->ind]; - return((*askp + *bidp) * 0.5); - } else return(0.); + if ( (*askp= basepp->myprices[relpp->ind]) != 0. ) + { + if ( (val= relpp->myprices[basepp->ind]) != 0. ) + { + *bidp = 1. / val; + return((*askp + *bidp) * 0.5); + } + } + } + return(0.); } int32_t LP_mypriceset(char *base,char *rel,double price) @@ -217,16 +224,6 @@ struct LP_priceinfo *LP_priceinfoadd(char *symbol) safecopy(pp->symbol,symbol,sizeof(pp->symbol)); pp->coinbits = stringbits(symbol); pp->ind = LP_numpriceinfos++; - /*pp->relvals = calloc(LP_numpriceinfos+1,sizeof(*pp->relvals)); - //pp->myprices = calloc(LP_numpriceinfos+1,sizeof(*pp->myprices)); - vecsize = sizeof(*LP_priceinfos[i].relvals) * (LP_numpriceinfos + 1); - for (i=0; isrchash = srchash; + rp->srcamount = srcsatoshis; + rp->timestamp = timestamp; + rp->DEXselector = DEXselector; + safecopy(rp->src,src,sizeof(rp->src)); + safecopy(rp->dest,dest,sizeof(rp->dest)); + R = *rp; + rp->requestid = basilisk_requestid(rp); + rp->quotetime = quotetime; + rp->desthash = desthash; + rp->destamount = destsatoshis; + rp->quoteid = basilisk_quoteid(rp); + return(rp); +} + +cJSON *LP_quotejson(struct LP_quoteinfo *qp) +{ + double price; cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"base",qp->srccoin); + jaddstr(retjson,"rel",qp->destcoin); + if ( qp->coinaddr[0] != 0 ) + jaddstr(retjson,"address",qp->coinaddr); + if ( qp->timestamp != 0 ) + jaddnum(retjson,"timestamp",qp->timestamp); + if ( bits256_nonz(qp->txid) != 0 ) + { + jaddbits256(retjson,"txid",qp->txid); + jaddnum(retjson,"vout",qp->vout); + } + if ( bits256_nonz(qp->srchash) != 0 ) + jaddbits256(retjson,"srchash",qp->srchash); + if ( qp->txfee != 0 ) + jadd64bits(retjson,"txfee",qp->txfee); + if ( qp->quotetime != 0 ) + jaddnum(retjson,"quotetime",qp->quotetime); + if ( qp->satoshis != 0 ) + { + jadd64bits(retjson,"satoshis",qp->satoshis); + price = (double)(qp->destsatoshis+qp->desttxfee) / qp->satoshis; + jaddnum(retjson,"price",price); + } + if ( bits256_nonz(qp->desthash) != 0 ) + jaddbits256(retjson,"desthash",qp->desthash); + if ( bits256_nonz(qp->txid2) != 0 ) + { + jaddbits256(retjson,"txid2",qp->txid2); + jaddnum(retjson,"vout2",qp->vout2); + if ( qp->satoshis2 != 0 ) + jadd64bits(retjson,"satoshis2",qp->satoshis2); + } + if ( bits256_nonz(qp->desttxid) != 0 ) + { + if ( qp->destaddr[0] != 0 ) + jaddstr(retjson,"destaddr",qp->destaddr); + jaddbits256(retjson,"desttxid",qp->desttxid); + jaddnum(retjson,"destvout",qp->destvout); + } + if ( bits256_nonz(qp->feetxid) != 0 ) + { + jaddbits256(retjson,"feetxid",qp->feetxid); + jaddnum(retjson,"feevout",qp->feevout); + } + if ( qp->destsatoshis != 0 ) + jadd64bits(retjson,"destsatoshis",qp->destsatoshis); + if ( qp->desttxfee != 0 ) + jadd64bits(retjson,"desttxfee",qp->desttxfee); + if ( qp->change != 0 ) + jaddnum(retjson,"change",dstr(qp->change)); + return(retjson); +} + +int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) +{ + safecopy(qp->srccoin,jstr(argjson,"base"),sizeof(qp->srccoin)); + 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->timestamp = juint(argjson,"timestamp"); + qp->quotetime = juint(argjson,"quotetime"); + qp->txid = jbits256(argjson,"txid"); + qp->txid2 = jbits256(argjson,"txid2"); + qp->vout = jint(argjson,"vout"); + qp->vout2 = jint(argjson,"vout2"); + qp->feevout = jint(argjson,"feevout"); + qp->srchash = jbits256(argjson,"srchash"); + qp->desttxid = jbits256(argjson,"desttxid"); + qp->feetxid = jbits256(argjson,"feetxid"); + qp->destvout = jint(argjson,"destvout"); + qp->desthash = jbits256(argjson,"desthash"); + if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) + qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); + if ( (qp->destsatoshis= j64bits(argjson,"destsatoshis")) == 0 ) + qp->destsatoshis = qp->satoshis * jdouble(argjson,"price"); + qp->change = SATOSHIDEN * jdouble(argjson,"change"); + qp->txfee = j64bits(argjson,"txfee"); + qp->desttxfee = j64bits(argjson,"desttxfee"); + return(0); +} + +int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char *destcoin,double price) +{ + memset(qp,0,sizeof(*qp)); + qp->timestamp = (uint32_t)time(NULL); + safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); + if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) + qp->txfee = 10000; + if ( qp->txfee >= utxo->satoshis || qp->txfee >= utxo->satoshis2 ) + return(-1); + qp->txid = utxo->txid; + qp->vout = utxo->vout; + qp->txid2 = utxo->txid2; + qp->vout2 = utxo->vout2; + qp->satoshis2 = utxo->satoshis2 - qp->txfee; + qp->satoshis = utxo->satoshis - qp->txfee; + qp->destsatoshis = qp->satoshis * price; + if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) + qp->desttxfee = 10000; + if ( qp->desttxfee >= qp->destsatoshis ) + return(-2); + qp->destsatoshis -= qp->desttxfee; + safecopy(qp->srccoin,utxo->coin,sizeof(qp->srccoin)); + safecopy(qp->coinaddr,utxo->coinaddr,sizeof(qp->coinaddr)); + qp->srchash = LP_pubkey(LP_privkey(utxo->coinaddr)); + return(0); +} + +int32_t LP_quoteinfoset(struct LP_quoteinfo *qp,uint32_t timestamp,uint32_t quotetime,uint64_t value,uint64_t txfee,uint64_t destsatoshis,uint64_t desttxfee,bits256 desttxid,int32_t destvout,bits256 desthash,char *destaddr) +{ + if ( txfee != qp->txfee ) + { + if ( txfee >= value ) + return(-1); + qp->txfee = txfee; + qp->satoshis = value - txfee; + } + qp->timestamp = timestamp; + qp->quotetime = quotetime; + qp->destsatoshis = destsatoshis; + qp->desttxfee = desttxfee; + qp->desttxid = desttxid; + qp->destvout = destvout; + qp->desthash = desthash; + safecopy(qp->destaddr,destaddr,sizeof(qp->destaddr)); + return(0); +} + +char *LP_quotereceived(cJSON *argjson) +{ + struct LP_cacheinfo *ptr; double price; struct LP_quoteinfo Q; + LP_quoteparse(&Q,argjson); + price = (double)(Q.destsatoshis + Q.desttxfee) / (Q.satoshis + Q.txfee); + if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) + { + ptr->Q = Q; + return(clonestr("{\"result\":\"updated\"}")); + } else return(clonestr("{\"error\":\"nullptr\"}")); +} + + +int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) +{ + if ( mysatoshis >= othersatoshis ) + return(0); + else return(-1); +} + +cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) +{ + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n; double price; + if ( (price= LP_price(base,myutxo->coin)) == .0 ) + { + printf("no LP_price (%s -> %s)\n",base,myutxo->coin); + return(0); + } + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) + { + //printf("%s:%u %s\n",peer->ipaddr,peer->port,utxostr); + if ( (array= cJSON_Parse(utxostr)) != 0 ) + { + if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) + { + retarray = cJSON_CreateArray(); + for (i=0; icoin) / 0.975; + if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) + { + //printf("candidates.(%s)\n",jprint(array,0)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + memset(prices,0,sizeof(prices)); + memset(Q,0,sizeof(Q)); + for (i=0; icoin,zero); + Q[i].destsatoshis = price * Q[i].satoshis; + } + if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) + bestprice = price; + //char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); + } + if ( bestprice != 0. ) + { + bestmetric = 0.; + besti = -1; + for (i=0; isatoshis > Q[i].destsatoshis ) + { + metric = price / bestprice; + printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); + if ( metric < 1.1 ) + { + metric = dstr(Q[i].destsatoshis) * metric * metric * metric; + printf("%f\n",metric); + if ( bestmetric == 0. || metric < bestmetric ) + { + besti = i; + bestmetric = metric; + } + } + } else printf("(%f %f) ",dstr(myutxo->satoshis),dstr(Q[i].destsatoshis)); + } + printf("metrics, best %f\n",bestmetric); + if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) + { + i = besti; + bestprice = prices[i]; + item = jitem(array,i); + bestitem = LP_quotejson(&Q[i]); + printf("bestprice %f vs maxprice %f\n",bestprice,maxprice); + if ( maxprice == 0. || bestprice <= maxprice ) + { + Q[i].desttxid = myutxo->txid; + Q[i].destvout = myutxo->vout; + Q[i].feetxid = myutxo->txid2; + Q[i].feevout = myutxo->vout2; + strcpy(Q[i].destaddr,myutxo->coinaddr); + price = LP_query("request",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); + if ( jobj(bestitem,"price") != 0 ) + jdelete(bestitem,"price"); + jaddnum(bestitem,"price",prices[i]); + if ( price <= maxprice ) + { + Q[i].desttxid = myutxo->txid; + Q[i].destvout = myutxo->vout; + Q[i].feetxid = myutxo->txid2; + Q[i].feevout = myutxo->vout2; + strcpy(Q[i].destaddr,myutxo->coinaddr); + price = LP_query("connect",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); + LP_requestinit(&R,Q[i].srchash,Q[i].desthash,base,Q[i].satoshis,Q[i].destcoin,Q[i].destsatoshis,Q[i].timestamp,Q[i].quotetime,DEXselector); + jaddstr(bestitem,"status","connected"); + jaddnum(bestitem,"requestid",R.requestid); + jaddnum(bestitem,"quoteid",R.quoteid); + printf("Alice r.%u q.%u\n",R.requestid,R.quoteid); + } else jaddstr(bestitem,"status","too expensive"); + } + } + } + free_json(array); + } + } + if ( bestitem == 0 ) + return(cJSON_Parse("{\"error\":\"no match found\"}")); + return(bestitem); +} + +int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) +{ + double price; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; + if ( (now= (uint32_t)time(NULL)) > utxo->swappending ) + utxo->swappending = 0; + if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_price(utxo->coin,rel)) != 0. ) + { + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + Q.timestamp = (uint32_t)time(NULL); + retjson = LP_quotejson(&Q); + jaddstr(retjson,"method","quote"); + retstr = jprint(retjson,1); + LP_send(pubsock,retstr,1); + utxo->published = now; + return(0); + } + return(-1); +} + + + + diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 96096072d..df6cfd6f2 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -168,7 +168,7 @@ double LP_getestimatedrate(char *symbol) { if ( retstr[0] != '-' ) { - rate = atof(retstr) / 1024.; + coin->estimatedrate = rate = atof(retstr) / 1024.; printf("estimated rate.(%s) %s -> %.8f\n",symbol,retstr,rate); } free(retstr); diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index dc0240c1b..ed4fe4fc8 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -404,18 +404,12 @@ cJSON *LP_createvins(struct basilisk_rawtx *dest,struct vin_info *V,struct basil int32_t _basilisk_rawtx_gen(char *str,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay,bits256 privkey) { char scriptstr[1024],wifstr[256],coinaddr[64],*signedtx,*rawtxbytes; uint32_t basilisktag; int32_t retval = -1; cJSON *vins,*privkeys,*addresses,*valsobj; struct vin_info *V; - //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); - if ( rawtx->coin->changeaddr[0] == 0 ) - { - bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->pubtype,pubkey33,33); - printf("set change address.(%s)\n",rawtx->coin->changeaddr); - } init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); jaddstr(valsobj,"coin",rawtx->coin->symbol); jaddstr(valsobj,"spendscript",scriptstr); - jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); + jaddstr(valsobj,"changeaddr",rawtx->coin->smartaddr); jadd64bits(valsobj,"satoshis",rawtx->I.amount); if ( strcmp(rawtx->coin->symbol,"BTC") == 0 && txfee > 0 && txfee < 50000 ) txfee = 50000; @@ -990,7 +984,6 @@ cJSON *basilisk_privkeyarray(struct iguana_info *coin,cJSON *vins) { cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],typestr[64],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; double bidasks[2]; privkeyarray = cJSON_CreateArray(); - //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); if ( (n= cJSON_GetArraySize(vins)) > 0 ) { for (i=0; inumutxos = n; - if ( destpeer->numutxos < n ) - { - //destpeer->numutxos = n; - //printf("got.(%s) from %s numutxos.%d\n",retstr,destpeer->ipaddr,destpeer->numutxos); - } } } free_json(array); @@ -273,7 +268,7 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t amclient) { static uint32_t counter; - char coinaddr[64],*script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); + char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); if ( coin == 0 ) { printf("cant add privkey for %s, coin not active\n",symbol); @@ -282,11 +277,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else privkey = iguana_wif2privkey(wifstr); - iguana_priv2pub(pubkey33,coinaddr,privkey,coin->pubtype); - if ( strcmp("BTC",symbol) == 0 ) - strcpy(BTCADDR,coinaddr); - else if ( strcmp("KMD",symbol) == 0 ) - strcpy(KMDADDR,coinaddr); + iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); if ( counter == 0 ) { char tmpstr[128]; @@ -296,13 +287,13 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb conv_NXTpassword(userpass.bytes,pubkey.bytes,(uint8_t *)tmpstr,(int32_t)strlen(tmpstr)); userpub = curve25519(userpass,curve25519_basepoint9()); printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); - printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coinaddr,coin->pubtype,tmpstr,passphrase); - if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coinaddr,-1)) != 0 ) + printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); + if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); } - bitcoin_addr2rmd160(&tmptype,rmd160,coinaddr); + bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - if ( (array= LP_listunspent(symbol,coinaddr)) != 0 ) + if ( (array= LP_listunspent(symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { @@ -341,12 +332,12 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb values[i] = 0, used++; if ( amclient == 0 ) { - if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coinaddr,LP_peerinfos[0].ipaddr,LP_peerinfos[0].port,LP_peerinfos[0].profitmargin)) != 0 ) + if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,LP_peerinfos[0].ipaddr,LP_peerinfos[0].port,LP_peerinfos[0].profitmargin)) != 0 ) utxo->mypub = curve25519(privkey,curve25519_basepoint9()); } else { - if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coinaddr,"127.0.0.1",0,0)) != 0 ) + if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,"127.0.0.1",0,0)) != 0 ) utxo->mypub = curve25519(privkey,curve25519_basepoint9()); } total += value; From c45d388cf5aec8b0079449c45d1aa7e6704db5d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 11:00:31 +0300 Subject: [PATCH 040/910] Test --- iguana/exchanges/LP_utxos.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index ffa440388..c7b8371bd 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -84,7 +84,7 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t satoshis,bits256 deposittxid,int32_t depositvout,int64_t depositsatoshis,char *spendscript,char *coinaddr,char *ipaddr,uint16_t port,double profitmargin) { - struct LP_utxoinfo *utxo = 0; + uint64_t tmpsatoshis; struct LP_utxoinfo *utxo = 0; if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(deposittxid) == 0 || vout < 0 || depositvout < 0 || satoshis <= 0 || depositsatoshis <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(deposittxid) == 0,vout < 0,depositvout < 0,satoshis <= 0,depositsatoshis <= 0); @@ -95,9 +95,12 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } + if ( IAMCLIENT == 0 || depositsatoshis < 9 * (satoshis >> 3) ) + tmpsatoshis = (depositsatoshis / 9) << 3; + else tmpsatoshis = satoshis; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { - if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(deposittxid,utxo->txid2) != 0 || vout != utxo->vout || satoshis != utxo->satoshis || depositvout != utxo->vout2 || depositsatoshis != utxo->satoshis2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) + if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(deposittxid,utxo->txid2) != 0 || vout != utxo->vout || tmpsatoshis != utxo->satoshis || depositvout != utxo->vout2 || depositsatoshis != utxo->satoshis2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) { utxo->errors++; char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->txid),bits256_cmp(txid,utxo->txid) != 0,bits256_cmp(deposittxid,utxo->txid2) != 0,vout != utxo->vout,satoshis != utxo->satoshis,depositvout != utxo->vout2,depositsatoshis != utxo->satoshis2,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,strcmp(ipaddr,utxo->ipaddr) != 0,port != utxo->port); @@ -118,10 +121,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 utxo->txid = txid; utxo->vout = vout; utxo->value = dstr(satoshis); - if ( IAMCLIENT != 0 ) - utxo->satoshis = satoshis; - else if ( depositsatoshis < 9 * (satoshis >> 3) ) - utxo->satoshis = (depositsatoshis / 9) << 3; + utxo->satoshis = tmpsatoshis; utxo->txid2 = deposittxid; utxo->vout2 = depositvout; utxo->satoshis2 = depositsatoshis; From e8611fd173bd32c40cf0633dffbc9571942661b5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 11:02:18 +0300 Subject: [PATCH 041/910] Test --- iguana/exchanges/LP_prices.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 999ed3c2b..f575ac0ec 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -123,8 +123,10 @@ void LP_priceinfoupdate(char *base,char *rel,double price) struct LP_priceinfo *basepp,*relpp; if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { - dxblend(&basepp->relvals[relpp->ind],price,0.9); - dxblend(&relpp->relvals[basepp->ind],1. / price,0.9); + //dxblend(&basepp->relvals[relpp->ind],price,0.9); + //dxblend(&relpp->relvals[basepp->ind],1. / price,0.9); + basepp->relvals[relpp->ind] = price; + relpp->relvals[basepp->ind] = 1. / price; } } @@ -139,6 +141,7 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) if ( (val= relpp->myprices[basepp->ind]) != 0. ) { *bidp = 1. / val; + printf("myprice (%.8f %.8f)\n",*bidp,*askp); return((*askp + *bidp) * 0.5); } } From 8ee5ed4b8db6fdf108b9ccfab8a9f6ac6924b694 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 11:14:53 +0300 Subject: [PATCH 042/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index ad8617d15..662017062 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -321,10 +321,10 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) { - double price; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; + double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; if ( (now= (uint32_t)time(NULL)) > utxo->swappending ) utxo->swappending = 0; - if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_price(utxo->coin,rel)) != 0. ) + if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) { if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); From fe5b65e269468d5f6ae7c66ac88387655ad3a2b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 12:23:19 +0300 Subject: [PATCH 043/910] Test --- iguana/exchanges/LP_commands.c | 3 +-- iguana/exchanges/LP_include.h | 5 ++--- iguana/exchanges/LP_quotes.c | 37 ++++++++++++++++++---------------- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 32 ++++++++++++++--------------- 5 files changed, 40 insertions(+), 39 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 68dce8188..bae8bfd7d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -118,7 +118,6 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin utxo->mypub = LP_pubkey(privkey); if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { - Q.change = destvalue - (Q.destsatoshis+Q.desttxfee); nanomsg_tcpname(pairstr,mypeer->ipaddr,10000+(rand() % 10000)); if ( (utxo->pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) printf("error creating utxo->pair\n"); @@ -294,7 +293,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"notifyutxo") == 0 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),SATOSHIDEN * jdouble(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),SATOSHIDEN * jdouble(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 1ffa32cb7..bccb9e1bf 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -164,8 +164,7 @@ struct LP_utxoinfo UT_hash_handle hh; bits256 txid,txid2,feetxid,otherpubkey,mypub; void *swap; - double value; - uint64_t satoshis,satoshis2; + uint64_t value,satoshis,value2; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; int32_t vout,vout2,pair; uint32_t lasttime,errors,swappending,published; @@ -189,7 +188,7 @@ struct LP_quoteinfo { struct basilisk_request R; bits256 srchash,desthash,txid,txid2,desttxid,feetxid,privkey; - uint64_t satoshis,satoshis2,txfee,destsatoshis,desttxfee,change; + uint64_t value,satoshis,satoshis2,txfee,destsatoshis,desttxfee; uint32_t timestamp,quotetime; int32_t vout,vout2,destvout,feevout,pair; char srccoin[16],coinaddr[64],destcoin[16],destaddr[64]; }; diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 662017062..e406d44d7 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -59,11 +59,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) if ( qp->quotetime != 0 ) jaddnum(retjson,"quotetime",qp->quotetime); if ( qp->satoshis != 0 ) - { jadd64bits(retjson,"satoshis",qp->satoshis); - price = (double)(qp->destsatoshis+qp->desttxfee) / qp->satoshis; - jaddnum(retjson,"price",price); - } if ( bits256_nonz(qp->desthash) != 0 ) jaddbits256(retjson,"desthash",qp->desthash); if ( bits256_nonz(qp->txid2) != 0 ) @@ -84,13 +80,19 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) { jaddbits256(retjson,"feetxid",qp->feetxid); jaddnum(retjson,"feevout",qp->feevout); + //jadd64bits(retjson,"feesatoshis",qp->feesatoshis); } - if ( qp->destsatoshis != 0 ) - jadd64bits(retjson,"destsatoshis",qp->destsatoshis); if ( qp->desttxfee != 0 ) jadd64bits(retjson,"desttxfee",qp->desttxfee); - if ( qp->change != 0 ) - jaddnum(retjson,"change",dstr(qp->change)); + if ( qp->destsatoshis != 0 ) + { + jadd64bits(retjson,"destsatoshis",qp->destsatoshis); + if ( qp->satoshis != 0 ) + { + price = (double)(qp->destsatoshis + qp->desttxfee) / qp->satoshis; + jaddnum(retjson,"price",price); + } + } return(retjson); } @@ -112,11 +114,11 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->feetxid = jbits256(argjson,"feetxid"); qp->destvout = jint(argjson,"destvout"); qp->desthash = jbits256(argjson,"desthash"); - if ( (qp->satoshis= j64bits(argjson,"satoshis")) == 0 ) - qp->satoshis = SATOSHIDEN * jdouble(argjson,"value"); - if ( (qp->destsatoshis= j64bits(argjson,"destsatoshis")) == 0 ) - qp->destsatoshis = qp->satoshis * jdouble(argjson,"price"); - qp->change = SATOSHIDEN * jdouble(argjson,"change"); + //qp->feesatoshis = j64bits(argjson,"feesatoshis"); + qp->satoshis = j64bits(argjson,"satoshis"); + qp->satoshis2 = j64bits(argjson,"satoshis2"); + qp->value = j64bits(argjson,"value"); + qp->destsatoshis = j64bits(argjson,"destsatoshis"); qp->txfee = j64bits(argjson,"txfee"); qp->desttxfee = j64bits(argjson,"desttxfee"); return(0); @@ -129,15 +131,16 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; - if ( qp->txfee >= utxo->satoshis || qp->txfee >= utxo->satoshis2 ) + if ( qp->txfee >= utxo->value || qp->txfee >= utxo->value2 || utxo->value2 < utxo->satoshis+(utxo->satoshis>>3) ) return(-1); qp->txid = utxo->txid; qp->vout = utxo->vout; qp->txid2 = utxo->txid2; qp->vout2 = utxo->vout2; - qp->satoshis2 = utxo->satoshis2 - qp->txfee; - qp->satoshis = utxo->satoshis - qp->txfee; + qp->satoshis = utxo->satoshis; + qp->satoshis2 = utxo->satoshis + (utxo->satoshis >> 3); qp->destsatoshis = qp->satoshis * price; + //qp->feesatoshis = qp->destsatoshis / INSTANTDEX_INSURANCEDIV; if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) qp->desttxfee = 10000; if ( qp->desttxfee >= qp->destsatoshis ) @@ -161,6 +164,7 @@ int32_t LP_quoteinfoset(struct LP_quoteinfo *qp,uint32_t timestamp,uint32_t quot qp->timestamp = timestamp; qp->quotetime = quotetime; qp->destsatoshis = destsatoshis; + //qp->feesatoshis = qp->destsatoshis / INSTANTDEX_INSURANCEDIV; qp->desttxfee = desttxfee; qp->desttxid = desttxid; qp->destvout = destvout; @@ -181,7 +185,6 @@ char *LP_quotereceived(cJSON *argjson) } else return(clonestr("{\"error\":\"nullptr\"}")); } - int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) { if ( mysatoshis >= othersatoshis ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index df6cfd6f2..6010a78f6 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%.8f&txid2=%s&vout2=%d&value2=%.8f&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->satoshis),bits256_str(str2,utxo->txid2),utxo->vout2,dstr(utxo->satoshis2),utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%.8f&txid2=%s&vout2=%d&value2=%.8f&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value),bits256_str(str2,utxo->txid2),utxo->vout2,dstr(utxo->value2),utxo->spendscript,utxo->coinaddr); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index c7b8371bd..0070a639f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -35,11 +35,11 @@ cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) jaddstr(item,"address",utxo->coinaddr); jaddbits256(item,"txid",utxo->txid); jaddnum(item,"vout",utxo->vout); - jaddnum(item,"value",utxo->value); + jadd64bits(item,"value",utxo->value); jadd64bits(item,"satoshis",utxo->satoshis); jaddbits256(item,"txid2",utxo->txid2); jaddnum(item,"vout2",utxo->vout2); - jaddnum(item,"value2",dstr(utxo->satoshis2)); + jadd64bits(item,"value2",utxo->value2); if ( utxo->swappending != 0 ) jaddnum(item,"pending",utxo->swappending); if ( bits256_nonz(utxo->otherpubkey) != 0 ) @@ -82,12 +82,12 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) return(jprint(utxosjson,1)); } -struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t satoshis,bits256 deposittxid,int32_t depositvout,int64_t depositsatoshis,char *spendscript,char *coinaddr,char *ipaddr,uint16_t port,double profitmargin) +struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,char *ipaddr,uint16_t port,double profitmargin) { uint64_t tmpsatoshis; struct LP_utxoinfo *utxo = 0; - if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(deposittxid) == 0 || vout < 0 || depositvout < 0 || satoshis <= 0 || depositsatoshis <= 0 ) + if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { - printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(deposittxid) == 0,vout < 0,depositvout < 0,satoshis <= 0,depositsatoshis <= 0); + printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } if ( IAMCLIENT == 0 && strcmp(ipaddr,"127.0.0.1") == 0 ) @@ -95,15 +95,15 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( IAMCLIENT == 0 || depositsatoshis < 9 * (satoshis >> 3) ) - tmpsatoshis = (depositsatoshis / 9) << 3; - else tmpsatoshis = satoshis; + if ( IAMCLIENT == 0 || value2 < 9 * (value >> 3) ) + tmpsatoshis = (value2 / 9) << 3; + else tmpsatoshis = value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { - if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(deposittxid,utxo->txid2) != 0 || vout != utxo->vout || tmpsatoshis != utxo->satoshis || depositvout != utxo->vout2 || depositsatoshis != utxo->satoshis2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) + if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) { utxo->errors++; - char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->txid),bits256_cmp(txid,utxo->txid) != 0,bits256_cmp(deposittxid,utxo->txid2) != 0,vout != utxo->vout,satoshis != utxo->satoshis,depositvout != utxo->vout2,depositsatoshis != utxo->satoshis2,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,strcmp(ipaddr,utxo->ipaddr) != 0,port != utxo->port); + char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->txid),bits256_cmp(txid,utxo->txid) != 0,bits256_cmp(txid2,utxo->txid2) != 0,vout != utxo->vout,tmpsatoshis != utxo->satoshis,vout2 != utxo->vout2,value2 != utxo->value2,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,strcmp(ipaddr,utxo->ipaddr) != 0,port != utxo->port,value != utxo->value); } else if ( profitmargin != 0. ) utxo->profitmargin = profitmargin; @@ -120,11 +120,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); utxo->txid = txid; utxo->vout = vout; - utxo->value = dstr(satoshis); + utxo->value = value; utxo->satoshis = tmpsatoshis; - utxo->txid2 = deposittxid; - utxo->vout2 = depositvout; - utxo->satoshis2 = depositsatoshis; + utxo->txid2 = txid2; + utxo->vout2 = vout2; + utxo->value2 = value2; memcpy(utxo->key,txid.bytes,sizeof(txid)); memcpy(&utxo->key[sizeof(txid)],&vout,sizeof(vout)); portable_mutex_lock(&LP_utxomutex); @@ -134,7 +134,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(satoshis),dstr(depositsatoshis),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid)); + char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid)); } return(utxo); } @@ -166,7 +166,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),SATOSHIDEN*jdouble(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),SATOSHIDEN * jdouble(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); + utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); if ( utxo != 0 ) utxo->lasttime = now; } From 559561d2b0ee398cb82127fe35a237e5ec31c025 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 12:28:35 +0300 Subject: [PATCH 044/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0070a639f..319967505 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -100,6 +100,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 else tmpsatoshis = value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { + printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) { utxo->errors++; From a6006f3d50dd240636b84a524e0798a727291d07 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 12:41:57 +0300 Subject: [PATCH 045/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 319967505..efa52b2d3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -167,6 +167,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); + printf("parse.(%s)\n",jprint(item,0)); utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); if ( utxo != 0 ) utxo->lasttime = now; From 62cbf1cfbe1f72c2163898231e9c7ee081b6b6c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:01:33 +0300 Subject: [PATCH 046/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bae8bfd7d..32bed2a93 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -293,7 +293,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"notifyutxo") == 0 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),SATOSHIDEN * jdouble(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),SATOSHIDEN * jdouble(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 6010a78f6..527ce50f0 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -38,7 +38,7 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t { char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); - //printf("getutxos.(%s)\n",url); + //printf("getutxo.(%s)\n",url); return(issue_curl(url)); } From a0a85cecbb86c55a107940c4fef8d7695ceaa852 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:28:07 +0300 Subject: [PATCH 047/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 32bed2a93..bae8bfd7d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -293,7 +293,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"notifyutxo") == 0 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),SATOSHIDEN * jdouble(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),SATOSHIDEN * jdouble(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 527ce50f0..cc4ee5e2c 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%.8f&txid2=%s&vout2=%d&value2=%.8f&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value),bits256_str(str2,utxo->txid2),utxo->vout2,dstr(utxo->value2),utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); From 1dd8166ae1ce38d05c5f34b2ca7a2254d169b2fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:29:32 +0300 Subject: [PATCH 048/910] 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 cc4ee5e2c..47a1ad9e5 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); From 3bd91103e76fae9df7c098bc74b60b3e0944f8d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:34:28 +0300 Subject: [PATCH 049/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bae8bfd7d..fb8d470e7 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -290,7 +290,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); - else if ( IAMCLIENT == 0 && strcmp(method,"notifyutxo") == 0 ) + else if ( IAMCLIENT == 0 && strcmp(method,"notified") == 0 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 47a1ad9e5..05e51f23c 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notifyutxo?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); From 1fdb995419d414fb9b264601da62e14d2e876f2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:43:14 +0300 Subject: [PATCH 050/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index fb8d470e7..303cfd20d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -293,7 +293,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"notified") == 0 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 05e51f23c..7943cbc3c 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); From bad3ebf12611121fbf70590b88073c3a0c09fd70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:52:30 +0300 Subject: [PATCH 051/910] Test --- iguana/exchanges/LP_commands.c | 7 +++++-- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 303cfd20d..9f0f55c7c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -292,8 +292,11 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); else if ( IAMCLIENT == 0 && strcmp(method,"notified") == 0 ) { - printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + if ( juint(argjson,"timestamp") > time(NULL)-60 ) + { + printf("utxonotify.(%s)\n",jprint(argjson,0)); + LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + } retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 7943cbc3c..395f197b1 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr); + sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index efa52b2d3..055b37df3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -32,6 +32,7 @@ struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { jaddstr(item,"coin",utxo->coin); + jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); jaddbits256(item,"txid",utxo->txid); jaddnum(item,"vout",utxo->vout); @@ -155,7 +156,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs for (i=0; i now-60 && (argipaddr= jstr(item,"ipaddr")) != 0 && (argport= juint(item,"port")) != 0 ) { if ( (pushport= juint(item,"push")) == 0 ) pushport = argport + 1; From cf9ebf00b602dba7342097fc70ebd325950ada58 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 13:59:50 +0300 Subject: [PATCH 052/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 6 ++++-- iguana/exchanges/LP_utxos.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index bccb9e1bf..24cc54375 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -178,7 +178,7 @@ struct LP_peerinfo UT_hash_handle hh; uint64_t ip_port; double profitmargin; - uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected; + uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos; int32_t pushsock,subsock; uint16_t port; char ipaddr[64]; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ab7251b68..37edaeb03 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -80,7 +80,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin) { //static uint16_t tmpport; - char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; + char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; if ( amclient == 0 ) { for (i=0; inumpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) @@ -179,8 +180,9 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) LP_peersquery(amclient,mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); } - if ( peer->numutxos != mypeer->numutxos ) + if ( peer->numutxos != mypeer->numutxos && now > peer->lastutxos+60 ) { + peer->lastutxos = now; lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; if ( lastn < LP_PROPAGATION_SLACK * 2 ) lastn = LP_PROPAGATION_SLACK * 2; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 055b37df3..2eb7b166c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -173,7 +173,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( utxo != 0 ) utxo->lasttime = now; } - } + } else printf("skip.(%s)\n",jprint(item,0)); } if ( (destpeer= LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport)) != 0 ) { From ad7f0b18a23a0bd6a08416e0f7e3cad552040e49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:09:22 +0300 Subject: [PATCH 053/910] Test --- iguana/exchanges/LP_commands.c | 3 +++ iguana/exchanges/LP_include.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9f0f55c7c..a92e866eb 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -287,7 +287,10 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); else if ( IAMCLIENT == 0 && strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) + { retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); + printf("RETURN.(%s)\n",retstr); + } else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); else if ( IAMCLIENT == 0 && strcmp(method,"notified") == 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 24cc54375..63923eadb 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -32,7 +32,7 @@ #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" #define BASILISK_DISABLEWAITTX -//#define BASILISK_DISABLESENDTX +#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 From 0a8cc5aa066fe9655b180b1b2bfe12bff639a09e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:18:44 +0300 Subject: [PATCH 054/910] Test --- iguana/exchanges/LP_quotes.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index e406d44d7..42c5aa718 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -192,6 +192,18 @@ int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) else return(-1); } +int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) +{ + int32_t i,n = cJSON_GetArraySize(array); cJSON *item; + for (i=0; icoin) / 0.975; if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) { - //printf("candidates.(%s)\n",jprint(array,0)); + printf("candidates.(%s)\n",jprint(array,0)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); From 7552abb8757f0efc73aac8417a7fe7912f5aa251 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:21:38 +0300 Subject: [PATCH 055/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 42c5aa718..2b0a6e732 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -249,7 +249,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) maxprice = LP_price(base,myutxo->coin) / 0.975; if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) { - printf("candidates.(%s)\n",jprint(array,0)); + printf("candidates.(%s)\nn.%d",jprint(array,0),cJSON_GetArraySize(array)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); From 6675873d74ad6384f15db4e071308d12bd5c6cf5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:25:16 +0300 Subject: [PATCH 056/910] Test --- iguana/exchanges/LP_quotes.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 2b0a6e732..7a749a60c 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -181,6 +181,7 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; + char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } @@ -249,7 +250,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) maxprice = LP_price(base,myutxo->coin) / 0.975; if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) { - printf("candidates.(%s)\nn.%d",jprint(array,0),cJSON_GetArraySize(array)); + printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); From 2677368d97cf2e031c433f42d4e2daa24eb84ea9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:26:03 +0300 Subject: [PATCH 057/910] Test --- iguana/exchanges/LP_prices.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index f575ac0ec..0807fc4c1 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -326,12 +326,14 @@ char *LP_orderbook(char *base,char *rel) for (i=0; i 1 ) qsort(asks,numasks,sizeof(*asks),_cmp_orderbook); for (i=0; i Date: Mon, 5 Jun 2017 14:35:19 +0300 Subject: [PATCH 058/910] Test --- iguana/exchanges/LP_commands.c | 15 +++++++++++++-- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 11 +++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a92e866eb..204afe6bf 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -192,7 +192,7 @@ char *LP_connected(cJSON *argjson) char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; if ( (method= jstr(argjson,"method")) == 0 ) return(clonestr("{\"error\":\"need method in request\"}")); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) @@ -213,7 +213,18 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( LP_mypriceset(base,rel,jdouble(argjson,"price")) < 0 ) return(clonestr("{\"error\":\"couldnt set price\"}")); - else return(clonestr("{\"result\":\"success\"}")); + else + { + if ( IAMCLIENT == 0 ) + { + HASH_ITER(hh,LP_utxoinfos,utxo,tmp) + { + if ( LP_ismine(utxo) != 0 && strcmp(utxo->coin,base) == 0 ) + LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); + } + } + return(clonestr("{\"result\":\"success\"}")); + } } else if ( strcmp(method,"myprice") == 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 37edaeb03..a5c5c9bfd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -162,7 +162,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { - if ( strcmp(utxo->ipaddr,mypeer->ipaddr) == 0 && utxo->port == mypeer->port ) + if ( LP_ismine(utxo) != 0 ) { if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2eb7b166c..2e4c7f6ed 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -18,6 +18,17 @@ // marketmaker // +int32_t LP_ismine(struct LP_utxoinfo *utxo) +{ + if ( strcmp(utxo->ipaddr,"127.0.0.1") == 0 ) + return(1); + else if ( LP_mypeer == 0 ) + return(0); + else if ( strcmp(utxo->ipaddr,LP_mypeer->ipaddr) == 0 && utxo->port == LP_mypeer->port )\ + return(1); + else return(0); +} + struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) { struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; From 594f75f54ac0fcc8df282bb09c3d75d4e0b430dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:40:17 +0300 Subject: [PATCH 059/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_quotes.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 204afe6bf..7c802fff3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -219,7 +219,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { HASH_ITER(hh,LP_utxoinfos,utxo,tmp) { - if ( LP_ismine(utxo) != 0 && strcmp(utxo->coin,base) == 0 ) + if ( LP_ismine(utxo) != 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); } } diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 7a749a60c..5a0cf09f8 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -347,6 +347,7 @@ int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double p retjson = LP_quotejson(&Q); jaddstr(retjson,"method","quote"); retstr = jprint(retjson,1); + printf("PING.(%s)\n",retstr); LP_send(pubsock,retstr,1); utxo->published = now; return(0); From 66297a29182f1378358b8b03b6dbd980d8c70862 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:45:35 +0300 Subject: [PATCH 060/910] Test --- iguana/exchanges/inv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/inv b/iguana/exchanges/inv index b0b5e52b1..0009b7af4 100755 --- a/iguana/exchanges/inv +++ b/iguana/exchanges/inv @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"inventory\",\"coin\":\"KMD\"}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"inventory\",\"coin\":\"REVS\"}" From 0eae00f34567445b81255f222650607f0b473059 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 14:49:36 +0300 Subject: [PATCH 061/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7c802fff3..a88e5de2d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -300,7 +300,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) { retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); - printf("RETURN.(%s)\n",retstr); + //printf("RETURN.(%s)\n",retstr); } else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2e4c7f6ed..4bb325b2f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -184,7 +184,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( utxo != 0 ) utxo->lasttime = now; } - } else printf("skip.(%s)\n",jprint(item,0)); + } // else printf("skip.(%s)\n",jprint(item,0)); } if ( (destpeer= LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport)) != 0 ) { From 630986d42d3f825e5179cf4cc68de9ac4023a593 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:10:32 +0300 Subject: [PATCH 062/910] Test --- iguana/exchanges/LP_commands.c | 2 + iguana/exchanges/LP_include.h | 7 ++- iguana/exchanges/LP_nativeDEX.c | 12 +++++- iguana/exchanges/LP_quotes.c | 21 ++++----- iguana/exchanges/LP_swap.c | 14 +++--- iguana/exchanges/LP_utxos.c | 76 ++++++++++++++++++++++++++++++--- 6 files changed, 105 insertions(+), 27 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a88e5de2d..9e4c782ae 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -291,6 +291,8 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) retstr = LP_connected(argjson); + else if ( strcmp(method,"checktxid") == 0 ) + retstr = LP_spentcheck(argjson); else if ( strcmp(method,"getprice") == 0 ) retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"orderbook") == 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 63923eadb..314dbc92d 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 +#define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) +#define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) + #define INSTANTDEX_DECKSIZE 1000 #define INSTANTDEX_LOCKTIME (3600*2 + 300*2) #define INSTANTDEX_INSURANCEDIV 777 @@ -167,7 +170,7 @@ struct LP_utxoinfo uint64_t value,satoshis,value2; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; int32_t vout,vout2,pair; - uint32_t lasttime,errors,swappending,published; + uint32_t lasttime,errors,swappending,published,spentflag; double profitmargin; char ipaddr[64],coinaddr[64],spendscript[256],coin[16]; uint16_t port; @@ -188,7 +191,7 @@ struct LP_quoteinfo { struct basilisk_request R; bits256 srchash,desthash,txid,txid2,desttxid,feetxid,privkey; - uint64_t value,satoshis,satoshis2,txfee,destsatoshis,desttxfee; + uint64_t satoshis,txfee,destsatoshis,desttxfee; uint32_t timestamp,quotetime; int32_t vout,vout2,destvout,feevout,pair; char srccoin[16],coinaddr[64],destcoin[16],destaddr[64]; }; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a5c5c9bfd..1d22abaa1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -162,7 +162,17 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { - if ( LP_ismine(utxo) != 0 ) + if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) + { + printf("txid %s %.8f has been spent\n",utxo->coin,dstr(utxo->value)); + LP_spentnotify(utxo,0); + } + else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) + { + printf("txid2 %s %.8f has been spent\n",utxo->coin,dstr(utxo->value2)); + LP_spentnotify(utxo,1); + } + else if ( LP_ismine(utxo) != 0 ) { if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 5a0cf09f8..44722ea15 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -66,8 +66,6 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) { jaddbits256(retjson,"txid2",qp->txid2); jaddnum(retjson,"vout2",qp->vout2); - if ( qp->satoshis2 != 0 ) - jadd64bits(retjson,"satoshis2",qp->satoshis2); } if ( bits256_nonz(qp->desttxid) != 0 ) { @@ -114,10 +112,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->feetxid = jbits256(argjson,"feetxid"); qp->destvout = jint(argjson,"destvout"); qp->desthash = jbits256(argjson,"desthash"); - //qp->feesatoshis = j64bits(argjson,"feesatoshis"); qp->satoshis = j64bits(argjson,"satoshis"); - qp->satoshis2 = j64bits(argjson,"satoshis2"); - qp->value = j64bits(argjson,"value"); qp->destsatoshis = j64bits(argjson,"destsatoshis"); qp->txfee = j64bits(argjson,"txfee"); qp->desttxfee = j64bits(argjson,"desttxfee"); @@ -131,16 +126,14 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; - if ( qp->txfee >= utxo->value || qp->txfee >= utxo->value2 || utxo->value2 < utxo->satoshis+(utxo->satoshis>>3) ) + if ( qp->txfee >= utxo->satoshis || qp->txfee >= utxo->value2 || utxo->value2 < LP_DEPOSITSATOSHIS(utxo->satoshis) ) return(-1); qp->txid = utxo->txid; qp->vout = utxo->vout; qp->txid2 = utxo->txid2; qp->vout2 = utxo->vout2; - qp->satoshis = utxo->satoshis; - qp->satoshis2 = utxo->satoshis + (utxo->satoshis >> 3); + qp->satoshis = utxo->satoshis - qp->txfee; qp->destsatoshis = qp->satoshis * price; - //qp->feesatoshis = qp->destsatoshis / INSTANTDEX_INSURANCEDIV; if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) qp->desttxfee = 10000; if ( qp->desttxfee >= qp->destsatoshis ) @@ -164,7 +157,6 @@ int32_t LP_quoteinfoset(struct LP_quoteinfo *qp,uint32_t timestamp,uint32_t quot qp->timestamp = timestamp; qp->quotetime = quotetime; qp->destsatoshis = destsatoshis; - //qp->feesatoshis = qp->destsatoshis / INSTANTDEX_INSURANCEDIV; qp->desttxfee = desttxfee; qp->desttxid = desttxid; qp->destvout = destvout; @@ -229,8 +221,13 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) LP_quoteparse(&Q,item); safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) - if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) - jaddi(retarray,jduplicate(item)); + { + if ( LP_iseligible(Q.txid,Q.vout) != 0 ) + { + if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) + jaddi(retarray,jduplicate(item)); + } + } } } free_json(array); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 6a1def41e..f788c087b 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -818,20 +818,20 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 printf(">>>>>>>>>> jumblrflag.%d <<<<<<<<< use smart address, %.8f bobconfs.%d, %.8f aliceconfs.%d\n",jumblrflag,dstr(swap->I.bobsatoshis),swap->I.bobconfirms,dstr(swap->I.alicesatoshis),swap->I.aliceconfirms); if ( swap->I.iambob != 0 ) { - basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,&swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_INSURANCEDIV,0,0,jumblrflag); - basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,&swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_INSURANCEDIV,0,0,jumblrflag); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,&swap->bobcoin,0,0,LP_DEXFEE(swap->I.bobsatoshis),0,0,jumblrflag); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,&swap->alicecoin,0,0,LP_DEXFEE(swap->I.alicesatoshis),0,0,jumblrflag); bobpub33 = pubkey33; } else { - basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,&swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_INSURANCEDIV,0,0,jumblrflag); - basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,&swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_INSURANCEDIV,0,0,jumblrflag); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,&swap->bobcoin,0,0,LP_DEXFEE(swap->I.bobsatoshis),0,0,jumblrflag); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,&swap->alicecoin,0,0,LP_DEXFEE(swap->I.alicesatoshis),0,0,jumblrflag); alicepub33 = pubkey33; } - basilisk_rawtx_setparms("bobdeposit",swap->I.req.quoteid,&swap->bobdeposit,&swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin.txfee,4,0,jumblrflag); - basilisk_rawtx_setparms("bobrefund",swap->I.req.quoteid,&swap->bobrefund,&swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33,jumblrflag); + basilisk_rawtx_setparms("bobdeposit",swap->I.req.quoteid,&swap->bobdeposit,&swap->bobcoin,swap->I.bobconfirms,0,LP_DEPOSITSATOSHIS(swap->I.bobsatoshis) + swap->bobcoin.txfee,4,0,jumblrflag); + basilisk_rawtx_setparms("bobrefund",swap->I.req.quoteid,&swap->bobrefund,&swap->bobcoin,1,4,LP_DEPOSITSATOSHIS(swap->I.bobsatoshis),1,bobpub33,jumblrflag); swap->bobrefund.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("aliceclaim",swap->I.req.quoteid,&swap->aliceclaim,&swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33,jumblrflag); + basilisk_rawtx_setparms("aliceclaim",swap->I.req.quoteid,&swap->aliceclaim,&swap->bobcoin,1,4,LP_DEPOSITSATOSHIS(swap->I.bobsatoshis),1,alicepub33,jumblrflag); swap->aliceclaim.I.suppress_pubkeys = 1; swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4bb325b2f..652acea7d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -29,6 +29,13 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) else return(0); } +int32_t LP_isunspent(struct LP_utxoinfo *utxo) +{ + if ( utxo->spentflag == 0 && utxo->swappending == 0 ) + return(1); + else return(0); +} + struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) { struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; @@ -60,6 +67,8 @@ cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) jaddnum(item,"socket",utxo->pair); if ( utxo->swap != 0 ) jaddstr(item,"swap","in progress"); + if ( utxo->spentflag != 0 ) + jaddnum(item,"spent",utxo->spentflag); return(item); } @@ -94,6 +103,63 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) return(jprint(utxosjson,1)); } +void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) +{ + cJSON *argjson; + utxo->spentflag = (uint32_t)time(NULL); + if ( LP_mypubsock >= 0 ) + { + argjson = cJSON_CreateObject(); + jaddstr(argjson,"method","checktxid"); + jaddbits256(argjson,"txid",utxo->txid); + jaddnum(argjson,"vout",utxo->vout); + if ( selector != 0 ) + { + jaddbits256(argjson,"checktxid",utxo->txid2); + jaddnum(argjson,"checkvout",utxo->vout2); + } + LP_send(LP_mypubsock,jprint(argjson,1),1); + } +} + +char *LP_spentcheck(cJSON *argjson) +{ + bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; + txid = jbits256(argjson,"txid"); + vout = jint(argjson,"vout"); + if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + { + if ( jobj(argjson,"check") == 0 ) + checktxid = txid, checkvout = vout; + else + { + checktxid = jbits256(argjson,"checktxid"); + checkvout = jint(argjson,"checkvout"); + } + if ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) + { + utxo->spentflag = (uint32_t)time(NULL); + printf("indeed txid was spent\n"); + return(clonestr("{\"result\":\"marked as spent\"}")); + } else return(clonestr("{\"error\":\"txid is still unspent?\"}")); + } else return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); +} + +int32_t LP_iseligible(bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo; + if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + { + if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == utxo->value ) + { + if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == utxo->value2 ) + return(1); + else printf("mismatched txid value2\n"); + } else printf("mismatched txid value\n"); + } + return(0); +} + struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,char *ipaddr,uint16_t port,double profitmargin) { uint64_t tmpsatoshis; struct LP_utxoinfo *utxo = 0; @@ -107,8 +173,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( IAMCLIENT == 0 || value2 < 9 * (value >> 3) ) - tmpsatoshis = (value2 / 9) << 3; + if ( IAMCLIENT == 0 || value2 < 9 * (value >> 3) + 100000 ) + tmpsatoshis = ((value2 / 9) << 3) - 100000; else tmpsatoshis = value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { @@ -244,7 +310,7 @@ char *LP_inventory(char *symbol) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos,utxo,tmp) { - if ( strcmp(symbol,utxo->coin) == 0 && (IAMCLIENT != 0 || strcmp(utxo->ipaddr,myipaddr) == 0) ) + if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && (IAMCLIENT != 0 || LP_ismine(utxo) != 0) ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } return(jprint(array,1)); @@ -332,8 +398,8 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb depositval = values[i]; values[i] = 0, used++; if ( amclient != 0 ) - targetval = (depositval / 776) + 50000; - else targetval = (depositval / 9) * 8; + targetval = (depositval / 776) + 100000; + else targetval = (depositval / 9) * 8 + 100000; //printf("i.%d %.8f target %.8f\n",i,dstr(depositval),dstr(targetval)); if ( (i= LP_nearestvalue(values,n,targetval)) >= 0 ) { From 6b22e3fac33e9cdfe357dafafd1c90706a4b169f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:16:59 +0300 Subject: [PATCH 063/910] Test --- iguana/exchanges/LP_prices.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 0807fc4c1..77731da74 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -306,7 +306,7 @@ char *LP_orderbook(char *base,char *rel) now = (uint32_t)time(NULL); HASH_ITER(hh,LP_cacheinfos,ptr,tmp) { - if ( ptr->timestamp < now-60 || ptr->price == 0. ) + if ( ptr->timestamp < now-60*2 || ptr->price == 0. ) continue; if ( strcmp(ptr->Q.srccoin,base) == 0 && strcmp(ptr->Q.destcoin,rel) == 0 ) { @@ -329,7 +329,15 @@ char *LP_orderbook(char *base,char *rel) jaddnum(retjson,"numbids",numbids); array = cJSON_CreateArray(); if ( numasks > 1 ) + { + for (i=0; iprice); + printf(" -> "); qsort(asks,numasks,sizeof(*asks),_cmp_orderbook); + for (i=0; iprice); + printf("sorted asks.%d\n",numasks); + } for (i=0; i Date: Mon, 5 Jun 2017 16:19:16 +0300 Subject: [PATCH 064/910] 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 77731da74..43e56d472 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -265,7 +265,7 @@ static int _cmp_orderbook(const void *a,const void *b) return(1); else if ( ptr_b < ptr_a ) return(-1); - else +/* else { #undef ptr_a #undef ptr_b @@ -275,7 +275,7 @@ static int _cmp_orderbook(const void *a,const void *b) return(1); else if ( ptr_b < ptr_a ) return(-1); - } + }*/ return(0); #undef ptr_a #undef ptr_b From 8240b45820e52af3fcbd7216c1047b00a1d15579 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:21:28 +0300 Subject: [PATCH 065/910] Test --- iguana/exchanges/LP_prices.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 43e56d472..c6b965fe9 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -259,12 +259,13 @@ struct LP_cacheinfo *LP_cacheadd(char *base,char *rel,bits256 txid,int32_t vout, static int _cmp_orderbook(const void *a,const void *b) { + int32_t retval = 0; #define ptr_a ((struct LP_cacheinfo *)a)->price #define ptr_b ((struct LP_cacheinfo *)b)->price if ( ptr_b > ptr_a ) - return(1); + retval = 1; else if ( ptr_b < ptr_a ) - return(-1); + retval = -1; /* else { #undef ptr_a @@ -276,7 +277,8 @@ static int _cmp_orderbook(const void *a,const void *b) else if ( ptr_b < ptr_a ) return(-1); }*/ - return(0); + printf("%.8f vs %.8f -> %d\n",ptr_a,ptr_b,retval); + return(retval); #undef ptr_a #undef ptr_b } From a509035d43f76eca3ac044d4be612f1f762779be Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:23:45 +0300 Subject: [PATCH 066/910] 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 c6b965fe9..5655c309f 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -260,8 +260,8 @@ struct LP_cacheinfo *LP_cacheadd(char *base,char *rel,bits256 txid,int32_t vout, static int _cmp_orderbook(const void *a,const void *b) { int32_t retval = 0; -#define ptr_a ((struct LP_cacheinfo *)a)->price -#define ptr_b ((struct LP_cacheinfo *)b)->price +#define ptr_a (*(struct LP_cacheinfo **)a)->price +#define ptr_b (*(struct LP_cacheinfo **)b)->price if ( ptr_b > ptr_a ) retval = 1; else if ( ptr_b < ptr_a ) From 0e98a91945d1add8c22a1e491db893de13c7f4b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:32:04 +0300 Subject: [PATCH 067/910] Test --- iguana/exchanges/LP_prices.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 5655c309f..5b7ad7ed1 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -266,7 +266,7 @@ static int _cmp_orderbook(const void *a,const void *b) retval = 1; else if ( ptr_b < ptr_a ) retval = -1; -/* else + else { #undef ptr_a #undef ptr_b @@ -276,8 +276,8 @@ static int _cmp_orderbook(const void *a,const void *b) return(1); else if ( ptr_b < ptr_a ) return(-1); - }*/ - printf("%.8f vs %.8f -> %d\n",ptr_a,ptr_b,retval); + } + // printf("%.8f vs %.8f -> %d\n",ptr_a,ptr_b,retval); return(retval); #undef ptr_a #undef ptr_b @@ -324,7 +324,7 @@ char *LP_orderbook(char *base,char *rel) retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); if ( numbids > 1 ) - qsort(bids,numbids,sizeof(*bids),_cmp_orderbookrev); + qsort(bids,numbids,sizeof(*bids),_cmp_orderbook); for (i=0; iprice); printf(" -> "); - qsort(asks,numasks,sizeof(*asks),_cmp_orderbook); + qsort(asks,numasks,sizeof(*asks),_cmp_orderbookrev); for (i=0; iprice); printf("sorted asks.%d\n",numasks); From b3ce009c0d5b4ed5098cb76380935217840a91da Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:45:08 +0300 Subject: [PATCH 068/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 44722ea15..a6116eb47 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -226,7 +226,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) jaddi(retarray,jduplicate(item)); - } + } else printf("ineligible.(%s)\n",jprint(item,0)); } } } From 7b070b73f7408128d5beb370f7bce765591d8136 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:52:52 +0300 Subject: [PATCH 069/910] Test --- iguana/exchanges/LP_utxos.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 652acea7d..de897ee4e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -147,15 +147,15 @@ char *LP_spentcheck(cJSON *argjson) int32_t LP_iseligible(bits256 txid,int32_t vout) { - struct LP_utxoinfo *utxo; + struct LP_utxoinfo *utxo; uint64_t value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { - if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == utxo->value ) + if ( (value= LP_txvalue(utxo->coin,utxo->txid,utxo->vout)) == utxo->value ) { if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == utxo->value2 ) return(1); - else printf("mismatched txid value2\n"); - } else printf("mismatched txid value\n"); + else printf("mismatched txid value2 %.8f vs %.8f\n",dstr(value),dstr(utxo->value2)); + } else printf("mismatched txid value %.8f vs %.8f\n",dstr(value),dstr(utxo->value)); } return(0); } From 71d6b7db72298094667be7497207343be84ea423 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 16:59:10 +0300 Subject: [PATCH 070/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index de897ee4e..34e344fc3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -147,7 +147,7 @@ char *LP_spentcheck(cJSON *argjson) int32_t LP_iseligible(bits256 txid,int32_t vout) { - struct LP_utxoinfo *utxo; uint64_t value; + struct LP_utxoinfo *utxo; uint64_t value; char str[65]; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { if ( (value= LP_txvalue(utxo->coin,utxo->txid,utxo->vout)) == utxo->value ) @@ -156,7 +156,7 @@ int32_t LP_iseligible(bits256 txid,int32_t vout) return(1); else printf("mismatched txid value2 %.8f vs %.8f\n",dstr(value),dstr(utxo->value2)); } else printf("mismatched txid value %.8f vs %.8f\n",dstr(value),dstr(utxo->value)); - } + } else printf("cant find (%s/v%d)\n",bits256_str(str,txid),vout); return(0); } From 5ba4b50d4c70ebd1340639dacb60a24512b960d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:03:53 +0300 Subject: [PATCH 071/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- iguana/exchanges/LP_utxos.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index a6116eb47..c409a5760 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -222,7 +222,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { - if ( LP_iseligible(Q.txid,Q.vout) != 0 ) + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.value,Q.txid2,Q.vout2,Q.va.ue2) != 0 ) { if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) jaddi(retarray,jduplicate(item)); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 34e344fc3..6cf96495c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -145,17 +145,17 @@ char *LP_spentcheck(cJSON *argjson) } else return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -int32_t LP_iseligible(bits256 txid,int32_t vout) +int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t value,bits256 txid2,int32_t vout2,uint64_t value2) { - struct LP_utxoinfo *utxo; uint64_t value; char str[65]; + struct LP_utxoinfo *utxo; uint64_t val,val2; char str[65]; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { - if ( (value= LP_txvalue(utxo->coin,utxo->txid,utxo->vout)) == utxo->value ) + if ( (val= LP_txvalue(coin,txid,vout)) != value ) { - if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == utxo->value2 ) + if ( (val2= LP_txvalue(coin,txid2,vout2)) != value2 ) return(1); - else printf("mismatched txid value2 %.8f vs %.8f\n",dstr(value),dstr(utxo->value2)); - } else printf("mismatched txid value %.8f vs %.8f\n",dstr(value),dstr(utxo->value)); + else printf("mismatched txid value2 %.8f vs %.8f\n",dstr(val2),dstr(value2)); + } else printf("mismatched txid value %.8f vs %.8f\n",dstr(val),dstr(value)); } else printf("cant find (%s/v%d)\n",bits256_str(str,txid),vout); return(0); } From 7cb24bf90e222469c17aad27c3b0342e6444f67b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:06:29 +0300 Subject: [PATCH 072/910] Test --- iguana/exchanges/LP_utxos.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6cf96495c..b74f0a809 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -147,16 +147,13 @@ char *LP_spentcheck(cJSON *argjson) int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t value,bits256 txid2,int32_t vout2,uint64_t value2) { - struct LP_utxoinfo *utxo; uint64_t val,val2; char str[65]; - if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + uint64_t val,val2; + if ( (val= LP_txvalue(coin,txid,vout)) != value ) { - if ( (val= LP_txvalue(coin,txid,vout)) != value ) - { - if ( (val2= LP_txvalue(coin,txid2,vout2)) != value2 ) - return(1); - else printf("mismatched txid value2 %.8f vs %.8f\n",dstr(val2),dstr(value2)); - } else printf("mismatched txid value %.8f vs %.8f\n",dstr(val),dstr(value)); - } else printf("cant find (%s/v%d)\n",bits256_str(str,txid),vout); + if ( (val2= LP_txvalue(coin,txid2,vout2)) != value2 ) + return(1); + else printf("mismatched %s txid value2 %.8f vs %.8f\n",coin,dstr(val2),dstr(value2)); + } else printf("mismatched %s txid value %.8f vs %.8f\n",coin,dstr(val),dstr(value)); return(0); } From 5f67a0752e34b2be57c94f9cc36d0e9d94589c1a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:09:24 +0300 Subject: [PATCH 073/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- iguana/exchanges/LP_utxos.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index c409a5760..2d6263628 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -222,7 +222,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.value,Q.txid2,Q.vout2,Q.va.ue2) != 0 ) + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) != 0 ) { if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) jaddi(retarray,jduplicate(item)); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b74f0a809..5c5a0b4a5 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -145,15 +145,15 @@ char *LP_spentcheck(cJSON *argjson) } else return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t value,bits256 txid2,int32_t vout2,uint64_t value2) +int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { - uint64_t val,val2; - if ( (val= LP_txvalue(coin,txid,vout)) != value ) + uint64_t val,val2; + if ( (val= LP_txvalue(coin,txid,vout)) < satoshis ) { - if ( (val2= LP_txvalue(coin,txid2,vout2)) != value2 ) + if ( (val2= LP_txvalue(coin,txid2,vout2)) < LP_DEPOSITSATOSHIS(satoshis) ) return(1); - else printf("mismatched %s txid value2 %.8f vs %.8f\n",coin,dstr(val2),dstr(value2)); - } else printf("mismatched %s txid value %.8f vs %.8f\n",coin,dstr(val),dstr(value)); + else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); + } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); return(0); } From 82540d4be448deeac40654de79590383c9eb21db Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:12:18 +0300 Subject: [PATCH 074/910] Test --- iguana/exchanges/LP_quotes.c | 1 - iguana/exchanges/LP_utxos.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 2d6263628..100fa1f6c 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -78,7 +78,6 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) { jaddbits256(retjson,"feetxid",qp->feetxid); jaddnum(retjson,"feevout",qp->feevout); - //jadd64bits(retjson,"feesatoshis",qp->feesatoshis); } if ( qp->desttxfee != 0 ) jadd64bits(retjson,"desttxfee",qp->desttxfee); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 5c5a0b4a5..6f18e709b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -148,9 +148,9 @@ char *LP_spentcheck(cJSON *argjson) int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { uint64_t val,val2; - if ( (val= LP_txvalue(coin,txid,vout)) < satoshis ) + if ( (val= LP_txvalue(coin,txid,vout)) >= satoshis ) { - if ( (val2= LP_txvalue(coin,txid2,vout2)) < LP_DEPOSITSATOSHIS(satoshis) ) + if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) return(1); else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); From d45169018540f566ab6ad3ac99fb42190e533ec7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:18:20 +0300 Subject: [PATCH 075/910] Test --- iguana/exchanges/LP_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9e4c782ae..e46448767 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -209,6 +209,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port return(clonestr("{\"error\":\"authentication error\"}")); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 ) { + char str[65]; if ( strcmp(method,"setprice") == 0 ) { if ( LP_mypriceset(base,rel,jdouble(argjson,"price")) < 0 ) @@ -221,6 +222,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( LP_ismine(utxo) != 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); + else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); } } return(clonestr("{\"result\":\"success\"}")); From 497009ce0ed3a59e325b7d29375ea13a26efd943 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:29:13 +0300 Subject: [PATCH 076/910] Test --- iguana/exchanges/LP_utxos.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6f18e709b..caf0f5553 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -151,7 +151,10 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit if ( (val= LP_txvalue(coin,txid,vout)) >= satoshis ) { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) + { + printf("val %.8f and val2 %.8f\n",dstr(val),dstr(val2)); return(1); + } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); return(0); From 43476d8cd1a9bb89f2fbb18d95918c57ff01890e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:31:02 +0300 Subject: [PATCH 077/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index caf0f5553..4fbb87d82 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -95,7 +95,7 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) { if ( i++ < firsti ) continue; - if ( coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0 ) + if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && LP_ismine(utxo) != 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } @@ -152,7 +152,7 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) { - printf("val %.8f and val2 %.8f\n",dstr(val),dstr(val2)); + printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); From 8542917aea95f7a42e24f93ea2df55173ed37b43 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:36:20 +0300 Subject: [PATCH 078/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 100fa1f6c..22786d75a 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -208,7 +208,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { - //printf("%s:%u %s\n",peer->ipaddr,peer->port,utxostr); + printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); if ( (array= cJSON_Parse(utxostr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) From dbf5e11760b24e94b22316d071d8954dd5b4fee2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 17:39:21 +0300 Subject: [PATCH 079/910] Test --- iguana/exchanges/LP_peers.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index e7d83a93e..091943d4f 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -50,6 +50,8 @@ char *LP_peers() struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,double profitmargin,int32_t numpeers,int32_t numutxos) { uint32_t ipbits; int32_t pushsock,subsock,timeout,enabled; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; + if ( strcmp(ipaddr,"173.208.149.42") == 0 ) + return(0); ipbits = (uint32_t)calc_ipbits(ipaddr); expand_ipbits(checkip,ipbits); if ( strcmp(checkip,ipaddr) == 0 ) From 17bd73a6babaa4388edbb3be8ae1f1b6b4e5812a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 18:39:10 +0300 Subject: [PATCH 080/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 22786d75a..419821ea0 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -208,7 +208,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { - printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); + //printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); if ( (array= cJSON_Parse(utxostr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) @@ -270,7 +270,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) besti = -1; for (i=0; isatoshis > Q[i].destsatoshis ) + if ( (price= prices[i]) != 0. && myutxo->satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) { metric = price / bestprice; printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); From 48183d01c7007f8c086291a550da65a6ae550014 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 18:42:26 +0300 Subject: [PATCH 081/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- iguana/exchanges/LP_utxos.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 419821ea0..04da9278f 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -262,7 +262,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) } if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) bestprice = price; - //char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); + char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); } if ( bestprice != 0. ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4fbb87d82..335b3494a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -152,10 +152,9 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) { - printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); - } - else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); + } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); return(0); } From ab503df182b6a6efe57b32646728b10be0ae07b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 18:52:08 +0300 Subject: [PATCH 082/910] Test --- iguana/exchanges/LP_quotes.c | 16 ++++++++++++++-- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 04da9278f..8a5ad2bab 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -198,14 +198,16 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n; double price; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; double price; if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); return(0); } + totaladded = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { + n = 0; if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { //printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); @@ -214,6 +216,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { retarray = cJSON_CreateArray(); + added = 0; for (i=0; icoin) == 0) && LP_ismine(utxo) != 0 ) + if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) )//&& LP_ismine(utxo) != 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } From 5a74e4db586b60402d1c9dc09334aa17a5373065 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:06:38 +0300 Subject: [PATCH 083/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index e46448767..21ffd8ca2 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -304,7 +304,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) { retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); - //printf("RETURN.(%s)\n",retstr); + printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); } else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); From 969fd66ad076549a86b00e7f78535d2280c51fb6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:10:05 +0300 Subject: [PATCH 084/910] 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 045dca9f3..63afe847c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -232,7 +232,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs for (i=0; i now-60 && (argipaddr= jstr(item,"ipaddr")) != 0 && (argport= juint(item,"port")) != 0 ) + if ( (argipaddr= jstr(item,"ipaddr")) != 0 && (argport= juint(item,"port")) != 0 ) { if ( (pushport= juint(item,"push")) == 0 ) pushport = argport + 1; From 7a1cf0ffb3cfe16655a0605aa212d0f358558c89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:10:49 +0300 Subject: [PATCH 085/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 21ffd8ca2..6a8bdd215 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -222,7 +222,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( LP_ismine(utxo) != 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); - else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); + //else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); } } return(clonestr("{\"result\":\"success\"}")); From 7078125aea655e7ec18051a60dea3005f65829b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:24:23 +0300 Subject: [PATCH 086/910] Test --- iguana/exchanges/LP_quotes.c | 18 ++++++++++++------ iguana/exchanges/LP_utxos.c | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 8a5ad2bab..de9407ea8 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -172,7 +172,7 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; - char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); + //char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } @@ -207,7 +207,7 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) totaladded = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { - n = 0; + n = added = 0; if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { //printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); @@ -216,7 +216,6 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { retarray = cJSON_CreateArray(); - added = 0; for (i=0; icoin) / 0.975; if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) { - printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); + //printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); @@ -330,7 +329,14 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) jaddnum(bestitem,"requestid",R.requestid); jaddnum(bestitem,"quoteid",R.quoteid); printf("Alice r.%u q.%u\n",R.requestid,R.quoteid); - } else jaddstr(bestitem,"status","too expensive"); + } + else + { + jaddstr(bestitem,"status","too expensive"); + jaddnum(bestitem,"price",price); + jaddnum(bestitem,"maxprice",maxprice); + jaddnum(bestitem,"bestprice",bestprice); + } } } } @@ -355,7 +361,7 @@ int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double p retjson = LP_quotejson(&Q); jaddstr(retjson,"method","quote"); retstr = jprint(retjson,1); - printf("PING.(%s)\n",retstr); + //printf("PING.(%s)\n",retstr); LP_send(pubsock,retstr,1); utxo->published = now; return(0); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 63afe847c..89bc8e88c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -177,7 +177,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 else tmpsatoshis = value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { - printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); + //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) { utxo->errors++; @@ -244,7 +244,7 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - printf("parse.(%s)\n",jprint(item,0)); + //printf("parse.(%s)\n",jprint(item,0)); utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); if ( utxo != 0 ) utxo->lasttime = now; From db242a860d0e841f42d543c6cd657bab8f451145 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:35:51 +0300 Subject: [PATCH 087/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_transaction.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 314dbc92d..cead54feb 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -35,7 +35,7 @@ #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" #define BASILISK_DISABLEWAITTX -#define BASILISK_DISABLESENDTX +//#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 7acfe1f48..9a2bb6998 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1205,7 +1205,11 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i printf(" <- GENERATED BOB PAYMENT.%d destaddr.(%s)\n",swap->bobpayment.I.datalen,swap->bobpayment.I.destaddr); LP_unspents_mark(swap->bobcoin.symbol,swap->bobpayment.vins); if ( swap->I.iambob != 0 ) + { + swap->bobpayment.utxovout = 0; + swap->bobpayment.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); + } //printf("bobscripts set completed\n"); return(0); } @@ -1234,7 +1238,11 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i printf(" <- GENERATED BOB DEPOSIT.%d\n",swap->bobdeposit.I.datalen); LP_unspents_mark(swap->bobcoin.symbol,swap->bobdeposit.vins); if ( swap->I.iambob != 0 ) + { + swap->bobrefund.utxovout = 0; + swap->bobrefund.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobdeposit_refund(swap,swap->I.putduration); + } printf("bobscripts set completed\n"); return(0); } From 45f1e761a2cf28c2ce35418f1ab7b937acd6b1af Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:49:34 +0300 Subject: [PATCH 088/910] Test --- iguana/exchanges/LP_swap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f788c087b..e4067a2d7 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -864,18 +864,18 @@ struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); calc_rmd160_sha256(swap->changermd160,pubkey33,33); - if ( bitcoin_swapinit(privkey,pubkey33,pubkey25519,swap,optionduration,!iambob) == 0 ) - { - printf("error doing swapinit\n"); - free(swap); - swap = 0; - } 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; if ( iambob != 0 ) swap->otherfee.utxotxid = qp->feetxid, swap->otherfee.utxovout = qp->feevout; else swap->myfee.utxotxid = qp->feetxid, swap->myfee.utxovout = qp->feevout; + if ( bitcoin_swapinit(privkey,pubkey33,pubkey25519,swap,optionduration,!iambob) == 0 ) + { + printf("error doing swapinit\n"); + free(swap); + swap = 0; + } return(swap); } From 055623e1f908f1594b827e7e043926ca54df37fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 19:58:56 +0300 Subject: [PATCH 089/910] Test --- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index ff2e35c11..f014e3095 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) len = (int32_t)strlen(msg) + 1; if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); - else printf("SENT.(%s)\n",msg); + //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); return(sentbytes); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 89bc8e88c..13ca0b72d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -212,7 +212,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid)); + char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); } return(utxo); } From 27eb04d57581b02a03193aad133ecb81e9bad5cc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 20:08:10 +0300 Subject: [PATCH 090/910] Test --- iguana/exchanges/LP_swap.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index e4067a2d7..f4d305b20 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -739,7 +739,7 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) +struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,struct LP_quoteinfo *qp) { //FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag=-2,x = -1; struct iguana_info *coin; @@ -846,7 +846,13 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 swap->bobspend.I.suppress_pubkeys = 1; basilisk_rawtx_setparms("alicereclaim",swap->I.req.quoteid,&swap->alicereclaim,&swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33,jumblrflag); swap->alicereclaim.I.suppress_pubkeys = 1; - printf("IAMBOB.%d\n",swap->I.iambob); + 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; + 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; + char str[65],str2[65]; printf("IAMBOB.%d %s %s\n",swap->I.iambob,bits256_str(str,qp->txid),bits256_str(str2,qp->txid2)); return(swap); } @@ -864,13 +870,7 @@ struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); calc_rmd160_sha256(swap->changermd160,pubkey33,33); - 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; - if ( iambob != 0 ) - swap->otherfee.utxotxid = qp->feetxid, swap->otherfee.utxovout = qp->feevout; - else swap->myfee.utxotxid = qp->feetxid, swap->myfee.utxovout = qp->feevout; - if ( bitcoin_swapinit(privkey,pubkey33,pubkey25519,swap,optionduration,!iambob) == 0 ) + if ( bitcoin_swapinit(privkey,pubkey33,pubkey25519,swap,optionduration,!iambob,qp) == 0 ) { printf("error doing swapinit\n"); free(swap); From 4595a675b20906f02957d3d4b7edc1628943d989 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 20:18:09 +0300 Subject: [PATCH 091/910] Test --- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f4d305b20..960a26384 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -852,7 +852,7 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 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; - char str[65],str2[65]; printf("IAMBOB.%d %s %s\n",swap->I.iambob,bits256_str(str,qp->txid),bits256_str(str2,qp->txid2)); + 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 9a2bb6998..9328cb267 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -682,6 +682,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay,bits256 privkey,uint8_t *changermd160,char *vinaddr) { int32_t retval=-1,len,iter; char *signedtx,*changeaddr = 0,_changeaddr[64]; struct iguana_info *coin; int64_t newtxfee=0,destamount; + printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str,rawtx->utxotxid),rawtx->utxovout); if ( (coin= rawtx->coin) == 0 ) return(-1); //return(_basilisk_rawtx_gen(str,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay,privkey)); From 8d6ee3a754c6a1f423228e0a4c6551a0b81d05d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 20:49:54 +0300 Subject: [PATCH 092/910] Test --- iguana/exchanges/LP_commands.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6a8bdd215..0de787665 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -113,17 +113,18 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin if ( LP_quoteparse(&Q,argjson) < 0 ) return(-2); //printf("connect with.(%s)\n",jprint(argjson,0)); + Q.destsatoshis = Q.satoshis * price; privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->mypub) == 0 ) utxo->mypub = LP_pubkey(privkey); - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) != 0 && bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { + printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); nanomsg_tcpname(pairstr,mypeer->ipaddr,10000+(rand() % 10000)); if ( (utxo->pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) printf("error creating utxo->pair\n"); else if ( nn_bind(utxo->pair,pairstr) >= 0 ) { - //char str[65]; printf("destsatoshis %.8f %s t%u\n",dstr(Q.destsatoshis),bits256_str(str,Q.desthash),Q.quotetime); LP_requestinit(&R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)utxo) == 0 ) { From 273c5c6e71c19b7a15f08c3c1502b1415c82b2a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 20:56:52 +0300 Subject: [PATCH 093/910] Test --- iguana/exchanges/LP_commands.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 0de787665..7e9243b00 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -80,6 +80,12 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); + printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + { + printf("not eligible\n"); + return(-1); + } if ( strcmp(method,"price") == 0 ) Q.timestamp = (uint32_t)time(NULL); retjson = LP_quotejson(&Q); @@ -117,9 +123,8 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->mypub) == 0 ) utxo->mypub = LP_pubkey(privkey); - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) != 0 && bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { - printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); nanomsg_tcpname(pairstr,mypeer->ipaddr,10000+(rand() % 10000)); if ( (utxo->pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) printf("error creating utxo->pair\n"); From af9538d46b19e1f0d9f6b4e4c5e3df7f122f8246 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:03:27 +0300 Subject: [PATCH 094/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7e9243b00..bb46aea7f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -80,7 +80,7 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); - printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + //printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); From a75a9c876898265ec8785565211a7d032fe24763 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:03:45 +0300 Subject: [PATCH 095/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bb46aea7f..2a043dc27 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -65,7 +65,7 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(txid,jint(argjson,"vout"))) != 0 && strcmp(utxo->ipaddr,mypeer->ipaddr) == 0 && utxo->port == mypeer->port && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { - //printf("LP_command.(%s)\n",jprint(argjson,0)); + printf("LP_command.(%s)\n",jprint(argjson,0)); if ( time(NULL) > utxo->swappending ) utxo->swappending = 0; if ( strcmp(method,"price") == 0 || strcmp(method,"request") == 0 ) From cc8cdcb9e2100a5c7f017adb0e7b00cba69a485f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:13:15 +0300 Subject: [PATCH 096/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2a043dc27..3c9fcbff4 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -81,11 +81,11 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); //printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + /*if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); return(-1); - } + }*/ if ( strcmp(method,"price") == 0 ) Q.timestamp = (uint32_t)time(NULL); retjson = LP_quotejson(&Q); From 5b04db522aec5b8aceaf67c638da1390580f419b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:25:51 +0300 Subject: [PATCH 097/910] Test --- iguana/exchanges/LP_swap.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 960a26384..16552ddbe 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -409,9 +409,10 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i void *data; int32_t datalen,retval = -1; uint32_t expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) { + printf("start wait\n"); if ( (datalen= nn_recv(pairsock,&data,NN_MSG,0)) >= 0 ) { - //printf("wait for got.%d\n",datalen); + printf("wait for got.%d\n",datalen); retval = (*verify)(swap,data,datalen); nn_freemsg(data); return(retval); @@ -424,14 +425,19 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; + printf("waitsend.%s\n",statename); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { + printf("waited for %s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) + { + printf("sent.%d after waitfor.%s\n",sendlen,statename); retval = 0; + } else printf("send %s error\n",statename); - } + } else printf("%s datagen no data\n",statename); } else printf("didnt get valid data\n"); return(retval); } @@ -439,15 +445,20 @@ int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basi int32_t LP_sendwait(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; + printf("sendwait.%s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { + printf("generated %d for %s\n",datalen,statename); if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { + printf("sendwait.%s sent %d\n",statename,sendlen); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) + { + printf("waited! sendwait.%s sent %d\n",statename,sendlen); retval = 0; - else printf("didnt get %s\n",statename); + } else printf("didnt get %s\n",statename); } else printf("send pubkeys error\n"); - } + } else printf("no datagen for %s\n",statename); return(retval); } From 9731661ef2c6acb373766127e849f7c5656131f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:33:08 +0300 Subject: [PATCH 098/910] Test --- iguana/exchanges/LP_commands.c | 8 ++++---- iguana/exchanges/LP_transaction.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 3c9fcbff4..23293800a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -81,11 +81,11 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); //printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); - /*if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); return(-1); - }*/ + } if ( strcmp(method,"price") == 0 ) Q.timestamp = (uint32_t)time(NULL); retjson = LP_quotejson(&Q); @@ -215,7 +215,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port return(clonestr("{\"error\":\"authentication error\"}")); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 ) { - char str[65]; + //char str[65]; if ( strcmp(method,"setprice") == 0 ) { if ( LP_mypriceset(base,rel,jdouble(argjson,"price")) < 0 ) @@ -310,7 +310,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else if ( IAMCLIENT == 0 && strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) { retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); - printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); + //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); } else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 9328cb267..d0458696e 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -682,7 +682,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay,bits256 privkey,uint8_t *changermd160,char *vinaddr) { int32_t retval=-1,len,iter; char *signedtx,*changeaddr = 0,_changeaddr[64]; struct iguana_info *coin; int64_t newtxfee=0,destamount; - printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str,rawtx->utxotxid),rawtx->utxovout); + char str2[65]; printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str2,rawtx->utxotxid),rawtx->utxovout); if ( (coin= rawtx->coin) == 0 ) return(-1); //return(_basilisk_rawtx_gen(str,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay,privkey)); From 1cf000ca5d87fb4540f2a88594cf17f83a6264ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:43:44 +0300 Subject: [PATCH 099/910] Test --- iguana/exchanges/LP_swap.c | 25 ++++++++++++------------- iguana/exchanges/LP_transaction.c | 5 +++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 16552ddbe..68ed6450f 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -409,10 +409,10 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i void *data; int32_t datalen,retval = -1; uint32_t expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) { - printf("start wait\n"); + //printf("start wait\n"); if ( (datalen= nn_recv(pairsock,&data,NN_MSG,0)) >= 0 ) { - printf("wait for got.%d\n",datalen); + //printf("wait for got.%d\n",datalen); retval = (*verify)(swap,data,datalen); nn_freemsg(data); return(retval); @@ -425,18 +425,17 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; - printf("waitsend.%s\n",statename); + //printf("waitsend.%s\n",statename); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { - printf("waited for %s\n",statename); + //printf("waited for %s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { - printf("sent.%d after waitfor.%s\n",sendlen,statename); + //printf("sent.%d after waitfor.%s\n",sendlen,statename); retval = 0; - } - else printf("send %s error\n",statename); + } else printf("send %s error\n",statename); } else printf("%s datagen no data\n",statename); } else printf("didnt get valid data\n"); return(retval); @@ -445,16 +444,16 @@ int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basi int32_t LP_sendwait(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; - printf("sendwait.%s\n",statename); + //printf("sendwait.%s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { - printf("generated %d for %s\n",datalen,statename); + //printf("generated %d for %s\n",datalen,statename); if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { - printf("sendwait.%s sent %d\n",statename,sendlen); + //printf("sendwait.%s sent %d\n",statename,sendlen); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { - printf("waited! sendwait.%s sent %d\n",statename,sendlen); + //printf("waited! sendwait.%s sent %d\n",statename,sendlen); retval = 0; } else printf("didnt get %s\n",statename); } else printf("send pubkeys error\n"); @@ -512,7 +511,7 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 sendbuf[sendlen++] = rawtx->I.datalen & 0xff; sendbuf[sendlen++] = (rawtx->I.datalen >> 8) & 0xff; sendbuf[sendlen++] = rawtx->I.redeemlen; - int32_t z; for (z=0; zI.datalen; z++) printf("%02x",rawtx->txbytes[z]); printf(" >>>>>>> send.%d %s\n",rawtx->I.datalen,rawtx->name); + //int32_t z; for (z=0; zI.datalen; z++) printf("%02x",rawtx->txbytes[z]); printf(" >>>>>>> send.%d %s\n",rawtx->I.datalen,rawtx->name); //printf("datalen.%d redeemlen.%d\n",rawtx->I.datalen,rawtx->I.redeemlen); memcpy(&sendbuf[sendlen],rawtx->txbytes,rawtx->I.datalen), sendlen += rawtx->I.datalen; if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) @@ -558,7 +557,7 @@ void LP_bobloop(void *_utxo) printf("error bobscripts deposit\n"); else { - printf("depositlen.%d\n",swap->bobdeposit.I.datalen); + //printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); if ( LP_waitfor(utxo->pair,swap,10,LP_verify_otherfee) < 0 ) printf("error waiting for alicefee\n"); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index d0458696e..8a4428def 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -721,6 +721,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr,uint8_t *changermd160,char *vinaddr) { char *signedtx,*changeaddr = 0,_changeaddr[64]; int64_t txfee,newtxfee=0,destamount; uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; int32_t iter,retval = -1; double estimatedrate; + char str2[65]; printf("%s rawtxsign.(%s/v%d)\n",dest->name,bits256_str(str2,dest->utxotxid),dest->utxovout); timestamp = swap->I.started; if ( dest == &swap->aliceclaim ) locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; @@ -1207,8 +1208,8 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i LP_unspents_mark(swap->bobcoin.symbol,swap->bobpayment.vins); if ( swap->I.iambob != 0 ) { - swap->bobpayment.utxovout = 0; - swap->bobpayment.utxotxid = swap->bobpayment.I.signedtxid; + swap->bobreclaim.utxovout = 0; + swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); } //printf("bobscripts set completed\n"); From 29288d23ed80e980d99446022ce44d5db2bd212d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:48:50 +0300 Subject: [PATCH 100/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 13ca0b72d..26f694580 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -172,8 +172,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( IAMCLIENT == 0 || value2 < 9 * (value >> 3) + 100000 ) - tmpsatoshis = ((value2 / 9) << 3) - 100000; + if ( IAMCLIENT == 0 && value2 < 9 * (value >> 3) + 100000 ) + tmpsatoshis = (((value2-100000) / 9) << 3); else tmpsatoshis = value; if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { From 967a28647ebd12d7fe03584d568846c76b8040f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 21:53:38 +0300 Subject: [PATCH 101/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 8a4428def..633c654ad 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1242,7 +1242,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i if ( swap->I.iambob != 0 ) { swap->bobrefund.utxovout = 0; - swap->bobrefund.utxotxid = swap->bobpayment.I.signedtxid; + swap->bobrefund.utxotxid = swap->bobdeposit.I.signedtxid; basilisk_bobdeposit_refund(swap,swap->I.putduration); } printf("bobscripts set completed\n"); From b26c28e293a3ec5a7d6d37f75ccf6b578ceb3af4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:03:55 +0300 Subject: [PATCH 102/910] Test --- iguana/exchanges/LP_commands.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 23293800a..12b1d8fe4 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -80,7 +80,7 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); - //printf("txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); @@ -123,6 +123,12 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->mypub) == 0 ) utxo->mypub = LP_pubkey(privkey); + printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + { + printf("not eligible\n"); + return(-1); + } if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { nanomsg_tcpname(pairstr,mypeer->ipaddr,10000+(rand() % 10000)); From 88859d6f093d38bbed84e4e56aa8e35f7f732265 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:11:12 +0300 Subject: [PATCH 103/910] 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 26f694580..3c90d467b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -152,7 +152,7 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) { - //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); From dd961938fb31b2012bd609ec749e3f3045ca3070 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:26:23 +0300 Subject: [PATCH 104/910] Test --- iguana/exchanges/LP_transaction.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 633c654ad..8a823c5a5 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -60,7 +60,7 @@ bits256 LP_broadcast_tx(char *name,char *symbol,uint8_t *data,int32_t datalen) return(txid); } -uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) +uint64_t oldLP_txvalue(char *symbol,bits256 txid,int32_t vout) { uint64_t value = 0; double interest; cJSON *txobj,*vouts,*utxoobj; int32_t numvouts; if ( (txobj= LP_gettx(symbol,txid)) != 0 ) @@ -91,6 +91,29 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) return(value); } +uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) +{ + uint64_t value = 0; double interest; cJSON *txobj; + if ( (txobj= LP_gettxout(symbol,txid,vout)) != 0 ) + { + //char str[65]; printf("%s.(%s) txobj.(%s)\n",symbol,bits256_str(str,txid),jprint(txobj,0)); + if ( (value= jdouble(txobj,"amount")*SATOSHIDEN) == 0 && (value= jdouble(txobj,"value")*SATOSHIDEN) == 0 ) + { + char str[65]; printf("%s LP_txvalue.%s strange utxo.(%s) vout.%d\n",symbol,bits256_str(str,txid),jprint(txobj,0),vout); + } + else if ( strcmp(symbol,"KMD") == 0 ) + { + if ( (interest= jdouble(txobj,"interest")) != 0. ) + { + printf("add interest of %.8f to %.8f\n",interest,dstr(value)); + value += SATOSHIDEN * interest; + } + } + free_json(txobj); + } + return(value); +} + int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { int32_t numconfirms = 100; From b7576a75f7efe7a3023ff5418310a45fdd6b746e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:35:07 +0300 Subject: [PATCH 105/910] Test --- iguana/exchanges/LP_utxos.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 3c90d467b..2483ff12b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -139,7 +139,7 @@ char *LP_spentcheck(cJSON *argjson) if ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) { utxo->spentflag = (uint32_t)time(NULL); - printf("indeed txid was spent\n"); + //printf("indeed txid was spent\n"); return(clonestr("{\"result\":\"marked as spent\"}")); } else return(clonestr("{\"error\":\"txid is still unspent?\"}")); } else return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); @@ -152,7 +152,7 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) { - printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); @@ -167,6 +167,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } + if ( LP_iseligible(coin,txid,vout,value,txid2,vout2) <= 0 ) + { + printf("LP_addutxo got spent txid\n"); + return(0); + } if ( IAMCLIENT == 0 && strcmp(ipaddr,"127.0.0.1") == 0 ) { printf("LP node got localhost utxo\n"); From cebfc827c5f8ba8f61ec43e953bfa32f3f36cc81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:45:46 +0300 Subject: [PATCH 106/910] Test --- iguana/exchanges/LP_utxos.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2483ff12b..45f61cb36 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -152,7 +152,7 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit { if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) { - //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); @@ -167,7 +167,10 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - if ( LP_iseligible(coin,txid,vout,value,txid2,vout2) <= 0 ) + if ( IAMCLIENT == 0 && value2 < 9 * (value >> 3) + 100000 ) + tmpsatoshis = (((value2-100000) / 9) << 3); + else tmpsatoshis = value; + if ( LP_iseligible(coin,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("LP_addutxo got spent txid\n"); return(0); @@ -177,10 +180,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( IAMCLIENT == 0 && value2 < 9 * (value >> 3) + 100000 ) - tmpsatoshis = (((value2-100000) / 9) << 3); - else tmpsatoshis = value; - if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) From 1ee4dbc6b2c209689d7286dd15b58bbdb9bd48b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:47:03 +0300 Subject: [PATCH 107/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index cead54feb..0ca6db3b0 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -181,7 +181,7 @@ struct LP_peerinfo UT_hash_handle hh; uint64_t ip_port; double profitmargin; - uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos; + uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos,lastpeers; int32_t pushsock,subsock; uint16_t port; char ipaddr[64]; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1d22abaa1..93959eab3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -183,8 +183,9 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i now = (uint32_t)time(NULL); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) + if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { + peer->lastpeers = now; if ( peer->numpeers != mypeer->numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) From f92c901391a6998ae9f8ef6d54cf0381eb1eae97 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 22:56:03 +0300 Subject: [PATCH 108/910] 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 45f61cb36..42b072337 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -172,7 +172,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 else tmpsatoshis = value; if ( LP_iseligible(coin,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { - printf("LP_addutxo got spent txid\n"); + printf("LP_addutxo got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } if ( IAMCLIENT == 0 && strcmp(ipaddr,"127.0.0.1") == 0 ) From 6a90ce477a58fe243f500cb792ab92c54dc3a44e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 23:01:23 +0300 Subject: [PATCH 109/910] Test --- iguana/exchanges/LP_utxos.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 42b072337..cdc802946 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -147,10 +147,11 @@ char *LP_spentcheck(cJSON *argjson) int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { - uint64_t val,val2; + uint64_t val,val2,threshold; if ( (val= LP_txvalue(coin,txid,vout)) >= satoshis ) { - if ( (val2= LP_txvalue(coin,txid2,vout2)) >= LP_DEPOSITSATOSHIS(satoshis) ) + threshold = (IAMCLIENT == 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); + if ( (val2= LP_txvalue(coin,txid2,vout2)) >= threshold ) { printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); From a458a814dda4da4463b540585480a26ed1502b93 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Jun 2017 23:09:19 +0300 Subject: [PATCH 110/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 8a823c5a5..924aebc27 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -96,7 +96,6 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) uint64_t value = 0; double interest; cJSON *txobj; if ( (txobj= LP_gettxout(symbol,txid,vout)) != 0 ) { - //char str[65]; printf("%s.(%s) txobj.(%s)\n",symbol,bits256_str(str,txid),jprint(txobj,0)); if ( (value= jdouble(txobj,"amount")*SATOSHIDEN) == 0 && (value= jdouble(txobj,"value")*SATOSHIDEN) == 0 ) { char str[65]; printf("%s LP_txvalue.%s strange utxo.(%s) vout.%d\n",symbol,bits256_str(str,txid),jprint(txobj,0),vout); @@ -109,6 +108,7 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) value += SATOSHIDEN * interest; } } + char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); free_json(txobj); } return(value); From 84dee477bf040988294d3a060ad77a4e373713e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 08:42:11 +0300 Subject: [PATCH 111/910] Test --- iguana/exchanges/LP_swap.c | 74 +++++++++++++++++++++++++++++++ iguana/exchanges/LP_transaction.c | 69 +--------------------------- 2 files changed, 75 insertions(+), 68 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 68ed6450f..2c51bd4f4 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -492,6 +492,80 @@ struct basilisk_rawtx *LP_swapdata_rawtx(struct basilisk_swap *swap,uint8_t *dat return(0); } +int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) +{ + bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; uint32_t quoteid,msgbits; + for (i=0; i<32; i++) + otherhash.bytes[i] = recvbuf[offset++]; + for (i=0; i<32; i++) + myhash.bytes[i] = recvbuf[offset++]; + offset += iguana_rwnum(0,&recvbuf[offset],sizeof(quoteid),"eid); + offset += iguana_rwnum(0,&recvbuf[offset],sizeof(msgbits),&msgbits); + datalen = recvbuf[offset++]; + datalen += (int32_t)recvbuf[offset++] << 8; + if ( datalen > 1024 ) + { + printf("LP_rawtx_spendscript %s datalen.%d too big\n",rawtx->name,datalen); + return(-1); + } + rawtx->I.redeemlen = recvbuf[offset++]; + data = &recvbuf[offset]; + if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) + { + memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); + for (i=0; iI.redeemlen; i++) + printf("%02x",rawtx->redeemscript[i]); + printf(" received redeemscript\n"); + } + //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); + if ( rawtx->I.datalen == 0 ) + { + for (i=0; itxbytes,data,datalen); + rawtx->I.datalen = datalen; + } + else if ( datalen != rawtx->I.datalen || memcmp(rawtx->txbytes,data,datalen) != 0 ) + { + for (i=0; iI.datalen; i++) + printf("%02x",rawtx->txbytes[i]); + printf(" <- rawtx\n"); + printf("%s rawtx data compare error, len %d vs %d <<<<<<<<<< warning\n",rawtx->name,rawtx->I.datalen,datalen); + return(-1); + } + if ( recvlen != datalen+rawtx->I.redeemlen ) + printf("RECVLEN %d != %d + %d\n",recvlen,datalen,rawtx->I.redeemlen); + txid = bits256_doublesha256(0,data,datalen); + //char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); + if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) + rawtx->I.actualtxid = txid; + if ( (txobj= bitcoin_data2json(rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) + { + rawtx->I.actualtxid = rawtx->I.signedtxid; + char str[65]; printf("got %s txid.%s (%s)\n",rawtx->name,bits256_str(str,rawtx->I.signedtxid),jprint(txobj,0)); + rawtx->I.locktime = rawtx->msgtx.lock_time; + if ( (vouts= jarray(&n,txobj,"vout")) != 0 && v < n ) + { + vout = jitem(vouts,v); + if ( j64bits(vout,"satoshis") == rawtx->I.amount && (skey= jobj(vout,"scriptPubKey")) != 0 && (hexstr= jstr(skey,"hex")) != 0 ) + { + if ( (hexlen= (int32_t)strlen(hexstr) >> 1) < sizeof(rawtx->spendscript) ) + { + decode_hex(rawtx->spendscript,hexlen,hexstr); + rawtx->I.spendlen = hexlen; + bitcoin_address(rawtx->p2shaddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); + //if ( swap != 0 ) + // basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + retval = 0; + } + } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); + } + free_json(txobj); + } + return(retval); +} + uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { uint8_t sendbuf[32768]; int32_t sendlen; diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 924aebc27..a6e5cb5e2 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -108,7 +108,7 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) value += SATOSHIDEN * interest; } } - char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); + // char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); free_json(txobj); } return(value); @@ -1399,73 +1399,6 @@ int32_t LP_verify_otherfee(struct basilisk_swap *swap,uint8_t *data,int32_t data return(0); } -int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) -{ - bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; uint32_t quoteid,msgbits; - for (i=0; i<32; i++) - otherhash.bytes[i] = recvbuf[offset++]; - for (i=0; i<32; i++) - myhash.bytes[i] = recvbuf[offset++]; - offset += iguana_rwnum(0,&recvbuf[offset],sizeof(quoteid),"eid); - offset += iguana_rwnum(0,&recvbuf[offset],sizeof(msgbits),&msgbits); - datalen = recvbuf[offset++]; - datalen += (int32_t)recvbuf[offset++] << 8; - if ( datalen > 1024 ) - { - printf("LP_rawtx_spendscript %s datalen.%d too big\n",rawtx->name,datalen); - return(-1); - } - rawtx->I.redeemlen = recvbuf[offset++]; - data = &recvbuf[offset++]; - if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) - memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); - //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); - if ( rawtx->I.datalen == 0 ) - { - int32_t i; for (i=0; itxbytes,data,datalen); - rawtx->I.datalen = datalen; - } - else if ( datalen != rawtx->I.datalen || memcmp(rawtx->txbytes,data,datalen) != 0 ) - { - for (i=0; iI.datalen; i++) - printf("%02x",rawtx->txbytes[i]); - printf(" <- rawtx\n"); - printf("%s rawtx data compare error, len %d vs %d <<<<<<<<<< warning\n",rawtx->name,rawtx->I.datalen,datalen); - return(-1); - } - txid = bits256_doublesha256(0,data,datalen); - //char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); - if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) - rawtx->I.actualtxid = txid; - if ( (txobj= bitcoin_data2json(rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) - { - rawtx->I.actualtxid = rawtx->I.signedtxid; - char str[65]; printf("got %s txid.%s (%s)\n",rawtx->name,bits256_str(str,rawtx->I.signedtxid),jprint(txobj,0)); - rawtx->I.locktime = rawtx->msgtx.lock_time; - if ( (vouts= jarray(&n,txobj,"vout")) != 0 && v < n ) - { - vout = jitem(vouts,v); - if ( j64bits(vout,"satoshis") == rawtx->I.amount && (skey= jobj(vout,"scriptPubKey")) != 0 && (hexstr= jstr(skey,"hex")) != 0 ) - { - if ( (hexlen= (int32_t)strlen(hexstr) >> 1) < sizeof(rawtx->spendscript) ) - { - decode_hex(rawtx->spendscript,hexlen,hexstr); - rawtx->I.spendlen = hexlen; - bitcoin_address(rawtx->p2shaddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); - //if ( swap != 0 ) - // basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment - retval = 0; - } - } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); - } - free_json(txobj); - } - return(retval); -} - /* Bob deposit: OP_IF OP_CLTV OP_DROP OP_CHECKSIG From bcca880949de6b1e17186e054e926908b28e8ee1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 08:43:13 +0300 Subject: [PATCH 112/910] Test --- iguana/exchanges/LP_include.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 0ca6db3b0..ae1b1a4a0 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -203,5 +203,6 @@ struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params); uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend); double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub); +int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); #endif From e787ebcbd2892e189f1d12ddd860d397dd88fac0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 08:45:14 +0300 Subject: [PATCH 113/910] 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 cdc802946..8e74a944e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -153,7 +153,7 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit threshold = (IAMCLIENT == 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(coin,txid2,vout2)) >= threshold ) { - printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); From 4f7570854f6bdafce5ea0d78818704d6cfa569e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 08:51:08 +0300 Subject: [PATCH 114/910] Test --- iguana/exchanges/LP_swap.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 2c51bd4f4..80a96f9a7 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -494,7 +494,7 @@ struct basilisk_rawtx *LP_swapdata_rawtx(struct basilisk_swap *swap,uint8_t *dat int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { - bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; uint32_t quoteid,msgbits; + bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr,redeemaddr[64]; uint32_t quoteid,msgbits; for (i=0; i<32; i++) otherhash.bytes[i] = recvbuf[offset++]; for (i=0; i<32; i++) @@ -515,7 +515,8 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); for (i=0; iI.redeemlen; i++) printf("%02x",rawtx->redeemscript[i]); - printf(" received redeemscript\n"); + bitcoin_address(redeemaddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); + printf(" received redeemscript.(%s)\n",redeemaddr); } //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); if ( rawtx->I.datalen == 0 ) @@ -557,7 +558,9 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba bitcoin_address(rawtx->p2shaddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); //if ( swap != 0 ) // basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment - retval = 0; + if ( strcmp(redeemaddr,rawtx->p2shaddr) == 0 ) + retval = 0; + else printf("mismatched redeemscript %s != %s\n",redeemaddr,rawtx->p2shaddr); } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); } From f45e155cf84848aac1ed36816642a032ee3c5bc0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 09:04:19 +0300 Subject: [PATCH 115/910] Test --- iguana/exchanges/LP_swap.c | 18 ++++++++++++++---- iguana/exchanges/LP_transaction.c | 12 ------------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 80a96f9a7..701570267 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -494,7 +494,7 @@ struct basilisk_rawtx *LP_swapdata_rawtx(struct basilisk_swap *swap,uint8_t *dat int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { - bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr,redeemaddr[64]; uint32_t quoteid,msgbits; + bits256 otherhash,myhash,txid; int32_t i,offset=0,datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr,redeemaddr[64],checkaddr[64]; uint32_t quoteid,msgbits; for (i=0; i<32; i++) otherhash.bytes[i] = recvbuf[offset++]; for (i=0; i<32; i++) @@ -517,6 +517,12 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba printf("%02x",rawtx->redeemscript[i]); bitcoin_address(redeemaddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); printf(" received redeemscript.(%s)\n",redeemaddr); + LP_swap_coinaddr(swap,rawtx->coin,checkaddr,data,datalen); + if ( strcmp(redeemaddr,checkaddr) != 0 ) + { + printf("REDEEMADDR MISMATCH??? %s != %s\n",redeemaddr,checkaddr); + return(-1); + } } //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); if ( rawtx->I.datalen == 0 ) @@ -558,9 +564,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba bitcoin_address(rawtx->p2shaddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); //if ( swap != 0 ) // basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment - if ( strcmp(redeemaddr,rawtx->p2shaddr) == 0 ) - retval = 0; - else printf("mismatched redeemscript %s != %s\n",redeemaddr,rawtx->p2shaddr); + retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); } @@ -634,6 +638,9 @@ void LP_bobloop(void *_utxo) printf("error bobscripts deposit\n"); else { + swap->bobrefund.utxovout = 0; + swap->bobrefund.utxotxid = swap->bobdeposit.I.signedtxid; + basilisk_bobdeposit_refund(swap,swap->I.putduration); //printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); if ( LP_waitfor(utxo->pair,swap,10,LP_verify_otherfee) < 0 ) @@ -648,6 +655,9 @@ void LP_bobloop(void *_utxo) printf("error sending bobpayment\n"); else { + swap->bobreclaim.utxovout = 0; + swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; + basilisk_bobpayment_reclaim(swap,swap->I.callduration); printf("looping on swaplist\n"); while ( 1 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index a6e5cb5e2..f8eb8d5f5 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1229,12 +1229,6 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i printf(" <- redeem.%d\n",swap->bobpayment.I.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d destaddr.(%s)\n",swap->bobpayment.I.datalen,swap->bobpayment.I.destaddr); LP_unspents_mark(swap->bobcoin.symbol,swap->bobpayment.vins); - if ( swap->I.iambob != 0 ) - { - swap->bobreclaim.utxovout = 0; - swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; - basilisk_bobpayment_reclaim(swap,swap->I.callduration); - } //printf("bobscripts set completed\n"); return(0); } @@ -1262,12 +1256,6 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i printf("%02x",swap->bobdeposit.txbytes[j]); printf(" <- GENERATED BOB DEPOSIT.%d\n",swap->bobdeposit.I.datalen); LP_unspents_mark(swap->bobcoin.symbol,swap->bobdeposit.vins); - if ( swap->I.iambob != 0 ) - { - swap->bobrefund.utxovout = 0; - swap->bobrefund.utxotxid = swap->bobdeposit.I.signedtxid; - basilisk_bobdeposit_refund(swap,swap->I.putduration); - } printf("bobscripts set completed\n"); return(0); } From f2501442921ca1d3f2423536f14ef155b3929f3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 09:05:31 +0300 Subject: [PATCH 116/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 93959eab3..07368ec05 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -160,16 +160,17 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i LP_privkey_updates(mypeer,pubsock,passphrase,amclient); if ( (counter % 500) == 0 ) { + char str[65]; HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { - printf("txid %s %.8f has been spent\n",utxo->coin,dstr(utxo->value)); + printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); LP_spentnotify(utxo,0); } else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) { - printf("txid2 %s %.8f has been spent\n",utxo->coin,dstr(utxo->value2)); + printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); LP_spentnotify(utxo,1); } else if ( LP_ismine(utxo) != 0 ) From 0ffdb6037447ad19d0dd5004861ef388e7015763 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 09:06:47 +0300 Subject: [PATCH 117/910] 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 8e74a944e..7d675cc4d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -95,7 +95,7 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) { if ( i++ < firsti ) continue; - if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) )//&& LP_ismine(utxo) != 0 ) + if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->spentflag == 0 )//&& LP_ismine(utxo) != 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } From 7a12ab716cf42df2761413e56847f1369ffbb524 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 09:51:37 +0300 Subject: [PATCH 118/910] Test --- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 701570267..195a1301d 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -541,7 +541,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba printf("%s rawtx data compare error, len %d vs %d <<<<<<<<<< warning\n",rawtx->name,rawtx->I.datalen,datalen); return(-1); } - if ( recvlen != datalen+rawtx->I.redeemlen ) + if ( recvlen != datalen+rawtx->I.redeemlen+75 ) printf("RECVLEN %d != %d + %d\n",recvlen,datalen,rawtx->I.redeemlen); txid = bits256_doublesha256(0,data,datalen); //char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index f8eb8d5f5..6f8919576 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1208,6 +1208,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobpayment.I.spendlen = basilisk_bobscript(swap->bobpayment.I.rmd160,swap->bobpayment.redeemscript,&swap->bobpayment.I.redeemlen,swap->bobpayment.spendscript,0,&swap->bobpayment.I.locktime,&swap->bobpayment.I.secretstart,&swap->I,0); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); + LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); //int32_t i; for (i=0; ibobpayment.I.redeemlen; i++) // printf("%02x",swap->bobpayment.redeemscript[i]); //printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); @@ -1239,6 +1240,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); + LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); //int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); @@ -1346,11 +1348,16 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); else { + bitcoin_address(swap->alicepayment.I.destaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); + LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); + if ( strcmp(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr) != 0 ) + printf("alice addr mismatch %s vs %s\n",swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); retval = 0; for (i=0; ialicepayment.I.datalen; i++) printf("%02x",swap->alicepayment.txbytes[i]); - printf(" ALICE PAYMENT created\n"); + printf(" ALICE PAYMENT created.(%s)\n",swap->alicepayment.I.destaddr); LP_unspents_mark(swap->alicecoin.symbol,swap->alicepayment.vins); + LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); //basilisk_txlog(swap,&swap->alicepayment,-1); } if ( swap->myfee.I.datalen == 0 ) @@ -1409,6 +1416,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->I.userdata_aliceclaimlen = len; bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); + LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); printf(" <- bobdeposit.%d %s\n",swap->bobdeposit.I.datalen,bits256_str(str,swap->bobdeposit.I.signedtxid)); @@ -1447,6 +1455,8 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t if ( bits256_nonz(swap->alicepayment.I.signedtxid) != 0 ) swap->aliceunconf = 1; basilisk_dontforget_update(swap,&swap->alicepayment); + printf("import alicepayment address.(%s)\n",swap->alicepayment.p2shaddr); + LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.p2shaddr); return(0); } printf("error validating alicepayment\n"); @@ -1469,6 +1479,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); + LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); printf(" <- bobpayment.%d\n",swap->bobpayment.I.datalen); From 6e645b952766fd84294c75de3336b6739201d9a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 09:52:29 +0300 Subject: [PATCH 119/910] Test --- iguana/exchanges/LP_nativeDEX.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 07368ec05..5ba9b7c54 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -165,13 +165,19 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { - printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); - LP_spentnotify(utxo,0); + if ( utxo->spentflag == 0 ) + { + printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); + LP_spentnotify(utxo,0); + } } else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) { - printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); - LP_spentnotify(utxo,1); + if ( utxo->spentflag == 0 ) + { + printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); + LP_spentnotify(utxo,1); + } } else if ( LP_ismine(utxo) != 0 ) { From 1307a0972a0a39e1c8ccc9c3069651ca9c26f8dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 11:13:22 +0300 Subject: [PATCH 120/910] Test --- iguana/exchanges/LP_remember.c | 4 +- iguana/exchanges/LP_rpc.c | 55 +++++++++++++++++++++ iguana/exchanges/LP_transaction.c | 82 ++++++++++++++++++++++++++++--- 3 files changed, 131 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index bf9d34b82..c58cc2ea5 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -50,7 +50,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx LP_swap_coinaddr(swap,&swap->bobcoin,coinaddr,rawtx->txbytes,rawtx->I.datalen); if ( coinaddr[0] != 0 ) { - LP_importaddress(swap->bobcoin.symbol,coinaddr); + //LP_importaddress(swap->bobcoin.symbol,coinaddr); if ( rawtx == &swap->bobdeposit ) safecopy(swap->Bdeposit,coinaddr,sizeof(swap->Bdeposit)); else safecopy(swap->Bpayment,coinaddr,sizeof(swap->Bpayment)); @@ -72,7 +72,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx if ( bits256_nonz(swap->I.pubAm) != 0 && bits256_nonz(swap->I.pubBn) != 0 ) { basilisk_alicescript(redeemscript,&len,script,0,coinaddr,swap->alicecoin.p2shtype,swap->I.pubAm,swap->I.pubBn); - LP_importaddress(swap->alicecoin.symbol,coinaddr); + //LP_importaddress(swap->alicecoin.symbol,coinaddr); fprintf(fp,",\"Apayment\":\"%s\"",coinaddr); } if ( rawtx->I.redeemlen > 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 395f197b1..12ff20df1 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -101,6 +101,20 @@ cJSON *LP_gettx(char *symbol,bits256 txid) return(bitcoin_json(coin,"getrawtransaction",buf)); } +cJSON *LP_getblock(char *symbol,bits256 txid) +{ + char buf[128],str[65]; struct iguana_info *coin = LP_coinfind(symbol); + sprintf(buf,"[\"%s\"]",bits256_str(str,txid)); + return(bitcoin_json(coin,"getblock",buf)); +} + +cJSON *LP_getblockhashstr(char *symbol,char *blockhashstr) +{ + char buf[128]; struct iguana_info *coin = LP_coinfind(symbol); + sprintf(buf,"[\"%s\"]",blockhashstr); + return(bitcoin_json(coin,"getblock",buf)); +} + cJSON *LP_listunspent(char *symbol,char *coinaddr) { char buf[128]; struct iguana_info *coin = LP_coinfind(symbol); @@ -185,6 +199,19 @@ uint64_t LP_txfee(char *symbol) return(txfee); } +char *LP_blockhashstr(char *symbol,int32_t height) +{ + cJSON *array; char *paramstr,*retstr; struct iguana_info *coin = LP_coinfind(symbol); + if ( coin == 0 ) + return(0); + array = cJSON_CreateArray(); + jaddinum(array,height); + paramstr = jprint(array,1); + retstr = bitcoind_passthru(symbol,coin->serverport,coin->userpass,"getblockhash",paramstr); + free(paramstr); + return(retstr); +} + char *LP_sendrawtransaction(char *symbol,char *signedtx) { cJSON *array; char *paramstr,*retstr; struct iguana_info *coin = LP_coinfind(symbol); @@ -238,3 +265,31 @@ char *LP_signrawtx(char *symbol,bits256 *signedtxidp,int32_t *completedp,cJSON * free(paramstr); return(signedtx); } + +cJSON *LP_blockjson(int32_t *heightp,char *symbol,char *blockhashstr,int32_t height) +{ + cJSON *json = 0; int32_t flag = 0; + if ( blockhashstr == 0 ) + blockhashstr = LP_blockhashstr(symbol,height), flag = 1; + if ( blockhashstr != 0 ) + { + if ( (json= LP_getblockhashstr(symbol,blockhashstr)) != 0 ) + { + if ( *heightp != 0 ) + { + *heightp = juint(json,"height"); + if ( height >= 0 && *heightp != height ) + { + printf("unexpected height %d vs %d\n",*heightp,height); + *heightp = -1; + free_json(json); + json = 0; + } + } + } + if ( flag != 0 && blockhashstr != 0 ) + free(blockhashstr); + } + return(json); +} + diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 6f8919576..c1dc15549 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -114,6 +114,69 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) return(value); } +int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 searchtxid,int32_t searchvout) +{ + cJSON *blockjson,*txids,*txobj,*vins,*vin; bits256 hash,txid,spenttxid; int32_t h,i,j,numtxids,numvins,spentvout,loadheight,errs = 0; + *indp = -1; + memset(spendtxidp,0,sizeof(*spendtxidp)); + if ( LP_txvalue(symbol,searchtxid,searchvout) > 0 ) + return(0); + if ( (txobj= LP_gettx(symbol,searchtxid)) == 0 ) + return(0); + hash = jbits256(txobj,"blockhash"); + free_json(txobj); + if ( bits256_nonz(hash) == 0 ) + return(0); + if ( (blockjson= LP_getblock(symbol,hash)) == 0 ) + return(0); + loadheight = jint(blockjson,"height"); + free_json(blockjson); + if ( loadheight <= 0 ) + return(0); + while ( errs == 0 && *indp < 0 ) + { + printf("search %s ht.%d\n",symbol,loadheight); + if ( (blockjson= LP_blockjson(&h,symbol,0,loadheight)) != 0 ) + { + if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) + { + for (i=0; i= 0 ) + return(loadheight); + else return(0); +} + int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { int32_t numconfirms = 100; @@ -944,11 +1007,14 @@ bits256 _LP_swap_spendtxid(char *symbol,char *destaddr,char *coinaddr,bits256 ut bits256 LP_swap_spendtxid(char *symbol,char *destaddr,bits256 utxotxid,int32_t vout) { - bits256 spendtxid,txid; char *catstr,*addr; cJSON *array,*item,*item2,*txobj,*vins; int32_t i,n,m; char coinaddr[64],str[65]; + bits256 spendtxid,txid; char *catstr,*addr; cJSON *array,*item,*item2,*txobj,*vins; int32_t i,n,m,spendvin; char coinaddr[64],str[65]; // listtransactions or listspents destaddr[0] = 0; coinaddr[0] = 0; memset(&spendtxid,0,sizeof(spendtxid)); + if ( LP_spendsearch(&spendtxid,&spendvin,symbol,utxotxid,vout) > 0 ) + printf("spend of %s/v%d detected\n",bits256_str(str,utxotxid),vout); + return(spendtxid); //char str[65]; printf("swap %s spendtxid.(%s)\n",symbol,bits256_str(str,utxotxid)); if ( 0 && strcmp("BTC",symbol) == 0 ) { @@ -1208,7 +1274,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobpayment.I.spendlen = basilisk_bobscript(swap->bobpayment.I.rmd160,swap->bobpayment.redeemscript,&swap->bobpayment.I.redeemlen,swap->bobpayment.spendscript,0,&swap->bobpayment.I.locktime,&swap->bobpayment.I.secretstart,&swap->I,0); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); - LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); + //LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); //int32_t i; for (i=0; ibobpayment.I.redeemlen; i++) // printf("%02x",swap->bobpayment.redeemscript[i]); //printf(" <- bobpayment redeem %d %s\n",i,swap->bobpayment.I.destaddr); @@ -1240,7 +1306,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); - LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); + //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); //int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); @@ -1349,7 +1415,7 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d else { bitcoin_address(swap->alicepayment.I.destaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); - LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); + //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); if ( strcmp(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr) != 0 ) printf("alice addr mismatch %s vs %s\n",swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); retval = 0; @@ -1357,7 +1423,7 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created.(%s)\n",swap->alicepayment.I.destaddr); LP_unspents_mark(swap->alicecoin.symbol,swap->alicepayment.vins); - LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); + //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); //basilisk_txlog(swap,&swap->alicepayment,-1); } if ( swap->myfee.I.datalen == 0 ) @@ -1416,7 +1482,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->I.userdata_aliceclaimlen = len; bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); - LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); + //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); printf(" <- bobdeposit.%d %s\n",swap->bobdeposit.I.datalen,bits256_str(str,swap->bobdeposit.I.signedtxid)); @@ -1456,7 +1522,7 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t swap->aliceunconf = 1; basilisk_dontforget_update(swap,&swap->alicepayment); printf("import alicepayment address.(%s)\n",swap->alicepayment.p2shaddr); - LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.p2shaddr); + //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.p2shaddr); return(0); } printf("error validating alicepayment\n"); @@ -1479,7 +1545,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); - LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); + //LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); printf(" <- bobpayment.%d\n",swap->bobpayment.I.datalen); From 9da16dd7d44592d5b3b1cca26ffed411705eea14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 11:14:28 +0300 Subject: [PATCH 121/910] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++++++ iguana/exchanges/mm.c | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5ba9b7c54..e8efb2c5f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -118,6 +118,12 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } + if ( (retstr= basilisk_swaplist()) != 0 ) + { + printf("%s\ngetchar to continue\n",retstr); + getchar(); + free(retstr); + } if ( amclient != 0 ) { while ( 1 ) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index c69d170f0..080fb7325 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -829,12 +829,6 @@ int main(int argc, const char * argv[]) printf("error launching LP_main (%s)\n",jprint(retjson,0)); exit(-1); } else printf("(%s) launched.(%s)\n",argv[1],passphrase); - if ( (0) && (retstr= basilisk_swaplist()) != 0 ) - { - printf("%s\ngetchar to continue\n",retstr); - getchar(); - free(retstr); - } incr = 100.; while ( (0) && IAMCLIENT != 0 ) { From b1ad213cc3f59ab614822c634faaff0735172c0c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 11:26:02 +0300 Subject: [PATCH 122/910] Test --- iguana/exchanges/LP_transaction.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index c1dc15549..823925587 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -23,7 +23,7 @@ bits256 LP_broadcast(char *txname,char *symbol,char *txbytes) { char *retstr; bits256 txid; int32_t i,sentflag = 0; memset(&txid,0,sizeof(txid)); - for (i=0; i<3; i++) + for (i=0; i<1; i++) { if ( (retstr= LP_sendrawtransaction(symbol,txbytes)) != 0 ) { @@ -877,7 +877,7 @@ char *basilisk_swap_Aspend(char *name,char *symbol,uint8_t pubtype,uint8_t p2sht for (i=0; i<32; i++) privBn.bytes[i] = rev.bytes[31 - i];*/ txfee = LP_txfee(symbol); - signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,vout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,0); + signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,vout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1); } return(signedtx); } From 360039ba06e73b6795aec6a76857f5172d194efd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 11:38:43 +0300 Subject: [PATCH 123/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ---- iguana/exchanges/LP_remember.c | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e8efb2c5f..6dcdb2bb7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -119,11 +119,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } if ( (retstr= basilisk_swaplist()) != 0 ) - { - printf("%s\ngetchar to continue\n",retstr); - getchar(); free(retstr); - } if ( amclient != 0 ) { while ( 1 ) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index c58cc2ea5..bf9d34b82 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -50,7 +50,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx LP_swap_coinaddr(swap,&swap->bobcoin,coinaddr,rawtx->txbytes,rawtx->I.datalen); if ( coinaddr[0] != 0 ) { - //LP_importaddress(swap->bobcoin.symbol,coinaddr); + LP_importaddress(swap->bobcoin.symbol,coinaddr); if ( rawtx == &swap->bobdeposit ) safecopy(swap->Bdeposit,coinaddr,sizeof(swap->Bdeposit)); else safecopy(swap->Bpayment,coinaddr,sizeof(swap->Bpayment)); @@ -72,7 +72,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx if ( bits256_nonz(swap->I.pubAm) != 0 && bits256_nonz(swap->I.pubBn) != 0 ) { basilisk_alicescript(redeemscript,&len,script,0,coinaddr,swap->alicecoin.p2shtype,swap->I.pubAm,swap->I.pubBn); - //LP_importaddress(swap->alicecoin.symbol,coinaddr); + LP_importaddress(swap->alicecoin.symbol,coinaddr); fprintf(fp,",\"Apayment\":\"%s\"",coinaddr); } if ( rawtx->I.redeemlen > 0 ) From 4d210dc76e19a51a7e57c06f4427fd467bf432ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 12:09:59 +0300 Subject: [PATCH 124/910] Test --- iguana/exchanges/LP_commands.c | 12 +++++++++++- iguana/exchanges/LP_remember.c | 29 +++++++++++++++++++++++++++++ iguana/exchanges/LP_swap.c | 24 +++++++++--------------- iguana/exchanges/LP_transaction.c | 2 +- iguana/exchanges/status | 2 ++ 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100755 iguana/exchanges/status diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 12b1d8fe4..947a34131 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -276,7 +276,17 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port return(jprint(LP_tradecandidates(utxo,coin),1)); else return(jprint(LP_autotrade(utxo,coin,jdouble(argjson,"maxprice")),1)); } - } + } + else if ( strcmp(method,"swapstatus") == 0 ) + { + uint32_t requestid,quoteid; + if ( (requestid= juint(argjson,"requestid")) != 0 && (quoteid= juint(argjson,"quoteid")) != 0 ) + { + if ( (retstr= basilisk_swapfinished(requestid,quoteid)) == 0 ) + return(clonestr("{\"result\":\"swap pending\"}")); + else return(retstr); + } else return(basilisk_swaplist()); + } } amclient = (LP_mypeer == 0); if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index bf9d34b82..bb82d6dcf 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -952,3 +952,32 @@ char *basilisk_swaplist() return(jprint(retjson,1)); } +char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) +{ + char *liststr,*retstr = 0; cJSON *array,*item; int32_t i,n; + if ( (liststr= basilisk_swaplist()) != 0 ) + { + if ( (array= cJSON_Parse(liststr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; ibobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); - printf("looping on swaplist\n"); - while ( 1 ) + printf("wait for SWAP to complete\n"); + while ( (retstr= basilisk_swapfinished(swap->I.req.requestid,swap->I.req.quoteid)) == 0 ) { - if ( (retstr= basilisk_swaplist()) != 0 ) - { - printf("%s\n",retstr); - free(retstr); - } sleep(100); } + printf("SWAP completed! %u-%u %s\n",swap->I.req.requestid,swap->I.req.quoteid,retstr); + free(retstr); } } basilisk_swap_finished(swap); @@ -709,16 +706,13 @@ void LP_aliceloop(void *_qp) printf("error waiting for bobpayment\n"); else { - printf("looping on swaplist\n"); - while ( 1 ) + printf("wait for SWAP to complete\n"); + while ( (retstr= basilisk_swapfinished(swap->I.req.requestid,swap->I.req.quoteid)) == 0 ) { - if ( (retstr= basilisk_swaplist()) != 0 ) - { - printf("%s\n",retstr); - free(retstr); - } sleep(100); } + printf("SWAP completed! %u-%u %s\n",swap->I.req.requestid,swap->I.req.quoteid,retstr); + free(retstr); } } basilisk_swap_finished(swap); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 823925587..6c5e68e95 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -135,7 +135,7 @@ int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 se return(0); while ( errs == 0 && *indp < 0 ) { - printf("search %s ht.%d\n",symbol,loadheight); + //printf("search %s ht.%d\n",symbol,loadheight); if ( (blockjson= LP_blockjson(&h,symbol,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) diff --git a/iguana/exchanges/status b/iguana/exchanges/status new file mode 100755 index 000000000..7e7b4bb0e --- /dev/null +++ b/iguana/exchanges/status @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"swapstatus\"}" From 4db426791faf242970b750049c6ab9fc7e918c82 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 12:13:55 +0300 Subject: [PATCH 125/910] Test --- iguana/exchanges/LP_remember.c | 1 + iguana/exchanges/swapstatus | 2 ++ 2 files changed, 3 insertions(+) create mode 100755 iguana/exchanges/swapstatus diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index bb82d6dcf..0ac108199 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -964,6 +964,7 @@ char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) for (i=0; i Date: Tue, 6 Jun 2017 12:16:39 +0300 Subject: [PATCH 126/910] Test --- iguana/exchanges/LP_remember.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 0ac108199..d393f599f 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -954,12 +954,12 @@ char *basilisk_swaplist() char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) { - char *liststr,*retstr = 0; cJSON *array,*item; int32_t i,n; + char *liststr,*retstr = 0; cJSON *retjson,*array,*item; int32_t i,n; if ( (liststr= basilisk_swaplist()) != 0 ) { - if ( (array= cJSON_Parse(liststr)) != 0 ) + if ( (retjson= cJSON_Parse(liststr)) != 0 ) { - if ( (n= cJSON_GetArraySize(array)) > 0 ) + if ( (array= jarray(&n,retjson,"swaps")) != 0 ) { for (i=0; i Date: Tue, 6 Jun 2017 12:17:54 +0300 Subject: [PATCH 127/910] Test --- iguana/exchanges/LP_remember.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index d393f599f..b41c60722 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -964,7 +964,7 @@ char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) for (i=0; i Date: Tue, 6 Jun 2017 12:18:44 +0300 Subject: [PATCH 128/910] Test --- iguana/exchanges/LP_remember.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index b41c60722..2059fdad5 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -964,7 +964,7 @@ char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) for (i=0; i Date: Tue, 6 Jun 2017 12:19:49 +0300 Subject: [PATCH 129/910] Test --- iguana/exchanges/LP_remember.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 2059fdad5..a830bfe2e 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -914,7 +914,7 @@ char *basilisk_swaplist() if ( (item= basilisk_remember(KMDtotals,BTCtotals,requestid,quoteid)) != 0 ) { jaddi(array,item); - if ( 1 && (status= jstr(item,"status")) != 0 && strcmp(status,"pending") == 0 ) + if ( (status= jstr(item,"status")) != 0 && strcmp(status,"pending") == 0 ) break; } } From 5206483da98c2afd70ec8e56b81b3402480d2dbc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 12:33:35 +0300 Subject: [PATCH 130/910] Test --- iguana/exchanges/LP_commands.c | 7 ++--- iguana/exchanges/LP_remember.c | 11 ++++---- iguana/exchanges/LP_swap.c | 48 ++++++++++++++++++++++------------ 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 947a34131..aa074832b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -281,11 +281,8 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { uint32_t requestid,quoteid; if ( (requestid= juint(argjson,"requestid")) != 0 && (quoteid= juint(argjson,"quoteid")) != 0 ) - { - if ( (retstr= basilisk_swapfinished(requestid,quoteid)) == 0 ) - return(clonestr("{\"result\":\"swap pending\"}")); - else return(retstr); - } else return(basilisk_swaplist()); + return(basilisk_swapentry(requestid,quoteid)); + else return(basilisk_swaplist()); } } amclient = (LP_mypeer == 0); diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index a830bfe2e..1756b86a7 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -888,7 +888,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti char *basilisk_swaplist() { - char fname[512],*status; FILE *fp; cJSON *item,*retjson,*array,*totalsobj; uint32_t quoteid,requestid; int64_t KMDtotals[16],BTCtotals[16],Btotal,Ktotal; int32_t i; + char fname[512]; FILE *fp; cJSON *item,*retjson,*array,*totalsobj; uint32_t quoteid,requestid; int64_t KMDtotals[16],BTCtotals[16],Btotal,Ktotal; int32_t i; memset(KMDtotals,0,sizeof(KMDtotals)); memset(BTCtotals,0,sizeof(BTCtotals)); //,statebits; int32_t optionduration; struct basilisk_request R; bits256 privkey; @@ -914,8 +914,8 @@ char *basilisk_swaplist() if ( (item= basilisk_remember(KMDtotals,BTCtotals,requestid,quoteid)) != 0 ) { jaddi(array,item); - if ( (status= jstr(item,"status")) != 0 && strcmp(status,"pending") == 0 ) - break; + //if ( (status= jstr(item,"status")) != 0 && strcmp(status,"pending") == 0 ) + // break; } } } @@ -952,7 +952,7 @@ char *basilisk_swaplist() return(jprint(retjson,1)); } -char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) +char *basilisk_swapentry(uint32_t requestid,uint32_t quoteid) { char *liststr,*retstr = 0; cJSON *retjson,*array,*item; int32_t i,n; if ( (liststr= basilisk_swaplist()) != 0 ) @@ -967,8 +967,7 @@ char *basilisk_swapfinished(uint32_t requestid,uint32_t quoteid) //printf("(%s) check r%u/q%u\n",jprint(item,0),juint(item,"requestid"),juint(item,"quoteid")); if ( juint(item,"requestid") == requestid && juint(item,"quoteid") == quoteid ) { - if ( jstr(item,"status") != 0 && strcmp(jstr(item,"status"),"finished") == 0 ) - retstr = jprint(item,0); + retstr = jprint(item,0); break; } } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 21ad1fa48..f512b294e 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -617,9 +617,37 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 return(0); } +int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t sleeptime) +{ + char *retstr; cJSON *retjson=0; uint32_t expiration = (uint32_t)(time(NULL) + duration); + printf("wait %d:%d for SWAP.(r%u/q%u) to complete\n",duration,sleeptime,requestid,quoteid); + while ( time(NULL) < expiration ) + { + sleep(3); + if ( (retstr= basilisk_swapentry(requestid,quoteid)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jstr(retjson,"status") != 0 && strcmp(jstr(retjson,"status"),"finished") == 0 ) + break; + free_json(retjson); + retjson = 0; + } + free(retstr); + } + sleep(sleeptime); + } + if ( retjson != 0 ) + { + printf("SWAP completed! %u-%u %s\n",requestid,quoteid,jprint(retjson,0)); + free_json(retjson); + return(0); + } else return(-1); +} + void LP_bobloop(void *_utxo) { - uint8_t *data; int32_t maxlen; char *retstr; uint32_t expiration; struct basilisk_swap *swap; struct LP_utxoinfo *utxo = _utxo; + uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap; struct LP_utxoinfo *utxo = _utxo; fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -658,13 +686,7 @@ void LP_bobloop(void *_utxo) swap->bobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); - printf("wait for SWAP to complete\n"); - while ( (retstr= basilisk_swapfinished(swap->I.req.requestid,swap->I.req.quoteid)) == 0 ) - { - sleep(100); - } - printf("SWAP completed! %u-%u %s\n",swap->I.req.requestid,swap->I.req.quoteid,retstr); - free(retstr); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } basilisk_swap_finished(swap); @@ -677,7 +699,7 @@ void LP_bobloop(void *_utxo) void LP_aliceloop(void *_qp) { - uint8_t *data; char *retstr; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = 0; struct LP_quoteinfo *qp = _qp; + uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = 0; struct LP_quoteinfo *qp = _qp; fprintf(stderr,"start swap iamalice pair.%d\n",qp->pair); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -706,13 +728,7 @@ void LP_aliceloop(void *_qp) printf("error waiting for bobpayment\n"); else { - printf("wait for SWAP to complete\n"); - while ( (retstr= basilisk_swapfinished(swap->I.req.requestid,swap->I.req.quoteid)) == 0 ) - { - sleep(100); - } - printf("SWAP completed! %u-%u %s\n",swap->I.req.requestid,swap->I.req.quoteid,retstr); - free(retstr); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } basilisk_swap_finished(swap); From 907351af5c17ff122a6023e109336cd9f80dc11a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:10:00 +0300 Subject: [PATCH 131/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- iguana/exchanges/LP_remember.c | 2 ++ iguana/exchanges/LP_swap.c | 25 ++++++++++++++++++------- iguana/exchanges/LP_transaction.c | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6dcdb2bb7..d807a391a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -32,7 +32,7 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", -portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex; +portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex; int32_t LP_mypubsock = -1; int32_t Client_connections; int32_t USERPASS_COUNTER,IAMCLIENT = 0; @@ -267,6 +267,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit portable_mutex_init(&LP_peermutex); portable_mutex_init(&LP_utxomutex); portable_mutex_init(&LP_commandmutex); + portable_mutex_init(&LP_swaplistmutex); portable_mutex_init(&LP_cachemutex); if ( amclient == 0 ) { diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 1756b86a7..485a71086 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -889,6 +889,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti char *basilisk_swaplist() { char fname[512]; FILE *fp; cJSON *item,*retjson,*array,*totalsobj; uint32_t quoteid,requestid; int64_t KMDtotals[16],BTCtotals[16],Btotal,Ktotal; int32_t i; + portable_mutex_lock(&LP_swaplistmutex); memset(KMDtotals,0,sizeof(KMDtotals)); memset(BTCtotals,0,sizeof(BTCtotals)); //,statebits; int32_t optionduration; struct basilisk_request R; bits256 privkey; @@ -949,6 +950,7 @@ char *basilisk_swaplist() jaddi(array,linfo_json(&myinfo->linfos[i])); } jadd(retjson,"quotes",array);*/ + portable_mutex_unlock(&LP_swaplistmutex); return(jprint(retjson,1)); } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f512b294e..f6195d74b 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -677,15 +677,17 @@ void LP_bobloop(void *_utxo) printf("error sending bobdeposit\n"); else if ( LP_waitfor(utxo->pair,swap,10,LP_verify_alicepayment) < 0 ) printf("error waiting for alicepayment\n"); - else if ( basilisk_bobscripts_set(swap,0,1) < 0 ) - printf("error bobscripts payment\n"); - else if ( LP_swapdata_rawtxsend(utxo->pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) - printf("error sending bobpayment\n"); else { swap->bobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); + while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + sleep(3); + if ( basilisk_bobscripts_set(swap,0,1) < 0 ) + printf("error bobscripts payment\n"); + else if ( LP_swapdata_rawtxsend(utxo->pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) + printf("error sending bobpayment\n"); LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } @@ -724,11 +726,20 @@ void LP_aliceloop(void *_qp) printf("error waiting for bobdeposit\n"); else if ( LP_swapdata_rawtxsend(qp->pair,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0) == 0 ) printf("error sending alicepayment\n"); - else if ( LP_waitfor(qp->pair,swap,10,LP_verify_bobpayment) < 0 ) - printf("error waiting for bobpayment\n"); else { - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); + while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + sleep(3); + if ( LP_waitfor(qp->pair,swap,10,LP_verify_bobpayment) < 0 ) + printf("error waiting for bobpayment\n"); + else + { + while ( LP_numconfirms(swap,&swap->bobpayment) < 1 ) + sleep(3); + if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x0,0) == 0 ) + printf("error sending alicepayment\n"); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); + } } } basilisk_swap_finished(swap); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 6c5e68e95..cf541426b 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -79,7 +79,7 @@ uint64_t oldLP_txvalue(char *symbol,bits256 txid,int32_t vout) { if ( (interest= jdouble(utxoobj,"interest")) != 0. ) { - printf("add interest of %.8f to %.8f\n",interest,dstr(value)); + //printf("add interest of %.8f to %.8f\n",interest,dstr(value)); value += SATOSHIDEN * interest; } free_json(utxoobj); @@ -104,7 +104,7 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) { if ( (interest= jdouble(txobj,"interest")) != 0. ) { - printf("add interest of %.8f to %.8f\n",interest,dstr(value)); + //printf("add interest of %.8f to %.8f\n",interest,dstr(value)); value += SATOSHIDEN * interest; } } From 5788f9da498d7478e978064709d95006ffe91940 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:14:27 +0300 Subject: [PATCH 132/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_swap.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index ae1b1a4a0..08b7c602b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -35,7 +35,7 @@ #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" #define BASILISK_DISABLEWAITTX -//#define BASILISK_DISABLESENDTX +#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f6195d74b..9972d0b11 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -736,8 +736,8 @@ void LP_aliceloop(void *_qp) { while ( LP_numconfirms(swap,&swap->bobpayment) < 1 ) sleep(3); - if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x0,0) == 0 ) - printf("error sending alicepayment\n"); + if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) + printf("error sending alicespend\n"); LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } From 20b296840e3f51604262514a16d26db5af44961a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:24:07 +0300 Subject: [PATCH 133/910] Test --- iguana/exchanges/LP_include.h | 4 ++-- iguana/exchanges/LP_transaction.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 08b7c602b..5ef70aa5f 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -34,8 +34,8 @@ #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" -#define BASILISK_DISABLEWAITTX -#define BASILISK_DISABLESENDTX +//#define BASILISK_DISABLEWAITTX +//#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index cf541426b..f9e180106 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -182,7 +182,7 @@ int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) int32_t numconfirms = 100; #ifndef BASILISK_DISABLEWAITTX cJSON *txobj; - if ( (txobj= LP_gettx(symbol,txid)) != 0 ) + if ( (txobj= LP_gettx(rawtx->coin->symbol,rawtx->I.signedtxid)) != 0 ) { numconfirms = jint(txobj,"confirmations"); free_json(txobj); From 2daa5c2c8370ccc2738f5717721f8380d37e7f22 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:47:20 +0300 Subject: [PATCH 134/910] Test --- iguana/exchanges/LP_transaction.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index f9e180106..6cee86cae 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -19,9 +19,9 @@ // -bits256 LP_broadcast(char *txname,char *symbol,char *txbytes) +bits256 LP_broadcast(char *txname,char *symbol,char *txbytes,bits256 expectedtxid) { - char *retstr; bits256 txid; int32_t i,sentflag = 0; + char *retstr; bits256 txid; cJSON *retjson,*errorobj; int32_t i,sentflag = 0; memset(&txid,0,sizeof(txid)); for (i=0; i<1; i++) { @@ -32,6 +32,15 @@ bits256 LP_broadcast(char *txname,char *symbol,char *txbytes) decode_hex(txid.bytes,32,retstr); sentflag = 1; } + else if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (errorobj= jobj(retjson,"error")) != 0 ) + { + if ( jint(errorobj,"code") == -27 ) // "transaction already in block chain" + txid = expectedtxid; + } + free_json(retjson); + } char str[65]; printf("[%s] %s RETSTR.(%s) %s.%s\n",txname,txbytes,retstr,symbol,bits256_str(str,txid)); free(retstr); } @@ -49,11 +58,11 @@ bits256 LP_broadcast_tx(char *name,char *symbol,uint8_t *data,int32_t datalen) { signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); -#ifdef BASILISK_DISABLESENDTX txid = bits256_doublesha256(0,data,datalen); +#ifdef BASILISK_DISABLESENDTX char str[65]; printf("%s <- dont sendrawtransaction (%s) %s\n",name,bits256_str(str,txid),signedtx); #else - txid = LP_broadcast(name,symbol,signedtx); + txid = LP_broadcast(name,symbol,signedtx,txid); #endif free(signedtx); } From 0b6b75ea53bdb88746d038b2c0ef02bc0948804d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:48:41 +0300 Subject: [PATCH 135/910] test --- iguana/exchanges/LP_swap.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 9972d0b11..73496a944 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -683,7 +683,10 @@ void LP_bobloop(void *_utxo) swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + { + printf("waiting for alicepayment to confirm\n"); sleep(3); + } if ( basilisk_bobscripts_set(swap,0,1) < 0 ) printf("error bobscripts payment\n"); else if ( LP_swapdata_rawtxsend(utxo->pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) @@ -729,13 +732,19 @@ void LP_aliceloop(void *_qp) else { while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + { + printf("waiting for alicepayment to confirm\n"); sleep(3); + } if ( LP_waitfor(qp->pair,swap,10,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); else { while ( LP_numconfirms(swap,&swap->bobpayment) < 1 ) + { + printf("waiting for bobpayment to confirm\n"); sleep(3); + } if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); From 1070732f650921db9bcc9cd90f3985db175b9cb2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:50:12 +0300 Subject: [PATCH 136/910] Test --- iguana/exchanges/LP_remember.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index 485a71086..dc02a419b 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -636,7 +636,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_ALICESPEND] != 0 ) { - txids[BASILISK_ALICESPEND] = LP_broadcast("alicespend",bobcoin,txbytes[BASILISK_ALICESPEND]); + txids[BASILISK_ALICESPEND] = LP_broadcast("alicespend",bobcoin,txbytes[BASILISK_ALICESPEND],zero); if ( bits256_nonz(txids[BASILISK_ALICESPEND]) != 0 ) // tested { sentflags[BASILISK_ALICESPEND] = 1; @@ -661,7 +661,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_ALICECLAIM] != 0 ) { - txids[BASILISK_ALICECLAIM] = LP_broadcast("aliceclaim",bobcoin,txbytes[BASILISK_ALICECLAIM]); + txids[BASILISK_ALICECLAIM] = LP_broadcast("aliceclaim",bobcoin,txbytes[BASILISK_ALICECLAIM],zero); if ( bits256_nonz(txids[BASILISK_ALICECLAIM]) != 0 ) // tested { sentflags[BASILISK_ALICECLAIM] = 1; @@ -683,7 +683,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_ALICERECLAIM] != 0 ) { - txids[BASILISK_ALICERECLAIM] = LP_broadcast("alicereclaim",alicecoin,txbytes[BASILISK_ALICERECLAIM]); + txids[BASILISK_ALICERECLAIM] = LP_broadcast("alicereclaim",alicecoin,txbytes[BASILISK_ALICERECLAIM],zero); if ( bits256_nonz(txids[BASILISK_ALICERECLAIM]) != 0 ) // tested { sentflags[BASILISK_ALICERECLAIM] = 1; @@ -713,7 +713,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_BOBSPEND] != 0 ) { - txids[BASILISK_BOBSPEND] = LP_broadcast("bobspend",alicecoin,txbytes[BASILISK_BOBSPEND]); + txids[BASILISK_BOBSPEND] = LP_broadcast("bobspend",alicecoin,txbytes[BASILISK_BOBSPEND],zero); if ( bits256_nonz(txids[BASILISK_BOBSPEND]) != 0 ) // tested { sentflags[BASILISK_BOBSPEND] = 1; @@ -742,7 +742,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_BOBRECLAIM] != 0 ) { - txids[BASILISK_BOBRECLAIM] = LP_broadcast("bobreclaim",bobcoin,txbytes[BASILISK_BOBRECLAIM]); + txids[BASILISK_BOBRECLAIM] = LP_broadcast("bobreclaim",bobcoin,txbytes[BASILISK_BOBRECLAIM],zero); if ( bits256_nonz(txids[BASILISK_BOBRECLAIM]) != 0 ) // tested { sentflags[BASILISK_BOBRECLAIM] = 1; @@ -766,7 +766,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( txbytes[BASILISK_BOBREFUND] != 0 ) { - txids[BASILISK_BOBREFUND] = LP_broadcast("bobrefund",bobcoin,txbytes[BASILISK_BOBREFUND]); + txids[BASILISK_BOBREFUND] = LP_broadcast("bobrefund",bobcoin,txbytes[BASILISK_BOBREFUND],zero); if ( bits256_nonz(txids[BASILISK_BOBREFUND]) != 0 ) // tested { sentflags[BASILISK_BOBREFUND] = 1; From 8149c542dcbcbeb9745853c6de2d68fb77fb81e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 13:59:19 +0300 Subject: [PATCH 137/910] Test --- iguana/exchanges/LP_transaction.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 6cee86cae..b99b94919 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -37,7 +37,10 @@ bits256 LP_broadcast(char *txname,char *symbol,char *txbytes,bits256 expectedtxi if ( (errorobj= jobj(retjson,"error")) != 0 ) { if ( jint(errorobj,"code") == -27 ) // "transaction already in block chain" + { txid = expectedtxid; + sentflag = 1; + } } free_json(retjson); } @@ -145,7 +148,7 @@ int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 se while ( errs == 0 && *indp < 0 ) { //printf("search %s ht.%d\n",symbol,loadheight); - if ( (blockjson= LP_blockjson(&h,symbol,0,loadheight)) != 0 ) + if ( (blockjson= LP_blockjson(&h,symbol,0,loadheight)) != 0 && h == loadheight ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) { @@ -177,7 +180,7 @@ int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 se } } free_json(blockjson); - } + } else errs++; loadheight++; } char str[65]; printf("reached %s ht.%d %s/v%d\n",symbol,loadheight,bits256_str(str,*spendtxidp),*indp); From 922009a4c94536747f25df0fdae8fd278487c37f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 14:16:03 +0300 Subject: [PATCH 138/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 12ff20df1..7d1694162 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -221,7 +221,7 @@ char *LP_sendrawtransaction(char *symbol,char *signedtx) jaddistr(array,signedtx); paramstr = jprint(array,1); retstr = bitcoind_passthru(symbol,coin->serverport,coin->userpass,"sendrawtransaction",paramstr); - printf(">>>>>>>>>>> %s dpow_sendrawtransaction.(%s) -> (%s)\n",coin->symbol,paramstr,retstr); + //printf(">>>>>>>>>>> %s dpow_sendrawtransaction.(%s) -> (%s)\n",coin->symbol,paramstr,retstr); free(paramstr); return(retstr); } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 73496a944..fb2089468 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -471,7 +471,7 @@ void LP_swapsfp_update(struct basilisk_request *rp) if ( (swapsfp= fopen(fname,"rb+")) == 0 ) swapsfp = fopen(fname,"wb+"); else fseek(swapsfp,0,SEEK_END); - printf("LIST fp.%p\n",swapsfp); + //printf("LIST fp.%p\n",swapsfp); } if ( swapsfp != 0 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index b99b94919..06fd6bcad 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -494,14 +494,14 @@ int32_t bitcoin_verifyvins(void *ctx,char *symbol,uint8_t pubtype,uint8_t p2shty { flag++; numsigs++; - int32_t z; char tmpaddr[64]; + /*int32_t z; char tmpaddr[64]; for (z=0; zsigners[j].pubkey[z]); bitcoin_address(tmpaddr,60,vp->signers[j].pubkey,33); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d %s\n",vini,j,numsigs,vp->M,tmpaddr); + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d %s\n",vini,j,numsigs,vp->M,tmpaddr);*/ } } if ( numsigs >= vp->M ) @@ -723,7 +723,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch if ( vinaddr != 0 ) bitcoin_addr2rmd160(&addrtype,rmd160,vinaddr); spendlen = bitcoin_p2shspend(spendscript,0,rmd160); - printf("P2SH path.%s\n",vinaddr!=0?vinaddr:0); + //printf("P2SH path.%s\n",vinaddr!=0?vinaddr:0); } else spendlen = bitcoin_standardspend(spendscript,0,rmd160); init_hexbytes_noT(hexstr,spendscript,spendlen); jaddstr(item,"scriptPubKey",hexstr); @@ -788,7 +788,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub { changeaddr = _changeaddr; bitcoin_address(changeaddr,coin->pubtype,changermd160,20); - printf("changeaddr.(%s) vs destaddr.(%s)\n",changeaddr,rawtx->I.destaddr); + //printf("changeaddr.(%s) vs destaddr.(%s)\n",changeaddr,rawtx->I.destaddr); } for (iter=0; iter<2; iter++) { @@ -819,7 +819,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr,uint8_t *changermd160,char *vinaddr) { char *signedtx,*changeaddr = 0,_changeaddr[64]; int64_t txfee,newtxfee=0,destamount; uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; int32_t iter,retval = -1; double estimatedrate; - char str2[65]; printf("%s rawtxsign.(%s/v%d)\n",dest->name,bits256_str(str2,dest->utxotxid),dest->utxovout); + //char str2[65]; printf("%s rawtxsign.(%s/v%d)\n",dest->name,bits256_str(str2,dest->utxotxid),dest->utxovout); timestamp = swap->I.started; if ( dest == &swap->aliceclaim ) locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; From 667a86d5976c27abc4c392ff1f65925cf610e3ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 14:21:29 +0300 Subject: [PATCH 139/910] Test --- iguana/exchanges/LP_swap.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index fb2089468..35ce8f62f 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -747,6 +747,11 @@ void LP_aliceloop(void *_qp) } if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); + while ( LP_numconfirms(swap,&swap->alicespend) < 1 ) + { + printf("waiting for alicespend to confirm\n"); + sleep(3); + } LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } From b3e5f9b993b76b212f9af987f69ca883180c0e3f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 14:32:39 +0300 Subject: [PATCH 140/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/client | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index aa074832b..5d3fd931a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -80,7 +80,7 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); - printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + //printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); @@ -123,7 +123,7 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->mypub) == 0 ) utxo->mypub = LP_pubkey(privkey); - printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); + //printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 261b1d36a..f84982ff2 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From e61ddd4d17de6b55fa9fdcdad23e6064378bbf59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 17:14:09 +0300 Subject: [PATCH 141/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 9 ++++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 5ef70aa5f..15cf24c31 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -169,6 +169,7 @@ struct LP_utxoinfo void *swap; uint64_t value,satoshis,value2; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; + uint8_t key2[sizeof(bits256) + sizeof(int32_t)]; int32_t vout,vout2,pair; uint32_t lasttime,errors,swappending,published,spentflag; double profitmargin; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d807a391a..0b747bb36 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -23,7 +23,7 @@ #include "LP_include.h" #include "LP_network.c" -struct LP_utxoinfo *LP_utxoinfos; +struct LP_utxoinfo *LP_utxoinfos,*LP_utxoinfos2; struct LP_peerinfo *LP_peerinfos,*LP_mypeer; char *activecoins[] = { "BTC", "KMD", "REVS", "JUMBLR" };//"LTC", "USD", }; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7d675cc4d..e7dc260c0 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -43,6 +43,8 @@ struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); portable_mutex_lock(&LP_utxomutex); HASH_FIND(hh,LP_utxoinfos,key,sizeof(key),utxo); + if ( utxo == 0 ) + HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -107,6 +109,8 @@ void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) { cJSON *argjson; utxo->spentflag = (uint32_t)time(NULL); + if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) + LP_mypeer->numutxos--; if ( LP_mypubsock >= 0 ) { argjson = cJSON_CreateObject(); @@ -181,7 +185,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + if ( (utxo= LP_utxofind(txid,vout)) != 0 ) { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) @@ -211,8 +215,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 utxo->value2 = value2; memcpy(utxo->key,txid.bytes,sizeof(txid)); memcpy(&utxo->key[sizeof(txid)],&vout,sizeof(vout)); + memcpy(utxo->key2,txid2.bytes,sizeof(txid2)); + memcpy(&utxo->key2[sizeof(txid2)],&vout2,sizeof(vout2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); + HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); From 9768b5184c6546b3bdd4ead4e11663e9f927c2dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 17:41:40 +0300 Subject: [PATCH 142/910] Test --- iguana/coins/jumblr | 2 +- iguana/coins/revs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/coins/jumblr b/iguana/coins/jumblr index 5b52ce9a6..643fd9dab 100755 --- a/iguana/coins/jumblr +++ b/iguana/coins/jumblr @@ -1,4 +1,4 @@ -~/komodo/src/komodod -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 & +~/komodo/src/komodo/src/komodod -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 & curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"JUMBLR.conf\",\"path\":\"${HOME#"/"}/.komodo/JUMBLR\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"JUMBLR\",\"name\":\"JUMBLR\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"7223759e\",\"p2p\":15105,\"rpc\":15106,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" diff --git a/iguana/coins/revs b/iguana/coins/revs index f2cf9ef72..23f4948b2 100755 --- a/iguana/coins/revs +++ b/iguana/coins/revs @@ -1,3 +1,3 @@ -./komodod -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 & +~/komodo/src/komodod -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 & curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"REVS.conf\",\"path\":\"${HOME#"/"}/.komodo/REVS\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"REVS\",\"name\":\"REVS\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"905c3498\",\"p2p\":10195,\"rpc\":10196,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" From 3a3a733f117e14c1d32a8bd602618275a88dab2f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 17:42:31 +0300 Subject: [PATCH 143/910] Test --- iguana/coins/jumblr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/coins/jumblr b/iguana/coins/jumblr index 643fd9dab..5b52ce9a6 100755 --- a/iguana/coins/jumblr +++ b/iguana/coins/jumblr @@ -1,4 +1,4 @@ -~/komodo/src/komodo/src/komodod -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 & +~/komodo/src/komodod -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 & curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"JUMBLR.conf\",\"path\":\"${HOME#"/"}/.komodo/JUMBLR\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"JUMBLR\",\"name\":\"JUMBLR\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"7223759e\",\"p2p\":15105,\"rpc\":15106,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" From 7ecf3ec6395705f54fa8c561ee22a4200bfab6f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 17:52:32 +0300 Subject: [PATCH 144/910] Test --- iguana/exchanges/LP_rpc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 7d1694162..d07a9c0a8 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -71,6 +71,7 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) retjson = cJSON_Parse(retstr); free(retstr); } + usleep(1000); //printf("dpow_gettxout.(%s)\n",retstr); } return(retjson); From 1f4238afb2508031701aa6e080f607dfcd464fc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:01:29 +0300 Subject: [PATCH 145/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0b747bb36..df8455a39 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -118,8 +118,8 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } - if ( (retstr= basilisk_swaplist()) != 0 ) - free(retstr); + //if ( (retstr= basilisk_swaplist()) != 0 ) + // free(retstr); if ( amclient != 0 ) { while ( 1 ) From 97cfbabb110f91606ac6da1533eb2fc77b08ea51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:16:49 +0300 Subject: [PATCH 146/910] Test --- iguana/exchanges/LP_commands.c | 2 -- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_transaction.c | 2 +- iguana/exchanges/LP_utxos.c | 4 +++- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 5d3fd931a..621c7544b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -80,7 +80,6 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); - //printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); @@ -123,7 +122,6 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->mypub) == 0 ) utxo->mypub = LP_pubkey(privkey); - //printf("GETTXOUT: txid.(%s)\ntxid2.(%s)\n",jprint(LP_gettxout(Q.srccoin,Q.txid,Q.vout),1),jprint(LP_gettxout(Q.srccoin,Q.txid2,Q.vout2),1)); if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index d07a9c0a8..8353f2d23 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -71,7 +71,7 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) retjson = cJSON_Parse(retstr); free(retstr); } - usleep(1000); + //usleep(1000); //printf("dpow_gettxout.(%s)\n",retstr); } return(retjson); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 06fd6bcad..d8703c7b5 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -120,7 +120,7 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) value += SATOSHIDEN * interest; } } - // char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); + char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); free_json(txobj); } return(value); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e7dc260c0..d73707f29 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -131,7 +131,7 @@ char *LP_spentcheck(cJSON *argjson) bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; txid = jbits256(argjson,"txid"); vout = jint(argjson,"vout"); - if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + if ( (utxo= LP_utxofind(txid,vout)) != 0 && utxo->spentflag == 0 ) { if ( jobj(argjson,"check") == 0 ) checktxid = txid, checkvout = vout; @@ -142,6 +142,8 @@ char *LP_spentcheck(cJSON *argjson) } if ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) { + if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) + LP_mypeer->numutxos--; utxo->spentflag = (uint32_t)time(NULL); //printf("indeed txid was spent\n"); return(clonestr("{\"result\":\"marked as spent\"}")); From 88586ccd433cdb7c866146f6dd56a13b6b49baaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:21:13 +0300 Subject: [PATCH 147/910] Test --- iguana/exchanges/LP_nativeDEX.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index df8455a39..da601e7e0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -165,27 +165,25 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i char str[65]; HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { - if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) + if ( utxo->spentflag == 0 ) { - if ( utxo->spentflag == 0 ) + printf("mainloop check spent\n"); + if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); LP_spentnotify(utxo,0); } - } - else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) - { - if ( utxo->spentflag == 0 ) + else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) { printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); LP_spentnotify(utxo,1); } - } - else if ( LP_ismine(utxo) != 0 ) - { - if ( strcmp(utxo->coin,"KMD") == 0 ) - LP_priceping(pubsock,utxo,"BTC",profitmargin); - else LP_priceping(pubsock,utxo,"KMD",profitmargin); + else if ( LP_ismine(utxo) != 0 ) + { + if ( strcmp(utxo->coin,"KMD") == 0 ) + LP_priceping(pubsock,utxo,"BTC",profitmargin); + else LP_priceping(pubsock,utxo,"KMD",profitmargin); + } } } } From 00666b9ec0e5dd5b09d75adc27d0640aeb74b7a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:24:49 +0300 Subject: [PATCH 148/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 15cf24c31..73c57e2fc 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -171,7 +171,7 @@ struct LP_utxoinfo uint8_t key[sizeof(bits256) + sizeof(int32_t)]; uint8_t key2[sizeof(bits256) + sizeof(int32_t)]; int32_t vout,vout2,pair; - uint32_t lasttime,errors,swappending,published,spentflag; + uint32_t lasttime,errors,swappending,published,spentflag,lastspentcheck; double profitmargin; char ipaddr[64],coinaddr[64],spendscript[256],coin[16]; uint16_t port; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index da601e7e0..58c952f0b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -165,9 +165,10 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i char str[65]; HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { - if ( utxo->spentflag == 0 ) + now = (uint32_t)time(NULL); + if ( utxo->spentflag == 0 && now > utxo->lastspentcheck+60 ) { - printf("mainloop check spent\n"); + utxo->lastspentcheck = now; if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); From 877a2537f746b64ce42bc842984ed7904fb055ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:33:49 +0300 Subject: [PATCH 149/910] Test --- iguana/exchanges/LP_nativeDEX.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 58c952f0b..c63d58810 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -159,10 +159,15 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { nonz = 0; if ( (++counter % 2000) == 0 ) + { + printf("start privkey updates\n"); LP_privkey_updates(mypeer,pubsock,passphrase,amclient); + printf("done privkey updates\n"); + } if ( (counter % 500) == 0 ) { char str[65]; + printf("start utxos updates\n"); HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { now = (uint32_t)time(NULL); @@ -187,8 +192,10 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } } } + printf("done utxos updates\n"); } now = (uint32_t)time(NULL); + printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) @@ -227,6 +234,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i nn_freemsg(ptr), ptr = 0; } } + printf("done peers updates\n"); while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; @@ -250,6 +258,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } if ( nonz == 0 ) usleep(50000); + printf("nonz.%d in mainloop\n",nonz); } } } From 198ec880f119f6c870d13d69e1560ed94432d6da Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:38:33 +0300 Subject: [PATCH 150/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c63d58810..2bafb4aa8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -174,7 +174,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( utxo->spentflag == 0 && now > utxo->lastspentcheck+60 ) { utxo->lastspentcheck = now; - if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) + /*if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); LP_spentnotify(utxo,0); @@ -184,7 +184,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); LP_spentnotify(utxo,1); } - else if ( LP_ismine(utxo) != 0 ) + else*/ if ( LP_ismine(utxo) != 0 ) { if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); From ad44a6dc188bddb1f8ae9cc1dea79195e3676492 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:39:10 +0300 Subject: [PATCH 151/910] 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 2bafb4aa8..5def5812d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -166,7 +166,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } if ( (counter % 500) == 0 ) { - char str[65]; + //char str[65]; printf("start utxos updates\n"); HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { From bbd8347be68e8ba309ff3acf1e58118d466d89ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:43:03 +0300 Subject: [PATCH 152/910] 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 5def5812d..b405770ef 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -166,15 +166,16 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } if ( (counter % 500) == 0 ) { - //char str[65]; + char str[65]; printf("start utxos updates\n"); HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { now = (uint32_t)time(NULL); + printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); if ( utxo->spentflag == 0 && now > utxo->lastspentcheck+60 ) { utxo->lastspentcheck = now; - /*if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) + if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) { printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); LP_spentnotify(utxo,0); @@ -184,7 +185,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); LP_spentnotify(utxo,1); } - else*/ if ( LP_ismine(utxo) != 0 ) + else if ( LP_ismine(utxo) != 0 ) { if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); @@ -198,6 +199,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { + printf("updatepeer.%s lag.%d\n",now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { peer->lastpeers = now; @@ -224,7 +226,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); @@ -246,7 +248,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + printf("%s PULL.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } } From 6ac3c87206c590cf27254c2871072e6747734b74 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:43:58 +0300 Subject: [PATCH 153/910] 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 b405770ef..bb0b2bf2f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -199,7 +199,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("updatepeer.%s lag.%d\n",now-peer->lastpeers); + printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { peer->lastpeers = now; From 1cf217d6ded04417aa14d94a8f6a2365675c7285 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:50:33 +0300 Subject: [PATCH 154/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index bb0b2bf2f..058207246 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -164,7 +164,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i LP_privkey_updates(mypeer,pubsock,passphrase,amclient); printf("done privkey updates\n"); } - if ( (counter % 500) == 0 ) + if ( 0 && (counter % 500) == 0 ) { char str[65]; printf("start utxos updates\n"); @@ -199,6 +199,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { + break; printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { @@ -237,7 +238,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } } printf("done peers updates\n"); - while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( 0 && pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) From 8d14c3dcb2ebb45bfcc459a2eac268889928a7ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 18:53:40 +0300 Subject: [PATCH 155/910] 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 058207246..3f9406c65 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -199,7 +199,6 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - break; printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { From 1ddcaa9c9d9584f2b6c1455bb0fdc7d9d5ed1e44 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:13:27 +0300 Subject: [PATCH 156/910] Test --- iguana/exchanges/LP_nativeDEX.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3f9406c65..0a4e72094 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -164,14 +164,14 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i LP_privkey_updates(mypeer,pubsock,passphrase,amclient); printf("done privkey updates\n"); } - if ( 0 && (counter % 500) == 0 ) + if ( (counter % 500) == 0 ) { char str[65]; - printf("start utxos updates\n"); + //printf("start utxos updates\n"); HASH_ITER(hh,LP_utxoinfos,utxo,utmp) { now = (uint32_t)time(NULL); - printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); + //printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); if ( utxo->spentflag == 0 && now > utxo->lastspentcheck+60 ) { utxo->lastspentcheck = now; @@ -193,13 +193,13 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } } } - printf("done utxos updates\n"); + //printf("done utxos updates\n"); } now = (uint32_t)time(NULL); - printf("start peers updates\n"); + //printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); + //printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) { peer->lastpeers = now; @@ -236,8 +236,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i nn_freemsg(ptr), ptr = 0; } } - printf("done peers updates\n"); - while ( 0 && pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) @@ -260,7 +259,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } if ( nonz == 0 ) usleep(50000); - printf("nonz.%d in mainloop\n",nonz); + //printf("nonz.%d in mainloop\n",nonz); } } } From e7c625cf43346cb40dccf58986064281717fa558 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:16:37 +0300 Subject: [PATCH 157/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- iguana/exchanges/LP_utxos.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index d8703c7b5..b976dbb71 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -120,7 +120,7 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) value += SATOSHIDEN * interest; } } - char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); + //char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); free_json(txobj); } return(value); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index d73707f29..90034077d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -403,6 +403,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb used = 0; while ( used < n ) { + printf("used.%d of n.%d\n",used,n); if ( (i= LP_maxvalue(values,n)) >= 0 ) { item = jitem(array,i); From b13d57eaac871d6e3b230bd8a087c1fb103e0303 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:20:07 +0300 Subject: [PATCH 158/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 90034077d..54d517829 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -401,7 +401,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } //printf("array.%d\n",n); used = 0; - while ( used < n ) + while ( used < n-1 ) { printf("used.%d of n.%d\n",used,n); if ( (i= LP_maxvalue(values,n)) >= 0 ) @@ -444,6 +444,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } free_json(array); } + printf("privkey.%s %.8f\n",symbol,dstr(total)); return(total); } From 5ce716cbf3a0b3ea08bd98cdfe97e1149128cdd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:22:48 +0300 Subject: [PATCH 159/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 -- iguana/exchanges/LP_utxos.c | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0a4e72094..6e6398d2b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -160,9 +160,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i nonz = 0; if ( (++counter % 2000) == 0 ) { - printf("start privkey updates\n"); LP_privkey_updates(mypeer,pubsock,passphrase,amclient); - printf("done privkey updates\n"); } if ( (counter % 500) == 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 54d517829..1a0a9e196 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -368,6 +368,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("cant add privkey for %s, coin not active\n",symbol); return(0); } + printf("privkey.%s init\n",symbol); if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else privkey = iguana_wif2privkey(wifstr); From c82413cf688313bfa6c8934d212988fc95d5d226 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:27:45 +0300 Subject: [PATCH 160/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/mm.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 621c7544b..ddfbdc85c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -256,7 +256,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( strcmp(method,"inventory") == 0 ) { - LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); + //LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); return(LP_inventory(coin)); } else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 080fb7325..638acc5e8 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -818,8 +818,8 @@ void LP_main(void *ptr) int main(int argc, const char * argv[]) { char *base,*rel,*name,*exchange,*apikey,*apisecret,*blocktrail,*retstr,*baseaddr,*reladdr,*passphrase; - double profitmargin,maxexposure,incrratio,start_rel,start_base,minask,maxbid,incr,theoretical = 0.; - cJSON *retjson,*loginjson,*matchjson; int32_t i; + double profitmargin,maxexposure,incrratio,start_rel,start_base,minask,maxbid,incr; + cJSON *retjson,*loginjson; int32_t i; if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { if ( (passphrase= jstr(retjson,"passphrase")) == 0 ) @@ -830,7 +830,7 @@ int main(int argc, const char * argv[]) exit(-1); } else printf("(%s) launched.(%s)\n",argv[1],passphrase); incr = 100.; - while ( (0) && IAMCLIENT != 0 ) + /*while ( (0) && IAMCLIENT != 0 ) { theoretical = marketmaker_updateprice("komodo","REVS","KMD",theoretical,&incr); sleep(3); @@ -845,7 +845,7 @@ int main(int argc, const char * argv[]) } } sleep(1000); - } + }*/ while ( 1 ) sleep(1); profitmargin = jdouble(retjson,"profitmargin"); From cee16d48c0185e16f52d936eb3b9e3b178ebb851 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:39:45 +0300 Subject: [PATCH 161/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 1a0a9e196..a0bd6bb8f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -324,6 +324,7 @@ char *LP_inventory(char *symbol) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos,utxo,tmp) { + char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && (IAMCLIENT != 0 || LP_ismine(utxo) != 0) ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } From 1c41483cc8b6855bfc1112b7ce0e542f25f21ad8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:45:26 +0300 Subject: [PATCH 162/910] Test --- iguana/exchanges/LP_utxos.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a0bd6bb8f..7b5f63556 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -43,8 +43,17 @@ struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); portable_mutex_lock(&LP_utxomutex); HASH_FIND(hh,LP_utxoinfos,key,sizeof(key),utxo); - if ( utxo == 0 ) - HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + portable_mutex_unlock(&LP_utxomutex); + return(utxo); +} + +struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; + memcpy(key,txid.bytes,sizeof(txid)); + memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); + portable_mutex_lock(&LP_utxomutex); + HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -221,7 +230,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 memcpy(&utxo->key2[sizeof(txid2)],&vout2,sizeof(vout2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); - HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); + if ( LP_utxo2find(txid2,vout2) == 0 ) + HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); From 7b2d3d9c5bb25f0300e0ae3a9876ab44414e2578 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:48:02 +0300 Subject: [PATCH 163/910] 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 7b5f63556..6fd04fe4c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -196,7 +196,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("LP node got localhost utxo\n"); return(0); } - if ( (utxo= LP_utxofind(txid,vout)) != 0 ) + if ( (utxo= LP_utxofind(txid,vout)) != 0 || (utxo= LP_utxo2find(txid,vout)) != 0 ) { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) From 32ac1fe98012c81462e064df86095735a7827a6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:52:46 +0300 Subject: [PATCH 164/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_utxos.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 73c57e2fc..0e9e37d89 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -140,7 +140,7 @@ struct basilisk_swapinfo struct iguana_info { uint64_t txfee; double estimatedrate; - int32_t longestchain; + int32_t longestchain; uint32_t counter; uint8_t pubtype,p2shtype,isPoS,wiftype; char symbol[16],smartaddr[64],userpass[1024],serverport[128]; }; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6fd04fe4c..d921c84c7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -372,22 +372,20 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t amclient) { - static uint32_t counter; char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); if ( coin == 0 ) { printf("cant add privkey for %s, coin not active\n",symbol); return(0); } - printf("privkey.%s init\n",symbol); if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else privkey = iguana_wif2privkey(wifstr); iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); - if ( counter == 0 ) + if ( coin->counter == 0 ) { char tmpstr[128]; - counter++; + coin->counter++; bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); conv_NXTpassword(userpass.bytes,pubkey.bytes,(uint8_t *)tmpstr,(int32_t)strlen(tmpstr)); From 22a19f347115cf881466592b8d2a9f9f1ec5fb49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:53:19 +0300 Subject: [PATCH 165/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index ddfbdc85c..621c7544b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -256,7 +256,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( strcmp(method,"inventory") == 0 ) { - //LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); + LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); return(LP_inventory(coin)); } else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) From 3901aa05eec68a5d44065f144b539e45e50ae327 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:58:32 +0300 Subject: [PATCH 166/910] Test --- iguana/exchanges/LP_utxos.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index d921c84c7..ea862d209 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -378,6 +378,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("cant add privkey for %s, coin not active\n",symbol); return(0); } + printf("privkey init.(%s) %s\n",symbol,coin->symbol); if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else privkey = iguana_wif2privkey(wifstr); @@ -413,7 +414,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb used = 0; while ( used < n-1 ) { - printf("used.%d of n.%d\n",used,n); + //printf("used.%d of n.%d\n",used,n); if ( (i= LP_maxvalue(values,n)) >= 0 ) { item = jitem(array,i); @@ -454,7 +455,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } free_json(array); } - printf("privkey.%s %.8f\n",symbol,dstr(total)); + //printf("privkey.%s %.8f\n",symbol,dstr(total)); return(total); } From c443a67150ae7baa4cc7c55f7a1d9806ca468ed4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 19:59:46 +0300 Subject: [PATCH 167/910] Test --- iguana/exchanges/LP_utxos.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index ea862d209..59a678965 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -463,7 +463,10 @@ void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphr { int32_t i; for (i=0; i Date: Tue, 6 Jun 2017 20:00:45 +0300 Subject: [PATCH 168/910] 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 59a678965..32cc98a73 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -455,7 +455,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } free_json(array); } - //printf("privkey.%s %.8f\n",symbol,dstr(total)); + printf("privkey.%s %.8f\n",symbol,dstr(total)); return(total); } From bdd4c3665cec68f5021e32e1bf5670c5f54df79d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:01:55 +0300 Subject: [PATCH 169/910] 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 32cc98a73..b62cd6708 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -228,6 +228,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 memcpy(&utxo->key[sizeof(txid)],&vout,sizeof(vout)); memcpy(utxo->key2,txid2.bytes,sizeof(txid2)); memcpy(&utxo->key2[sizeof(txid2)],&vout2,sizeof(vout2)); + char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); if ( LP_utxo2find(txid2,vout2) == 0 ) @@ -237,7 +238,6 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); } return(utxo); } From 6ecba8169c30ccaf8389bdb6d09e907b4420a985 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:03:02 +0300 Subject: [PATCH 170/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b62cd6708..0a4e26b6d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -236,6 +236,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); + printf("added\n"); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); } From d5151f8ecd992e0a110faacbe6d44373fbb9abc6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:06:03 +0300 Subject: [PATCH 171/910] Test --- iguana/exchanges/LP_utxos.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0a4e26b6d..94401c6f7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -47,13 +47,22 @@ struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) return(utxo); } +struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; + memcpy(key,txid.bytes,sizeof(txid)); + memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); + HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + return(utxo); +} + struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) { struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); portable_mutex_lock(&LP_utxomutex); - HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + utxo = _LP_utxo2find(txid,vout); portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -231,12 +240,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); - if ( LP_utxo2find(txid2,vout2) == 0 ) + if ( _LP_utxo2find(txid2,vout2) == 0 ) HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); - printf("added\n"); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); } From dc07592cff8cf36dbfe4403ca2216b8548f614be Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:11:05 +0300 Subject: [PATCH 172/910] Test --- iguana/exchanges/LP_utxos.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 94401c6f7..32ded78ba 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -394,13 +394,17 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); if ( coin->counter == 0 ) { + static uint32_t counter; char tmpstr[128]; coin->counter++; - bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); + if ( counter++ == 0 ) + { + bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); + conv_NXTpassword(userpass.bytes,pubkey.bytes,(uint8_t *)tmpstr,(int32_t)strlen(tmpstr)); + userpub = curve25519(userpass,curve25519_basepoint9()); + printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); + } bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); - conv_NXTpassword(userpass.bytes,pubkey.bytes,(uint8_t *)tmpstr,(int32_t)strlen(tmpstr)); - userpub = curve25519(userpass,curve25519_basepoint9()); - printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); From 374d54e9d2c82c670e29f0441695e37212a2c0d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:13:36 +0300 Subject: [PATCH 173/910] 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 32ded78ba..92aba5909 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -381,6 +381,7 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t amclient) { + static uint32_t counter; char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); if ( coin == 0 ) { @@ -394,7 +395,6 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); if ( coin->counter == 0 ) { - static uint32_t counter; char tmpstr[128]; coin->counter++; if ( counter++ == 0 ) From 9ce523c71f90e2d0c0c0010e06e3fe527d047db3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:14:46 +0300 Subject: [PATCH 174/910] 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 92aba5909..417bfff20 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -397,6 +397,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb { char tmpstr[128]; coin->counter++; + bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); if ( counter++ == 0 ) { bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); @@ -404,7 +405,6 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb userpub = curve25519(userpass,curve25519_basepoint9()); printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); } - bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); From e117b2ad4ec5cc10c394bcc8cedf9458b915d398 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:18:21 +0300 Subject: [PATCH 175/910] Test --- iguana/exchanges/LP_utxos.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 417bfff20..476182e4c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -52,7 +52,7 @@ struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + //HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); return(utxo); } @@ -61,9 +61,9 @@ struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - portable_mutex_lock(&LP_utxomutex); + //portable_mutex_lock(&LP_utxomutex); utxo = _LP_utxo2find(txid,vout); - portable_mutex_unlock(&LP_utxomutex); + //portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -240,8 +240,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); - if ( _LP_utxo2find(txid2,vout2) == 0 ) - HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); + //if ( _LP_utxo2find(txid2,vout2) == 0 ) + // HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); From 53ebe213be5c196b4a8e58da5263f9544814c699 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:29:36 +0300 Subject: [PATCH 176/910] 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 6e6398d2b..17dac45c4 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -325,7 +325,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); exit(-1); } - printf("utxos.(%s)\n",LP_utxos(mypeer,"",10000)); + //printf("utxos.(%s)\n",LP_utxos(mypeer,"",10000)); } LP_mainloop(mypeer,mypubport,pubsock,pullsock,myport,amclient,passphrase,profitmargin); } From 754f01bc419842155b5cba1bed9d6e7338102792 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 20:52:25 +0300 Subject: [PATCH 177/910] 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 17dac45c4..fee4b72b9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -81,6 +81,12 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { //static uint16_t tmpport; char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } + printf("query peers queried\n"); if ( amclient == 0 ) { for (i=0; i Date: Tue, 6 Jun 2017 21:03:05 +0300 Subject: [PATCH 178/910] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++---- iguana/exchanges/LP_utxos.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fee4b72b9..d10b00c62 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -86,7 +86,6 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i printf("error launching stats rpcloop for port.%u\n",myport); exit(-1); } - printf("query peers queried\n"); if ( amclient == 0 ) { for (i=0; iipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } - //if ( (retstr= basilisk_swaplist()) != 0 ) - // free(retstr); + if ( (retstr= basilisk_swaplist()) != 0 ) + free(retstr); if ( amclient != 0 ) { while ( 1 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 476182e4c..e2b342dc9 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -52,7 +52,7 @@ struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - //HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); return(utxo); } @@ -61,9 +61,9 @@ struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - //portable_mutex_lock(&LP_utxomutex); + portable_mutex_lock(&LP_utxomutex); utxo = _LP_utxo2find(txid,vout); - //portable_mutex_unlock(&LP_utxomutex); + portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -240,8 +240,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); - //if ( _LP_utxo2find(txid2,vout2) == 0 ) - // HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); + if ( _LP_utxo2find(txid2,vout2) == 0 ) + HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); @@ -343,7 +343,7 @@ char *LP_inventory(char *symbol) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos,utxo,tmp) { - char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); + //char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && (IAMCLIENT != 0 || LP_ismine(utxo) != 0) ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } @@ -388,7 +388,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("cant add privkey for %s, coin not active\n",symbol); return(0); } - printf("privkey init.(%s) %s\n",symbol,coin->symbol); + //printf("privkey init.(%s) %s\n",symbol,coin->symbol); if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else privkey = iguana_wif2privkey(wifstr); @@ -468,7 +468,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } free_json(array); } - printf("privkey.%s %.8f\n",symbol,dstr(total)); + //printf("privkey.%s %.8f\n",symbol,dstr(total)); return(total); } @@ -477,7 +477,7 @@ void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphr int32_t i; for (i=0; i Date: Tue, 6 Jun 2017 21:06:12 +0300 Subject: [PATCH 179/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e2b342dc9..c2fc857d8 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -61,9 +61,9 @@ struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - portable_mutex_lock(&LP_utxomutex); + //portable_mutex_lock(&LP_utxomutex); utxo = _LP_utxo2find(txid,vout); - portable_mutex_unlock(&LP_utxomutex); + //portable_mutex_unlock(&LP_utxomutex); return(utxo); } From 9f196f885373b2cbfcef6fcaca90135255375237 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:08:18 +0300 Subject: [PATCH 180/910] 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 c2fc857d8..3d4e5590e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -52,7 +52,7 @@ struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + //HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); return(utxo); } From 5bee10438dc4b605de95330f32d78bc5c5e4ace4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:09:22 +0300 Subject: [PATCH 181/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_utxos.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 0e9e37d89..d1eba8e7c 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -164,7 +164,7 @@ struct basilisk_swap struct LP_utxoinfo { - UT_hash_handle hh; + UT_hash_handle hh,hh2; bits256 txid,txid2,feetxid,otherpubkey,mypub; void *swap; uint64_t value,satoshis,value2; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 3d4e5590e..875b29ca3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -52,7 +52,7 @@ struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - //HASH_FIND(hh,LP_utxoinfos2,key,sizeof(key),utxo); + HASH_FIND(hh2,LP_utxoinfos2,key,sizeof(key),utxo); return(utxo); } @@ -61,9 +61,9 @@ struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - //portable_mutex_lock(&LP_utxomutex); + portable_mutex_lock(&LP_utxomutex); utxo = _LP_utxo2find(txid,vout); - //portable_mutex_unlock(&LP_utxomutex); + portable_mutex_unlock(&LP_utxomutex); return(utxo); } @@ -241,7 +241,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(txid2,vout2) == 0 ) - HASH_ADD_KEYPTR(hh,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); + HASH_ADD_KEYPTR(hh2,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); if ( mypeer != 0 ) mypeer->numutxos++; portable_mutex_unlock(&LP_utxomutex); From dc1be55b95621131b58e951ab29dc46604a8e8e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:11:19 +0300 Subject: [PATCH 182/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d10b00c62..14697ab34 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -162,7 +162,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { LP_privkey_updates(mypeer,pubsock,passphrase,amclient); } - if ( (counter % 500) == 0 ) + if ( (counter % 2500) == 0 ) { char str[65]; //printf("start utxos updates\n"); @@ -256,7 +256,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i nn_freemsg(ptr), ptr = 0; } if ( nonz == 0 ) - usleep(50000); + usleep(100000); //printf("nonz.%d in mainloop\n",nonz); } } From ef56f6946c4fa50b2fb3c5c1a44849361442e532 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:12:19 +0300 Subject: [PATCH 183/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 14697ab34..2861155d7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -150,7 +150,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } } if ( nonz == 0 ) - usleep(100000); + usleep(200000); } } else @@ -224,7 +224,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); From 458e5673cb9e4d92d850a4a6943d5920733e7522 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:12:54 +0300 Subject: [PATCH 184/910] 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 875b29ca3..5b9664c1c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -202,7 +202,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 } if ( IAMCLIENT == 0 && strcmp(ipaddr,"127.0.0.1") == 0 ) { - printf("LP node got localhost utxo\n"); + //printf("LP node got localhost utxo\n"); return(0); } if ( (utxo= LP_utxofind(txid,vout)) != 0 || (utxo= LP_utxo2find(txid,vout)) != 0 ) From 2bdbe27d4ca76b46fe0cba230af494f6e328ce40 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:31:35 +0300 Subject: [PATCH 185/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 5b7ad7ed1..d9c0be254 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -324,7 +324,7 @@ char *LP_orderbook(char *base,char *rel) retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); if ( numbids > 1 ) - qsort(bids,numbids,sizeof(*bids),_cmp_orderbook); + qsort(bids,numbids,sizeof(*bids),_cmp_orderbookrev); for (i=0; i Date: Tue, 6 Jun 2017 21:35:20 +0300 Subject: [PATCH 186/910] 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 2861155d7..c58d99a51 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -162,7 +162,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { LP_privkey_updates(mypeer,pubsock,passphrase,amclient); } - if ( (counter % 2500) == 0 ) + if ( (counter % 500) == 0 ) { char str[65]; //printf("start utxos updates\n"); From 13cd60e0326a9b42604fd4e333f72eab0f0a1997 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Jun 2017 21:42:50 +0300 Subject: [PATCH 187/910] Test --- iguana/exchanges/LP_prices.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index d9c0be254..edd9f760b 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -141,8 +141,15 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) if ( (val= relpp->myprices[basepp->ind]) != 0. ) { *bidp = 1. / val; - printf("myprice (%.8f %.8f)\n",*bidp,*askp); - return((*askp + *bidp) * 0.5); + } else *bidp = *askp * 0.99; + return((*askp + *bidp) * 0.5); + } + else + { + if ( (val= relpp->myprices[basepp->ind]) != 0. ) + { + *bidp = 1. / val; + *askp = *bidp / 0.99; } } } @@ -177,7 +184,7 @@ cJSON *LP_priceinfomatrix(int32_t usemyprices) now = (uint32_t)time(NULL); HASH_ITER(hh,LP_cacheinfos,ptr,tmp) { - if ( ptr->timestamp < now-60 || ptr->price == 0. ) + if ( ptr->timestamp < now-3600*2 || ptr->price == 0. ) continue; LP_priceinfoupdate(ptr->Q.srccoin,ptr->Q.destcoin,ptr->price); } @@ -308,7 +315,7 @@ char *LP_orderbook(char *base,char *rel) now = (uint32_t)time(NULL); HASH_ITER(hh,LP_cacheinfos,ptr,tmp) { - if ( ptr->timestamp < now-60*2 || ptr->price == 0. ) + if ( ptr->timestamp < now-3600*2 || ptr->price == 0. ) continue; if ( strcmp(ptr->Q.srccoin,base) == 0 && strcmp(ptr->Q.destcoin,rel) == 0 ) { From c1686c9208fb60ae6dfce1a15c1f2c9819020f00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 07:44:23 +0300 Subject: [PATCH 188/910] Test --- iguana/exchanges/LP_coins.c | 125 +++++++++++++++++++++----------- iguana/exchanges/LP_commands.c | 2 + iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 14 +++- iguana/exchanges/mm.c | 2 +- 5 files changed, 97 insertions(+), 48 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 6f32b9372..76cf7f0e3 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -18,7 +18,16 @@ // marketmaker // -char *portstrs[][2] = { { "BTC", "8332" }, { "KMD", "7771" }, { "LTC", "9332" }, { "REVS", "10196" }, { "JUMBLR", "15106" }, }; +char *portstrs[][2] = { { "BTC", "8332" }, { "KMD", "7771" }, { "REVS", "10196" }, { "JUMBLR", "15106" }, }; + +uint16_t LP_rpcport(char *symbol) +{ + int32_t i; + for (i=0; isymbol,symbol,sizeof(coin->symbol)); + sprintf(coin->serverport,"127.0.0.1:%u",port); + coin->longestchain = longestchain; + coin->txfee = txfee; + coin->estimatedrate = estimatedrate; + coin->pubtype = pubtype; + coin->p2shtype = p2shtype; + coin->wiftype = wiftype; + LP_userpass(coin->userpass,symbol,"",name); +} + +struct iguana_info *LP_coinadd(struct iguana_info *cdata) { - struct iguana_info *coin,cdata; int32_t i; uint16_t port; + struct iguana_info *coin; + //printf("%s: (%s) (%s)\n",symbol,cdata.serverport,cdata.userpass); + LP_coins = realloc(LP_coins,sizeof(*LP_coins) * (LP_numcoins+1)); + coin = &LP_coins[LP_numcoins]; + *coin = *cdata; + LP_numcoins++; + return(coin); +} + +struct iguana_info *LP_coinsearch(char *symbol) +{ + int32_t i; for (i=0; i", "rpcport":pppp}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }] + +struct iguana_info *LP_coincreate(cJSON *item) +{ + struct iguana_info cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol; + if ( (symbol= jstr(item,"coin")) != 0 && symbol[0] != 0 && strlen(symbol) < 16 && LP_coinfind(symbol) == 0 && (port= juint(item,"rpcport")) != 0 ) { - cdata.pubtype = 60; - cdata.p2shtype = 85; - cdata.wiftype = 188; - LP_userpass(cdata.userpass,symbol,symbol,strcmp(symbol,"KMD") == 0 ? "komodo" : symbol); + if ( (txfee= j64bits(item,"txfee")) == 0 ) + txfee = 10000; + if ( (estimatedrate= jdouble(item,"estimatedrate")) == 0. ) + estimatedrate = 20; + if ( (pubtype= juint(item,"pubtype")) == 0 ) + pubtype = 60; + if ( (p2shtype= juint(item,"p2shtype")) == 0 ) + p2shtype = 85; + if ( (wiftype= juint(item,"wiftype")) == 0 ) + wiftype = 188; + if ( (name= jstr(item,"name")) == 0 ) + name = symbol; + LP_coininit(&cdata,symbol,name,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + return(LP_coinadd(&cdata)); } - //printf("%s: (%s) (%s)\n",symbol,cdata.serverport,cdata.userpass); - LP_coins = realloc(LP_coins,sizeof(*LP_coins) * (LP_numcoins+1)); - coin = &LP_coins[LP_numcoins++]; - *coin = cdata; - return(coin); + return(0); } diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 621c7544b..366ab2556 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -38,6 +38,8 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port, if ( bits256_nonz(qp->desthash) != 0 ) flag = 1; jaddstr(reqjson,"method",method); + if ( strcmp(method,"price") != 0 ) + printf("QUERY.(%s)\n",jprint(reqjson,0)); LP_send(pushsock,jprint(reqjson,1),1); for (i=0; i<30; i++) { diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index d1eba8e7c..9b194a908 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -37,7 +37,7 @@ //#define BASILISK_DISABLEWAITTX //#define BASILISK_DISABLESENDTX -#define LP_PROPAGATION_SLACK 10 // txid ordering is not enforced, so getting extra recent txid +#define LP_PROPAGATION_SLACK 100 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 #define LP_AVETXSIZE 200 #define LP_CACHEDURATION 60 diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c58d99a51..f31e3c1ef 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -54,6 +54,7 @@ void tradebot_pendingadd(cJSON *tradejson,char *base,double basevolume,char *rel { // add to trades } + char *LP_getdatadir() { return(USERHOME); @@ -77,10 +78,10 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_quotes.c" #include "LP_commands.c" -void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin) +void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin,cJSON *coins) { //static uint16_t tmpport; - char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; + char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -112,6 +113,11 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i LP_coinfind(activecoins[i]); LP_priceinfoadd(activecoins[i]); } + if ( (n= cJSON_GetArraySize(coins)) > 0 ) + { + for (i=0; i Date: Wed, 7 Jun 2017 07:47:55 +0300 Subject: [PATCH 189/910] Test --- iguana/exchanges/LP_coins.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/client | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 76cf7f0e3..18a38390a 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -18,7 +18,7 @@ // marketmaker // -char *portstrs[][2] = { { "BTC", "8332" }, { "KMD", "7771" }, { "REVS", "10196" }, { "JUMBLR", "15106" }, }; +char *portstrs[][2] = { { "BTC", "8332" }, { "KMD", "7771" } }; uint16_t LP_rpcport(char *symbol) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f31e3c1ef..1e0aea7db 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -26,7 +26,7 @@ struct LP_utxoinfo *LP_utxoinfos,*LP_utxoinfos2; struct LP_peerinfo *LP_peerinfos,*LP_mypeer; -char *activecoins[] = { "BTC", "KMD", "REVS", "JUMBLR" };//"LTC", "USD", }; +char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; @@ -81,7 +81,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin,cJSON *coins) { //static uint16_t tmpport; - char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; + char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); diff --git a/iguana/exchanges/client b/iguana/exchanges/client index f84982ff2..2452d2855 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 8195e3394d260b93c31904f6c846956c795f1f2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 07:52:04 +0300 Subject: [PATCH 190/910] Test --- iguana/exchanges/LP_coins.c | 10 ++++++++-- iguana/exchanges/client | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 18a38390a..6b1a0f6f6 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -198,7 +198,7 @@ struct iguana_info *LP_coinsearch(char *symbol) struct iguana_info *LP_coinfind(char *symbol) { - struct iguana_info *coin,cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name; + struct iguana_info *coin,cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,namebuf[512]; if ( (coin= LP_coinsearch(symbol)) != 0 ) return(coin); if ( (port= LP_rpcport(symbol)) == 0 ) @@ -216,7 +216,13 @@ struct iguana_info *LP_coinfind(char *symbol) wiftype = 128; name = "bitcoin"; } - else name = (strcmp(symbol,"KMD") == 0) ? "komodo" : symbol; + else if ( strcmp(symbol,"KMD") == 0 ) + name = "komodo"; + else + { + sprintf(namebuf,"komodo/%s",symbol); + name = namebuf; + } LP_coininit(&cdata,symbol,name,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); return(LP_coinadd(&cdata)); } diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 2452d2855..bbc9b9575 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"name\":\"komodo/REVS", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"name\":\"komodo/JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 4d1ed4488a6374f05bae097c1ec793335b42cb7c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 07:58:20 +0300 Subject: [PATCH 191/910] Test --- iguana/exchanges/LP_coins.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 6b1a0f6f6..4d247cfb8 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -162,7 +162,7 @@ cJSON *LP_coinsjson() return(array); } -void LP_coininit(struct iguana_info *coin,char *symbol,char *name,uint16_t port,uint8_t pubtype,uint8_t p2shtype,uint8_t wiftype,uint64_t txfee,double estimatedrate,int32_t longestchain) +void LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetname,uint16_t port,uint8_t pubtype,uint8_t p2shtype,uint8_t wiftype,uint64_t txfee,double estimatedrate,int32_t longestchain) { memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); @@ -173,7 +173,7 @@ void LP_coininit(struct iguana_info *coin,char *symbol,char *name,uint16_t port, coin->pubtype = pubtype; coin->p2shtype = p2shtype; coin->wiftype = wiftype; - LP_userpass(coin->userpass,symbol,"",name); + LP_userpass(coin->userpass,symbol,assetname,name); } struct iguana_info *LP_coinadd(struct iguana_info *cdata) @@ -198,7 +198,7 @@ struct iguana_info *LP_coinsearch(char *symbol) struct iguana_info *LP_coinfind(char *symbol) { - struct iguana_info *coin,cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,namebuf[512]; + struct iguana_info *coin,cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*assetname; if ( (coin= LP_coinsearch(symbol)) != 0 ) return(coin); if ( (port= LP_rpcport(symbol)) == 0 ) @@ -208,6 +208,7 @@ struct iguana_info *LP_coinfind(char *symbol) pubtype = 60; p2shtype = 85; wiftype = 188; + assetname = ""; if ( strcmp(symbol,"BTC") == 0 ) { txfee = 50000; @@ -220,10 +221,10 @@ struct iguana_info *LP_coinfind(char *symbol) name = "komodo"; else { - sprintf(namebuf,"komodo/%s",symbol); - name = namebuf; + name = symbol; + assetname = symbol; } - LP_coininit(&cdata,symbol,name,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + LP_coininit(&cdata,symbol,name,assetname,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); return(LP_coinadd(&cdata)); } @@ -231,7 +232,7 @@ struct iguana_info *LP_coinfind(char *symbol) struct iguana_info *LP_coincreate(cJSON *item) { - struct iguana_info cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol; + struct iguana_info cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol,*assetname; if ( (symbol= jstr(item,"coin")) != 0 && symbol[0] != 0 && strlen(symbol) < 16 && LP_coinfind(symbol) == 0 && (port= juint(item,"rpcport")) != 0 ) { if ( (txfee= j64bits(item,"txfee")) == 0 ) @@ -244,9 +245,11 @@ struct iguana_info *LP_coincreate(cJSON *item) p2shtype = 85; if ( (wiftype= juint(item,"wiftype")) == 0 ) wiftype = 188; - if ( (name= jstr(item,"name")) == 0 ) + if ( (assetname= jstr(item,"asset")) != 0 ) + name = assetname; + else if ( (name= jstr(item,"name")) == 0 ) name = symbol; - LP_coininit(&cdata,symbol,name,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); return(LP_coinadd(&cdata)); } return(0); From c17d9cdd84015858813dfc4082275407bdec16d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:00:46 +0300 Subject: [PATCH 192/910] Test --- iguana/exchanges/LP_coins.c | 1 + iguana/exchanges/client | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 4d247cfb8..5de4359b2 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -213,6 +213,7 @@ struct iguana_info *LP_coinfind(char *symbol) { txfee = 50000; estimatedrate = 300; + pubtype = 0; p2shtype = 5; wiftype = 128; name = "bitcoin"; diff --git a/iguana/exchanges/client b/iguana/exchanges/client index bbc9b9575..6eac12ef1 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"name\":\"komodo/REVS", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"name\":\"komodo/JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From db895dff124d2ce11d2cabfb74a8122dc1c7c00f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:02:09 +0300 Subject: [PATCH 193/910] Test --- iguana/exchanges/client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 6eac12ef1..80b5905f7 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 0d48cb8b5e8ecf2abfbb04a68a87bc36e2807719 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:04:16 +0300 Subject: [PATCH 194/910] Test --- iguana/exchanges/client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 80b5905f7..a71a174c7 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,2 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 4d52639ca597f92e7fe42e95dbb6ba5c779e144b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:06:23 +0300 Subject: [PATCH 195/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 5b9664c1c..c31a3fb64 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -475,10 +475,10 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphrase,int32_t amclient) { int32_t i; - for (i=0; i Date: Wed, 7 Jun 2017 08:07:58 +0300 Subject: [PATCH 196/910] Test --- iguana/exchanges/LP_utxos.c | 2 +- iguana/exchanges/mm.c | 16 ---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index c31a3fb64..4f7dc7eb9 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -477,7 +477,7 @@ void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphr int32_t i; for (i=0; icoin,"REVS") == 0 && (matchjson= LP_autotrade(utxo,"KMD",0.)) != 0 ) - printf("bestprice (%s)\n",jprint(matchjson,1)); - } - } - sleep(1000); - }*/ while ( 1 ) sleep(1); profitmargin = jdouble(retjson,"profitmargin"); From 53e4263e03ae9fb635b463c12fcca7f492892418 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:10:05 +0300 Subject: [PATCH 197/910] Test --- iguana/exchanges/client | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index a71a174c7..9b10b48a7 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -1,2 +1,7 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; +git pull; + cd ..; +./m_mm; +#./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & + ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 8ba76912c5d6dfd271e6e9802db85bbf17687f16 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:27:52 +0300 Subject: [PATCH 198/910] Test --- iguana/exchanges/LP_coins.c | 22 ++++++++++++++++------ iguana/exchanges/LP_commands.c | 2 ++ iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_utxos.c | 2 +- iguana/exchanges/client | 3 +-- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 5de4359b2..2a8d4207a 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -145,11 +145,17 @@ cJSON *LP_coinjson(struct iguana_info *coin) { cJSON *item = cJSON_CreateObject(); jaddstr(item,"coin",coin->symbol); + if ( coin->inactive != 0 ) + jaddstr(item,"status","inactive"); + if ( coin->isPoS != 0 ) + jaddstr(item,"type","PoS"); jaddstr(item,"smartaddress",coin->smartaddr); jaddstr(item,"rpc",coin->serverport); jaddnum(item,"pubtype",coin->pubtype); jaddnum(item,"p2shtype",coin->p2shtype); jaddnum(item,"wiftype",coin->wiftype); + jaddnum(item,"estimatedrate",coin->estimatedrate); + jaddnum(item,"txfee",coin->txfee); return(item); } @@ -162,11 +168,12 @@ cJSON *LP_coinsjson() return(array); } -void LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetname,uint16_t port,uint8_t pubtype,uint8_t p2shtype,uint8_t wiftype,uint64_t txfee,double estimatedrate,int32_t longestchain) +void 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) { memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); sprintf(coin->serverport,"127.0.0.1:%u",port); + coin->isPoS = isPoS; coin->longestchain = longestchain; coin->txfee = txfee; coin->estimatedrate = estimatedrate; @@ -198,11 +205,12 @@ struct iguana_info *LP_coinsearch(char *symbol) struct iguana_info *LP_coinfind(char *symbol) { - struct iguana_info *coin,cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*assetname; + struct iguana_info *coin,cdata; int32_t isPoS,longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*assetname; if ( (coin= LP_coinsearch(symbol)) != 0 ) return(coin); if ( (port= LP_rpcport(symbol)) == 0 ) return(0); + isPoS = 0; txfee = 10000; estimatedrate = 20; pubtype = 60; @@ -225,7 +233,7 @@ struct iguana_info *LP_coinfind(char *symbol) name = symbol; assetname = symbol; } - LP_coininit(&cdata,symbol,name,assetname,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + LP_coininit(&cdata,symbol,name,assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); return(LP_coinadd(&cdata)); } @@ -233,9 +241,10 @@ struct iguana_info *LP_coinfind(char *symbol) struct iguana_info *LP_coincreate(cJSON *item) { - struct iguana_info cdata; int32_t longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol,*assetname; + struct iguana_info cdata,*coin; int32_t isPoS,longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol,*assetname; 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"); if ( (txfee= j64bits(item,"txfee")) == 0 ) txfee = 10000; if ( (estimatedrate= jdouble(item,"estimatedrate")) == 0. ) @@ -250,8 +259,9 @@ struct iguana_info *LP_coincreate(cJSON *item) name = assetname; else if ( (name= jstr(item,"name")) == 0 ) name = symbol; - LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); - return(LP_coinadd(&cdata)); + LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + if ( (coin= LP_coinadd(&cdata)) != 0 ) + coin->inactive = jint(item,"inactive"); } return(0); } diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 366ab2556..7d873c0c4 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -314,6 +314,8 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port retstr = LP_connected(argjson); else if ( strcmp(method,"checktxid") == 0 ) retstr = LP_spentcheck(argjson); + else if ( strcmp(method,"getcoins") == 0 ) + retstr = jprint(LP_coinsjson(),1); else if ( strcmp(method,"getprice") == 0 ) retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"orderbook") == 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 9b194a908..e418c6899 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -140,7 +140,7 @@ struct basilisk_swapinfo struct iguana_info { uint64_t txfee; double estimatedrate; - int32_t longestchain; uint32_t counter; + int32_t longestchain; uint32_t counter,inactive; uint8_t pubtype,p2shtype,isPoS,wiftype; char symbol[16],smartaddr[64],userpass[1024],serverport[128]; }; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4f7dc7eb9..e0847f382 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -411,7 +411,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - if ( (array= LP_listunspent(symbol,coin->smartaddr)) != 0 ) + if ( coin->inactive == 0 && (array= LP_listunspent(symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 9b10b48a7..52a5fe77f 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,5 +3,4 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -#./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & - ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"inactive\":1, \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 52dbeeb431ed7103445d68f1f1932d1e205c0995 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:32:03 +0300 Subject: [PATCH 199/910] Test --- iguana/exchanges/LP_commands.c | 14 +++++++++++++- iguana/exchanges/LP_utxos.c | 2 +- iguana/exchanges/disable | 2 ++ iguana/exchanges/enable | 2 ++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100755 iguana/exchanges/disable create mode 100755 iguana/exchanges/enable diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7d873c0c4..c5cb13164 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -204,7 +204,7 @@ char *LP_connected(cJSON *argjson) char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) return(clonestr("{\"error\":\"need method in request\"}")); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) @@ -261,6 +261,18 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); return(LP_inventory(coin)); } + else if ( strcmp(method,"enable") == 0 ) + { + if ( (ptr= LP_coinsearch(coin)) != 0 ) + ptr->inactive = 0; + return(jprint(LP_coins(),1)); + } + else if ( strcmp(method,"disable") == 0 ) + { + if ( (ptr= LP_coinsearch(coin)) != 0 ) + ptr->inactive = (uint32_t)time(NULL); + return(jprint(LP_coins(),1)); + } else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) { bits256 txid; int32_t vout; struct LP_utxoinfo *utxo; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e0847f382..9a8be6592 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -477,7 +477,7 @@ void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphr int32_t i; for (i=0; i Date: Wed, 7 Jun 2017 08:36:49 +0300 Subject: [PATCH 200/910] Test --- iguana/exchanges/client | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 52a5fe77f..1d2617c02 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,4 +3,7 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\", \"asset\":\"REVS\", \"rpcport\":10196}, {\"coin\":\"JUMBLR\", \"asset\":\"JUMBLR\", \"rpcport\":15106}, {\"coin\":\"LTC\", \"inactive\":1, \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, {\"coin\":\"LTC\", \"inactive\":1, \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & + +"{\"client\":1,\"coins\":[{\"coin\":\"BTC\",\"asset\":\"BTC\",\"rpcport\":8333},{\"coin\":\"BTCD\",\"asset\":\"BTCD\",\"rpcport\":14632},{\"coin\":\"LTC\",\"asset\":\"LTC\",\"rpcport\":9332},{\"coin\":\"DOGE\",\"asset\":\"DOGE\",\"rpcport\":22555},{\"coin\":\"DGB\",\"asset\":\"DGB\",\"rpcport\":14022},{\"coin\":\"MZC\",\"asset\":\"MZC\",\"rpcport\":12832},{\"coin\":\"SYS\",\"asset\":\"SYS\",\"rpcport\":8370},{\"coin\":\"UNO\",\"asset\":\"UNO\",\"rpcport\":65535},{\"coin\":\"ZET\",\"asset\":\"ZET\",\"rpcport\":17335},{\"coin\":\"KMD\",\"asset\":\"KMD\",\"rpcport\":7771},{\"coin\":\"ZEC\",\"asset\":\"ZEC\",\"rpcport\":8232},{\"coin\":\"BTM\",\"asset\":\"BTM\",\"rpcport\":9266},{\"coin\":\"CARB\",\"asset\":\"CARB\",\"rpcport\":9351},{\"coin\":\"ANC\",\"asset\":\"ANC\",\"rpcport\":28332},{\"coin\":\"FRK\",\"asset\":\"FRK\",\"rpcport\":7913},{\"coin\":\"GAME\",\"asset\":\"GAME\",\"rpcport\":40001},{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"asset\":\"JUMBLR\",\"rpcport\":10789},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400},{\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" +Add Comment From 929a6677dcf0010a42c241d1f6bd28c62556faf9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:37:37 +0300 Subject: [PATCH 201/910] Test --- iguana/exchanges/client | 2 -- 1 file changed, 2 deletions(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 1d2617c02..7acd649d1 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -5,5 +5,3 @@ git pull; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, {\"coin\":\"LTC\", \"inactive\":1, \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & -"{\"client\":1,\"coins\":[{\"coin\":\"BTC\",\"asset\":\"BTC\",\"rpcport\":8333},{\"coin\":\"BTCD\",\"asset\":\"BTCD\",\"rpcport\":14632},{\"coin\":\"LTC\",\"asset\":\"LTC\",\"rpcport\":9332},{\"coin\":\"DOGE\",\"asset\":\"DOGE\",\"rpcport\":22555},{\"coin\":\"DGB\",\"asset\":\"DGB\",\"rpcport\":14022},{\"coin\":\"MZC\",\"asset\":\"MZC\",\"rpcport\":12832},{\"coin\":\"SYS\",\"asset\":\"SYS\",\"rpcport\":8370},{\"coin\":\"UNO\",\"asset\":\"UNO\",\"rpcport\":65535},{\"coin\":\"ZET\",\"asset\":\"ZET\",\"rpcport\":17335},{\"coin\":\"KMD\",\"asset\":\"KMD\",\"rpcport\":7771},{\"coin\":\"ZEC\",\"asset\":\"ZEC\",\"rpcport\":8232},{\"coin\":\"BTM\",\"asset\":\"BTM\",\"rpcport\":9266},{\"coin\":\"CARB\",\"asset\":\"CARB\",\"rpcport\":9351},{\"coin\":\"ANC\",\"asset\":\"ANC\",\"rpcport\":28332},{\"coin\":\"FRK\",\"asset\":\"FRK\",\"rpcport\":7913},{\"coin\":\"GAME\",\"asset\":\"GAME\",\"rpcport\":40001},{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"asset\":\"JUMBLR\",\"rpcport\":10789},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400},{\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" -Add Comment From 9493e3c850dc15239a1d3706d42dfb6c0bd612bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:38:37 +0300 Subject: [PATCH 202/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c5cb13164..df00b26a9 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -265,13 +265,13 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { if ( (ptr= LP_coinsearch(coin)) != 0 ) ptr->inactive = 0; - return(jprint(LP_coins(),1)); + return(jprint(LP_coinsjson(),1)); } else if ( strcmp(method,"disable") == 0 ) { if ( (ptr= LP_coinsearch(coin)) != 0 ) ptr->inactive = (uint32_t)time(NULL); - return(jprint(LP_coins(),1)); + return(jprint(LP_coinsjson(),1)); } else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) { From f50d0218e238bcf98d832791120eef11fc5ed8b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:44:04 +0300 Subject: [PATCH 203/910] Test --- iguana/exchanges/LP_coins.c | 2 +- iguana/exchanges/client | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 2a8d4207a..381d4f278 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -261,7 +261,7 @@ struct iguana_info *LP_coincreate(cJSON *item) name = symbol; LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); if ( (coin= LP_coinadd(&cdata)) != 0 ) - coin->inactive = jint(item,"inactive"); + coin->inactive = !jint(item,"active"); } return(0); } diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 7acd649d1..97f8f0952 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,5 +3,5 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, {\"coin\":\"LTC\", \"inactive\":1, \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From f383b24d2558dd5f395e06c64dc78c2dda030305 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:45:31 +0300 Subject: [PATCH 204/910] 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 9a8be6592..738392bd1 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,7 +406,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); } printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); - if ( (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) + if ( coin->inactive == 0 && (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); } bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); From c1c95667ec11af4077db0d54c982a00f118f8eec Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:46:25 +0300 Subject: [PATCH 205/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 738392bd1..0e1832b08 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,7 +406,8 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); } printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); - if ( coin->inactive == 0 && (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) + if ( //coin->inactive == 0 && + (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); } bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); From 5a2a61681d397f1e2201997cc5412b3b42bf4d49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:49:05 +0300 Subject: [PATCH 206/910] Test --- iguana/exchanges/getcoins | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/exchanges/getcoins diff --git a/iguana/exchanges/getcoins b/iguana/exchanges/getcoins new file mode 100755 index 000000000..132e9a9c0 --- /dev/null +++ b/iguana/exchanges/getcoins @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"getcoins\"}" From fafbecda0e6e413bedfed5359f696a7bed8a9081 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:50:34 +0300 Subject: [PATCH 207/910] Test --- iguana/exchanges/LP_coins.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 381d4f278..45f77b583 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -147,6 +147,7 @@ cJSON *LP_coinjson(struct iguana_info *coin) jaddstr(item,"coin",coin->symbol); if ( coin->inactive != 0 ) jaddstr(item,"status","inactive"); + else jaddstr(item,"status","active"); if ( coin->isPoS != 0 ) jaddstr(item,"type","PoS"); jaddstr(item,"smartaddress",coin->smartaddr); From 7804eda547f09ba050f430af5131d92f5b6eeae3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:56:02 +0300 Subject: [PATCH 208/910] Test --- iguana/exchanges/client | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 97f8f0952..a6b3ae853 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,5 +3,18 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, {\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, +{\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, +{\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, +{\"coin\":\"UNO\", \"name\":\"unobtanium\", \"pubtype\":130, \"p2shtype\":30, \"wiftype\":224, \"txfee\":1000000}, +{\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9, \"wiftype\":224, \"txfee\":10000}, +{\"coin\":\"ZEC\", \"name\":\"zcash\", \"pubtype\":184, \"p2shtype\":189, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"BTM\", \"name\":\"bitmark\", \"pubtype\":85, \"p2shtype\":5, \"wiftype\":213, \"txfee\":0}, +{\"coin\":\"CARB\", \"name\":\"carboncoin\", \"pubtype\":47, \"p2shtype\":5, \"wiftype\":175, \"txfee\":0}, +{\"coin\":\"ANC\", \"name\":\"anoncoin\", \"pubtype\":23, \"p2shtype\":5, \"wiftype\":151, \"txfee\":2000000}, +{\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, +{\"coin\":\"GAME\", \"name\":\"gamecredits\", \"pubtype\":38, \"p2shtype\":5, \"wiftype\":166, \"txfee\":100000}, +{\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 46d8b7c62bad2fdd8fa64e2d5e003de20fc16391 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 08:59:23 +0300 Subject: [PATCH 209/910] Test --- iguana/exchanges/LP_coins.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 45f77b583..71cb13546 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -128,7 +128,11 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) userpass[0] = 0; sprintf(confname,"%s.conf",confroot); #ifdef __APPLE__ + int32_t len; confname[0] = toupper(confname[0]); + len = (int32_t)strlen(confname); + if ( strcmp(&confname[len-4],"coin") == 0 ) + confname[len - 4] = 'C'; #endif LP_statefname(fname,symbol,assetname,confname); if ( (fp= fopen(fname,"rb")) != 0 ) From 69e2e09480335945f086cf249b19f1eb3af96b7d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:02:43 +0300 Subject: [PATCH 210/910] Test --- iguana/exchanges/client | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index a6b3ae853..2eb925910 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,7 +3,7 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"SUPERNET\",\"asset\":\"SUPERNET\",\"rpcport\":11341},{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"WLC\",\"asset\":\"WLC\",\"rpcport\":11667},{\"coin\":\"PANGEA\",\"asset\":\"PANGEA\",\"rpcport\":10074},{\"coin\":\"DEX\",\"asset\":\"DEX\",\"rpcport\":9503},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106},{\"coin\":\"BET\",\"asset\":\"BET\",\"rpcport\":11222},{\"coin\":\"CRYPTO\",\"asset\":\"CRYPTO\",\"rpcport\":10420},{\"coin\":\"HODL\",\"asset\":\"HODL\",\"rpcport\":8010},{\"coin\":\"SHARK\",\"asset\":\"SHARK\",\"rpcport\":14104},{\"coin\":\"BOTS\",\"asset\":\"BOTS\",\"rpcport\":10151},{\"coin\":\"MGW\",\"asset\":\"MGW\",\"rpcport\":15524},{\"coin\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":11676},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":13097},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":8400}, +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, @@ -16,5 +16,7 @@ git pull; {\"coin\":\"ANC\", \"name\":\"anoncoin\", \"pubtype\":23, \"p2shtype\":5, \"wiftype\":151, \"txfee\":2000000}, {\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, {\"coin\":\"GAME\", \"name\":\"gamecredits\", \"pubtype\":38, \"p2shtype\":5, \"wiftype\":166, \"txfee\":100000}, -{\"coin\":\"LTC\", \"name\":\"litecoin\", \"rpcport\":9332, \"pubtype\":48, \"p2shtype\":5, \"wiftype\":176, \"txfee\":100000 }], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & +{\"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\":15432},{\"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From 96c745cc57ba4de41df9da3868c1e47a00529a1d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:06:22 +0300 Subject: [PATCH 211/910] Test --- iguana/exchanges/client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 2eb925910..ec3daecce 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -17,6 +17,6 @@ git pull; {\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, {\"coin\":\"GAME\", \"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\":15432},{\"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +{\"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} ], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From da94c86759a9159580af8f6bc439261f2bcf09bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:18:06 +0300 Subject: [PATCH 212/910] Test --- iguana/exchanges/LP_coins.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 71cb13546..18af9fb47 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -45,7 +45,7 @@ char *parse_conf_line(char *line,char *field) return(clonestr(line)); } -void LP_userpassfp(char *username,char *password,FILE *fp) +void LP_userpassfp(char *symbol,char *username,char *password,FILE *fp) { char *rpcuser,*rpcpassword,*str,line[8192]; rpcuser = rpcpassword = 0; @@ -65,7 +65,7 @@ void LP_userpassfp(char *username,char *password,FILE *fp) strcpy(username,rpcuser); strcpy(password,rpcpassword); } - //printf("rpcuser.(%s) rpcpassword.(%s) KMDUSERPASS.(%s) %u\n",rpcuser,rpcpassword,KMDUSERPASS,port); + printf("%s rpcuser.(%s) rpcpassword.(%s) %u\n",symbol,rpcuser,rpcpassword,port); if ( rpcuser != 0 ) free(rpcuser); if ( rpcpassword != 0 ) @@ -137,7 +137,7 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) LP_statefname(fname,symbol,assetname,confname); if ( (fp= fopen(fname,"rb")) != 0 ) { - LP_userpassfp(username,password,fp); + LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); return((int32_t)strlen(userpass)); From 5db23bdd1647e287798b1849892a157288490f4c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:20:37 +0300 Subject: [PATCH 213/910] Test --- iguana/exchanges/LP_coins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 18af9fb47..f423d20bd 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -141,7 +141,7 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) sprintf(userpass,"%s:%s",username,password); fclose(fp); return((int32_t)strlen(userpass)); - } + } else printf("cant open.(%s)\n",fname); return(-1); } From c75a7e343068b0354cb4e62b508d87ddb5183bc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:25:07 +0300 Subject: [PATCH 214/910] Test --- iguana/exchanges/LP_coins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index f423d20bd..ee53239b8 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -65,7 +65,7 @@ void LP_userpassfp(char *symbol,char *username,char *password,FILE *fp) strcpy(username,rpcuser); strcpy(password,rpcpassword); } - printf("%s rpcuser.(%s) rpcpassword.(%s) %u\n",symbol,rpcuser,rpcpassword,port); + printf("%s rpcuser.(%s) rpcpassword.(%s)\n",symbol,rpcuser,rpcpassword); if ( rpcuser != 0 ) free(rpcuser); if ( rpcpassword != 0 ) From 75e4e4d5017c18e6801466568c12efe114ae5c79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:35:11 +0300 Subject: [PATCH 215/910] Test --- iguana/exchanges/LP_utxos.c | 3 +-- iguana/exchanges/client | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0e1832b08..738392bd1 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,8 +406,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); } printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); - if ( //coin->inactive == 0 && - (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) + if ( coin->inactive == 0 && (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) printf("importprivkey -> (%s)\n",jprint(retjson,1)); } bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); diff --git a/iguana/exchanges/client b/iguana/exchanges/client index ec3daecce..0f89a0f95 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -17,6 +17,6 @@ git pull; {\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, {\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":8299},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +{\"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} ], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & From c29f998292dfe3705f602bc410ad4cfbc61b7cdd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 09:49:03 +0300 Subject: [PATCH 216/910] Test --- basilisk/jumblr.c | 1 + iguana/exchanges/LP_coins.c | 10 ++++++++++ iguana/exchanges/LP_commands.c | 20 ++++++++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e7144fb57..618ce346c 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -648,6 +648,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); //r = 0; + // randomize size chosen and order of chunks if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index ee53239b8..e2951dad5 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -208,6 +208,16 @@ struct iguana_info *LP_coinsearch(char *symbol) return(0); } +int32_t LP_isdisabled(char *base,char *rel) +{ + struct iguana_info *coin; + if ( base != 0 && (coin= LP_coinsearch(base)) != 0 && coin->inactive != 0 ) + return(1); + else if ( rel != 0 && (coin= LP_coinsearch(rel)) != 0 && coin->inactive != 0 ) + return(1); + else return(0); +} + struct iguana_info *LP_coinfind(char *symbol) { struct iguana_info *coin,cdata; int32_t isPoS,longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*assetname; diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index df00b26a9..89905abc4 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -222,6 +222,8 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 ) { //char str[65]; + if ( LP_isdisabled(base,rel) != 0 ) + return(clonestr("{\"error\":\"at least one of coins disabled\"}")); if ( strcmp(method,"setprice") == 0 ) { if ( LP_mypriceset(base,rel,jdouble(argjson,"price")) < 0 ) @@ -256,12 +258,7 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port } else if ( (coin= jstr(argjson,"coin")) != 0 ) { - if ( strcmp(method,"inventory") == 0 ) - { - LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); - return(LP_inventory(coin)); - } - else if ( strcmp(method,"enable") == 0 ) + if ( strcmp(method,"enable") == 0 ) { if ( (ptr= LP_coinsearch(coin)) != 0 ) ptr->inactive = 0; @@ -273,6 +270,13 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port ptr->inactive = (uint32_t)time(NULL); return(jprint(LP_coinsjson(),1)); } + if ( LP_isdisabled(coin,0) != 0 ) + return(clonestr("{\"error\":\"coin is disabled\"}")); + if ( strcmp(method,"inventory") == 0 ) + { + LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); + return(LP_inventory(coin)); + } else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) { bits256 txid; int32_t vout; struct LP_utxoinfo *utxo; @@ -297,6 +301,10 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port else return(basilisk_swaplist()); } } + if ( LP_isdisabled(jstr(argjson,"base"),jstr(argjson,"base")) != 0 ) + return(clonestr("{\"error\":\"at least one of coins disabled\"}")); + if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) + return(clonestr("{\"error\":\"coin is disabled\"}")); amclient = (LP_mypeer == 0); if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { From 8b2a1cfaeec8c332fe16137a35a14d497a33337f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 10:08:02 +0300 Subject: [PATCH 217/910] Test --- basilisk/jumblr.c | 13 ++++++++----- iguana/exchanges/LP_prices.c | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 618ce346c..2749560ee 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -642,7 +642,7 @@ void jumblr_utxoupdate(struct supernet_info *myinfo,char *dest,struct iguana_inf void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { //static uint32_t lasttime; - char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; if ( myinfo->IAMNOTARY != 0 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; @@ -651,8 +651,9 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 // randomize size chosen and order of chunks if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { + s = (selector + (r>>1)) % 3; //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); - switch ( selector ) + switch ( s ) { case 0: // public -> z, need to importprivkey jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,JUMBLR_DEPOSITPREFIX); @@ -662,12 +663,14 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) { + amount = 0; if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); - else if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) + if ( (r & 2) != 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); - else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); - if ( (retstr= jumblr_sendt_to_z(myinfo,coin,KMDaddr,zaddr,dstr(amount))) != 0 ) + if ( (r & 4) != 0 ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + if ( amount > 0 && (retstr= jumblr_sendt_to_z(myinfo,coin,KMDaddr,zaddr,dstr(amount))) != 0 ) { printf("sendt_to_z.(%s)\n",retstr); free(retstr); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index edd9f760b..8266bc6e2 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -380,7 +380,7 @@ char *LP_pricestr(char *base,char *rel) } else return(clonestr("{\"error\":\"cant find baserel pair\"}")); } - +// bids disappear? From 54e625655b315691eb8dd608ea77feb559bf15e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 10:49:26 +0300 Subject: [PATCH 218/910] Test --- iguana/exchanges/LP_commands.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 89905abc4..12ec548f2 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -207,6 +207,26 @@ char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) return(clonestr("{\"error\":\"need method in request\"}")); + else if ( strcmp(method,"help") == 0 ) + return(clonestr("{\"result\":\" \ +available localhost RPC commands:\n \ +setprice(base, rel, price)\n\ +myprice(base, rel)\n\ +enable(coin)\n\ +disable(coin)\n\ +inventory(coin)\n\ +candidates(txid, vout)\n\ +autotrade(txid, vout, maxprice)\n\ +swapstatus()\n\ +swapstatus(requestid, quoteid)\n\ +public API:\n \ +getcoins()\n\ +getpeers()\n\ +getutxos()\n\ +getutxos(coin, lastn)\n\ +orderbook(base, rel)\n\ +getprice(base, rel)\n\ +\"}")); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) { if ( USERPASS_COUNTER == 0 ) From 9aca9cedc4b6b520fe928173628ea7c39991adfe Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 21:41:31 +0300 Subject: [PATCH 219/910] Test --- iguana/exchanges/LP_rpc.c | 6 ++++++ iguana/exchanges/LP_transaction.c | 17 ++++++++++++++++- iguana/exchanges/loop | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 iguana/exchanges/loop diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 8353f2d23..31e1e0255 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -88,6 +88,12 @@ cJSON *LP_getinfo(char *symbol) return(bitcoin_json(coin,"getinfo","[]")); } +cJSON *LP_getmempool(char *symbol) +{ + struct iguana_info *coin = LP_coinfind(symbol); + return(bitcoin_json(coin,"getrawmempool","[]")); +} + cJSON *LP_gettxout(char *symbol,bits256 txid,int32_t vout) { char buf[128],str[65]; struct iguana_info *coin = LP_coinfind(symbol); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index b976dbb71..5c0c05dfd 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -193,12 +193,27 @@ int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { int32_t numconfirms = 100; #ifndef BASILISK_DISABLEWAITTX - cJSON *txobj; + cJSON *txobj,*array; int32_t i,n; + numconfirms = -1; if ( (txobj= LP_gettx(rawtx->coin->symbol,rawtx->I.signedtxid)) != 0 ) { numconfirms = jint(txobj,"confirmations"); free_json(txobj); } + else if ( (array= LP_getmempool(rawtx->coin->symbol)) != 0 ) + { + if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; iI.signedtxid,jbits256i(array,i)) == 0 ) + { + numconfirms = 0; + printf("found tx in mempool slot.%d\n",i); + break; + } + } + free_json(array); + } #endif return(numconfirms); } diff --git a/iguana/exchanges/loop b/iguana/exchanges/loop new file mode 100644 index 000000000..8703827ba --- /dev/null +++ b/iguana/exchanges/loop @@ -0,0 +1,7 @@ +while true +do +source userpass +#curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"setprice\",\"base\":\"REVS\",\"rel\":\"KMD\",\"price\":1.234}" +./s +sleep 3600 +done From aea6e29a02093767979ef60a658ea07addceaa11 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 21:44:19 +0300 Subject: [PATCH 220/910] Test --- iguana/exchanges/loop | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 iguana/exchanges/loop diff --git a/iguana/exchanges/loop b/iguana/exchanges/loop old mode 100644 new mode 100755 From e83b177e192b167c489350831bc9f39f8b3eb3a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 21:47:44 +0300 Subject: [PATCH 221/910] Test --- iguana/exchanges/LP_nativeDEX.c | 8 ++++++-- iguana/exchanges/LP_prices.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1e0aea7db..67fb646c0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -81,7 +81,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin,cJSON *coins) { //static uint16_t tmpport; - char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson; + char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -116,7 +116,11 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( (n= cJSON_GetArraySize(coins)) > 0 ) { for (i=0; i= sizeof(LP_priceinfos)/sizeof(*LP_priceinfos) ) { printf("cant add any more priceinfos\n"); From 157c1a1ec02733a8a51a81b5c6157e8957dfbe10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 21:50:02 +0300 Subject: [PATCH 222/910] Test --- iguana/exchanges/run | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/run b/iguana/exchanges/run index ccc62231a..deb5f6b77 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -1,2 +1,17 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\"}" & +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +{\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, +{\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, +{\"coin\":\"UNO\", \"name\":\"unobtanium\", \"pubtype\":130, \"p2shtype\":30, \"wiftype\":224, \"txfee\":1000000}, +{\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9, \"wiftype\":224, \"txfee\":10000}, +{\"coin\":\"ZEC\", \"name\":\"zcash\", \"pubtype\":184, \"p2shtype\":189, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"BTM\", \"name\":\"bitmark\", \"pubtype\":85, \"p2shtype\":5, \"wiftype\":213, \"txfee\":0}, +{\"coin\":\"CARB\", \"name\":\"carboncoin\", \"pubtype\":47, \"p2shtype\":5, \"wiftype\":175, \"txfee\":0}, +{\"coin\":\"ANC\", \"name\":\"anoncoin\", \"pubtype\":23, \"p2shtype\":5, \"wiftype\":151, \"txfee\":2000000}, +{\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, +{\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +]}" & From 6ade8b6618c6d93e9884337a281278c200a9a4e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:04:31 +0300 Subject: [PATCH 223/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 67fb646c0..059d07cf5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -123,13 +123,16 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i } } LP_privkey_updates(mypeer,pubsock,passphrase,amclient); + if ( (retstr= basilisk_swaplist()) != 0 ) + free(retstr); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) + { + printf("query utxo from %s\n",peer->ipaddr); LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + } } - if ( (retstr= basilisk_swaplist()) != 0 ) - free(retstr); if ( amclient != 0 ) { while ( 1 ) From e6336ef2ef315ba55ed82595811819e80bb45824 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:08:41 +0300 Subject: [PATCH 224/910] Test --- iguana/exchanges/LP_utxos.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 738392bd1..8d5c813da 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -281,7 +281,12 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs //printf("parse.(%s)\n",jprint(item,0)); utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); if ( utxo != 0 ) + { + struct LP_quoteinfo Q; + memset(&Q,0,sizeof(Q)); utxo->lasttime = now; + LP_query("price",&Q,utxo->ipaddr,utxo->port,utxo->coin,"KMD",utxo->mypub); + } } } // else printf("skip.(%s)\n",jprint(item,0)); } From d42ef22396fbc465bb64268c54d98585d72bd412 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:20:51 +0300 Subject: [PATCH 225/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_prices.c | 2 ++ iguana/exchanges/LP_quotes.c | 30 +++++++++++++++++++++++++++--- iguana/exchanges/LP_utxos.c | 3 --- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 12ec548f2..6e2410209 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -309,7 +309,7 @@ getprice(base, rel)\n\ if ( (utxo= LP_utxofind(txid,vout)) == 0 ) return(clonestr("{\"error\":\"txid/vout not found\"}")); if ( strcmp(method,"candidates") == 0 ) - return(jprint(LP_tradecandidates(utxo,coin),1)); + return(jprint(LP_tradecandidates(coin),1)); else return(jprint(LP_autotrade(utxo,coin,jdouble(argjson,"maxprice")),1)); } } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index e418c6899..b75202a12 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -205,5 +205,6 @@ char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *meth uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend); double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); +void LP_quotesinit(char *base,char *rel); #endif diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 31a558aab..92134e254 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -356,6 +356,8 @@ char *LP_orderbook(char *base,char *rel) jaddstr(retjson,"base",base); jaddstr(retjson,"rel",rel); jaddnum(retjson,"timestamp",now); + if ( numbids == 0 && numasks == 0 ) + LP_quotesinit(base,rel); return(jprint(retjson,1)); } diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index de9407ea8..86a8a7966 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -196,14 +196,14 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) return(-1); } -cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) +cJSON *LP_tradecandidates(char *base) { struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; double price; - if ( (price= LP_price(base,myutxo->coin)) == .0 ) + /*if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); return(0); - } + }*/ totaladded = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -248,6 +248,30 @@ cJSON *LP_tradecandidates(struct LP_utxoinfo *myutxo,char *base) return(retarray); } +void LP_quotesinit(char *base,char *rel) +{ + cJSON *array,*item; struct LP_quoteinfo Q; bits256 zero; int32_t i,n,iter; + memset(&zero,0,sizeof(zero)); + for (iter=0; iter<2; iter++) + if ( (array= LP_tradecandidates(iter == 0 ? base : rel)) != 0 ) + { + //printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + memset(&Q,0,sizeof(Q)); + for (i=0; ilasttime = now; - LP_query("price",&Q,utxo->ipaddr,utxo->port,utxo->coin,"KMD",utxo->mypub); } } } // else printf("skip.(%s)\n",jprint(item,0)); From 5edf12dad25c0d24e9a6812fcd40ec7f44f7d463 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:21:35 +0300 Subject: [PATCH 226/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 86a8a7966..131d2b5ea 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -279,7 +279,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) bestprice = 0.; if ( maxprice == 0. ) maxprice = LP_price(base,myutxo->coin) / 0.975; - if ( (array= LP_tradecandidates(myutxo,base)) != 0 ) + if ( (array= LP_tradecandidates(base)) != 0 ) { //printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); if ( (n= cJSON_GetArraySize(array)) > 0 ) From eae10cc2a05a8c2166b0e982c9ddbae8b5036b7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:22:42 +0300 Subject: [PATCH 227/910] Test --- iguana/exchanges/LP_prices.c | 4 ++-- iguana/exchanges/LP_quotes.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 92134e254..d9426bcc1 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -356,8 +356,8 @@ char *LP_orderbook(char *base,char *rel) jaddstr(retjson,"base",base); jaddstr(retjson,"rel",rel); jaddnum(retjson,"timestamp",now); - if ( numbids == 0 && numasks == 0 ) - LP_quotesinit(base,rel); + //if ( numbids == 0 && numasks == 0 ) + // LP_quotesinit(base,rel); return(jprint(retjson,1)); } diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 131d2b5ea..9f60580bb 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -198,7 +198,7 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) cJSON *LP_tradecandidates(char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; double price; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; /*if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); From cd24a9f73467d6473bae11ae59d592d5799240ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:28:31 +0300 Subject: [PATCH 228/910] Test --- iguana/exchanges/LP_quotes.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 9f60580bb..4194b6966 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -198,7 +198,7 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) cJSON *LP_tradecandidates(char *base) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; /*if ( (price= LP_price(base,myutxo->coin)) == .0 ) { printf("no LP_price (%s -> %s)\n",base,myutxo->coin); @@ -210,7 +210,7 @@ cJSON *LP_tradecandidates(char *base) n = added = 0; if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { - //printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); + printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); if ( (array= cJSON_Parse(utxostr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) @@ -281,7 +281,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) maxprice = LP_price(base,myutxo->coin) / 0.975; if ( (array= LP_tradecandidates(base)) != 0 ) { - //printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); + printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); if ( (n= cJSON_GetArraySize(array)) > 0 ) { memset(prices,0,sizeof(prices)); From da9190acb729de01ba729ac910bdb66db3444f70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:32:56 +0300 Subject: [PATCH 229/910] Test --- iguana/exchanges/LP_quotes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 4194b6966..943b103e2 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -207,6 +207,7 @@ cJSON *LP_tradecandidates(char *base) totaladded = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { + printf("%s:%u %s\n",peer->ipaddr,peer->port,base); n = added = 0; if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) { From a435a695da5b725ab59264d1849426d0b868a210 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 7 Jun 2017 22:36:00 +0300 Subject: [PATCH 230/910] Test --- iguana/exchanges/LP_peers.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 091943d4f..40e41fc37 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -52,6 +52,8 @@ struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32 uint32_t ipbits; int32_t pushsock,subsock,timeout,enabled; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; if ( strcmp(ipaddr,"173.208.149.42") == 0 ) return(0); + if ( strncmp(ipaddr,"5.9.253",strlen("5.9.253")) != 0 ) + return(0); ipbits = (uint32_t)calc_ipbits(ipaddr); expand_ipbits(checkip,ipbits); if ( strcmp(checkip,ipaddr) == 0 ) From a3537ffb5bfb2133d7a39886da11dbd00868ff23 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 8 Jun 2017 07:30:29 +0300 Subject: [PATCH 231/910] Randomize jumblr processing --- basilisk/jumblr.c | 80 ++++++++++++++++++++++++--------- iguana/exchanges/LP_nativeDEX.c | 4 ++ iguana/exchanges/LP_prices.c | 4 -- 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 2749560ee..9618a9421 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -642,7 +642,7 @@ void jumblr_utxoupdate(struct supernet_info *myinfo,char *dest,struct iguana_inf void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { //static uint32_t lasttime; - char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; int32_t iter,counter,chosen_one,n; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; if ( myinfo->IAMNOTARY != 0 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; @@ -682,24 +682,44 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + chosen_one = -1; + for (iter=counter=0; iter<2; iter++) { - if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) + counter = n = 0; + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { - if ( (retstr= jumblr_sendz_to_z(myinfo,coin,ptr->dest,zaddr,dstr(total))) != 0 ) + if ( iter == 1 && counter == chosen_one ) { - printf("sendz_to_z.(%s)\n",retstr); - free(retstr); + if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + { + if ( (retstr= jumblr_sendz_to_z(myinfo,coin,ptr->dest,zaddr,dstr(total))) != 0 ) + { + printf("n.%d counter.%d chosen_one.%d sendz_to_z.(%s)\n",n,counter,chosen_one,retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + free(zaddr); + break; + } } - ptr->spent = (uint32_t)time(NULL); - free(zaddr); - break; + counter++; } } + n++; + } + if ( counter == 0 ) + break; + if ( iter == 0 ) + { + OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one)); + if ( chosen_one < 0 ) + chosen_one = -chosen_one; + chosen_one %= counter; + printf("jumblr z->z chosen_one.%d of %d, from %d\n",chosen_one,counter,n); } } break; @@ -707,21 +727,41 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 if ( myinfo->runsilent == 0 ) { jumblr_opidsupdate(myinfo,coin); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + chosen_one = -1; + for (iter=0; iter<2; iter++) { - if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) + counter = n = 0; + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,""); - if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { - printf("sendz_to_t.(%s)\n",retstr); - free(retstr); + if ( iter == 1 && n == chosen_one ) + { + privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,""); + if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) + { + printf("sendz_to_t.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + break; + } + counter++; } - ptr->spent = (uint32_t)time(NULL); - break; } + n++; + } + if ( counter == 0 ) + break; + if ( iter == 0 ) + { + OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one)); + if ( chosen_one < 0 ) + chosen_one = -chosen_one; + chosen_one %= counter; + printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n); } } } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 059d07cf5..31cf337e8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -344,3 +344,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } +// splitfunds cant trade? +// timeout on bad peers + + diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index d9426bcc1..3122cd252 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -384,9 +384,5 @@ char *LP_pricestr(char *base,char *rel) } else return(clonestr("{\"error\":\"cant find baserel pair\"}")); } -// bids disappear? - - - From 8f36671b03276ed8800a0b1e0badf93bfbb51d77 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 8 Jun 2017 10:33:11 +0300 Subject: [PATCH 232/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 ++ iguana/exchanges/client_osx | 22 ++++++++++++++++++++++ iguana/exchanges/run_osx | 17 +++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100755 iguana/exchanges/client_osx create mode 100755 iguana/exchanges/run_osx diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 31cf337e8..97458867e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -82,6 +82,8 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { //static uint16_t tmpport; char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; + if ( amclient != 0 ) + myport += amclient * 10; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); diff --git a/iguana/exchanges/client_osx b/iguana/exchanges/client_osx new file mode 100755 index 000000000..a46cbff64 --- /dev/null +++ b/iguana/exchanges/client_osx @@ -0,0 +1,22 @@ +source randval +pkill -15 marketmaker; +git pull; + cd ..; +./m_mm; +./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +{\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, +{\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, +{\"coin\":\"UNO\", \"name\":\"unobtanium\", \"pubtype\":130, \"p2shtype\":30, \"wiftype\":224, \"txfee\":1000000}, +{\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9, \"wiftype\":224, \"txfee\":10000}, +{\"coin\":\"ZEC\", \"name\":\"zcash\", \"pubtype\":184, \"p2shtype\":189, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"BTM\", \"name\":\"bitmark\", \"pubtype\":85, \"p2shtype\":5, \"wiftype\":213, \"txfee\":0}, +{\"coin\":\"CARB\", \"name\":\"carboncoin\", \"pubtype\":47, \"p2shtype\":5, \"wiftype\":175, \"txfee\":0}, +{\"coin\":\"ANC\", \"name\":\"anoncoin\", \"pubtype\":23, \"p2shtype\":5, \"wiftype\":151, \"txfee\":2000000}, +{\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, +{\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +], \"userhome\":\"/${HOME#"/"}/Library/Application\ Support\", \"passphrase\":\"$randval\"}" & + diff --git a/iguana/exchanges/run_osx b/iguana/exchanges/run_osx new file mode 100755 index 000000000..e39934a75 --- /dev/null +++ b/iguana/exchanges/run_osx @@ -0,0 +1,17 @@ +source randval +pkill -15 marketmaker; git pull; cd ..; ./m_mm; ./marketmaker "{\"profitmargin\":0.01,\"userhome\":\"/${HOME#"/"}/Library/Application\ Support\",\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +{\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, +{\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, +{\"coin\":\"UNO\", \"name\":\"unobtanium\", \"pubtype\":130, \"p2shtype\":30, \"wiftype\":224, \"txfee\":1000000}, +{\"coin\":\"ZET\", \"name\":\"zetacoin\", \"pubtype\":80, \"p2shtype\":9, \"wiftype\":224, \"txfee\":10000}, +{\"coin\":\"ZEC\", \"name\":\"zcash\", \"pubtype\":184, \"p2shtype\":189, \"wiftype\":128, \"txfee\":10000}, +{\"coin\":\"BTM\", \"name\":\"bitmark\", \"pubtype\":85, \"p2shtype\":5, \"wiftype\":213, \"txfee\":0}, +{\"coin\":\"CARB\", \"name\":\"carboncoin\", \"pubtype\":47, \"p2shtype\":5, \"wiftype\":175, \"txfee\":0}, +{\"coin\":\"ANC\", \"name\":\"anoncoin\", \"pubtype\":23, \"p2shtype\":5, \"wiftype\":151, \"txfee\":2000000}, +{\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, +{\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +]}" & From dbd2fda204dd97e503a37c7e3529c4e096cc2f2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 8 Jun 2017 10:36:24 +0300 Subject: [PATCH 233/910] Test --- iguana/exchanges/LP_peers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 40e41fc37..1cd4c9056 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -50,10 +50,10 @@ char *LP_peers() struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,double profitmargin,int32_t numpeers,int32_t numutxos) { uint32_t ipbits; int32_t pushsock,subsock,timeout,enabled; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; - if ( strcmp(ipaddr,"173.208.149.42") == 0 ) + /*if ( strcmp(ipaddr,"173.208.149.42") == 0 ) return(0); if ( strncmp(ipaddr,"5.9.253",strlen("5.9.253")) != 0 ) - return(0); + return(0);*/ ipbits = (uint32_t)calc_ipbits(ipaddr); expand_ipbits(checkip,ipbits); if ( strcmp(checkip,ipaddr) == 0 ) From 756144f92ff76a3a638425940689f7877fe9d1ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 8 Jun 2017 10:37:52 +0300 Subject: [PATCH 234/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 97458867e..754ca56bc 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -82,8 +82,8 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i { //static uint16_t tmpport; char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; - if ( amclient != 0 ) - myport += amclient * 10; + //if ( amclient != 0 ) + // myport += amclient * 10; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); From 9130b5e367d011f1761e5ca5627c8d23fe21fe30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:00:01 +0300 Subject: [PATCH 235/910] New utxoinfo --- iguana/coins/genltc | 2 +- iguana/exchanges/LP_coins.c | 8 +- iguana/exchanges/LP_commands.c | 336 +++++++++++++------------ iguana/exchanges/LP_forwarding.c | 165 +++++++++++++ iguana/exchanges/LP_include.h | 66 +++-- iguana/exchanges/LP_nativeDEX.c | 344 ++++++++++++++------------ iguana/exchanges/LP_peers.c | 24 +- iguana/exchanges/LP_quotes.c | 54 ++-- iguana/exchanges/LP_rpc.c | 18 +- iguana/exchanges/LP_swap.c | 84 +++---- iguana/exchanges/LP_transaction.c | 53 ++-- iguana/exchanges/LP_utxos.c | 394 +++++++++++++++++++++--------- 12 files changed, 976 insertions(+), 572 deletions(-) create mode 100644 iguana/exchanges/LP_forwarding.c diff --git a/iguana/coins/genltc b/iguana/coins/genltc index 9994529e0..ea034ed80 100755 --- a/iguana/coins/genltc +++ b/iguana/coins/genltc @@ -1,4 +1,4 @@ #!/bin/bash -curl --url "http://127.0.0.1:7776" --data "{\"RELAY\":1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":68,\"endpend\":68,\"services\":129,\"maxpeers\":256,\"newcoin\":\"LTC\",\"name\":\"Litecoin\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"fbc0b6db\",\"p2p\":9333,\"rpc\":9332,\"pubval\":48,\"p2shval\":5,\"wifval\":176,\"txfee_satoshis\":\"100000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2\",\"genesis\":{\"version\":1,\"timestamp\":1317972665,\"nBits\":\"1e0ffff0\",\"nonce\":2084524493,\"merkle_root\":\"97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9\"},\"alertpubkey\":\"040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9\",\"protover\":70002}" +curl --url "http://127.0.0.1:7778" --data "{\"RELAY\":1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":68,\"endpend\":68,\"services\":129,\"maxpeers\":256,\"newcoin\":\"LTC\",\"name\":\"Litecoin\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"fbc0b6db\",\"p2p\":9333,\"rpc\":9332,\"pubval\":48,\"p2shval\":5,\"wifval\":176,\"txfee_satoshis\":\"100000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2\",\"genesis\":{\"version\":1,\"timestamp\":1317972665,\"nBits\":\"1e0ffff0\",\"nonce\":2084524493,\"merkle_root\":\"97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9\"},\"alertpubkey\":\"040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9\",\"protover\":70002}" diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index e2951dad5..c06acd1a1 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -185,6 +185,7 @@ void LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetnam coin->pubtype = pubtype; coin->p2shtype = p2shtype; coin->wiftype = wiftype; + coin->inactive = (uint32_t)time(NULL); LP_userpass(coin->userpass,symbol,assetname,name); } @@ -256,7 +257,7 @@ struct iguana_info *LP_coinfind(char *symbol) struct iguana_info *LP_coincreate(cJSON *item) { - struct iguana_info cdata,*coin; int32_t isPoS,longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol,*assetname; + struct iguana_info cdata,*coin=0; int32_t isPoS,longestchain = 1000000; uint16_t port; uint64_t txfee; double estimatedrate; uint8_t pubtype,p2shtype,wiftype; char *name,*symbol,*assetname; 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"); @@ -275,9 +276,10 @@ struct iguana_info *LP_coincreate(cJSON *item) else if ( (name= jstr(item,"name")) == 0 ) name = symbol; LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); - if ( (coin= LP_coinadd(&cdata)) != 0 ) - coin->inactive = !jint(item,"active"); + coin = LP_coinadd(&cdata); } + if ( coin != 0 && item != 0 ) + coin->inactive = (strcmp("KMD",coin->symbol) == 0) ? 0 : !jint(item,"active"); return(0); } diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6e2410209..5972a432a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -18,71 +18,159 @@ // marketmaker // -double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub) +double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub) { - cJSON *reqjson; struct LP_peerinfo *peer; int32_t i,flag = 0,pushsock = -1; double price = 0.; - if ( ipaddr != 0 && port >= 1000 ) + cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; + qp->desthash = mypub; + strcpy(qp->srccoin,base); + strcpy(qp->destcoin,rel); + if ( strcmp(method,"request") == 0 ) { - if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),port)) == 0 ) - peer = LP_addpeer(1,0,-1,ipaddr,port,port+1,port+2,0,0,0); - if ( peer != 0 ) + qp->quotetime = (uint32_t)time(NULL); + if ( (utxo= LP_utxofind(0,qp->desttxid,qp->destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) + LP_unavailableset(utxo,qp->srchash); + else { - if ( (pushsock= peer->pushsock) >= 0 ) + printf("couldnt find my txid to make request\n"); + return(0.); + } + } + reqjson = LP_quotejson(qp); + if ( bits256_nonz(qp->desthash) != 0 ) + flag = 1; + jaddstr(reqjson,"method",method); + if ( strcmp(method,"price") != 0 ) + printf("QUERY.(%s)\n",jprint(reqjson,0)); + LP_pubkey_send(qp->srchash,jprint(reqjson,1),1); + for (i=0; i<30; i++) + { + if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) != 0. ) + { + if ( flag == 0 || bits256_nonz(qp->desthash) != 0 ) { - qp->desthash = mypub; - strcpy(qp->srccoin,base); - strcpy(qp->destcoin,rel); - if ( strcmp(method,"request") == 0 ) - qp->quotetime = (uint32_t)time(NULL); - reqjson = LP_quotejson(qp); - if ( bits256_nonz(qp->desthash) != 0 ) - flag = 1; - jaddstr(reqjson,"method",method); - if ( strcmp(method,"price") != 0 ) - printf("QUERY.(%s)\n",jprint(reqjson,0)); - LP_send(pushsock,jprint(reqjson,1),1); - for (i=0; i<30; i++) - { - if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) != 0. ) - { - if ( flag == 0 || bits256_nonz(qp->desthash) != 0 ) - { - //printf("break out of loop.%d price %.8f\n",i,price); - break; - } - } - usleep(100000); - } - } else printf("no pushsock for peer.%s:%u\n",ipaddr,port); - } else printf("cant find/create peer.%s:%u\n",ipaddr,port); + //printf("break out of loop.%d price %.8f\n",i,price); + break; + } + } + usleep(100000); } return(price); } -int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) +int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) +{ + char *retstr,pairstr[512]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + if ( (price= LP_price(base,rel)) != 0. ) + { + price *= (1. + profitmargin); + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + if ( LP_quoteparse(&Q,argjson) < 0 ) + return(-2); + //printf("connect with.(%s)\n",jprint(argjson,0)); + Q.destsatoshis = Q.satoshis * price; + privkey = LP_privkey(utxo->coinaddr); + if ( bits256_nonz(utxo->S.mypub) == 0 ) + utxo->S.mypub = LP_pubkey(privkey); + if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + { + printf("not eligible\n"); + return(-1); + } + if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + { + nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); + if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) + printf("error creating utxo->pair\n"); + else if ( nn_bind(pair,pairstr) >= 0 ) + { + LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); + swap = LP_swapinit(1,0,privkey,&Q.R,&Q); + swap->N.pair = pair; + utxo->S.swap = swap; + swap->utxo = utxo; + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)swap) == 0 ) + { + retjson = LP_quotejson(&Q); + jaddstr(retjson,"method","connected"); + jaddstr(retjson,"pair",pairstr); + jaddnum(retjson,"requestid",Q.R.requestid); + jaddnum(retjson,"quoteid",Q.R.quoteid); + retstr = jprint(retjson,1); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else LP_pubkey_send(utxo->S.otherpubkey,retstr,1); + retval = 0; + } else printf("error launching swaploop\n"); + } else printf("printf error nn_connect to %s\n",pairstr); + } + else + { + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); + } + } else printf("no price for %s/%s\n",base,rel); + if ( retval < 0 ) + { + if ( pair >= 0 ) + nn_close(pair); + LP_availableset(utxo); + } + return(retval); +} + +char *LP_connected(cJSON *argjson) // alice +{ + cJSON *retjson; int32_t pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; + retjson = cJSON_CreateObject(); + LP_quoteparse(&Q,argjson); + if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) + { + if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) + jaddstr(retjson,"error","couldnt create pairsock"); + else if ( nn_connect(pairsock,pairstr) >= 0 ) + { + LP_unavailableset(utxo,Q.srchash); + Q.privkey = LP_privkey(Q.destaddr); + LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); + swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); + swap->N.pair = pairsock; + utxo->S.swap = swap; + swap->utxo = utxo; + printf("alice pairstr.(%s)\n",pairstr); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) + { + jaddstr(retjson,"result","success"); + jadd(retjson,"trade",LP_quotejson(&Q)); + jaddnum(retjson,"requestid",Q.R.requestid); + jaddnum(retjson,"quoteid",Q.R.quoteid); + } else jaddstr(retjson,"error","couldnt aliceloop"); + } + } else jaddstr(retjson,"result","update stats"); + return(jprint(retjson,1)); +} + +int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method,*base,*rel,*retstr,pairstr[512]; cJSON *retjson; double price; bits256 privkey,txid; struct LP_utxoinfo *utxo; int32_t retval = -1,DEXselector = 0; uint64_t destvalue; struct basilisk_request R; struct LP_quoteinfo Q; - if ( IAMCLIENT == 0 && (method= jstr(argjson,"method")) != 0 ) + char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid; struct LP_utxoinfo *utxo; int32_t retval = -1; struct LP_quoteinfo Q; + if ( (method= jstr(argjson,"method")) != 0 ) { txid = jbits256(argjson,"txid"); - if ( (utxo= LP_utxofind(txid,jint(argjson,"vout"))) != 0 && strcmp(utxo->ipaddr,mypeer->ipaddr) == 0 && utxo->port == mypeer->port && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) + if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) != 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { printf("LP_command.(%s)\n",jprint(argjson,0)); - if ( time(NULL) > utxo->swappending ) - utxo->swappending = 0; - if ( strcmp(method,"price") == 0 || strcmp(method,"request") == 0 ) + if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) + utxo->T.swappending = 0; + if ( strcmp(method,"price") == 0 || strcmp(method,"request") == 0 ) // bob { retval = 1; - if ( utxo->swappending == 0 ) + if ( LP_isavailable(utxo) > 0 ) { - if ( strcmp(method,"request") == 0 && utxo->pair >= 0 ) - nn_close(utxo->pair), utxo->pair = -1; if ( (price= LP_price(base,rel)) != 0. ) { price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); return(-1); @@ -90,121 +178,40 @@ int32_t LP_command(struct LP_peerinfo *mypeer,int32_t pubsock,cJSON *argjson,uin if ( strcmp(method,"price") == 0 ) Q.timestamp = (uint32_t)time(NULL); retjson = LP_quotejson(&Q); + utxo->S.otherpubkey = jbits256(argjson,"desthash"); if ( strcmp(method,"request") == 0 ) { retval |= 2; - utxo->swappending = (uint32_t)(time(NULL) + LP_RESERVETIME); - utxo->otherpubkey = jbits256(argjson,"desthash"); + LP_unavailableset(utxo,jbits256(argjson,"desthash")); jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); - jaddnum(retjson,"pending",utxo->swappending); - jaddbits256(retjson,"desthash",utxo->otherpubkey); + jaddnum(retjson,"pending",utxo->T.swappending); + jaddbits256(retjson,"desthash",utxo->S.otherpubkey); jaddstr(retjson,"method","reserved"); } else jaddstr(retjson,"method","quote"); retstr = jprint(retjson,1); - LP_send(pubsock,retstr,1); - utxo->published = (uint32_t)time(NULL); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else LP_pubkey_send(utxo->S.otherpubkey,retstr,1); + utxo->T.published = (uint32_t)time(NULL); } else printf("null price\n"); - } else printf("swappending.%u pair.%d\n",utxo->swappending,utxo->pair); + } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); } - else if ( strcmp(method,"connect") == 0 ) + else if ( strcmp(method,"connect") == 0 ) // bob { retval = 4; - if ( utxo->pair < 0 ) - { - if ( (price= LP_price(base,rel)) != 0. ) - { - price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - if ( LP_quoteparse(&Q,argjson) < 0 ) - return(-2); - //printf("connect with.(%s)\n",jprint(argjson,0)); - Q.destsatoshis = Q.satoshis * price; - privkey = LP_privkey(utxo->coinaddr); - if ( bits256_nonz(utxo->mypub) == 0 ) - utxo->mypub = LP_pubkey(privkey); - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) - { - printf("not eligible\n"); - return(-1); - } - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->swappending && bits256_cmp(utxo->mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) - { - nanomsg_tcpname(pairstr,mypeer->ipaddr,10000+(rand() % 10000)); - if ( (utxo->pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) - printf("error creating utxo->pair\n"); - else if ( nn_bind(utxo->pair,pairstr) >= 0 ) - { - LP_requestinit(&R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)utxo) == 0 ) - { - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","connected"); - jaddstr(retjson,"pair",pairstr); - jaddnum(retjson,"requestid",R.requestid); - jaddnum(retjson,"quoteid",R.quoteid); - retstr = jprint(retjson,1); - LP_send(pubsock,retstr,1); - utxo->swap = LP_swapinit(1,0,privkey,&R,&Q); - } - else - { - printf("error launching swaploop\n"); - free(utxo->swap); - utxo->swap = 0; - nn_close(utxo->pair); - utxo->pair = -1; - } - } - else - { - printf("printf error nn_connect to %s\n",pairstr); - nn_close(utxo->pair); - utxo->pair = -1; - } - } else printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->swappending ,bits256_cmp(utxo->mypub,Q.srchash) == 0 , LP_txvalue(rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); - } else printf("no price for %s/%s\n",base,rel); - } else printf("utxo->pair.%d when connect came in (%s)\n",utxo->pair,jprint(argjson,0)); + if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) + LP_connectstart(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); + else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); } } } return(retval); } -char *LP_connected(cJSON *argjson) -{ - cJSON *retjson; int32_t pairsock = -1; char *pairstr; struct LP_quoteinfo *qp; int32_t DEXselector = 0; - retjson = cJSON_CreateObject(); - if ( IAMCLIENT == 0 ) - jaddstr(retjson,"result","update stats"); - else - { - if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) - jaddstr(retjson,"error","couldnt create pairsock"); - else if ( nn_connect(pairsock,pairstr) >= 0 ) - { - qp = calloc(1,sizeof(*qp)); - LP_quoteparse(qp,argjson); - qp->pair = pairsock; - qp->privkey = LP_privkey(qp->destaddr); - LP_requestinit(&qp->R,qp->srchash,qp->desthash,qp->srccoin,qp->satoshis,qp->destcoin,qp->destsatoshis,qp->timestamp,qp->quotetime,DEXselector); - printf("alice pairstr.(%s)\n",pairstr); - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)qp) == 0 ) - { - jaddstr(retjson,"result","success"); - jadd(retjson,"trade",LP_quotejson(qp)); - } else jaddstr(retjson,"error","couldnt aliceloop"); - } - } - return(jprint(retjson,1)); -} - -// addcoin api - char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t amclient,otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) return(clonestr("{\"error\":\"need method in request\"}")); else if ( strcmp(method,"help") == 0 ) @@ -226,6 +233,9 @@ getutxos()\n\ getutxos(coin, lastn)\n\ orderbook(base, rel)\n\ getprice(base, rel)\n\ +register(pubkey,pushaddr)\n\ +lookup(pubkey)\n\ +forward(pubkey,hexstr)\n\ \"}")); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) { @@ -250,9 +260,9 @@ getprice(base, rel)\n\ return(clonestr("{\"error\":\"couldnt set price\"}")); else { - if ( IAMCLIENT == 0 ) + if ( IAMLP != 0 ) { - HASH_ITER(hh,LP_utxoinfos,utxo,tmp) + HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { if ( LP_ismine(utxo) != 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); @@ -294,10 +304,10 @@ getprice(base, rel)\n\ return(clonestr("{\"error\":\"coin is disabled\"}")); if ( strcmp(method,"inventory") == 0 ) { - LP_privkey_init(0,-1,coin,0,USERPASS_WIFSTR,1); - return(LP_inventory(coin)); + LP_privkey_init(-1,coin,0,USERPASS_WIFSTR,0); + return(LP_inventory(coin,jobj(argjson,"client") != 0 ? jint(argjson,"client") : 0)); } - else if ( IAMCLIENT != 0 && (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) + else if ( (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) { bits256 txid; int32_t vout; struct LP_utxoinfo *utxo; txid = jbits256(argjson,"txid"); @@ -306,7 +316,7 @@ getprice(base, rel)\n\ if ( jobj(argjson,"vout") == 0 ) return(clonestr("{\"error\":\"missing vout\"}")); vout = jint(argjson,"vout"); - if ( (utxo= LP_utxofind(txid,vout)) == 0 ) + if ( (utxo= LP_utxofind(1,txid,vout)) == 0 ) return(clonestr("{\"error\":\"txid/vout not found\"}")); if ( strcmp(method,"candidates") == 0 ) return(jprint(LP_tradecandidates(coin),1)); @@ -325,7 +335,6 @@ getprice(base, rel)\n\ return(clonestr("{\"error\":\"at least one of coins disabled\"}")); if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) return(clonestr("{\"error\":\"coin is disabled\"}")); - amclient = (LP_mypeer == 0); if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) @@ -344,7 +353,7 @@ getprice(base, rel)\n\ peer->numutxos = othernumutxos; } //printf("peer.(%s) found (%d %d) (%d %d) (%s)\n",peer->ipaddr,peer->numpeers,peer->numutxos,otherpeers,othernumutxos,jprint(argjson,0)); - } else LP_addpeer(amclient,LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); + } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); } } //printf("CMD.(%s)\n",jprint(argjson,0)); @@ -362,21 +371,30 @@ getprice(base, rel)\n\ retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); - else if ( IAMCLIENT == 0 && strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) - { - retstr = LP_utxos(LP_mypeer,coin,jint(argjson,"lastn")); - //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); - } - else if ( IAMCLIENT == 0 && strcmp(method,"notify") == 0 ) - retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); - else if ( IAMCLIENT == 0 && strcmp(method,"notified") == 0 ) + else if ( IAMLP != 0 ) { - if ( juint(argjson,"timestamp") > time(NULL)-60 ) + if ( strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) { - printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(amclient,LP_mypeer,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jstr(argjson,"ipaddr"),juint(argjson,"port"),jdouble(argjson,"profit")); + retstr = LP_utxos(1,LP_mypeer,coin,jint(argjson,"lastn")); + //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); + } + else if ( strcmp(method,"register") == 0 ) + retstr = LP_register(jbits256(argjson,"pubkey"),jstr(argjson,"pushaddr")); + else if ( strcmp(method,"lookup") == 0 ) + retstr = LP_lookup(jbits256(argjson,"pubkey")); + else if ( strcmp(method,"forward") == 0 ) + retstr = LP_forward(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr")); + else if ( strcmp(method,"notify") == 0 ) + retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); + else if ( strcmp(method,"notified") == 0 ) + { + if ( juint(argjson,"timestamp") > time(NULL)-60 ) + { + printf("utxonotify.(%s)\n",jprint(argjson,0)); + LP_addutxo(1,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit")); + } + retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } - retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } if ( retstr != 0 ) return(retstr); diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c new file mode 100644 index 000000000..2dd260294 --- /dev/null +++ b/iguana/exchanges/LP_forwarding.c @@ -0,0 +1,165 @@ + +/****************************************************************************** + * 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_forwarding.c +// marketmaker +// + +struct LP_forwardinfo +{ + UT_hash_handle hh; + bits256 pubkey; + char pushaddr[64]; + int32_t pushsock; + uint32_t lasttime; +} *LP_forwardinfos; +#define LP_KEEPALIVE 300 + +struct LP_forwardinfo *LP_forwardfind(bits256 pubkey) +{ + struct LP_forwardinfo *ptr=0; + portable_mutex_lock(&LP_forwardmutex); + HASH_FIND(hh,LP_forwardinfos,&pubkey,sizeof(pubkey),ptr); + portable_mutex_unlock(&LP_forwardmutex); + if ( ptr != 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) + return(ptr); + else return(0); +} + +char *LP_lookup(bits256 pubkey) +{ + if ( LP_forwardfind(pubkey) != 0 ) + return(clonestr("{\"result\":\"success\",\"forwarding\":1}")); + else return(clonestr("{\"error\":\"notfound\"}")); +} + +char *LP_register(bits256 pubkey,char *pushaddr) +{ + struct LP_forwardinfo *ptr=0; int32_t pushsock; + if ( is_ipaddr(pushaddr) == 0 ) + return(clonestr("{\"error\":\"illegal ipaddr\"}")); + if ( (ptr= LP_forwardfind(pubkey)) != 0 ) + { + ptr->lasttime = (uint32_t)time(NULL); + return(clonestr("{\"error\":\"already registered\"}")); + } + else if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) + return(clonestr("{\"error\":\"out of sockets\"}")); + else if ( nn_connect(pushsock,pushaddr) < 0 ) + { + nn_close(pushsock); + return(clonestr("{\"error\":\"cant connect\"}")); + } + else + { + ptr = calloc(1,sizeof(*ptr)); + ptr->pubkey = pubkey; + strcpy(ptr->pushaddr,pushaddr); + ptr->pushsock = pushsock; + ptr->lasttime = (uint32_t)time(NULL); + portable_mutex_lock(&LP_forwardmutex); + HASH_ADD_KEYPTR(hh,LP_forwardinfos,&ptr->pubkey,sizeof(ptr->pubkey),ptr); + portable_mutex_unlock(&LP_forwardmutex); + return(LP_lookup(pubkey)); + } +} + +char *LP_forward(bits256 pubkey,char *hexstr) +{ + struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; cJSON *retjson; + if ( hexstr == 0 || hexstr[0] == 0 ) + return(clonestr("{\"error\":\"nohex\"}")); + if ( (ptr= LP_forwardfind(pubkey)) != 0 ) + { + if ( ptr->pushsock >= 0 ) + { + datalen = (int32_t)strlen(hexstr) >> 1; + data = malloc(datalen); + decode_hex(data,datalen,hexstr); + sentbytes = LP_send(ptr->pushsock,(char *)data,1); + } + retjson = cJSON_CreateObject(); + if ( sentbytes == datalen ) + { + jaddstr(retjson,"result","success"); + jaddnum(retjson,"forwarded",sentbytes); + return(jprint(retjson,1)); + } + else + { + jaddstr(retjson,"error","send error"); + jaddnum(retjson,"sentbytes",sentbytes); + jaddnum(retjson,"datalen",datalen); + return(jprint(retjson,1)); + } + } else return(clonestr("{\"error\":\"notfound\"}")); +} + +void LP_forwarding_register(bits256 pubkey,char *pushaddr) +{ + char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t retval = -1; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jint(retjson,"registered") != 0 ) + retval = 0; + free_json(retjson); + } + free(retstr); + } + if ( retval == 0 ) + break; + } +} + +int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) +{ + struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson; + if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) + { + return(LP_send(ptr->pushsock,jsonstr,1)); + } + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (retstr= issue_LP_lookup(peer->ipaddr,peer->port,pubkey)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jint(retjson,"forwarding") != 0 ) + retval = 0; + free_json(retjson); + } + free(retstr); + } + if ( retval == 0 ) + { + len = (int32_t)strlen(jsonstr) + 1; + hexstr = malloc(len*2 + 1); + init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); + if ( freeflag != 0 ) + free(jsonstr); + if ( peer->pushsock >= 0 ) + return(LP_send(peer->pushsock,hexstr,1)); + } + } + return(-1); +} + + + diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b75202a12..dd2422cdf 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -46,7 +46,7 @@ #define BASILISK_KEYSIZE ((int32_t)(2*sizeof(bits256)+sizeof(uint32_t)*2)) extern char GLOBAL_DBDIR[],USERPASS[],USERPASS_WIFSTR[]; -extern int32_t IAMCLIENT,USERPASS_COUNTER; +extern int32_t IAMLP,USERPASS_COUNTER; struct iguana_msgvin { bits256 prev_hash; uint8_t *vinscript,*userdata,*spendscript,*redeemscript; uint32_t prev_vout,sequence; uint16_t scriptlen,p2shlen,userdatalen,spendlen; }; @@ -139,42 +139,34 @@ struct basilisk_swapinfo struct iguana_info { - uint64_t txfee; double estimatedrate; + uint64_t txfee; double estimatedrate,profitmargin; int32_t longestchain; uint32_t counter,inactive; uint8_t pubtype,p2shtype,isPoS,wiftype; char symbol[16],smartaddr[64],userpass[1024],serverport[128]; }; -struct basilisk_swap -{ - void *ctx; struct iguana_info bobcoin,alicecoin; - void (*balancingtrade)(struct basilisk_swap *swap,int32_t iambob); - int32_t subsock,pushsock,connected,aliceunconf,depositunconf,paymentunconf; uint32_t lasttime,aborted; - FILE *fp; - bits256 persistent_privkey,persistent_pubkey; - struct basilisk_swapinfo I; - struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; - bits256 privkeys[INSTANTDEX_DECKSIZE]; - struct basilisk_swapmessage *messages; int32_t nummessages; - char Bdeposit[64],Bpayment[64]; - uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t persistent_pubkey33[33],changermd160[20],pad[15],verifybuf[65536]; - -}; +struct _LP_utxoinfo { bits256 txid; uint64_t value; int32_t vout; }; + +struct LP_utxostats { uint32_t lasttime,errors,swappending,published,spentflag,lastspentcheck; }; + +struct LP_utxobob { struct _LP_utxoinfo utxo,deposit; }; + +struct LP_utxoalice { struct _LP_utxoinfo utxo,fee; }; + +struct LP_utxoswap { bits256 otherpubkey,mypub; void *swap; uint64_t satoshis; double profitmargin; }; struct LP_utxoinfo { UT_hash_handle hh,hh2; - bits256 txid,txid2,feetxid,otherpubkey,mypub; - void *swap; - uint64_t value,satoshis,value2; + bits256 pubkey; + struct _LP_utxoinfo payment,deposit,fee; + struct LP_utxostats T; + struct LP_utxoswap S; + //struct LP_utxonetwork N; + int32_t iambob,iamlp; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; uint8_t key2[sizeof(bits256) + sizeof(int32_t)]; - int32_t vout,vout2,pair; - uint32_t lasttime,errors,swappending,published,spentflag,lastspentcheck; - double profitmargin; - char ipaddr[64],coinaddr[64],spendscript[256],coin[16]; - uint16_t port; + char coin[16],coinaddr[64],spendscript[256]; }; struct LP_peerinfo @@ -197,13 +189,33 @@ struct LP_quoteinfo char srccoin[16],coinaddr[64],destcoin[16],destaddr[64]; }; +struct LP_endpoint { int32_t pair; char ipaddr[64]; uint16_t port; }; + +struct basilisk_swap +{ + void *ctx; struct iguana_info bobcoin,alicecoin; struct LP_utxoinfo *utxo; + struct LP_endpoint N; + void (*balancingtrade)(struct basilisk_swap *swap,int32_t iambob); + int32_t subsock,pushsock,connected,aliceunconf,depositunconf,paymentunconf; uint32_t lasttime,aborted; + FILE *fp; + bits256 persistent_privkey,persistent_pubkey; + struct basilisk_swapinfo I; + struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; + bits256 privkeys[INSTANTDEX_DECKSIZE]; + struct basilisk_swapmessage *messages; int32_t nummessages; + char Bdeposit[64],Bpayment[64]; + uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint8_t persistent_pubkey33[33],changermd160[20],pad[15],verifybuf[65536]; + +}; + void basilisk_dontforget_update(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx); uint32_t basilisk_requestid(struct basilisk_request *rp); uint32_t basilisk_quoteid(struct basilisk_request *rp); struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 privkey,struct basilisk_request *rp,struct LP_quoteinfo *qp); char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params); uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend); -double LP_query(char *method,struct LP_quoteinfo *qp,char *ipaddr,uint16_t port,char *base,char *rel,bits256 mypub); +double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 754ca56bc..b2d4e7369 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -17,13 +17,13 @@ // LP_nativeDEX.c // marketmaker // -// jl777: fix price calcs based on specific txfees +// jl777: profitmargin per coin, ignore peers with errors #include #include "LP_include.h" #include "LP_network.c" -struct LP_utxoinfo *LP_utxoinfos,*LP_utxoinfos2; +struct LP_utxoinfo *LP_utxoinfos[2],*LP_utxoinfos2[2]; struct LP_peerinfo *LP_peerinfos,*LP_mypeer; char *activecoins[] = { "BTC", "KMD" }; @@ -32,11 +32,11 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", -portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex; +portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex; int32_t LP_mypubsock = -1; -int32_t Client_connections; -int32_t USERPASS_COUNTER,IAMCLIENT = 0; +int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; +bits256 LP_mypubkey; // stubs int32_t basilisk_istrustedbob(struct basilisk_swap *swap) @@ -76,26 +76,124 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_peers.c" #include "LP_utxos.c" #include "LP_quotes.c" +#include "LP_forwarding.c" #include "LP_commands.c" -void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,int32_t pullsock,uint16_t myport,int32_t amclient,char *passphrase,double profitmargin,cJSON *coins) +int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { - //static uint16_t tmpport; - char *retstr; uint8_t r; int32_t i,n,j,len,recvsize,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now; struct LP_utxoinfo *utxo,*utmp; void *ptr; cJSON *argjson,*item; - //if ( amclient != 0 ) - // myport += amclient * 10; + int32_t recvsize,len,datalen,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson; + while ( (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + { + nonz++; + if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) + { + datalen >>= 1; + jsonstr = malloc(datalen + 1); + decode_hex((void *)jsonstr,datalen,(char *)ptr); + jsonstr[datalen] = 0; + } else jsonstr = (char *)ptr; + if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) + { + len = (int32_t)strlen(jsonstr) + 1; + portable_mutex_lock(&LP_commandmutex); + if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) + { + if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) + { + printf("%s PULL.[%d] %s\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,(char *)ptr); + free(retstr); + } + } + portable_mutex_unlock(&LP_commandmutex); + free_json(argjson); + } + if ( (void *)jsonstr != ptr ) + free(jsonstr); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; + } + return(nonz); +} + +int32_t LP_subsock_check(struct LP_peerinfo *peer) +{ + int32_t recvsize,nonz = 0; char *retstr; void *ptr; cJSON *argjson; + while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) + { + nonz++; + if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) + { + portable_mutex_lock(&LP_commandmutex); + if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) + { + //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + free(retstr); + } + portable_mutex_unlock(&LP_commandmutex); + free_json(argjson); + } else printf("error parsing.(%s)\n",(char *)ptr); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; + } + return(nonz); +} + +void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitmargin) +{ + struct _LP_utxoinfo u; char str[65]; uint32_t now = (uint32_t)time(NULL); + //printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); + if ( utxo->T.spentflag == 0 && now > utxo->T.lastspentcheck+60 ) + { + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + utxo->T.lastspentcheck = now; + if ( LP_txvalue(utxo->coin,utxo->payment.txid,utxo->payment.vout) == 0 ) + { + printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,dstr(utxo->payment.value)); + LP_spentnotify(utxo,0); + } + else if ( LP_txvalue(utxo->coin,u.txid,u.vout) == 0 ) + { + printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,u.txid),u.vout,dstr(u.value)); + LP_spentnotify(utxo,1); + } + else if ( LP_ismine(utxo) != 0 ) + { + if ( strcmp(utxo->coin,"KMD") == 0 ) + LP_priceping(pubsock,utxo,"BTC",profitmargin); + else LP_priceping(pubsock,utxo,"KMD",profitmargin); + } + } +} + +void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) +{ + int32_t iambob; struct LP_utxoinfo *utxo,*tmp; + LP_utxopurge(0); + for (iambob=0; iambob<=1; iambob++) + { + LP_privkey_updates(pubsock,passphrase,iambob); + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) + { + LP_utxo_spentcheck(pubsock,utxo,profitmargin); + } + } +} + +void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins) +{ + char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); exit(-1); } - if ( amclient == 0 ) + if ( IAMLP != 0 ) { for (i=0; i 25 ) continue; - LP_peersquery(amclient,mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); + LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); } } else @@ -104,12 +202,9 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i for (j=0; jipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) { - printf("query utxo from %s\n",peer->ipaddr); - LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + //printf("query utxo from %s\n",peer->ipaddr); + LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } - if ( amclient != 0 ) + if ( IAMLP == 0 ) { while ( 1 ) { + now = (uint32_t)time(NULL); + if ( lastforward < now-LP_KEEPALIVE ) + { + LP_forwarding_register(LP_mypubkey,pushaddr); + lastforward = now; + } nonz = n = 0; - if ( (++counter % 3600) == 0 ) - LP_privkey_updates(mypeer,pubsock,passphrase,amclient); + if ( (++counter % 5000) == 0 ) + LP_utxo_updates(pubsock,passphrase,profitmargin); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - n++; - while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) + nonz += LP_subsock_check(peer); + } + if ( pullsock >= 0 ) + { + if ( (n= LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin)) > 0 ) { - nonz++; - if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) - { - portable_mutex_lock(&LP_commandmutex); - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) - { - //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); - free(retstr); - } - portable_mutex_unlock(&LP_commandmutex); - //printf("subloop.(%s)\n",jprint(argjson,0)); - free_json(argjson); - } else printf("error parsing.(%s)\n",(char *)ptr); - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + nonz += n; + lastforward = now; } } if ( nonz == 0 ) @@ -173,41 +265,8 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i while ( 1 ) { nonz = 0; - if ( (++counter % 2000) == 0 ) - { - LP_privkey_updates(mypeer,pubsock,passphrase,amclient); - } if ( (counter % 500) == 0 ) - { - char str[65]; - //printf("start utxos updates\n"); - HASH_ITER(hh,LP_utxoinfos,utxo,utmp) - { - now = (uint32_t)time(NULL); - //printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); - if ( utxo->spentflag == 0 && now > utxo->lastspentcheck+60 ) - { - utxo->lastspentcheck = now; - if ( LP_txvalue(utxo->coin,utxo->txid,utxo->vout) == 0 ) - { - printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid),utxo->vout,dstr(utxo->value)); - LP_spentnotify(utxo,0); - } - else if ( LP_txvalue(utxo->coin,utxo->txid2,utxo->vout2) == 0 ) - { - printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->txid2),utxo->vout2,dstr(utxo->value2)); - LP_spentnotify(utxo,1); - } - else if ( LP_ismine(utxo) != 0 ) - { - if ( strcmp(utxo->coin,"KMD") == 0 ) - LP_priceping(pubsock,utxo,"BTC",profitmargin); - else LP_priceping(pubsock,utxo,"KMD",profitmargin); - } - } - } - //printf("done utxos updates\n"); - } + LP_utxo_updates(pubsock,passphrase,profitmargin); now = (uint32_t)time(NULL); //printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) @@ -219,7 +278,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i if ( peer->numpeers != mypeer->numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) - LP_peersquery(amclient,mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); + LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); } if ( peer->numutxos != mypeer->numutxos && now > peer->lastutxos+60 ) { @@ -229,47 +288,12 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i lastn = LP_PROPAGATION_SLACK * 2; printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) - LP_utxosquery(0,mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer->ipaddr,myport,profitmargin); - } - while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) - { - nonz++; - if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) - { - portable_mutex_lock(&LP_commandmutex); - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) - { - //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); - free(retstr); - } - portable_mutex_unlock(&LP_commandmutex); - free_json(argjson); - } else printf("error parsing.(%s)\n",(char *)ptr); - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer->ipaddr,myport,profitmargin); } + nonz += LP_subsock_check(peer); } - while ( pullsock >= 0 && (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) - { - nonz++; - if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) - { - len = (int32_t)strlen((char *)ptr) + 1; - portable_mutex_lock(&LP_commandmutex); - if ( LP_command(mypeer,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) - { - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) - { - printf("%s PULL.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); - free(retstr); - } - } - portable_mutex_unlock(&LP_commandmutex); - free_json(argjson); - } - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; - } + if ( pullsock >= 0 ) + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( nonz == 0 ) usleep(100000); //printf("nonz.%d in mainloop\n",nonz); @@ -280,7 +304,7 @@ void LP_mainloop(struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,i void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128]; - IAMCLIENT = amclient; + IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); srand((int32_t)n); @@ -291,58 +315,70 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit portable_mutex_init(&LP_commandmutex); portable_mutex_init(&LP_swaplistmutex); portable_mutex_init(&LP_cachemutex); - if ( amclient == 0 ) + portable_mutex_init(&LP_forwardmutex); + if ( profitmargin == 0. || profitmargin == 0.01 ) { - if ( profitmargin == 0. || profitmargin == 0.01 ) + profitmargin = 0.01 + (double)(rand() % 100)/100000; + printf("default profit margin %f\n",profitmargin); + } + if ( system("curl -s4 checkip.amazonaws.com > /tmp/myipaddr") == 0 ) + { + if ( (myipaddr= OS_filestr(&filesize,"/tmp/myipaddr")) != 0 && myipaddr[0] != 0 ) + { + n = strlen(myipaddr); + if ( myipaddr[n-1] == '\n' ) + myipaddr[--n] = 0; + } else printf("error getting myipaddr\n"); + } else printf("error issuing curl\n"); + nanomsg_tcpname(pushaddr,myipaddr,mypullport); + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + { + if ( nn_bind(pullsock,pushaddr) >= 0 ) { - profitmargin = 0.01 + (double)(rand() % 100)/100000; - printf("default profit margin %f\n",profitmargin); + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + maxsize = 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } - if ( system("curl -s4 checkip.amazonaws.com > /tmp/myipaddr") == 0 ) + } + if ( IAMLP != 0 ) + { + if ( myipaddr != 0 ) { - if ( (myipaddr= OS_filestr(&filesize,"/tmp/myipaddr")) != 0 && myipaddr[0] != 0 ) + pubsock = -1; + nanomsg_tcpname(subaddr,myipaddr,mypubport); + printf(">>>>>>>>> myipaddr.%s (%s %s)\n",myipaddr,pushaddr,subaddr); + if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { - n = strlen(myipaddr); - if ( myipaddr[n-1] == '\n' ) - myipaddr[--n] = 0; - pullsock = pubsock = -1; - nanomsg_tcpname(pushaddr,myipaddr,mypullport); - nanomsg_tcpname(subaddr,myipaddr,mypubport); - printf(">>>>>>>>> myipaddr.%s (%s %s)\n",myipaddr,pushaddr,subaddr); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + if ( nn_bind(pubsock,subaddr) >= 0 ) + { + timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + } + else { - if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) - { - timeout = 10; - nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 1; - maxsize = 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - } - else - { - printf("error binding to (%s).%d (%s).%d\n",pushaddr,pullsock,subaddr,pubsock); - if ( pullsock >= 0 ) - nn_close(pullsock), pullsock = -1; - if ( pubsock >= 0 ) - nn_close(pubsock), pubsock = -1; - } - } else printf("error getting sockets %d %d\n",pullsock,pubsock); - LP_mypubsock = pubsock; - LP_mypeer = mypeer = LP_addpeer(amclient,mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); - //printf("my ipaddr.(%s) peers.(%s)\n",ipaddr,retstr!=0?retstr:""); - } else printf("error getting myipaddr\n"); - } else printf("error issuing curl\n"); + printf("error binding to (%s).%d (%s).%d\n",pushaddr,pullsock,subaddr,pubsock); + if ( pubsock >= 0 ) + nn_close(pubsock), pubsock = -1; + } + } else printf("error getting sockets %d %d\n",pullsock,pubsock); + LP_mypubsock = pubsock; + LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); + //printf("my ipaddr.(%s) peers.(%s)\n",ipaddr,retstr!=0?retstr:""); + } if ( myipaddr == 0 || mypeer == 0 ) { printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); exit(-1); } - //printf("utxos.(%s)\n",LP_utxos(mypeer,"",10000)); } - LP_mainloop(mypeer,mypubport,pubsock,pullsock,myport,amclient,passphrase,profitmargin,jobj(argjson,"coins")); + else if ( myipaddr == 0 ) + { + printf("couldnt get myipaddr\n"); + exit(-1); + } +LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins")); } diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 1cd4c9056..2309e5c20 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -47,13 +47,9 @@ char *LP_peers() return(jprint(peersjson,1)); } -struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,double profitmargin,int32_t numpeers,int32_t numutxos) +struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char *ipaddr,uint16_t port,uint16_t pushport,uint16_t subport,double profitmargin,int32_t numpeers,int32_t numutxos) { - uint32_t ipbits; int32_t pushsock,subsock,timeout,enabled; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; - /*if ( strcmp(ipaddr,"173.208.149.42") == 0 ) - return(0); - if ( strncmp(ipaddr,"5.9.253",strlen("5.9.253")) != 0 ) - return(0);*/ + uint32_t ipbits; int32_t pushsock,subsock,timeout; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; ipbits = (uint32_t)calc_ipbits(ipaddr); expand_ipbits(checkip,ipbits); if ( strcmp(checkip,ipaddr) == 0 ) @@ -73,9 +69,6 @@ struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32 peer = calloc(1,sizeof(*peer)); peer->pushsock = peer->subsock = pushsock = subsock = -1; strcpy(peer->ipaddr,ipaddr); - if ( amclient == 0 ) - enabled = 1; - else enabled = 1;//(rand() % (1 << Client_connections)) == 0; if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { timeout = 1000; @@ -86,7 +79,7 @@ struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32 printf("connected to push.(%s) %d\n",pushaddr,pushsock); peer->connected = (uint32_t)time(NULL); peer->pushsock = pushsock; - if ( enabled != 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + if ( (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { timeout = 1; nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -96,7 +89,6 @@ struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32 { peer->subsock = subsock; printf("connected to sub.(%s) %d\n",subaddr,peer->subsock); - Client_connections += amclient; } else nn_close(subsock); } } @@ -125,7 +117,7 @@ struct LP_peerinfo *LP_addpeer(int32_t amclient,struct LP_peerinfo *mypeer,int32 return(peer); } -int32_t LP_peersparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) +int32_t LP_peersparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { struct LP_peerinfo *peer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; if ( (array= cJSON_Parse(retstr)) != 0 ) @@ -144,7 +136,7 @@ int32_t LP_peersparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs argipbits = (uint32_t)calc_ipbits(argipaddr); if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) { - peer = LP_addpeer(amclient,mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); + peer = LP_addpeer(mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); } if ( peer != 0 ) { @@ -160,7 +152,7 @@ int32_t LP_peersparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs return(n); } -void LP_peersquery(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *myipaddr,uint16_t myport,double myprofit) +void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *myipaddr,uint16_t myport,double myprofit) { char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now,flag = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); @@ -170,9 +162,9 @@ void LP_peersquery(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock { //printf("got.(%s)\n",retstr); now = (uint32_t)time(NULL); - LP_peersparse(amclient,mypeer,mypubsock,destipaddr,destport,retstr,now); + LP_peersparse(mypeer,mypubsock,destipaddr,destport,retstr,now); free(retstr); - if ( amclient == 0 ) + if ( IAMLP != 0 ) { HASH_ITER(hh,LP_peerinfos,peer,tmp) { diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 943b103e2..7f7b7ade9 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -125,13 +125,13 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; - if ( qp->txfee >= utxo->satoshis || qp->txfee >= utxo->value2 || utxo->value2 < LP_DEPOSITSATOSHIS(utxo->satoshis) ) + if ( utxo->iambob == 0 || qp->txfee >= utxo->S.satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(utxo->S.satoshis) ) return(-1); - qp->txid = utxo->txid; - qp->vout = utxo->vout; - qp->txid2 = utxo->txid2; - qp->vout2 = utxo->vout2; - qp->satoshis = utxo->satoshis - qp->txfee; + qp->txid = utxo->payment.txid; + qp->vout = utxo->payment.vout; + qp->txid2 = utxo->deposit.txid; + qp->vout2 = utxo->deposit.vout; + qp->satoshis = utxo->S.satoshis - qp->txfee; qp->destsatoshis = qp->satoshis * price; if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) qp->desttxfee = 10000; @@ -140,7 +140,7 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * qp->destsatoshis -= qp->desttxfee; safecopy(qp->srccoin,utxo->coin,sizeof(qp->srccoin)); safecopy(qp->coinaddr,utxo->coinaddr,sizeof(qp->coinaddr)); - qp->srchash = LP_pubkey(LP_privkey(utxo->coinaddr)); + qp->srchash = utxo->pubkey; return(0); } @@ -224,7 +224,7 @@ cJSON *LP_tradecandidates(char *base) safecopy(coinstr,jstr(item,"base"),sizeof(coinstr)); if ( strcmp(coinstr,base) == 0 ) { - if ( LP_iseligible(Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) != 0 ) + if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) != 0 ) { if ( LP_arrayfind(retarray,Q.txid,Q.vout) < 0 ) { @@ -265,8 +265,8 @@ void LP_quotesinit(char *base,char *rel) item = jitem(array,i); LP_quoteparse(&Q,item); if ( iter == 0 ) - LP_query("price",&Q,jstr(item,"ipaddr"),jint(item,"port"),base,rel,zero); - else LP_query("price",&Q,jstr(item,"ipaddr"),jint(item,"port"),rel,base,zero); + LP_query("price",&Q,base,rel,zero); + else LP_query("price",&Q,rel,base,zero); } } free_json(array); @@ -293,7 +293,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) LP_quoteparse(&Q[i],item); if ( (price= jdouble(item,"price")) == 0. ) { - price = LP_query("price",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,zero); + price = LP_query("price",&Q[i],base,myutxo->coin,zero); Q[i].destsatoshis = price * Q[i].satoshis; } if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) @@ -306,7 +306,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) besti = -1; for (i=0; isatoshis >= Q[i].destsatoshis+Q[i].desttxfee ) + if ( (price= prices[i]) != 0. && myutxo->S.satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) { metric = price / bestprice; printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); @@ -320,7 +320,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) bestmetric = metric; } } - } else printf("(%f %f) ",dstr(myutxo->satoshis),dstr(Q[i].destsatoshis)); + } else printf("(%f %f) ",dstr(myutxo->S.satoshis),dstr(Q[i].destsatoshis)); } printf("metrics, best %f\n",bestmetric); if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) @@ -332,23 +332,23 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) printf("bestprice %f vs maxprice %f\n",bestprice,maxprice); if ( maxprice == 0. || bestprice <= maxprice ) { - Q[i].desttxid = myutxo->txid; - Q[i].destvout = myutxo->vout; - Q[i].feetxid = myutxo->txid2; - Q[i].feevout = myutxo->vout2; + Q[i].desttxid = myutxo->payment.txid; + Q[i].destvout = myutxo->payment.vout; + Q[i].feetxid = myutxo->fee.txid; + Q[i].feevout = myutxo->fee.vout; strcpy(Q[i].destaddr,myutxo->coinaddr); - price = LP_query("request",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); + price = LP_query("request",&Q[i],base,myutxo->coin,myutxo->S.mypub); if ( jobj(bestitem,"price") != 0 ) jdelete(bestitem,"price"); jaddnum(bestitem,"price",prices[i]); if ( price <= maxprice ) { - Q[i].desttxid = myutxo->txid; - Q[i].destvout = myutxo->vout; - Q[i].feetxid = myutxo->txid2; - Q[i].feevout = myutxo->vout2; + Q[i].desttxid = myutxo->payment.txid; + Q[i].destvout = myutxo->payment.vout; + Q[i].feetxid = myutxo->fee.txid; + Q[i].feevout = myutxo->fee.vout; strcpy(Q[i].destaddr,myutxo->coinaddr); - price = LP_query("connect",&Q[i],jstr(item,"ipaddr"),jint(item,"port"),base,myutxo->coin,myutxo->mypub); + price = LP_query("connect",&Q[i],base,myutxo->coin,myutxo->S.mypub); LP_requestinit(&R,Q[i].srchash,Q[i].desthash,base,Q[i].satoshis,Q[i].destcoin,Q[i].destsatoshis,Q[i].timestamp,Q[i].quotetime,DEXselector); jaddstr(bestitem,"status","connected"); jaddnum(bestitem,"requestid",R.requestid); @@ -376,9 +376,9 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) { double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; - if ( (now= (uint32_t)time(NULL)) > utxo->swappending ) - utxo->swappending = 0; - if ( now > utxo->published+60 && utxo->swappending == 0 && utxo->pair < 0 && utxo->swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) + if ( (now= (uint32_t)time(NULL)) > utxo->T.swappending ) + utxo->T.swappending = 0; + if ( now > utxo->T.published+60 && utxo->T.swappending == 0 && utxo->S.swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) { if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); @@ -388,7 +388,7 @@ int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double p retstr = jprint(retjson,1); //printf("PING.(%s)\n",retstr); LP_send(pubsock,retstr,1); - utxo->published = now; + utxo->T.published = now; return(0); } return(-1); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 31e1e0255..f5e915a70 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,12 +52,28 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notified?ipaddr=%s&port=%u&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->ipaddr,utxo->port,utxo->profitmargin,utxo->coin,bits256_str(str,utxo->txid),utxo->vout,(long long)utxo->value,bits256_str(str2,utxo->txid2),utxo->vout2,(long long)utxo->value2,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str2,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); } +char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) +{ + char url[512],str[65]; + sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr); + //printf("getutxo.(%s)\n",url); + return(issue_curl(url)); +} + +char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) +{ + char url[512],str[65]; + sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s",destip,destport,bits256_str(str,pubkey)); + //printf("getutxo.(%s)\n",url); + return(issue_curl(url)); +} + cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) { char *retstr; cJSON *retjson = 0; diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 35ce8f62f..fa674cf7a 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -17,22 +17,12 @@ // LP_swap.c // marketmaker // + /* - resume handling: list of tx broadcast, tx pending + required items, reconnect state machine or have statemachine assume off by one or state/otherstate specific handling make sure to broadcast deposit before claiming refund, or to just skip it if neither is done */ -// Todo: monitor blockchains, ie complete extracting scriptsig -// mode to autocreate required outputs -// more better LP commands - -// depends on just three external functions: -// - basilisk_sendrawtransaction(coin,signedtx); -// - basilisk_value(rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0) -// basilisk_bitcoinrawtx(rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V) - - // included from basilisk.c /* https://bitcointalk.org/index.php?topic=1340621.msg13828271#msg13828271 https://bitcointalk.org/index.php?topic=1364951 @@ -148,6 +138,10 @@ void basilisk_swap_finished(struct basilisk_swap *swap) free(swap->messages[i].data), swap->messages[i].data = 0; free(swap->messages), swap->messages = 0; swap->nummessages = 0; + if ( swap->N.pair >= 0 ) + nn_close(swap->N.pair); + if ( swap->utxo != 0 ) + swap->utxo->S.swap = 0; } uint32_t basilisk_quoteid(struct basilisk_request *rp) @@ -575,7 +569,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { - uint8_t sendbuf[32768]; int32_t sendlen; + uint8_t sendbuf[32768]; int32_t sendlen,retval = -1; if ( LP_swapdata_rawtx(swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) @@ -603,7 +597,15 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 basilisk_dontforget_update(swap,rawtx); //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) - return(LP_swapsend(pairsock,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + { + retval = LP_swapsend(pairsock,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs); + if ( LP_waitmempool(rawtx->coin->symbol,rawtx->I.signedtxid,10) < 0 ) + { + char str[65]; printf("failed to find %s %s in the mempool?\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid)); + retval = -1; + } + return(retval); + } else { printf("suppress swapsend %x\n",msgbits); @@ -645,22 +647,20 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t } else return(-1); } -void LP_bobloop(void *_utxo) +void LP_bobloop(void *_swap) { - uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap; struct LP_utxoinfo *utxo = _utxo; + uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = _swap; fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); expiration = (uint32_t)time(NULL) + 10; - while ( (swap= utxo->swap) == 0 && time(NULL) < expiration ) - sleep(1); - if ( (utxo->swap= swap) != 0 ) + if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",10,utxo->pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",10,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); - else if ( LP_waitsend("choosei",10,utxo->pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_waitsend("choosei",10,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); - else if ( LP_waitsend("mostprivs",10,utxo->pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_waitsend("mostprivs",10,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error waitsend mostprivs\n"); else if ( basilisk_bobscripts_set(swap,1,1) < 0 ) printf("error bobscripts deposit\n"); @@ -671,11 +671,11 @@ void LP_bobloop(void *_utxo) basilisk_bobdeposit_refund(swap,swap->I.putduration); //printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); - if ( LP_waitfor(utxo->pair,swap,10,LP_verify_otherfee) < 0 ) + if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_otherfee) < 0 ) printf("error waiting for alicefee\n"); - else if ( LP_swapdata_rawtxsend(utxo->pair,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0) == 0 ) + else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0) == 0 ) printf("error sending bobdeposit\n"); - else if ( LP_waitfor(utxo->pair,swap,10,LP_verify_alicepayment) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_alicepayment) < 0 ) printf("error waiting for alicepayment\n"); else { @@ -689,45 +689,41 @@ void LP_bobloop(void *_utxo) } if ( basilisk_bobscripts_set(swap,0,1) < 0 ) printf("error bobscripts payment\n"); - else if ( LP_swapdata_rawtxsend(utxo->pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) + else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) printf("error sending bobpayment\n"); LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); } } basilisk_swap_finished(swap); - free(utxo->swap); + free(swap); } else printf("swap timed out\n"); - utxo->swap = 0; - nn_close(utxo->pair); - utxo->pair = -1; } -void LP_aliceloop(void *_qp) +void LP_aliceloop(void *_swap) { - uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = 0; struct LP_quoteinfo *qp = _qp; - fprintf(stderr,"start swap iamalice pair.%d\n",qp->pair); + uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = _swap; maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); expiration = (uint32_t)time(NULL) + 10; - swap = LP_swapinit(0,0,qp->privkey,&qp->R,qp); if ( swap != 0 ) { - if ( LP_sendwait("pubkeys",10,qp->pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); + if ( LP_sendwait("pubkeys",10,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); - else if ( LP_sendwait("choosei",10,qp->pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_sendwait("choosei",10,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); - else if ( LP_sendwait("mostprivs",10,qp->pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_sendwait("mostprivs",10,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error LP_sendwait mostprivs\n"); - else if ( basilisk_alicetxs(qp->pair,swap,data,maxlen) != 0 ) + else if ( basilisk_alicetxs(swap->N.pair,swap,data,maxlen) != 0 ) printf("basilisk_alicetxs error\n"); else { LP_swapsfp_update(&swap->I.req); - if ( LP_swapdata_rawtxsend(qp->pair,swap,0x80,data,maxlen,&swap->myfee,0x40,0) == 0 ) + if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x80,data,maxlen,&swap->myfee,0x40,0) == 0 ) printf("error sending alicefee\n"); - else if ( LP_waitfor(qp->pair,swap,10,LP_verify_bobdeposit) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_bobdeposit) < 0 ) printf("error waiting for bobdeposit\n"); - else if ( LP_swapdata_rawtxsend(qp->pair,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0) == 0 ) + else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0) == 0 ) printf("error sending alicepayment\n"); else { @@ -736,7 +732,7 @@ void LP_aliceloop(void *_qp) printf("waiting for alicepayment to confirm\n"); sleep(3); } - if ( LP_waitfor(qp->pair,swap,10,LP_verify_bobpayment) < 0 ) + if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); else { @@ -745,7 +741,7 @@ void LP_aliceloop(void *_qp) printf("waiting for bobpayment to confirm\n"); sleep(3); } - if ( LP_swapdata_rawtxsend(qp->pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) + if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); while ( LP_numconfirms(swap,&swap->alicespend) < 1 ) { @@ -759,8 +755,8 @@ void LP_aliceloop(void *_qp) basilisk_swap_finished(swap); free(swap); } - nn_close(qp->pair); - free(qp); + free(data); + nn_close(swap->N.pair); } bits256 instantdex_derivekeypair(void *ctx,bits256 *newprivp,uint8_t pubkey[33],bits256 privkey,bits256 orderhash) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 5c0c05dfd..a2ccbc9d5 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -189,35 +189,52 @@ int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 se else return(0); } -int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) +int32_t LP_mempoolscan(char *symbol,bits256 txid) { - int32_t numconfirms = 100; -#ifndef BASILISK_DISABLEWAITTX - cJSON *txobj,*array; int32_t i,n; - numconfirms = -1; - if ( (txobj= LP_gettx(rawtx->coin->symbol,rawtx->I.signedtxid)) != 0 ) - { - numconfirms = jint(txobj,"confirmations"); - free_json(txobj); - } - else if ( (array= LP_getmempool(rawtx->coin->symbol)) != 0 ) + int32_t i,n; cJSON *array; + if ( (array= LP_getmempool(symbol)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; iI.signedtxid,jbits256i(array,i)) == 0 ) + if ( bits256_cmp(txid,jbits256i(array,i)) == 0 ) { - numconfirms = 0; printf("found tx in mempool slot.%d\n",i); - break; + return(i); } } free_json(array); } + return(-1); +} + +int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) +{ + int32_t numconfirms = 100; +#ifndef BASILISK_DISABLEWAITTX + cJSON *txobj; + numconfirms = -1; + if ( (txobj= LP_gettx(rawtx->coin->symbol,rawtx->I.signedtxid)) != 0 ) + { + numconfirms = jint(txobj,"confirmations"); + free_json(txobj); + } else if ( LP_mempoolscan(rawtx->coin->symbol,rawtx->I.signedtxid) >= 0 ) + numconfirms = 0; #endif return(numconfirms); } +int32_t LP_waitmempool(char *symbol,bits256 txid,int32_t duration) +{ + uint32_t expiration = (uint32_t)time(NULL) + duration; + while ( time(NULL) < expiration ) + { + if ( LP_mempoolscan(symbol,txid) >= 0 ) + return(0); + } + return(-1); +} + int32_t iguana_msgtx_Vset(uint8_t *serialized,int32_t maxlen,struct iguana_msgtx *msgtx,struct vin_info *V) { int32_t vini,j,scriptlen,p2shlen,userdatalen,siglen,plen,need_op0=0,len = 0; uint8_t *script,*redeemscript=0,*userdata=0; struct vin_info *vp; @@ -1530,7 +1547,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da printf("%02x",swap->aliceclaim.txbytes[i]); printf(" <- aliceclaim\n"); //basilisk_txlog(swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); - return(retval); + return(LP_waitmempool(swap->bobcoin.symbol,swap->bobdeposit.I.signedtxid,10)); } else printf("error signing aliceclaim suppress.%d vin.(%s)\n",swap->aliceclaim.I.suppress_pubkeys,swap->bobdeposit.I.destaddr); } printf("error with bobdeposit\n"); @@ -1548,7 +1565,8 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t if ( bits256_nonz(swap->alicepayment.I.signedtxid) != 0 ) swap->aliceunconf = 1; basilisk_dontforget_update(swap,&swap->alicepayment); - printf("import alicepayment address.(%s)\n",swap->alicepayment.p2shaddr); + return(LP_waitmempool(swap->alicecoin.symbol,swap->alicepayment.I.signedtxid,10)); + //printf("import alicepayment address.(%s)\n",swap->alicepayment.p2shaddr); //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.p2shaddr); return(0); } @@ -1594,8 +1612,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); swap->I.alicespent = 1; - //basilisk_txlog(swap,&swap->alicespend,-1); - return(retval); + return(LP_waitmempool(swap->bobcoin.symbol,swap->bobpayment.I.signedtxid,10)); } else printf("error signing aliceclaim suppress.%d vin.(%s)\n",swap->alicespend.I.suppress_pubkeys,swap->bobpayment.I.destaddr); } printf("error validating bobpayment\n"); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 02db3e90c..b0713e810 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -20,75 +20,212 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) { - if ( strcmp(utxo->ipaddr,"127.0.0.1") == 0 ) + if ( bits256_cmp(utxo->pubkey,LP_mypubkey) != 0 ) return(1); else if ( LP_mypeer == 0 ) return(0); - else if ( strcmp(utxo->ipaddr,LP_mypeer->ipaddr) == 0 && utxo->port == LP_mypeer->port )\ + else return(0); +} + +int32_t LP_isavailable(struct LP_utxoinfo *utxo) +{ + if ( utxo->T.swappending == 0 && utxo->S.swap == 0 ) return(1); else return(0); } int32_t LP_isunspent(struct LP_utxoinfo *utxo) { - if ( utxo->spentflag == 0 && utxo->swappending == 0 ) + if ( utxo->T.spentflag == 0 && LP_isavailable(utxo) > 0 ) return(1); else return(0); } -struct LP_utxoinfo *LP_utxofind(bits256 txid,int32_t vout) +void LP_utxosetkey(uint8_t *key,bits256 txid,int32_t vout) { - struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; memcpy(key,txid.bytes,sizeof(txid)); memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); +} + +struct LP_utxoinfo *_LP_utxofind(int32_t iambob,bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; + LP_utxosetkey(key,txid,vout); + HASH_FIND(hh,LP_utxoinfos[iambob],key,sizeof(key),utxo); + return(utxo); +} + +struct LP_utxoinfo *_LP_utxo2find(int32_t iambob,bits256 txid2,int32_t vout2) +{ + struct LP_utxoinfo *utxo=0; uint8_t key2[sizeof(txid2) + sizeof(vout2)]; + LP_utxosetkey(key2,txid2,vout2); + HASH_FIND(hh2,LP_utxoinfos2[iambob],key2,sizeof(key2),utxo); + return(utxo); +} + +struct LP_utxoinfo *LP_utxofind(int32_t iambob,bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo=0; portable_mutex_lock(&LP_utxomutex); - HASH_FIND(hh,LP_utxoinfos,key,sizeof(key),utxo); + utxo = _LP_utxofind(iambob,txid,vout); portable_mutex_unlock(&LP_utxomutex); return(utxo); } -struct LP_utxoinfo *_LP_utxo2find(bits256 txid,int32_t vout) +struct LP_utxoinfo *LP_utxo2find(int32_t iambob,bits256 txid2,int32_t vout2) { - struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; - memcpy(key,txid.bytes,sizeof(txid)); - memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); - HASH_FIND(hh2,LP_utxoinfos2,key,sizeof(key),utxo); + struct LP_utxoinfo *utxo=0; + portable_mutex_lock(&LP_utxomutex); + utxo = _LP_utxo2find(iambob,txid2,vout2); + portable_mutex_unlock(&LP_utxomutex); return(utxo); } -struct LP_utxoinfo *LP_utxo2find(bits256 txid,int32_t vout) +int32_t LP_utxoaddptrs(struct LP_utxoinfo *ptrs[],int32_t n,struct LP_utxoinfo *utxo) { - struct LP_utxoinfo *utxo=0; uint8_t key[sizeof(txid) + sizeof(vout)]; - memcpy(key,txid.bytes,sizeof(txid)); - memcpy(&key[sizeof(txid)],&vout,sizeof(vout)); + int32_t i; + for (i=0; ipayment.txid,refutxo->payment.vout)) != 0 && utxo != refutxo ) + n = LP_utxoaddptrs(ptrs,n,utxo); + if ( (utxo= _LP_utxo2find(iambob,refutxo->payment.txid,refutxo->payment.vout)) != 0 && utxo != refutxo ) + n = LP_utxoaddptrs(ptrs,n,utxo); + u = (refutxo->iambob != 0) ? refutxo->deposit : refutxo->fee; + if ( (utxo= _LP_utxofind(iambob,u.txid,u.vout)) != 0 && utxo != refutxo ) + n = LP_utxoaddptrs(ptrs,n,utxo); + if ( (utxo= _LP_utxo2find(iambob,u.txid,u.vout)) != 0 && utxo != refutxo ) + n = LP_utxoaddptrs(ptrs,n,utxo); + } portable_mutex_unlock(&LP_utxomutex); - return(utxo); + if ( n > 0 ) + printf("LP_utxocollisions n.%d\n",n); + return(n); +} + +void _LP_availableset(struct LP_utxoinfo *utxo) +{ + if ( utxo != 0 ) + { + memset(&utxo->S.otherpubkey,0,sizeof(utxo->S.otherpubkey)); + utxo->S.swap = 0; + utxo->T.swappending = 0; + } +} + +void _LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) +{ + if ( utxo != 0 ) + { + utxo->T.swappending = (uint32_t)(time(NULL) + LP_RESERVETIME); + utxo->S.otherpubkey = otherpubkey; + } +} + +void LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) +{ + struct LP_utxoinfo *ptrs[8]; int32_t i,n; + memset(ptrs,0,sizeof(ptrs)); + if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) + { + for (i=0; ipayment.txid),utxo->payment.vout,n); + _LP_unavailableset(utxo,otherpubkey); +} + +void LP_availableset(struct LP_utxoinfo *utxo) +{ + struct LP_utxoinfo *ptrs[8]; int32_t i,n; + memset(ptrs,0,sizeof(ptrs)); + if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) + { + for (i=0; ipayment.txid),utxo->payment.vout,n); + _LP_availableset(utxo); +} + +int32_t LP_utxopurge(int32_t allutxos) +{ + struct LP_utxoinfo *utxo,*tmp; int32_t iambob,n = 0; + portable_mutex_lock(&LP_utxomutex); + for (iambob=0; iambob<=1; iambob++) + { + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) + { + if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + { + if ( LP_isavailable(utxo) == 0 ) + { + HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); + free(utxo); + } else n++; + } else n++; + } + HASH_ITER(hh,LP_utxoinfos2[iambob],utxo,tmp) + { + if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + { + if ( LP_isavailable(utxo) == 0 ) + { + HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); + free(utxo); + } else n++; + } else n++; + } + } + portable_mutex_unlock(&LP_utxomutex); + return(n); } cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { + struct _LP_utxoinfo u; jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); - jaddbits256(item,"txid",utxo->txid); - jaddnum(item,"vout",utxo->vout); - jadd64bits(item,"value",utxo->value); - jadd64bits(item,"satoshis",utxo->satoshis); - jaddbits256(item,"txid2",utxo->txid2); - jaddnum(item,"vout2",utxo->vout2); - jadd64bits(item,"value2",utxo->value2); - if ( utxo->swappending != 0 ) - jaddnum(item,"pending",utxo->swappending); - if ( bits256_nonz(utxo->otherpubkey) != 0 ) - jaddbits256(item,"desthash",utxo->otherpubkey); - if ( utxo->pair >= 0 ) - jaddnum(item,"socket",utxo->pair); - if ( utxo->swap != 0 ) + jaddbits256(item,"txid",utxo->payment.txid); + jaddnum(item,"vout",utxo->payment.vout); + jadd64bits(item,"value",utxo->payment.value); + jadd64bits(item,"satoshis",utxo->S.satoshis); + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + if ( bits256_nonz(u.txid) != 0 ) + { + jaddbits256(item,"txid2",u.txid); + jaddnum(item,"vout2",u.vout); + jadd64bits(item,"value2",u.value); + } + if ( utxo->T.swappending != 0 ) + jaddnum(item,"pending",utxo->T.swappending); + if ( utxo->iambob != 0 ) + { + jaddbits256(item,"srchash",LP_mypubkey); + if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) + jaddbits256(item,"desthash",utxo->S.otherpubkey); + } + else + { + jaddbits256(item,"desthash",LP_mypubkey); + if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) + jaddbits256(item,"srchash",utxo->S.otherpubkey); + } + if ( utxo->S.swap != 0 ) jaddstr(item,"swap","in progress"); - if ( utxo->spentflag != 0 ) - jaddnum(item,"spent",utxo->spentflag); + if ( utxo->T.spentflag != 0 ) + jaddnum(item,"spent",utxo->T.spentflag); return(item); } @@ -96,26 +233,25 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) { cJSON *item = cJSON_CreateObject(); item = LP_inventoryjson(item,utxo); - jaddstr(item,"ipaddr",utxo->ipaddr); - jaddnum(item,"port",utxo->port); - jaddnum(item,"profit",utxo->profitmargin); + jaddbits256(item,"pubkey",utxo->pubkey); + jaddnum(item,"profit",utxo->S.profitmargin); jaddstr(item,"base",utxo->coin); jaddstr(item,"script",utxo->spendscript); return(item); } -char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) +char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *coin,int32_t lastn) { int32_t i,firsti; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); i = 0; if ( lastn >= mypeer->numutxos ) firsti = -1; else firsti = (mypeer->numutxos - lastn); - HASH_ITER(hh,LP_utxoinfos,utxo,tmp) + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { if ( i++ < firsti ) continue; - if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->spentflag == 0 )//&& LP_ismine(utxo) != 0 ) + if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) != 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } @@ -125,20 +261,23 @@ char *LP_utxos(struct LP_peerinfo *mypeer,char *coin,int32_t lastn) void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) { - cJSON *argjson; - utxo->spentflag = (uint32_t)time(NULL); + cJSON *argjson; struct _LP_utxoinfo u; + utxo->T.spentflag = (uint32_t)time(NULL); if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) LP_mypeer->numutxos--; if ( LP_mypubsock >= 0 ) { argjson = cJSON_CreateObject(); jaddstr(argjson,"method","checktxid"); - jaddbits256(argjson,"txid",utxo->txid); - jaddnum(argjson,"vout",utxo->vout); + jaddbits256(argjson,"txid",utxo->payment.txid); + jaddnum(argjson,"vout",utxo->payment.vout); if ( selector != 0 ) { - jaddbits256(argjson,"checktxid",utxo->txid2); - jaddnum(argjson,"checkvout",utxo->vout2); + if ( bits256_nonz(utxo->deposit.txid) != 0 ) + u = utxo->deposit; + else u = utxo->fee; + jaddbits256(argjson,"checktxid",u.txid); + jaddnum(argjson,"checkvout",u.vout); } LP_send(LP_mypubsock,jprint(argjson,1),1); } @@ -146,35 +285,41 @@ void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) char *LP_spentcheck(cJSON *argjson) { - bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; + bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; int32_t iambob,retval = 0; txid = jbits256(argjson,"txid"); vout = jint(argjson,"vout"); - if ( (utxo= LP_utxofind(txid,vout)) != 0 && utxo->spentflag == 0 ) + for (iambob=0; iambob<=1; iambob++) { - if ( jobj(argjson,"check") == 0 ) - checktxid = txid, checkvout = vout; - else + if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 && utxo->T.spentflag == 0 ) { - checktxid = jbits256(argjson,"checktxid"); - checkvout = jint(argjson,"checkvout"); + if ( jobj(argjson,"check") == 0 ) + checktxid = txid, checkvout = vout; + else + { + checktxid = jbits256(argjson,"checktxid"); + checkvout = jint(argjson,"checkvout"); + } + if ( LP_txvalue(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 ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) - { - if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) - LP_mypeer->numutxos--; - utxo->spentflag = (uint32_t)time(NULL); - //printf("indeed txid was spent\n"); - return(clonestr("{\"result\":\"marked as spent\"}")); - } else return(clonestr("{\"error\":\"txid is still unspent?\"}")); - } else return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); + } + if ( retval > 0 ) + return(clonestr("{\"result\":\"marked as spent\"}")); + return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) +int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { uint64_t val,val2,threshold; if ( (val= LP_txvalue(coin,txid,vout)) >= satoshis ) { - threshold = (IAMCLIENT == 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); + threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(coin,txid2,vout2)) >= threshold ) { //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); @@ -184,66 +329,65 @@ int32_t LP_iseligible(char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bit return(0); } -struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,char *ipaddr,uint16_t port,double profitmargin) +struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - uint64_t tmpsatoshis; struct LP_utxoinfo *utxo = 0; + uint64_t tmpsatoshis; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - if ( IAMCLIENT == 0 && value2 < 9 * (value >> 3) + 100000 ) + if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) tmpsatoshis = (((value2-100000) / 9) << 3); else tmpsatoshis = value; - if ( LP_iseligible(coin,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + if ( LP_iseligible(iambob,coin,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("LP_addutxo got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } - if ( IAMCLIENT == 0 && strcmp(ipaddr,"127.0.0.1") == 0 ) - { - //printf("LP node got localhost utxo\n"); - return(0); - } - if ( (utxo= LP_utxofind(txid,vout)) != 0 || (utxo= LP_utxo2find(txid,vout)) != 0 ) + if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 ) { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); - if ( bits256_cmp(txid,utxo->txid) != 0 || bits256_cmp(txid2,utxo->txid2) != 0 || vout != utxo->vout || value != utxo->value || tmpsatoshis != utxo->satoshis || vout2 != utxo->vout2 || value2 != utxo->value2 || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || strcmp(ipaddr,utxo->ipaddr) != 0 || port != utxo->port ) + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { - utxo->errors++; - char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->txid),bits256_cmp(txid,utxo->txid) != 0,bits256_cmp(txid2,utxo->txid2) != 0,vout != utxo->vout,tmpsatoshis != utxo->satoshis,vout2 != utxo->vout2,value2 != utxo->value2,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,strcmp(ipaddr,utxo->ipaddr) != 0,port != utxo->port,value != utxo->value); + utxo->T.errors++; + char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value); } else if ( profitmargin != 0. ) - utxo->profitmargin = profitmargin; + utxo->S.profitmargin = profitmargin; } else { utxo = calloc(1,sizeof(*utxo)); - utxo->pair = -1; - utxo->profitmargin = profitmargin; - strcpy(utxo->ipaddr,ipaddr); - utxo->port = port; + utxo->S.profitmargin = profitmargin; + utxo->pubkey = pubkey; safecopy(utxo->coin,coin,sizeof(utxo->coin)); safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); - utxo->txid = txid; - utxo->vout = vout; - utxo->value = value; - utxo->satoshis = tmpsatoshis; - utxo->txid2 = txid2; - utxo->vout2 = vout2; - utxo->value2 = value2; - memcpy(utxo->key,txid.bytes,sizeof(txid)); - memcpy(&utxo->key[sizeof(txid)],&vout,sizeof(vout)); - memcpy(utxo->key2,txid2.bytes,sizeof(txid2)); - memcpy(&utxo->key2[sizeof(txid2)],&vout2,sizeof(vout2)); - char str[65],str2[65]; printf("amclient.%d %s:%u %s LP_addutxo.(%.8f %.8f) numutxos.%d %s %s\n",IAMCLIENT,ipaddr,port,utxo->coin,dstr(value),dstr(value2),mypeer!=0?mypeer->numutxos:0,bits256_str(str,utxo->txid),bits256_str(str2,txid2)); + utxo->payment.txid = txid; + utxo->payment.vout = vout; + utxo->payment.value = value; + utxo->S.satoshis = tmpsatoshis; + if ( (utxo->iambob= iambob) != 0 ) + { + utxo->deposit.txid = txid2; + utxo->deposit.vout = vout2; + utxo->deposit.value = value2; + } + else + { + utxo->fee.txid = txid2; + utxo->fee.vout = vout2; + utxo->fee.value = value2; + } + LP_utxosetkey(utxo->key,txid,vout); + LP_utxosetkey(utxo->key2,txid2,vout2); + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); - HASH_ADD_KEYPTR(hh,LP_utxoinfos,utxo->key,sizeof(utxo->key),utxo); - if ( _LP_utxo2find(txid2,vout2) == 0 ) - HASH_ADD_KEYPTR(hh2,LP_utxoinfos2,utxo->key2,sizeof(utxo->key2),utxo); - if ( mypeer != 0 ) - mypeer->numutxos++; + HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); + if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) + HASH_ADD_KEYPTR(hh2,LP_utxoinfos2[iambob],utxo->key2,sizeof(utxo->key2),utxo); portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); @@ -251,10 +395,10 @@ struct LP_utxoinfo *LP_addutxo(int32_t amclient,struct LP_peerinfo *mypeer,int32 return(utxo); } -int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) +int32_t LP_utxosparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { - struct LP_peerinfo *peer,*destpeer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; - if ( amclient != 0 ) + struct LP_peerinfo *destpeer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; + if ( IAMLP == 0 ) { printf("LP_utxosparse not for clientside\n"); return(-1); @@ -273,16 +417,16 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs if ( (subport= juint(item,"sub")) == 0 ) subport = argport + 2; argipbits = (uint32_t)calc_ipbits(argipaddr); - if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) - peer = LP_addpeer(amclient,mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); + //if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) + // peer = LP_addpeer(mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); //printf("parse.(%s)\n",jprint(item,0)); - utxo = LP_addutxo(amclient,mypeer,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),argipaddr,argport,jdouble(item,"profit")); + utxo = LP_addutxo(1,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),jbits256(item,"pubkey"),jdouble(item,"profit")); if ( utxo != 0 ) { - utxo->lasttime = now; + utxo->T.lasttime = now; } } } // else printf("skip.(%s)\n",jprint(item,0)); @@ -297,10 +441,10 @@ int32_t LP_utxosparse(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubs return(n); } -void LP_utxosquery(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *coin,int32_t lastn,char *myipaddr,uint16_t myport,double myprofit) +void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *coin,int32_t lastn,char *myipaddr,uint16_t myport,double myprofit) { char *retstr; struct LP_peerinfo *peer; int32_t i,firsti; uint32_t now; - if ( amclient != 0 ) + if ( IAMLP == 0 ) { printf("LP_utxosquery not for clientside\n"); return; @@ -313,7 +457,7 @@ void LP_utxosquery(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer->numpeers,mypeer->numutxos)) != 0 ) { now = (uint32_t)time(NULL); - LP_utxosparse(amclient,mypeer,mypubsock,destipaddr,destport,retstr,now); + LP_utxosparse(mypeer,mypubsock,destipaddr,destport,retstr,now); free(retstr); i = 0; if ( lastn >= mypeer->numutxos ) @@ -337,16 +481,17 @@ void LP_utxosquery(int32_t amclient,struct LP_peerinfo *mypeer,int32_t mypubsock peer->errors++; } -char *LP_inventory(char *symbol) +char *LP_inventory(char *symbol,int32_t iambob) { - struct LP_utxoinfo *utxo,*tmp; char *myipaddr; cJSON *array = cJSON_CreateArray(); + struct LP_utxoinfo *utxo,*tmp; char *myipaddr; cJSON *array; + array = cJSON_CreateArray(); if ( LP_mypeer != 0 ) myipaddr = LP_mypeer->ipaddr; else myipaddr = "127.0.0.1"; - HASH_ITER(hh,LP_utxoinfos,utxo,tmp) + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { //char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); - if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && (IAMCLIENT != 0 || LP_ismine(utxo) != 0) ) + if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) != 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } return(jprint(array,1)); @@ -381,10 +526,10 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) return(mini); } -uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t amclient) +uint64_t LP_privkey_init(int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t iambob) { static uint32_t counter; - char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); + char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey,mypub; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); if ( coin == 0 ) { printf("cant add privkey for %s, coin not active\n",symbol); @@ -413,6 +558,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb } bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); + LP_mypubkey = mypub = curve25519(privkey,curve25519_basepoint9()); if ( coin->inactive == 0 && (array= LP_listunspent(symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) @@ -438,7 +584,7 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb script = jstr(item,"scriptPubKey"); depositval = values[i]; values[i] = 0, used++; - if ( amclient != 0 ) + if ( iambob == 0 ) targetval = (depositval / 776) + 100000; else targetval = (depositval / 9) * 8 + 100000; //printf("i.%d %.8f target %.8f\n",i,dstr(depositval),dstr(targetval)); @@ -451,15 +597,19 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb { value = values[i]; values[i] = 0, used++; - if ( amclient == 0 ) + if ( iambob != 0 ) { - if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,LP_peerinfos[0].ipaddr,LP_peerinfos[0].port,LP_peerinfos[0].profitmargin)) != 0 ) - utxo->mypub = curve25519(privkey,curve25519_basepoint9()); + if ( (utxo= LP_addutxo(1,mypubsock,symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) + { + //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + } } else { - if ( (utxo= LP_addutxo(amclient,mypeer,mypubsock,symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,"127.0.0.1",0,0)) != 0 ) - utxo->mypub = curve25519(privkey,curve25519_basepoint9()); + if ( (utxo= LP_addutxo(0,mypubsock,symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) + { + //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + } } total += value; } @@ -474,13 +624,13 @@ uint64_t LP_privkey_init(struct LP_peerinfo *mypeer,int32_t mypubsock,char *symb return(total); } -void LP_privkey_updates(struct LP_peerinfo *mypeer,int32_t pubsock,char *passphrase,int32_t amclient) +void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t iambob) { int32_t i; for (i=0; i Date: Sun, 11 Jun 2017 11:04:56 +0300 Subject: [PATCH 236/910] 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 b0713e810..71417da7c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -352,7 +352,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits2 if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { utxo->T.errors++; - char str[65],str2[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value); + char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin != 0. ) utxo->S.profitmargin = profitmargin; From 84505ec66c04b33c0adb7edba6eae62626fd3103 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:13:19 +0300 Subject: [PATCH 237/910] Test --- iguana/exchanges/LP_coins.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index c06acd1a1..4bda50ec5 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -250,7 +250,9 @@ struct iguana_info *LP_coinfind(char *symbol) assetname = symbol; } LP_coininit(&cdata,symbol,name,assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); - return(LP_coinadd(&cdata)); + if ( (coin= LP_coinadd(&cdata)) != 0 && strcmp(symbol,"KMD") == 0 ) + coin->inactive = 0; + return(coin); } // "coins":[{"coin":"", "rpcport":pppp}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }] From e4277bf688157bd92d9a5b30bae118a287eef8a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:15:53 +0300 Subject: [PATCH 238/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 71417da7c..8c2156b2b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -332,6 +332,7 @@ int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64 struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { uint64_t tmpsatoshis; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); From 970455b7e6ccca3769428daf4256a8d9bd53c8ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:16:44 +0300 Subject: [PATCH 239/910] tEst --- crypto777/bitcoind_RPC.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 975208ddd..47e4e6d45 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -136,7 +136,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - if ( specialcase != 0 && (0) ) + //if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: userpass.(%s) url.(%s) command.(%s) params.(%s)\n",userpass,url,command,params); try_again: if ( retstrp != 0 ) From 33253df15e94199bc80d83ebf08784ee5950332a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:21:33 +0300 Subject: [PATCH 240/910] Test --- crypto777/bitcoind_RPC.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 1 - iguana/exchanges/LP_rpc.c | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 47e4e6d45..975208ddd 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -136,7 +136,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - //if ( specialcase != 0 && (0) ) + if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: userpass.(%s) url.(%s) command.(%s) params.(%s)\n",userpass,url,command,params); try_again: if ( retstrp != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b2d4e7369..594ed3d29 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -365,7 +365,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting sockets %d %d\n",pullsock,pubsock); LP_mypubsock = pubsock; LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); - //printf("my ipaddr.(%s) peers.(%s)\n",ipaddr,retstr!=0?retstr:""); } if ( myipaddr == 0 || mypeer == 0 ) { diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index f5e915a70..b97409744 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -79,11 +79,11 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) char *retstr; cJSON *retjson = 0; if ( coin != 0 ) { - //printf("issue.(%s, %s, %s, %s, %s)\n",coin->symbol,coin->serverport,coin->userpass,method,params); + printf("issue.(%s, %s, %s, %s, %s)\n",coin->symbol,coin->serverport,coin->userpass,method,params); retstr = bitcoind_passthru(coin->symbol,coin->serverport,coin->userpass,method,params); if ( retstr != 0 && retstr[0] != 0 ) { - //printf("%s: %s.%s -> (%s)\n",coin->symbol,method,params,retstr); + printf("%s: %s.%s -> (%s)\n",coin->symbol,method,params,retstr); retjson = cJSON_Parse(retstr); free(retstr); } From dd085a31664814a154b897d3cc4b426a01aab11d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:24:03 +0300 Subject: [PATCH 241/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++++ iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 594ed3d29..8142583b0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -219,10 +219,14 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_priceinfoadd(jstr(item,"coin")); } } + printf("update alice\n"); LP_privkey_updates(pubsock,passphrase,0); + printf("update bob\n"); LP_privkey_updates(pubsock,passphrase,1); + printf("update swaps\n"); if ( (retstr= basilisk_swaplist()) != 0 ) free(retstr); + printf("update peers\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) @@ -231,6 +235,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } + printf("mainloop\n"); if ( IAMLP == 0 ) { while ( 1 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index b97409744..a2faa85c2 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -89,7 +89,7 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) } //usleep(1000); //printf("dpow_gettxout.(%s)\n",retstr); - } + } else printf("bitcoin_json cant talk to NULL coin\n"); return(retjson); } From 63f6ad30fa1dedd1169b35b4f955e8ca4599b81a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 11:26:17 +0300 Subject: [PATCH 242/910] Test --- iguana/exchanges/LP_utxos.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 8c2156b2b..6c9f87e5f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -329,19 +329,19 @@ int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64 return(0); } -struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) +struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { uint64_t tmpsatoshis; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); - if ( coin == 0 || coin[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { - printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", coin == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); + printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) tmpsatoshis = (((value2-100000) / 9) << 3); else tmpsatoshis = value; - if ( LP_iseligible(iambob,coin,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("LP_addutxo got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); @@ -350,10 +350,10 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits2 { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; - if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(coin,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) + if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { utxo->T.errors++; - char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(coin,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin != 0. ) utxo->S.profitmargin = profitmargin; @@ -363,7 +363,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *coin,bits2 utxo = calloc(1,sizeof(*utxo)); utxo->S.profitmargin = profitmargin; utxo->pubkey = pubkey; - safecopy(utxo->coin,coin,sizeof(utxo->coin)); + safecopy(utxo->coin,symbol,sizeof(utxo->coin)); safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); utxo->payment.txid = txid; From 83c2a64c252f51267616e6793e28ead649383896 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:02:04 +0300 Subject: [PATCH 243/910] Test --- iguana/exchanges/LP_commands.c | 15 +++++- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 4 +- iguana/exchanges/LP_utxos.c | 81 ++++++++++++++++++-------------- 4 files changed, 63 insertions(+), 39 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 5972a432a..9625908f3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -304,8 +304,19 @@ forward(pubkey,hexstr)\n\ return(clonestr("{\"error\":\"coin is disabled\"}")); if ( strcmp(method,"inventory") == 0 ) { - LP_privkey_init(-1,coin,0,USERPASS_WIFSTR,0); - return(LP_inventory(coin,jobj(argjson,"client") != 0 ? jint(argjson,"client") : 0)); + struct iguana_info *ptr; bits256 privkey,pubkey; uint8_t pubkey33[33]; + if ( (ptr= LP_coinfind(coin)) != 0 ) + { + privkey = LP_privkeycalc(pubkey33,&pubkey,ptr,"",USERPASS_WIFSTR); + LP_utxopurge(0); + LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33,0); + LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33,1); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jadd(retjson,"alice",LP_inventory(coin,0)); + jadd(retjson,"bob",LP_inventory(coin,1)); + return(jprint(retjson,1)); + } } else if ( (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) { diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 2dd260294..aea5d91e9 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -49,7 +49,7 @@ char *LP_lookup(bits256 pubkey) char *LP_register(bits256 pubkey,char *pushaddr) { struct LP_forwardinfo *ptr=0; int32_t pushsock; - if ( is_ipaddr(pushaddr) == 0 ) + if ( is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr\"}")); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 8142583b0..15f88dea8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -247,7 +247,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in lastforward = now; } nonz = n = 0; - if ( (++counter % 5000) == 0 ) + if ( (++counter % 6000) == 0 ) LP_utxo_updates(pubsock,passphrase,profitmargin); HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -270,7 +270,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in while ( 1 ) { nonz = 0; - if ( (counter % 500) == 0 ) + if ( (counter % 600) == 0 ) LP_utxo_updates(pubsock,passphrase,profitmargin); now = (uint32_t)time(NULL); //printf("start peers updates\n"); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6c9f87e5f..7ce7588cd 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -482,7 +482,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr peer->errors++; } -char *LP_inventory(char *symbol,int32_t iambob) +cJSON *LP_inventory(char *symbol,int32_t iambob) { struct LP_utxoinfo *utxo,*tmp; char *myipaddr; cJSON *array; array = cJSON_CreateArray(); @@ -495,7 +495,7 @@ char *LP_inventory(char *symbol,int32_t iambob) if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) != 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } - return(jprint(array,1)); + return(array); } int32_t LP_maxvalue(uint64_t *values,int32_t n) @@ -527,40 +527,16 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) return(mini); } -uint64_t LP_privkey_init(int32_t mypubsock,char *symbol,char *passphrase,char *wifstr,int32_t iambob) +uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 myprivkey,bits256 mypub,uint8_t *pubkey33,int32_t iambob) { - static uint32_t counter; - char *script; struct LP_utxoinfo *utxo; cJSON *array,*item,*retjson; bits256 userpass,userpub,txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; bits256 privkey,pubkey,mypub; uint8_t pubkey33[33],tmptype,rmd160[20]; struct iguana_info *coin = LP_coinfind(symbol); + char *script; struct LP_utxoinfo *utxo; cJSON *array,*item; bits256 txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; if ( coin == 0 ) { - printf("cant add privkey for %s, coin not active\n",symbol); + printf("coin not active\n"); return(0); } //printf("privkey init.(%s) %s\n",symbol,coin->symbol); - if ( passphrase != 0 ) - conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); - else privkey = iguana_wif2privkey(wifstr); - iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); - if ( coin->counter == 0 ) - { - char tmpstr[128]; - coin->counter++; - bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); - if ( counter++ == 0 ) - { - bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); - conv_NXTpassword(userpass.bytes,pubkey.bytes,(uint8_t *)tmpstr,(int32_t)strlen(tmpstr)); - userpub = curve25519(userpass,curve25519_basepoint9()); - printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); - } - printf("%s (%s) %d wif.(%s) (%s)\n",symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); - if ( coin->inactive == 0 && (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) - printf("importprivkey -> (%s)\n",jprint(retjson,1)); - } - bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); - LP_privkeyadd(privkey,rmd160); - LP_mypubkey = mypub = curve25519(privkey,curve25519_basepoint9()); - if ( coin->inactive == 0 && (array= LP_listunspent(symbol,coin->smartaddr)) != 0 ) + if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { @@ -600,14 +576,14 @@ uint64_t LP_privkey_init(int32_t mypubsock,char *symbol,char *passphrase,char *w values[i] = 0, used++; if ( iambob != 0 ) { - if ( (utxo= LP_addutxo(1,mypubsock,symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) + if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) { //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } } else { - if ( (utxo= LP_addutxo(0,mypubsock,symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) + if ( (utxo= LP_addutxo(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) { //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } @@ -625,13 +601,50 @@ uint64_t LP_privkey_init(int32_t mypubsock,char *symbol,char *passphrase,char *w return(total); } +bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) +{ + static uint32_t counter; + bits256 privkey,userpub,userpass; char tmpstr[128]; cJSON *retjson; uint8_t tmptype,rmd160[20]; + if ( passphrase != 0 ) + conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); + else privkey = iguana_wif2privkey(wifstr); + iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); + if ( coin->counter == 0 ) + { + coin->counter++; + bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); + bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); + LP_privkeyadd(privkey,rmd160); + printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); + if ( counter++ == 0 ) + { + bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); + conv_NXTpassword(userpass.bytes,pubkeyp->bytes,(uint8_t *)USERPASS_WIFSTR,(int32_t)strlen(USERPASS_WIFSTR)); + userpub = curve25519(userpass,curve25519_basepoint9()); + printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); + } + if ( coin->inactive == 0 && (retjson= LP_importprivkey(coin->symbol,tmpstr,coin->smartaddr,-1)) != 0 ) + printf("importprivkey -> (%s)\n",jprint(retjson,1)); + } + LP_mypubkey = *pubkeyp = curve25519(privkey,curve25519_basepoint9()); + return(privkey); +} + void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t iambob) { - int32_t i; + int32_t i; struct iguana_info *coin; bits256 pubkey,privkey; uint8_t pubkey33[33]; + memset(privkey.bytes,0,sizeof(privkey)); + pubkey = privkey; for (i=0; ismartaddr[0] == 0 ) + privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); + if ( coin->inactive == 0 ) + LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33,iambob); + } } } From 56aa3712bbdbd981d8e3e3dbd799bff782755c8d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:09:07 +0300 Subject: [PATCH 244/910] Test --- iguana/exchanges/LP_commands.c | 3 +- iguana/exchanges/LP_nativeDEX.c | 16 ++---- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 96 +++++++++++++++++---------------- 4 files changed, 56 insertions(+), 61 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9625908f3..160bc1b40 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -309,8 +309,7 @@ forward(pubkey,hexstr)\n\ { privkey = LP_privkeycalc(pubkey33,&pubkey,ptr,"",USERPASS_WIFSTR); LP_utxopurge(0); - LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33,0); - LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33,1); + LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jadd(retjson,"alice",LP_inventory(coin,0)); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 15f88dea8..abcdb6915 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -167,16 +167,8 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) { - int32_t iambob; struct LP_utxoinfo *utxo,*tmp; LP_utxopurge(0); - for (iambob=0; iambob<=1; iambob++) - { - LP_privkey_updates(pubsock,passphrase,iambob); - HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) - { - LP_utxo_spentcheck(pubsock,utxo,profitmargin); - } - } + LP_privkey_updates(pubsock,passphrase); } void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins) @@ -219,10 +211,8 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_priceinfoadd(jstr(item,"coin")); } } - printf("update alice\n"); - LP_privkey_updates(pubsock,passphrase,0); - printf("update bob\n"); - LP_privkey_updates(pubsock,passphrase,1); + printf("update utxos\n"); + LP_privkey_updates(pubsock,passphrase); printf("update swaps\n"); if ( (retstr= basilisk_swaplist()) != 0 ) free(retstr); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index a2faa85c2..cc53fdc2a 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -83,7 +83,7 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) retstr = bitcoind_passthru(coin->symbol,coin->serverport,coin->userpass,method,params); if ( retstr != 0 && retstr[0] != 0 ) { - printf("%s: %s.%s -> (%s)\n",coin->symbol,method,params,retstr); + //printf("%s: %s.%s -> (%s)\n",coin->symbol,method,params,retstr); retjson = cJSON_Parse(retstr); free(retstr); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7ce7588cd..a9940cd12 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -527,73 +527,79 @@ int32_t LP_nearestvalue(uint64_t *values,int32_t n,uint64_t targetval) return(mini); } -uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 myprivkey,bits256 mypub,uint8_t *pubkey33,int32_t iambob) +uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 myprivkey,bits256 mypub,uint8_t *pubkey33) { - char *script; struct LP_utxoinfo *utxo; cJSON *array,*item; bits256 txid,deposittxid; int32_t used,i,n,vout,depositvout; uint64_t *values,satoshis,depositval,targetval,value,total = 0; + char *script; struct LP_utxoinfo *utxo; cJSON *array,*item; bits256 txid,deposittxid; int32_t used,i,n,iambob,vout,depositvout; uint64_t *values=0,satoshis,depositval,targetval,value,total = 0; if ( coin == 0 ) { printf("coin not active\n"); return(0); } - //printf("privkey init.(%s) %s\n",symbol,coin->symbol); + printf("privkey init.(%s)\n",coin->symbol); if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { - values = calloc(n,sizeof(*values)); - for (i=0; i= 0 ) + if ( iambob == 0 ) + values = calloc(n,sizeof(*values)); + else memset(values,0,n * sizeof(*values)); + for (i=0; i= 0 ) + satoshis = SATOSHIDEN * jdouble(item,"amount"); + values[i] = satoshis; + //printf("%.8f ",dstr(satoshis)); + } + //printf("array.%d\n",n); + used = 0; + while ( used < n-1 ) + { + //printf("used.%d of n.%d\n",used,n); + if ( (i= LP_maxvalue(values,n)) >= 0 ) { item = jitem(array,i); - txid = jbits256(item,"txid"); - vout = juint(item,"vout"); - if ( jstr(item,"scriptPubKey") != 0 && strcmp(script,jstr(item,"scriptPubKey")) == 0 ) + deposittxid = jbits256(item,"txid"); + depositvout = juint(item,"vout"); + script = jstr(item,"scriptPubKey"); + depositval = values[i]; + values[i] = 0, used++; + if ( iambob == 0 ) + targetval = (depositval / 776) + 100000; + else targetval = (depositval / 9) * 8 + 100000; + //printf("i.%d %.8f target %.8f\n",i,dstr(depositval),dstr(targetval)); + if ( (i= LP_nearestvalue(values,n,targetval)) >= 0 ) { - value = values[i]; - values[i] = 0, used++; - if ( iambob != 0 ) + item = jitem(array,i); + txid = jbits256(item,"txid"); + vout = juint(item,"vout"); + if ( jstr(item,"scriptPubKey") != 0 && strcmp(script,jstr(item,"scriptPubKey")) == 0 ) { - if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) + value = values[i]; + values[i] = 0, used++; + if ( iambob != 0 ) { - //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) + { + //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + } } - } - else - { - if ( (utxo= LP_addutxo(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) + else { - //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + if ( (utxo= LP_addutxo(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) + { + //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); + } } + total += value; } - total += value; } - } - } else break; + } else break; + } + if ( iambob == 1 ) + free(values); } - free(values); } free_json(array); } @@ -630,7 +636,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co return(privkey); } -void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t iambob) +void LP_privkey_updates(int32_t pubsock,char *passphrase) { int32_t i; struct iguana_info *coin; bits256 pubkey,privkey; uint8_t pubkey33[33]; memset(privkey.bytes,0,sizeof(privkey)); @@ -643,7 +649,7 @@ void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t iambob) if ( bits256_nonz(privkey) == 0 || coin->smartaddr[0] == 0 ) privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); if ( coin->inactive == 0 ) - LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33,iambob); + LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33); } } } From f327475bb71a6bf7563745b7e0d5320fec35e767 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:10:56 +0300 Subject: [PATCH 245/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index abcdb6915..558867e62 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -251,7 +251,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in lastforward = now; } } - if ( nonz == 0 ) + //if ( nonz == 0 ) usleep(200000); } } @@ -289,7 +289,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } if ( pullsock >= 0 ) nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); - if ( nonz == 0 ) + //if ( nonz == 0 ) usleep(100000); //printf("nonz.%d in mainloop\n",nonz); } From 25be0292d7781cff44ea18b60832ebc541e01eb5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:12:36 +0300 Subject: [PATCH 246/910] Test --- iguana/exchanges/LP_nativeDEX.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 558867e62..ceea4a5be 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -237,7 +237,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in lastforward = now; } nonz = n = 0; - if ( (++counter % 6000) == 0 ) + if ( (counter % 6000) == 0 ) LP_utxo_updates(pubsock,passphrase,profitmargin); HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -251,8 +251,9 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in lastforward = now; } } - //if ( nonz == 0 ) + if ( nonz == 0 ) usleep(200000); + counter++; } } else @@ -289,8 +290,9 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } if ( pullsock >= 0 ) nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); - //if ( nonz == 0 ) + if ( nonz == 0 ) usleep(100000); + counter++; //printf("nonz.%d in mainloop\n",nonz); } } From a3228c9b3ba2cc0f51bdc1b352497e488b0c5850 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:14:18 +0300 Subject: [PATCH 247/910] 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 a9940cd12..87f5d0b78 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -624,7 +624,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( counter++ == 0 ) { - bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); + bitcoin_priv2wif(USERPASS_WIFSTR,privkey,0); conv_NXTpassword(userpass.bytes,pubkeyp->bytes,(uint8_t *)USERPASS_WIFSTR,(int32_t)strlen(USERPASS_WIFSTR)); userpub = curve25519(userpass,curve25519_basepoint9()); printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); From 2bbb5ef8e6527a83d9c1351f5a0856b17086f049 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 12:59:28 +0300 Subject: [PATCH 248/910] Test --- iguana/exchanges/LP_commands.c | 31 ++++++++++-- iguana/exchanges/LP_transaction.c | 81 ++++++++++++++++++++++--------- iguana/exchanges/LP_utxos.c | 21 ++++++-- 3 files changed, 101 insertions(+), 32 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 160bc1b40..d8a89b65e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -120,11 +120,21 @@ int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson, char *LP_connected(cJSON *argjson) // alice { - cJSON *retjson; int32_t pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; - retjson = cJSON_CreateObject(); + cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; LP_quoteparse(&Q,argjson); if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) { + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) + { + char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(clonestr("{\"error\",\"src txid in mempool\"}")); + } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) + { + char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(clonestr("{\"error\",\"dest txid in mempool\"}")); + } + retjson = cJSON_CreateObject(); if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) jaddstr(retjson,"error","couldnt create pairsock"); else if ( nn_connect(pairsock,pairstr) >= 0 ) @@ -145,19 +155,25 @@ char *LP_connected(cJSON *argjson) // alice jaddnum(retjson,"quoteid",Q.R.quoteid); } else jaddstr(retjson,"error","couldnt aliceloop"); } - } else jaddstr(retjson,"result","update stats"); - return(jprint(retjson,1)); + return(jprint(retjson,1)); + } else return(clonestr("{\"result\",\"update stats\"}")); } int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid; struct LP_utxoinfo *utxo; int32_t retval = -1; struct LP_quoteinfo Q; + char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 ) { txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) != 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { printf("LP_command.(%s)\n",jprint(argjson,0)); + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) + { + char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + utxo->T.spentflag = (uint32_t)time(NULL); + return(0); + } if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) utxo->T.swappending = 0; if ( strcmp(method,"price") == 0 || strcmp(method,"request") == 0 ) // bob @@ -200,6 +216,11 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d else if ( strcmp(method,"connect") == 0 ) // bob { retval = 4; + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,jstr(argjson,"destcoin"),jbits256(argjson,"desttxid"),jint(argjson,"destvout"),jbits256(argjson,"feetxid"),jint(argjson,"feevout"))) >= 0 ) + { + char str[65]; printf("LP_tradecommand fee selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); + } if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) LP_connectstart(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index a2ccbc9d5..43f0978ed 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -126,9 +126,45 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) return(value); } +int32_t LP_vinscan(bits256 *spendtxidp,int32_t *spendvinip,char *symbol,bits256 txid,bits256 searchtxid,int32_t searchvout,bits256 searchtxid2,int32_t searchvout2) +{ + cJSON *txobj,*vins,*vin; bits256 spenttxid; int32_t j,numvins,spentvout,retval = -1; + if ( (txobj= LP_gettx(symbol,txid)) != 0 ) + { + if ( bits256_cmp(txid,jbits256(txobj,"txid")) != 0 ) + { + printf("txid mismatch error\n"); + return(-2); + } + vins = jarray(&numvins,txobj,"vin"); + for (j=0; j 0 ) @@ -155,28 +191,8 @@ int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 se for (i=0; i= 0 ) + break; } } free_json(blockjson); @@ -208,6 +224,25 @@ int32_t LP_mempoolscan(char *symbol,bits256 txid) return(-1); } +int32_t LP_mempool_vinscan(bits256 *spendtxidp,int32_t *spendvinp,char *symbol,bits256 searchtxid,int32_t searchvout,bits256 searchtxid2,int32_t searchvout2) +{ + int32_t i,n; cJSON *array; bits256 mempooltxid; + if ( (array= LP_getmempool(symbol)) != 0 ) + { + if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; i= 0 ) + return(i); + } + free_json(array); + } + } + return(-1); +} + int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { int32_t numconfirms = 100; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 87f5d0b78..4092c45d4 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -81,6 +81,14 @@ struct LP_utxoinfo *LP_utxo2find(int32_t iambob,bits256 txid2,int32_t vout2) return(utxo); } +struct LP_utxoinfo *LP_utxofinds(int32_t iambob,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2) +{ + struct LP_utxoinfo *utxo; + if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxofind(iambob,txid2,vout2)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid2,vout2)) != 0 ) + return(utxo); + else return(0); +} + int32_t LP_utxoaddptrs(struct LP_utxoinfo *ptrs[],int32_t n,struct LP_utxoinfo *utxo) { int32_t i; @@ -331,22 +339,27 @@ int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64 struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - uint64_t tmpsatoshis; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + uint64_t tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) - tmpsatoshis = (((value2-100000) / 9) << 3); + if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding + tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("LP_addutxo got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } - if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 ) + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) + { + printf("LP_addutxo selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); + } + if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; From deb21aba064ac491212a1e58875b335795219644 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:06:42 +0300 Subject: [PATCH 249/910] Test --- iguana/exchanges/utxos | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/exchanges/utxos diff --git a/iguana/exchanges/utxos b/iguana/exchanges/utxos new file mode 100755 index 000000000..a84c72fb0 --- /dev/null +++ b/iguana/exchanges/utxos @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"getutxos\",\"coin\":\"REVS\"}" From e6ee70e49f7c5c9ea55b98b9c52c6504c87be407 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:16:36 +0300 Subject: [PATCH 250/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index cc53fdc2a..b7e682280 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -79,7 +79,7 @@ cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) char *retstr; cJSON *retjson = 0; if ( coin != 0 ) { - printf("issue.(%s, %s, %s, %s, %s)\n",coin->symbol,coin->serverport,coin->userpass,method,params); + //printf("issue.(%s, %s, %s, %s, %s)\n",coin->symbol,coin->serverport,coin->userpass,method,params); retstr = bitcoind_passthru(coin->symbol,coin->serverport,coin->userpass,method,params); if ( retstr != 0 && retstr[0] != 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4092c45d4..2c9f35613 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -548,7 +548,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr printf("coin not active\n"); return(0); } - printf("privkey init.(%s)\n",coin->symbol); + printf("privkey init.(%s) %s\n",coin->symbol,coin->smartaddr); if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) From b088dfc310d3fb2941bdfffcfe020877fa29bc87 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:19:06 +0300 Subject: [PATCH 251/910] 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 2c9f35613..2e0b1b2ca 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -361,7 +361,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { - //printf("%.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->value),dstr(utxo->value2),dstr(utxo->satoshis)); + printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { From 0ab9095467d89400f3949d3a71344b9eea98f22f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:24:35 +0300 Subject: [PATCH 252/910] Test --- iguana/exchanges/LP_coins.c | 2 +- iguana/exchanges/LP_utxos.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 4bda50ec5..821acca4c 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -65,7 +65,7 @@ void LP_userpassfp(char *symbol,char *username,char *password,FILE *fp) strcpy(username,rpcuser); strcpy(password,rpcpassword); } - printf("%s rpcuser.(%s) rpcpassword.(%s)\n",symbol,rpcuser,rpcpassword); + //printf("%s rpcuser.(%s) rpcpassword.(%s)\n",symbol,rpcuser,rpcpassword); if ( rpcuser != 0 ) free(rpcuser); if ( rpcpassword != 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2e0b1b2ca..bcc7fe2cf 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -339,8 +339,7 @@ int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64 struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - uint64_t tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + char str[65]; uint64_t tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); @@ -361,6 +360,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { + char str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) @@ -634,7 +634,8 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); + if ( coin->pubtype != 188 || strcmp(coin->symbol,"KMD") == 0 ) + printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( counter++ == 0 ) { bitcoin_priv2wif(USERPASS_WIFSTR,privkey,0); From def766389606996b83010e05b7a82b5d5aa630bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:27:52 +0300 Subject: [PATCH 253/910] Test --- iguana/exchanges/LP_utxos.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bcc7fe2cf..6d62bd586 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -168,16 +168,18 @@ void LP_availableset(struct LP_utxoinfo *utxo) int32_t LP_utxopurge(int32_t allutxos) { - struct LP_utxoinfo *utxo,*tmp; int32_t iambob,n = 0; + char str[65]; struct LP_utxoinfo *utxo,*tmp; int32_t iambob,n = 0; portable_mutex_lock(&LP_utxomutex); for (iambob=0; iambob<=1; iambob++) { HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { + printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); if ( allutxos != 0 || LP_ismine(utxo) == 0 ) { if ( LP_isavailable(utxo) == 0 ) { + printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); free(utxo); } else n++; @@ -185,10 +187,12 @@ int32_t LP_utxopurge(int32_t allutxos) } HASH_ITER(hh,LP_utxoinfos2[iambob],utxo,tmp) { + printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); if ( allutxos != 0 || LP_ismine(utxo) == 0 ) { if ( LP_isavailable(utxo) == 0 ) { + printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); free(utxo); } else n++; @@ -634,7 +638,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - if ( coin->pubtype != 188 || strcmp(coin->symbol,"KMD") == 0 ) + if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( counter++ == 0 ) { From fe11a9389a1e0c86d8f21f1c48dc472c2dd851cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:29:44 +0300 Subject: [PATCH 254/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 8 +++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d8a89b65e..b58af9f37 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -165,7 +165,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d if ( (method= jstr(argjson,"method")) != 0 ) { txid = jbits256(argjson,"txid"); - if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) != 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) + if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { printf("LP_command.(%s)\n",jprint(argjson,0)); if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) @@ -285,7 +285,7 @@ forward(pubkey,hexstr)\n\ { HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { - if ( LP_ismine(utxo) != 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) + if ( LP_ismine(utxo) > 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); //else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ceea4a5be..bdc960503 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -156,7 +156,7 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,u.txid),u.vout,dstr(u.value)); LP_spentnotify(utxo,1); } - else if ( LP_ismine(utxo) != 0 ) + else if ( LP_ismine(utxo) > 0 ) { if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6d62bd586..16edcf807 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -20,10 +20,8 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) { - if ( bits256_cmp(utxo->pubkey,LP_mypubkey) != 0 ) + if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 ) return(1); - else if ( LP_mypeer == 0 ) - return(0); else return(0); } @@ -263,7 +261,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *coin,int32_t last { if ( i++ < firsti ) continue; - if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) != 0 ) + if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } @@ -509,7 +507,7 @@ cJSON *LP_inventory(char *symbol,int32_t iambob) HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { //char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); - if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) != 0 ) + if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); } return(array); From d44a7b5f913a42e4e69c0f8ce5df1e4d797df4c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:31:49 +0300 Subject: [PATCH 255/910] Test --- iguana/exchanges/LP_utxos.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 16edcf807..f45a396f4 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -167,15 +167,16 @@ void LP_availableset(struct LP_utxoinfo *utxo) int32_t LP_utxopurge(int32_t allutxos) { char str[65]; struct LP_utxoinfo *utxo,*tmp; int32_t iambob,n = 0; + printf("LP_utxopurge mypub.(%s)\n",bits256_str(str,LP_mypubkey)); portable_mutex_lock(&LP_utxomutex); for (iambob=0; iambob<=1; iambob++) { HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); - if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + if ( LP_isavailable(utxo) > 0 ) { - if ( LP_isavailable(utxo) == 0 ) + printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); + if ( allutxos != 0 || LP_ismine(utxo) == 0 ) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); @@ -185,10 +186,10 @@ int32_t LP_utxopurge(int32_t allutxos) } HASH_ITER(hh,LP_utxoinfos2[iambob],utxo,tmp) { - printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); - if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + if ( LP_isavailable(utxo) > 0 ) { - if ( LP_isavailable(utxo) == 0 ) + printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); + if ( allutxos != 0 || LP_ismine(utxo) == 0 ) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); From a47be5316f5231a522d2c5a676c8b198578484b5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:34:06 +0300 Subject: [PATCH 256/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f45a396f4..900cec382 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -20,6 +20,7 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) { + char str[65],str2[65]; printf("cmp.(%s) vs (%s)\n",bits256_str(str,utxo->pubkey),bits256_str(str2,LP_mypubkey)); if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 ) return(1); else return(0); @@ -188,7 +189,7 @@ int32_t LP_utxopurge(int32_t allutxos) { if ( LP_isavailable(utxo) > 0 ) { - printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); + printf("purge2.(%s) ?\n",bits256_str(str,utxo->payment.txid)); if ( allutxos != 0 || LP_ismine(utxo) == 0 ) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); From 2c03f950dce4ee24e5ac7b05ce553d198626e3c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:35:24 +0300 Subject: [PATCH 257/910] Test --- iguana/exchanges/LP_utxos.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 900cec382..bd823e6cf 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -20,7 +20,6 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) { - char str[65],str2[65]; printf("cmp.(%s) vs (%s)\n",bits256_str(str,utxo->pubkey),bits256_str(str2,LP_mypubkey)); if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 ) return(1); else return(0); @@ -176,8 +175,7 @@ int32_t LP_utxopurge(int32_t allutxos) { if ( LP_isavailable(utxo) > 0 ) { - printf("purge.(%s) ?\n",bits256_str(str,utxo->payment.txid)); - if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + if ( allutxos != 0 || LP_ismine(utxo) > 0 ) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); @@ -189,8 +187,7 @@ int32_t LP_utxopurge(int32_t allutxos) { if ( LP_isavailable(utxo) > 0 ) { - printf("purge2.(%s) ?\n",bits256_str(str,utxo->payment.txid)); - if ( allutxos != 0 || LP_ismine(utxo) == 0 ) + if ( allutxos != 0 || LP_ismine(utxo) > 0 ) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); From c144a6fd611d6f65e48cb4cf57ee1050e2e451f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:37:26 +0300 Subject: [PATCH 258/910] 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 bd823e6cf..98b0fb24a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -179,7 +179,7 @@ int32_t LP_utxopurge(int32_t allutxos) { printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); - free(utxo); + //free(utxo); let the LP_utxoinfos2 free the utxo } else n++; } else n++; } From 2e2e4b11c42a80fc4cc426fc1ae4033125f9aca0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:38:36 +0300 Subject: [PATCH 259/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 98b0fb24a..a3b1d2197 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -177,7 +177,7 @@ int32_t LP_utxopurge(int32_t allutxos) { if ( allutxos != 0 || LP_ismine(utxo) > 0 ) { - printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); + printf("iambob.%d delete.(%s)\n",iambob,bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); //free(utxo); let the LP_utxoinfos2 free the utxo } else n++; @@ -189,7 +189,7 @@ int32_t LP_utxopurge(int32_t allutxos) { if ( allutxos != 0 || LP_ismine(utxo) > 0 ) { - printf("delete.(%s)\n",bits256_str(str,utxo->payment.txid)); + printf("iambob.%d delete2.(%s)\n",iambob,bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); free(utxo); } else n++; From c2a9dc0c3303b8c669f081e823edf88f3c95d94b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:39:25 +0300 Subject: [PATCH 260/910] 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 a3b1d2197..54bffe557 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -190,7 +190,7 @@ int32_t LP_utxopurge(int32_t allutxos) if ( allutxos != 0 || LP_ismine(utxo) > 0 ) { printf("iambob.%d delete2.(%s)\n",iambob,bits256_str(str,utxo->payment.txid)); - HASH_DELETE(hh,LP_utxoinfos2[iambob],utxo); + HASH_DELETE(hh2,LP_utxoinfos2[iambob],utxo); free(utxo); } else n++; } else n++; From b67f36a18e4e6c6101ac9eaa328424fd91b29197 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:40:11 +0300 Subject: [PATCH 261/910] 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 54bffe557..c61b5c8e3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -179,7 +179,7 @@ int32_t LP_utxopurge(int32_t allutxos) { printf("iambob.%d delete.(%s)\n",iambob,bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); - //free(utxo); let the LP_utxoinfos2 free the utxo + free(utxo); } else n++; } else n++; } From 7e2aa405bda3dd518146c0a4e4dcc82da884ff23 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:41:41 +0300 Subject: [PATCH 262/910] Test --- iguana/exchanges/LP_utxos.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index c61b5c8e3..158b89185 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -179,7 +179,7 @@ int32_t LP_utxopurge(int32_t allutxos) { printf("iambob.%d delete.(%s)\n",iambob,bits256_str(str,utxo->payment.txid)); HASH_DELETE(hh,LP_utxoinfos[iambob],utxo); - free(utxo); + //free(utxo); let the LP_utxoinfos2 free the utxo, should be 1:1 } else n++; } else n++; } @@ -398,7 +398,10 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + if ( LP_ismine(utxo) == 0 ) + { + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + } portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) From 8e2c6da7c72a6bf76fbcfc4db051d1ade5ab0f51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:43:38 +0300 Subject: [PATCH 263/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index b58af9f37..134ed5f2f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -329,7 +329,7 @@ forward(pubkey,hexstr)\n\ if ( (ptr= LP_coinfind(coin)) != 0 ) { privkey = LP_privkeycalc(pubkey33,&pubkey,ptr,"",USERPASS_WIFSTR); - LP_utxopurge(0); + //LP_utxopurge(0); LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index bdc960503..230c617be 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -167,7 +167,7 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) { - LP_utxopurge(0); + //LP_utxopurge(0); LP_privkey_updates(pubsock,passphrase); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 158b89185..7682fb5d2 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -398,10 +398,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - if ( LP_ismine(utxo) == 0 ) - { - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); - } + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) From c2a1b92672a6061c95e06d09a6fe7f73113fb258 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:44:31 +0300 Subject: [PATCH 264/910] Test --- iguana/exchanges/LP_utxos.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7682fb5d2..9522ce158 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -361,8 +361,11 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { - char str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); - printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); + if ( LP_ismine(utxo) == 0 ) + { + char str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); + } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { From 8dfadcdd235d720e3a498e26dda6d7c2fafb9ae6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:47:09 +0300 Subject: [PATCH 265/910] test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9522ce158..61f1399e2 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -508,9 +508,10 @@ cJSON *LP_inventory(char *symbol,int32_t iambob) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - //char str[65]; printf("iterate %s\n",bits256_str(str,utxo->txid)); + char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,utxo->payment.txid)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); + else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->payment.txid),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); } return(array); } From d78922b250a80d789b62ff9ce49ebd9dd092f151 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:48:28 +0300 Subject: [PATCH 266/910] 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 61f1399e2..03150a60b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -511,7 +511,7 @@ cJSON *LP_inventory(char *symbol,int32_t iambob) char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,utxo->payment.txid)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); - else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->payment.txid),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); + else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->pubkey),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); } return(array); } From 362c694d2c36c2a644a57aa4e97b028e4e96bfd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:49:24 +0300 Subject: [PATCH 267/910] 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 03150a60b..a360d9290 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -508,7 +508,7 @@ cJSON *LP_inventory(char *symbol,int32_t iambob) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,utxo->payment.txid)); + char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,LP_mypubkey)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->pubkey),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); From d3bd40dced20bd6d741b6c87f14b20e5ed0bbb0a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:52:16 +0300 Subject: [PATCH 268/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a360d9290..74f70a336 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -652,6 +652,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co printf("importprivkey -> (%s)\n",jprint(retjson,1)); } LP_mypubkey = *pubkeyp = curve25519(privkey,curve25519_basepoint9()); + char str[65],str2[65]; printf("privkey.(%s) -> LP_mypubkey.(%s)\n",bits256_str(str,privkey),bits256_str(str2,LP_mypubkey)); return(privkey); } From cb4674acccb351f5255bbd393e7f758b01904379 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:54:38 +0300 Subject: [PATCH 269/910] Test --- iguana/exchanges/LP_utxos.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 74f70a336..ded23d717 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -628,10 +628,14 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) { static uint32_t counter; - bits256 privkey,userpub,userpass; char tmpstr[128]; cJSON *retjson; uint8_t tmptype,rmd160[20]; + bits256 privkey,userpub,userpass; char tmpstr[128],str[65],str2[65]; cJSON *retjson; uint8_t tmptype,rmd160[20]; if ( passphrase != 0 ) conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); - else privkey = iguana_wif2privkey(wifstr); + else + { + privkey = iguana_wif2privkey(wifstr); + printf("WIF.(%s) -> %s\n",wifstr,bits256_str(str,privkey)); + } iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); if ( coin->counter == 0 ) { @@ -652,7 +656,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co printf("importprivkey -> (%s)\n",jprint(retjson,1)); } LP_mypubkey = *pubkeyp = curve25519(privkey,curve25519_basepoint9()); - char str[65],str2[65]; printf("privkey.(%s) -> LP_mypubkey.(%s)\n",bits256_str(str,privkey),bits256_str(str2,LP_mypubkey)); + printf("privkey.(%s) -> LP_mypubkey.(%s)\n",bits256_str(str,privkey),bits256_str(str2,LP_mypubkey)); return(privkey); } From 3030f487a6ee3d16fbe3cac70a8f68f4f499fa96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:55:13 +0300 Subject: [PATCH 270/910] 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 ded23d717..e0ed536ff 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -647,7 +647,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( counter++ == 0 ) { - bitcoin_priv2wif(USERPASS_WIFSTR,privkey,0); + bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); conv_NXTpassword(userpass.bytes,pubkeyp->bytes,(uint8_t *)USERPASS_WIFSTR,(int32_t)strlen(USERPASS_WIFSTR)); userpub = curve25519(userpass,curve25519_basepoint9()); printf("userpass.(%s)\n",bits256_str(USERPASS,userpub)); From e49ccd8e55246b59e9a2e25b9537a1549d275710 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:56:53 +0300 Subject: [PATCH 271/910] 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 e0ed536ff..e80836a9e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -629,7 +629,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co { static uint32_t counter; bits256 privkey,userpub,userpass; char tmpstr[128],str[65],str2[65]; cJSON *retjson; uint8_t tmptype,rmd160[20]; - if ( passphrase != 0 ) + if ( passphrase != 0 && passphrase[0] != 0 ) conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else { From cf2c02db0617ac2b868c1914a73d4bc238be82da Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 13:58:11 +0300 Subject: [PATCH 272/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e80836a9e..ab60ceebe 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -634,7 +634,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co else { privkey = iguana_wif2privkey(wifstr); - printf("WIF.(%s) -> %s\n",wifstr,bits256_str(str,privkey)); + //printf("WIF.(%s) -> %s\n",wifstr,bits256_str(str,privkey)); } iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); if ( coin->counter == 0 ) @@ -656,7 +656,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co printf("importprivkey -> (%s)\n",jprint(retjson,1)); } LP_mypubkey = *pubkeyp = curve25519(privkey,curve25519_basepoint9()); - printf("privkey.(%s) -> LP_mypubkey.(%s)\n",bits256_str(str,privkey),bits256_str(str2,LP_mypubkey)); + //printf("privkey.(%s) -> LP_mypubkey.(%s)\n",bits256_str(str,privkey),bits256_str(str2,LP_mypubkey)); return(privkey); } From eba2f83cb9c05a9c7f9f25db64fd22d389153601 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 14:09:20 +0300 Subject: [PATCH 273/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 230c617be..087ed1c75 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -282,7 +282,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; if ( lastn < LP_PROPAGATION_SLACK * 2 ) lastn = LP_PROPAGATION_SLACK * 2; - printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); + // printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer->ipaddr,myport,profitmargin); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index ab60ceebe..0a60303ba 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -310,8 +310,8 @@ char *LP_spentcheck(cJSON *argjson) } if ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) { - //if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) - // LP_mypeer->numutxos--; + 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"); @@ -409,6 +409,8 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); + if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) + LP_mypeer->numutxos++; } return(utxo); } @@ -508,10 +510,10 @@ cJSON *LP_inventory(char *symbol,int32_t iambob) else myipaddr = "127.0.0.1"; HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,LP_mypubkey)); + //char str[65]; printf("iambob.%d iterate %s\n",iambob,bits256_str(str,LP_mypubkey)); if ( LP_isunspent(utxo) != 0 && strcmp(symbol,utxo->coin) == 0 && utxo->iambob == iambob && LP_ismine(utxo) > 0 ) jaddi(array,LP_inventoryjson(cJSON_CreateObject(),utxo)); - else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->pubkey),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); + //else printf("skip %s %d %d %d %d\n",bits256_str(str,utxo->pubkey),LP_isunspent(utxo) != 0,strcmp(symbol,utxo->coin) == 0,utxo->iambob == iambob,LP_ismine(utxo) > 0); } return(array); } @@ -553,7 +555,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr printf("coin not active\n"); return(0); } - printf("privkey init.(%s) %s\n",coin->symbol,coin->smartaddr); + //printf("privkey init.(%s) %s\n",coin->symbol,coin->smartaddr); if ( coin->inactive == 0 && (array= LP_listunspent(coin->symbol,coin->smartaddr)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) From aa3d38739be5ea9d832b22ebb7377ce4b09e972b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 14:23:06 +0300 Subject: [PATCH 274/910] Test --- iguana/exchanges/LP_nativeDEX.c | 13 ++++++++++++- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 087ed1c75..426aad3ce 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -173,7 +173,7 @@ void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins) { - char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; + char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -288,6 +288,17 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } nonz += LP_subsock_check(peer); } + if ( (counter % 100) == 0 ) + { + HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) + { + LP_utxo_spentcheck(pubsock,utxo,profitmargin); + } + HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) + { + LP_utxo_spentcheck(pubsock,utxo,profitmargin); + } + } if ( pullsock >= 0 ) nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( nonz == 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0a60303ba..4eab2d5f6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -630,7 +630,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) { static uint32_t counter; - bits256 privkey,userpub,userpass; char tmpstr[128],str[65],str2[65]; cJSON *retjson; uint8_t tmptype,rmd160[20]; + bits256 privkey,userpub,userpass; char tmpstr[128]; cJSON *retjson; uint8_t tmptype,rmd160[20]; if ( passphrase != 0 && passphrase[0] != 0 ) conv_NXTpassword(privkey.bytes,pubkeyp->bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); else From 5571e9b4fb59fea43f40ef0e71af1b35454cb870 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 14:39:41 +0300 Subject: [PATCH 275/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 134ed5f2f..2f1de8e18 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -258,6 +258,7 @@ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ forward(pubkey,hexstr)\n\ \"}")); + printf("CMD.(%s)\n",jprint(argjson,0)); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) { if ( USERPASS_COUNTER == 0 ) @@ -387,7 +388,6 @@ forward(pubkey,hexstr)\n\ } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); } } - //printf("CMD.(%s)\n",jprint(argjson,0)); if ( strcmp(method,"quote") == 0 || strcmp(method,"reserved") == 0 ) retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) From af64ea9ea13aea21feb09a2f2070da4421484623 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 14:45:01 +0300 Subject: [PATCH 276/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_rpc.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index aea5d91e9..69163f4f7 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -49,7 +49,7 @@ char *LP_lookup(bits256 pubkey) char *LP_register(bits256 pubkey,char *pushaddr) { struct LP_forwardinfo *ptr=0; int32_t pushsock; - if ( is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) + if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr\"}")); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 426aad3ce..fc533884a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -225,7 +225,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } - printf("mainloop\n"); + printf("mainloop pushaddr.(%s)\n",pushaddr); if ( IAMLP == 0 ) { while ( 1 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index b7e682280..b489a8c51 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -61,6 +61,8 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) { char url[512],str[65]; + if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) + return(clonestr("{\"error\":\"illegal pushaddr\"}")); sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr); //printf("getutxo.(%s)\n",url); return(issue_curl(url)); From 2c506345ae4d997e444110f34cae1a7ec3ead6f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 14:49:16 +0300 Subject: [PATCH 277/910] Test --- iguana/exchanges/LP_commands.c | 6 +++--- iguana/exchanges/LP_utxos.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2f1de8e18..2bbee302d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -258,7 +258,7 @@ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ forward(pubkey,hexstr)\n\ \"}")); - printf("CMD.(%s)\n",jprint(argjson,0)); + //printf("CMD.(%s)\n",jprint(argjson,0)); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) { if ( USERPASS_COUNTER == 0 ) @@ -404,9 +404,9 @@ forward(pubkey,hexstr)\n\ retstr = LP_peers(); else if ( IAMLP != 0 ) { - if ( strcmp(method,"getutxos") == 0 && (coin= jstr(argjson,"coin")) != 0 ) + if ( strcmp(method,"getutxos") == 0 ) { - retstr = LP_utxos(1,LP_mypeer,coin,jint(argjson,"lastn")); + retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); } else if ( strcmp(method,"register") == 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4eab2d5f6..81eca4751 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -249,7 +249,7 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) return(item); } -char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *coin,int32_t lastn) +char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t lastn) { int32_t i,firsti; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); i = 0; @@ -260,7 +260,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *coin,int32_t last { if ( i++ < firsti ) continue; - if ( (coin == 0 || coin[0] == 0 || strcmp(coin,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) + if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } From 1eac4aaa3500c21499f4b37b891d66b33bb7505a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 15:09:15 +0300 Subject: [PATCH 278/910] Test --- iguana/exchanges/LP_nativeDEX.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fc533884a..04b53640f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -217,14 +217,6 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in if ( (retstr= basilisk_swaplist()) != 0 ) free(retstr); printf("update peers\n"); - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) - { - //printf("query utxo from %s\n",peer->ipaddr); - LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); - } - } printf("mainloop pushaddr.(%s)\n",pushaddr); if ( IAMLP == 0 ) { @@ -258,6 +250,14 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } else { + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) + { + //printf("query utxo from %s\n",peer->ipaddr); + LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + } + } while ( 1 ) { nonz = 0; From 46b17290491abf0d0f33a1bce38d9a3deaadf03e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 15:12:58 +0300 Subject: [PATCH 279/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2bbee302d..542f04704 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -348,7 +348,7 @@ forward(pubkey,hexstr)\n\ if ( jobj(argjson,"vout") == 0 ) return(clonestr("{\"error\":\"missing vout\"}")); vout = jint(argjson,"vout"); - if ( (utxo= LP_utxofind(1,txid,vout)) == 0 ) + if ( (utxo= LP_utxofind(0,txid,vout)) == 0 ) return(clonestr("{\"error\":\"txid/vout not found\"}")); if ( strcmp(method,"candidates") == 0 ) return(jprint(LP_tradecandidates(coin),1)); From a5f7f4250dff8931b486714fcf89610c8ab80dd4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 15:44:43 +0300 Subject: [PATCH 280/910] Test --- iguana/exchanges/LP_nativeDEX.c | 34 +++++++++++++++++++-------------- iguana/exchanges/run | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 04b53640f..a174c3c7c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,7 +30,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", +char *default_LPnodes[] = { "5.9.253.196" };//, "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex; int32_t LP_mypubsock = -1; @@ -171,9 +171,9 @@ void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) LP_privkey_updates(pubsock,passphrase); } -void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins) +void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { - char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; + char *retstr,*lpnode; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -181,21 +181,27 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } if ( IAMLP != 0 ) { - for (i=0; i 25 ) - continue; - LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); - } + for (i=0; i 25 ) + continue; + LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); + } + } else LP_peersquery(mypeer,pubsock,seednode,myport,mypeer->ipaddr,myport,profitmargin); } else { - OS_randombytes((void *)&r,sizeof(r)); - for (j=0; j Date: Sun, 11 Jun 2017 15:50:27 +0300 Subject: [PATCH 281/910] 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 81eca4751..8718508e4 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -600,7 +600,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr values[i] = 0, used++; if ( iambob != 0 ) { - if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_peerinfos[0].profitmargin)) != 0 ) + if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) { //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } From e1fd0ac5d30c509b696eb38c5c0d463e34a74837 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 15:57:12 +0300 Subject: [PATCH 282/910] Test --- iguana/exchanges/LP_utxos.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 8718508e4..9ec09fee6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -565,6 +565,8 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr if ( iambob == 0 ) values = calloc(n,sizeof(*values)); else memset(values,0,n * sizeof(*values)); + if ( iambob == 0 && IAMLP != 0 ) + continue; for (i=0; i Date: Sun, 11 Jun 2017 16:01:32 +0300 Subject: [PATCH 283/910] Test --- iguana/exchanges/LP_peers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 2309e5c20..145bcfde3 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -65,7 +65,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char } else { - //printf("LPaddpeer %s\n",ipaddr); + printf("LPaddpeer %s\n",ipaddr); peer = calloc(1,sizeof(*peer)); peer->pushsock = peer->subsock = pushsock = subsock = -1; strcpy(peer->ipaddr,ipaddr); @@ -160,7 +160,7 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr return; if ( (retstr= issue_LP_getpeers(destipaddr,destport,myipaddr,myport,myprofit,mypeer!=0?mypeer->numpeers:0,mypeer!=0?mypeer->numutxos:0)) != 0 ) { - //printf("got.(%s)\n",retstr); + printf("got.(%s)\n",retstr); now = (uint32_t)time(NULL); LP_peersparse(mypeer,mypubsock,destipaddr,destport,retstr,now); free(retstr); From 5f3e2b8373a556bb737078ed99cec52d3cfced8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 16:07:52 +0300 Subject: [PATCH 284/910] Test --- iguana/exchanges/LP_forwarding.c | 8 ++++++++ iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 69163f4f7..2fc99302f 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -41,6 +41,8 @@ struct LP_forwardinfo *LP_forwardfind(bits256 pubkey) char *LP_lookup(bits256 pubkey) { + if ( bits256_nonz(pubkey) == 0 ) + return(clonestr("{\"error\":\"illegal pubkey\"}")); if ( LP_forwardfind(pubkey) != 0 ) return(clonestr("{\"result\":\"success\",\"forwarding\":1}")); else return(clonestr("{\"error\":\"notfound\"}")); @@ -49,6 +51,8 @@ char *LP_lookup(bits256 pubkey) char *LP_register(bits256 pubkey,char *pushaddr) { struct LP_forwardinfo *ptr=0; int32_t pushsock; + if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + return(clonestr("{\"error\":\"illegal ipaddr\"}")); if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr\"}")); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) @@ -111,6 +115,8 @@ char *LP_forward(bits256 pubkey,char *hexstr) void LP_forwarding_register(bits256 pubkey,char *pushaddr) { char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t retval = -1; + if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + return; HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) @@ -131,6 +137,8 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr) int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) { struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson; + if ( jsonstr == 0 || jsonstr[0] == 0 || bits256_nonz(pubkey) == 0 ) + return(-1); if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) { return(LP_send(ptr->pushsock,jsonstr,1)); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index b489a8c51..6724dac27 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -71,7 +71,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) { char url[512],str[65]; - sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s",destip,destport,bits256_str(str,pubkey)); + sprintf(url,"http://%s:%u/api/stats/lookup?pubkey=%s",destip,destport,bits256_str(str,pubkey)); //printf("getutxo.(%s)\n",url); return(issue_curl(url)); } From 0c993985df7bb8c9120e1fd85270e0d6321844e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Jun 2017 16:38:16 +0300 Subject: [PATCH 285/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_nativeDEX.c | 23 ++++++++++++++++++++++- iguana/exchanges/LP_quotes.c | 21 --------------------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 542f04704..48ae74b70 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -286,7 +286,7 @@ forward(pubkey,hexstr)\n\ { HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { - if ( LP_ismine(utxo) > 0 && (strcmp(utxo->coin,base) == 0 || strcmp(utxo->coin,rel) == 0) ) + if ( LP_ismine(utxo) > 0 && strcmp(utxo->coin,base) == 0 )//|| strcmp(utxo->coin,rel) == 0) ) LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); //else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index dd2422cdf..3648309f7 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -218,5 +218,6 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); +int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin); #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a174c3c7c..a9f2cf819 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -138,6 +138,27 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) return(nonz); } +int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) +{ + double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; + if ( (now= (uint32_t)time(NULL)) > utxo->T.swappending ) + utxo->T.swappending = 0; + if ( now > utxo->T.published+60 && utxo->T.swappending == 0 && utxo->S.swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) + { + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + Q.timestamp = (uint32_t)time(NULL); + retjson = LP_quotejson(&Q); + jaddstr(retjson,"method","quote"); + retstr = jprint(retjson,1); + //printf("PING.(%s)\n",retstr); + LP_send(pubsock,retstr,1); + utxo->T.published = now; + return(0); + } + return(-1); +} + void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitmargin) { struct _LP_utxoinfo u; char str[65]; uint32_t now = (uint32_t)time(NULL); @@ -173,7 +194,7 @@ void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { - char *retstr,*lpnode; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; + char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 7f7b7ade9..5d31ae262 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -373,27 +373,6 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) return(bestitem); } -int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) -{ - double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; - if ( (now= (uint32_t)time(NULL)) > utxo->T.swappending ) - utxo->T.swappending = 0; - if ( now > utxo->T.published+60 && utxo->T.swappending == 0 && utxo->S.swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) - { - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - Q.timestamp = (uint32_t)time(NULL); - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","quote"); - retstr = jprint(retjson,1); - //printf("PING.(%s)\n",retstr); - LP_send(pubsock,retstr,1); - utxo->T.published = now; - return(0); - } - return(-1); -} - From d50603b12a20672f92672c81b6a4cab880fdd747 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 07:53:44 +0300 Subject: [PATCH 286/910] Test --- iguana/exchanges/LP_forwarding.c | 15 ++++++++++----- iguana/exchanges/LP_nativeDEX.c | 12 +++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 2fc99302f..947942b64 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -26,7 +26,7 @@ struct LP_forwardinfo int32_t pushsock; uint32_t lasttime; } *LP_forwardinfos; -#define LP_KEEPALIVE 300 +#define LP_KEEPALIVE (3600 * 24) struct LP_forwardinfo *LP_forwardfind(bits256 pubkey) { @@ -69,6 +69,7 @@ char *LP_register(bits256 pubkey,char *pushaddr) } else { + char str[65]; printf("registered (%s) -> (%s)\n",bits256_str(str,pubkey),pushaddr); ptr = calloc(1,sizeof(*ptr)); ptr->pubkey = pubkey; strcpy(ptr->pushaddr,pushaddr); @@ -112,13 +113,15 @@ char *LP_forward(bits256 pubkey,char *hexstr) } else return(clonestr("{\"error\":\"notfound\"}")); } -void LP_forwarding_register(bits256 pubkey,char *pushaddr) +void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t broadcastflag) { - char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t retval = -1; + char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) return; HASH_ITER(hh,LP_peerinfos,peer,tmp) { + if ( broadcastflag == 0 && (rand() % 100) < 66 ) + continue; if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -129,8 +132,9 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr) } free(retstr); } - if ( retval == 0 ) + if ( broadcastflag == 0 && retval == 0 ) break; + n++; } } @@ -149,7 +153,7 @@ int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( jint(retjson,"forwarding") != 0 ) + if ( jint(retjson,"forwarding") != 0 && peer->pushsock >= 0 ) retval = 0; free_json(retjson); } @@ -157,6 +161,7 @@ int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) } if ( retval == 0 ) { + printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; hexstr = malloc(len*2 + 1); init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a9f2cf819..01f57cd1a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,7 +30,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.196" };//, "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; //"5.9.253.195", +char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196" , "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex; int32_t LP_mypubsock = -1; @@ -179,6 +179,7 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma } else if ( LP_ismine(utxo) > 0 ) { + // jl777: iterated Q's if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); else LP_priceping(pubsock,utxo,"KMD",profitmargin); @@ -250,9 +251,9 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in while ( 1 ) { now = (uint32_t)time(NULL); - if ( lastforward < now-LP_KEEPALIVE ) + if ( lastforward < now-600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr); + LP_forwarding_register(LP_mypubkey,pushaddr,0); lastforward = now; } nonz = n = 0; @@ -291,6 +292,11 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in if ( (counter % 600) == 0 ) LP_utxo_updates(pubsock,passphrase,profitmargin); now = (uint32_t)time(NULL); + if ( lastforward < now-3600 ) + { + LP_forwarding_register(LP_mypubkey,pushaddr,1); + lastforward = now; + } //printf("start peers updates\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { From a772da027414ab964c9ebcd5840a335322c0eb6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:03:39 +0300 Subject: [PATCH 287/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 01f57cd1a..1e4061be7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -251,9 +251,9 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in while ( 1 ) { now = (uint32_t)time(NULL); - if ( lastforward < now-600 ) + if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr,0); + LP_forwarding_register(LP_mypubkey,pushaddr,1); lastforward = now; } nonz = n = 0; From 6a4c3774abad830d538042cabb7609291d474452 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:06:24 +0300 Subject: [PATCH 288/910] Test --- iguana/exchanges/LP_forwarding.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 947942b64..30faea10e 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -117,13 +117,17 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t broadcastflag) { char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + { + printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); return; + } HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( broadcastflag == 0 && (rand() % 100) < 66 ) continue; if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { + printf("LP_register.(%s) returned.(%s)\n",peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jint(retjson,"registered") != 0 ) From d2c74e8319f78f8e0ff65f880f4d96825c7be585 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:08:17 +0300 Subject: [PATCH 289/910] test --- iguana/exchanges/LP_forwarding.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 30faea10e..a53f0f6ed 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -52,7 +52,7 @@ char *LP_register(bits256 pubkey,char *pushaddr) { struct LP_forwardinfo *ptr=0; int32_t pushsock; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) - return(clonestr("{\"error\":\"illegal ipaddr\"}")); + return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr\"}")); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) @@ -127,7 +127,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t broadcastflag) continue; if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { - printf("LP_register.(%s) returned.(%s)\n",peer->ipaddr,retstr); + printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jint(retjson,"registered") != 0 ) From b21d7e5ffcebf5e07a15b7067a49d67cbd488687 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:12:20 +0300 Subject: [PATCH 290/910] Test --- iguana/exchanges/LP_forwarding.c | 5 +++-- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index a53f0f6ed..19979838e 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -53,8 +53,9 @@ char *LP_register(bits256 pubkey,char *pushaddr) struct LP_forwardinfo *ptr=0; int32_t pushsock; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); - if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) - return(clonestr("{\"error\":\"illegal ipaddr\"}")); + //if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) + // return(clonestr("{\"error\":\"illegal ipaddr\"}")); + char str[65]; printf("register.(%s) %s\n",pushaddr,bits256_str(str,pubkey)); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { ptr->lasttime = (uint32_t)time(NULL); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 6724dac27..cbc253e2b 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -63,7 +63,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push char url[512],str[65]; if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) return(clonestr("{\"error\":\"illegal pushaddr\"}")); - sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr); + sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); //printf("getutxo.(%s)\n",url); return(issue_curl(url)); } From 8a2c84b45b55637307b932876cb44d122c6d5e0c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:14:36 +0300 Subject: [PATCH 291/910] Test --- iguana/exchanges/LP_forwarding.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 19979838e..a1c2c516e 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -48,13 +48,14 @@ char *LP_lookup(bits256 pubkey) else return(clonestr("{\"error\":\"notfound\"}")); } -char *LP_register(bits256 pubkey,char *pushaddr) +char *LP_register(bits256 pubkey,char *ipaddr) { - struct LP_forwardinfo *ptr=0; int32_t pushsock; - if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + struct LP_forwardinfo *ptr=0; int32_t pushsock; char pushaddr[64]; + if ( ipaddr == 0 || ipaddr[0] == 0 || is_ipaddr(ipaddr) == 0 || bits256_nonz(pubkey) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); //if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) // return(clonestr("{\"error\":\"illegal ipaddr\"}")); + sprintf(pushaddr,"tcp://%s",ipaddr); char str[65]; printf("register.(%s) %s\n",pushaddr,bits256_str(str,pubkey)); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { From aee82ec3c40e06eb04b1d415569b831bd7df92d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:16:37 +0300 Subject: [PATCH 292/910] Test --- iguana/exchanges/LP_forwarding.c | 9 +++------ iguana/exchanges/LP_nativeDEX.c | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index a1c2c516e..a1adb0d91 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -115,7 +115,7 @@ char *LP_forward(bits256 pubkey,char *hexstr) } else return(clonestr("{\"error\":\"notfound\"}")); } -void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t broadcastflag) +void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) { char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) @@ -125,22 +125,19 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t broadcastflag) } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( broadcastflag == 0 && (rand() % 100) < 66 ) - continue; if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( jint(retjson,"registered") != 0 ) + if ( jint(retjson,"registered") != 0 && ++n >= max ) retval = 0; free_json(retjson); } free(retstr); } - if ( broadcastflag == 0 && retval == 0 ) + if ( retval == 0 ) break; - n++; } } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1e4061be7..f4f625476 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -253,7 +253,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in now = (uint32_t)time(NULL); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr,1); + LP_forwarding_register(LP_mypubkey,pushaddr,10); lastforward = now; } nonz = n = 0; @@ -294,7 +294,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in now = (uint32_t)time(NULL); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr,1); + LP_forwarding_register(LP_mypubkey,pushaddr,10); lastforward = now; } //printf("start peers updates\n"); From 46bd3b309e3fbf032b1792c321997ae7f2e86b97 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:44:51 +0300 Subject: [PATCH 293/910] Test --- iguana/exchanges/LP_commands.c | 22 +++++++--- iguana/exchanges/LP_forwarding.c | 69 +++++++++++++++++--------------- 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 48ae74b70..36558c11d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -41,7 +41,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits25 jaddstr(reqjson,"method",method); if ( strcmp(method,"price") != 0 ) printf("QUERY.(%s)\n",jprint(reqjson,0)); - LP_pubkey_send(qp->srchash,jprint(reqjson,1),1); + LP_forward(qp->srchash,jprint(reqjson,1),1); for (i=0; i<30; i++) { if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) != 0. ) @@ -99,7 +99,7 @@ int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson, retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); - else LP_pubkey_send(utxo->S.otherpubkey,retstr,1); + else LP_forward(utxo->S.otherpubkey,retstr,1); retval = 0; } else printf("error launching swaploop\n"); } else printf("printf error nn_connect to %s\n",pairstr); @@ -208,7 +208,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); - else LP_pubkey_send(utxo->S.otherpubkey,retstr,1); + else LP_forward(utxo->S.otherpubkey,retstr,1); utxo->T.published = (uint32_t)time(NULL); } else printf("null price\n"); } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); @@ -400,6 +400,18 @@ forward(pubkey,hexstr)\n\ retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"orderbook") == 0 ) retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); + else if ( strcmp(method,"forward") == 0 ) + { + cJSON *reqjson = jduplicate(argjson); + jdelete(reqjson,"method"); + if ( jstr(reqjson,"method2") != 0 && strncmp("forward",jstr(reqjson,"method2"),strlen("forward")) != 0 ) + { + jaddstr(reqjson,"method",jstr(argjson,"method2")); + if ( LP_forward(jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) + retstr = clonestr("{\"result\":\"success\"}"); + else retstr = clonestr("{\"error\":\"error forwarding\"}"); + } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); + } else if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); else if ( IAMLP != 0 ) @@ -413,8 +425,8 @@ forward(pubkey,hexstr)\n\ retstr = LP_register(jbits256(argjson,"pubkey"),jstr(argjson,"pushaddr")); else if ( strcmp(method,"lookup") == 0 ) retstr = LP_lookup(jbits256(argjson,"pubkey")); - else if ( strcmp(method,"forward") == 0 ) - retstr = LP_forward(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr")); + else if ( strcmp(method,"forwardhex") == 0 ) + retstr = LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr")); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); else if ( strcmp(method,"notified") == 0 ) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index a1adb0d91..da9e04eb5 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -60,7 +60,7 @@ char *LP_register(bits256 pubkey,char *ipaddr) if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { ptr->lasttime = (uint32_t)time(NULL); - return(clonestr("{\"error\":\"already registered\"}")); + return(clonestr("{\"error\":\"already registered\",\"registered\":1}")); } else if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) return(clonestr("{\"error\":\"out of sockets\"}")); @@ -84,7 +84,33 @@ char *LP_register(bits256 pubkey,char *ipaddr) } } -char *LP_forward(bits256 pubkey,char *hexstr) +void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) +{ + char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; + if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + { + printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); + return; + } + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) + { + //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jint(retjson,"registered") != 0 && ++n >= max ) + retval = 0; + free_json(retjson); + } + free(retstr); + } + if ( retval == 0 ) + break; + } +} + +char *LP_forwardhex(bits256 pubkey,char *hexstr) { struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; cJSON *retjson; if ( hexstr == 0 || hexstr[0] == 0 ) @@ -115,35 +141,9 @@ char *LP_forward(bits256 pubkey,char *hexstr) } else return(clonestr("{\"error\":\"notfound\"}")); } -void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) +int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) { - char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; - if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) - { - printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); - return; - } - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) - { - printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - if ( jint(retjson,"registered") != 0 && ++n >= max ) - retval = 0; - free_json(retjson); - } - free(retstr); - } - if ( retval == 0 ) - break; - } -} - -int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) -{ - struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson; + struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson; if ( jsonstr == 0 || jsonstr[0] == 0 || bits256_nonz(pubkey) == 0 ) return(-1); if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) @@ -162,7 +162,7 @@ int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) } free(retstr); } - if ( retval == 0 ) + if ( retval == 0 && peer->pushsock >= 0 ) { printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; @@ -170,8 +170,11 @@ int32_t LP_pubkey_send(bits256 pubkey,char *jsonstr,int32_t freeflag) init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); if ( freeflag != 0 ) free(jsonstr); - if ( peer->pushsock >= 0 ) - return(LP_send(peer->pushsock,hexstr,1)); + reqjson = cJSON_CreateObject(); + jaddstr(reqjson,"method","forwardhex"); + jaddstr(reqjson,"hex",hexstr); + free(hexstr); + return(LP_send(peer->pushsock,jprint(reqjson,1),1)); } } return(-1); From 0bf5ffd008393e94267c27dddb5534f5c3d6eb86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:50:40 +0300 Subject: [PATCH 294/910] Test --- iguana/exchanges/forward | 1 + 1 file changed, 1 insertion(+) create mode 100755 iguana/exchanges/forward diff --git a/iguana/exchanges/forward b/iguana/exchanges/forward new file mode 100755 index 000000000..23be25a46 --- /dev/null +++ b/iguana/exchanges/forward @@ -0,0 +1 @@ +curl --url "http://127.0.0.1:7779" --data "{\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"inventory\",\"coin\":\"REVS\"}" From 85f80a64aa016e8ae184659a81261a35e6a20ba7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:54:09 +0300 Subject: [PATCH 295/910] Test --- iguana/exchanges/LP_commands.c | 3 ++- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 36558c11d..948304fb7 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -167,7 +167,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { - printf("LP_command.(%s)\n",jprint(argjson,0)); + printf("LP_tradecommand.(%s)\n",jprint(argjson,0)); if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) { char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); @@ -403,6 +403,7 @@ forward(pubkey,hexstr)\n\ else if ( strcmp(method,"forward") == 0 ) { cJSON *reqjson = jduplicate(argjson); + printf("FORWARDED.(%s)\n",jprint(argjson,0)); jdelete(reqjson,"method"); if ( jstr(reqjson,"method2") != 0 && strncmp("forward",jstr(reqjson,"method2"),strlen("forward")) != 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f4f625476..1f19f1261 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -100,13 +100,13 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - printf("%s PULL.[%d] %s\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,(char *)ptr); + printf("%s PULL.[%d] %s\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,jsonstr); free(retstr); } } portable_mutex_unlock(&LP_commandmutex); free_json(argjson); - } + } else printf("error parsing(%s)\n",jsonstr); if ( (void *)jsonstr != ptr ) free(jsonstr); if ( ptr != 0 ) From 66bb39799ad758bd932f37ef685aa852191d6739 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 08:55:39 +0300 Subject: [PATCH 296/910] Test --- iguana/exchanges/forward | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/forward b/iguana/exchanges/forward index 23be25a46..82225fccd 100755 --- a/iguana/exchanges/forward +++ b/iguana/exchanges/forward @@ -1 +1,2 @@ -curl --url "http://127.0.0.1:7779" --data "{\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"inventory\",\"coin\":\"REVS\"}" +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"inventory\",\"coin\":\"REVS\"}" From b96c72fb35f72607733755bbf7780395943b93a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:01:06 +0300 Subject: [PATCH 297/910] Test --- iguana/exchanges/LP_commands.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 948304fb7..7c8418a64 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -402,13 +402,10 @@ forward(pubkey,hexstr)\n\ retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"forward") == 0 ) { - cJSON *reqjson = jduplicate(argjson); printf("FORWARDED.(%s)\n",jprint(argjson,0)); - jdelete(reqjson,"method"); - if ( jstr(reqjson,"method2") != 0 && strncmp("forward",jstr(reqjson,"method2"),strlen("forward")) != 0 ) + if ( jstr(argjson,"method2") != 0 && strncmp("forward",jstr(argjson,"method2"),strlen("forward")) != 0 ) { - jaddstr(reqjson,"method",jstr(argjson,"method2")); - if ( LP_forward(jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) + if ( LP_forward(jbits256(argjson,"pubkey"),jprint(argjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); From 1a11b13757b51650a7060d145c0eadc19ad3c3e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:03:25 +0300 Subject: [PATCH 298/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1f19f1261..ca676ecd8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -81,7 +81,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { - int32_t recvsize,len,datalen,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson; + int32_t recvsize,len,datalen=0,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson; while ( (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; @@ -92,6 +92,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; + printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { len = (int32_t)strlen(jsonstr) + 1; From 73a7cae0b9a70507a5135503e6186dff674d4c70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:05:37 +0300 Subject: [PATCH 299/910] Test --- iguana/exchanges/LP_commands.c | 7 +++++-- iguana/exchanges/LP_forwarding.c | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7c8418a64..948304fb7 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -402,10 +402,13 @@ forward(pubkey,hexstr)\n\ retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"forward") == 0 ) { + cJSON *reqjson = jduplicate(argjson); printf("FORWARDED.(%s)\n",jprint(argjson,0)); - if ( jstr(argjson,"method2") != 0 && strncmp("forward",jstr(argjson,"method2"),strlen("forward")) != 0 ) + jdelete(reqjson,"method"); + if ( jstr(reqjson,"method2") != 0 && strncmp("forward",jstr(reqjson,"method2"),strlen("forward")) != 0 ) { - if ( LP_forward(jbits256(argjson,"pubkey"),jprint(argjson,1),1) > 0 ) + jaddstr(reqjson,"method",jstr(argjson,"method2")); + if ( LP_forward(jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index da9e04eb5..85b087a18 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -173,6 +173,7 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) reqjson = cJSON_CreateObject(); jaddstr(reqjson,"method","forwardhex"); jaddstr(reqjson,"hex",hexstr); + jaddbits256(reqjson,"pubkey",pubkey); free(hexstr); return(LP_send(peer->pushsock,jprint(reqjson,1),1)); } From 93f7c280a6b2642723b09ee3b2c26f39af5e4428 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:09:48 +0300 Subject: [PATCH 300/910] Test --- iguana/exchanges/LP_nativeDEX.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ca676ecd8..9c465acaa 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -97,7 +97,13 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double { len = (int32_t)strlen(jsonstr) + 1; portable_mutex_lock(&LP_commandmutex); - if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) + if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) + { + printf("forwardhex\n"); + if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr"))) != 0 ) + free(retstr); + } + else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { From 3635afd48f1164d4919d858d84298cc79a17a15d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:12:00 +0300 Subject: [PATCH 301/910] Test --- iguana/exchanges/LP_forwarding.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 85b087a18..202694e41 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -122,6 +122,7 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) datalen = (int32_t)strlen(hexstr) >> 1; data = malloc(datalen); decode_hex(data,datalen,hexstr); + printf("forwardhex.(%s)\n",(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,1); } retjson = cJSON_CreateObject(); @@ -139,6 +140,7 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) return(jprint(retjson,1)); } } else return(clonestr("{\"error\":\"notfound\"}")); + printf("couldnt find pubkey\n"); } int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) From 9ac6fd473dc0f77fff693390037a04cc8e2928ee Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:13:40 +0300 Subject: [PATCH 302/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 948304fb7..70a360320 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -427,7 +427,7 @@ forward(pubkey,hexstr)\n\ else if ( strcmp(method,"lookup") == 0 ) retstr = LP_lookup(jbits256(argjson,"pubkey")); else if ( strcmp(method,"forwardhex") == 0 ) - retstr = LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr")); + retstr = LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); else if ( strcmp(method,"notified") == 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9c465acaa..31fc0e746 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -100,7 +100,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { printf("forwardhex\n"); - if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hexstr"))) != 0 ) + if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) From 00b10462985ab894444ebfa34fcf7def38526657 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:15:12 +0300 Subject: [PATCH 303/910] Test --- iguana/exchanges/forward | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/forward b/iguana/exchanges/forward index 82225fccd..966e6af67 100755 --- a/iguana/exchanges/forward +++ b/iguana/exchanges/forward @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"inventory\",\"coin\":\"REVS\"}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"getprice\",\"base\":\"REVS\",\"rel\":\"KMD\"}" From 549b5f7f32d37927458ab17d0135469b6c34c272 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:19:36 +0300 Subject: [PATCH 304/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 70a360320..35dfdcf69 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -162,7 +162,7 @@ char *LP_connected(cJSON *argjson) // alice int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; - if ( (method= jstr(argjson,"method")) != 0 ) + if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 || strcmp(method,"price") == 0 || strcmp(method,"connect") == 0) ) { txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 31fc0e746..145bd3189 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -103,7 +103,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } - else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) == 0 ) + else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) <= 0 ) { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { From a7190071c3429adf8bf007ae250092554b5e1caf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:20:34 +0300 Subject: [PATCH 305/910] 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 145bd3189..0f09b308f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -107,7 +107,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - printf("%s PULL.[%d] %s\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,jsonstr); + printf("%s PULL.[%d] %s -> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,jsonstr,retstr); free(retstr); } } From ed0f1f14b22bbdd42bb164be79a81e210f52740a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:25:16 +0300 Subject: [PATCH 306/910] Test --- iguana/exchanges/LP_nativeDEX.c | 6 ++++-- iguana/exchanges/LP_prices.c | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0f09b308f..c7ee74b82 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -108,7 +108,9 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { printf("%s PULL.[%d] %s -> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,jsonstr,retstr); - free(retstr); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else free(retstr); } } portable_mutex_unlock(&LP_commandmutex); @@ -133,7 +135,7 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - //printf("%s RECV.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 3122cd252..1f211fd91 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -375,6 +375,8 @@ char *LP_pricestr(char *base,char *rel) { retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); + jaddstr(retjson,"method","postprice"); + jaddbits256(retjson,"pubkey",LP_mypubkey); jaddstr(retjson,"base",base); jaddstr(retjson,"rel",rel); jaddnum(retjson,"price",price); From abf2ce9fe3a167fced68c28475f460ab07e5cf26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:47:59 +0300 Subject: [PATCH 307/910] Test --- iguana/exchanges/LP_commands.c | 19 +++++++++++++++---- iguana/exchanges/LP_nativeDEX.c | 11 +++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 35dfdcf69..36ff82c1e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -230,6 +230,18 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } +cJSON *LP_dereference(cJSON *argjson,char *excludemethod) +{ + cJSON *reqjson = 0; + if ( jstr(argjson,"method2") != 0 && strncmp(excludemethod,jstr(argjson,"method2"),strlen(excludemethod)) != 0 ) + { + reqjson = jduplicate(argjson); + jdelete(reqjson,"method"); + jaddstr(reqjson,"method",jstr(argjson,"method2")); + } + return(reqjson); +} + char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; @@ -402,16 +414,15 @@ forward(pubkey,hexstr)\n\ retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"forward") == 0 ) { - cJSON *reqjson = jduplicate(argjson); + cJSON *reqjson; printf("FORWARDED.(%s)\n",jprint(argjson,0)); - jdelete(reqjson,"method"); - if ( jstr(reqjson,"method2") != 0 && strncmp("forward",jstr(reqjson,"method2"),strlen("forward")) != 0 ) + if ( (reqjson= LP_dereference(argjson,"forward")) != 0 ) { - jaddstr(reqjson,"method",jstr(argjson,"method2")); if ( LP_forward(jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); + } else if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c7ee74b82..23bf74cf1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -81,7 +81,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { - int32_t recvsize,len,datalen=0,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson; + int32_t recvsize,len,datalen=0,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; while ( (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; @@ -99,10 +99,17 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double portable_mutex_lock(&LP_commandmutex); if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { - printf("forwardhex\n"); if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } + else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) + { + if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) + { + printf("publish.(%s)\n",jprint(reqjson,0)); + LP_send(pubsock,jprint(reqjson,1),1); + } + } else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) <= 0 ) { if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) From f33927db8b0dfbca695c41356497f5b17b25f4d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:52:21 +0300 Subject: [PATCH 308/910] 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 23bf74cf1..6a374e39e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -104,6 +104,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { + jdelete(argjson,"method2"); if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) { printf("publish.(%s)\n",jprint(reqjson,0)); From c829ec9584799fe14f862876a13c6e2aa7fba748 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:53:34 +0300 Subject: [PATCH 309/910] 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 6a374e39e..3fa9306a9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -105,6 +105,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { jdelete(argjson,"method2"); + printf("pub?.(%s)\n",jprint(argjson,0)); if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) { printf("publish.(%s)\n",jprint(reqjson,0)); From 615e66effc9dce2654cfa6367215277d39307f68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 09:55:25 +0300 Subject: [PATCH 310/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3fa9306a9..c40a89892 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -104,7 +104,9 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { - jdelete(argjson,"method2"); + if ( jobj(argjson,"method2") != 0 ) + jdelete(argjson,"method2"); + jaddstr(argjson,"method2","broadcast"); printf("pub?.(%s)\n",jprint(argjson,0)); if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) { From f149016d07b06e5acc8069a1efaf571dd69aa88d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:02:23 +0300 Subject: [PATCH 311/910] Test --- iguana/exchanges/LP_commands.c | 8 +++++++- iguana/exchanges/LP_forwarding.c | 6 ++++++ iguana/exchanges/LP_prices.c | 6 ++++++ iguana/exchanges/pub | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100755 iguana/exchanges/pub diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 36ff82c1e..2d187b206 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -268,7 +268,9 @@ orderbook(base, rel)\n\ getprice(base, rel)\n\ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ -forward(pubkey,hexstr)\n\ +forward(pubkey,method2,)\n\ +forward(pubkey,method2=publish,)\n\ +forwardhex(pubkey,hex)\n\ \"}")); //printf("CMD.(%s)\n",jprint(argjson,0)); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) @@ -408,6 +410,10 @@ forward(pubkey,hexstr)\n\ retstr = LP_spentcheck(argjson); else if ( strcmp(method,"getcoins") == 0 ) retstr = jprint(LP_coinsjson(),1); + else if ( strcmp(method,"postprice") == 0 ) + retstr = LP_postedprice(argjson); + else if ( strcmp(method,"broadcast") == 0 ) + retstr = LP_broadcasted(argjson); else if ( strcmp(method,"getprice") == 0 ) retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"orderbook") == 0 ) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 202694e41..3f77c0657 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -184,4 +184,10 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) } +char *LP_broadcasted(cJSON *argjson) +{ + printf("RECV BROADCAST.(%s)\n",jprint(argjson,0)); + return(clonestr("{\"result\":\"need to update broadcast messages\"}")); +} + diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 1f211fd91..9b35a607a 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -386,5 +386,11 @@ char *LP_pricestr(char *base,char *rel) } else return(clonestr("{\"error\":\"cant find baserel pair\"}")); } +char *LP_postedprice(cJSON *argjson) +{ + printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); + return(clonestr("{\"result\":\"need to update stats\"}")); +} + diff --git a/iguana/exchanges/pub b/iguana/exchanges/pub new file mode 100755 index 000000000..edafc5b98 --- /dev/null +++ b/iguana/exchanges/pub @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"publish\",\"data\":\"nonsense\"}" From a3848fdb8dddb6973b9ce8f03f2a742252a34ee3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:04:34 +0300 Subject: [PATCH 312/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 3f77c0657..acccff843 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -122,7 +122,7 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) datalen = (int32_t)strlen(hexstr) >> 1; data = malloc(datalen); decode_hex(data,datalen,hexstr); - printf("forwardhex.(%s)\n",(char *)data); + //printf("forwardhex.(%s)\n",(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,1); } retjson = cJSON_CreateObject(); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c40a89892..d5093bec8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -92,7 +92,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); + //printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { len = (int32_t)strlen(jsonstr) + 1; @@ -107,12 +107,8 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double if ( jobj(argjson,"method2") != 0 ) jdelete(argjson,"method2"); jaddstr(argjson,"method2","broadcast"); - printf("pub?.(%s)\n",jprint(argjson,0)); if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) - { - printf("publish.(%s)\n",jprint(reqjson,0)); LP_send(pubsock,jprint(reqjson,1),1); - } } else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) <= 0 ) { From 5d9aeb8f59a015cccfd09fcdb0fcc2e8f3998282 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:11:17 +0300 Subject: [PATCH 313/910] Test --- iguana/exchanges/LP_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2d187b206..5954685cc 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -280,6 +280,7 @@ forwardhex(pubkey,hex)\n\ USERPASS_COUNTER = 1; retjson = cJSON_CreateObject(); jaddstr(retjson,"userpass",USERPASS); + jaddbits256(retjson,"mypubkey",LP_mypubkey); jadd(retjson,"coins",LP_coinsjson()); return(jprint(retjson,1)); } From 3476bdf2945665aaa7c74319e5e554b347acbc69 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:21:58 +0300 Subject: [PATCH 314/910] Test --- iguana/exchanges/LP_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 5954685cc..869525083 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -24,6 +24,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits25 qp->desthash = mypub; strcpy(qp->srccoin,base); strcpy(qp->destcoin,rel); + qp->desthash = LP_mypubkey; if ( strcmp(method,"request") == 0 ) { qp->quotetime = (uint32_t)time(NULL); From d18709100a738dddbaa2f42c06c7dbfe00d5bff1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:28:51 +0300 Subject: [PATCH 315/910] Test --- iguana/exchanges/LP_quotes.c | 8 +++++++- iguana/exchanges/LP_transaction.c | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 5d31ae262..0721bf597 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -329,7 +329,7 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) bestprice = prices[i]; item = jitem(array,i); bestitem = LP_quotejson(&Q[i]); - printf("bestprice %f vs maxprice %f\n",bestprice,maxprice); + printf("bestprice %f vs maxprice %f (%s)\n",bestprice,maxprice,jprint(bestitem,0)); if ( maxprice == 0. || bestprice <= maxprice ) { Q[i].desttxid = myutxo->payment.txid; @@ -337,6 +337,9 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) Q[i].feetxid = myutxo->fee.txid; Q[i].feevout = myutxo->fee.vout; strcpy(Q[i].destaddr,myutxo->coinaddr); + Q[i].desthash = LP_mypubkey; + strcpy(Q[i].srccoin,base); + strcpy(Q[i].destcoin,myutxo->coin); price = LP_query("request",&Q[i],base,myutxo->coin,myutxo->S.mypub); if ( jobj(bestitem,"price") != 0 ) jdelete(bestitem,"price"); @@ -348,6 +351,9 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) Q[i].feetxid = myutxo->fee.txid; Q[i].feevout = myutxo->fee.vout; strcpy(Q[i].destaddr,myutxo->coinaddr); + Q[i].desthash = LP_mypubkey; + strcpy(Q[i].srccoin,base); + strcpy(Q[i].destcoin,myutxo->coin); price = LP_query("connect",&Q[i],base,myutxo->coin,myutxo->S.mypub); LP_requestinit(&R,Q[i].srchash,Q[i].desthash,base,Q[i].satoshis,Q[i].destcoin,Q[i].destsatoshis,Q[i].timestamp,Q[i].quotetime,DEXselector); jaddstr(bestitem,"status","connected"); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 43f0978ed..a5aed366b 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -227,6 +227,8 @@ int32_t LP_mempoolscan(char *symbol,bits256 txid) int32_t LP_mempool_vinscan(bits256 *spendtxidp,int32_t *spendvinp,char *symbol,bits256 searchtxid,int32_t searchvout,bits256 searchtxid2,int32_t searchvout2) { int32_t i,n; cJSON *array; bits256 mempooltxid; + if ( symbol == 0 || symbol[0] == 0 || bits256_nonz(searchtxid) == 0 || bits256_nonz(searchtxid2) == 0 ) + return(-1); if ( (array= LP_getmempool(symbol)) != 0 ) { if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) From 5016bdc010f01b6b441d98a2116b42f0bcf8218b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 10:42:13 +0300 Subject: [PATCH 316/910] 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 d5093bec8..27f9ac502 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -142,7 +142,7 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); From 482b51225737db5be5707e2ee4194132a9cdd510 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Jun 2017 12:10:33 +0300 Subject: [PATCH 317/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/LP_rpc.c | 4 ++-- iguana/exchanges/lookup | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100755 iguana/exchanges/lookup diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 869525083..6b5555b39 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -442,9 +442,9 @@ forwardhex(pubkey,hex)\n\ //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); } else if ( strcmp(method,"register") == 0 ) - retstr = LP_register(jbits256(argjson,"pubkey"),jstr(argjson,"pushaddr")); + retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); else if ( strcmp(method,"lookup") == 0 ) - retstr = LP_lookup(jbits256(argjson,"pubkey")); + retstr = LP_lookup(jbits256(argjson,"client")); else if ( strcmp(method,"forwardhex") == 0 ) retstr = LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"notify") == 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index cbc253e2b..5a88e6a1d 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -63,7 +63,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push char url[512],str[65]; if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) return(clonestr("{\"error\":\"illegal pushaddr\"}")); - sprintf(url,"http://%s:%u/api/stats/register?pubkey=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); + sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); //printf("getutxo.(%s)\n",url); return(issue_curl(url)); } @@ -71,7 +71,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) { char url[512],str[65]; - sprintf(url,"http://%s:%u/api/stats/lookup?pubkey=%s",destip,destport,bits256_str(str,pubkey)); + sprintf(url,"http://%s:%u/api/stats/lookup?client=%s",destip,destport,bits256_str(str,pubkey)); //printf("getutxo.(%s)\n",url); return(issue_curl(url)); } diff --git a/iguana/exchanges/lookup b/iguana/exchanges/lookup new file mode 100755 index 000000000..af9cdd645 --- /dev/null +++ b/iguana/exchanges/lookup @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"pubkey\":\"6578099f6474d9b8bd66a7a136b922029a989818ec0309aee962dd6ac1862b74\",\"method\":\"forward\",\"method2\":\"lookup\",\"client\":\"$1\"}" From 29963727957cabba52c50ed8df5bb929a1a7cfa7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 13:05:41 +0300 Subject: [PATCH 318/910] Test --- iguana/exchanges/LP_commands.c | 37 ++--- iguana/exchanges/LP_forwarding.c | 28 ++-- iguana/exchanges/LP_include.h | 7 +- iguana/exchanges/LP_nativeDEX.c | 57 +++----- iguana/exchanges/LP_prices.c | 216 +++++++++++++++++++++++------ iguana/exchanges/LP_quotes.c | 52 +++++-- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_statemachine.c | 42 ++++++ iguana/exchanges/LP_utxos.c | 50 +++---- 9 files changed, 338 insertions(+), 153 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6b5555b39..a4a964ee1 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -45,7 +45,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits25 LP_forward(qp->srchash,jprint(reqjson,1),1); for (i=0; i<30; i++) { - if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) != 0. ) + if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) > SMALLVAL ) { if ( flag == 0 || bits256_nonz(qp->desthash) != 0 ) { @@ -61,7 +61,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits25 int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { char *retstr,pairstr[512]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; - if ( (price= LP_price(base,rel)) != 0. ) + if ( (price= LP_price(base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) @@ -182,7 +182,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d retval = 1; if ( LP_isavailable(utxo) > 0 ) { - if ( (price= LP_price(base,rel)) != 0. ) + if ( (price= LP_price(base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) @@ -210,7 +210,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); else LP_forward(utxo->S.otherpubkey,retstr,1); - utxo->T.published = (uint32_t)time(NULL); + utxo->T.lasttime = (uint32_t)time(NULL); } else printf("null price\n"); } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); } @@ -245,7 +245,7 @@ cJSON *LP_dereference(cJSON *argjson,char *excludemethod) char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) return(clonestr("{\"error\":\"need method in request\"}")); else if ( strcmp(method,"help") == 0 ) @@ -289,31 +289,22 @@ forwardhex(pubkey,hex)\n\ return(clonestr("{\"error\":\"authentication error\"}")); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 ) { - //char str[65]; + double price; if ( LP_isdisabled(base,rel) != 0 ) return(clonestr("{\"error\":\"at least one of coins disabled\"}")); if ( strcmp(method,"setprice") == 0 ) { - if ( LP_mypriceset(base,rel,jdouble(argjson,"price")) < 0 ) - return(clonestr("{\"error\":\"couldnt set price\"}")); - else + if ( (price= jdouble(argjson,"price")) > SMALLVAL ) { - if ( IAMLP != 0 ) - { - HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) - { - if ( LP_ismine(utxo) > 0 && strcmp(utxo->coin,base) == 0 )//|| strcmp(utxo->coin,rel) == 0) ) - LP_priceping(LP_mypubsock,utxo,rel,LP_profitratio - 1.); - //else printf("notmine.(%s %s)\n",utxo->coin,bits256_str(str,utxo->txid)); - } - } - return(clonestr("{\"result\":\"success\"}")); - } + if ( LP_mypriceset(base,rel,price) < 0 ) + return(clonestr("{\"error\":\"couldnt set price\"}")); + else return(LP_pricepings(LP_mypubsock,base,rel,price * LP_profitratio)); + } else return(clonestr("{\"error\":\"no price\"}")); } else if ( strcmp(method,"myprice") == 0 ) { double bid,ask; - if ( LP_myprice(&bid,&ask,base,rel) != 0. ) + if ( LP_myprice(&bid,&ask,base,rel) > SMALLVAL ) { retjson = cJSON_CreateObject(); jaddstr(retjson,"base",base); @@ -417,7 +408,7 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"broadcast") == 0 ) retstr = LP_broadcasted(argjson); else if ( strcmp(method,"getprice") == 0 ) - retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel")); + retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel"),0.); else if ( strcmp(method,"orderbook") == 0 ) retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); else if ( strcmp(method,"forward") == 0 ) @@ -454,7 +445,7 @@ forwardhex(pubkey,hex)\n\ if ( juint(argjson,"timestamp") > time(NULL)-60 ) { printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_addutxo(1,LP_mypubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"valuesats"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"valuesats2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit")); + LP_utxoaddjson(1,LP_mypubsock,argjson); } retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index acccff843..7b6d866b9 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -146,24 +146,30 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) { struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson; - if ( jsonstr == 0 || jsonstr[0] == 0 || bits256_nonz(pubkey) == 0 ) + if ( jsonstr == 0 || jsonstr[0] == 0 ) return(-1); - if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) + if ( bits256_nonz(pubkey) != 0 ) { - return(LP_send(ptr->pushsock,jsonstr,1)); + if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) + { + return(LP_send(ptr->pushsock,jsonstr,1)); + } } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( (retstr= issue_LP_lookup(peer->ipaddr,peer->port,pubkey)) != 0 ) + if ( bits256_nonz(pubkey) != 0 ) { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) + if ( (retstr= issue_LP_lookup(peer->ipaddr,peer->port,pubkey)) != 0 ) { - if ( jint(retjson,"forwarding") != 0 && peer->pushsock >= 0 ) - retval = 0; - free_json(retjson); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jint(retjson,"forwarding") != 0 && peer->pushsock >= 0 ) + retval = 0; + free_json(retjson); + } + free(retstr); } - free(retstr); - } + } else retval = 0; if ( retval == 0 && peer->pushsock >= 0 ) { printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); @@ -178,7 +184,7 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) jaddbits256(reqjson,"pubkey",pubkey); free(hexstr); return(LP_send(peer->pushsock,jprint(reqjson,1),1)); - } + } else retval = -1; } return(-1); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 3648309f7..93642f146 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -147,7 +147,7 @@ struct iguana_info struct _LP_utxoinfo { bits256 txid; uint64_t value; int32_t vout; }; -struct LP_utxostats { uint32_t lasttime,errors,swappending,published,spentflag,lastspentcheck; }; +struct LP_utxostats { uint32_t lasttime,errors,swappending,spentflag,lastspentcheck; }; struct LP_utxobob { struct _LP_utxoinfo utxo,deposit; }; @@ -218,6 +218,9 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); -int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin); +int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag); +int32_t LP_ismine(struct LP_utxoinfo *utxo); +int32_t LP_isavailable(struct LP_utxoinfo *utxo); + #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 27f9ac502..c1ece23e6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -32,7 +32,7 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196" , "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // -portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex; +portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -154,27 +154,6 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) return(nonz); } -int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double profitmargin) -{ - double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; - if ( (now= (uint32_t)time(NULL)) > utxo->T.swappending ) - utxo->T.swappending = 0; - if ( now > utxo->T.published+60 && utxo->T.swappending == 0 && utxo->S.swap == 0 && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) - { - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - Q.timestamp = (uint32_t)time(NULL); - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","quote"); - retstr = jprint(retjson,1); - //printf("PING.(%s)\n",retstr); - LP_send(pubsock,retstr,1); - utxo->T.published = now; - return(0); - } - return(-1); -} - void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitmargin) { struct _LP_utxoinfo u; char str[65]; uint32_t now = (uint32_t)time(NULL); @@ -193,13 +172,14 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,u.txid),u.vout,dstr(u.value)); LP_spentnotify(utxo,1); } - else if ( LP_ismine(utxo) > 0 ) + /*else if ( LP_ismine(utxo) > 0 ) { + printf("iterate through all locally generated quotes and update, or change to price feed\n"); // jl777: iterated Q's if ( strcmp(utxo->coin,"KMD") == 0 ) LP_priceping(pubsock,utxo,"BTC",profitmargin); else LP_priceping(pubsock,utxo,"KMD",profitmargin); - } + }*/ } } @@ -209,9 +189,23 @@ void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) LP_privkey_updates(pubsock,passphrase); } +void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) +{ + int32_t lastn; + if ( now > peer->lastutxos+interval ) + { + peer->lastutxos = now; + //lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; + //if ( lastn < LP_PROPAGATION_SLACK * 2 ) + lastn = LP_PROPAGATION_SLACK * 2; + if ( mypeer == 0 || strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) + LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + } +} + void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { - char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz,lastn; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; + char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -278,6 +272,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in HASH_ITER(hh,LP_peerinfos,peer,tmp) { nonz += LP_subsock_check(peer); + LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,600); } if ( pullsock >= 0 ) { @@ -325,17 +320,8 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); } - if ( peer->numutxos != mypeer->numutxos && now > peer->lastutxos+60 ) - { - peer->lastutxos = now; - lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; - if ( lastn < LP_PROPAGATION_SLACK * 2 ) - lastn = LP_PROPAGATION_SLACK * 2; - // printf("%s numutxos.%d vs %d lastn.%d\n",peer->ipaddr,peer->numutxos,mypeer->numutxos,lastn); - if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) - LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer->ipaddr,myport,profitmargin); - } nonz += LP_subsock_check(peer); + LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,60); } if ( (counter % 100) == 0 ) { @@ -373,6 +359,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit portable_mutex_init(&LP_swaplistmutex); portable_mutex_init(&LP_cachemutex); portable_mutex_init(&LP_forwardmutex); + portable_mutex_init(&LP_pubkeymutex); if ( profitmargin == 0. || profitmargin == 0.01 ) { profitmargin = 0.01 + (double)(rand() % 100)/100000; diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 9b35a607a..c0ad1eef0 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -18,6 +18,8 @@ // marketmaker // +struct LP_orderbookentry { bits256 txid; double price; uint64_t basesatoshis; int32_t vout; }; + #define LP_MAXPRICEINFOS 64 struct LP_priceinfo { @@ -39,6 +41,13 @@ struct LP_cacheinfo uint32_t timestamp; } *LP_cacheinfos; +struct LP_pubkeyinfo +{ + UT_hash_handle hh; + bits256 pubkey; + double matrix[LP_MAXPRICEINFOS][LP_MAXPRICEINFOS]; +} *LP_pubkeyinfos; + int32_t LP_cachekey(uint8_t *key,char *base,char *rel,bits256 txid,int32_t vout) { uint64_t basebits,relbits; int32_t offset = 0; @@ -70,6 +79,29 @@ struct LP_cacheinfo *LP_cachefind(char *base,char *rel,bits256 txid,int32_t vout return(ptr); } +struct LP_pubkeyinfo *LP_pubkeyfind(bits256 pubkey) +{ + struct LP_pubkeyinfo *pubp=0; + portable_mutex_lock(&LP_pubkeymutex); + HASH_FIND(hh,LP_pubkeyinfos,&pubkey,sizeof(pubkey),pubp); + portable_mutex_unlock(&LP_pubkeymutex); + return(pubp); +} + +struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) +{ + struct LP_pubkeyinfo *pubp=0; + if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) + { + portable_mutex_lock(&LP_pubkeymutex); + HASH_ADD(hh,LP_pubkeyinfos,pubkey,sizeof(pubkey),pubp); + portable_mutex_unlock(&LP_pubkeymutex); + if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) + printf("pubkeyadd find error after add\n"); + } + return(pubp); +} + double LP_pricecache(struct LP_quoteinfo *qp,char *base,char *rel,bits256 txid,int32_t vout) { struct LP_cacheinfo *ptr; @@ -79,7 +111,7 @@ double LP_pricecache(struct LP_quoteinfo *qp,char *base,char *rel,bits256 txid,i (*qp) = ptr->Q; if ( ptr->price == 0. && ptr->Q.satoshis != 0 ) { - printf("null ptr->price? "); + printf("LP_pricecache: null ptr->price? "); ptr->price = (double)ptr->Q.destsatoshis / ptr->Q.satoshis; } //printf("found %s/%s %.8f\n",base,rel,ptr->price); @@ -136,9 +168,9 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) *bidp = *askp = 0.; if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { - if ( (*askp= basepp->myprices[relpp->ind]) != 0. ) + if ( (*askp= basepp->myprices[relpp->ind]) > SMALLVAL ) { - if ( (val= relpp->myprices[basepp->ind]) != 0. ) + if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) { *bidp = 1. / val; } else *bidp = *askp * 0.99; @@ -146,7 +178,7 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) } else { - if ( (val= relpp->myprices[basepp->ind]) != 0. ) + if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) { *bidp = 1. / val; *askp = *bidp / 0.99; @@ -159,7 +191,7 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) int32_t LP_mypriceset(char *base,char *rel,double price) { struct LP_priceinfo *basepp,*relpp; - if ( price != 0. && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + if ( price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { basepp->myprices[relpp->ind] = price; // ask relpp->myprices[basepp->ind] = (1. / price); // bid @@ -197,7 +229,7 @@ cJSON *LP_priceinfomatrix(int32_t usemyprices) { if ( usemyprices == 0 || (val= pp->myprices[j]) == 0. ) val = pp->relvals[j]; - if ( val != 0. ) + if ( val > SMALLVAL ) { sum += val; n++; @@ -214,8 +246,11 @@ cJSON *LP_priceinfomatrix(int32_t usemyprices) pp = LP_priceinfos; for (i=0; idiagval /= total; - jaddnum(vectorjson,pp->symbol,pp->diagval); + if ( pp->diagval > SMALLVAL ) + { + pp->diagval /= total; + jaddnum(vectorjson,pp->symbol,pp->diagval); + } } } return(vectorjson); @@ -269,8 +304,8 @@ struct LP_cacheinfo *LP_cacheadd(char *base,char *rel,bits256 txid,int32_t vout, static int _cmp_orderbook(const void *a,const void *b) { int32_t retval = 0; -#define ptr_a (*(struct LP_cacheinfo **)a)->price -#define ptr_b (*(struct LP_cacheinfo **)b)->price +#define ptr_a (*(struct LP_orderbookentry **)a)->price +#define ptr_b (*(struct LP_orderbookentry **)b)->price if ( ptr_b > ptr_a ) retval = 1; else if ( ptr_b < ptr_a ) @@ -279,8 +314,8 @@ static int _cmp_orderbook(const void *a,const void *b) { #undef ptr_a #undef ptr_b -#define ptr_a ((struct LP_cacheinfo *)a)->Q.satoshis -#define ptr_b ((struct LP_cacheinfo *)b)->Q.satoshis +#define ptr_a ((struct LP_orderbookentry *)a)->basesatoshis +#define ptr_b ((struct LP_orderbookentry *)b)->basesatoshis if ( ptr_b > ptr_a ) return(1); else if ( ptr_b < ptr_a ) @@ -297,23 +332,88 @@ static int _cmp_orderbookrev(const void *a,const void *b) return(-_cmp_orderbook(a,b)); } -cJSON *LP_orderbookjson(struct LP_cacheinfo *ptr,int32_t polarity) +cJSON *LP_orderbookjson(struct LP_orderbookentry *op) { - double price; cJSON *item = cJSON_CreateObject(); - if ( ptr->Q.satoshis != 0 && ptr->Q.destsatoshis != 0 ) + cJSON *item = cJSON_CreateObject(); + if ( op->price > SMALLVAL ) { - price = (double)ptr->Q.destsatoshis / ptr->Q.satoshis; - jaddnum(item,"price",polarity > 0 ? price : 1. / price); - jaddnum(item,"volume",polarity > 0 ? dstr(ptr->Q.satoshis) : dstr(ptr->Q.destsatoshis)); - jaddbits256(item,"txid",ptr->Q.txid); - jaddnum(item,"vout",ptr->Q.vout); + jaddnum(item,"price",op->price ); + jaddnum(item,"volume",dstr(op->basesatoshis)); + jaddbits256(item,"txid",op->txid); + jaddnum(item,"vout",op->vout); } return(item); } +struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,int32_t vout,double price,uint64_t basesatoshis) +{ + struct LP_orderbookentry *op; + if ( (op= calloc(1,sizeof(*op))) != 0 ) + { + op->txid = txid; + op->vout = vout; + op->price = price; + op->basesatoshis = basesatoshis; + } + return(op); +} + +int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 txid,int32_t vout) +{ + int32_t i; + for (i=0; ivout == vout && bits256_cmp(array[i]->txid,txid) == 0 ) + return(i); + return(-1); +} + +int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol,double price,struct LP_orderbookentry **array,int32_t num,int32_t cachednum,bits256 pubkey) +{ + struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; + HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) + { + if ( LP_ismine(utxo) > 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) + { + if ( LP_orderbookfind(array,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) + { + char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); + array = realloc(array,sizeof(*array) * (num+1)); + if ( strcmp(base,symbol) == 0 ) + basesatoshis = utxo->payment.value; + else basesatoshis = utxo->payment.value * price; + if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,price,basesatoshis)) != 0 ) + array[num++] = op; + if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) + { + HASH_ITER(hh,LP_peerinfos,peer,ptmp) + { + if ( (retstr= issue_LP_notifyutxo(peer->ipaddr,peer->port,utxo)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jobj(retjson,"error") == 0 ) + utxo->T.lasttime = (uint32_t)time(NULL); + free_json(retjson); + } + free(retstr); + } + if ( utxo->T.lasttime != 0 ) + break; + } + } + } + } + } + return(num); +} + char *LP_orderbook(char *base,char *rel) { - uint32_t now,i; struct LP_cacheinfo *ptr,*tmp,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0; + uint32_t now,i; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_pubkeyinfo *pubp,*ptmp; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; + if ( (basepp= LP_priceinfofind(base)) == 0 || (relpp= LP_priceinfofind(rel)) == 0 ) + return(clonestr("{\"error\":\"base or rel not added\"}")); + baseid = basepp->ind; + relid = relpp->ind; now = (uint32_t)time(NULL); HASH_ITER(hh,LP_cacheinfos,ptr,tmp) { @@ -322,23 +422,28 @@ char *LP_orderbook(char *base,char *rel) if ( strcmp(ptr->Q.srccoin,base) == 0 && strcmp(ptr->Q.destcoin,rel) == 0 ) { asks = realloc(asks,sizeof(*asks) * (numasks+1)); - asks[numasks++] = ptr; + if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->price,ptr->Q.satoshis)) != 0 ) + asks[numasks++] = op; } else if ( strcmp(ptr->Q.srccoin,rel) == 0 && strcmp(ptr->Q.destcoin,base) == 0 ) { bids = realloc(bids,sizeof(*bids) * (numbids+1)); - bids[numbids++] = ptr; + if ( (op= LP_orderbookentry(base,rel,ptr->Q.desttxid,ptr->Q.destvout,1./ptr->price,ptr->Q.satoshis)) != 0 ) + bids[numbids++] = op; } } + cachenumbids = numbids, cachenumasks = numasks; + HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) + { + if ( pubp->matrix[baseid][relid] > SMALLVAL ) + numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],asks,numasks,cachenumasks,pubp->pubkey); + if ( pubp->matrix[relid][baseid] > SMALLVAL ) + numasks = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],bids,numbids,cachenumbids,pubp->pubkey); + } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); if ( numbids > 1 ) qsort(bids,numbids,sizeof(*bids),_cmp_orderbookrev); - for (i=0; i 1 ) { for (i=0; iprice); printf("sorted asks.%d\n",numasks); } + for (i=0; i SMALLVAL && origprice < price ) + price = origprice; + } + if ( price > SMALLVAL ) { retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); @@ -386,11 +505,24 @@ char *LP_pricestr(char *base,char *rel) } else return(clonestr("{\"error\":\"cant find baserel pair\"}")); } -char *LP_postedprice(cJSON *argjson) +void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]) { - printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); - return(clonestr("{\"result\":\"need to update stats\"}")); + LP_priceinfoupdate(base,rel,price); } +void LP_pricefeedupdate(bits256 pubkey,char *base,char *rel,double price) +{ + struct LP_priceinfo *basepp,*relpp; struct LP_pubkeyinfo *pubp; char str[65]; + printf("PRICEFEED UPDATE.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); + if ( price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + { + if ( (pubp= LP_pubkeyadd(pubkey)) != 0 ) + pubp->matrix[basepp->ind][relpp->ind] = price; + else printf("error creating pubkey entry\n"); + } else printf("error finding %s/%s %.8f\n",base,rel,price); +} + + + diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 0721bf597..a00bf6f3d 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -13,6 +13,7 @@ * Removal or modification of this copyright notice is prohibited. * * * ******************************************************************************/ + // // LP_quotes.c // marketmaker @@ -172,11 +173,49 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; - //char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); + char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } +char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) +{ + bits256 zero; cJSON *reqjson = cJSON_CreateObject(); + jaddbits256(reqjson,"pubkey",LP_mypubkey); + jaddstr(reqjson,"base",base); + jaddstr(reqjson,"rel",rel); + jaddnum(reqjson,"price",price); + if ( pubsock >= 0 ) + { + jaddstr(reqjson,"method","postprice"); + LP_send(pubsock,jprint(reqjson,1),1); + } + else + { + jaddstr(reqjson,"method","forward"); + jaddstr(reqjson,"method2","postprice"); + memset(zero.bytes,0,sizeof(zero)); + LP_forward(zero,jprint(reqjson,1),1); + } + return(clonestr("{\"result\":\"success\"}")); +} + +char *LP_postedprice(cJSON *argjson) +{ + bits256 pubkey; double price; char *base,*rel,str[65]; + if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && (price= jdouble(argjson,"price")) > SMALLVAL ) + { + pubkey = jbits256(argjson,"pubkey"); + if ( bits256_nonz(pubkey) != 0 ) + { + LP_pricefeedupdate(pubkey,base,rel,price); + printf("PRICE POSTED.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); + return(clonestr("{\"result\":\"success\"}")); + } + } + return(clonestr("{\"error\":\"missing fields in posted price\"}")); +} + int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) { if ( mysatoshis >= othersatoshis ) @@ -199,11 +238,6 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) cJSON *LP_tradecandidates(char *base) { struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; - /*if ( (price= LP_price(base,myutxo->coin)) == .0 ) - { - printf("no LP_price (%s -> %s)\n",base,myutxo->coin); - return(0); - }*/ totaladded = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -296,17 +330,17 @@ cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) price = LP_query("price",&Q[i],base,myutxo->coin,zero); Q[i].destsatoshis = price * Q[i].satoshis; } - if ( (prices[i]= price) != 0. && (bestprice == 0. || price < bestprice) ) + if ( (prices[i]= price) > SMALLVAL && (bestprice == 0. || price < bestprice) ) bestprice = price; char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); } - if ( bestprice != 0. ) + if ( bestprice > SMALLVAL ) { bestmetric = 0.; besti = -1; for (i=0; iS.satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) + if ( (price= prices[i]) > SMALLVAL && myutxo->S.satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) { metric = price / bestprice; printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5a88e6a1d..a80197ccd 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&valuesats=%llu&txid2=%s&vout2=%d&valuesats2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str2,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str2,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index ed4fe4fc8..2f2c39565 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1264,3 +1264,45 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu } portable_mutex_unlock(&myinfo->DEX_swapmutex); }*/ + +/*int32_t LP_priceping(int32_t pubsock,struct LP_utxoinfo *utxo,char *rel,double origprice) + { + double price,bid,ask; uint32_t now; cJSON *retjson; struct LP_quoteinfo Q; char *retstr; + if ( (now= (uint32_t)time(NULL)) > utxo->T.swappending && utxo->S.swap == 0 ) + utxo->T.swappending = 0; + if ( now > utxo->T.published+60 && LP_isavailable(utxo) && (price= LP_myprice(&bid,&ask,utxo->coin,rel)) != 0. ) + { + if ( origprice < price ) + price = origprice; + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + Q.timestamp = (uint32_t)time(NULL); + retjson = LP_quotejson(&Q); + jaddstr(retjson,"method","quote"); + retstr = jprint(retjson,1); + //printf("PING.(%s)\n",retstr); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else + { + // verify it is in list + // push if it isnt + } + utxo->T.published = now; + return(0); + } + return(-1); + }*/ +/*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.); + LP_utxoadd(0,-1,Q.destcoin,Q.desttxid,Q.destvout,Q.destvalue,Q.feetxid,Q.feevout,Q.feevalu,"",Q.destaddr,Q.desthash,0.); + }*/ + +/*struct LP_utxoinfo *utxo,*tmp; + HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) + { + if ( LP_ismine(utxo) > 0 && strcmp(utxo->coin,base) == 0 ) + LP_priceping(LP_mypubsock,utxo,rel,price * LP_profitratio); + }*/ + diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9ec09fee6..dfe649e21 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -338,7 +338,7 @@ int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64 return(0); } -struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) +struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { char str[65]; uint64_t tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) @@ -351,19 +351,19 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit else tmpsatoshis = value; if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { - printf("LP_addutxo got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); + printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) { - printf("LP_addutxo selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); return(0); } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { if ( LP_ismine(utxo) == 0 ) { - char str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + char str2[65],str3[65]; printf("iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; @@ -372,7 +372,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit utxo->T.errors++; char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } - else if ( profitmargin != 0. ) + else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; } else @@ -401,7 +401,7 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s LP_addutxo.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + char str[65],str2[65],str3[65]; printf("iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) @@ -415,14 +415,14 @@ struct LP_utxoinfo *LP_addutxo(int32_t iambob,int32_t mypubsock,char *symbol,bit return(utxo); } -int32_t LP_utxosparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) +struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson) +{ + return(LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid2"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"))); +} + +int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { struct LP_peerinfo *destpeer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; - if ( IAMLP == 0 ) - { - printf("LP_utxosparse not for clientside\n"); - return(-1); - } if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) @@ -443,11 +443,8 @@ int32_t LP_utxosparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipa { txid = jbits256(item,"txid"); //printf("parse.(%s)\n",jprint(item,0)); - utxo = LP_addutxo(1,mypubsock,jstr(item,"coin"),txid,jint(item,"vout"),j64bits(item,"value"),jbits256(item,"txid2"),jint(item,"vout2"),j64bits(item,"value2"),jstr(item,"script"),jstr(item,"address"),jbits256(item,"pubkey"),jdouble(item,"profit")); - if ( utxo != 0 ) - { + if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) utxo->T.lasttime = now; - } } } // else printf("skip.(%s)\n",jprint(item,0)); } @@ -463,27 +460,20 @@ int32_t LP_utxosparse(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipa void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *coin,int32_t lastn,char *myipaddr,uint16_t myport,double myprofit) { - char *retstr; struct LP_peerinfo *peer; int32_t i,firsti; uint32_t now; - if ( IAMLP == 0 ) - { - printf("LP_utxosquery not for clientside\n"); - return; - } + char *retstr; struct LP_peerinfo *peer; uint32_t now; peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); - if ( mypeer == 0 ) //(peer != 0 && peer->errors > 0) || - return; if ( coin == 0 ) coin = ""; - if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer->numpeers,mypeer->numutxos)) != 0 ) + if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer != 0 ? mypeer->numpeers : 0,mypeer != 0 ? mypeer->numutxos : 0)) != 0 ) { now = (uint32_t)time(NULL); - LP_utxosparse(mypeer,mypubsock,destipaddr,destport,retstr,now); + LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); free(retstr); - i = 0; + /*i = 0; if ( lastn >= mypeer->numutxos ) firsti = -1; else firsti = (mypeer->numutxos - lastn); - /*HASH_ITER(hh,LP_utxoinfos,utxo,tmp) + HASH_ITER(hh,LP_utxoinfos,utxo,tmp) { if ( i++ < firsti ) continue; @@ -602,14 +592,14 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr values[i] = 0, used++; if ( iambob != 0 ) { - if ( (utxo= LP_addutxo(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) + if ( (utxo= LP_utxoadd(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) { //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } } else { - if ( (utxo= LP_addutxo(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0)) != 0 ) + if ( (utxo= LP_utxoadd(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0.)) != 0 ) { //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } From 22ad721ed60152d5140b168f56591d9d75f325e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 13:53:50 +0300 Subject: [PATCH 319/910] Test --- iguana/exchanges/LP_quotes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index a00bf6f3d..f4e5b30bd 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -188,6 +188,7 @@ char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) if ( pubsock >= 0 ) { jaddstr(reqjson,"method","postprice"); + printf("pricepings.(%s)\n",jprint(reqjson,0)); LP_send(pubsock,jprint(reqjson,1),1); } else From 65c619ec3c9890052e73af5c8d7d5fb2f42d1899 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 13:59:47 +0300 Subject: [PATCH 320/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index f4e5b30bd..b887de1b7 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -203,14 +203,14 @@ char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) char *LP_postedprice(cJSON *argjson) { - bits256 pubkey; double price; char *base,*rel,str[65]; + bits256 pubkey; double price; char *base,*rel; + printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && (price= jdouble(argjson,"price")) > SMALLVAL ) { pubkey = jbits256(argjson,"pubkey"); if ( bits256_nonz(pubkey) != 0 ) { LP_pricefeedupdate(pubkey,base,rel,price); - printf("PRICE POSTED.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); return(clonestr("{\"result\":\"success\"}")); } } From e5fcb6c9250391d83a6e159af88811b1af5b456c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:01:23 +0300 Subject: [PATCH 321/910] 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 c1ece23e6..b3ac6f31a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -142,7 +142,7 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); From ed15575d701c6844b1bbd8cf8a5e1f255f794df8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:05:47 +0300 Subject: [PATCH 322/910] Test --- iguana/exchanges/LP_prices.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index c0ad1eef0..3a9c69b6e 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -82,9 +82,11 @@ struct LP_cacheinfo *LP_cachefind(char *base,char *rel,bits256 txid,int32_t vout struct LP_pubkeyinfo *LP_pubkeyfind(bits256 pubkey) { struct LP_pubkeyinfo *pubp=0; + printf("pub find\n"); portable_mutex_lock(&LP_pubkeymutex); HASH_FIND(hh,LP_pubkeyinfos,&pubkey,sizeof(pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); + printf("pub find.%p\n",pubp); return(pubp); } @@ -93,12 +95,15 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) struct LP_pubkeyinfo *pubp=0; if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) { + printf("pub add\n"); portable_mutex_lock(&LP_pubkeymutex); HASH_ADD(hh,LP_pubkeyinfos,pubkey,sizeof(pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); + printf("pub add.%p\n",pubp); if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) printf("pubkeyadd find error after add\n"); } + printf("pub add ret.%p\n",pubp); return(pubp); } From c0d538da8c8ae788c163b5315825983ee7f2685d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:07:05 +0300 Subject: [PATCH 323/910] Test --- iguana/exchanges/LP_prices.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 3a9c69b6e..62e75a351 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -97,6 +97,8 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) { printf("pub add\n"); portable_mutex_lock(&LP_pubkeymutex); + pubp = calloc(1,sizeof(*pubp)); + pubp->pubkey = pubkey; HASH_ADD(hh,LP_pubkeyinfos,pubkey,sizeof(pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); printf("pub add.%p\n",pubp); From 7711ec7574be88518708ad30a8fc14deab6c3cbb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:07:41 +0300 Subject: [PATCH 324/910] Test --- iguana/exchanges/LP_prices.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 62e75a351..f40d7352a 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -82,11 +82,9 @@ struct LP_cacheinfo *LP_cachefind(char *base,char *rel,bits256 txid,int32_t vout struct LP_pubkeyinfo *LP_pubkeyfind(bits256 pubkey) { struct LP_pubkeyinfo *pubp=0; - printf("pub find\n"); portable_mutex_lock(&LP_pubkeymutex); HASH_FIND(hh,LP_pubkeyinfos,&pubkey,sizeof(pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); - printf("pub find.%p\n",pubp); return(pubp); } @@ -95,17 +93,14 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) struct LP_pubkeyinfo *pubp=0; if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) { - printf("pub add\n"); portable_mutex_lock(&LP_pubkeymutex); pubp = calloc(1,sizeof(*pubp)); pubp->pubkey = pubkey; HASH_ADD(hh,LP_pubkeyinfos,pubkey,sizeof(pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); - printf("pub add.%p\n",pubp); if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) printf("pubkeyadd find error after add\n"); } - printf("pub add ret.%p\n",pubp); return(pubp); } From 812d1e460d16c80ae66af85577ec2704e1c37d5e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:09:23 +0300 Subject: [PATCH 325/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_prices.c | 2 +- iguana/exchanges/LP_quotes.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b3ac6f31a..c1ece23e6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -142,7 +142,7 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) portable_mutex_lock(&LP_commandmutex); if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) { - printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); + //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index f40d7352a..414dcc8e8 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -515,9 +515,9 @@ void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveas void LP_pricefeedupdate(bits256 pubkey,char *base,char *rel,double price) { struct LP_priceinfo *basepp,*relpp; struct LP_pubkeyinfo *pubp; char str[65]; - printf("PRICEFEED UPDATE.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); if ( price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { + printf("PRICEFEED UPDATE.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); if ( (pubp= LP_pubkeyadd(pubkey)) != 0 ) pubp->matrix[basepp->ind][relpp->ind] = price; else printf("error creating pubkey entry\n"); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index b887de1b7..c1a104e3d 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -204,7 +204,7 @@ char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) char *LP_postedprice(cJSON *argjson) { bits256 pubkey; double price; char *base,*rel; - printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); + //printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && (price= jdouble(argjson,"price")) > SMALLVAL ) { pubkey = jbits256(argjson,"pubkey"); From 85969c40744c9cd9c721e4560ec04f91351e7d2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:13:50 +0300 Subject: [PATCH 326/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 414dcc8e8..b15d521c4 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -440,7 +440,7 @@ char *LP_orderbook(char *base,char *rel) if ( pubp->matrix[baseid][relid] > SMALLVAL ) numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],asks,numasks,cachenumasks,pubp->pubkey); if ( pubp->matrix[relid][baseid] > SMALLVAL ) - numasks = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],bids,numbids,cachenumbids,pubp->pubkey); + numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],bids,numbids,cachenumbids,pubp->pubkey); } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); From 70fcf731b96f18e5a963102a17b124681b338bd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:17:48 +0300 Subject: [PATCH 327/910] Test --- iguana/exchanges/LP_prices.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index b15d521c4..b026dcd47 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -369,22 +369,22 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx return(-1); } -int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol,double price,struct LP_orderbookentry **array,int32_t num,int32_t cachednum,bits256 pubkey) +int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol,double price,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum,bits256 pubkey) { struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { if ( LP_ismine(utxo) > 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { - if ( LP_orderbookfind(array,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) + if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); - array = realloc(array,sizeof(*array) * (num+1)); + *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); if ( strcmp(base,symbol) == 0 ) basesatoshis = utxo->payment.value; else basesatoshis = utxo->payment.value * price; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,price,basesatoshis)) != 0 ) - array[num++] = op; + (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) { HASH_ITER(hh,LP_peerinfos,peer,ptmp) @@ -438,9 +438,10 @@ char *LP_orderbook(char *base,char *rel) HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) { if ( pubp->matrix[baseid][relid] > SMALLVAL ) - numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],asks,numasks,cachenumasks,pubp->pubkey); + numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],&asks,numasks,cachenumasks,pubp->pubkey); if ( pubp->matrix[relid][baseid] > SMALLVAL ) - numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],bids,numbids,cachenumbids,pubp->pubkey); + numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],&bids,numbids,cachenumbids,pubp->pubkey); + printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); From f14411f04dfc6284e10be4466acd3b33cde72607 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:19:39 +0300 Subject: [PATCH 328/910] 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 b026dcd47..4b3bc523b 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -378,7 +378,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { - char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); + //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); if ( strcmp(base,symbol) == 0 ) basesatoshis = utxo->payment.value; @@ -441,7 +441,7 @@ char *LP_orderbook(char *base,char *rel) numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],&asks,numasks,cachenumasks,pubp->pubkey); if ( pubp->matrix[relid][baseid] > SMALLVAL ) numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],&bids,numbids,cachenumbids,pubp->pubkey); - printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); + //printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); From cd22f237f096885e7709794eac91f1fd8c8cd0eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:30:22 +0300 Subject: [PATCH 329/910] Test --- iguana/exchanges/LP_prices.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 4b3bc523b..82f511a70 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -18,7 +18,7 @@ // marketmaker // -struct LP_orderbookentry { bits256 txid; double price; uint64_t basesatoshis; int32_t vout; }; +struct LP_orderbookentry { bits256 txid,txid2; double price; uint64_t basesatoshis; int32_t vout,vout2; }; #define LP_MAXPRICEINFOS 64 struct LP_priceinfo @@ -343,17 +343,21 @@ cJSON *LP_orderbookjson(struct LP_orderbookentry *op) jaddnum(item,"volume",dstr(op->basesatoshis)); jaddbits256(item,"txid",op->txid); jaddnum(item,"vout",op->vout); + jaddbits256(item,"txid2",op->txid2); + jaddnum(item,"vout2",op->vout2); } return(item); } -struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,int32_t vout,double price,uint64_t basesatoshis) +struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2,double price,uint64_t basesatoshis) { struct LP_orderbookentry *op; if ( (op= calloc(1,sizeof(*op))) != 0 ) { op->txid = txid; op->vout = vout; + op->txid2 = txid2; + op->vout2 = vout2; op->price = price; op->basesatoshis = basesatoshis; } @@ -364,7 +368,7 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx { int32_t i; for (i=0; ivout == vout && bits256_cmp(array[i]->txid,txid) == 0 ) + if ( (array[i]->vout == vout && bits256_cmp(array[i]->txid,txid) == 0) || (array[i]->vout2 == vout && bits256_cmp(array[i]->txid2,txid) == 0) ) return(i); return(-1); } @@ -383,7 +387,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, if ( strcmp(base,symbol) == 0 ) basesatoshis = utxo->payment.value; else basesatoshis = utxo->payment.value * price; - if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,price,basesatoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,price,basesatoshis)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) { @@ -424,13 +428,13 @@ char *LP_orderbook(char *base,char *rel) if ( strcmp(ptr->Q.srccoin,base) == 0 && strcmp(ptr->Q.destcoin,rel) == 0 ) { asks = realloc(asks,sizeof(*asks) * (numasks+1)); - if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->price,ptr->Q.satoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,ptr->price,ptr->Q.satoshis)) != 0 ) asks[numasks++] = op; } else if ( strcmp(ptr->Q.srccoin,rel) == 0 && strcmp(ptr->Q.destcoin,base) == 0 ) { bids = realloc(bids,sizeof(*bids) * (numbids+1)); - if ( (op= LP_orderbookentry(base,rel,ptr->Q.desttxid,ptr->Q.destvout,1./ptr->price,ptr->Q.satoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,1./ptr->price,ptr->Q.satoshis)) != 0 ) bids[numbids++] = op; } } From 119e944462678289ad439eb52ac00f1e1a6c49c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:33:21 +0300 Subject: [PATCH 330/910] Test --- iguana/exchanges/LP_prices.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 82f511a70..77376e4cd 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -439,13 +439,14 @@ char *LP_orderbook(char *base,char *rel) } } cachenumbids = numbids, cachenumasks = numasks; + printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) { if ( pubp->matrix[baseid][relid] > SMALLVAL ) numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],&asks,numasks,cachenumasks,pubp->pubkey); if ( pubp->matrix[relid][baseid] > SMALLVAL ) numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],&bids,numbids,cachenumbids,pubp->pubkey); - //printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); + printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); From 961c15f2470ba4bd45b7d4dfb6b66a73509cf632 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:36:02 +0300 Subject: [PATCH 331/910] Test --- iguana/exchanges/LP_prices.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 77376e4cd..47353a84b 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -96,7 +96,7 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) portable_mutex_lock(&LP_pubkeymutex); pubp = calloc(1,sizeof(*pubp)); pubp->pubkey = pubkey; - HASH_ADD(hh,LP_pubkeyinfos,pubkey,sizeof(pubkey),pubp); + HASH_ADD_KEYPTR(hh,LP_pubkeyinfos,&pubp->pubkey,sizeof(pubp->pubkey),pubp); portable_mutex_unlock(&LP_pubkeymutex); if ( (pubp= LP_pubkeyfind(pubkey)) == 0 ) printf("pubkeyadd find error after add\n"); @@ -442,6 +442,7 @@ char *LP_orderbook(char *base,char *rel) printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) { + char str[65]; printf("pubkey.(%s)\n",bits256_str(str,pubp->pubkey)); if ( pubp->matrix[baseid][relid] > SMALLVAL ) numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],&asks,numasks,cachenumasks,pubp->pubkey); if ( pubp->matrix[relid][baseid] > SMALLVAL ) From 92db3e415fb2ba81685496589b7fede739d2a1c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:40:41 +0300 Subject: [PATCH 332/910] Test --- iguana/exchanges/LP_prices.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 47353a84b..c31beb6f7 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -18,7 +18,7 @@ // marketmaker // -struct LP_orderbookentry { bits256 txid,txid2; double price; uint64_t basesatoshis; int32_t vout,vout2; }; +struct LP_orderbookentry { bits256 txid,txid2,pubkey; double price; uint64_t basesatoshis; int32_t vout,vout2; }; #define LP_MAXPRICEINFOS 64 struct LP_priceinfo @@ -343,13 +343,12 @@ cJSON *LP_orderbookjson(struct LP_orderbookentry *op) jaddnum(item,"volume",dstr(op->basesatoshis)); jaddbits256(item,"txid",op->txid); jaddnum(item,"vout",op->vout); - jaddbits256(item,"txid2",op->txid2); - jaddnum(item,"vout2",op->vout2); + jaddbits256(item,"pubkey",op->pubkey); } return(item); } -struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2,double price,uint64_t basesatoshis) +struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,int32_t vout,bits256 txid2,int32_t vout2,double price,uint64_t basesatoshis,bits256 pubkey) { struct LP_orderbookentry *op; if ( (op= calloc(1,sizeof(*op))) != 0 ) @@ -360,6 +359,7 @@ struct LP_orderbookentry *LP_orderbookentry(char *base,char *rel,bits256 txid,in op->vout2 = vout2; op->price = price; op->basesatoshis = basesatoshis; + op->pubkey = pubkey; } return(op); } @@ -387,7 +387,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, if ( strcmp(base,symbol) == 0 ) basesatoshis = utxo->payment.value; else basesatoshis = utxo->payment.value * price; - if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,price,basesatoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,price,basesatoshis,pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) { @@ -428,13 +428,13 @@ char *LP_orderbook(char *base,char *rel) if ( strcmp(ptr->Q.srccoin,base) == 0 && strcmp(ptr->Q.destcoin,rel) == 0 ) { asks = realloc(asks,sizeof(*asks) * (numasks+1)); - if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,ptr->price,ptr->Q.satoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,ptr->price,ptr->Q.satoshis,ptr->Q.srchash)) != 0 ) asks[numasks++] = op; } else if ( strcmp(ptr->Q.srccoin,rel) == 0 && strcmp(ptr->Q.destcoin,base) == 0 ) { bids = realloc(bids,sizeof(*bids) * (numbids+1)); - if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,1./ptr->price,ptr->Q.satoshis)) != 0 ) + if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,1./ptr->price,ptr->Q.satoshis,ptr->Q.srchash)) != 0 ) bids[numbids++] = op; } } From 9a5b805efedaecf6e38a1ad64e1f90cfda161a0f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 14:51:52 +0300 Subject: [PATCH 333/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_prices.c | 2 +- iguana/exchanges/LP_utxos.c | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c1ece23e6..1e354bfb5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,7 +30,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196" , "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196" , };//'"5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; int32_t LP_mypubsock = -1; diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index c31beb6f7..d95a63590 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -378,7 +378,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { - if ( LP_ismine(utxo) > 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) + if ( strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index dfe649e21..ffca36a6e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -594,14 +594,12 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr { if ( (utxo= LP_utxoadd(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) { - //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } } else { if ( (utxo= LP_utxoadd(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0.)) != 0 ) { - //utxo->S.mypub = curve25519(privkey,curve25519_basepoint9()); } } total += value; From b4e2153ff2ad162d58d7c98deb9c6d3b429f666b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:00:53 +0300 Subject: [PATCH 334/910] 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 a80197ccd..d6472186a 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -51,8 +51,8 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { - char url[4096],str[65],str2[65]; - sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str2,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + char url[4096],str[65],str2[65],str3[65]; + sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curl(url)); From cf8d5858c26fe6b7d5e11937dd39a70b6db48a4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:06:31 +0300 Subject: [PATCH 335/910] 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 ffca36a6e..fa88c1972 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -442,7 +442,7 @@ int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - //printf("parse.(%s)\n",jprint(item,0)); + printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) utxo->T.lasttime = now; } From 69e4262a75f08435a261441b6c3d5f454611a91e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:10:20 +0300 Subject: [PATCH 336/910] 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 fa88c1972..11b0175e7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -401,7 +401,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - char str[65],str2[65],str3[65]; printf("iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + char str[65],str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) From 4bc4220d77fcf52b61ea5d3903cdbfbbb07ffde5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:33:02 +0300 Subject: [PATCH 337/910] Test --- iguana/exchanges/LP_commands.c | 6 +++--- iguana/exchanges/LP_nativeDEX.c | 6 +++--- iguana/exchanges/LP_transaction.c | 15 +++++++++------ iguana/exchanges/LP_utxos.c | 24 +++++++++++++++--------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a4a964ee1..c0197a77b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -60,7 +60,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits25 int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { - char *retstr,pairstr[512]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + char *retstr,pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; if ( (price= LP_price(base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); @@ -78,7 +78,7 @@ int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson, printf("not eligible\n"); return(-1); } - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) @@ -107,7 +107,7 @@ int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson, } else { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); } } else printf("no price for %s/%s\n",base,rel); if ( retval < 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1e354bfb5..9dc4042df 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -156,18 +156,18 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitmargin) { - struct _LP_utxoinfo u; char str[65]; uint32_t now = (uint32_t)time(NULL); + struct _LP_utxoinfo u; char str[65],destaddr[64]; uint32_t now = (uint32_t)time(NULL); //printf("%s lag.%d\n",bits256_str(str,utxo->txid),now-utxo->lastspentcheck); if ( utxo->T.spentflag == 0 && now > utxo->T.lastspentcheck+60 ) { u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; utxo->T.lastspentcheck = now; - if ( LP_txvalue(utxo->coin,utxo->payment.txid,utxo->payment.vout) == 0 ) + if ( LP_txvalue(destaddr,utxo->coin,utxo->payment.txid,utxo->payment.vout) == 0 ) { printf("txid.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,dstr(utxo->payment.value)); LP_spentnotify(utxo,0); } - else if ( LP_txvalue(utxo->coin,u.txid,u.vout) == 0 ) + else if ( LP_txvalue(destaddr,utxo->coin,u.txid,u.vout) == 0 ) { printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,u.txid),u.vout,dstr(u.value)); LP_spentnotify(utxo,1); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index a5aed366b..5c07e0539 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -103,9 +103,10 @@ uint64_t oldLP_txvalue(char *symbol,bits256 txid,int32_t vout) return(value); } -uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) +uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) { - uint64_t value = 0; double interest; cJSON *txobj; + uint64_t value = 0; double interest; cJSON *txobj,*sobj,*array; int32_t n; + coinaddr = 0; if ( (txobj= LP_gettxout(symbol,txid,vout)) != 0 ) { if ( (value= jdouble(txobj,"amount")*SATOSHIDEN) == 0 && (value= jdouble(txobj,"value")*SATOSHIDEN) == 0 ) @@ -120,6 +121,8 @@ uint64_t LP_txvalue(char *symbol,bits256 txid,int32_t vout) value += SATOSHIDEN * interest; } } + if ( (sobj= jobj(txobj,"scriptPubKey")) != 0 && (array= jarray(&n,sobj,"addresses")) != 0 ) + strcpy(coinaddr,jstri(array,0)); //char str[65]; printf("%.8f <- %s.(%s) txobj.(%s)\n",dstr(value),symbol,bits256_str(str,txid),jprint(txobj,0)); free_json(txobj); } @@ -164,10 +167,10 @@ int32_t LP_vinscan(bits256 *spendtxidp,int32_t *spendvinip,char *symbol,bits256 int32_t LP_spendsearch(bits256 *spendtxidp,int32_t *indp,char *symbol,bits256 searchtxid,int32_t searchvout) { - cJSON *blockjson,*txids,*txobj; bits256 hash,txid; int32_t h,i,j,numtxids,loadheight,errs = 0; + char destaddr[64]; cJSON *blockjson,*txids,*txobj; bits256 hash,txid; int32_t h,i,j,numtxids,loadheight,errs = 0; *indp = -1; memset(spendtxidp,0,sizeof(*spendtxidp)); - if ( LP_txvalue(symbol,searchtxid,searchvout) > 0 ) + if ( LP_txvalue(destaddr,symbol,searchtxid,searchvout) > 0 ) return(0); if ( (txobj= LP_gettx(symbol,searchtxid)) == 0 ) return(0); @@ -725,7 +728,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,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 vout,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,tmpaddr[64],hexstr[999],wifstr[128],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[16]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; + char *rawtxbytes=0,*signedtx=0,tmpaddr[64],hexstr[999],wifstr[128],txdestaddr[64],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[16]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; *destamountp = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); if ( finalseqid == 0 ) @@ -734,7 +737,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch if ( redeemlen < 0 ) return(0); #ifndef BASILISK_DISABLESENDTX - if ( (value= LP_txvalue(symbol,utxotxid,vout)) == 0 ) + if ( (value= LP_txvalue(txdestaddr,symbol,utxotxid,vout)) == 0 ) { char str[65]; printf("basilisk_swap_bobtxspend.%s %s utxo.(%s) already spent or doesnt exist\n",name,symbol,bits256_str(str,utxotxid)); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 11b0175e7..a2720c1a1 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -294,7 +294,7 @@ void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) char *LP_spentcheck(cJSON *argjson) { - bits256 txid,checktxid; int32_t vout,checkvout; struct LP_utxoinfo *utxo; int32_t iambob,retval = 0; + char destaddr[64]; 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++) @@ -308,7 +308,7 @@ char *LP_spentcheck(cJSON *argjson) checktxid = jbits256(argjson,"checktxid"); checkvout = jint(argjson,"checkvout"); } - if ( LP_txvalue(utxo->coin,checktxid,checkvout) == 0 ) + if ( LP_txvalue(destaddr,utxo->coin,checktxid,checkvout) == 0 ) { if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) LP_mypeer->numutxos--; @@ -323,29 +323,35 @@ char *LP_spentcheck(cJSON *argjson) return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -int32_t LP_iseligible(int32_t iambob,char *coin,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) +int32_t LP_iseligible(int32_t iambob,char *symbol,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) { - uint64_t val,val2,threshold; - if ( (val= LP_txvalue(coin,txid,vout)) >= satoshis ) + uint64_t val,val2,threshold; char destaddr[64]; + if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) { threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); - if ( (val2= LP_txvalue(coin,txid2,vout2)) >= threshold ) + if ( (val2= LP_txvalue(destaddr,symbol,txid2,vout2)) >= threshold ) { //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); return(1); - } else printf("mismatched %s txid value2 %.8f < %.8f\n",coin,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); - } else printf("mismatched %s txid value %.8f < %.8f\n",coin,dstr(val),dstr(satoshis)); + } else printf("mismatched %s txid value2 %.8f < %.8f\n",symbol,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); + } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); return(0); } struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - char str[65]; uint64_t tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + char str[65],destaddr[64],destaddr2[64]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } + destaddr2[0] = 0; + if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) + { + printf("utxoadd mismatch (%s %.8f) + (%s %.8f) != %s %.8f %.8f\n",destaddr,dstr(val),destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); + return(0); + } if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; From c091ca8214dbfea672be5e9a30c9c935dac0b2fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:45:45 +0300 Subject: [PATCH 338/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 5c07e0539..9f1f0025a 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -106,7 +106,7 @@ uint64_t oldLP_txvalue(char *symbol,bits256 txid,int32_t vout) uint64_t LP_txvalue(char *coinaddr,char *symbol,bits256 txid,int32_t vout) { uint64_t value = 0; double interest; cJSON *txobj,*sobj,*array; int32_t n; - coinaddr = 0; + coinaddr[0] = 0; if ( (txobj= LP_gettxout(symbol,txid,vout)) != 0 ) { if ( (value= jdouble(txobj,"amount")*SATOSHIDEN) == 0 && (value= jdouble(txobj,"value")*SATOSHIDEN) == 0 ) From 6811d3a7d7c87ff84e3ab8377646dd91d86d28ce Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:51:03 +0300 Subject: [PATCH 339/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a2720c1a1..e5ccd7f15 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -340,7 +340,7 @@ int32_t LP_iseligible(int32_t iambob,char *symbol,bits256 txid,int32_t vout,uint struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - char str[65],destaddr[64],destaddr2[64]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + char str[65],str2[65],destaddr[64],destaddr2[64]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); @@ -349,7 +349,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit destaddr2[0] = 0; if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) { - printf("utxoadd mismatch (%s %.8f) + (%s %.8f) != %s %.8f %.8f\n",destaddr,dstr(val),destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); + printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); return(0); } if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding From e554fdb6aa3a4dff695651a36faeee20cb46ba55 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:54:04 +0300 Subject: [PATCH 340/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index d95a63590..ef4dfe43d 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -378,7 +378,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { - if ( strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) + if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { From 4a37c8b024ee9933b3d35e97296b8abeb7c5d7fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 15:56:50 +0300 Subject: [PATCH 341/910] Test --- iguana/exchanges/LP_prices.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index ef4dfe43d..2a3064c0c 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -378,6 +378,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { + char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) From 7a0b26dbb5394377d429388ee47724f03fdef3fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:00:46 +0300 Subject: [PATCH 342/910] Test --- iguana/exchanges/getutxos | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/exchanges/getutxos diff --git a/iguana/exchanges/getutxos b/iguana/exchanges/getutxos new file mode 100755 index 000000000..a84c72fb0 --- /dev/null +++ b/iguana/exchanges/getutxos @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"getutxos\",\"coin\":\"REVS\"}" From 543b6ebb33f3e64f0be1fa4e541e4dfcd16459a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:01:44 +0300 Subject: [PATCH 343/910] Test --- iguana/exchanges/LP_commands.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c0197a77b..15e429644 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -425,14 +425,11 @@ forwardhex(pubkey,hex)\n\ } else if ( strcmp(method,"getpeers") == 0 ) retstr = LP_peers(); + else if ( strcmp(method,"getutxos") == 0 ) + retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); else if ( IAMLP != 0 ) { - if ( strcmp(method,"getutxos") == 0 ) - { - retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); - //printf("RETURN. %d utxos\n",cJSON_GetArraySize(cJSON_Parse(retstr))); - } - else if ( strcmp(method,"register") == 0 ) + if ( strcmp(method,"register") == 0 ) retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); else if ( strcmp(method,"lookup") == 0 ) retstr = LP_lookup(jbits256(argjson,"client")); From 9ecbecc926f2bdaa25ea3aaf11cc707f5ecdfff6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:04:06 +0300 Subject: [PATCH 344/910] Test --- iguana/exchanges/LP_utxos.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e5ccd7f15..91027f338 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -252,17 +252,22 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t lastn) { int32_t i,firsti; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); - i = 0; - if ( lastn >= mypeer->numutxos ) - firsti = -1; - else firsti = (mypeer->numutxos - lastn); - HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) + if ( symbol != 0 && symbol[0] != 0 ) { - if ( i++ < firsti ) - continue; - if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) + i = 0; + if ( lastn <= 0 ) + lastn = LP_PROPAGATION_SLACK * 2; + if ( lastn >= mypeer->numutxos ) + firsti = -1; + else firsti = (mypeer->numutxos - lastn); + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - jaddi(utxosjson,LP_utxojson(utxo)); + if ( i++ < firsti ) + continue; + if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) + { + jaddi(utxosjson,LP_utxojson(utxo)); + } } } return(jprint(utxosjson,1)); From 14333e00e40cd02e26501933f28682d6b5615e99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:05:34 +0300 Subject: [PATCH 345/910] Test --- iguana/exchanges/LP_utxos.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 91027f338..bf159a018 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -251,15 +251,16 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t lastn) { - int32_t i,firsti; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); + int32_t i,firsti,n; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); if ( symbol != 0 && symbol[0] != 0 ) { i = 0; + n = mypeer != 0 ? mypeer->numutxos : 0; if ( lastn <= 0 ) lastn = LP_PROPAGATION_SLACK * 2; - if ( lastn >= mypeer->numutxos ) + if ( lastn >= n ) firsti = -1; - else firsti = (mypeer->numutxos - lastn); + else firsti = (n - lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { if ( i++ < firsti ) From b1e71e6af88e4e9b61fb7107d91cacb8cde05960 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:20:08 +0300 Subject: [PATCH 346/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +++- iguana/exchanges/LP_utxos.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9dc4042df..aa74ebaab 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -194,12 +194,14 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso int32_t lastn; if ( now > peer->lastutxos+interval ) { - peer->lastutxos = now; //lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; //if ( lastn < LP_PROPAGATION_SLACK * 2 ) lastn = LP_PROPAGATION_SLACK * 2; if ( mypeer == 0 || strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) + { + peer->lastutxos = now; LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + } } } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bf159a018..e03857022 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -476,10 +476,12 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); if ( coin == 0 ) coin = ""; + printf("utxo query\n"); if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer != 0 ? mypeer->numpeers : 0,mypeer != 0 ? mypeer->numutxos : 0)) != 0 ) { now = (uint32_t)time(NULL); LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); + printf("got.(%s)\n",retstr); free(retstr); /*i = 0; if ( lastn >= mypeer->numutxos ) From dc21f1e7e4d2c01a99e0cb398e946885e6ad2dea Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:21:30 +0300 Subject: [PATCH 347/910] Test --- iguana/exchanges/LP_peers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 145bcfde3..16aa291ea 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -160,7 +160,7 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr return; if ( (retstr= issue_LP_getpeers(destipaddr,destport,myipaddr,myport,myprofit,mypeer!=0?mypeer->numpeers:0,mypeer!=0?mypeer->numutxos:0)) != 0 ) { - printf("got.(%s)\n",retstr); + //printf("got.(%s)\n",retstr); now = (uint32_t)time(NULL); LP_peersparse(mypeer,mypubsock,destipaddr,destport,retstr,now); free(retstr); From 682241bf79986569deb7036a7709180bea5d302a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:24:15 +0300 Subject: [PATCH 348/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index aa74ebaab..cf63dc765 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -192,7 +192,7 @@ void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) { int32_t lastn; - if ( now > peer->lastutxos+interval ) + if ( peer->lastutxos < now-interval ) { //lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; //if ( lastn < LP_PROPAGATION_SLACK * 2 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e03857022..5216006b2 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -476,7 +476,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); if ( coin == 0 ) coin = ""; - printf("utxo query\n"); + printf("utxo query.(%s)\n",destipaddr); if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer != 0 ? mypeer->numpeers : 0,mypeer != 0 ? mypeer->numutxos : 0)) != 0 ) { now = (uint32_t)time(NULL); From 063268894c624704fd4f1f7259cee1ee9deba873 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:25:23 +0300 Subject: [PATCH 349/910] 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 cf63dc765..43f1fe8b8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -202,7 +202,7 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso peer->lastutxos = now; LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } - } + } else printf("skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); } void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) From 0be1f84aa147b88afe6ac99874ece3bf97ee9f01 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:26:27 +0300 Subject: [PATCH 350/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 43f1fe8b8..fa1c30eee 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -202,7 +202,7 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso peer->lastutxos = now; LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } - } else printf("skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); + } else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); } void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) @@ -271,6 +271,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in nonz = n = 0; if ( (counter % 6000) == 0 ) LP_utxo_updates(pubsock,passphrase,profitmargin); + printf("checkpeers\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { nonz += LP_subsock_check(peer); From c53ab38e76fca54a9e4a1f497d9821c8d307595f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:29:10 +0300 Subject: [PATCH 351/910] 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 fa1c30eee..da8baa6ef 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -265,12 +265,16 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in now = (uint32_t)time(NULL); if ( lastforward < now-3600 ) { + printf("LP_forwarding_register\n"); LP_forwarding_register(LP_mypubkey,pushaddr,10); lastforward = now; } nonz = n = 0; if ( (counter % 6000) == 0 ) + { + printf("LP_utxo_updates\n"); LP_utxo_updates(pubsock,passphrase,profitmargin); + } printf("checkpeers\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { From febc6be3b0b8f836743297a020a90c3ff39603d4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:31:50 +0300 Subject: [PATCH 352/910] 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 da8baa6ef..2ba4cfd0c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -267,6 +267,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in { printf("LP_forwarding_register\n"); LP_forwarding_register(LP_mypubkey,pushaddr,10); + printf("done LP_forwarding_register\n"); lastforward = now; } nonz = n = 0; From b55d93ddb390f046b9229e10cd9fe8f46828ece5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:33:22 +0300 Subject: [PATCH 353/910] Test --- iguana/exchanges/LP_forwarding.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 7b6d866b9..0a04d2bf7 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -96,7 +96,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) { if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { - //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); + printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jint(retjson,"registered") != 0 && ++n >= max ) @@ -104,7 +104,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) free_json(retjson); } free(retstr); - } + } else printf("error registering with %s\n",peer->ipaddr); if ( retval == 0 ) break; } From a36936bce9cbe3f3298089bb0f6b9bc4c8d1eb7e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:35:31 +0300 Subject: [PATCH 354/910] Test --- iguana/exchanges/LP_forwarding.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 0a04d2bf7..1a14965cd 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -94,6 +94,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) } HASH_ITER(hh,LP_peerinfos,peer,tmp) { + printf("register with (%s)\n",peer->ipaddr); if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); From d4701c8f157b37ef8d114605eaaa9ce247ed4ec0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:43:29 +0300 Subject: [PATCH 355/910] Test --- crypto777/OS_portable.h | 3 ++- crypto777/bitcoind_RPC.c | 5 +++-- iguana/dpow/dpow_rpc.c | 4 ++-- iguana/exchanges/LP_bitcoin.c | 2 +- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_rpc.c | 14 +++++++------- iguana/exchanges/bitcoin.c | 2 +- iguana/exchanges/mm.c | 36 +++++++++++++++++------------------ iguana/exchanges/nxtae.c | 2 +- includes/cJSON.h | 2 +- 10 files changed, 37 insertions(+), 34 deletions(-) diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index 23a051b01..5229414a6 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -129,7 +129,8 @@ int32_t hseek(HUFF *hp,int32_t offset,int32_t mode); #define portable_mutex_unlock pthread_mutex_unlock #define OS_thread_create pthread_create -#define issue_curl(cmdstr) bitcoind_RPC(0,"curl",cmdstr,0,0,0) +#define issue_curl(cmdstr) bitcoind_RPC(0,"curl",cmdstr,0,0,0,0) +#define issue_curlt(cmdstr,timeout) bitcoind_RPC(0,"curl",cmdstr,0,0,0,timeout) struct allocitem { uint32_t allocsize,type; } PACKED; struct queueitem { struct queueitem *next,*prev; uint32_t allocsize,type; } PACKED; diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 975208ddd..cfa5f5501 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -115,7 +115,7 @@ char *Jay_NXTrequest(char *command,char *params) return(retstr); } -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) { static int didinit,count,count2; static double elapsedsum,elapsedsum2; extern int32_t USE_JAY; struct curl_slist *headers = NULL; struct return_string s; CURLcode res; CURL *curl_handle; @@ -153,7 +153,8 @@ try_again: curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA, &s); // we pass our 's' struct to the callback curl_easy_setopt(curl_handle,CURLOPT_NOSIGNAL, 1L); // supposed to fix "Alarm clock" and long jump crash curl_easy_setopt(curl_handle,CURLOPT_NOPROGRESS, 1L); // no progress callback - //curl_easy_setopt(curl_handle,CURLOPT_TIMEOUT, 60L); // causes problems with iguana timeouts + if ( timeout > 0 ) + curl_easy_setopt(curl_handle,CURLOPT_TIMEOUT, timeout); // causes problems with iguana timeouts if ( strncmp(url,"https",5) == 0 ) { curl_easy_setopt(curl_handle,CURLOPT_SSL_VERIFYPEER,0); diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 3a7c83aea..0e294f4d9 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -13,7 +13,7 @@ * * ******************************************************************************/ -#define issue_curl(cmdstr) bitcoind_RPC(0,"curl",cmdstr,0,0,0) +#define issue_curl(cmdstr) bitcoind_RPC(0,"curl",cmdstr,0,0,0,0) cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) { @@ -839,7 +839,7 @@ char *dpow_issuemethod(char *userpass,char *method,char *params,uint16_t port) sprintf(url,(char *)"http://127.0.0.1:%u",port); sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params); //printf("postdata.(%s) USERPASS.(%s)\n",postdata,KMDUSERPASS); - retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params); + retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params,0); } return(retstr2); } diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index c7ee8b218..12b975c02 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2025,7 +2025,7 @@ int32_t bitcoin_p2shscript(uint8_t *script,int32_t n,const uint8_t *p2shscript,c char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params) { - return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params)); + return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params,0)); } int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 93642f146..d99b519bf 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -21,6 +21,7 @@ #ifndef LP_INCLUDE_H #define LP_INCLUDE_H +#define LP_HTTP_TIMEOUT 1 #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index d6472186a..5cf3dbe01 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -22,7 +22,7 @@ char *issue_LP_getpeers(char *destip,uint16_t destport,char *ipaddr,uint16_t por char url[512],*retstr; sprintf(url,"http://%s:%u/api/stats/getpeers?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); //printf("send.(%s)\n",url); - retstr = issue_curl(url); + retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("GETPEERS.(%s)\n",retstr); return(retstr); } @@ -31,7 +31,7 @@ char *issue_LP_getutxos(char *destip,uint16_t destport,char *coin,int32_t lastn, { char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,coin,lastn,ipaddr,port,profitmargin,numpeers,numutxos); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t lastn) @@ -39,14 +39,14 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); //printf("getutxo.(%s)\n",url); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) { char url[512]; sprintf(url,"http://%s:%u/api/stats/notify?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) @@ -55,7 +55,7 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) @@ -65,7 +65,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push return(clonestr("{\"error\":\"illegal pushaddr\"}")); sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); //printf("getutxo.(%s)\n",url); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) @@ -73,7 +73,7 @@ char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) char url[512],str[65]; sprintf(url,"http://%s:%u/api/stats/lookup?client=%s",destip,destport,bits256_str(str,pubkey)); //printf("getutxo.(%s)\n",url); - return(issue_curl(url)); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); } cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index 452c8c075..62c0ed592 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -19,7 +19,7 @@ cJSON *instantdex_statemachinejson(struct bitcoin_swapinfo *swap); char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params) { - return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params)); + return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params,0)); } int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index e98927ef8..6fcfda6ca 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -70,7 +70,7 @@ char *DEX_swapstatus() char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"getswaplist\"}"); - return(bitcoind_RPC(0,"InstantDEX",url,0,"getswaplist",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"getswaplist",postdata,0)); } char *DEX_amlp(char *blocktrail) @@ -78,7 +78,7 @@ char *DEX_amlp(char *blocktrail) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"%s\"}",blocktrail); - return(bitcoind_RPC(0,"tradebot",url,0,"amlp",postdata)); + return(bitcoind_RPC(0,"tradebot",url,0,"amlp",postdata,0)); } char *DEX_openorders(char *exchange) @@ -86,7 +86,7 @@ char *DEX_openorders(char *exchange) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"%s\"}",exchange); - return(bitcoind_RPC(0,"InstantDEX",url,0,"openorders",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"openorders",postdata,0)); } char *DEX_tradehistory(char *exchange) @@ -94,7 +94,7 @@ char *DEX_tradehistory(char *exchange) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"%s\"}",exchange); - return(bitcoind_RPC(0,"InstantDEX",url,0,"tradehistory",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"tradehistory",postdata,0)); } char *DEX_orderstatus(char *exchange,char *orderid) @@ -102,7 +102,7 @@ char *DEX_orderstatus(char *exchange,char *orderid) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"%s\",\"orderid\":\"%s\"}",exchange,orderid); - return(bitcoind_RPC(0,"InstantDEX",url,0,"orderstatus",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"orderstatus",postdata,0)); } char *DEX_cancelorder(char *exchange,char *orderid) @@ -110,7 +110,7 @@ char *DEX_cancelorder(char *exchange,char *orderid) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"%s\",\"orderid\":\"%s\"}",exchange,orderid); - return(bitcoind_RPC(0,"InstantDEX",url,0,"cancelorder",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"cancelorder",postdata,0)); } char *DEX_balance(char *exchange,char *base,char *coinaddr) @@ -120,12 +120,12 @@ char *DEX_balance(char *exchange,char *base,char *coinaddr) if ( strcmp(exchange,"DEX") == 0 ) { sprintf(postdata,"{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"%s\",\"symbol\":\"%s\"}",coinaddr,base); - return(bitcoind_RPC(0,"dex",url,0,"getbalance",postdata)); + return(bitcoind_RPC(0,"dex",url,0,"getbalance",postdata,0)); } else { sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\",\"base\":\"%s\"}",exchange,base); - return(bitcoind_RPC(0,"InstantDEX",url,0,"balance",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"balance",postdata,0)); } } @@ -134,7 +134,7 @@ char *DEX_apikeypair(char *exchange,char *apikey,char *apisecret) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"%s\",\"apikey\":\"%s\",\"apisecret\":\"%s\"}",exchange,apikey,apisecret); - return(bitcoind_RPC(0,"InstantDEX",url,0,"apikeypair",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"apikeypair",postdata,0)); } char *DEX_setuserid(char *exchange,char *userid,char *tradepassword) @@ -142,7 +142,7 @@ char *DEX_setuserid(char *exchange,char *userid,char *tradepassword) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"%s\",\"userid\":\"%s\",\"tradepassword\":\"%s\"}",exchange,userid,tradepassword); - return(bitcoind_RPC(0,"InstantDEX",url,0,"setuserid",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"setuserid",postdata,0)); } char *DEX_trade(char *exchange,char *base,char *rel,int32_t dir,double price,double volume) @@ -151,7 +151,7 @@ char *DEX_trade(char *exchange,char *base,char *rel,int32_t dir,double price,dou sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"exchange\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"price\":%.8f,\"volume\":%.8f,\"dotrade\":1}",dir>0?"buy":"sell",exchange,base,rel,price,volume); //printf("DEX_trade.(%s)\n",postdata); - return(bitcoind_RPC(0,"InstantDEX",url,0,dir>0?"buy":"sell",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,dir>0?"buy":"sell",postdata,0)); } char *DEX_withdraw(char *exchange,char *base,char *destaddr,double amount) @@ -159,7 +159,7 @@ char *DEX_withdraw(char *exchange,char *base,char *destaddr,double amount) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"%s\",\"destaddr\":\"%s\",\"amount\":%.8f}",exchange,destaddr,amount); - return(bitcoind_RPC(0,"InstantDEX",url,0,"withdraw",postdata)); + return(bitcoind_RPC(0,"InstantDEX",url,0,"withdraw",postdata,0)); } char *iguana_walletpassphrase(char *passphrase,int32_t timeout) @@ -167,7 +167,7 @@ char *iguana_walletpassphrase(char *passphrase,int32_t timeout) char url[512],postdata[1024]; sprintf(url,"%s/coin=KMD&agent=bitcoinrpc&method=walletpassphrase?",IGUANA_URL); sprintf(postdata,"[\"%s\", %d]",passphrase,timeout); - return(bitcoind_RPC(0,"",url,0,"walletpassphrase",postdata)); + return(bitcoind_RPC(0,"",url,0,"walletpassphrase",postdata,0)); } /*char *iguana_listunspent(char *coin,char *coinaddr) @@ -194,7 +194,7 @@ char *DEX_listunspent(char *coin,char *coinaddr) char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"%s\",\"symbol\":\"%s\",\"timeout\":60000}",coinaddr,coin); - return(bitcoind_RPC(0,"dex",url,0,"listunspent",postdata)); + return(bitcoind_RPC(0,"dex",url,0,"listunspent",postdata,0)); } bits256 iguana_wif2privkey(char *wifstr) @@ -203,7 +203,7 @@ bits256 iguana_wif2privkey(char *wifstr) memset(privkey.bytes,0,sizeof(privkey)); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"%s\"}",wifstr); - if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"wif2priv",postdata)) != 0 ) + if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"wif2priv",postdata,0)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { @@ -227,7 +227,7 @@ void iguana_priv2pub(uint8_t *pubkey33,char *coinaddr,bits256 privkey,uint8_t ad bits256_str(privstr,privkey); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"%s\",\"addrtype\":%u}",privstr,addrtype); - if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"priv2pub",postdata)) != 0 ) + if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"priv2pub",postdata,0)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { @@ -623,7 +623,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); //printf("(%s)\n",postdata); - if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) + if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata,0)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); @@ -643,7 +643,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddnum(vals,"minvol",MAX(1,(int32_t)(vol * 0.01 * PAXPRICES[i]))); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); - if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) + if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata,0)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); diff --git a/iguana/exchanges/nxtae.c b/iguana/exchanges/nxtae.c index 03e2c1eee..d6fe1080c 100755 --- a/iguana/exchanges/nxtae.c +++ b/iguana/exchanges/nxtae.c @@ -14,7 +14,7 @@ ******************************************************************************/ #define DEFAULT_NXT_DEADLINE 720 -#define issue_NXTPOST(cmdstr) bitcoind_RPC(0,"curl",myinfo->NXTAPIURL,0,0,cmdstr) +#define issue_NXTPOST(cmdstr) bitcoind_RPC(0,"curl",myinfo->NXTAPIURL,0,0,cmdstr,0) #define NXT_MSTYPE 5 #define NXT_ASSETTYPE 2 #define NXT_GENESISTIME 1385294400 diff --git a/includes/cJSON.h b/includes/cJSON.h index b75e73bf1..77e0752e6 100755 --- a/includes/cJSON.h +++ b/includes/cJSON.h @@ -211,7 +211,7 @@ extern "C" char *get_cJSON_fieldname(cJSON *obj); void ensure_jsonitem(cJSON *json,char *field,char *value); int32_t in_jsonarray(cJSON *array,char *value); - 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); uint64_t calc_nxt64bits(const char *str); int32_t expand_nxt64bits(char *str,uint64_t nxt64bits); char *nxt64str(uint64_t nxt64bits); From ad2cda6aaac4d163cda5257dc6abad0568955883 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:55:10 +0300 Subject: [PATCH 356/910] Test --- crypto777/bitcoind_RPC.c | 2 +- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_peers.c | 5 +---- iguana/exchanges/LP_rpc.c | 24 +++++++++++++++++++----- iguana/exchanges/LP_utxos.c | 3 +-- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index cfa5f5501..8d864e38d 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -202,7 +202,7 @@ try_again: if ( res != CURLE_OK ) { numretries++; - if ( specialcase != 0 ) + if ( specialcase != 0 || timeout != 0 ) { printf("<<<<<<<<<<< bitcoind_RPC.(%s): BTCD.%s timeout params.(%s) s.ptr.(%s) err.%d\n",url,command,params,s.ptr,res); free(s.ptr); diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index d99b519bf..b8b7fe199 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -222,6 +222,7 @@ void LP_quotesinit(char *base,char *rel); int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag); int32_t LP_ismine(struct LP_utxoinfo *utxo); int32_t LP_isavailable(struct LP_utxoinfo *utxo); +struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); #endif diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 16aa291ea..c129ba52d 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -156,8 +156,6 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr { char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now,flag = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); - if ( peer != 0 && peer->errors > 0 ) - return; if ( (retstr= issue_LP_getpeers(destipaddr,destport,myipaddr,myport,myprofit,mypeer!=0?mypeer->numpeers:0,mypeer!=0?mypeer->numutxos:0)) != 0 ) { //printf("got.(%s)\n",retstr); @@ -179,6 +177,5 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr if ( flag != 0 ) printf(" <- missing peers\n"); } - } else if ( peer != 0 ) - peer->errors++; + } } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5cf3dbe01..5447f454e 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -17,14 +17,28 @@ // LP_rpc.c // marketmaker // + +char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) +{ + char *retstr = 0; struct LP_peerinfo *peer = 0; + peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); + if ( peer == 0 || peer->errors < 3 ) + { + if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) + { + if ( peer != 0 ) + peer->errors++; + else printf("%s error on (%s:%u) without peer\n",debugstr,destip,port); + } + } + return(retstr); +} + char *issue_LP_getpeers(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) { - char url[512],*retstr; + char url[512]; sprintf(url,"http://%s:%u/api/stats/getpeers?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); - //printf("send.(%s)\n",url); - retstr = issue_curlt(url,LP_HTTP_TIMEOUT); - //printf("GETPEERS.(%s)\n",retstr); - return(retstr); + return(LP_issue_curl("getpeers",destip,port,url)); } char *issue_LP_getutxos(char *destip,uint16_t destport,char *coin,int32_t lastn,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 5216006b2..f9fc0bca4 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -501,8 +501,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr } if ( flag != 0 ) printf(" <- missing utxos\n");*/ - } else if ( peer != 0 ) - peer->errors++; + } } cJSON *LP_inventory(char *symbol,int32_t iambob) From 28bb4b08d57ce7279d9b25f732e0c407511286db Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 16:59:00 +0300 Subject: [PATCH 357/910] Test --- iguana/exchanges/LP_include.h | 2 ++ iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_peers.c | 3 ++- iguana/exchanges/LP_rpc.c | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b8b7fe199..5c037b4f4 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -22,6 +22,8 @@ #define LP_INCLUDE_H #define LP_HTTP_TIMEOUT 1 +#define LP_MAXPEER_ERRORS 3 + #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 2ba4cfd0c..fa072465c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -202,7 +202,7 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso peer->lastutxos = now; LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } - } else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); + } //else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); } void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index c129ba52d..2ef5511c8 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -42,7 +42,8 @@ char *LP_peers() struct LP_peerinfo *peer,*tmp; cJSON *peersjson = cJSON_CreateArray(); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - jaddi(peersjson,LP_peerjson(peer)); + if ( peer->errors < LP_MAXPEER_ERRORS ) + jaddi(peersjson,LP_peerjson(peer)); } return(jprint(peersjson,1)); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5447f454e..fb4b4d501 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -22,7 +22,7 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) { char *retstr = 0; struct LP_peerinfo *peer = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); - if ( peer == 0 || peer->errors < 3 ) + if ( peer == 0 || peer->errors < LP_MAXPEER_ERRORS ) { if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) { From 1fdfcea0e192286d720b4af23b0bfcacc86c8f95 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:02:04 +0300 Subject: [PATCH 358/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fa072465c..e02039483 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -265,18 +265,17 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in now = (uint32_t)time(NULL); if ( lastforward < now-3600 ) { - printf("LP_forwarding_register\n"); + //printf("LP_forwarding_register\n"); LP_forwarding_register(LP_mypubkey,pushaddr,10); - printf("done LP_forwarding_register\n"); + //printf("done LP_forwarding_register\n"); lastforward = now; } nonz = n = 0; if ( (counter % 6000) == 0 ) { - printf("LP_utxo_updates\n"); + //printf("LP_utxo_updates\n"); LP_utxo_updates(pubsock,passphrase,profitmargin); } - printf("checkpeers\n"); HASH_ITER(hh,LP_peerinfos,peer,tmp) { nonz += LP_subsock_check(peer); From 2f49790046596c6e248ec329d4ef8ccef0089bd8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:08:22 +0300 Subject: [PATCH 359/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index fb4b4d501..fd853d569 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,7 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t { char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); - //printf("getutxo.(%s)\n",url); + printf("getutxo.(%s)\n",url); return(issue_curlt(url,LP_HTTP_TIMEOUT)); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f9fc0bca4..b160d2c64 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -476,12 +476,15 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); if ( coin == 0 ) coin = ""; - printf("utxo query.(%s)\n",destipaddr); - if ( (retstr= issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer != 0 ? mypeer->numpeers : 0,mypeer != 0 ? mypeer->numutxos : 0)) != 0 ) + //printf("utxo query.(%s)\n",destipaddr); + if ( IAMLP != 0 ) + retstr = issue_LP_getutxos(destipaddr,destport,coin,lastn,myipaddr,myport,myprofit,mypeer != 0 ? mypeer->numpeers : 0,mypeer != 0 ? mypeer->numutxos : 0); + else retstr = issue_LP_clientgetutxos(destipaddr,destport,coin,100); + if ( retstr != 0 ) { now = (uint32_t)time(NULL); LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); - printf("got.(%s)\n",retstr); + //printf("got.(%s)\n",retstr); free(retstr); /*i = 0; if ( lastn >= mypeer->numutxos ) From 0916bf42cf12c03d22a71b15ed3334db39e316b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:12:41 +0300 Subject: [PATCH 360/910] Test --- iguana/exchanges/LP_utxos.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b160d2c64..d62f8aa0f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -252,23 +252,20 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t lastn) { int32_t i,firsti,n; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); - if ( symbol != 0 && symbol[0] != 0 ) + i = 0; + n = mypeer != 0 ? mypeer->numutxos : 0; + if ( lastn <= 0 ) + lastn = LP_PROPAGATION_SLACK * 2; + if ( lastn >= n ) + firsti = -1; + else firsti = (n - lastn); + HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - i = 0; - n = mypeer != 0 ? mypeer->numutxos : 0; - if ( lastn <= 0 ) - lastn = LP_PROPAGATION_SLACK * 2; - if ( lastn >= n ) - firsti = -1; - else firsti = (n - lastn); - HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) + if ( i++ < firsti ) + continue; + if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) { - if ( i++ < firsti ) - continue; - if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) - { - jaddi(utxosjson,LP_utxojson(utxo)); - } + jaddi(utxosjson,LP_utxojson(utxo)); } } return(jprint(utxosjson,1)); From b83ad9b4448544e617226fa380c709a5487be220 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:14:29 +0300 Subject: [PATCH 361/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index d62f8aa0f..774d780f2 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -259,6 +259,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( lastn >= n ) firsti = -1; else firsti = (n - lastn); + printf("LP_utxos iambob.%d symbol.%p lastn.%d\n",iambob,symbol,lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { if ( i++ < firsti ) From f44f92f1e52617cbca2d481cbe9188599871de65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:15:38 +0300 Subject: [PATCH 362/910] 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 774d780f2..17caf0ad0 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -259,7 +259,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( lastn >= n ) firsti = -1; else firsti = (n - lastn); - printf("LP_utxos iambob.%d symbol.%p lastn.%d\n",iambob,symbol,lastn); + printf("LP_utxos iambob.%d symbol.%s lastn.%d\n",iambob,symbol==0?"":symbol,lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { if ( i++ < firsti ) From d55d3a80075a4e8a556bd84727b8bce3fd91de2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:17:31 +0300 Subject: [PATCH 363/910] 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 17caf0ad0..fff8afc7d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -258,13 +258,13 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la lastn = LP_PROPAGATION_SLACK * 2; if ( lastn >= n ) firsti = -1; - else firsti = (n - lastn); - printf("LP_utxos iambob.%d symbol.%s lastn.%d\n",iambob,symbol==0?"":symbol,lastn); + else firsti = (lastn - n); + printf("LP_utxos iambob.%d symbol.%s firsti.%d lastn.%d\n",iambob,symbol==0?"":symbol,firsti,lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { if ( i++ < firsti ) continue; - if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 )//&& LP_ismine(utxo) > 0 ) + if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) { jaddi(utxosjson,LP_utxojson(utxo)); } From aab87b6c446b1732c95edefaff86bf8ac3be36ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:19:56 +0300 Subject: [PATCH 364/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index fff8afc7d..a95cb65f7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -262,6 +262,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la printf("LP_utxos iambob.%d symbol.%s firsti.%d lastn.%d\n",iambob,symbol==0?"":symbol,firsti,lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { + char str[65]; printf("check %s.%s\n",utxo->coin,bits256_str(str,utxo->payment.txid)); if ( i++ < firsti ) continue; if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) From e8a9c21e2d74ce3e397b4efca3bd0d9fa0f739fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:20:57 +0300 Subject: [PATCH 365/910] Test --- iguana/exchanges/LP_rpc.c | 1 - iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index fd853d569..11f1b7041 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -52,7 +52,6 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t { char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); - printf("getutxo.(%s)\n",url); return(issue_curlt(url,LP_HTTP_TIMEOUT)); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a95cb65f7..7e09d6833 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -483,7 +483,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr { now = (uint32_t)time(NULL); LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); - //printf("got.(%s)\n",retstr); + printf("got.(%s)\n",retstr); free(retstr); /*i = 0; if ( lastn >= mypeer->numutxos ) From 0611da63ed37ef2e0453f5138a8293a4c4ddd017 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:21:27 +0300 Subject: [PATCH 366/910] 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 7e09d6833..a95cb65f7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -483,7 +483,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr { now = (uint32_t)time(NULL); LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); - printf("got.(%s)\n",retstr); + //printf("got.(%s)\n",retstr); free(retstr); /*i = 0; if ( lastn >= mypeer->numutxos ) From f04a1e107120863d8824208317110a1549ff37d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:24:32 +0300 Subject: [PATCH 367/910] Test --- iguana/exchanges/LP_forwarding.c | 4 ++-- iguana/exchanges/LP_utxos.c | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 1a14965cd..5f935ba83 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -94,10 +94,10 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("register with (%s)\n",peer->ipaddr); + //printf("register with (%s)\n",peer->ipaddr); if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) { - printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); + //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jint(retjson,"registered") != 0 && ++n >= max ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index a95cb65f7..0b06803db 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -433,7 +433,8 @@ struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { - struct LP_peerinfo *destpeer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; + struct LP_peerinfo *destpeer,*peer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; + printf("parse.(%s)\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) @@ -448,16 +449,16 @@ int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char if ( (subport= juint(item,"sub")) == 0 ) subport = argport + 2; argipbits = (uint32_t)calc_ipbits(argipaddr); - //if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) - // peer = LP_addpeer(mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); - if ( jobj(item,"txid") != 0 ) - { - txid = jbits256(item,"txid"); - printf("parse.(%s)\n",jprint(item,0)); - if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) - utxo->T.lasttime = now; - } - } // else printf("skip.(%s)\n",jprint(item,0)); + if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) + peer = LP_addpeer(LP_mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); + } + if ( jobj(item,"txid") != 0 ) + { + txid = jbits256(item,"txid"); + printf("parse.(%s)\n",jprint(item,0)); + if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) + utxo->T.lasttime = now; + } } if ( (destpeer= LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport)) != 0 ) { From 7ddcf384bcc4ce582f7720edc069317e1225427a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:33:05 +0300 Subject: [PATCH 368/910] 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 0b06803db..6e685b80b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -428,7 +428,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson) { - return(LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid2"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"))); + return(LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"))); } int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) From 3cedddcd7809c8dc792aba8078aed7ff2ef61c8a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:34:24 +0300 Subject: [PATCH 369/910] Test --- iguana/exchanges/LP_utxos.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6e685b80b..f2b0c933e 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -259,10 +259,10 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( lastn >= n ) firsti = -1; else firsti = (lastn - n); - printf("LP_utxos iambob.%d symbol.%s firsti.%d lastn.%d\n",iambob,symbol==0?"":symbol,firsti,lastn); + //printf("LP_utxos iambob.%d symbol.%s firsti.%d lastn.%d\n",iambob,symbol==0?"":symbol,firsti,lastn); HASH_ITER(hh,LP_utxoinfos[iambob],utxo,tmp) { - char str[65]; printf("check %s.%s\n",utxo->coin,bits256_str(str,utxo->payment.txid)); + //char str[65]; printf("check %s.%s\n",utxo->coin,bits256_str(str,utxo->payment.txid)); if ( i++ < firsti ) continue; if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) @@ -434,7 +434,7 @@ struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { struct LP_peerinfo *destpeer,*peer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; - printf("parse.(%s)\n",retstr); + //printf("parse.(%s)\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) @@ -455,7 +455,7 @@ int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - printf("parse.(%s)\n",jprint(item,0)); + //printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) utxo->T.lasttime = now; } From cf18fac7520731bb50b005567705b7cfd14fad48 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:37:03 +0300 Subject: [PATCH 370/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 2a3064c0c..52791da03 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -378,7 +378,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { - char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); + //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) From 67b51ac7016597f4a9097196b1e76d20c49d8d74 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 17:52:06 +0300 Subject: [PATCH 371/910] Test --- iguana/exchanges/LP_prices.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 52791da03..69918026e 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -373,21 +373,19 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx return(-1); } -int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol,double price,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum,bits256 pubkey) +int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,double price,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum,bits256 pubkey) { struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); - if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) + if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); - if ( strcmp(base,symbol) == 0 ) - basesatoshis = utxo->payment.value; - else basesatoshis = utxo->payment.value * price; + basesatoshis = utxo->payment.value; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,price,basesatoshis,pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) @@ -416,7 +414,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,char *symbol, char *LP_orderbook(char *base,char *rel) { - uint32_t now,i; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_pubkeyinfo *pubp,*ptmp; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; + uint32_t now,i; double price; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_pubkeyinfo *pubp,*ptmp; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; if ( (basepp= LP_priceinfofind(base)) == 0 || (relpp= LP_priceinfofind(rel)) == 0 ) return(clonestr("{\"error\":\"base or rel not added\"}")); baseid = basepp->ind; @@ -440,15 +438,15 @@ char *LP_orderbook(char *base,char *rel) } } cachenumbids = numbids, cachenumasks = numasks; - printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); + //printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) { - char str[65]; printf("pubkey.(%s)\n",bits256_str(str,pubp->pubkey)); - if ( pubp->matrix[baseid][relid] > SMALLVAL ) - numasks = LP_orderbook_utxoentries(now,base,rel,base,pubp->matrix[baseid][relid],&asks,numasks,cachenumasks,pubp->pubkey); - if ( pubp->matrix[relid][baseid] > SMALLVAL ) - numbids = LP_orderbook_utxoentries(now,base,rel,rel,pubp->matrix[relid][baseid],&bids,numbids,cachenumbids,pubp->pubkey); - printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); + //char str[65]; printf("pubkey.(%s)\n",bits256_str(str,pubp->pubkey)); + if ( (price= pubp->matrix[baseid][relid]) > SMALLVAL ) + numasks = LP_orderbook_utxoentries(now,base,rel,price,&asks,numasks,cachenumasks,pubp->pubkey); + if ( (price= pubp->matrix[relid][baseid]) > SMALLVAL ) + numbids = LP_orderbook_utxoentries(now,base,rel,1./price,&bids,numbids,cachenumbids,pubp->pubkey); + //printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); } retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); From 7819837ab953ed95a323d020fad5865c84f3079c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:08:10 +0300 Subject: [PATCH 372/910] Test --- iguana/exchanges/LP_prices.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 69918026e..aebff6fb8 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -373,20 +373,25 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx return(-1); } -int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,double price,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum,bits256 pubkey) +int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char *rel,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum) { - struct LP_utxoinfo *utxo,*tmp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_orderbookentry *op; uint64_t basesatoshis; + struct LP_utxoinfo *utxo,*tmp; struct LP_pubkeyinfo *pubp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; double price; int32_t baseid,relid; uint64_t basesatoshis; + if ( (basepp= LP_priceinfoptr(&relid,base,rel)) != 0 ) + baseid = basepp->ind; + else return(num); HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); - if ( bits256_cmp(pubkey,utxo->pubkey) == 0 && strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 ) + if ( strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && (pubp= LP_pubkeyfind(utxo->pubkey)) != 0 && (price= pubp->matrix[baseid][relid]) > SMALLVAL ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); - basesatoshis = utxo->payment.value; - if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,price,basesatoshis,pubkey)) != 0 ) + if ( polarity > 0 ) + basesatoshis = utxo->payment.value; + else basesatoshis = utxo->payment.value * price; + if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) { @@ -414,7 +419,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,char *base,char *rel,double price, char *LP_orderbook(char *base,char *rel) { - uint32_t now,i; double price; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_pubkeyinfo *pubp,*ptmp; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; + uint32_t now,i; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; if ( (basepp= LP_priceinfofind(base)) == 0 || (relpp= LP_priceinfofind(rel)) == 0 ) return(clonestr("{\"error\":\"base or rel not added\"}")); baseid = basepp->ind; @@ -439,15 +444,8 @@ char *LP_orderbook(char *base,char *rel) } cachenumbids = numbids, cachenumasks = numasks; //printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); - HASH_ITER(hh,LP_pubkeyinfos,pubp,ptmp) - { - //char str[65]; printf("pubkey.(%s)\n",bits256_str(str,pubp->pubkey)); - if ( (price= pubp->matrix[baseid][relid]) > SMALLVAL ) - numasks = LP_orderbook_utxoentries(now,base,rel,price,&asks,numasks,cachenumasks,pubp->pubkey); - if ( (price= pubp->matrix[relid][baseid]) > SMALLVAL ) - numbids = LP_orderbook_utxoentries(now,base,rel,1./price,&bids,numbids,cachenumbids,pubp->pubkey); - //printf("cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); - } + numasks = LP_orderbook_utxoentries(now,1,base,rel,&asks,numasks,cachenumasks); + numbids = LP_orderbook_utxoentries(now,-1,rel,base,&bids,numbids,cachenumbids); retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); if ( numbids > 1 ) From 9d8799047d14b7203569da7e58ed38e700d479f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:24:05 +0300 Subject: [PATCH 373/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e02039483..5f0cc7a8c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -92,7 +92,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - //printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); + printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { len = (int32_t)strlen(jsonstr) + 1; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f2b0c933e..dd03bef83 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -372,7 +372,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { - if ( LP_ismine(utxo) == 0 ) + if ( 0 && LP_ismine(utxo) == 0 ) { char str2[65],str3[65]; printf("iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",iambob,bits256_str(str3,pubkey),symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); printf("duplicate %.8f %.8f %.8f vs utxo.(%.8f %.8f %.8f)\n",dstr(value),dstr(value2),dstr(tmpsatoshis),dstr(utxo->payment.value),dstr(utxo->deposit.value),dstr(utxo->S.satoshis)); From eac7e9ea81f7cdeae7737076c59527f4060fcf45 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:39:24 +0300 Subject: [PATCH 374/910] Test --- iguana/exchanges/LP_forwarding.c | 16 ++++++++++++++-- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_nativeDEX.c | 27 +++++++++++++++++---------- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 5f935ba83..8bc32050c 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -113,10 +113,22 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) char *LP_forwardhex(bits256 pubkey,char *hexstr) { - struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; cJSON *retjson; + struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson,*argjson; if ( hexstr == 0 || hexstr[0] == 0 ) return(clonestr("{\"error\":\"nohex\"}")); - if ( (ptr= LP_forwardfind(pubkey)) != 0 ) + if ( bits256_nonz(pubkey) == 0 || bits256_cmp(pubkey,LP_mypubkey) == 0 ) + { + datalen = (int32_t)strlen(hexstr) >> 1; + data = malloc(datalen); + decode_hex(data,datalen,hexstr); + if ( (argjson= cJSON_Parse((char *)data)) != 0 ) + { + retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,argjson,0,0,LP_profitratio - 1.); + free_json(argjson); + } + return(retstr); + } + else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { if ( ptr->pushsock >= 0 ) { diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 5c037b4f4..c50c03ecb 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -225,6 +225,7 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag); int32_t LP_ismine(struct LP_utxoinfo *utxo); int32_t LP_isavailable(struct LP_utxoinfo *utxo); struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); +char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5f0cc7a8c..165ba1b48 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -79,6 +79,21 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_forwarding.c" #include "LP_commands.c" +char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) +{ + char *retstr=0; + if ( LP_tradecommand(myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) + { + if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) + { + printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + } + } + return(retstr); +} + int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { int32_t recvsize,len,datalen=0,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; @@ -110,16 +125,8 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) LP_send(pubsock,jprint(reqjson,1),1); } - else if ( LP_tradecommand(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin) <= 0 ) - { - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) - { - printf("%s PULL.[%d] %s -> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",recvsize,jsonstr,retstr); - if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); - else free(retstr); - } - } + else if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin)) != 0 ) + free(retstr); portable_mutex_unlock(&LP_commandmutex); free_json(argjson); } else printf("error parsing(%s)\n",jsonstr); From e115266fd9e4d4d317fba66d3ec261ba019df4d4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:40:38 +0300 Subject: [PATCH 375/910] 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 165ba1b48..57cdaaf5c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -88,7 +88,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * { printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); + LP_send(pubsock,retstr,0); } } return(retstr); From 45473ec1630b50bef85bb0646e16f02c0357db32 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:43:52 +0300 Subject: [PATCH 376/910] Test --- iguana/exchanges/LP_commands.c | 12 ------------ iguana/exchanges/LP_forwarding.c | 18 ++++++++++++++++-- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 15e429644..7b1e564c5 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -231,18 +231,6 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } -cJSON *LP_dereference(cJSON *argjson,char *excludemethod) -{ - cJSON *reqjson = 0; - if ( jstr(argjson,"method2") != 0 && strncmp(excludemethod,jstr(argjson,"method2"),strlen(excludemethod)) != 0 ) - { - reqjson = jduplicate(argjson); - jdelete(reqjson,"method"); - jaddstr(reqjson,"method",jstr(argjson,"method2")); - } - return(reqjson); -} - char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 8bc32050c..839756d4d 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -111,9 +111,21 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) } } +cJSON *LP_dereference(cJSON *argjson,char *excludemethod) +{ + cJSON *reqjson = 0; + if ( jstr(argjson,"method2") != 0 && strncmp(excludemethod,jstr(argjson,"method2"),strlen(excludemethod)) != 0 ) + { + reqjson = jduplicate(argjson); + jdelete(reqjson,"method"); + jaddstr(reqjson,"method",jstr(argjson,"method2")); + } + return(reqjson); +} + char *LP_forwardhex(bits256 pubkey,char *hexstr) { - struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson,*argjson; + struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson,*argjson,*reqjson; if ( hexstr == 0 || hexstr[0] == 0 ) return(clonestr("{\"error\":\"nohex\"}")); if ( bits256_nonz(pubkey) == 0 || bits256_cmp(pubkey,LP_mypubkey) == 0 ) @@ -123,7 +135,9 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) decode_hex(data,datalen,hexstr); if ( (argjson= cJSON_Parse((char *)data)) != 0 ) { - retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,argjson,0,0,LP_profitratio - 1.); + reqjson = LP_dereference(argjson,"forward"); + retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + free_json(reqjson); free_json(argjson); } return(retstr); From 8b819f579007599a52d388cd11a5c629c018a43c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:48:38 +0300 Subject: [PATCH 377/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/LP_forwarding.c | 6 ++++-- iguana/exchanges/LP_nativeDEX.c | 6 +++--- iguana/exchanges/mm.c | 2 +- iguana/exchanges/stats.c | 4 ++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7b1e564c5..c489ac0ce 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -231,7 +231,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } -char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port +char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) @@ -422,7 +422,7 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"lookup") == 0 ) retstr = LP_lookup(jbits256(argjson,"client")); else if ( strcmp(method,"forwardhex") == 0 ) - retstr = LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex")); + retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); else if ( strcmp(method,"notified") == 0 ) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 839756d4d..11c64e84e 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -123,7 +123,7 @@ cJSON *LP_dereference(cJSON *argjson,char *excludemethod) return(reqjson); } -char *LP_forwardhex(bits256 pubkey,char *hexstr) +char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson,*argjson,*reqjson; if ( hexstr == 0 || hexstr[0] == 0 ) @@ -136,7 +136,9 @@ char *LP_forwardhex(bits256 pubkey,char *hexstr) if ( (argjson= cJSON_Parse((char *)data)) != 0 ) { reqjson = LP_dereference(argjson,"forward"); - retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + if ( pubsock < 0 || bits256_cmp(pubkey,LP_mypubkey) == 0 ) + retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + else LP_send(pubsock,jprint(reqjson,0),1); free_json(reqjson); free_json(argjson); } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 57cdaaf5c..f857747e9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -84,7 +84,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * char *retstr=0; if ( LP_tradecommand(myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) { - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) + if ( (retstr= stats_JSON(pubsock,argjson,"127.0.0.1",0)) != 0 ) { printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) @@ -114,7 +114,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double portable_mutex_lock(&LP_commandmutex); if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { - if ( (retstr= LP_forwardhex(jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) + if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) @@ -147,7 +147,7 @@ int32_t LP_subsock_check(struct LP_peerinfo *peer) if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { portable_mutex_lock(&LP_commandmutex); - if ( (retstr= stats_JSON(argjson,"127.0.0.1",0)) != 0 ) + if ( (retstr= stats_JSON(-1,argjson,"127.0.0.1",0)) != 0 ) { //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 6fcfda6ca..41bbd2e2e 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -24,7 +24,7 @@ #include #include "OS_portable.h" #define MAX(a,b) ((a) > (b) ? (a) : (b)) -char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port); +char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port); #include "stats.c" void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); diff --git a/iguana/exchanges/stats.c b/iguana/exchanges/stats.c index 8af29db0e..06d1cfeb7 100644 --- a/iguana/exchanges/stats.c +++ b/iguana/exchanges/stats.c @@ -489,7 +489,7 @@ char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *po if ( userpass != 0 && jstr(argjson,"userpass") == 0 ) jaddstr(argjson,"userpass",userpass); //printf("after urlconv.(%s) argjson.(%s)\n",jprint(json,0),jprint(argjson,0)); - if ( (retstr= stats_JSON(argjson,remoteaddr,port)) != 0 ) + if ( (retstr= stats_JSON(-1,argjson,remoteaddr,port)) != 0 ) { if ( (retitem= cJSON_Parse(retstr)) != 0 ) jaddi(retarray,retitem); @@ -512,7 +512,7 @@ char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *po //printf("ARGJSON.(%s)\n",jprint(arg,0)); if ( userpass != 0 && jstr(arg,"userpass") == 0 ) jaddstr(arg,"userpass",userpass); - retstr = stats_JSON(arg,remoteaddr,port); + retstr = stats_JSON(-1,arg,remoteaddr,port); } free_json(argjson); free_json(json); From c2f4e555085d705a0d6f0e17857770ecfa42da5d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:53:23 +0300 Subject: [PATCH 378/910] Test --- iguana/exchanges/LP_forwarding.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 11c64e84e..7983f634a 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -136,9 +136,9 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) if ( (argjson= cJSON_Parse((char *)data)) != 0 ) { reqjson = LP_dereference(argjson,"forward"); - if ( pubsock < 0 || bits256_cmp(pubkey,LP_mypubkey) == 0 ) - retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); - else LP_send(pubsock,jprint(reqjson,0),1); + retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + if ( pubsock >= 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) + LP_send(pubsock,jprint(reqjson,0),1); free_json(reqjson); free_json(argjson); } From 8d98905938112dbca5332cc89c52dc326c78ee6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:55:38 +0300 Subject: [PATCH 379/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 7983f634a..e38b3175d 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -137,7 +137,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { reqjson = LP_dereference(argjson,"forward"); retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); - if ( pubsock >= 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) + if ( pubsock >= 0 ) LP_send(pubsock,jprint(reqjson,0),1); free_json(reqjson); free_json(argjson); From b254f769ba53dff3d2adbca29c3f274e7e72d69f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 18:58:42 +0300 Subject: [PATCH 380/910] Test --- iguana/exchanges/LP_peers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 2ef5511c8..af64c161e 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -42,7 +42,7 @@ char *LP_peers() struct LP_peerinfo *peer,*tmp; cJSON *peersjson = cJSON_CreateArray(); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( peer->errors < LP_MAXPEER_ERRORS ) + //if ( peer->errors < LP_MAXPEER_ERRORS ) jaddi(peersjson,LP_peerjson(peer)); } return(jprint(peersjson,1)); From cfe63f7543db590d2a460373e3db6f93fe6bf5c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 19:00:26 +0300 Subject: [PATCH 381/910] 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 f857747e9..748f33f50 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,7 +30,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196" , };//'"5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; int32_t LP_mypubsock = -1; From c65a276338f013b9b0de4471d149f868d2b95a1d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 19:03:56 +0300 Subject: [PATCH 382/910] Test --- iguana/exchanges/LP_commands.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c489ac0ce..4510b05c4 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -235,7 +235,10 @@ char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) + { + printf("(%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); + } else if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ available localhost RPC commands:\n \ From 69430c7cfecff269bb132fe4ab90069988586678 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 19:08:52 +0300 Subject: [PATCH 383/910] Test --- iguana/exchanges/LP_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 4510b05c4..eab3010e3 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -165,6 +165,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 || strcmp(method,"price") == 0 || strcmp(method,"connect") == 0) ) { + retval = 1; txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { From 19ff3b27d7bc5ae0ddbcbf56e7c410c46a31dd12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:01:39 +0300 Subject: [PATCH 384/910] Test --- iguana/exchanges/LP_utxos.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index dd03bef83..cb99c9f40 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -352,24 +352,9 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit return(0); } destaddr2[0] = 0; - if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) - { - printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); - return(0); - } if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) - { - printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); - return(0); - } - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) - { - printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(0); - } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { if ( 0 && LP_ismine(utxo) == 0 ) @@ -388,6 +373,21 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } else { + if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) + { + printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); + return(0); + } + if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + { + printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); + return(0); + } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) + { + printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); + } utxo = calloc(1,sizeof(*utxo)); utxo->S.profitmargin = profitmargin; utxo->pubkey = pubkey; From b9f89cc176ce2840ba9031ac1e67adc529bf6474 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:05:27 +0300 Subject: [PATCH 385/910] 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 11f1b7041..0c5f29d45 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -65,7 +65,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65],str3[65]; - sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?method=notified&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curlt(url,LP_HTTP_TIMEOUT)); From 7fd70608ac643ccb0c43d62f9af198db07a3e4a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:32:09 +0300 Subject: [PATCH 386/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index cb99c9f40..f2cb877b6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -203,6 +203,7 @@ int32_t LP_utxopurge(int32_t allutxos) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; + jaddstr(item,"method","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); From 333d4c51d05d9129178f63d1f09fe280e5d43c0d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:34:14 +0300 Subject: [PATCH 387/910] Test --- iguana/exchanges/LP_commands.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index eab3010e3..1a4536fba 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -419,6 +419,15 @@ forwardhex(pubkey,hex)\n\ retstr = LP_peers(); else if ( strcmp(method,"getutxos") == 0 ) retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); + else if ( strcmp(method,"notified") == 0 ) + { + if ( juint(argjson,"timestamp") > time(NULL)-60 ) + { + printf("utxonotify.(%s)\n",jprint(argjson,0)); + LP_utxoaddjson(1,LP_mypubsock,argjson); + } + retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); + } else if ( IAMLP != 0 ) { if ( strcmp(method,"register") == 0 ) @@ -429,15 +438,6 @@ forwardhex(pubkey,hex)\n\ retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); - else if ( strcmp(method,"notified") == 0 ) - { - if ( juint(argjson,"timestamp") > time(NULL)-60 ) - { - printf("utxonotify.(%s)\n",jprint(argjson,0)); - LP_utxoaddjson(1,LP_mypubsock,argjson); - } - retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); - } } if ( retstr != 0 ) return(retstr); From 800e06a866d277814e1e39f26bc6aefb50ede402 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:37:30 +0300 Subject: [PATCH 388/910] 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 f2cb877b6..3d0833aa8 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -203,7 +203,7 @@ int32_t LP_utxopurge(int32_t allutxos) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; - jaddstr(item,"method","notified"); + jaddstr(item,"method2","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); From ee35b352b5abd4d750d0850227324c128fb51a17 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 20:38:10 +0300 Subject: [PATCH 389/910] Test --- iguana/exchanges/LP_utxos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 3d0833aa8..6ee0ecfa7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -203,6 +203,7 @@ int32_t LP_utxopurge(int32_t allutxos) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; + jaddstr(item,"method","notified"); jaddstr(item,"method2","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); From 82d51540b9c5d6692d55298605af0c699b51074c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Jun 2017 21:11:47 +0300 Subject: [PATCH 390/910] Test --- .gitignore | 2 ++ iguana/exchanges/LP_commands.c | 5 +++++ iguana/exchanges/LP_nativeDEX.c | 5 +++++ .../Contents/Resources/DWARF/marketmaker | Bin 0 -> 339918 bytes iguana/userpass | 1 + 5 files changed, 13 insertions(+) create mode 100644 iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker create mode 100644 iguana/userpass diff --git a/.gitignore b/.gitignore index c68d66ed4..f166a52e6 100755 --- a/.gitignore +++ b/.gitignore @@ -465,3 +465,5 @@ iguana/DB/SWAPS/3085356347-2346291696 iguana/DB/SWAPS/1819165332-1507632737 iguana/DB/SWAPS/283982730-556239841 + +iguana/marketmaker.dSYM/Contents/Info.plist diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 1a4536fba..550852f3e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -18,6 +18,11 @@ // marketmaker // +// price query is redundant as there is a pricefeed for all pubkeys now +// get orderbook, find pubkey of the one offering it and directly reserve it +// then it is the same as current logic, just skip the "price" step +// "notified" push is wrong + double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub) { cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 748f33f50..fbc4e3ccd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -366,7 +366,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit OS_randombytes((void *)&n,sizeof(n)); srand((int32_t)n); if ( userhome != 0 && userhome[0] != 0 ) + { safecopy(USERHOME,userhome,sizeof(USERHOME)); +#ifdef __APPLE__ + strcat(USERHOME,"/Library/Application Support"); +#endif + } portable_mutex_init(&LP_peermutex); portable_mutex_init(&LP_utxomutex); portable_mutex_init(&LP_commandmutex); diff --git a/iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker b/iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker new file mode 100644 index 0000000000000000000000000000000000000000..20c28fdf236fd57192d613a639e18656b299cb21 GIT binary patch literal 339918 zcmeFad3;=T_5VLjxgkxr=}PwwErpiSG);F*Azf($ZHG366p)!oGD)UQGQ-TIO)E+a zAgF)?;)YnFs2~E43JS#~E@(l8um}jKQ41dskr7$k{k_inyxw>2Oakin_b+`s+TQ2; zocDI#`*QC*{I{3?b*#@fY`D+oE5~0v`|cTmfB0uQ{-1)sH8b9G!}dihefN&6ICu4$ zic?DH?(_S6-*J4tfxSN851V|xsc_$nzoAfY?HL=-+qh#ppy1&L4r1BXq z4zIgX!^>ThPn9QVn`HO@P^dALPR2S~=u#YB;=5x^ey3gGdV$IEe+tqH=TNA#V}Gop zDHQ8yjvFp4->Wu_HQ^;Zb+9;$eCS%=x}XpWZCG2k)+0gvFgf&FOM7H^lzJj{UjCOq zp-@XaZ?(4$uTs^`zvAEikyr}-ceI642ihCrZJ|UuIVgRVOdpz$`=>a(gRVr<(-wKV z@M;)duO|@CqsiyR1>qIflS2Cq>{R>p9+&szE!VuOK7~R}k#r>QT3jC8do{f8O~~uK zeRvJ2d@CDV9>GgAyvr8kL&-mBo6g51{u|@%?ePxlR-C?pTPK+Mvf<95+eO}0L&*1Y zXKmSb=EeKJl(lGeL^G7I?geacebykSW=^+-6fSLFQ^eMGtLP zw)NNcTCjh#p|d5_7VC(L=39k#!><@S!_!a)|7*ibbT)KE+M}uB@NO70#iZ{`^VRPS z-+8-MD(TVmA-wc~#NhDOuhj4^l0gW6*8kss7hYSu(dZYa@2<5P-YC|$yZ-dwg%?Ri zI$ENsLH6sb)9`XKAmUHoG2YgtZr*=we%Z|p3NM?`@ctCl^2i4MyYQI2LE(M&iK(VM z`k08%e!$xryeZRXo4!axLo&K=aD9n9so_PKtjHDrU3eHQOa#T{@%^VYyxA9M{NMl3 ze+n;>NVG*mrt-l{ad^L3G0o(6)CvvnH_!hM;UyxC#o@i&rs18S!TDaEA+w0L{u2sm z`b=epT5)*e+BLjSjn^>7&HV4ei#O~s6}mXQ+b$_g-))QEKD@V1`8$$#Ebxv6-m$(hl<&(+%WEp-%zcQrqGpxKx`D`o4JV(Np z!A2fQdt^8SX`Z6^26lH8s(R){yODS zEUYCxl^c|iERBDY@*1+QPI)KUf1z@M+}o^t137V#^7pO&0p;J40|%A=LJnV|Tv4X+ zcVDKw+45D&P2}L$mES|o-L3oyvj5x4cap>3Q~s&d|Dp2l$$iVqOnLpA+`US96!zuB zK7FSvPbG(uFgW`bk`o_PUQO=5N_itWd$sbpR{uKX26E-~%6rMZH!F8q{kxTW$TiC*=gW`|rx{v+{o^UrP=gQ*P3G6FEFi`3`d5 z9OZA3{gul7No zy&2`Z$vN`Fj8S`JZ&98}uDn&bl3a6}@k8zTYbUmYn@RFI9epoFn_Oe=GiTOZA-dMDm7Z%Dc!L z$(NEhk+bB@m(1K81WMc^ml%IYEAbd=1&ZT+?$0IY|B?IZJ+pJU|{j zQRA;!q5db46XeninsKKZNUePrKim0wN{lQZPRX)6CB*}q=-4$FuTuIK5Ysfc}caj5lsQyLdUh?&p?^O96mcOEW#Bx^oCGuCvqbF;6`p8w} zN66=p2gnD=zOQO{pC)I?edK=fQF7*Ms{cBpCpVqt-VjMiJYN4Oum); z9&(m^9r+&eZR9@kPsm5e1LPOTFOqZQS1n(m`TdvW4=c}_rs+NAD& zlLO?n^7$^0Gwmhqvff9z6g(F7HPfd0pRmmPG&c*Qp$%ko|Nahg_!G+CCTBmU z{Gc$_EIHnHdCJPKSNV(9KQ`K>{r-*If30%)OpP!5QRV5v2(R)>n%?=8CqAk2m1G~& zcLurpQ!3vL8i5&Q}a#9%ixA%wMFO2y5>-3(@Rpj6~%AX-8$am0xmiD`ka(mzB z`@)jZQ*^)QQR|=i8K68k_ZVZ3KajI;3|IS*!;h)F3Uhl7!CzEqKlusi2mg)J$ zDsuNK0y*=P*7v34nktoVwtSLu9l4v_NbbjF zS;=oZxsURLWZzq2;{cDup zBv(#Q|E0&PJ$fmhNDksgvG`v=&MZ`3P0qfd;cXxXwyV9jk}FSDK94-`Mb&R1_kBXc zdk;DBapezN`7gCTA0qcZul#jkly`>Z`5nq@&QbplTK#jCe?k3EQvZ2j^k06?pI)PW z_!do{Ge_;=zd`*^5=MOY(Emx~Z;@A0-?v}&HVRSS#t2F zn!fLneV3^JpOOcDr0w@va{mYP{Q3oQ<*m#=Irt6b(I;sBv(Kyl8RS4#<)@JQo>O_X zu%!1}6ODbh2%~;YVg1@o{oX4y{w8wb3{7v6+`U%${lW+@_lSmfE%`6x&r*M&U)#gi ztp7)p@3&m3_2(&a|1+BY-;y&wRDR7e4ko33IP*0B-G`MYkZbys=aBsmDlfD8zffLJ z&Yhy^*-Z|=sq$uW%{|Kd$eDkueR{~j$JD+bCTBT5e~#>XS;PMdIlNr$_ib{3MW_$j*GVM@>Za#|uNh zm+}DRm31nwAp0AXSCMlZPtPESdsTi8x%+12D7j{l+Uo#0aJrV?wN{Rc6Vg6!A@{FU z{VX4U`g}uaa~0{~$T@km~=I+)e%)xtBb8 zq2@QxuljSymE=|AKE}7rGV^mG+5a`oPdhol^69b6^1s&VlY7azFRTAMgi-%qV12uX zoFo6hGB%RMo{y1zk1IbT3_Y@2{Hwl2d4pKPitQXI@pF zK~Ch9D=kxhz4iaP%7f$}<-5s!|5kY;IX6kuldwEh`2g8BOZhT#f0^<%2_WlI9cbMAabL9SNy`OOx zIn4VbM=X!f^U5d41K4+w^d2SmHEMWoTKSV&pN^@}{N)~19z#xCsQRi;Z>1? zypOSoT=@l!FJu^pg!m)+Daym>r-a{c8T-t_SCO;WXBGYgx%*0u@AKr~Q<}c7lKY=f zzSsI^`oB-^Jw@&HIN4vN{33avLiz7xAN9vBR(n*E=aBnxF-g+5oSY$Vw7gv9b>zSb z-)RNnMo?&MoyF{?;-d9OZBg?{CDL~lf$K| zf0y;YRrvwStCXK32hUO-zC_cPNhlvj4s!paf;{k$%4^7hCpG>$a`vYx-$U*`M%(A5 z(`H!=a6$u&#C0_%PK#I zTyv3zpRn>h%GZzst;%z$l0GLKTEFpk@72KAIqzBDee15jem;e->Cj#a^-;X zX3J@aqJ8~b(J7@WCDj&W~ z)1UjN@+5N2iJG6erTSNrbN4FWNbdWl@}1^rLI9kD|56a2E4 z&rGuK64hT!_H%!I4Y_Zh%7f(opJ;#fZY%$p@*Z;cPnGwRb3azToZNfA@~6q+hm^lc z4l=y&k+Tn~{9&^HB<;_CP0o#fOaI@g{rP&z z12?Pv>d3ussD2AMhl`lf-jY_%_VN+3oFj_-MzX(F$B+BSzB84dAy;lu{u4PtE?cGf z$?jD7bh3Yk@*=YDT;)wx|7_*mmUk&%L{8KxUqQ|Vl|M!9X83oI{nY;+*~j$!oE)rI z|9`a1_|B;+HU&H$cdEhkV5vOW?!Yh?$k$ZXHdZA^;zn)yPUG?8h?jv_u{Wg_f zO7_2|_3K*e{}JWSkt_eCe6Q6f_mjKlYyE%L>i=2wUm}MYzVBVEUtEulAt!RGKb_p0 zR$fF7j@0?^sbv2Yt?#wu>_0XBI_v*c^&cVU%9Zz$`zh}t4@_5i5821`f5gf;f4<53 z|A5AKJGqAK|6X#K^Vgq|`yN#Nr>*?=%Kt|mI7#DwmF&kwaB0u~w)(jEEj+4P?dOju z&mf0m$_vQBkcPj)@|!B(OzwY8<#pr%+P{&Up?;E_U9SFntbfkmuObK7UwzWbKcMyN z7INh;mG30Wivg0KKCAx+4gVo>0539#e8B4eLD#1*kt;`QefS4?;A!%DH-5TCWR!&|5aX$+@SL50kseIdXtJ?=;qb zT&$M(&b7?&t|f=5|6?n^N%en6PVoNZzsR}YsC>%l8h-E@r?P^0nnzNox`oco<}3%T;&%2$vBpHu!kxu5yFpIk%v@5p^* zXRXH9eZBghNe+BWdAXG@)$*$$*Ra1m+sdC&`Mb%LuPLXken$BNc67(^QYwS5#^_--`An@ffp&yaz5||xd!{@!+iL&PV*nexry*d zat+Q6gr|}#AJg#XSbl~3L)L$n=5H;z{}-yijhy(S>R)KNT-#eaxw}XGUqa5Zyc;-<@3ln`d>i~UZV1iW@BKIB8^qoRZ98^A)9C(lNW~<+>{&!h9<7*^`yHr0-&hA&f zoa`fioE+Sz@>|G$rso^v-cFVOn4IH$;wj51mA^>tPb&Y7>t%Qvb$`k9|;`)4bEn(UvV{8e&zvho9DALYLx z2e=;pCpj}w^~Y?|{P^%9v!r(xxsU7FrDXpVnx8G?ZgR-VKd0-v6glv7&2JC6_i^Qq zk_YZm{hP@??yuiP&fTW^50LvQ{{=bxC6&Ku{geMj9=KKIBhS$M_3?aZ7TL%2EFt^< zrTN=P9{9f6V>dbXN98th@dxD!@&NgCav$s8+2sBoX!wof;GN0`$bq}Hyso#r zOT)jJT*LZx7rAeo`u{#Tc#HafjNDKAKWF&`4et$d?~BUEqMtVBCFCjO@Y5RpVsg!` z8vZ77pikxJkTXvyw_5pq$_L2V$CN)r_I+3RMsm%Knx4DK;X}#~Sp9?AUq4Ci<^JnY za$v6NziFBK0p+!tzYO<-k0bm3q5E%3$YJh3ZYFn+(($*B9C%d6=L^WaztZ}@m+XI1 zd7qWj|NF@UOy5Vz8P2D_VD&kl&XOxsjD`ek1W#5^a-|#Huapb<) z$|sTobCp+jxry6oimGW*Y|A=yu+=F1Tr)-aJaVo}IY#b|D0h*=6P2$ZXZ9(7oLrew{vtUsUiogzapn8T{tJ~KCkOq? zzatOCl>bbw9IaduWO*~cqpPXU)zS{a{c)jG@Bn|&= za+rLC>}UV}OY8qQ)&Da&!SG6VGW}ftjv)`Qyrz<~94}{+1Jpl}+{g9rBCG#C?T?p} zYd){@p$)<#asI*ksb^dHuXR2XB8Pvj+%7yC`+!{U@29+v>)jr5;`2J+xrSWxOXbgy z2Y5gHW^(0^H9c9f|5oK6lCxh>e%8wGQqEcbcPfvlQ~L#OS3ZH9_=fUIa_~#awO0RL z**}D2(^h_s^7EE&RDPXY8B+e2 zmG>x@pR4xFQGOgbK>1v+^vb=`x zR{IQmQT4}?ySZOAog8F&oJj8fv&O%e>|dbyt08CSD+kG$4&A?KA^YOW`^o(S8vhmK zz_ZHNkq5Y6d`KAmx1aB;f0^>^McV)0L++0&-%qZ=2l}P_eooG$lz%IX@DjUpJa~oj z@CQ}?4|4Yv$|KHGd*#Se$-xh+{6uo!3ChdJnSZOj)>%1uCpp3M>PBIt$H({W6O>op zrQyAo9Q>N{hsb^88_3g zd7Ye@t>s;EzS<}7sP-4r$(e_hmy?719%7K3<@XBPt^c2^{zu7u)W471J6gZj_YAq_ zIOV^SbMus^T%hUkmnttKcQgF$xj@ss7bgf2#8Bo= z{R7GulQX|kzTEQD${!*3KCk>qa**MDmOMcHJFGtU`@cgDQ~xLA%ux;R7nZ62Jh`9w z{WCep^|pL~S?t+M`Dk+GlN#PMVbu5RdD^~Dq}=ziwudUK|B~`)R6dYcsw3WU(DmEco)0I|mQElj zS0*gcgrF3PC!3 zNnsp5n6fcZwS2|iC86eM2 zONU}@ZPAuUTc{C5+Yo8o8)`;vu)=6E8BZ39@*zbV_eKwd@GC^-KdrxcX$k>GlBOCo zEUogPK6NxkL(QEXjp1FjuTa{vr|iu%eAfayrx!eGAu6 z1AeOswIuIDY=VjdFJ4!e&#l&8_f%^H_6;@1I!ui(5H+^K3-U2UvKkeEz*PMBV+qF9jT0LgCs@$67`eOrcU$|%a@?b$a`UL5o&G6 z&rPwl4&4-n(nP-zO-9lMiSULrRJ-5b5i#`^zyIh-$J-QVOIy4l(snQ;6)?U(;`PO> zp#l`=i&;sdnx&dC;Cg*AE=h>j**3U?uJ2+BZX?auAnWVCO@Y`{!bv|8}zF6py1+JymE zJ*q^1&apY#l|ZaANSJ=!JS3xyv4lJ|OXrb{G^Pbon0!fZ(u7_xj?Nll^f0I~D5Yjr zou+6@GKv&hZj48pn`4c!XopNhno}2bMv_t$w9ntyWF~LP_NFB(DntA5%Z3=|@pFl; zyubz3GSr#Cd`$xoG?m8}k^rh!$uA?)KSL~VkU^%vVQE#R#~~d<8}e{_Q&kaZ+@Z$S zy{02?Z(3HMu-rq)-x3e*Z;d6}5^?;5WIEI`K}-)sftePBguC3}A6stR)#aAU#49o;k}*wlsteG@@q{BcLt;MXOL@khbe! zf_JI0{lH!cZExOt-ngOWrp9!8OA-wsp4=ZvHo>TM1rTa(i${#4gCpvQzR5Kacv*+uV%Cpi!E;%v`12D9fsRvac2?@&&Up((RA^{$m)pkK>W%S zS<1xP)?+=1)ePKPZ^yG8I8ONjU01)89T(niS&VxHqlT6j39=Cnc550WSW7t zTjZ*q#d)Xz2CJKORJ2Rx=B8xvGq5R4{(RQE%Q6dyNQ9K5UqUCT>oC)9F&xLyQ|LTg z0qZOYijqhYU5BLxQZjl`Co&(}7egh?R1@ z=`2(BJB-L zk&5|1MR$aPmx%>kG8;l$UAkg<{;6si8hK*_ zDt}{ArivA9=#`tKP40|r4egXNSliLGHHt=Cv2*R#ox4!4hm@?_vUaER@0jwe!$7eW z0|{z&vTVIN(kk|qLE!F>! zTp{E@{*#K2|5nOWrvuIDOiW)oOha0+OtOT@SjC2o>$h*%xD^*DJu)5UD>iO(WoCZY zk&Y*pRW!FFsQi4dqAAv5_60oy2WKV~5v+w|dW5XJjkFmnf_PF?nnG=zsLK)AUc%fS z{l1w?h@i0*E7ze#`B5)bAzPH8rpA0Y8mw0Z3!VRm?B^@V;A~p;zR(;J23)b5nls;^yeK>35Hayz{9!a^@ zN8`<`{8ym<48$#BMwuMw+xM_s(k$V82P$IFmSZZ&mA>NRP9B9YR1=gpHZIM_z zQwm+~Wv>2^yq==(UApt-wZ+&U75jA6>pq zRyN646slXhr2-kw1BMk0WT7qFHf&ihW;68?HP`%aD=zGcUP-dp6xtD7k0GE*CPPK8 zEbjtMIj9bMRgz=l%=YCRS_D1GZvm3L}CVA=|X>!ymj zIQGGHIxURqJB8LUKv_9cCAev$C7EEJfL;xq2czOrtiR91tuNj+8#+z z&>_42W~FHk7T50Fxv_5j=Cxb4?F{YQy>;Do^tJ1E?bv})cZ*nl!^Zkhq`eKfHcyEd zYPf`?j15W|CM~2eCl_;wDwem6Q8ZSp$JGH9Fx}aaN}%$oLmZDrj^v6DeMYX5*+F0(BqotTP$aUflFmZOHVmbG*aVPGedO9WG@#qvD+fQQ zc6kTwn-CTnts8DbG9GEd*h7z<t3ISn46XHbxp{C&2@5nv6(JP*5IL6UCp0_D-x@ z6kFq1WyQFOCCYTLCm`a4mg+`?XW7z|-3p5G(L$yTnG!dfraOy9l8re3qAcYRwzp%% zvl|K2Fm9f7#ydK&kzw<$WM+j%AC)zVWjkh`nlA2X85y75WRkH7?G@+EMY$|blhGDb zN7e$m=hK8HZHm_fW5HY2aFbn;CTVrZHW0G}jEBgEoEQMrgpb=x&#~kfy?JMX$L^|&3qGRqQ=G7V5&eYPzYB6E;!Wt|NvG+{#> zsKO}0eCo`Y-GQ01Oj?jKun9L`nbbw57ph_UO1YO|^j!*dqI^+e$(YPM5t1trM=eFy z$*sw*i(9UeK@%1ZH=^_>Zmt)BeCmV>{N^jSh%_nY$sFUDlo|Ad4ogRy^42VRGF_4S z6N5KLajM5-6Xeo0mhE0#hkSy?o1_@cCK=Nv>uM#~sk#nKvGr3NRRWFLqhkAH&2TVkz2p<<``NH_99g|U;DHox}h3DJ`jVR zvNY@|K*OFkp`qb=2=9$ZUSt~e! zY&9y|`V1Q(;(&;j#K4~J!d4V+9;F(Sv4q;UpwH#_ocEGwl+MqDhT9MttUO3q`JTs> z?~gDpIkPwMsR&!os81Y@GzIzL$xLTxu2r@Lf!BteVMbeHT-OaJb=$tZ$lAFe|N4g8`nNRsnv9rS+TWmeyAdxc5G2=m|gnEX7 zY+K+;NczGmx1I}`N`m6DmDIR-8=yGYcEV@3T9VOMXf}kg9EEYP`=56zh)^Ie$~Q9c zYp6`beipW$ss5o9?XK~?}m`dw;7|CZ-OwYvA4J6iPPrwSLhHj6Kmf<&=1dDx7|6P$W$uBE{WK5T zn@8QsHoNk=HNO_KL0nfi+w|*V5qOXd`z;vK>}5RRpq|ujL7Omv4%*aLZ#&V_qjICx z$fat_gB%O;2}`X5GAxR7t93Q^C)G{X6MSk#2hkdD!#J|D6NkIoHr9nONk=`yW~_0M zD;831+1b?Ld{a(9qi6d<`Dg5#M>}P--nDb%j?LS*!e;Um#BM|WDYSn3u5EQ2cX(XR z-Lh$CojBC353Su$yGu?RWI!t%3EUyhGwO+3@rYsE&|`8Cu&6z>=?~m4#F)kwiUGAr z-U_%qWUdtFU2t|`-DHXuiY2gZgpxE{k=l8ob4J&MPKO(&dJ}>*11IpX<{(3CfcSMXSQa8SC*^LfWCFXVlj?dtCv-+ zqus^GtF@$#SanzlTBde*9j@L4x>NAhPBW;P+2+kAbsMzd{HKFpta@5n80uby6fkeRkeZ65}FQ-@tQGY4O5dMJ;k zaYb%$wJ;iOA7pGRMtRCyr`RKUF5F|2ezh>p}z9*JNegaP407(oX@+cyal1aWHQv0< zB+NC1o)5?_Y_dwvSn}HLY}k6o0TvE8%;hWVgecKe^^`jAQ(f(#ZgovdmL5)Kk9KwJ z3Z<{HAo;G+4#Ya4TP<=alnYgvzSsIlRAD!m>)ir3)*NPCY*)2EhHl+eq6^+KLVxMH zb~fPnvw%^dmo6=K!B|!7Wa}zp#OxTetYonTG_BfQP!ki_WE5{cRSwcM0;H!XXzjvn zl0mxUbsf@JY2prIu`hQ)YZax0q@;=z(_N?&gWT*swd=VnCg-MkD`1MjdzpEa;*!zf z#jd}sUU9yaWeJrJ9c5P~h3LAN(=HFm`ZwL0#6c;7P01NHa^V3p{7_=2h)mhSa z1oY%N@7r9}H>)etMKG8)41vvR0TW@HS$x=#JPplAdDvbYbh0RrVtGNBcu}D+6_}OC zWD9Yoqe=OG2*tJ6Aj|4n05mks89jv-VxMcU-u z2(RuYnRE`Jx}{?%*KOF!EA)?*I1YUa-G)l|PMA(Q6mQ(>HbmrgNxAc{svEFKlgXu* z#ORxF*QUU$Dq2xt8aChxS7WP{6?yZDioA7VcT1O#8vPkjwTgsflVsg?n%5Rxy^V4Q zGbjsk*GU8S`jsW!X6)0Ws;bsjjN$USol;QWa`V8sIIG;Akg82bc`u>>c3~G=?sS?{ zELGYO#i?dvR3hHeQIPopNnzei`!XvR_Z-{M_F!o9+MS!xEhAc4*vN3_-qp(cqO%Tz zd1rH!3~|fvuCAYgwlCct)iyw*<1-;@vz;Nbu*)=1zaDZSE%7ugK-xh za;MJ)8FxK^`j}^2`pE;X`w(zl9+zNndsN<8F@DX>BtDyET0T$O`^mh~Xu8+@!1AiG zDz-P`>LK316#KL%^h$&D=z``RtXareUm9G8UL zD%X`l-x#T?OvKv`ELmEKOIiD)vUd3<YnbtZ_S}W03g%yBIF!|ES z?f(*$?EU?3(TI=#w``e-B^Kdse2vIusFhYOvaXR0Es`AqX+-8KTS1YC#0=P2dJZK= z)s=}H?iAtOo}o+itySFfE816XgkVW1uLbApOi?c0M#prLt|@e4EA{U`)Vlwqh<8;y zB`VY3P_#*V(8B6FSQIL*K|`n%hK`9;1n*^PGbzsc5JJ58DV>Ej1+-%EZSy;{_d;ob zf1UbdiTwUO7`wrKW z$7FdoR6VTL;c>s&k;c7i?Z9+VXv$sQJtLYWn!TcWRg5>Zx^b_(?S;JYZA(0$@#w#{SC)P+e^1lA%b}}UzBH+K z-SHj;`XG5bOE=+#WOB|eHmn#!YjOFUs|(Rq2fkNk(M*#pcyei-WV=*7Ykr$!(Y7Wn zN>NcqS0|pxi@4_(iZ|@h015`*78n-Jn2g|G9VyXq84IOwQ6DEyria7XmpL**1<_qV zGr2((M9G;)&AfTU6cI@^k8-=%lniNE0WJ5EjX+*$=1Xb}MCULbUArQa$&d*c4zh5} z#{>tt`kZ$_GgwlHa%s6hUKj#A$c5zs4e8^H9rCPqtMly6Q|Kq2j2+Z{>%u#a?rle` zdy{G0&ha|fg}D8;3MRCgdsk`5eH*JTXT?&eIORq8dR=Aw!_>y?`gz^?*3TgQlx!U0 zVwqj@7x?i6E}KJUKbQ*IZi}*k8jA@O4l>hbKZdGs)wcrmypgV`(>Nr@WKpJebZd*? z)C^U#0KIZ-j+lOl3aGt2dnCylHRxAXlso=Iv&^=$qURC(}r% zqgBIfeiyiS16Cbg-EkwA8G&TMd*j6hfePR$7qclAN#*l_nY5%4 zx+cjmSrUGB5Na z8+p1UXQ=y8?d7l_l}fZGF^zEj+HE;){}{h8D4Wzm1KqbfFECIz5E>_r11Wq!rjA}v zsAdNR+ke=|Ov|J}-)44aavq76C00DrEX>KH_L4Z7+91cK_+Jhv(QLJ@q~y5KKF07y zo7@X3ezU^3$bmRc46&{=cSWEhclBi&6HCdhO`Nngw#nBI(B1GtiYtH69^V|0zF$ z9PRGZ9#d(&-x5IasiV9=8r5&&Byk@}dT}d|<+iNS(}M+aAK8lX9xzPEowGq66EZI= zBLWQ|E%wn#@E$E8(|MbB{B@6Xz5C@1;~2q5k;JQfD!@D=JNDBW>WI@_zV0W3i&Zsm zN9W(%D{vk{9lO%<>94WOO_TmEbCgb ztjGbccY1s*?^;qA>54At`8^sdy0E9_;jY3o$s474DNwk!7bpmO<(SyyujVi= zag*xmLFu|YD02fME)I1jvFB$FYld>O_AOAfXDu+7$I#@>a6>n1ic?4}-y*dfI&ICGpeD|ZEqv01uLb^mXS+q{} zdm~;)^Cc3-pn8~2@+BaTp1fiqxwqC()qKP{<=x{M40Wu z$(UTizy&{CN5;@3>jOecPe5HVpMMleM`A_`XD3Osypcm-y{rb$^3h3oX;&vw`c{eO zZdKu1p!$AWp_}*emB*u82sN+7c-`cb9`#7u#t;H~x1vCVyN(zryiVq#U7=G7taKsO%9q*YE+r+F!3oF^{61R zZo(0sCcp%2?0&E?5)oL>v?(+^A7_=TQW{3uYbJv0R}N|P(gKw6)-6`N_&5~zGV%_( zZQ*$>*J!8Xk~Db%2mORRSv52;b;4I7;#km!(v93NEdI2`;162BC7wojNDDGxHY!cK zvri}m+`q*l%e@Yzw@b|UAz!J%_d8K@JDLj|(3|j`dsVP2yhN-k+J05xd|JbU@+CDzBv3qH)7>^nv8vqG<7E`n4e4p3Py17}Y+dK5s7ZFe8r1c}e_X(vU{)?T0=g559-*f0d#Fa*3|2x}Or zNHYfM1eP#bhGxi%xkp-JD1dDd2X`U@u6Ru8sza^o0O(Z)31f`WXEXmb7r0 z^bHlSXbt|RNItZv?6#X5%yL2%*{fsG+sI9KStvJKi!wiNFfYgsDIAo2iC8^y%W5cZ z^2$7V8hJZlDDhjSSOZq^-~=Nm>`A#tsNRs9u&Z3a_yjX=1iqy}*4ySA&9WRYotx}4 z{I}}1N5tzPvb*pWkr&0`+C{8Bv`5(;9UPpv+6?JFL2-nlp&1$S+tBV;sj2iIlAjMv z70ve)-a5+vGGCg$yz-Et+LMZWY(?MP<|4;yq#_M|RLrYkzlw$pYx5CZe#l!dJLIFX zYRI*`6EjrfC{`&hFe@LT`dQIid2zEYr(W9enFBEGyUn9^dgjsX@(i)VGnahwe&w{x z^)2A~7s&f@J8OiM@2m-VKiR*!Cwath~W!GP(zp(fx4Dd74s7mc7H2X?Ms z1JsP>Q1Yw3H=SJusvBp5k%vTzhRLbQi8F9@pD-W`EllNg$A-(aV&u0a-f3r&= zb(IlbKlEe$@UXg2P0rTMddCeK6|T^qRJlS=#)BL#*r1IACsrDLVVH&r!{9fCYzRQp za4l;R%;Hl6RNs$d&%4e+*cHyz0sHdz=QYeeQLM-@wwVA&uYIsyEe=_ zsU5rIB0tudddcoU1Rr&gwG-~$$Tw2tBNOlZdB+0pSl}HCykmiPEbxv6-m$1Y5;A@IQXU8wNCo^EO?=*sx5xEZM-(zGbANNpg#XcSsQUop84< z1IKvK9$_6&cPT2?E5z^fjVQ_TN5qFe;2Y+QFE2T1g5#9dJN{Z{Lg|_2ahyEv#$&ZJ zuC{ay9%`MjwT|D2o1HPW&P4NA>x{2;hLxUKQi2`~A={rXAO09ZKDoSPfRj)9h?aJ6oHbvumB*%}#l(b9(86&PHf$t#)=*JLgq9BWg=KospM2 zV@uP{xN1q7Q{hZ1ZE>bSYs{<8;vQ#AH5^)<@ujaiqmh`ZUCx|ykT?@@iPS6Xkx$nP^B1HWx~#z*n_1{wPA20)#Bjl;tnOs|Xnll{_i(YkB znN)AAb!t&C)edYNrkTn*OYno{QnkY4^p~}Ve`we+XJL8SZmC&Q;lI2Y;k7s;A3*Y- zaQxL;Qyy?mEWKSSYK5sO6JSC=9Hgc!@zj()XOsj{;ha!f){6i#&Zt8O?o4OK1Ng7j znN|yh%S`>3YK|ZOmb7$_XIc&+Ei)x8Cqmb$M!DYP_&(~4E-zU;!I{vBs)#y>#GM2& z>^l){N}Qyqjw@}3O&$NMP9>r{847a_If28@q_S#fLdl8aVVg5i!O`f-jyhuwJ4=94 zJLev9jz8>7KI}{^nLi%(JQJbSI}6b$>rHz&xfJ^I%f?HgPey#>A(eKru+yo6_vzKn z)Ox2HG8AknYWQL}uB>)YUpCY_XVyCBmz*%(3D-K45NPRrNSyV9x&l87OUrI@D&U9; z@UCiUOeizsCu;nRE-kymIc2xA6e=^SooV$_AJN86D*dy`WEC0(+Dfgn32i~5Iv*8X zYDC!tBo~bbNge~g4X|1>il(F5NmV=VsdX+NR_pW(t9L#)OpMbrthTJ;u#*{9cEtGv zB)1GJIc2Fe3f{|y|OV5LfdnqDD zF(DD?S1SotyB4g zv#{Q&IV@q1D81I1c9XLJ;Z3f0Rv}#|6GuAC-6bP6sH_dDA3?ok3dJ-?9ukb?4Rg~G zn96iKsh%sH5uMJc-OfnZ4NVx07FBXm>2;>zqcM&>4Abs5`7=Fu*+k^79{F>wb7o5m zmELo#X`$sP0zZmiG~yjq`XnUvwvQjMvHl*hPAf+h8rccmwBw{rj{PXb<4UzF9*M44 zx^QWg=%*0i2?+Q^)Nu4Lux$@ouxgGfJ3V57R8YV5rH~fwFW=b5b90M~L+EoY*mE%lg234unnToU>Z>sM+ zX*Y|sf=xUk)fSbQwS-kHF_WQu6roHmf6jEe=(R^TJ4ehbpwwUE^A87V~-+@;bKsTPPp&LDkME)HuW@ec^~FoMXjA zYqaNw9T2co5O@4D1J~FJ2re}OsT9XTVH6alU5v#4qmZa;kvP-J5IRN>31I*ycn`jHSgGh!cOZlYpG*3H?$%;t2_Ri zT#rP`#nfUPSOhkZgd&M$=;ckWWRz}kCU*kSOlzf@A;(itMdv_stf`2w84MvqqKq$? z!py4|Q;lYiIKEz5J$y|sJs;J#UaBvqZ_Cq;%uDK>3u>M7(lTMfIM-O=L~5O6t^*GC!B+8liTho(&g!&G7|*MBg7r=V+EUs%4Z5{XtiowA{@z#XT%^TiTSC3Ggw+_0 z)6N;S&bjr@)_NyY>%2QH!*y$|(_G;+)jFNEG8%Shsit9zeASeWro|bv&lu~3YG*zs z+{S8?dbA#$F0~T<)fzjg3e07(eqi`8$1&{%jUItWzvf^z`2X_%Ncc13L9Mf_^bTh^ zqC5$W7W1llXKD{h;9UqhgJhg%yUhWcjE^H3)5^bM>gfnHiIKZ)NMk@Ue?`|jM%(PX zd!0#U>_B-9%TE(eV2(a#f-0Fe5rLuJ!27Ygol(~!JPgClGB{#pEfdEn=b0JQlpg7= zP`^+|1FUc-p&C`A3bn$Q=@n2zpb?OP?lfn~`KGF)a8AYo;E*(%QK*n+NrBOBMjBbH zv01E{$8_C`bRAn>_TbQI**z#N()y*-`wu8*R;01h*MhjK4-!3t|NGmIlU}A<_+&W zg2zLsfWwjAi4qeQDQN7q(pr|lBsx9g;%wj~=6V3Ro?Kq`3)9IR51YxP8$B*M75|Yk zvm!?DvyedPiZP+ZRAeM5Klzz~rf@uD7-vykmZDT-8L5*WPgBUwXN)f)#*yW(c|w?o zXh%rsGHWWE?KUE=z5NU5^VPTa`I%ymVe9d)@Hn=-WZ48~5{5U=@cx`LSth}=K?!fk(!Z_vYrVOO-FdgmHxyG&NC0o z>N$Y=BCb=g8p6zJ#~Biw}a^(rm;xa3?yM%kIZRgK$USB z{n5nIk`pJOo|Sxk*m$^ODcWlkQEA6E8*j&>(xJ`|<)=%%jC|gdHRkE?g;uL8S&4EY zB7s?uqKaAv3n;9>M`uh>vVKO#Rgrd&Rek2cZcSx*d9&<^*(4kwkDY@3XtIOI&hh5#B6#t;nheyp))pszdZ%*JFE zbM8r{Qb)@woC#^?gp5p(7h&PF;tAa(+5-!vVbAMi;fR5*$C=qIT^Z(|D>Kr>S72d& zI_B|{%EqIpN0(JP3wLA1RF-i@_c*f<3I-GBdFRC8aVgNFD2(A4sV8CaJPkWX(t}^C zOaDX8I4r1PY_kC%i|*M_!fa;TVdpq>*jU-5;rk;dl#y6H$b{VMWs2DAB5*G(1F zu8dg{rcv###muHzQjJ+hB^Kk&GP15d?3~&x%UN`uSb+qws7*T;W}Hy7b3wHeJ?u25 zo!uE(?8?egV!ztNKDIP$)-LmVoF!N*!LV2&V|_deb~p(nVY9wRwpkY7t5LogDTfg#4%7>D?|-_VAv&EmZA4Wm^dM4 zR)1t^+4&x0VBx4H9FLke0_H%%CzfK1V;Y{PrkznJ8LVNqx{p$|P1+E-d@$sIYU9R&=9iH#I%Z<{oDU7LsV; z*n>e8pNnWPPGWmuakI0)OkO5rWMbwP_O^_(z1i70?}h~IqaOCcHWhdb=M}0 zJ!Yjf37#fPaF`z)cBZAB`59+UkF3E)K;pmrQfJQPcm`Z@jYsf^-k|h47rj^Xjd;jV%jNYx;VYU!FKWqs5P%TryQ1b75ZeU+v9gzEd-@nOM9GUXtNbg5Pjhp)y^vP zAr;PC)JpLZb0(f=;xJv#Zc>XN@@5Nt?O5@;T z@&jnhCLJd~;mkvF^&7N9QCH(K(pzVU%_P zPoS5T0UKk+JglyI99U~T1`p(9HsqSPS!gmRf)-*27rPy+p**Wr28M|U2xS1fua*#w zhsqN&1>6oe>o6+CpPfn1JL7gcqtACH?}o9^cVHv^u$0-BSDj6VQS*kM^Qz+vufRAm z{9BjkxPoo3`+YJ~(5^-{u`r8~Wju0@UJr?rN9^@rkLEiEOI8iDdk)!k95sLF409%x zmo&+W;}AAL%jO`eW*NU^6>?H(*^#ufP5yCY-*qx#s!U6jLNA1^dhAtV&v<^x$rDfk z($0#svo0-X20Kyf(T|{AOp;Dbmf1b%Vp~x=4>^-iebE)72E#$>GiW^Kv88)ZF>rEn z)H(49B;q<}u5Q2|MKm%G9(5k-IT9j^!4_oba|cV7x*1ArWQGQiA*Z|~HL+wac23K_ z0za4sU=s&ZS?rfrIMaJ%){J2iBLYU+8R%h0lpZZD!wOWk8IAIEC{IE^RiJ|OmQ6$1 zU?Avm7N=#EU5%=Me9EG!TkK?#>mr^QL3 zEmKBzN-4A>hm_6~umd&F-=GBMoRo4DS~?7!W2dxd3K<7}b548OInVQcdoOJ{HkWqh zOsS*2*Iw&e-{t+@%m2N6Sn=@fxs1P)Ym9BS-{db?n=13is~E=1)mHwIRyym;XPKjL zOsSMfp>XOhK8hJ(sx0B-T0SE2TSj2dJDBwe&Zv9Xv{<9(JENLQ`{4(JP6%B=AkQv6 z9W$^BCMGP7)Q0G*W~iGV*YXXfA8Vv_0>@Q`>Mqm?gbF!0!3i|R&N;%chSeZZBv_$UOyOF_ zi|&ki+OE-(21C28OnK*VI1f}hkX<&A?FV(belR->EtJQ&UVJBFr~$GsVot9uz8%Od zsU+>C;tb_F3J7v;5luGG$dr@3?g$$Ib3)lAq&b{nu%ibeXqdif>{lcMqBV>ubio#8 zmha74n6Eg!9YVKj`Gb=K2ctlj3e!yWGmzN3~TC#rF&twGS>caZwY!@%RYB0M29)uE8D(uq3 zGQw-Zi^#xP7j~w&YdcqQ4h=H5kMV^rz(CZ0+Wai7-6->50AFUVXps5kSFBAQtniX1 zW@awDB&6sm*}G$CILGe?xf>O;^taK-jMD8iG|ZIGKyy{!3XOU?^74O zhSqPP5db>uCuX&Km?=1d96>2U+a6RpVf)Nd1y=H`LMn&aNC%tHeMGvdepA?SJ1PPS zGaJd#-9xWf0L^Ci5!xFH{Y;vl!#Au69zZy?a-l6Gy+7?q+)oW*cGxr?H-s`G(nr2}D;`$5$__O~n+SO0%sy<4|mR-5PHG zX132%{)W5y2;229-&xpH_nKl6_yq^&hSqF;aprJP#fea47 z8aBW;X6b&_62F@P3~=d0HoLH-_EnjZ>NBjyNuwfUNJH6GVX;(SM^lXmkik>@8Pv49 zk)iCP)q4Pt2ebDMW)GFmWgo!d`AcuKWl z!R!{axPkucKKlsEomEl>q}g$3X?9u)E84Qw6WI)e440DYeE=bT3i|uhBZYOjl5+aB zNnpHYadC|jLvSsSwKZV-%zij8Dt@$=tM?X*-@#|utO7Aj5dg-G)K~h+Xih4!*_2%) z@`iOIg8kS&*(fCWT$X)UdkYjHzb$@h0>6;XXUMtMFxf|SPqApzdibS@S8QMdw{#@#5#1vIpDpk*HyAMq^`+I>v?sU^b0*M$7)uMU zSW`2Wha3y?XDZi)${^4`R(7m6a?Oe+lPO zXMJH+b2c?O-5Z#-DRioXzsiXjP*o2Tb}wB;G(%>{z)*khhWGOsug6j>IX=a{fi>Kk zExr{V;PM>iNzkWY(o4AoC}rJ1wu4WQsz6)ASwwXUy&uDCv7f*n*a~cbs1hIo1as1} z+hJ0)-o}_ZxdYoBOCiy6D}*Yehs!tdaW&Jx?C%-Kb`55i^=H=xckf`my19wq9r$M> zLz_c0ZM?86H8&Yftb)t@-VLo3+d;7S1+gtMf}wy_J*iau<}aKpezt&^uP^jB)8P@O z=>$O&BiVb^R}E*O=NMK%hbXBGb6tQ)TJjmYakh)1c$$goU3xnW6OIDIz&vRR2?jl0 zLO&H_D;bGDtIw>iHaveYTN-d#$ACsy518IbX$~H}Z7g2l94YGHr1)KV`ij!~;yv}j za(PowWj(a#o2D>lmoU2-k_2wY-|Mm_d9w!9eAo-f=aSKEhucQ(q+Fa0MH?Nl6Tu_U z`CM#A7eb~DLS^_vzZM40@p`7-huj9v@ZugpCfIoha}`ZwD7$MQTYjcWL91@fdd4ZJ zRZ5b(V;jyWEN)>26_s*zI|-gg*A!09)ZI+N>gW&RS0>UGJHGO}&ZqhxF;I4#^kM*$ zj*25O7y7%WhVs+I4e+UHP<{UP^oH52P!qy+4nL`|K#FQYbAX20nNBPhG!7BehL_xX zv#TKLi~vy;%S}A##$x=cdDCBt-uj3dUnA`=C0M~Qm(VK@WgFDZ7joBYjLfr# zZyWiUx2@vi2AbPQbKCg~Ls^AgL%-L*lx;Y{TZhB0SbvCc!87`oRzW~M(FI{`F1`)t z7uOe-im>~6Xx&9zWu3*v7=VxgJ9fS=zniC6NK}?V774B4x7A@}c)($e8iMzrU7)&R z3*rU=e&LZ#JhB}y1CCbiKLgOOUzGQT60rS@ah5R8gM-;2j3;zD)B&J<<1LSuK=@pP zE{4G)&;jc8JQTS$*3xMO21!ltIU{|*KzAaefv;4@8(+ec!NA->4KXkrLDQaqsT4Y! z^xv=GZA6^XH}Ik0-^&<)t~;#}>3$Y}n~jXb&4CIs5bNn2pvU9FT)@v_W-CXvlXr$w zavt;P!UD&vg2`^=;{qn^q=pda+#24nm}?ks!~j5^`mH27P^39bskGm~6wT98#BAi< zMKoqj!+Eg13cbq(W_^k6i4_vj3%#RmF2-^AOm;_acF(BJg@+N>q8-YAI)p=|bfhwR zwg%!YjlPe5OZ>_1Vpxh*U94EY?d-7*M!0NLc#>U6gK}+q3_DS$_ah>r_Y+Iv1ygogoh$^#|BLSHF?)4I@s)b;%h7reg^kY)-<#!i0=6c=ts5?NY z_@vi#6<8YFfa7@Rbhi^)@a{K1p-z^vUe{nb?NYxz=@3mOg_ahyc}> zifzaZ(H&G7NiuL?NRp}PLm=S&W%`U2o9{Fl`B3hmTdoI;Megl5jFDE@YqSO~*y0!M z@gGG`X7xuf6%oP6zP{{cBJEVEk}#ShCP~*|c`9vv*^beO^FSehM>?E)*?WN}vuwfV zj0TebJi)t(Xu&OtPser_%1jFr9~vr8hF06B^-dJ9z&8}`Vc*X>F{2SEv8;DSwwUT;w9mXnXJh1e)KGM%$}%(ZED6I7pu`1Wu}rUjcqVbWhAX9*oQ4 zCwu@{Y~8X$x9VIL(U6LER!i46Q3iCadUal`A&WJ}ni+|JLR;u=l0QtiE4j_r5iAUz zSeaK`w*&*Nr3JY*s5`{Em@dx~m=W0db~fi=Y&H;cpozse=7Z+?^?niJe#2}>iLo4vYO zt{63hcpGklK`m`=HJ-#6F2XaBjHn%(*hWtK^GpWO2QVZMkg&o;Eak>ZD^-CPnZ?*G z+_5h1Xs^r+>;YwA8!Kx>G^lc0Pc~~zp#w)mx)5f*K+GG5;HCk41crO6mQgMHbr)S=M+B2E*~$jL!98DdH%*k{x>&;e4io4ENf{DcJE3s^O1NHS9y7&`+7 zrqsCDZw9fx`Zs2S=hSSQ*f>}$uWD0a{p#n^`!4)jYI70fC=qNvDU&m3o%D$FJG_{i z7H|_zaS{WX;LH0&6Vv3S4l9pT?`t}leqaw9hl-I1fX-sF6MfALM8vD^ zZ3(%+<{Qm6;zozWh9Ql|;S12iNhahh3=y4yCIqLF!3KY@Bk+L=jWTW|0Sq=F`Im$9 zFl3|m8CgS82_*LwvE5Kex5L6KcPyQ7M|DGThaq(<`#_>Qj1-L4)=aoJwT3?q85G+Q zDioYm7$>+vA^ik&9l}nyuao&~=grwkw#eCFb5lnIg~@wBNS}I74frzSgSpB6BwoH5 zWtL2}nFV8P*LpFW&n5S$1P~dwFSgCzF<8WWiGen5U?Mfbnn@on%KgOE46j z)8-O@C?Yud*{oAccBoXoCTl#EO$VjqiP=1<8(;>)tPPA$WoZd}MFK-EVSf=yJF`b4 zf!#1Oq-H2}J0Q}_xv6!4ZP5sJG3T}XoXBrJ=6@%Pr=_%$M|SgroA_RyWXC-d=vJ zungc8tU#RtKzjG)r^ zVRSmWL|P_mnW)r5<)z|(e+1pU_!w@wI=22-9?so#la5w4{w2jfCS48Z@TD#IQKuHx z=ngDw4P5GT@68>z-y6UG8|nTX;Y^-tW?=rnXT~3R;feeO-@5n%pBjJQ^pp7me{t~# zj*UO?%&+DToJkK{*;42NaTLnVyY%Zd4}2tl;J;k_fe+U_@X`E%AEgJbfnM3wVkZmX z*>D?hw`akRHfy_-M*zcSj(>yWKE$;D<0Ca@(H*~@xA{0`5fguHOQG9dLw)pmOU(R# zd!*b{^_f5T8~GFe^5ReYu;z(JKbAl7k@UpfErl)3+1kRBbuB;**lmc1!oGObOOKR$ zio-Yq=*lgXu3TBumG9Oxyz}FE!=FqIPn>eXUw|{mYM!{`U*}JpzR(ki&`v#)6WSfa z`2(Zrfty-TsSB5rh9|AzKN`vQ1t_(c-BJOVKv2*-M1?9g04O2ap6Piq(IugFuhr?| zCT?(h=}qJ*a9DYC1&`eu1Nh`4<-Y3dA3dJ;=ewytds@mb##YM+zrVTJ#cOu`@tW>v zx>(nQirwMZ>>wfN>R7EiNS&?N{RxIcDT9J-004qh0mk5=VTi_ z4UzrIBg54$cYGr6@{j29a=j$o2U+(>Tf-0|0uC9RrVp(nUD@@y z9Z8{vdKn#I`0qM8!&{SX5<`_y1`s%C0A?}^J`5QO+z+q>P=Z& zy^LjniUfKPb~@8@Dc}0WjHJs(*yyiRGclg|WZv@;UUtB|y4I9BjVfhcw)(H3wWvbm ze(jD9q&Of%BpgL8xj0=BjQN3Sql&r@KF_Oho1&#k*s9U7c1G0cmY4YB9)lkArvnHQ zl{+e^fRB^c>?KkRs|Ks@jiGX^WzZXG#C{AJxr9}?7vUpmJdcKqT20;zILk(E>}7h1 z>|c&V(s|y721tS`@mT#4kr#&64M4ZNMy2Z-+C2b#(x1JN-V!42-ZPd9(Nw`K%_2rb zEy59N2m>qIL(iXJ;{8|+>7McFd^-P}>8ytkq)}uy5r6Aq?v|+sGF-GrE*pNck~<*5 zt+80G=NvrrEy@x`BU>wGaUVv&0d76mXVL*3y{9j`KeBn=(U-laui_##ezA`rI$*1m z&0ARPX76Jrw53*{qX;YGDO#Wfu|GCW#)cukvyy#q;CJ&u{2&HVSltRd(FFaejo^L` z9O(csm&s1gRcUb}biIRjT+yd_u#c>95{de=ez`Y_3-NWM6J2;r&3tahg^#bbNAiNRl}|a$HhsG-^Z+6xwGTyo z&!|WgF0fl;?oG$3FZ7U_TfV!x13E_X(LNp-3@Fj#8QnTL8&D`)>6Y^c_0a(WU9sYO z1LoQji?^T1s$PR~$(*_q$|d6}_PQxA)6`M%lLEjIwu1dcY++<|V!_8kiv^+GRTnw| zt1u3M)qSNgLKnd2awrurOCaq8Ka#XXge+XQJXk)*^1LB#TT^<984Xo$vFs_HcW~t&d&Meny2#_d5Rff#&VA;g~ zXIuJp{NBip+e=nie>M;TZWbgx4(jV55#t5oC$zd7!mKFE$eU1>3AH7WnXax2<#U4p zN$?DA>@F{^-rO4@X}d=&FUE0se{c3c_3Ovc6aZjSNdcG`o@ekC83q_wQ@nJYvxpr^ zJA|aI?8dUp*JqA}U zWa0(vFO4l{x7(i1))xm=g3qvkMXY%v*U-3^(jko?rj35A zWfSY-0GGQJhlkFd^uzMf!Luy6?|Kf~DzI0&k0K9_be|?asQvrvMhScsG1^OCF6ZuB zP8w0RgpCA1ffq7#aoFC%;w`y%gLh3(J`8OP5&qln$<^~2|28L>??NzBNz-a(;UGr# zthfvR4+cAhJ@h|iXR(P4TTueR4m49mgfPxTy2MS8M1)|2K(^B%Q^DJn8d{X`+d@SY zu#hp2j2FxW`fJA~wnZ%96?|OCx*FrshsS7pwwWJ#$-aZj3JD$0nlVMW#whKHU<5s> zz5)QASD?zMsCXMfdE##}Cc+yR6bI6N#D4&sC>Fp*LmKJk&vS^XeEPvZ%%|O;XHuw0 z1|li`fA}0b9Oe)AG}O*yn`teer(aaghUml3>c;H~Yhk9j-_w;7> z4G34hlU&mN3~wY$)CaNO2wO)=ki7ExKGRh1gLmPkg-Uf_P;*5zd$R5-V9f>X_J-(n<6?7 zZ9!lVC9nzhaU{3}u0e=wElC%oTSRS}K3E8v%#f)ew-31K?-_Jv-wZTuJQq+C6UYmY z3&1bGn$!-l~$mj^|H<|kiUO}eM z7TU*U6>91%+7DsKD;z3bqZK7^{>a~0-J{qNx0-``x)k06M-p$r;?nz_{9|onim~TV zAPMsUDvUY2;FW_Y$T;!CnSu7eJx_QA-K%^Qy`haPxXMU2Ht{-hF}oZI0d#28os2|e zsTGw0_-9X%4O(%2V~$-;@9;sJ5C9ijLWnN65(o-)?HDrR3&n=t*-$lJFWhb{(<0y} zJI^;nFus<{VR~Zi;Kp1|s*3SA$Fut9E<_}#nl}cizAkpmLfVUUibRI3v8-?s{7rDJ zpY(Qc|6Z~|F7kH5$J9Lwi^AUi_QPkYw(IGy=G*w+5Zn*Pd3_55>enfH6&m4C_NJli z2>XY%J`78^BVp8qTbs<0fx@Q=*(xc6tMa)GLNPj7_6mz)juz`1<69GP+DeyH4QVpQ zzydU87#I|VAu&@3SMIO?qzCBVU7?wQFk3mM;{4<9b~S10a!|GqMD^NNbD*}7JqN zTXjR(clq~y{=LG#f8gJ56nyhBm;k&*zHTlX{DHsLOTw!R)9K)wngF5zSaMqFi%=cD zJbaq$I~Im0M)vJ??zlWM9y;&{lYz=sCV+W?cIa6L7NRB9w3*s~*dCV`|U{ zTiA$wtcBpx>miX|9^Dnfo1VNaI*)()F`A53nx`#w0?8uLJr>W(|NAXD1L>K~+RdzN zAIkc;9PFj>9G4FUL*v4g&`?}%#(f%DROJ6*cgN$#ADfoWeS5e}EF+AWEoM$wY5|UQ z1s3Iy_R<{lrwO|@N3w_20)0^RF)y;_!U6`RMu+{lKD@KEjMmKauZ?uFLqwS*Y^ZYA z1`KN!$VmKWFtdh?c3O^If+dUTKwbs@RG8Ra7VJ8Hy@g)r04E}bAObGHzW^o(GsFnd z(n9bs9M(pj{RD;D415~WcDM$yJCwbim-T1=&d}j!>-gcT5aieS_f7tNn|~7P-|+9h z^6ww&j%M#K9L=8K-^cj(6#t&)-{<)ERsMaWa4!2({{006%?R2{g|}ejvKtva%d-G# z(4s>sE~AUC>vepkmv0~}?eV%O71E$@AJ5X+ARMIYD%M8G47p;6(E z$?V3V>~*}KRbal?@%yfrw?kwL4rRB7Ez9QH4KeNKN47X2TlYaSF5lUp1U4c4VT){s z=Xg2gFLP}Hn^5ZuqINT(k-w?~19kw{IUVSNKdz+#EH|Q5coV7(%ZKer2W(ZctG?{T zpYpB_BWuH|Ux&MT$n4%d;iiWi-{^$6Hd*lx-aC$yzx>S#Ut3aa4I7(CpQ&YmkG{gx zREO!npXRr;N5QYoP)FA@bwYl6Jq<@N8$^R%U&<8FefSc%AI{-auf`nwY5LgUa)g+& ze*_zv3B4j$)#x5q5@alt5~!WLa&*P5(AI7)b4NSUS8$|e(o;3M-Pouv$kFewO$ zxKA`{yd{RxZ+4`HfTqbdsSzV&{wapXJzy#tw-q;V)ew1btTNVy;#mN+#`xU|I#K=M`1lW(`2!g^m7*l4tG_HQE^`4W=>z?*fVf<)Rj`NgW$UXh+oV6M z^m(bd9l&0_It@$1{Uf78eM9BmVMBux2t5sbktFb5Hp9Ja2E(Abp$ySae!4P#iXFJ( zF%$q8lH1jwX%%OD&&2f|EDh@PJf&_~SJ-J{;;9<`FylLUXTF9vZ%Vz%*Le6@R%}dY zT>WcNsc?mPyCDvyl?pdDvs=+(A{#Y&r>8;i)y+7o_;9kEx0b$))=o=Avs0Yt1n(yd zY*KM#+?n{jzsO%d#_LJE+S8mpe2hpVaHy&146TJjSgbr(8Xg)c_Y4g>LHfL%AoT6( z1Q~s>93iP4w>9Qvz7)^5OD%o5mk*druVaJvnt2aY#RsgR9oaROXVdaDq{p4uTUgqR#I|(Z{SJ=a4Cc%M0L`t;Q6{ z4ripli7+c;sTe&kK9UOY0NosGc^R`$r*;GwzLrJV$~9bxsXwdZ zEB)D1?GKZAY~o~AI`Fme4xBz)=|DsAdD!cedMnt#PMZa0MbWveXt_+RHU@O$)vMEKQk ziwLJemn9a_roFHcZbrD6He9glDtmr;yn)}ZZD40`znTUxcrMt$&cDff@Oc_&vj>f# zv#P)~j>xH(kWv4N|U{xAN6fb%V!vlp#MTlA|Ph@RRz|();-zGy*#0*|=ZY^`| zo;SN(TbP=c?PM63QEqH3_CMWer+?<>FQzXjs|Xg0GfaLWYkh@#5+-}mduIRYMV_BZ zm4zB4^}+v=&(zDzRC~-+s_5A|B;hMJpl%{q@5x7=VyC{4*+O@%gU8vfpR z!+%f1Y=cAbPzMvN0*1?vn!}T6ssoE9M4WoezO04n#xy!bQ(X^o0#XvDX>6b7{KN)k zmJ@CQXfoB>OoejNs$clqd~6>EdY}twIb?wKDBx4U`f7T-^9T9uzs~I?r^2{Gs})*@ zG^2Vl^1n4(_zGK>$aZr%CVbQorH*$8SGi~W+ba|QFI)KI_;IT#6Zw7Bk2p*Bf$Wa| z_Nogcs8nyR`G^;;dbQ>w1qUWvO>gGv-ac!2Re!_7QT_O;-~Ru(@V~wXKWUt4+G=L| zXZ!f`J+=z+!P)FW_>l}N@cHY;R|e9mE>e6Jc6bM$kxv4}R7(*_%-FQ$A+Wes*kP5c}FNsTTn{rJ`E_^O5d zIWJUr%Y>(#0fVSEgq*mO*z?K-sHFPwR_*^pSEMGrip2bF9ZhVG%IUc8oDr=J^l4Ba z=C+#)8@YfbdO3bO+eq{W7xN|S)6+E{tMpjI=Kkp)JJ5~^7OC4`)e&a=W6rHV30mA# zzaQ~JJ(m#hp)*GYt-(n1D$3Gy^r{w=QuJvcv`)qtAiy4Uf%!-zz7a9tBs<_oKvh6}${*HrksLQ}b~zi>JK zjsFq-Uv3)nKjo&;{`h&Mzpx)~46T(<7Irp`4D^@J^^c4dexS}bmU}tgxd!O z2zMjI5k#i#hWBvU`g^&PaQ3D(T9xEX_2)wLj<;RY`_z>A>4oZ4K zMsu@O{+FX+EUY@Y^=Z#5KB${6;+}vE2@tBDiBMmclI0qTUuKr;IT67bME}F3x`b#) z!65(_GbVsw;@g+9x`(Rh|LO7P|2Lj*RRm{|!eAIXep;(5TX~ttcN4b^AT+qT2^D?@ zYCWA*HAwHnn}&w3y;M{ENV|+i$*Q6}e`o0nGyzJ%N`ndtIgw36m^H``xkgaLp=_?T zro_P;&7e6|y)XSt$%I!_v6@pj3KxxJX`nY$8Zx4-^3n3|4dr!2j=#eDaZYOCTEdqO z&I-LLo~ZVptB$UbcBWgC&(e!T+|wiVn!Nk-D&3z&_bIer83CQBdANy(E!Rm-0aY00 z&>)dfT&q;`hHO*pO=Kj2>4CH#Bq`q6SxEC1m}sYY3Y|;Y6DQzjc+G`gef~9ZNX`DA zwj&!;)@4~6FMu#V@u(}|BQS}KDpM~bBtODr7`3WDwc}mRx zYKya#R~>?28DM&VvTgBzr#sXoSMO3R{p3LK(x^ zgdY^hG{P%?Q>0T*X4}lLph-#`csi@&{FCDGchuwx-7z!o#D7kmpw17SAY$G82T-vK zb%I&s^(0mvr)e{43L7=D-f9u{~WM!da z3_23oX96Gqh|qoO0Dw;zAGnfL@hjOr4Wb>G*;YajU>ritgb6eXQ3!XN&V!5J%uNhqqbeG{pEZ7w5=Z6hNP(edaVk_| z&9T^&qlCa+E$gKKG^YjDgwRg#VL?)=@`AqMJ(PyRuu!Gu)P4`StPJ zr@us(83IvFE}4niV_vjeHV3$Y5iGjMXkWw#K; z2iswbCXHndJ5fyrLZtEs7jc&FK;vV&qLd4k*VPeI37aCa4TQ-3o1OK*0Qp4=9j^Cz zAB#*-E*NiR#Ew8O6&qH>zE9;|AtSabL_Ez(1IYd;0MQZq-aAyE8pxb7Yw}oZuvS1R zWJKCytuQ8jTgrdcypKoh%PNxOfL({fy**|{6v}Zf;~lcGWk{A`!>)HwHr1TA=TQaB z;EK#Orncd)4Ct6^kqEaR1=S)AATRlOfft*pwu-jXTN%R4A-cYtu3N&Zfxso*?XAax8Bp+|!Mc{F+dxD!d6~)9E(0-djJ=DwRJg1o+KqrRw4s6Q+Wu@G z>5N9?o`@eWB@#qQ@NCv~He!^hyJ5YqjuW(I8_x!5uH+4^$ma8YGN|chs%!SgaU45` zv%{Phgj0@pskaf{bauR@RG0=*GmF)x&B5TqmJ%+B^OmQ0S78};O>u!y#4#G&0=+Eb zPQEcu6iYE3RMtpsw3pNtXR~`LE3%S#(x31=F9`fyy7PV14TK8KoiRO$<<^Je0Fo;d z5uB@!)p{%zhzW3?s4A*|LEkV4idIoz0DnI21&%|2s!(uv-O97Ly_cljtDDqN{Hg*)OQ8=5)APb`aW|CSl+8E< z|BTIqzi2_|jqX%Z4d-$hU6PH6uDpWMQ53=*F+%{sfmXamPD6<0u<;%Q^DX4NQl|Ck ziBEF3mAjg_!9r8Sm6Ib&NTL#E&4>XkIFXRcE0}`YM^EbVeU(LgPVaAF}e!%!ii9oSQ1mcn|Z`aR8k3Zf^RDg+>Nar z*eWfYMQ!*qcoRjQjIA>npFM$-kVcfZOK#2Pq)JmWC=jEgPS@HM{ADTkKpoy@k$e(_ zpDy)}3=I@EH;op)g! z{(i44@(N~aq~r2B-CNcZjgg3iyZy#(hAQ=$-MSP)Aa1RVj?RA(p*^NGxV-ec+0t8i zTuFT!I4+q??L<}6G%m!3w64vNkL8-yN1VePR0<6+lT%t_qH!l)B@S>MPtB9961RUg z>-o*}A$QsBBI6uyeO63QBCDR+*7RDzhWj7=fyH(SNH%-b~RXo|4%egF!CL z+MlLNn7`KcNSV#BhwgrvL=?+_cFi3oL5l&hFDdfWPg{5K%mahjy9Tqj1;AjfB9?v((q*UnVzvB&URlQim z_!kzgY=WaEMZxrIS>}q;r=z_&I5%w!!Xhe(c`~fllyW2i--Ht!5mqAu*w0+w$Zvq9 zcSlv)iA%SH8;O;J@m#|iVw-Zi%f$kuxlY`gNk1HYm=EQ2;)#bZA{}sKt>D5u2D!fU zH5iuB)z4-N4E8&hq5C6(NXx0-vw?dofrf;A5x@J0wa6hsxWbxju4i77dmnX`aL8Up ztJEP)0=_!YYnc&C2W(}z5j?{d(ON;JL1%eB!)~R8t);?MtvpOnc?nK|8o}&rCOi7P zOUsLGBMb#9bM+Q-|850!=fnput2}5mqNOZ2Qjrju)ePE#YYy7MU(S#=(bPP1-gxa3 z@mg%~D|mcyv{<+%vij-EDtORtZbqn}MH~hd0Mjdcq|O45tDcU)33mKV5k7H{lRr2D zgkvBow{4BPXu-XBh!bE*1}Lm0>X@>v-cmST*95n)sme{)1?(`dFkpp&@}jIgO*Ct* zpsECEUpMMn5Ug2eFQ7 z^iv<6n;xbB5L`nPYR(BZ<%kh#TqDSaSEpK3R45zG_KjqFHGp`-{9!`Co+n#!FdIM# z(OM99hF8yr7t;isR>`dLNZHkS)CV5S?i|b>=rsxD?Hp)BOi6GskQJ)U-k*x&E2rj_ z*9PKEMTe{71eX2q&QNvvZ%+wR*A+&o>;V#o*>NyNk9n$Smrfn71Uh60znBj@IO^>K zI{?$e5U@$!P%3|ccUsU6dS6dt_#a^GT@;8Wv`AJ=F%P%d2y!|G>Y)rcZ;lBqoy{Q4@s#$#8UAS(yeeZ7@s2URwJZ9U|{cW9g|Xmp~*zIl@+pnJfZAEYT<%T}Zkze4eu%AOhwY z(_g^6!qiz!R%bD*(wen&IrmQJy&wJDgmDYte34!JEj%pgz}Vb~}eZ z`?xVvS1~|D+^u9ncuCEsk4tDktk#5=aB$FtubhpBNN707x?WFsF-e^?dFM%+Q(H$|F#QWrL^@0?&a#$)nUN?Jb(iS)f+J2ym|xe z5>R#nR}m6-5wy)5$w&8MpAb7X>VHWb+C7%78qMxH^HYD{Svp%?1DP%D!YghfUMbB0 z%(AnFSz4FV2z^D61{wyY3Ao$76oL$~YdTWv*=&};s^WK3h+lcE02M0j?h50A@1xRI z^qoyl6I&P@XBkV0eBo9!K7yX$fdV(?vfFz0UJqI)v>pS(iV8k^RoQftDl)eK(p@3Td>(tUBf z+f33H!I@5cv@?*ZRcVTtk!LAz1Nwgbtu<)gn%i?o>pz3$Q4X1`soPl6o0)mbH5y}u zwso$GE)l0@eIMYyRHe%rgB~9ONF0^yQanGV*{X_?q{FHkKN7X300p+wK`oEL3X}W5QwyrW(Cw!z$(&^jb+(y$CY&sFF?-Tpc1OfSd>&2VWt;TPMm< ze$(P(@e9t*tTRC$D!=V`xKxUGfYZFUN8SOg5`npzflKpj#ZD(A|F+E1{i4eY480_) zh>T-*3b|<8gZA6>Fj#fDop|zn4ANzNKFltfM$Jp8h&e~p_|v?1`sUJA%n@hXCp2@q z?SKd^Xw6}6!n`tA>AV}r_A9-_?3oS-F>qHnVr$kQ^MUhkyi# zgYZ)YHo_&*)-fJ4@mk#xfAUULRF0J2)CS{&#jKjo*r(qn8L^PB&gc7xWcQ=KCe$p(*T2PmkwyqRT@Rf`^_b0|$WvV8FM~ zf2)x;^>V+315i)d$5MyER7RG0buLpfpHt{DI8b(Vvy!)nx=q0hS~L-fqZK_f$`h_& zJqrV`9`QgWOKZ4BN?R9z^!+B5 zdB@W=jiBwVjqDVjl~bCU5-+D2)gazZ{>kOIb!kQ{x`Spsyk!B+s8V3}c_cyQ-c6DE zWA1#q*UF_r96yq!5uE3Qm@p9DgU}8QNW%bZX6oI#x_dE5+M!Z`7YKrHy2L8?q*;~M zC+{vAL$X`X#j8o;vO3XAsBmjwC#I~Rp z0E|<5f;L?WcLxLuf+FbkI3v|FS&QyZdQ(oXUk%5`T-R6d2>*#pFrQY}RPqX(_CMZ^PVqiNR^ z;HjM3@Zf#pqp5g}-3N#nVjA_`Iq8*678JxJF*zi_Fhk zY1XjEvO{ioPEugvV0RgcWb(i0L(lTG`$xwge3}P0)|&@y;Lloe^m{69Dv(F%da6&B z;-m#@MEEg0R^NEncxKemx8xl;H!U4TJA(~J+Cw+o)~#wrkOZ27xM!2eWj2S=)|Co2 zlOD*M_`7K0B?uSg;$m$W0a8uzt;T{MA8+Ha>2=u>13w*jtg}aJ06mAp-tbgU^}56# znPv|xV5?Q5mm5;p>COl9F8wmiH5h7|F)Z$MVk#d&p|*KY35Mo{oB7^&GatQpGj{0` z;Dv^ZHS_3O^WGdAZ)Pm@#uSG5Xwt|fuUx#9j<@Bl{N8vg=a1m_#1F3-%;)H941;Q3Ch;S2!&PnnW2)0JoQYGhMUwx@ssU)Uc;!&N^h{IPQb%Yj6(4qQA4OE&ao(#cOOuasHV>KvO>!A-6i;HH=WL|> zp!VZO^4|X$y>Cjv(sUCpX!UbmZW|puH47JcY)!7Uacv>jI1#7zvSf*fG+w)=0RyP? zRiv?akGLmp4(h<-P0X|>%+o`gNO^XBh02~f{ZQV!zoB=W-$oFZ@q65gn4=EKR0dW) zT4f6z@5t}}A@`Hvb#)6NHYwv!8Q(=|A;bmxHtZ3A3lA`%D4yRUURv0fPB-Fei<54^ zkV+*^L-bP)6hw56n&h-Q4qmyjC%c8?nMSg^2gH^h>d77+$lg~s!huNxo@L~bGG<53 z{A(n!*aEh)$cmIfUG5g%ShZZNu8yJE0kwUNXU=5rR)c!Hj=TRQjeR&8?9HC6JCplV ze*=H&Z}EME7k!3*pXU2#`Ti`Q|A_lPk9XlKd>`fWi}+n%;@^+?_c*!6?S;3RF;;jB z2bG5^`^p1_ZFN=U^wD?cv-sf|rjwXG^*AftU*XPV?+|MApB~7){x7^I@5^t~ zm*$ABsyIBC=5GBButL=UvY3e!iO@u#d8azixg~K{1C}~LbN<*3Qsp^6d(ULI^k#1w z^$ZCjJ}Qr96x@hOdEtQ?WAMNuc}G4=N2b@8pQqnw8IE-w1Wfv7ob)(_G|ZW?1;}+^ z)2(DC%p0Hz6z*Ay;$x_RmotHLRW_XxL)!$cjfbp~@}&3X@B0ex%d^S4F{Yej=r=_$ z7&D_Tq@!;IB7HRjW6G)gev@^X@h2uyZr1k^!IvESgF@ZOQLcK7_$e!TeFG5%!h02dndh6p=D!)IQ|9uqts->Igne$32 zhVG>(=X-ej&4I!;m{R;fWZ{`U=-a32=+qzCH@P+%xFGXYVFN z)c7UJtV7N~)OzZPLqJDL7{Ra9cKE>Kd53>g+u?h%r<|nX5HJ~TJS6649#`);Q zjs;)Ff)nnDIzvIncHT$KK2bwd_*~2{PvRHE3$(cr0x*i=P<~(#kziU-=pAv$GUyw= zU6K_EqlcJ9LlUBk$E)+CeZD--P2&8uDeT-5djry@qRsSyFbN|su!^g`{N}=zT)#N* z(R>p>*%X=YH@2|nJjTbM*aQ}t*#ew~c}>FCD)<%W;OCi(+QybfN9R z$=#b>k7~>?U@tp@e;{k<)&kEz^I$cmL}X<>nb#CzZg-GTQJn^FdRV0gWJjPm<34J**nIwfH z&8C}XmUAo6ooHDgiH%1=gFW&gFf$~>^?lh5xRf}J6@M*-erP$)Yrg|dSb8#ypN-5; zL;?V5?Fj~H;b;p132DzPY_d`%V^KqL-#8D6gs6Dvfx}txt^L`QA_1eW3CaZp{?cM} zmHq%qA%qO09cu$mF5VlQG-O7h%21+rFuOa>Fnt^U9mtNN7+IV5H~GixWrb^CyRJ5| z?6i!{r{UF{;DYb{X1)pjl1)&LV%y4XvD1_}3K!$bUv&xGeSRtr*aJW@#!Zh0TW5z( zL(7VANwv=BBMOG-*PSxkQu!$~rI%n9(~&)$@Ex>W!LsBN@d)BEaluV!#bXg@Fpv$7 zWe@j;+IOsOEc=Dt>=Shm-Lt5G|2zNwl52m&h|hYFJr6PNq-X@wy%fg6j_nC?H%(FY zd^Y*7v*~|TeF?#}c-r{yb|!WxyK5l3w>NvwK=vrw zC&#^>Faw;3yzAWq*(2(=W7)@O*}&D~ylI5L&+zYef2KE0eI++1Vn64~ zBCJzRsf9|MD*mF?)bt>;jzh83W7vcZL_e~z)k$!6K0$AcHZVgjZ1{AFF(XN=Q2U_IOlkM6}86!AeUp;@#_beK-)z}0>}=8dR%-T^E3tb=KVt6J#P zKt@;=lgFy>A2q%Qmi_t&8CLE%+vtXLWLHEG9E$p>jHZ!kpJfnURaNrHDMLHDv0l}Z zjCT>hO2-gQyo;T=vU1z%%5Ary4!wbw0Smn~R4-PDN*P2x9}IS$nUVs`@sIbF2dkLN z@e}zPyuT%IxHa5s;hI#I9E(ZJSic+P6Vv&J31ssidmT9}Pyj7D-Yt&;jJ*H=-Skf7 zg2f6^1}eu0RPCSxPv@`wD6b`}>E;$*R7UfI*fgoPz?UM>0FI3oIlXX4Q}+5;SvQDz zJF~EeEF*PyN?>SV3sZNOWpe+nVC4yg4fADJNas~*shTybV3Wfc7aQ3HI)7(+;E|@x zjr7`dtlKN75G2TSedj(hZz~?0qtE31{xtn=0Vj|EU=|T}c^Og+@u^UXELGjSvk<0w zrF(ay^KGoTr%oyDZe6cAs|L)poFmg>nn|@Oys6$@sp?*y-GGzVcH!^)^Snb>S>lSAI{_wuswtw&s^0)p6 z-g--Y;R~3*b3M8otb^@auW67Dof0&zr$fdiXwc(VM%6GxTR4T_Pv*li;94Nd`OTp2 z=i@h6FuzHwDlxEetO=`X5aOwWm&Cy7rVKnEfgQ{a7U}BfzR@N=vILVZJ>t>gjf_vn z9NZ{$ox2Gn3*%TLn7|*5*W}AB+{aOJhMcGb(k0%arXzzw%F=%!Bdu+EBMb3>9(i4+ zoo1y|KAvF#PDLjmmU=!aNBLMOc$#MP*X}D1RVniH=kh82Tc(t=;Hfmi-kYmp%{n#* zZBPVVY-4a3`4yOI%&MB|q?G9(O9pPdn91ikno4mhNKj zK+}L=Lisv3EIyYwl9~2=R138|`{NBY;fwG)O?N#Sd!w+R7b*YDu5%>}z0ksNhUk|?&-SCMaUOs&;8b)HlX3|+u%Mzi zU*~uZbUFJs8zJHLS`vme%o#L|dkn`gUc&GYPn^M4W6$FVvc#+G!lM^Vu;6MJ{V@NBOd!W7%=Y5<4PK=ZxOUvUfnMcgJE-yq1C&Y1y^sm7vg{xw)6| zadNK<@KR*~w3=c8D!~j3xr6LT>t#+YPA*UnQM#Y3!!6nTH4e9q(|NCcd1hUCce0MEvm1!nz3W_MkYv z$+aa!6%KF*&tKMALm@$+ZL6y;MEQ?039Pgs{d#wnQI3Ya4GHnAbX`j_H8&A+Rk_K1 zz+%GM5?$5YgvMXFNoL#;xx25ri3{8`m8?L7RdNCS$9vBeKQ$9X&B!R}kFn6%OW;N9 z4du~X=+1Ksh_lS{;YOlJOmH1N>zmkGboj@LMmVkGS9{U!BrXmOqNfG zqs68uYK7?-Ap^Nf=7q23OZO#~uD;&G9%I2OYKDw>KIke!8iEkRCar{PP(nS}LrwVC zALlK7jg~sxd(@BcDhx{vYi)BO7)j+SroZz_RK4hvNhA1+==!J_#PrTmw? z^63mkHp2eLp=O|=fh$ZJ5KX+^G{HU;Q;7+vV-XP*p? z`HjR_=C_?jm4Y~K7a*;?lU%nAsEC|+Gn!omIMuHo^i6%)I|M@p@e~bakK%%Sa}StE zR4p{tD0)o(EtUz7;D3th!>@~Mx|$=?%yQJBgcZ7-wcNy;_r%d)*qSinxuwhK0@bPc zP07BL`ox?C00*(6x^<}$n{l26${+?rBTmP3+SB;S(Y&8czZW}z>eBcQ&SaPMWDlI* zQB*!qoKAYKX3$PP5j)lJm)%i(o#HAK@ta)QY0X$C9eAAmL)*J?4in~0m8LV<)}HL1 z^BcytrC}2VgaOEH)Xk54n0vfdHc`Bv;Y<`wFu;T%x)h3o2vAbV2@o=50NWFDi41m3 zdK#s=$+ROprPg6ULskBycGQ4(27#p-5NrV&=}91=Qa9M08bKEy@%po;j1p8FhafT@ z3)c-YMBqwGbr!E6o~(=hiKli)aQtjS0$I2&FOWL`^a;Ag0jKKGP*-919NMU8&&9V= zDOXrdv=Z66g*$dKzbFK|>95pFMaxvGn7CB+f3`w3jeGlm$1s6qPDe6~TSwLMrSLRD zIjM#W0qpAYT&J5j(Ta17$mPKA881vRlPW^bQ%2yrW@Zh|2c&~Dr-%+G(<8k9a|rij z<|#C|G&!Th-c-*vGYeM0fErrSspkNYp!qTT%8Q+2B2Oq*#2=(kPWXAZru-r#XzQ59 zyYqdRNP#Ag_-G*Dj|AFEHHWC#Lkw)Qo(RREg$-yu&Z@dR&S%*Jkg}Ig1LscacfF}U zJ2Wam-sFY*2ebE}$DpMZR&Y)+g@mp6+yZ`Lb2UV;EQnwRy%s{&aby8n0?q&~Sl(2* zP~#&-O>)(!M{72ud!*@ht4qcc{=8)brm_1xOBty7N@K=iteF(e&HpUde>?Od)iEgG(dl146(`Fi=ST(@nc91oje#8dpSUeL}ro{*zqr{m$&b8#t~~4KZV{OvfTq zhAlc;m0=+~*?{!Kl?)k{twlUxKAB<%psVB4DcO@$x-%?>`Zn^n-{?w&Tz=YGuxltF zrEr88?8aTik}=^yE0)RL9_lGo<54ytgGTW-S203p*)Y}*Q0ZnaTNtn**%_odQB`>6 zPxEnpk#Q0-dA-TUWoyM8$;yT*nhPypy@bK5@};A7GZi=#UeFL{#p)o|2Z}XBzXH4< zXk$}Q8M`7Z25{KrsJ0rzc;v1mIX|2eBow}xHNiMHIf@O{m3(A`h8;YC9Os`u{be#6bdzou7?ec7hHSiWw zeMOR(3D7QeJRynHT|A?H<_;+}h_M<1nvD04-dzJHeLG*SAFy0AwUyf+V+mMeQhlg0 zOoh)lsFZYKRPbeRc$qkKh(U;_3-SzFOx7{N5w%N8XCA|vOzEveD{2QzP)kr3l1dtG zA@tdHaeD5F0|I&1RiiSzopJ2NLC$3wQazzo+hA|@&H*ZG3=v}1OQ~+FYXqe$*2D%; z*4Bm=M2F}?BZO&41^C-iNGYMtD&iHZwPw@1W!UlO?O_=pap3u3EqDBRK2g8eR+rsi z{Dt<>wxgK)mUN47FX*{?MjMex(>xBubPrWX%PhxGwMadfz;Kcjy&0E} zQ^omguo|=3)t=mp1pKU~HWTlw4nv?%j59js`Q;iT%%XsTR$x{GZ|0$ zaykQNMg3dFe%j1)Y%St=aOsAM!y_s5&K!Q2GE93pY0;^~-(mgwB3?%7``2Jgi(_Y# zsBh3%U-&K^`gC ztNMx7`B$Hdridx=*oX8L3ePxFp*|h)0704u(#6ks%WeoS71CHOGL=U6Q8up&2W(=( zGD$U2@jBVWDz^qNxXXN}H_^<4D2)U3YAtL^Xm*z7{XS;# zWEe?$s(SehOTt;BU(TA9LOHg{^(0e3`$s{DgA`WqL!QRRW z@w3c5z6fgf@B>v1(H5a^-9^)2*;K%f6LBk-$gs8w*5mvx)tzE4`HQ!U8NPzf?xi9r z4cmVW)A_{*oXH?2w7{Ph`F;+S#Lfg`|}x@arXRy@0;-Q z*A3`KZ5U+uv+07=q28m1VIxQt^uzQWK=g2vZg*pf7g*!SIRY}8MoKWR#G`Vc z747W}{Ir*UQ2sBHXuP8R$AhL)~AwXs{B**laEQ?OeKMdi!ZHK>BAJjtb;Buqw zK--)cTYQ@a=Naa*INf@G?xIv*0w`X|s!Rt!U^0YER8=P96mDU2y7i~AKI$b2w@-Pa z{$4UQQ^(PI8U$qtbiK+e!k@xT?puv%mcd#ahD^~8A*)MUS+Q7v6lGtHANp5!)x;;i z{DYkDe}9gJ<_jN!b1i4>wh>5JI$`z+kQW|y7^E0XQjecwkZM;luLTylCw~Zh1Rpd0 z4n#ONI^^@1of?>q0F*7aP4aA@TS94DLM|)=#P=XIFk!Tpc`QX2BdFzP7^hFN$JiUB zRO3xx@t_}bJ(*i|&kCQw&&KY70lE-YU&2cOu^|_sDfmQ6mU0Li0CLu`-!Ot90IK$& zWMSQey6(Uo8~SO-XttaHGHRN|^VMWov;p=n;z6xp3y)sTiMS948sl~3;X34>zO_aohDZC0q8qCgAu0ZPAS76U( z_OhI?5%I{0BNiD}FVq8gn8oFGIoiD;Cz79ACXJxzKuUa#JI}BmpM~4vj~d{C=VJvJ zAms3|J8N0kKjZ`bYX;g>U%1V2I`aT5&#~3xD1^n4Col^_6Hi(i=Bx^phcaN)CxuEc zkU%XO7OpnkGM-Z-xu=;xm5f${a(TZAO^MM4|8P(@TXyHQ4*iL$#b z1cssb4p2!s<5BP5sv{e3n)~Kk5q;NAUAF0KZ zeI%P{stslkK8Nv(lgkK)kHq{fIwuvdCwBda5Xe=te?;i`5p=Nx7Ya_QnsZ$^;P_>j^8^I*?NVqfhPOM_4+b*CtrjFn=ThZEK z8XK6#&Wdoti>x|?!&qT5BSlPz>L@kQ(|H5=4VXxkG@u_mQrMWsF7Lb~@9#%A8>zWo za!p}6TKA*^v&cGo{Kl>#%phg*gIlDNXvB!a7SDf@=0y|O-#pCBC7eqV6e>9jZ{gz@ zAJv-jk2P1dAaOYn8I*7&J}R=O;yi@YRwDvlDCd3uG<{!CZ#cS!y9Wa?bher7%@B6> zH9QTDxPao}nyTl;4egwqH}wonK{WRfg#~HJxIjCof&*7>mNT;`s413t)IZC1HjiEY z&(-$$h_)&pk?ruSGB(8~fWC=x;37g=eencg1Pgs@b>7xY$s7ARjph6==1V1< zVDk>=pDny5u$2^&$i?-rzXdt_%hOm+kGJ?OTAW`0BPK3NWwYpW`>k8Q8Bm3|mLMX9 zLbIVo=#PQR0t>_3x53iTG%LPm)ZC~rQ7z#=HShFydBysAPNd5g=&@u=a8hk-29;yQ z+gvEC@&it9An+=CEx$-m7kKAmI*%wGKOHZ4s(?$84{l;}?ayX`wUB)hKXDs{{;9Db zMI|2LnYO;9T6;1f1Sm~L#mOhZ_)uA3fyA0&efLFvNI!rii>)j+w3jG1BZ!vc55Ne+ z#EREDF`|%DS;!=_j=P}oyLG# zH-cgTt5^AruCRfszqza`gg6?P4S_vxKIsAQmyc-=TmwivplLcVs51!92^JXT&>zQ? z(v2`3n8xE02)x8N){)UeOKj~;l)UO4%C3gG(XcKjLWB*3wu4DQUX#M*|NMn=M>Q;J zO>>0|mw5{6lzNP0lb(Cvka8J@Lj{3)jx%5fx&;WB!4C%G3GHD z1%B>5S?(V=NAa-!A&&4EE*~B4?>{mX$0!?^o;aQdkZT^Oc z=sPfe`BCgrSB3%k6^f*i4tJ-Fz*Yft0lIXZ#nY1*2=?{4+DV7!+=H@X*b*y?A z%g*t;e#BiXVe=YeZRH-?4z0AmDybeFzxD5a%B`ozZ+#T`a0N-;%{V~;9k58j$pe^2 zk9v_;u(Le?l^D|h_mMn?^o3=4=RcSlV5uiGa24>=`3?NIrh)FffnWLA8~8y@1IzOU zK1u`ILd0p2FT=psq1XmHs_p$>jX!&IMgHu^f2L=@H~#E_mHD%uNY7&Q$9sivlXz5( z$_N2%)8SFuhZo1&*|{oj$8$D+djDS-e|Az&{_G#5XQ>VmeXv4i3|60aC*LLDC@C8i5Yq5Q@t> z1o0MrMO{E_8Jety0rm$ZOkoF@s^2OK{E6CAT6eC?hyH&s^hFVWcQYg18^UaS+!iY9 zCeTz{VN<;6Dkeb1xXCCdM6jNAk8WjP>-ngB+(yg=p;b7IQC7C0(q7I*TIK?C11GRs zRX-$?$CmodN5(7ToL--I?)!9Z8e1LBDr~Tdy2a@#akO!D$4}ajKk+h8+`!SFdteTi zxq?)!fqgl<735?ZmsHTP6O4uz)C3Gsu{K(26-p;eHzJl89bzex0{Nv9vs-KXJ~RH_ ze~9*5l0RsY3L`G(`#8`6f)3vSHUWn}g z1^Z)Y&U*^|d>V?N!%*S*Q(P&!^62J#ivNHqo>~vaX6}L6FA|ix;A)yk-P!J%R)4rB ze!yGLBtS?^f~c&Mz#cJz&WUDRgd5IdTxx*mU|neAJ;FU6bFhtTyOF6X!yeG)3>Y7! z3CXFfj~fFOXCB1K1UR-*riBvreBJN(mdZfp714>7se87k1mkJe&e7_{+zy)A2U6^u z>o?kFy=gye4E-W~V$)CMlES+(O)qTCTjy-@IrT95RDlb{5)Rqpc}Dydmbs92x&7zR zE(a*5KS8@x&Bf*{y+DU50kgk9uFE{SEAQDi(E{Rd*X*(KYINKI2Ki4^atF$z=XYbG zlKbFQ`D?!uujObR6N3#fOLJm?^bF7#-FKq-2JGRJu|mP(roPcK2V@V9lt&6THk~^< z?1v>y=crx4hm{kL+1q@PWA@%xY$^|)L@_P*kJ2Pc?2ZZN?2U|aa>37V&K?XTvH;pIEBmTb_F{eo%51Pij1WcKxbX*t2U?M>>s!S|{lxY)cG8UJj zn1Dtk)N?2GVJy4QSy2Nwi{WfSqBOAC)Pg?~592h;2;3(qV@d^{y(#a;Kc@9w!$vhi zKb?Bq1mG>Tn=~;NSz@|;HD3d;f-{-V7Xcu^70Yf#hLUDt0@h*DDRR(a=gs+RJl}kA zJwRF|nwSBDH{;F)lGxHOvI^xpXjfR6z}}nN!?)5$V&5s2>K?B`si()={>{|3$4${j zzqb0T+g@7wb9BoQ0-|9;DRHft2Tk|>6(GAR4n1`dI6Ez`Ld8U-a-M~7S&RDiA<+2i| zew^O~#%`qz8B+yHWMybHEBz{Q8u@C!aBDuMFEb`epghau;{6Hn4H!md1*sdm`!bT` zuOs-Fpw?Iqd#;%Ry1j(#E3m=J4DxL<-=@~WM@Refw|s-QY*7fTIEXS-6?))Ltno|& zjL0G;ga?_*pc$?-mh3evYInbsKczH? zeDHJ`Va^`*#*@e;w8w}poX&6Kd&B5XBcoOxC9tk3+a9YtD^`-w1++>-s#qK2gIoQG zY@PgMw#-As47Hg-Dvv6L_@=c?!JzW_399gEpL{R(K;M0MwBEVol*?#djGZRN2LMRM}P~Gi>K;^R;+C z0=}_cnBNCcm(X|GVI4_ufw&iXTA0I8x(Y&yIm4SkS{Fbrp-3`4OoZWG883gDEB1M(OnfCTRF+*o1hgRPbb+R8wTTl=>!|(LG>h?PjJKV$wD7uL#qX; zvs>YT92w%2)+g!^*yjeyXT|`xI^#H;0S-Lm*O38EeC2f3a&O@cHD|R#FQ_W`Pdk{K z=U$0rg%8s44p_fM<%lPOt<*P zyoj&xFy6{n&)4Cz5LGL#TYCfx0hT4{TXzKUjqZDQ4BUsGKv|Zy(1URR{Vn;6{}V4J z%Xp`rGBmFxvD`+?K~8kJnX%){p&7Je7-zU>yo9E0nRRD|k5&vTzTAxHQ7vOUBc12=^0T~g_-9+G@dpnhr zHZXi0H{nGiuA_?%Z*%V{?xD{`>A(|%io@?r^c`t6m>#cg(lwML15DyJ&iWEAP-=P!Kp%T* zGvr1V46<$oosjZ7;jR+Br_5*s%{Sx+`{W?uREnHI6UU3w&sB1bvV+Cjs@LJ}_(rQq ziWUFoGY?gWrL{O$Vg6X`y+wqDM_L{nA=q+l?eIzO$m#31i_#Yw^#(L*3fCDK>=}Ds zV5S!bU%9w;Qw3FZ&%_4OX}dkxI;DZ!Y!l_O^ZB#LkYsIHqW-NR+>yEKwN@N!*ATwdW5iVOo6*AB73}EIimm{uylqY9#f>*19~D zCZa4^?i-`V^9B2dq5iXVkO10&zU*yBjrtp6K|V;2JOr`YLrVo+u!q?(&gHHUQ%kAX zSQb2r_?qR0p6_6CK%5BfAbk#5$+{tim$6{x&~lxL-jl8yBx7oW6(WQ^M59$NkgsW_ z;nu(hDXJm`K$80cO9GRCEV`8GrkH&VDm-cg6nL0&pU0-N10&}6B6lmjty)x#i!o}t_IooEl+gFU#j2>lBl+h12F!mhku3^SG$Rqoo5rOJ z{NcOv@Rw(XDm`o}l8Jj|ec^H(R>x3$jST_Z#RF}+(+0YNYK2FK4)N-_1dTOuZ3&yI z7Xy?Sa}DUgsE%c;jF(4t;-(MG*djQ_zH)&WT|}5A%5>SXYQ)T`&UY5pk%xcWlVE=3JgsTZ|kB|+vI9}dlt{7SdBuRE2d;qA^Sd%K5WGDbE!5nCDJ!73iCYX;SR$zqv96dXj-E;E)qwY<>>#VMOed`>)6G@&m zc*2uxWLqBO*?5pA1_QDU1{{!W1{;Em34}>z41@@hG-*lfBu$#3vPse;O=RFUV+FLd zH-m5{n)aFuO+s2jnzT*1hK}iQ-*@eEKFMIn(A@v?zmK2ebMy`S+uz=6uf5i9P1%;d z>|77;4gT5zAzjXcUXPhFLtK7K6&(Dx;JvIeWKb~1LkuR`9$^45Sst{Uzd%tZ+s4|M zu6ayXGlNY66YLt$+WZpr8swsDOM9}5ycoJji3`z3UUGTOK_U&V zOPYUusR->l4uOEcdRXqmSTiq{`u63cp(oaLwT2`iZ-P>ADR8^oN5d0#^fpyK$Ur&p z1-!$oa)&#;k7N81NQ zygmNjyjRcCD`K{0G%&9?&>;b$G++=yYB+ZxKN#QMmn|T{kG+Ru(jvqR zWZ)hoPBL4AMx14ZeC|@;r3^VdKG52GXpNLh`@;%%Wmk5ypr$(>@<1rDfk6;k4q0o_ zQ}$v-%?t8T;J|Z?$pqhHnZ>qnOu0b?#`t?o264hV87RHj(Bj5sZbTxBDItz&A~&{{ zj#Xfii90Hf(R0MPn5!^HhD>j1CEH_Xb`8JK#ZHHnviksgu&DKV!}ssxgE72{rD$@j zG8iOLX=sIb0JyGicW zX(JUeC4~?cbSm$Nc4o=S%C27?rZrap19BnyZV?niKo!zJm?V(= zuI$cslF7am^{bP7rtJ|#aeEs{R!~7u0%O$ZM7XC8ucT&1ZylVPnOS2(LJ$BmMoX1f zQZvo6916qcXK1o}uHZS*J!AP=7=DIW!Z8o(95!L2$7dZwd`Q`w=6Hp9l9hARFHvqR^T0FO{K9KU_DM3 zLeVEab(l>Ave79-_r#gp=PrYHVWX~_DKu5l`HV+Nk;N4|NCLwbR5@4O*gXm{hj6Iv zsfBSzt%|^^9}QSmgBs!n%Ss@bWWO zUiXwz@qCRiM_F^lg<2GJ?KE49gKdaUC0zvltAw~{1JUsmf122ItZ?`B*AGggw&i2_ ze10086Kk>^vkt~nrQgo0$HZZ1A8+(HJR9aba=zViT&?2(aZ4;nFI9ZBC z_@!PjWv>N2pwNqsWjosCA(s(62E!W7m#FP*7%I;- z2mzPpdH&^^FAilk9wQ?z$plfbd87u$y`e3kf6^y(hSf+;Xf+Y1dh!t+q~IxLR%_w# zqR3*6dWpXfvJibk+XG0~R5*$7%|OfRj0;H_JVy7Zk&@u2mc;o*3caQh#5Gk2jR25@B!qNVCc_=WP^->XXggIqlqm?SMJ=IZYaaMHua zq^0=i8xpE8wp9Eg9Ny96W!M)p7olD#B>tn_Ih?@j4y1|@3;g6Z!>c;M04N_m(!Bm_ zxEj8uG6Yp|0=X1);?s8yWWas;(>axX1E^>?2I7X~`<9{<)GZ^NCGe%PDRb&)@|&LG zCd|r(??Bt{a+CR7RZsTsRpdc{6OKg?!P`0TBP!=JOk%o9!Y+(Pl1BN~C2L}Jsrq40NCwPo)`==lhr2Y3V$7KXc18qE4Ij{zyS-v)uEt;^!s za2m)(id)Qc_zRtE4(~UEzf>0Zsi3!z!22EzXs)aAY+dVFX`lr23)|{gH{w~kM6w>5 zOU2vGifB${tRqHUn*brt_>#cQg))fH`3k22Lm2hZwD$lE9v*^bL8!*$qnHbJ0}EDVkNAq{~Ko8kMLW{zc#zRSF{^Qvbe+_BhNrDcS{(@F1DdL!?86me{O za+ZiB*k@2yu`}C6Gpd4!I?HI1aa!Lan@8}NjiRPzZM39gPM&laBrB~IpGuP)ARPM; zIK~;I<{&Jwg@>Fbfwj|=(c3*Lp{=+*(~)&Oz(1?A?YuQ>)r@-NC9|puvN5c3HqT%y z>XoOFiG4#`wgs90)v@R7>@n>JanHA;{qtKKBqnrdIAnhC6MAD!vVz}7MF^D3I|+8Tjccv?O@Ga z7S*iwpxvb%-7tqGF)Wek96rbdbKRwJ#qC{~lDndw!te5Jc>$(lO5xhN>{Bey&#_c3 zZ~#XbP0G6Y$at_S{mv|RV)W}czS%EU;;YQ`!)-gNsSh)X*jo_}g+HwVeiI)CuU#Cm zLK`q|x}nRg^-tH)I%UuBN|Pp)_#P!|PWjzahWOvVV^FyAf-mQ6_S>1Z^ulkPB)Zm1 zDTdzc9fh9k(|kTy=*@mmklicYCn2KI9Z&hQffq2Ri7BWm_|hy&B`&uUq*oEr0&Hc+ z+<|l3PL4u}HHFh7ZnD1m(&%+1dKQM%z}q4|F^lqCG(V;v#Cn6)tP3KO&#r0`TJfpj zL*$6{6tN(O5UmMc)`v6&t6r;MwlVIh|}&f`2vARMEp{OKs7 ze5`@4AiSVZe?e%ik%XRxrJecShR4V+eHFMt))_aB zP+t<0o5Vc?`_pMF&fEDkf^_?A9$c4gFbfxNC`LU8oE9@kB)2dwPVv0*UC-a9uR(ev z&JRS`@-aNuv6#j=w{iN-8}AP~;>Wb;0ZFpyzj7Wa$tK}))J#XRE_K8P&1BwQ-tW@= zDUtUWILy8*^mYkq-*Xua;x`Vh`^26V0K7)h#Hz)ChR z^2?w<3439WNgfY0*vRAsZpuhZuD%7vfqckfjX_t=vLEa-Yhx74ZNp@y(YV=O5Ishx zFie|W!dOC=jg%&d1%N)hLrcPv!rX>fAFK;`2{kxEW_TN%;~jh^kcX#mYaLr)hzF;_ ztT)qm8{-FNj8rP!h`6l9ShaqG2i zByEoZ16LHb)|u`ibXtrKYNAMvEOaLa=WtZ(Uc@@bova4YVNZ9S!on6_z$PVVHeJ9_)!*>tgAK|-~??2`H z2|nNC^KCwV#plN)v3-HTzQ1rJdk>%Ah1q?a?}z#PAs-;Qv4tNM>awqL0)=V;ooS&n zuw(MSf&}wAs*uy!v*3BU7sxU|)Y$Fm@#rp;bYIPA)w&mA#f)c|WecdBK-b7`$yZlJ z{wZ1rIomcJuo+>+S;c6r=Pz*36o)d7CX7l2o}L?dT!|tuS4bWFP+{Ndnd>z5W0Plc zqZYHb6t79bKkyDllneq&Tfvg6Cl@#!>uU9b9O53<>4;A43Q zrD@EqElIMlnBG`~Pp~UT8YNzC9qU!odx9bon}_wv@{YS`f^1$OVHymZfgQ@?N?{1d z(*q=e!~=c6rA?6>BHZp{(E-V!}rJC5Soh_y6sEDuF^lthHM(o@p?2)9wn;@B@5* zjE(wXzCXw33w*xD=P5oM9IC*|GWAGLFQOh%|Cz^;&O%Xn zj$$Yt$In^tff-T%48l;6(QUvLpJy3^0suJ@1*`!V`r&Pb<@qYV=V(p=4^T}V+~v9k zQ!rf|*_PZj(=XwL8dm9Ih9c+fk1T77-@I)= zQ{3`w{=omi1IHzjLtkVgP2dFLe495yU+hb3Ai&s+yM$)kgbMGd8pBv>XPSVl<-w8M zx`H0Av|h5qz$=J!*~?;r8~b-o*zio(CJ;)f9~O=nYT$-dhL z!e`;6lOfkJ>=XP*_<=CkdXN)KVV+CvJqiY)(nlQeCxC0`c3s1+d z8x!;{pi#XI?&D>!7rXr@yC(~kbq}+!2#1(Bz?190=7BsmIyZhC{JXqs-;0Su9McRv z385#NRkXka0SA^<35DRJ1-_3D2J(0^_udzrC+n+NRCfM--sq2MbfGqoN$AFQQ{!W5 zkC|$yyc-rCj5ViX=?oi2#m`0e1F_oty|71s(!3}&=55s2Y0s{X#Lf4zFfC5|Mn05@ z6N#O;KL!Eyo^hxtkxnEzjwUm8J`($Wns@p?==5S;>P}7$9;57ZGWn5!v5_fi7aX9| zF#&299EiSZd)8%hVZRm^j7He#nF$koYltRoH2#!KkVc&2`jI=z?)!(lAMdD+rL-2; zQH985GyqU)1msyUBhz@ha$guy`eHJ#@&ODu@X~~aAsF-W8dk1GAEP&sIf${Oi)vZT zys9LJ1WOjld4ac~grm+ia8LN>tPg)O5DXyA#f+iNoKoFt;z~6zBBub$rkS9d@zG2O zoYdZK?7>zN?NAzzT^A!vU$%?t(`>CXNX_V~Txj#=hdZ22dNdoqO`VJ6>?@f zGZ$gZKh+`7r5U_oAq-w0jY*i}!ABb(%tlk%2S-b&7a$lnO8|znJ&ZsTALN!Wx2}>P zWXlWrNPi)X^aYLb0d*j}4>jrt5!9mX74S}AZ3@Sn75>+Vi^EFKyWEqH&8Kc1$RzvR zKj!Uzq9$CO? z4w}c-NiE8KaD!`D`sfAxrM>;?%B5VWm@5&PiHsf~#MYM?GeR6S5Co)PII*bGUZ z!rW3+hWs~PG$PKk-nGj-{o7; z@DqH0itj(<`-^;kh3~)M`#XFq!x#P+s2lCVZiev)`rI=&M1I1vz%mH zGY++uG=YpJyau20ijv<};5k)8Y6?#dJn+Lja9*v22?0wNqSzVBzao$-_MG-m9j-uf zM#q5|3a>F(l8h(9bk;XIMaZ+9kuyS3x#NPiY-f1s-kSS=>-73Q#_Ir|PxAR6e5_cn zxUDedZ^!a!zMo}-eI7yTU-`ZdK?;Fkbm1Y!cRznH9Lb6U(9c8%eU_84k#RpIV*~yk zbqgbgswz7RFORS79Yjwz6pASgSzYln>Gk1fv&9?(UtJYOzyz^wB{O1VN&&Qu0k|U# zKyx?@G61+={IUb^30_i3@)16N!smbTQP=nZpJ#aKW4!#o@O|&#m*4mEUVdRY6P-2J zb%+6cJO?u_gd)Z=Drji%h&(!YM0S?)5&04$GP$;}sv&GxY|(g~0sEs~?}w&PKl@`} zWaQzDV@$+`7+QKKvK?+>!ETlwPIG1+nMEJWz-+;>H%+b%>9}aG^#Ft zt1t3altE}~02`pLb8ypLQT6loq+|*%2doy{)e)ml*Jj77=u^hTn51-#xT@F zRa6P6;XPh@a`N-2{kQ}~6bYAL@z@`_9qaJ2;A7(=+)U?u#ATd>*25{=%RK(|395e= zU2>y(h|lNw7?9M@!v8woKjiNp0e;gqUge(y^B@V)pjY45n7{g8@aiNfW@n{hlrnX# zIlJ^pjMaz%0#`cvbrC+y$*6!h0>5KAONAZQQ|3i@g~;{By~}vrjT}QF!*^slZE>E& z=vZDW?ci~CgYOU*!Bq@)4gaXc?CAk_KoMI=?TVDPl;+I3fD`A1A+Pgn*csM#ibbcI zp6;;GRC$MO1-&ySgwp6tgt`e1kaTAPs=fLUtQidhu_4}}`r$Z8&!^$vw21QvX!vY% z1DW%Le_)wy`g^n0o`bVH*37_PKV`m#f43nJ(T*9$ZpDy(zEtI>9P1x#U~3`RW*Vl3Pm zjD|>jWLUGXf{x=Q$3SRBZ($%*Xd*?sGg2d)ubz&h3f-tRDeItFg#OtauZg!r<}@sb z;R%u4P%midp5wT~$z@_{DE49IMofD(_OMjXbVgKC!FEc0V(t9%yfu>c)LGC z7C(&g#(u;yPhJ-k8c617Ox6Mjg-h^F;0na#MWjpx8Vg=U1>H{QcLFjgEz?`wbr zY?|0D>|tzlkm8zb#sO9ug}tzy;*`NnFc!TGl9sq=Vzzf>{?sn6#{0cy{Hjp4Ypi7ANvZWf}iJa9J5YBBO3MtH~@D%cje z*x4Gf(@Z=sf+e*Y3%l#%rQmHd96P*fbl)%cdTET&=70~mf{cpHdIatV&;qU{$0i8gkh1mM+?_^p?LKe>E3 zMb)?!Mui&GBN7RyZtaU&+Eq^9$O|#ah;DEaObo2ED0Lxq*OrcOLP@9zGH17C9Z}nd zyGE)3z6>$WE^m{kpciReU5JVl0W{}ErcoZITkQmFkCM*}#857f%2{CO{&N806OM9= z`v`?E^_z(mTv2`-V&l!zkf&Hp#3PJDB1#Ho6F}DK`$)5dhNTgM(^BA8fbOW1-HN78 zq^J=wg9>1X#Yb*)Gd{&;58<5uRCXyXc49>Hxm+N>k`bz!gp306SlbE{c!HfCC%AIkMSFG) z2ykeaZ%EwA&@Kfx1-8fde3=j1(_~Z%nD&M6uKAU50e{GGs|ale_6mrGDD=e zy1wT(M<3gd5gYd%KHT_cr-S=)B+QL z1Bn|TeU0-q+@m~y8m*Ixvz4)@=W;a z!Ww^t>v_3>XD?xbL&H1gzu#8s7cbHNifz4U90mq@N$5haFwif$lO)UK5qyPF$R{Un z9mVOAT#A{xHkV=^LyDPVNVFOfz|(02n-KPo14EcTc9(^hgNPh1=G5@3fq>fGrf&|d zApy7vyj6$$G;AS+7oxAmD?PyhLT!Q*5>mvbyp?#Sa1PKdz`dS&0H%*_DB zAtwR4X?xX3fqI5{3i4t8Acs-3VYpIO`te?n$4b8YC)ek1`DaO1J1fa*N{3U>xQ>_C zLTyoA!@eC{@nr_Xc)Drg16$89L+*=h1NX3GBlv ze0a5NVn~9i@uufRgaq934pz4^9mSWDgZeAWaL@ljGTaQd9F6o)qSoVA7TFea@lrax z3NC@aB?2EDwo5(>5?4d`Uj%Q?E}ZSI7{aE>TJf`ak@$vsfdY7btenfk(s>nKpfTR{ zo+=dph2r1fb3Ge^f8%@o{I5&E>naO)T_NDT4R|rk3ZFv2d+)DPz%z-kK`94*B{2_@ zR+G7Juza^=Q@&%6YMWqNUL8P(cB&&`8+% zEm)^rgE@vZqFB@bFS_zLHiB)_?&zncqug;4vQe2Y0YQ!!`hv zGY?aZ?pJL8YKfesN8>n7L~;05A;Hj1q$KlUDi9%lVJO}Z`Vsmfy&uCcOw&0FgBBOL z#lr=$TA5xz1~D7LV@Za0!~SRlIT#7+`It=Pz0oMlsoFK=Tc;uuBSq5P)hO*DV4@a` zKnFVU8E}oHZZC|Lhr>AD93lg#->gJV9}1BOrJCVOr|ly$2oo2lL#r%b8WUPrrp`zQ zW|WJvW+vZ)LDCx!3A$%?g zJ8!Fqh!YHby~4!{ z8-H;yfDu@uDFT`>DogNau{u3=EvPLP5@bW}!C&B-L_R_3PsA2=TDbB6oes3~>$(Qy zW1!D#=`-6b>;&n1{@};07<`!y1>gzi#+8z*Y$D$7xYo)ekS-fE2s$?YLJvLevX^Vk zFp6KGwW}3>Uh<~A=GGUz>GHvsl^?n(UUtwc?Eb}C(<}U?4^0Dd-0+g2cc5X)V`_H#RBPwif z$QJ6Hvy1jo)fy!3tHU&H2+F8<>h8+=NHM)AyU10`5L58@Y9YNP4shslY<;HW+!i`B zMoB`{>cXTfyfop$SSq;JEMZg9h&!zGg31X%AVE~`ySuuxlD1&yHF+O@LLY0%O5DJ^ z>OSB`XQb%NaH$*72K(3ab#ffX$^c`Y8;p5L=^0ibJ{5wGg-b~yucI%X_&)5n2FBxt zYx8IQGtU}UTX=I-1GXF7h-$0PQ+1vdeknvk-O9Yfo85E@m)EnYl^<6>2!8Z`D}~#lJ{g~qh`^$;qDBn9p%Z`9cHmxH?j9lFTMHktnSgQ>Xynht-CS5`!ILo=Rxid5E|rb^o9&& z8fL0ef&V%h1@7XT%zMhg^WKpyiIjt7KOXfT(xZ%i7E#NYyc+RFYd5}h+;tg;5;#lw zAQm$F+WNrjuMBT8sdQe6Y!NZsgpiQEb(^m4RBtofjQj?GP$PCAgL^B`{rXNJmvWnR zkHPRUO_FIL4E^O+#y$e)#~Vh`z!n||gT}kEuCV^S)zG~6vw!{}pEnhIv(LY(C;Q`9 z^=5y@$GC8PicCgg`p@;H!q=-3{DTw>h*fx9ef6R0d-H#X*zK?3b2TtdU3R(uUF3h~ z`riisTjPJH`rktTo92JuPk=ra_FWXpBdZr&DjtBXo~)kqoZWvU6fh@t|CHMuu`miJ z@%kqtmW7SAkJ%NkWC!mE@D3{i&<)B$_+k?P+eBj_oRv!hMG7d44Y*|>3SJPGu^GSg zGEf}=f&Wfx7%H0RDyVuCDGI|bBAETb@YWR4Ddp~9shomKq*H_MLTX+b^oOi>R^^RM zb)^Nfx|wYr{lqF^!m9q{hbKppOsVn{%*kR&jU2|vw9$k@gMZ=5#xWgAP|)BV@FDDT z(2_SzEo^wvIe5y?IR|jNCY$FBv(jOfywBm|+fQwr;JT~X50KWy?^1{B)4P?AwsLd^ z7o37hF+N;5=Lb_^(c^Ip28Pe)VvdLxE{fM`;TJ*?FX*vX{>5g-bqdl8gPU=w4HkJCw}71?(~wc52~JOj5=0^(107j5u&@t|9FQ3jD1tVs#TX>8zJR2tYIj2$EoYRK-HDQ`v zyEQxeVknTp3Z=`9+iNOzrLaA`LCFP&lR}G$m(4s;sqi^adt})2Fdbu|tuWZZ|8j;= z45q$&g*gonrbzz*O_J<_2;ujlAojU#UzWy1sbERJ$*@qFjq`FbgL|LCR;G?TDJF-Db!ya{4AOXB*w|i+ z$3bTxBfp7pO7Q7pe4~mIe6>25LlY9mGHzkBKzQ5+auzn*baEyqrH_SlR>Gg5+cmao zIyfH6T~w`GDen+thvdog!jigk#~EuErr$K zQ?WSSse)WLkWFeDBmhJWK7k7`%yCH(KYKk*ifc)5HuaX6=n*W;O>`gnM#}sV{gW4aYfljm!VmcUB<)DMNm*7StxE{ zXxJj4e5Zejjv$fF&^fsfE{{_UFG7wcPuJj3_#0IM*>6`p2I{yU;n|AZ@AhwiiMR0g z+xeU0aUKTN&7b2Cg2xmNpf9=v9F~Q#lyuHj*C8|)bG6-Ml}yG98SiWUzyaL)TC-S_ z82#5V1(w@wB09ONbThMkG`q4?*g7W2WoF^GiOtwa^V7YC&~SRbhnMLp6}Hr8R{59a3rnN@^nsVxeP9>>$$% z|IDbHS6RVjS9sBj*fhm#7-#w`yd$nsg+4PWuPuCW;62ZFIqi&nnEhfr6#PrR?K!yg zuO;10Yc|ekXi8CSLpuzS^I~86k~Xc+tQ5rCX=9*dQWChpg2WK!7{YdnAe0GycboRY zH+UoH*>%Wz4Mefx-GL`3EURKWd>=Tvu5};hyN~a`;`^t}Bsksb!oM(f2be`>W`l2c zS-c%2V|MhV`ki#+f9YHbfY1}>GIaz#v68uLVc|HJ37{kHT}N&$fQrp5%?s@w(|4vz z^Tud>w1>v91+9%YI)k#6edO= zEz&0c25+Xt;J5kyAm1P1`?Gw1pYNXxe&hEhx?MSlZh2Sf_M-e<6WykFWpsSkdA~5- z8Yl7{3o ziGEv!=$DmV7(@k2c}Ajw4HfRSiZ>p_y*99(+wir`*E6yi0S7JH8Q1V$1gMZR&DjfI zuN<(z3#-N}@Wv@$5ejofP&12pbJTd8P5e=~XHewHBoAjW2(vpW(XcPO6qgs#d7QgY zCs!h#hAw>+`6|W4;MTGxBBifa(A&p=d=46^=|{2vTfZd4zdPH4kkY{e0|y;O4u%)X zXw_IT=)%E`UsYqTlqJ8}ef)tMp3mc2(&K*q^%*ZW;;~m~|IqR6xAHnV*qjqRK(C(9 z12;3Hd6!;p1YW*NCwRmr9s$GWCG$rNdh3@wBF3mZN2XmohuiU@<#t53@{p8gz|#Xm z$Z4RHH-YZ4`xFkcCy1B0pOUB`>eHm3wMtKFyg)^6R+2!!ZgSs2Wb+xWA&@@IY)tp(Qs&58KY);es3QyTH9K?%jaXKLd< zU7OIACgazsrr+3y9IZYv+(()bv5SFBhMSDU)`2)`1Jo1tt%Fkvtou@qoc$}|<{*vF zRv%Jn8d?1y&8WQ%4S-XRr$wl%m?)07snHIDr# zUl=0f2b<-hI4yPP&57z`T&bd4C<~WlH5Tw0mGb^N#mMUpt%)hzqZsZ<+lIG8g7ZIaN)~Os=N?E592A1Xlybpi1-0Ozob7c3frGTd~xs>s+4w8>##;Qs?Dz3ZF4P5^( zTtBV$1zxM$0#!Mofd}g`mr4QsfAe!FPaDa!5H>6vEo?6w4Tb@il1v$G@>#%QJF?UG zH47HgoKWdnc2e^`LiVH;XD_xUs}YE`OniL1;>$w;x8O;JxR>jkSdbB4ld968$^bq6 z^?X3zl?)mS8elL04<&tbgbKJ}1fKb{lt>Au8w?eHbNA5-+Wz=A@-{3khfxIK+cs83 zT(Q^)(i?X7N%T?8H>0ib#TsDn!7UycXz}SM^A-=$BKZCMgx`nX4+C}zs=yVrbY+`y zXXq%G#t#_C`Ea@;reIxLx{3$w;}Ir`&qLAg`Ln#~&s3VOP5A;~t;v^yCLkoA@&w3t zceV$&zqag(HXp~2j<7?fr)=ga*6!F2*E2&w8(haY$afjq*V=&AgnLzZzK?`?Rb#Lr z0$Q)S^1~V!9C%X#c*(#W0j3j5t8A3sY=?!t!Uao8!Y=4$^c8|_v?Y{ne8 z(-P6j_3PXRl@zN1?E;&x)RM;4q>qVgnr)tN-&XJ7+A|4#iJ-nF zTpvn>8%@i?QL;=Edg5H%5DrqCxy_B8t*gPP#8>Y4|BJ8YUL|&{fzWTmDJKH+FpN8x zz^x^=*jI-|c3Y2r#<-u5eRUZ*0YQ{Rus1SW3hTsApi4VjjMhJ9*|XUSn%)3~kg}`n z6ZKDb4T|n~{Che1{Z>Kpd-ixf;d(AFg{kzU8LQzm2(pt5wB4%s>#?(t83u6rxP@nA z_i0<9cZ=m*`s-V-KX>8z;E_8jUH%oh!q0umu+jsvs!EXhf~WIA`~-tY#miJW71Q;! zu$|*pjLZ2@>DMr~xiQUXW9|GH`79d@7DdF6UjIKGK5+rV+|jMfcSkQ9^6^)Zeh8F@ zt2S{Je(^XlTo3$jTN$$5K(_aNKg_%J$8-yRiU-d}G;bQlq5Me&o-&I`^BjJaDz})V zpr9iOsS3YJ9BK4PZF(yF-^l-hWBPR|&IE55!l^G|m&4z^?24-8w#5X(rRcbqHzs=pVj^vmIft#*moGt`~YwBgU>kqM< ziG^g-#`1u??|@sMaAR>V>H&>VGgLh#JFKVy%06c)ogkhCWD z2pkZ4O}~}42#RXN77-UL=7R7+AkXFrFF0`v!x6Q{?)bm`l$z3qV1Iqtc4R?wAX4;7 zc_nSM$6lWcS?m5bpUM41_cZC!a4rJ?PPMJoB=efr28t=L0v0leVAS14#Nf0w4q)Ec z(Pjn~!Jb(HB0?A$&annGD09veliEbNk6U|+=w6K1?4bA>m+c zzJ>Y6W`MK`n;?iFw6F<0O_%jqphZCeV<__%{Wt{;U>-LtLKMa0l7df>O~>w01YsUS zq3{KPxAIf*n4iN+ef&R2iW~Cxc~3r@_hig1h#I8MiC6|x2DO^N4wY~!YH)5W+y6^0pga!h632fJAlF0?2zteRQLoKMv`{$_e8 zddj3@@M+O|>Lahuy?5{VhkQi7Pd{Mdnv+qq!stt!HZn|@&kmER89NuJpt3b=s)s7+ z;HN&9H}O-VU?WZVtG07;-gPcy~@CF=m7$iK5ER$yV4EoC8ipvN8cm8&7Bgg7RwT$I?jDp1%pe$$% z2l%~w!TkE@?MB!Q$-W|0w52tC7_L?+ojHR^uvB`vtMUF~eVIviuC-gVG7z)GNy5&_ zDRmv^!`4C+`_}_2{Qc|S{iW{ z7$9-4NymQ#>(tYTqHBE9X;N6xgNQQcICX;=Xo2G;%og!oP_Q$27~AF>veqAmdcGX= z#Diop<{>M%cnv9jBZJk&srDLzvcNnp>RvSokE0f@A|{JDBh%?)30Ko!D%e2TS!Dx%aiWVLJy+!#LzGhMAvSL$z%W9sh2m*%K1Hh<~CPmZt%Qs z2pIUncGHD1@7E8^`;T}^fIKIfzozQf#zeGYN#@~|X(T7YTyA3J;+qC^#~y?{Ki)}i z{QYbJH)%n{x;%J}aaFk4ImRxiQMS=ScQ4yU6Aq5j8`e4&5sr;eKX0T{NF~MXB;zZTi%gFC zkNoCtK+qAjpCabY7ICAXJ9vvNk%-Cm|TC-F7vStK1SXeGPnW(T-cyCn$yGRtE6a*&-UTeNGDqc_; z_=6CTw#MQ*fl!6sH6wP9=K5@DVXOBf=31o-Bg^P5mWq8je2@WxDNh4=;TX{ze`xY~fye-BMR8FZef>>|Q54yoUbg_Ywt`V+=#f>yUeF4SAaEgGSq1+yn2QLnPvx-cjq zH8h1d(}Y<*5|JEY5rjrYG^~bx{{q`^6#`n|@ED2Uve$R zL~2D!3!un&Bf^hX1O!5BG*wG9NkjCP`2u2Efm04;sfdRkK!KS)C90v$5U^XZlbQ#`k7xdKjaW zF^rYE{d_l zQ+`7{5Dm(}=1?7lGI)b~W6?nb7NOTZg?>dZMRUWLrKIPwRP59-ts%fF-&|!WY)_og z_o~H<>`cv$7awQ#Kw@E??DFI?JgwI#yX#>8o%(bbWp@|#nA%7XL4wJ5U=Rm?KaC}N z1|v9DXZsq+Y!d3PrV>~aJMqZwa-^3@$sBReVaBtjo4s~N_G%7X7P%Mh&=#K3k-g3! zQEWezjnXOscCJA6Gy;TlG1!Cnz>pRbPBH{_1b8 zwAT{tz4(cjTLQe?9yOxOx1+gk07JT54!OQo_6SoTyQG z8EXwcRvWtdB@N}Byo=Z|+A>eM*^lTYF-+?f(_iMT$~TxE4Bw{08L0y&>g zq;x!CpHpv5&=Ky{^5;lk_-*0V8h9^FMHpu0=xE)o}D*5=5Ka%qqN zlfX^)bK#)w$`t1^Ua$C&O1dy#5!}YHl@|$$HDkh8N`MsEf6nwo%1*TF zPRKjhTh8+Y&W#JnvgN*#9NJ^M)O#?lY4@6Q;hiykEIsS2mY;a0=gz@m>pQ}Gbal9* zGwXzPcV>5)bmon`<+Wzg5p0*}3?Xjz4~inCocd@BZ1*2KF1z;ReDC=#c2J^h)-~{4 z_A84cW}w(C_XflSjf?nZBau=ShOiCy{02ZV)V$I&I1{oPwq_lHYwd&uLP^M1#C7QK z%^%@8wki^tv=^>)U(}^jydwQ_hvpYUJq}qzP>!i3#nx`HQbcc(E5eOnT^;i3V2+2g z5r$PN0UyeSX%*Mdj(KMPZ39KApKdC@UQ2OGRaUPdZ5T3=Ri{PL=p#}Xb=(wKvOfNJ zo^!#-C<&iR59G$z8>Z!L&8o^yt=$M!9OJPYOVwS~ZTqyrJ_KRIL1|UQYSAr>pP7}rZq)NrEtF@`{fiGKhVqp8@C z_5v^9^GJCgB-YsPMB3_bZFSp5wx8awE6f5a%pTKqz5{<1RUG^!rW}Ze&Zbvk9${P! zpH+%oLa}MefGVJwY(#G*v`$o=R+rZdy5iwey7-~vG%FjuiMt=nW-46*%bWYj9}5)} zjkzAL6F<$HRA41Z2xEU*6Yom@&Y`9AxN4GpQxxjWD8bRlb8&f{yu-(dFAvA(?o9M* zmN1+LCW1sxig#hc@NJ*SuxhcJV9y*XWE*pc&x5G&3s^!u5yHWh?Kf68VM4BJ@2~Ey zp4!!0-CMY@uDW#}yJ|0L;IYDa)W$8Wsp~hRZ{eFK)m0zsD4bPS-4p-zRr{|q{@+*K z(NXv|7xecPw$xR3_oIk&>lt-NIy=|`yL*omK3YXNj_TGyggtx(?hC0$k#?3|g1VY=zWz@O>qGq%FGzKh{vCobCpO z3y@r}3pv1@bUc%4nBi>p9!&J3`=M6M7wcFN!{kq_#^zX!Z+k;^UByzq^VFQ`{}p$H zH<5)B6>V}kU45jMXK6RHT}A$S(5+A%Q_3mE8k9+QRK3m;sM-e|P$QMUaHvRF!g>9= zfSuJXVt`c~DoaIGLHWazo`iCck}jSm=OcL>{`|8c1Dl){SDYGGs9_2HOo#5MV#;Iu zi)A>4a&An%HN2;sR>j%+u09%VpGa(_#^#l+ge|95IHHN;LQ zLtyxbbj0R7p0<#nnrT*p!Q_BqNvVb{0tX^MkBeK)5e8qy6c1smYE0suxhxp&Nlx37 zimx@u#PZHX{8o<30N+*tiJn`L&%g(hl;nWTc&ay>N&JW7j}vXa43hxZ-yJMNI2v@(Om8haylHwu{C4 z@u1{vhiA8P0f{y{O!9bB~K1J9us6$b$tby-m)fdbwO1&zShi06V=FZN?%xC>fYB=eYB_010(r^LS1!x2jT$y zApdtH{p{~3{2`~i`>K07kHMNcx;uK0^i+3tc699PJXYP$-%NDc^uT1A~b*wFmq9s(b0dq8Inz$V+>0dftOk8}lAK4(}K*I-lW3^9bY$dW~?PsAGZA z@a}7`WW+f*aNiSy?wjxktmBpLTd*mA-Z!~#QZ3v~BMR{DNa=h*K+srDk$G_PTJ1V# zfkJeoa?}U?1I&XV-;+(6q$X}iH9 z8d+2yGlmVJNOv}07Qh6}W=lYjR1m1kE{=Tmc#^{iczALu06bw_DDc{WB)b}p77LwP zJD5$tpyI}k0J?W}IzT77(Sp88eTWz{u;|Wjhaq%lD~`c|+<_l~y#g_ie$ZYdP^E%5r{>=n zzL9W%GTgNNd8S3p{Sf@Q9gOE&6@l-`fqU)?zpE4!IGZ%tOJS2!xQTRd-kPfKV&aVbimdJE>1T_Ynk) zP<*fO$@m7bhwx;hPRdV44j)qd?!c25Y|WqiF`m3W_#V*>$QBEcPV2K#Rv1O{aM%tj z{#W<1do*cHWb_G7L=rWA(!CwUYbJntVED@bc{Vez7zB_k8)27dG^L~a`cd$YR`+)E z)sKN8{_aD9??wlEJbqRF0uS;6H`W@A(5OpDP&kN+zW}Zs z^4PtFZx5oPz(LA;Z!+WJBn!607>-4rmOsu4%)si(^Px}b{|3T6L(dskAu-Qjd;TIc zfujv5OetwM`>w`d0EekGrSW7I9t>gW(R@9N0W_GcnK`8}40@xn{WU*Qo^CE)n<7l8 z(@Ye<$i^rxm9A3FqYhqvBiq1d2D@=Re04quUt%RI}cHJ>iaT<9OVRqnv{Q5Az4pkkak)xD@z-gMf9rN8{LA>Pzj`ouZouAurU}uGQTD=^3gu%Fv7ZuPH=KcUL zYAKtK@o^yjh`$|-uk&#*zQwV>=JWUbeu3|Q|g&A=?rDVf-Qf* z=WnW%Xnx8s>oop*RpD~b*uqgBTDZ6_JIJq()70OtYp5piS_m{SWxpcaxnvIV*lj64=$iyN4iaYjd(iDeklx1`k3Z#a z2JljirZ-23;~P1H#e*gH;VOHXDjwR7$&~+`v%~wtpL}B2-a7S7$9laXmhEQgjrO+L z-c@3TH*q~$0sQqeb2{o3NcIOzW@Ei{7haSYmE~XOK(wzBDyN9T^DK8R9)X0cZL)^f z#b|0oo^UFuVnm|(H3?zbzn_V}nz$s+V*mE+DgK>6$7Cna_=-tT&t)CeCTZZb_3%8< z20M}qzz1PbK~#^zX49RbiaM*s*u%r^43TR)SZ)Isl$#cKr0KEc+9@+a;3r!PSdKdQOdbIkq{NJ;0XR=4`cDms5_on82)IzN-nUr~ox-(NVjj&Uhm zRCg38c2+>KhXRUi>qI6Oik%@8+uunUgX5vtJAiYsuO98Jo(kxq+JL;A^f`qL{WWGN z=@JIj52dk9xe?a z)S+$9dSqkoDd5z=_L3Ez1cfT=$vY3`&;K;fe@9gQn1A1 z&8O=$5wsS*!&Z&IP9B$w$xdf!tvE+BvWrc2lW2lxHgYpDP)(%`tR2;~o!NM+OyOIH zI)>`n%8c)c@kK%9!HB&WkY>;$4M-RfC&T|1(DF?FoEOdr{%Y1XWi@TCQGeRVB7%o% ze6&70p&HEy6~2tMEc6M%GBPt9y5>Nvx?kXr&pKf@U&Kbg!UGX1NOL6jqigzgXs5w3 zZ5n;>?L@lp-@qNpU(*KqK;!Ef|9(gQ0+|2N>^dU85z=V`Tk6ypi#c=*6XrZRrnA-> zREx8j=5v!pB?@8OmHY~1ZRT`&h|llw`D_Rke}dTedsQ9P?frN<6H-|CN>v>)FOF@j zPP1&L{BxIv6WnHe{c3Py$7M=A*~~iV@nh)5elc*DF)97q8JY5z&)iGLQdp)>zMfsQJY{p^9B79?TeTV z?`18w(p)$)JfAf@l2(ANp%6{foQ7M;VFt9ECibuH$Yblbd^R7|2XHRK40$KnBv&z+nrHOzC4q3P!g$kT2q-|e#!+i z7y>LuGlk}FHgM({7rs=71uQA1y_^hq7K};0f)7cwWHt=27}Y6Rd-x!ipVZ*ynriKG zHJ;1E;$dau`L=r#O|FxzNZz_h`(yZL$|Z$gZA z+si$)42*icoYSV#_05ByBAkj)kUs@{s?vqSa2Iy(L0y$RYQTf(YTk&cP$nnTF~L;P z9!PE@{BEH21nbE@%MA>A*TZ=S*@3FQRpi=QQy{3{fMr{Ooy3r0iTGczc&)T+;y@jF46uR#V`4DQ$Lu$d4pnH2Gk~SzY zS8Hr_ypWDEch`vaj^Kf%xGMC)*5Ijh{0wGWtv$V@$r~kXRd$kQL2K*)h|hSJN1?dQ zkw<7(SN57tg=ZXwZ%YOY8^|7sK}2+-z#E&nwgJ{RBkKG6S}bu0kW=A87f!jN*$yaZ z9!sbhoI)8&Cva`1c!-gBc8r#tRt_%W!U;fNzYo^!WS$K=0~`z$s;u4q$4jgvvinZHD Uw=OK@5b0b;*9k= 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 @dW@&@ZqN|^)*;6rg$gP_@g<2D_>WXQS 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 a*{A Date: Thu, 15 Jun 2017 09:47:49 +0300 Subject: [PATCH 391/910] Test --- iguana/userpass | 1 - 1 file changed, 1 deletion(-) delete mode 100644 iguana/userpass diff --git a/iguana/userpass b/iguana/userpass deleted file mode 100644 index 058af4d52..000000000 --- a/iguana/userpass +++ /dev/null @@ -1 +0,0 @@ -export userpass="c3d8c2a364b7d18c1f9d7321d017b92e9f9c791e4f5c741214fefdea8a071256" From 8a9897e608f0ca389c616fdc9401198d33032499 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 09:48:37 +0300 Subject: [PATCH 392/910] Test --- .../Contents/Resources/DWARF/marketmaker | Bin 339918 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker diff --git a/iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker b/iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker deleted file mode 100644 index 20c28fdf236fd57192d613a639e18656b299cb21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339918 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 Uw=OK@5b0b;*9k= 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 @dW@&@ZqN|^)*;6rg$gP_@g<2D_>WXQS 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 a*{A Date: Thu, 15 Jun 2017 11:53:44 +0300 Subject: [PATCH 393/910] Test --- iguana/exchanges/LP_commands.c | 42 ++++----- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 153 ++++++++++++-------------------- iguana/exchanges/LP_peers.c | 2 +- iguana/exchanges/LP_prices.c | 146 +++++++++++++++++++++++------- iguana/exchanges/LP_rpc.c | 8 ++ iguana/exchanges/LP_utxos.c | 10 +-- 7 files changed, 207 insertions(+), 156 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 550852f3e..297ea0219 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -167,8 +167,8 @@ char *LP_connected(cJSON *argjson) // alice int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method,*base,*rel,*retstr; cJSON *retjson; double price; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; - if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 || strcmp(method,"price") == 0 || strcmp(method,"connect") == 0) ) + char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; + if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { retval = 1; txid = jbits256(argjson,"txid"); @@ -183,12 +183,12 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d } if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) utxo->T.swappending = 0; - if ( strcmp(method,"price") == 0 || strcmp(method,"request") == 0 ) // bob + if ( strcmp(method,"request") == 0 ) // bob { retval = 1; if ( LP_isavailable(utxo) > 0 ) { - if ( (price= LP_price(base,rel)) > SMALLVAL ) + if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) @@ -198,20 +198,15 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d printf("not eligible\n"); return(-1); } - if ( strcmp(method,"price") == 0 ) - Q.timestamp = (uint32_t)time(NULL); + Q.timestamp = (uint32_t)time(NULL); retjson = LP_quotejson(&Q); utxo->S.otherpubkey = jbits256(argjson,"desthash"); - if ( strcmp(method,"request") == 0 ) - { - retval |= 2; - LP_unavailableset(utxo,jbits256(argjson,"desthash")); - jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); - jaddnum(retjson,"pending",utxo->T.swappending); - jaddbits256(retjson,"desthash",utxo->S.otherpubkey); - jaddstr(retjson,"method","reserved"); - } - else jaddstr(retjson,"method","quote"); + retval |= 2; + LP_unavailableset(utxo,jbits256(argjson,"desthash")); + jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); + jaddnum(retjson,"pending",utxo->T.swappending); + jaddbits256(retjson,"desthash",utxo->S.otherpubkey); + jaddstr(retjson,"method","reserved"); retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); @@ -264,6 +259,7 @@ getutxos()\n\ getutxos(coin, lastn)\n\ orderbook(base, rel)\n\ getprice(base, rel)\n\ +getprices(base, rel)\n\ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ forward(pubkey,method2,)\n\ @@ -271,6 +267,8 @@ forward(pubkey,method2=publish,)\n\ forwardhex(pubkey,hex)\n\ \"}")); //printf("CMD.(%s)\n",jprint(argjson,0)); + base = jstr(argjson,"base"); + rel = jstr(argjson,"rel"); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) { if ( USERPASS_COUNTER == 0 ) @@ -284,7 +282,7 @@ forwardhex(pubkey,hex)\n\ } if ( (userpass= jstr(argjson,"userpass")) == 0 || strcmp(userpass,USERPASS) != 0 ) return(clonestr("{\"error\":\"authentication error\"}")); - if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 ) + if ( base != 0 && rel != 0 ) { double price; if ( LP_isdisabled(base,rel) != 0 ) @@ -367,7 +365,7 @@ forwardhex(pubkey,hex)\n\ else return(basilisk_swaplist()); } } - if ( LP_isdisabled(jstr(argjson,"base"),jstr(argjson,"base")) != 0 ) + if ( LP_isdisabled(base,rel) != 0 ) return(clonestr("{\"error\":\"at least one of coins disabled\"}")); if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) return(clonestr("{\"error\":\"coin is disabled\"}")); @@ -392,7 +390,7 @@ forwardhex(pubkey,hex)\n\ } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); } } - if ( strcmp(method,"quote") == 0 || strcmp(method,"reserved") == 0 ) + if ( strcmp(method,"reserved") == 0 ) retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) retstr = LP_connected(argjson); @@ -405,9 +403,11 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"broadcast") == 0 ) retstr = LP_broadcasted(argjson); else if ( strcmp(method,"getprice") == 0 ) - retstr = LP_pricestr(jstr(argjson,"base"),jstr(argjson,"rel"),0.); + retstr = LP_pricestr(base,rel,0.); + else if ( strcmp(method,"getprices") == 0 ) + retstr = LP_prices(); else if ( strcmp(method,"orderbook") == 0 ) - retstr = LP_orderbook(jstr(argjson,"base"),jstr(argjson,"rel")); + retstr = LP_orderbook(base,rel); else if ( strcmp(method,"forward") == 0 ) { cJSON *reqjson; diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index c50c03ecb..87fe57170 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -177,7 +177,7 @@ struct LP_peerinfo UT_hash_handle hh; uint64_t ip_port; double profitmargin; - uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos,lastpeers; + uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos,lastpeers,diduquery; int32_t pushsock,subsock; uint16_t port; char ipaddr[64]; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fbc4e3ccd..122f9512f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -190,9 +190,9 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma } } -void LP_utxo_updates(int32_t pubsock,char *passphrase,double profitmargin) +void LP_myutxo_updates(int32_t pubsock,char *passphrase,double profitmargin) { - //LP_utxopurge(0); + //LP_utxopurge(0); not good to disrupt existing pointers LP_privkey_updates(pubsock,passphrase); } @@ -212,9 +212,60 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso } //else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); } +int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) +{ + static uint32_t counter,lastforward,numpeers; + struct LP_utxoinfo *utxo,*utmp; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t n,nonz = 0; + now = (uint32_t)time(NULL); + //printf("start peers updates\n"); + n = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + //printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); + if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) + { + peer->lastpeers = now; + if ( peer->numpeers != numpeers ) + printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,numpeers); + if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) + LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + } + nonz += LP_subsock_check(peer); + if ( peer->diduquery == 0 ) + { + LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,60); + LP_peer_pricesquery(peer->ipaddr,peer->port); + peer->diduquery = now; + } + } + numpeers = n; + if ( lastforward < now-3600 ) + { + LP_forwarding_register(LP_mypubkey,pushaddr,10); + lastforward = now; + } + if ( (counter % 600) == 0 ) + LP_myutxo_updates(pubsock,passphrase,profitmargin); + if ( (counter % 600) == 0 ) + { + HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) + { + LP_utxo_spentcheck(pubsock,utxo,profitmargin); + } + HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) + { + LP_utxo_spentcheck(pubsock,utxo,profitmargin); + } + } + if ( pullsock >= 0 ) + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); + counter++; + return(nonz); +} + void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { - char *retstr; uint8_t r; int32_t i,n,j,counter=0,nonz; struct LP_peerinfo *peer,*tmp; uint32_t now,lastforward = 0; cJSON *item; struct LP_utxoinfo *utxo,*utmp; + char *retstr; uint8_t r; int32_t i,n,j; cJSON *item; if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); @@ -258,103 +309,13 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_priceinfoadd(jstr(item,"coin")); } } - printf("update utxos\n"); LP_privkey_updates(pubsock,passphrase); - printf("update swaps\n"); if ( (retstr= basilisk_swaplist()) != 0 ) free(retstr); - printf("update peers\n"); - printf("mainloop pushaddr.(%s)\n",pushaddr); - if ( IAMLP == 0 ) + while ( 1 ) { - while ( 1 ) - { - now = (uint32_t)time(NULL); - if ( lastforward < now-3600 ) - { - //printf("LP_forwarding_register\n"); - LP_forwarding_register(LP_mypubkey,pushaddr,10); - //printf("done LP_forwarding_register\n"); - lastforward = now; - } - nonz = n = 0; - if ( (counter % 6000) == 0 ) - { - //printf("LP_utxo_updates\n"); - LP_utxo_updates(pubsock,passphrase,profitmargin); - } - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - nonz += LP_subsock_check(peer); - LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,600); - } - if ( pullsock >= 0 ) - { - if ( (n= LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin)) > 0 ) - { - nonz += n; - lastforward = now; - } - } - if ( nonz == 0 ) - usleep(200000); - counter++; - } - } - else - { - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - if ( strcmp(peer->ipaddr,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1") != 0 ) - { - //printf("query utxo from %s\n",peer->ipaddr); - LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",100,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); - } - } - while ( 1 ) - { - nonz = 0; - if ( (counter % 600) == 0 ) - LP_utxo_updates(pubsock,passphrase,profitmargin); - now = (uint32_t)time(NULL); - if ( lastforward < now-3600 ) - { - LP_forwarding_register(LP_mypubkey,pushaddr,10); - lastforward = now; - } - //printf("start peers updates\n"); - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - //printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); - if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != mypeer->numpeers || (rand() % 10000) == 0) ) - { - peer->lastpeers = now; - if ( peer->numpeers != mypeer->numpeers ) - printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,mypeer->numpeers); - if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) - LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer->ipaddr,myport,profitmargin); - } - nonz += LP_subsock_check(peer); - LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,60); - } - if ( (counter % 100) == 0 ) - { - HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) - { - LP_utxo_spentcheck(pubsock,utxo,profitmargin); - } - HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) - { - LP_utxo_spentcheck(pubsock,utxo,profitmargin); - } - } - if ( pullsock >= 0 ) - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); - if ( nonz == 0 ) - usleep(100000); - counter++; - //printf("nonz.%d in mainloop\n",nonz); - } + if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin) == 0 ) + usleep(100000); } } diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index af64c161e..b6dc4b1db 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -57,7 +57,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char { if ( (peer= LP_peerfind(ipbits,port)) != 0 ) { - if ( peer->profitmargin == 0. ) + if ( profitmargin != 0. ) peer->profitmargin = profitmargin; if ( numpeers > peer->numpeers ) peer->numpeers = numpeers; diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index aebff6fb8..bd771857e 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -46,8 +46,38 @@ struct LP_pubkeyinfo UT_hash_handle hh; bits256 pubkey; double matrix[LP_MAXPRICEINFOS][LP_MAXPRICEINFOS]; + uint32_t timestamp; } *LP_pubkeyinfos; +struct LP_priceinfo *LP_priceinfofind(char *symbol) +{ + int32_t i; struct LP_priceinfo *pp; uint64_t coinbits; + if ( LP_numpriceinfos > 0 ) + { + coinbits = stringbits(symbol); + pp = LP_priceinfos; + for (i=0; icoinbits == coinbits ) + return(pp); + } + return(0); +} + +struct LP_priceinfo *LP_priceinfoptr(int32_t *indp,char *base,char *rel) +{ + struct LP_priceinfo *basepp,*relpp; + if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + { + *indp = relpp->ind; + return(basepp); + } + else + { + *indp = -1; + return(0); + } +} + int32_t LP_cachekey(uint8_t *key,char *base,char *rel,bits256 txid,int32_t vout) { uint64_t basebits,relbits; int32_t offset = 0; @@ -104,52 +134,102 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) return(pubp); } -double LP_pricecache(struct LP_quoteinfo *qp,char *base,char *rel,bits256 txid,int32_t vout) +cJSON *LP_pubkeyjson(struct LP_pubkeyinfo *pubp) { - struct LP_cacheinfo *ptr; - if ( (ptr= LP_cachefind(base,rel,txid,vout)) != 0 ) + int32_t baseid,relid; char *base; double price; cJSON *item,*array,*obj; + obj = cJSON_CreateObject(); + array = cJSON_CreateArray(); + for (baseid=0; baseidQ; - if ( ptr->price == 0. && ptr->Q.satoshis != 0 ) + base = LP_priceinfos[baseid].symbol; + for (relid=0; relidprice? "); - ptr->price = (double)ptr->Q.destsatoshis / ptr->Q.satoshis; + if ( (price= pubp->matrix[baseid][relid]) > SMALLVAL ) + { + item = cJSON_CreateArray(); + jaddistr(item,base); + jaddistr(item,LP_priceinfos[relid].symbol); + jaddinum(item,price); + jaddi(array,item); + } } - //printf("found %s/%s %.8f\n",base,rel,ptr->price); - return(ptr->price); } - //char str[65]; printf("cachemiss %s/%s %s/v%d\n",base,rel,bits256_str(str,txid),vout); - return(0.); + jaddbits256(obj,"pubkey",pubp->pubkey); + jaddnum(obj,"timestamp",pubp->timestamp); + jadd(obj,"asks",array); + return(obj); } -struct LP_priceinfo *LP_priceinfofind(char *symbol) +char *LP_prices() { - int32_t i; struct LP_priceinfo *pp; uint64_t coinbits; - if ( LP_numpriceinfos > 0 ) + struct LP_pubkeyinfo *pubp,*tmp; cJSON *array = cJSON_CreateArray(); + HASH_ITER(hh,LP_pubkeyinfos,pubp,tmp) { - coinbits = stringbits(symbol); - pp = LP_priceinfos; - for (i=0; icoinbits == coinbits ) - return(pp); + jaddi(array,LP_pubkeyjson(pubp)); } - return(0); + return(jprint(array,1)); } -struct LP_priceinfo *LP_priceinfoptr(int32_t *indp,char *base,char *rel) +void LP_prices_parse(cJSON *obj) { - struct LP_priceinfo *basepp,*relpp; - if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + struct LP_pubkeyinfo *pubp; struct LP_priceinfo *basepp; uint32_t timestamp; bits256 pubkey; cJSON *asks,*item; int32_t i,n,relid; char *base,*rel; double askprice; + pubkey = jbits256(obj,"pubkey"); + if ( bits256_nonz(pubkey) != 0 && (pubp= LP_pubkeyadd(pubkey)) != 0 ) { - *indp = relpp->ind; - return(basepp); + if ( (timestamp= juint(obj,"timestamp")) > pubp->timestamp && (asks= jarray(&n,obj,"asks")) != 0 ) + { + pubp->timestamp = timestamp; + for (i=0; iind,relid,askprice); + pubp->matrix[basepp->ind][relid] = askprice; + } + } + } } - else +} + +void LP_peer_pricesquery(char *destipaddr,uint16_t destport) +{ + char *retstr; cJSON *array; int32_t i,n; + if ( (retstr= issue_LP_getprices(destipaddr,destport)) != 0 ) { - *indp = -1; - return(0); + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_Array(array) && (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; iQ; + if ( ptr->price == 0. && ptr->Q.satoshis != 0 ) + { + printf("LP_pricecache: null ptr->price? "); + ptr->price = (double)ptr->Q.destsatoshis / ptr->Q.satoshis; + } + //printf("found %s/%s %.8f\n",base,rel,ptr->price); + return(ptr->price); } + //char str[65]; printf("cachemiss %s/%s %s/v%d\n",base,rel,bits256_str(str,txid),vout); + return(0.); } void LP_priceinfoupdate(char *base,char *rel,double price) @@ -193,7 +273,7 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) int32_t LP_mypriceset(char *base,char *rel,double price) { struct LP_priceinfo *basepp,*relpp; - if ( price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + if ( base != 0 && rel != 0 && price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { basepp->myprices[relpp->ind] = price; // ask relpp->myprices[basepp->ind] = (1. / price); // bid @@ -282,6 +362,8 @@ struct LP_priceinfo *LP_priceinfoadd(char *symbol) struct LP_cacheinfo *LP_cacheadd(char *base,char *rel,bits256 txid,int32_t vout,double price,struct LP_quoteinfo *qp) { char str[65]; struct LP_cacheinfo *ptr=0; + if ( base == 0 || rel == 0 ) + return(0); if ( (ptr= LP_cachefind(base,rel,txid,vout)) == 0 ) { ptr = calloc(1,sizeof(*ptr)); @@ -523,8 +605,10 @@ void LP_pricefeedupdate(bits256 pubkey,char *base,char *rel,double price) { printf("PRICEFEED UPDATE.(%s/%s) %.8f %s\n",base,rel,price,bits256_str(str,pubkey)); if ( (pubp= LP_pubkeyadd(pubkey)) != 0 ) + { pubp->matrix[basepp->ind][relpp->ind] = price; - else printf("error creating pubkey entry\n"); + pubp->timestamp = (uint32_t)time(NULL); + } else printf("error creating pubkey entry\n"); } else printf("error finding %s/%s %.8f\n",base,rel,price); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 0c5f29d45..d7f4c79d1 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -89,6 +89,14 @@ char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) return(issue_curlt(url,LP_HTTP_TIMEOUT)); } +char *issue_LP_getprices(char *destip,uint16_t destport) +{ + char url[512]; + sprintf(url,"http://%s:%u/api/stats/getprices",destip,destport); + //printf("getutxo.(%s)\n",url); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); +} + cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) { char *retstr; cJSON *retjson = 0; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 6ee0ecfa7..36e9e0d34 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -203,8 +203,6 @@ int32_t LP_utxopurge(int32_t allutxos) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; - jaddstr(item,"method","notified"); - jaddstr(item,"method2","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); @@ -433,7 +431,7 @@ struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson return(LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"))); } -int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char *retstr,uint32_t now) +int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t now) { struct LP_peerinfo *destpeer,*peer; uint32_t argipbits; char *argipaddr; uint16_t argport,pushport,subport; cJSON *array,*item; int32_t i,n=0; bits256 txid; struct LP_utxoinfo *utxo; //printf("parse.(%s)\n",retstr); @@ -452,13 +450,13 @@ int32_t LP_utxosparse(int32_t mypubsock,char *destipaddr,uint16_t destport,char subport = argport + 2; argipbits = (uint32_t)calc_ipbits(argipaddr); if ( (peer= LP_peerfind(argipbits,argport)) == 0 ) - peer = LP_addpeer(LP_mypeer,mypubsock,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); + peer = LP_addpeer(0,-1,argipaddr,argport,pushport,subport,jdouble(item,"profit"),jint(item,"numpeers"),jint(item,"numutxos")); } if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); //printf("parse.(%s)\n",jprint(item,0)); - if ( (utxo= LP_utxoaddjson(1,mypubsock,item)) != 0 ) + if ( (utxo= LP_utxoaddjson(1,-1,item)) != 0 ) utxo->T.lasttime = now; } } @@ -485,7 +483,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr if ( retstr != 0 ) { now = (uint32_t)time(NULL); - LP_utxosparse(mypubsock,destipaddr,destport,retstr,now); + LP_utxosparse(destipaddr,destport,retstr,now); //printf("got.(%s)\n",retstr); free(retstr); /*i = 0; From ee293e0b4594b1d41bb6b48aa7a8290ea0f9e9fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 11:58:02 +0300 Subject: [PATCH 394/910] Test --- iguana/exchanges/LP_nativeDEX.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 122f9512f..04878e772 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -217,6 +217,8 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso static uint32_t counter,lastforward,numpeers; struct LP_utxoinfo *utxo,*utmp; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t n,nonz = 0; now = (uint32_t)time(NULL); + if ( mypeer == 0 ) + myipaddr = "127.0.0.1"; //printf("start peers updates\n"); n = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) @@ -227,13 +229,13 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->lastpeers = now; if ( peer->numpeers != numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,numpeers); - if ( strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) - LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + if ( strcmp(peer->ipaddr,myipaddr) != 0 ) + LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); } nonz += LP_subsock_check(peer); if ( peer->diduquery == 0 ) { - LP_peer_utxosquery(LP_mypeer,myport,pubsock,peer,now,profitmargin,60); + LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; } From 785e6231f98c46b26f4865292fbd674dba653b35 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 11:59:59 +0300 Subject: [PATCH 395/910] Test --- iguana/exchanges/getprices | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/exchanges/getprices diff --git a/iguana/exchanges/getprices b/iguana/exchanges/getprices new file mode 100755 index 000000000..216b2b86c --- /dev/null +++ b/iguana/exchanges/getprices @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"getprices\",\"coin\":\"REVS\"}" From 2f2ceea2506d1193fb4de51f3483889f50d4cf7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:04:00 +0300 Subject: [PATCH 396/910] Test --- iguana/exchanges/LP_prices.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index bd771857e..68e1de8bf 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -272,11 +272,17 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) int32_t LP_mypriceset(char *base,char *rel,double price) { - struct LP_priceinfo *basepp,*relpp; + struct LP_priceinfo *basepp,*relpp; struct LP_pubkeyinfo *pubp; if ( base != 0 && rel != 0 && price > SMALLVAL && (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) { basepp->myprices[relpp->ind] = price; // ask - relpp->myprices[basepp->ind] = (1. / price); // bid + //relpp->myprices[basepp->ind] = (1. / price); // bid + if ( (pubp= LP_pubkeyadd(LP_mypubkey)) != 0 ) + { + pubp->matrix[basepp->ind][relpp->ind] = price; + //pubp->matrix[relpp->ind][basepp->ind] = (1. / price); + pubp->timestamp = (uint32_t)time(NULL); + } return(0); } else return(-1); } From 47968e570dbfac2fc6be03f8f67a48131f501c4c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:09:27 +0300 Subject: [PATCH 397/910] Test --- iguana/exchanges/LP_nativeDEX.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 04878e772..3ffda9902 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -215,12 +215,16 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; - struct LP_utxoinfo *utxo,*utmp; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t n,nonz = 0; + struct LP_utxoinfo *utxo,*utmp; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0; now = (uint32_t)time(NULL); if ( mypeer == 0 ) myipaddr = "127.0.0.1"; //printf("start peers updates\n"); - n = 0; + numpeers = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + numpeers++; + } HASH_ITER(hh,LP_peerinfos,peer,tmp) { //printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); @@ -240,7 +244,6 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->diduquery = now; } } - numpeers = n; if ( lastforward < now-3600 ) { LP_forwarding_register(LP_mypubkey,pushaddr,10); From 229d4d931ec536cae7d801e4bb71a08915ae71ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:11:41 +0300 Subject: [PATCH 398/910] 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 3ffda9902..cffd75b86 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -227,7 +227,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - //printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); + printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { peer->lastpeers = now; From 9142ca37359a9b0f08825d690f9093aa33229117 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:14:34 +0300 Subject: [PATCH 399/910] 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 cffd75b86..30ff70c8d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -227,9 +227,9 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { + printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); peer->lastpeers = now; if ( peer->numpeers != numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,numpeers); From b2fbf61efdb1d8277f155c2a0c0c0e64686c7f76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:14:50 +0300 Subject: [PATCH 400/910] 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 30ff70c8d..d314c9eb6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -229,7 +229,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { - printf("updatepeer.%s lag.%d\n",peer->ipaddr,now-peer->lastpeers); + printf("numpeers.%d updatepeer.%s lag.%d\n",numpeers,peer->ipaddr,now-peer->lastpeers); peer->lastpeers = now; if ( peer->numpeers != numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,numpeers); From 208c3c4f6ba87458b6a2d3a851fd6a6c62065ccd Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:40:33 +0300 Subject: [PATCH 401/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 ++ iguana/exchanges/LP_prices.c | 41 ++++++++++++++++++--------------- iguana/exchanges/LP_utxos.c | 1 + 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d314c9eb6..c368b6b7a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -260,6 +260,8 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) { LP_utxo_spentcheck(pubsock,utxo,profitmargin); + if ( utxo->T.lasttime == 0 ) + LP_utxo_clientpublish(utxo); } } if ( pullsock >= 0 ) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 68e1de8bf..9c559ce73 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -461,9 +461,30 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx return(-1); } +int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) +{ + struct LP_peerinfo *peer,*tmp; cJSON *retjson; char *retstr; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (retstr= issue_LP_notifyutxo(peer->ipaddr,peer->port,utxo)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jobj(retjson,"error") == 0 ) + utxo->T.lasttime = (uint32_t)time(NULL); + free_json(retjson); + } + free(retstr); + } + if ( utxo->T.lasttime != 0 ) + return(0); + } + return(-1); +} + int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char *rel,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum) { - struct LP_utxoinfo *utxo,*tmp; struct LP_pubkeyinfo *pubp; struct LP_peerinfo *peer,*ptmp; char *retstr; cJSON *retjson; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; double price; int32_t baseid,relid; uint64_t basesatoshis; + struct LP_utxoinfo *utxo,*tmp; struct LP_pubkeyinfo *pubp; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; double price; int32_t baseid,relid; uint64_t basesatoshis; if ( (basepp= LP_priceinfoptr(&relid,base,rel)) != 0 ) baseid = basepp->ind; else return(num); @@ -482,23 +503,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) - { - HASH_ITER(hh,LP_peerinfos,peer,ptmp) - { - if ( (retstr= issue_LP_notifyutxo(peer->ipaddr,peer->port,utxo)) != 0 ) - { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - if ( jobj(retjson,"error") == 0 ) - utxo->T.lasttime = (uint32_t)time(NULL); - free_json(retjson); - } - free(retstr); - } - if ( utxo->T.lasttime != 0 ) - break; - } - } + LP_utxo_clientpublish(utxo); } } } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 36e9e0d34..f450f2a48 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -420,6 +420,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); + else LP_utxo_clientpublish(utxo); if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) LP_mypeer->numutxos++; } From a92476a7f85e486e3b4f6643fa9a2ca058810f1a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:43:09 +0300 Subject: [PATCH 402/910] 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 d7f4c79d1..77f6a4b45 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -65,7 +65,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65],str3[65]; - sprintf(url,"http://%s:%u/api/stats/notified?method=notified&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curlt(url,LP_HTTP_TIMEOUT)); From 907e5fcd87b0278e1e81ebe25ec7124e5b282826 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:44:13 +0300 Subject: [PATCH 403/910] Test --- iguana/exchanges/LP_commands.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 297ea0219..bef533d7c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -426,11 +426,9 @@ forwardhex(pubkey,hex)\n\ retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); else if ( strcmp(method,"notified") == 0 ) { + printf("utxonotify.(%s)\n",jprint(argjson,0)); if ( juint(argjson,"timestamp") > time(NULL)-60 ) - { - printf("utxonotify.(%s)\n",jprint(argjson,0)); LP_utxoaddjson(1,LP_mypubsock,argjson); - } retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } else if ( IAMLP != 0 ) From 3fb6ac1ef87cbafafbfa96f7b6db1491939933df Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:48:49 +0300 Subject: [PATCH 404/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bef533d7c..76e5fc10a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -266,7 +266,7 @@ forward(pubkey,method2,)\n\ forward(pubkey,method2=publish,)\n\ forwardhex(pubkey,hex)\n\ \"}")); - //printf("CMD.(%s)\n",jprint(argjson,0)); + printf("CMD.(%s)\n",jprint(argjson,0)); base = jstr(argjson,"base"); rel = jstr(argjson,"rel"); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) From 3b11e8a10541886a137b7ea7b535d27a4ff7346f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:51:06 +0300 Subject: [PATCH 405/910] Test --- iguana/exchanges/LP_commands.c | 3 +-- iguana/exchanges/LP_utxos.c | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 76e5fc10a..d0278df45 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -237,7 +237,7 @@ char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (method= jstr(argjson,"method")) == 0 ) { - printf("(%s)\n",jprint(argjson,0)); + printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); } else if ( strcmp(method,"help") == 0 ) @@ -266,7 +266,6 @@ forward(pubkey,method2,)\n\ forward(pubkey,method2=publish,)\n\ forwardhex(pubkey,hex)\n\ \"}")); - printf("CMD.(%s)\n",jprint(argjson,0)); base = jstr(argjson,"base"); rel = jstr(argjson,"rel"); if ( USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f450f2a48..e6f29e506 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -203,6 +203,7 @@ int32_t LP_utxopurge(int32_t allutxos) cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; + jaddstr(item,"method","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddstr(item,"address",utxo->coinaddr); From 28eaf6155c0d72c04a2cf62918f72090bdb2aa79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 12:55:39 +0300 Subject: [PATCH 406/910] Test --- iguana/exchanges/LP_commands.c | 50 ++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d0278df45..d7d6302a6 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -234,13 +234,36 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) + { + if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) + { + flag = 1; + if ( (pushport= juint(argjson,"push")) == 0 ) + pushport = argport + 1; + if ( (subport= juint(argjson,"sub")) == 0 ) + subport = argport + 2; + if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),argport)) != 0 ) + { + if ( 0 && (otherpeers= jint(argjson,"numpeers")) > peer->numpeers ) + peer->numpeers = otherpeers; + if ( 0 && (othernumutxos= jint(argjson,"numutxos")) > peer->numutxos ) + { + printf("change.(%s) numutxos.%d -> %d mynumutxos.%d\n",peer->ipaddr,peer->numutxos,othernumutxos,LP_mypeer != 0 ? LP_mypeer->numutxos:0); + peer->numutxos = othernumutxos; + } + //printf("peer.(%s) found (%d %d) (%d %d) (%s)\n",peer->ipaddr,peer->numpeers,peer->numutxos,otherpeers,othernumutxos,jprint(argjson,0)); + } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); + } + } if ( (method= jstr(argjson,"method")) == 0 ) { - printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); + if ( flag == 0 ) + printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); } - else if ( strcmp(method,"help") == 0 ) + if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ available localhost RPC commands:\n \ setprice(base, rel, price)\n\ @@ -368,27 +391,6 @@ forwardhex(pubkey,hex)\n\ return(clonestr("{\"error\":\"at least one of coins disabled\"}")); if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) return(clonestr("{\"error\":\"coin is disabled\"}")); - if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) - { - if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) - { - if ( (pushport= juint(argjson,"push")) == 0 ) - pushport = argport + 1; - if ( (subport= juint(argjson,"sub")) == 0 ) - subport = argport + 2; - if ( (peer= LP_peerfind((uint32_t)calc_ipbits(ipaddr),argport)) != 0 ) - { - if ( 0 && (otherpeers= jint(argjson,"numpeers")) > peer->numpeers ) - peer->numpeers = otherpeers; - if ( 0 && (othernumutxos= jint(argjson,"numutxos")) > peer->numutxos ) - { - printf("change.(%s) numutxos.%d -> %d mynumutxos.%d\n",peer->ipaddr,peer->numutxos,othernumutxos,LP_mypeer != 0 ? LP_mypeer->numutxos:0); - peer->numutxos = othernumutxos; - } - //printf("peer.(%s) found (%d %d) (%d %d) (%s)\n",peer->ipaddr,peer->numpeers,peer->numutxos,otherpeers,othernumutxos,jprint(argjson,0)); - } else LP_addpeer(LP_mypeer,LP_mypubsock,ipaddr,argport,pushport,subport,jdouble(argjson,"profit"),jint(argjson,"numpeers"),jint(argjson,"numutxos")); - } - } if ( strcmp(method,"reserved") == 0 ) retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) From 212c3d8bed659a823411ee43ecd667f938effd88 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:22:31 +0300 Subject: [PATCH 407/910] Test --- iguana/exchanges/LP_commands.c | 4 ++- iguana/exchanges/LP_prices.c | 62 ++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d7d6302a6..946b428fd 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -259,7 +259,7 @@ char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) } if ( (method= jstr(argjson,"method")) == 0 ) { - if ( flag == 0 ) + if ( flag == 0 && jobj(argjson,"result") == 0 ) printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); } @@ -386,6 +386,8 @@ forwardhex(pubkey,hex)\n\ return(basilisk_swapentry(requestid,quoteid)); else return(basilisk_swaplist()); } + else if ( strcmp(method,"myprices") == 0 ) + return(LP_myprices()); } if ( LP_isdisabled(base,rel) != 0 ) return(clonestr("{\"error\":\"at least one of coins disabled\"}")); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 9c559ce73..eb6138967 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -244,7 +244,7 @@ void LP_priceinfoupdate(char *base,char *rel,double price) } } -double LP_myprice(double *bidp,double *askp,char *base,char *rel) +/*double LP_myprice(double *bidp,double *askp,char *base,char *rel) { struct LP_priceinfo *basepp,*relpp; double val; *bidp = *askp = 0.; @@ -268,6 +268,62 @@ double LP_myprice(double *bidp,double *askp,char *base,char *rel) } } return(0.); +}*/ + +double LP_myprice(double *bidp,double *askp,char *base,char *rel) +{ + struct LP_priceinfo *basepp,*relpp; double val; + *bidp = *askp = 0.; + if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) + { + if ( (*askp= basepp->myprices[relpp->ind]) > SMALLVAL ) + { + if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) + { + *bidp = 1. / val; + return((*askp + *bidp) * 0.5); + } + else + { + *bidp = 0.; + return(*askp); + } + } + else + { + if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) + { + *bidp = 1. / val; + *askp = 0.; + return(*bidp); + } + } + } + return(0.); +} + +char *LP_myprices() +{ + int32_t baseid,relid; double bid,ask; char *base,*rel; cJSON *item,*array; + array = cJSON_CreateArray(); + for (baseid=0; baseid SMALLVAL ) + { + item = cJSON_CreateObject(); + jaddstr(item,"base",base); + jaddstr(item,"rel",rel); + jaddnum(item,"bid",bid); + jaddnum(item,"ask",ask); + jaddi(array,item); + } + } + } + return(jprint(array,1)); } int32_t LP_mypriceset(char *base,char *rel,double price) @@ -497,9 +553,9 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * { //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); - if ( polarity > 0 ) + //if ( polarity > 0 ) basesatoshis = utxo->payment.value; - else basesatoshis = utxo->payment.value * price; + //else basesatoshis = utxo->payment.value * price; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) From 54752e688e15d7de6d5fbb5570a72f21994af482 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:23:01 +0300 Subject: [PATCH 408/910] Test --- iguana/exchanges/myprices | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/exchanges/myprices diff --git a/iguana/exchanges/myprices b/iguana/exchanges/myprices new file mode 100755 index 000000000..7333d682b --- /dev/null +++ b/iguana/exchanges/myprices @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"myprices\"}" From aba327b139d06cfdd130ffef7e70867e02417af9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:26:47 +0300 Subject: [PATCH 409/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 946b428fd..d37be6f1a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -429,8 +429,8 @@ forwardhex(pubkey,hex)\n\ retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); else if ( strcmp(method,"notified") == 0 ) { - printf("utxonotify.(%s)\n",jprint(argjson,0)); - if ( juint(argjson,"timestamp") > time(NULL)-60 ) + //printf("utxonotify.(%s)\n",jprint(argjson,0)); + //if ( juint(argjson,"timestamp") > time(NULL)-60 ) LP_utxoaddjson(1,LP_mypubsock,argjson); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } From 114ec7872c51bbf70bdaa88fa1ef2f9fe66d758f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:46:12 +0300 Subject: [PATCH 410/910] Test --- iguana/exchanges/LP_commands.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index d37be6f1a..cb20e74fb 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -281,7 +281,6 @@ getpeers()\n\ getutxos()\n\ getutxos(coin, lastn)\n\ orderbook(base, rel)\n\ -getprice(base, rel)\n\ getprices(base, rel)\n\ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ @@ -405,8 +404,8 @@ forwardhex(pubkey,hex)\n\ retstr = LP_postedprice(argjson); else if ( strcmp(method,"broadcast") == 0 ) retstr = LP_broadcasted(argjson); - else if ( strcmp(method,"getprice") == 0 ) - retstr = LP_pricestr(base,rel,0.); + //else if ( strcmp(method,"getprice") == 0 ) + // retstr = LP_pricestr(base,rel,0.); else if ( strcmp(method,"getprices") == 0 ) retstr = LP_prices(); else if ( strcmp(method,"orderbook") == 0 ) From 8c36ea63bc289e90933dd1568bc822b00db36263 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:46:54 +0300 Subject: [PATCH 411/910] Test --- iguana/exchanges/getprice | 2 -- 1 file changed, 2 deletions(-) delete mode 100755 iguana/exchanges/getprice diff --git a/iguana/exchanges/getprice b/iguana/exchanges/getprice deleted file mode 100755 index 4b9614be7..000000000 --- a/iguana/exchanges/getprice +++ /dev/null @@ -1,2 +0,0 @@ -source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"getprice\",\"base\":\"REVS\",\"rel\":\"KMD\"}" From c9d1d7fd6ddc9cfdde98840546b05f9abad0133f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 13:57:45 +0300 Subject: [PATCH 412/910] Test --- iguana/exchanges/LP_commands.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index cb20e74fb..1d018dca9 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -271,8 +271,7 @@ myprice(base, rel)\n\ enable(coin)\n\ disable(coin)\n\ inventory(coin)\n\ -candidates(txid, vout)\n\ -autotrade(txid, vout, maxprice)\n\ +autotrade(base, rel, maxvolume, maxprice)\n\ swapstatus()\n\ swapstatus(requestid, quoteid)\n\ public API:\n \ From 76a2dae871712ad876ac88680f71041f057fbe62 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 15:47:35 +0300 Subject: [PATCH 413/910] Test --- iguana/exchanges/LP_commands.c | 232 +---------------- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_prices.c | 2 +- iguana/exchanges/LP_quotes.c | 400 ++++++++++++++++++----------- iguana/exchanges/LP_statemachine.c | 117 +++++++++ iguana/exchanges/LP_utxos.c | 17 ++ 6 files changed, 390 insertions(+), 380 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 1d018dca9..a3c70645a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -18,219 +18,6 @@ // marketmaker // -// price query is redundant as there is a pricefeed for all pubkeys now -// get orderbook, find pubkey of the one offering it and directly reserve it -// then it is the same as current logic, just skip the "price" step -// "notified" push is wrong - -double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub) -{ - cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; - qp->desthash = mypub; - strcpy(qp->srccoin,base); - strcpy(qp->destcoin,rel); - qp->desthash = LP_mypubkey; - if ( strcmp(method,"request") == 0 ) - { - qp->quotetime = (uint32_t)time(NULL); - if ( (utxo= LP_utxofind(0,qp->desttxid,qp->destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) - LP_unavailableset(utxo,qp->srchash); - else - { - printf("couldnt find my txid to make request\n"); - return(0.); - } - } - reqjson = LP_quotejson(qp); - if ( bits256_nonz(qp->desthash) != 0 ) - flag = 1; - jaddstr(reqjson,"method",method); - if ( strcmp(method,"price") != 0 ) - printf("QUERY.(%s)\n",jprint(reqjson,0)); - LP_forward(qp->srchash,jprint(reqjson,1),1); - for (i=0; i<30; i++) - { - if ( (price= LP_pricecache(qp,base,rel,qp->txid,qp->vout)) > SMALLVAL ) - { - if ( flag == 0 || bits256_nonz(qp->desthash) != 0 ) - { - //printf("break out of loop.%d price %.8f\n",i,price); - break; - } - } - usleep(100000); - } - return(price); -} - -int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) -{ - char *retstr,pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; - if ( (price= LP_price(base,rel)) > SMALLVAL ) - { - price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - if ( LP_quoteparse(&Q,argjson) < 0 ) - return(-2); - //printf("connect with.(%s)\n",jprint(argjson,0)); - Q.destsatoshis = Q.satoshis * price; - privkey = LP_privkey(utxo->coinaddr); - if ( bits256_nonz(utxo->S.mypub) == 0 ) - utxo->S.mypub = LP_pubkey(privkey); - if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) - { - printf("not eligible\n"); - return(-1); - } - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) - { - nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); - if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) - printf("error creating utxo->pair\n"); - else if ( nn_bind(pair,pairstr) >= 0 ) - { - LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - swap = LP_swapinit(1,0,privkey,&Q.R,&Q); - swap->N.pair = pair; - utxo->S.swap = swap; - swap->utxo = utxo; - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)swap) == 0 ) - { - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","connected"); - jaddstr(retjson,"pair",pairstr); - jaddnum(retjson,"requestid",Q.R.requestid); - jaddnum(retjson,"quoteid",Q.R.quoteid); - retstr = jprint(retjson,1); - if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); - else LP_forward(utxo->S.otherpubkey,retstr,1); - retval = 0; - } else printf("error launching swaploop\n"); - } else printf("printf error nn_connect to %s\n",pairstr); - } - else - { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); - } - } else printf("no price for %s/%s\n",base,rel); - if ( retval < 0 ) - { - if ( pair >= 0 ) - nn_close(pair); - LP_availableset(utxo); - } - return(retval); -} - -char *LP_connected(cJSON *argjson) // alice -{ - cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; - LP_quoteparse(&Q,argjson); - if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) - { - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) - { - char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(clonestr("{\"error\",\"src txid in mempool\"}")); - } - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) - { - char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(clonestr("{\"error\",\"dest txid in mempool\"}")); - } - retjson = cJSON_CreateObject(); - if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) - jaddstr(retjson,"error","couldnt create pairsock"); - else if ( nn_connect(pairsock,pairstr) >= 0 ) - { - LP_unavailableset(utxo,Q.srchash); - Q.privkey = LP_privkey(Q.destaddr); - LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); - swap->N.pair = pairsock; - utxo->S.swap = swap; - swap->utxo = utxo; - printf("alice pairstr.(%s)\n",pairstr); - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) - { - jaddstr(retjson,"result","success"); - jadd(retjson,"trade",LP_quotejson(&Q)); - jaddnum(retjson,"requestid",Q.R.requestid); - jaddnum(retjson,"quoteid",Q.R.quoteid); - } else jaddstr(retjson,"error","couldnt aliceloop"); - } - return(jprint(retjson,1)); - } else return(clonestr("{\"result\",\"update stats\"}")); -} - -int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) -{ - char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; - if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) - { - retval = 1; - txid = jbits256(argjson,"txid"); - if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) - { - printf("LP_tradecommand.(%s)\n",jprint(argjson,0)); - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) - { - char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - utxo->T.spentflag = (uint32_t)time(NULL); - return(0); - } - if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) - utxo->T.swappending = 0; - if ( strcmp(method,"request") == 0 ) // bob - { - retval = 1; - if ( LP_isavailable(utxo) > 0 ) - { - if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) - { - price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) - { - printf("not eligible\n"); - return(-1); - } - Q.timestamp = (uint32_t)time(NULL); - retjson = LP_quotejson(&Q); - utxo->S.otherpubkey = jbits256(argjson,"desthash"); - retval |= 2; - LP_unavailableset(utxo,jbits256(argjson,"desthash")); - jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); - jaddnum(retjson,"pending",utxo->T.swappending); - jaddbits256(retjson,"desthash",utxo->S.otherpubkey); - jaddstr(retjson,"method","reserved"); - retstr = jprint(retjson,1); - if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); - else LP_forward(utxo->S.otherpubkey,retstr,1); - utxo->T.lasttime = (uint32_t)time(NULL); - } else printf("null price\n"); - } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); - } - else if ( strcmp(method,"connect") == 0 ) // bob - { - retval = 4; - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,jstr(argjson,"destcoin"),jbits256(argjson,"desttxid"),jint(argjson,"destvout"),jbits256(argjson,"feetxid"),jint(argjson,"feevout"))) >= 0 ) - { - char str[65]; printf("LP_tradecommand fee selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(0); - } - if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) - LP_connectstart(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); - else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); - } - } - } - return(retval); -} char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { @@ -271,7 +58,7 @@ myprice(base, rel)\n\ enable(coin)\n\ disable(coin)\n\ inventory(coin)\n\ -autotrade(base, rel, maxvolume, maxprice)\n\ +autotrade(base, rel, price, volume)\n\ swapstatus()\n\ swapstatus(requestid, quoteid)\n\ public API:\n \ @@ -361,21 +148,8 @@ forwardhex(pubkey,hex)\n\ return(jprint(retjson,1)); } } - else if ( (strcmp(method,"candidates") == 0 || strcmp(method,"autotrade") == 0) ) - { - bits256 txid; int32_t vout; struct LP_utxoinfo *utxo; - txid = jbits256(argjson,"txid"); - if ( bits256_nonz(txid) == 0 ) - return(clonestr("{\"error\":\"invalid or missing txid\"}")); - if ( jobj(argjson,"vout") == 0 ) - return(clonestr("{\"error\":\"missing vout\"}")); - vout = jint(argjson,"vout"); - if ( (utxo= LP_utxofind(0,txid,vout)) == 0 ) - return(clonestr("{\"error\":\"txid/vout not found\"}")); - if ( strcmp(method,"candidates") == 0 ) - return(jprint(LP_tradecandidates(coin),1)); - else return(jprint(LP_autotrade(utxo,coin,jdouble(argjson,"maxprice")),1)); - } + else if ( strcmp(method,"autotrade") == 0 ) + return(LP_autotrade(base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); } else if ( strcmp(method,"swapstatus") == 0 ) { diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 87fe57170..7b4bd45aa 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -218,7 +218,7 @@ uint32_t basilisk_quoteid(struct basilisk_request *rp); struct basilisk_swap *LP_swapinit(int32_t iambob,int32_t optionduration,bits256 privkey,struct basilisk_request *rp,struct LP_quoteinfo *qp); char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params); uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend); -double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); +//double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index eb6138967..252a5ccd4 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -483,7 +483,7 @@ cJSON *LP_orderbookjson(struct LP_orderbookentry *op) cJSON *item = cJSON_CreateObject(); if ( op->price > SMALLVAL ) { - jaddnum(item,"price",op->price ); + jaddnum(item,"price",op->price); jaddnum(item,"volume",dstr(op->basesatoshis)); jaddbits256(item,"txid",op->txid); jaddnum(item,"vout",op->vout); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index c1a104e3d..069d63575 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -145,22 +145,15 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * return(0); } -int32_t LP_quoteinfoset(struct LP_quoteinfo *qp,uint32_t timestamp,uint32_t quotetime,uint64_t value,uint64_t txfee,uint64_t destsatoshis,uint64_t desttxfee,bits256 desttxid,int32_t destvout,bits256 desthash,char *destaddr) +int32_t LP_quotedestinfo(struct LP_quoteinfo *qp,uint32_t quotetime,uint64_t destsatoshis,bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout,bits256 desthash,char *destaddr) { - if ( txfee != qp->txfee ) - { - if ( txfee >= value ) - return(-1); - qp->txfee = txfee; - qp->satoshis = value - txfee; - } - qp->timestamp = timestamp; qp->quotetime = quotetime; qp->destsatoshis = destsatoshis; - qp->desttxfee = desttxfee; qp->desttxid = desttxid; qp->destvout = destvout; qp->desthash = desthash; + qp->feetxid = feetxid; + qp->feevout = feevout; safecopy(qp->destaddr,destaddr,sizeof(qp->destaddr)); return(0); } @@ -236,182 +229,291 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) return(-1); } -cJSON *LP_tradecandidates(char *base) +double LP_query(char *method,struct LP_quoteinfo *qp) { - struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; - totaladded = 0; - HASH_ITER(hh,LP_peerinfos,peer,tmp) + cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; + if ( strcmp(method,"request") == 0 ) + { + qp->quotetime = (uint32_t)time(NULL); + if ( (utxo= LP_utxofind(0,qp->desttxid,qp->destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) + LP_unavailableset(utxo,qp->srchash); + else + { + printf("couldnt find my txid to make request\n"); + return(0.); + } + } + reqjson = LP_quotejson(qp); + if ( bits256_nonz(qp->desthash) != 0 ) + flag = 1; + jaddstr(reqjson,"method",method); + printf("QUERY.(%s)\n",jprint(reqjson,0)); + LP_forward(qp->srchash,jprint(reqjson,1),1); + for (i=0; i<30; i++) { - printf("%s:%u %s\n",peer->ipaddr,peer->port,base); - n = added = 0; - if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) + if ( (price= LP_pricecache(qp,qp->srccoin,qp->destcoin,qp->txid,qp->vout)) > SMALLVAL ) { - printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); - if ( (array= cJSON_Parse(utxostr)) != 0 ) + if ( flag == 0 || bits256_nonz(qp->desthash) != 0 ) { - if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) - { - retarray = cJSON_CreateArray(); - for (i=0; i SMALLVAL ) + { + price *= (1. + profitmargin); + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + if ( LP_quoteparse(&Q,argjson) < 0 ) + return(-2); + printf("connect with.(%s)\n",jprint(argjson,0)); + Q.destsatoshis = Q.satoshis * price; + privkey = LP_privkey(utxo->coinaddr); + if ( bits256_nonz(utxo->S.mypub) == 0 ) + utxo->S.mypub = LP_pubkey(privkey); + if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) + { + printf("not eligible\n"); + return(-1); + } + if ( utxo->payment.value > (Q.satoshis << 1) ) + { + printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(utxo->payment.value),dstr(Q.satoshis)); + return(-1); + } + if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + { + nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); + if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) + printf("error creating utxo->pair\n"); + else if ( nn_bind(pair,pairstr) >= 0 ) + { + LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); + swap = LP_swapinit(1,0,privkey,&Q.R,&Q); + swap->N.pair = pair; + utxo->S.swap = swap; + swap->utxo = utxo; + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)swap) == 0 ) + { + retjson = LP_quotejson(&Q); + jaddstr(retjson,"method","connected"); + jaddstr(retjson,"pair",pairstr); + jaddnum(retjson,"requestid",Q.R.requestid); + jaddnum(retjson,"quoteid",Q.R.quoteid); + retstr = jprint(retjson,1); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else LP_forward(utxo->S.otherpubkey,retstr,1); + retval = 0; + } else printf("error launching swaploop\n"); + } else printf("printf error nn_connect to %s\n",pairstr); + } + else { - printf("n.%d totaladded.%d vs added.%d\n",n,totaladded,added); - break; + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); } + } else printf("no price for %s/%s\n",base,rel); + if ( retval < 0 ) + { + if ( pair >= 0 ) + nn_close(pair); + LP_availableset(utxo); } - return(retarray); + return(retval); } -void LP_quotesinit(char *base,char *rel) +char *LP_connected(cJSON *argjson) // alice { - cJSON *array,*item; struct LP_quoteinfo Q; bits256 zero; int32_t i,n,iter; - memset(&zero,0,sizeof(zero)); - for (iter=0; iter<2; iter++) - if ( (array= LP_tradecandidates(iter == 0 ? base : rel)) != 0 ) + cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; + LP_quoteparse(&Q,argjson); + if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) { - //printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); - if ( (n= cJSON_GetArraySize(array)) > 0 ) + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) + { + char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(clonestr("{\"error\",\"src txid in mempool\"}")); + } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) + { + char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(clonestr("{\"error\",\"dest txid in mempool\"}")); + } + retjson = cJSON_CreateObject(); + if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) + jaddstr(retjson,"error","couldnt create pairsock"); + else if ( nn_connect(pairsock,pairstr) >= 0 ) { - memset(&Q,0,sizeof(Q)); - for (i=0; iN.pair = pairsock; + utxo->S.swap = swap; + swap->utxo = utxo; + printf("alice pairstr.(%s)\n",pairstr); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) { - item = jitem(array,i); - LP_quoteparse(&Q,item); - if ( iter == 0 ) - LP_query("price",&Q,base,rel,zero); - else LP_query("price",&Q,rel,base,zero); - } + jaddstr(retjson,"result","success"); + jadd(retjson,"trade",LP_quotejson(&Q)); + jaddnum(retjson,"requestid",Q.R.requestid); + jaddnum(retjson,"quoteid",Q.R.quoteid); + } else jaddstr(retjson,"error","couldnt aliceloop"); } - free_json(array); - } + return(jprint(retjson,1)); + } else return(clonestr("{\"result\",\"update stats\"}")); } -cJSON *LP_autotrade(struct LP_utxoinfo *myutxo,char *base,double maxprice) +int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - static bits256 zero; - int32_t i,n,besti,DEXselector=0; cJSON *array,*item,*bestitem=0; struct basilisk_request R; double bestmetric,metric,bestprice=0.,price,prices[100]; struct LP_quoteinfo Q[sizeof(prices)/sizeof(*prices)]; - bestprice = 0.; - if ( maxprice == 0. ) - maxprice = LP_price(base,myutxo->coin) / 0.975; - if ( (array= LP_tradecandidates(base)) != 0 ) + char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; + if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { - printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); - if ( (n= cJSON_GetArraySize(array)) > 0 ) + retval = 1; + txid = jbits256(argjson,"txid"); + if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { - memset(prices,0,sizeof(prices)); - memset(Q,0,sizeof(Q)); - for (i=0; icoin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) { - item = jitem(array,i); - LP_quoteparse(&Q[i],item); - if ( (price= jdouble(item,"price")) == 0. ) - { - price = LP_query("price",&Q[i],base,myutxo->coin,zero); - Q[i].destsatoshis = price * Q[i].satoshis; - } - if ( (prices[i]= price) > SMALLVAL && (bestprice == 0. || price < bestprice) ) - bestprice = price; - char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); + char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + utxo->T.spentflag = (uint32_t)time(NULL); + return(0); } - if ( bestprice > SMALLVAL ) + if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) + utxo->T.swappending = 0; + if ( strcmp(method,"request") == 0 ) // bob { - bestmetric = 0.; - besti = -1; - for (i=0; i 0 ) { - if ( (price= prices[i]) > SMALLVAL && myutxo->S.satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) + if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) { - metric = price / bestprice; - printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); - if ( metric < 1.1 ) + price *= (1. + profitmargin); + if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + return(-1); + if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { - metric = dstr(Q[i].destsatoshis) * metric * metric * metric; - printf("%f\n",metric); - if ( bestmetric == 0. || metric < bestmetric ) - { - besti = i; - bestmetric = metric; - } + printf("not eligible\n"); + return(-1); } - } else printf("(%f %f) ",dstr(myutxo->S.satoshis),dstr(Q[i].destsatoshis)); + Q.timestamp = (uint32_t)time(NULL); + retjson = LP_quotejson(&Q); + utxo->S.otherpubkey = jbits256(argjson,"desthash"); + retval |= 2; + LP_unavailableset(utxo,jbits256(argjson,"desthash")); + jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); + jaddnum(retjson,"pending",utxo->T.swappending); + jaddbits256(retjson,"desthash",utxo->S.otherpubkey); + jaddstr(retjson,"method","reserved"); + retstr = jprint(retjson,1); + if ( pubsock >= 0 ) + LP_send(pubsock,retstr,1); + else LP_forward(utxo->S.otherpubkey,retstr,1); + utxo->T.lasttime = (uint32_t)time(NULL); + } else printf("null price\n"); + } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); + } + else if ( strcmp(method,"connect") == 0 ) // bob + { + retval = 4; + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,jstr(argjson,"destcoin"),jbits256(argjson,"desttxid"),jint(argjson,"destvout"),jbits256(argjson,"feetxid"),jint(argjson,"feevout"))) >= 0 ) + { + char str[65]; printf("LP_tradecommand fee selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); } - printf("metrics, best %f\n",bestmetric); - if ( besti >= 0 )//&& bits256_cmp(myutxo->mypub,otherpubs[besti]) == 0 ) + if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) + LP_connectstart(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); + else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); + } + } + } + return(retval); +} + +char *LP_autotrade(char *base,char *rel,double maxprice,double volume) +{ + uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) + return(clonestr("{\"error\":\"invalid parameter\"}")); + destsatoshis = SATOSHIDEN * volume; + if ( (autxo= LP_utxo_bestfit(rel,destsatoshis)) == 0 ) + return(clonestr("{\"error\":\"cant find utxo that is big enough\"}")); + bestmetric = ordermatchprice = 0.; + if ( (obookstr= LP_orderbook(base,rel)) != 0 ) + { + if ( (orderbook= cJSON_Parse(obookstr)) != 0 ) + { + if ( (asks= jarray(&numasks,orderbook,"asks")) != 0 ) + { + for (i=0; i SMALLVAL && price <= maxprice ) { - Q[i].desttxid = myutxo->payment.txid; - Q[i].destvout = myutxo->payment.vout; - Q[i].feetxid = myutxo->fee.txid; - Q[i].feevout = myutxo->fee.vout; - strcpy(Q[i].destaddr,myutxo->coinaddr); - Q[i].desthash = LP_mypubkey; - strcpy(Q[i].srccoin,base); - strcpy(Q[i].destcoin,myutxo->coin); - price = LP_query("request",&Q[i],base,myutxo->coin,myutxo->S.mypub); - if ( jobj(bestitem,"price") != 0 ) - jdelete(bestitem,"price"); - jaddnum(bestitem,"price",prices[i]); - if ( price <= maxprice ) - { - Q[i].desttxid = myutxo->payment.txid; - Q[i].destvout = myutxo->payment.vout; - Q[i].feetxid = myutxo->fee.txid; - Q[i].feevout = myutxo->fee.vout; - strcpy(Q[i].destaddr,myutxo->coinaddr); - Q[i].desthash = LP_mypubkey; - strcpy(Q[i].srccoin,base); - strcpy(Q[i].destcoin,myutxo->coin); - price = LP_query("connect",&Q[i],base,myutxo->coin,myutxo->S.mypub); - LP_requestinit(&R,Q[i].srchash,Q[i].desthash,base,Q[i].satoshis,Q[i].destcoin,Q[i].destsatoshis,Q[i].timestamp,Q[i].quotetime,DEXselector); - jaddstr(bestitem,"status","connected"); - jaddnum(bestitem,"requestid",R.requestid); - jaddnum(bestitem,"quoteid",R.quoteid); - printf("Alice r.%u q.%u\n",R.requestid,R.quoteid); - } - else + pubkey = jbits256(item,"pubkey"); + if ( bits256_cmp(pubkey,LP_mypubkey) != 0 ) { - jaddstr(bestitem,"status","too expensive"); - jaddnum(bestitem,"price",price); - jaddnum(bestitem,"maxprice",maxprice); - jaddnum(bestitem,"bestprice",bestprice); + if ( bestprice == 0. ) // assumes price ordered asks + bestprice = price; + txid = jbits256(item,"txid"); + vout = jint(item,"vout"); + vol = jdouble(item,"volume"); + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + { + asatoshis = butxo->payment.value * price; + if ( asatoshis <= destsatoshis && destsatoshis > (asatoshis >> 1) ) + { + metric = price / bestprice; + printf("%f %f %f %f ",price,metric,dstr(asatoshis),metric * metric * metric); + if ( metric < 1.1 ) + { + metric = dstr(asatoshis) * metric * metric * metric; + printf("(%f) <- metric\n",metric); + if ( bestmetric == 0. || metric < bestmetric ) + { + bestutxo = butxo; + ordermatchprice = price; + bestmetric = metric; + } + } + } + } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } - } + } else break; } } - free_json(array); + free_json(orderbook); } + free(obookstr); } - if ( bestitem == 0 ) - return(cJSON_Parse("{\"error\":\"no match found\"}")); - return(bestitem); + if ( bestutxo == 0 || ordermatchprice == 0. ) + return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); + asatoshis = bestutxo->payment.value * ordermatchprice; + if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) + return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); + if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) + return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); + price = LP_query("request",&Q); + if ( price <= maxprice ) + { + bestitem = LP_quotejson(&Q); + price = LP_query("connect",&Q); + LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); + jaddstr(bestitem,"status","connected"); + jaddnum(bestitem,"maxprice",maxprice); + jaddnum(bestitem,"requestid",Q.R.requestid); + jaddnum(bestitem,"quoteid",Q.R.quoteid); + printf("Alice r.%u q.%u\n",Q.R.requestid,Q.R.quoteid); + } else jaddstr(bestitem,"status","too expensive"); + return(jprint(bestitem,0)); } diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index 2f2c39565..19e2adec8 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1305,4 +1305,121 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu if ( LP_ismine(utxo) > 0 && strcmp(utxo->coin,base) == 0 ) LP_priceping(LP_mypubsock,utxo,rel,price * LP_profitratio); }*/ +/* +bestprice = 0.; +if ( (array= LP_tradecandidates(base)) != 0 ) +{ + printf("candidates.(%s)\nn.%d\n",jprint(array,0),cJSON_GetArraySize(array)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + memset(prices,0,sizeof(prices)); + memset(Q,0,sizeof(Q)); + for (i=0; icoin,zero); + Q[i].destsatoshis = price * Q[i].satoshis; + } + if ( (prices[i]= price) > SMALLVAL && (bestprice == 0. || price < bestprice) ) + bestprice = price; + char str[65]; printf("i.%d of %d: (%s) -> txid.%s price %.8f best %.8f dest %.8f\n",i,n,jprint(item,0),bits256_str(str,Q[i].txid),price,bestprice,dstr(Q[i].destsatoshis)); + } + if ( bestprice > SMALLVAL ) + { + bestmetric = 0.; + besti = -1; + for (i=0; i SMALLVAL && myutxo->S.satoshis >= Q[i].destsatoshis+Q[i].desttxfee ) + { + metric = price / bestprice; + printf("%f %f %f %f ",price,metric,dstr(Q[i].destsatoshis),metric * metric * metric); + if ( metric < 1.1 ) + { + metric = dstr(Q[i].destsatoshis) * metric * metric * metric; + printf("%f\n",metric); + if ( bestmetric == 0. || metric < bestmetric ) + { + besti = i; + bestmetric = metric; + } + } + } else printf("(%f %f) ",dstr(myutxo->S.satoshis),dstr(Q[i].destsatoshis)); + } + printf("metrics, best %f\n",bestmetric); +*/ +/*cJSON *LP_tradecandidates(char *base) + { + struct LP_peerinfo *peer,*tmp; struct LP_quoteinfo Q; char *utxostr,coinstr[16]; cJSON *array,*retarray=0,*item; int32_t i,n,totaladded,added; + totaladded = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + printf("%s:%u %s\n",peer->ipaddr,peer->port,base); + n = added = 0; + if ( (utxostr= issue_LP_clientgetutxos(peer->ipaddr,peer->port,base,100)) != 0 ) + { + printf("%s:%u %s %s\n",peer->ipaddr,peer->port,base,utxostr); + if ( (array= cJSON_Parse(utxostr)) != 0 ) + { + if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) + { + retarray = cJSON_CreateArray(); + for (i=0; i 0 ) + { + memset(&Q,0,sizeof(Q)); + for (i=0; icoin,bits256_str(str,utxo->payment.txid)); + if ( strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && LP_ismine(utxo) > 0 ) + { + if ( utxo->payment.value >= destsatoshis && (bestutxo == 0 || utxo->payment.value < bestutxo->payment.value) ) + bestutxo = utxo; + } + } + return(bestutxo); +} + void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) { cJSON *argjson; struct _LP_utxoinfo u; From 9193a26a1b04817a541cdf17e1c176f811d4901c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:05:33 +0300 Subject: [PATCH 414/910] Test --- iguana/exchanges/autotrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/autotrade b/iguana/exchanges/autotrade index c24a0a89a..3f0ef6783 100755 --- a/iguana/exchanges/autotrade +++ b/iguana/exchanges/autotrade @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"txid\":\"$1\",\"vout\":$2,\"coin\":\"REVS\",\"maxprice\":$3}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel":\"KMD\",\"volume\":1,\"maxprice\":2.0}" From a5e36a4c7cf08bf7404cf67e47f68404b87d72f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:11:00 +0300 Subject: [PATCH 415/910] Test --- iguana/exchanges/autotrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/autotrade b/iguana/exchanges/autotrade index 3f0ef6783..026a46b56 100755 --- a/iguana/exchanges/autotrade +++ b/iguana/exchanges/autotrade @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel":\"KMD\",\"volume\":1,\"maxprice\":2.0}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel\":\"KMD\",\"volume\":1.01,\"maxprice\":1.234}" From 496614940f4b9b920f24b353fa9c630249ac054a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:12:55 +0300 Subject: [PATCH 416/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/autotrade | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a3c70645a..c779e8ae0 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -116,6 +116,8 @@ forwardhex(pubkey,hex)\n\ return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"no price set\"}")); } + else if ( strcmp(method,"autotrade") == 0 ) + return(LP_autotrade(base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); } else if ( (coin= jstr(argjson,"coin")) != 0 ) { @@ -148,8 +150,6 @@ forwardhex(pubkey,hex)\n\ return(jprint(retjson,1)); } } - else if ( strcmp(method,"autotrade") == 0 ) - return(LP_autotrade(base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); } else if ( strcmp(method,"swapstatus") == 0 ) { diff --git a/iguana/exchanges/autotrade b/iguana/exchanges/autotrade index 026a46b56..371532304 100755 --- a/iguana/exchanges/autotrade +++ b/iguana/exchanges/autotrade @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel\":\"KMD\",\"volume\":1.01,\"maxprice\":1.234}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"autotrade\",\"base\":\"REVS\",\"rel\":\"KMD\",\"volume\":1.01,\"price\":1.234}" From d1e9e4ccc571a35faf0c32a2dbc06c82b3714407 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:31:38 +0300 Subject: [PATCH 417/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_quotes.c | 27 ++++++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c779e8ae0..335cd1bf6 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -168,7 +168,7 @@ forwardhex(pubkey,hex)\n\ if ( strcmp(method,"reserved") == 0 ) retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) - retstr = LP_connected(argjson); + retstr = LP_connectedalice(argjson); else if ( strcmp(method,"checktxid") == 0 ) retstr = LP_spentcheck(argjson); else if ( strcmp(method,"getcoins") == 0 ) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 069d63575..b7540b15d 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -264,7 +264,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp) return(price); } -int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) +int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { char *retstr,pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; if ( (price= LP_price(base,rel)) > SMALLVAL ) @@ -326,14 +326,15 @@ int32_t LP_connectstart(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson, if ( pair >= 0 ) nn_close(pair); LP_availableset(utxo); - } + } else LP_unavailableset(utxo,utxo->S.otherpubkey); return(retval); } -char *LP_connected(cJSON *argjson) // alice +char *LP_connectedalice(cJSON *argjson) // alice { cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; LP_quoteparse(&Q,argjson); + printf("CONNECTED.(%s)\n",jprint(argjson,0)); if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) { if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) @@ -408,7 +409,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d retjson = LP_quotejson(&Q); utxo->S.otherpubkey = jbits256(argjson,"desthash"); retval |= 2; - LP_unavailableset(utxo,jbits256(argjson,"desthash")); + LP_unavailableset(utxo,utxo->S.otherpubkey); jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); jaddnum(retjson,"pending",utxo->T.swappending); jaddbits256(retjson,"desthash",utxo->S.otherpubkey); @@ -430,7 +431,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(0); } if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) - LP_connectstart(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); + LP_connectstartbob(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); } } @@ -440,7 +441,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *LP_autotrade(char *base,char *rel,double maxprice,double volume) { - uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); destsatoshis = SATOSHIDEN * volume; @@ -507,7 +508,19 @@ char *LP_autotrade(char *base,char *rel,double maxprice,double volume) bestitem = LP_quotejson(&Q); price = LP_query("connect",&Q); LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - jaddstr(bestitem,"status","connected"); + expiration = (uint32_t)time(NULL) + 10; + while ( time(NULL) < expiration ) + { + if ( autxo->S.swap != 0 ) + break; + sleep(1); + } + if ( autxo->S.swap == 0 ) + { + jaddstr(bestitem,"status","couldnt establish connection"); + LP_availableset(autxo); + } + else jaddstr(bestitem,"status","connected"); jaddnum(bestitem,"maxprice",maxprice); jaddnum(bestitem,"requestid",Q.R.requestid); jaddnum(bestitem,"quoteid",Q.R.quoteid); From 83d983914f5b5863257c3774a1f5016517a46b8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:37:19 +0300 Subject: [PATCH 418/910] Test --- iguana/exchanges/LP_forwarding.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index e38b3175d..58c8c6932 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -133,6 +133,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) datalen = (int32_t)strlen(hexstr) >> 1; data = malloc(datalen); decode_hex(data,datalen,hexstr); + printf("LP_forwardhex.(%s)\n",(char *)data); if ( (argjson= cJSON_Parse((char *)data)) != 0 ) { reqjson = LP_dereference(argjson,"forward"); @@ -141,7 +142,8 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) LP_send(pubsock,jprint(reqjson,0),1); free_json(reqjson); free_json(argjson); - } + } else printf("LP_forwardhex couldnt parse (%s)\n",(char *)data); + free(data); return(retstr); } else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) @@ -151,7 +153,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) datalen = (int32_t)strlen(hexstr) >> 1; data = malloc(datalen); decode_hex(data,datalen,hexstr); - //printf("forwardhex.(%s)\n",(char *)data); + printf("forwardhex.(%s)\n",(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,1); } retjson = cJSON_CreateObject(); From c022f46ca1311f0d3ffd139e68bf2660504c923a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:42:05 +0300 Subject: [PATCH 419/910] Test --- iguana/exchanges/LP_quotes.c | 1 + iguana/exchanges/run | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index b7540b15d..7f799b6ce 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -377,6 +377,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { + printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); retval = 1; txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) diff --git a/iguana/exchanges/run b/iguana/exchanges/run index 40df6ca42..ff014cfd2 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -1,5 +1,5 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; nohup ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, From f83744e517a15847c54d9664c33432e4f947eb75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 16:49:30 +0300 Subject: [PATCH 420/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_quotes.c | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 335cd1bf6..6ddf84009 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -46,7 +46,7 @@ char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) } if ( (method= jstr(argjson,"method")) == 0 ) { - if ( flag == 0 && jobj(argjson,"result") == 0 ) + if ( flag == 0 || jobj(argjson,"result") == 0 ) printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); } diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 58c8c6932..bedf01474 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -133,11 +133,11 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) datalen = (int32_t)strlen(hexstr) >> 1; data = malloc(datalen); decode_hex(data,datalen,hexstr); - printf("LP_forwardhex.(%s)\n",(char *)data); if ( (argjson= cJSON_Parse((char *)data)) != 0 ) { reqjson = LP_dereference(argjson,"forward"); retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) LP_send(pubsock,jprint(reqjson,0),1); free_json(reqjson); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 7f799b6ce..c07c8fe93 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -246,9 +246,18 @@ double LP_query(char *method,struct LP_quoteinfo *qp) reqjson = LP_quotejson(qp); if ( bits256_nonz(qp->desthash) != 0 ) flag = 1; - jaddstr(reqjson,"method",method); printf("QUERY.(%s)\n",jprint(reqjson,0)); - LP_forward(qp->srchash,jprint(reqjson,1),1); + if ( IAMLP != 0 ) + { + jaddstr(reqjson,"method",method); + LP_send(LP_mypubsock,jprint(reqjson,1),1); + } + else + { + jaddstr(reqjson,"method2",method); + jaddstr(reqjson,"method","forward"); + LP_forward(qp->srchash,jprint(reqjson,1),1); + } for (i=0; i<30; i++) { if ( (price= LP_pricecache(qp,qp->srccoin,qp->destcoin,qp->txid,qp->vout)) > SMALLVAL ) From 9c2633ca63aea50364c80a7e54ded041c4fbd6eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 17:02:44 +0300 Subject: [PATCH 421/910] Test --- iguana/exchanges/LP_prices.c | 4 ++-- iguana/exchanges/LP_quotes.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 252a5ccd4..8028cb5df 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -553,9 +553,9 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * { //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); - //if ( polarity > 0 ) + if ( polarity > 0 ) basesatoshis = utxo->payment.value; - //else basesatoshis = utxo->payment.value * price; + else basesatoshis = utxo->payment.value * price; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index c07c8fe93..fb1c431e0 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -166,7 +166,7 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; - char str[65]; printf("received.(%s) quote %.8f\n",bits256_str(str,Q.txid),price); + printf("\n>>>>>>>>>> received.(%s) quote %.8f\n\n",jprint(argjson,0),price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } @@ -276,6 +276,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp) int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { char *retstr,pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); if ( (price= LP_price(base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); @@ -283,7 +284,6 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs return(-1); if ( LP_quoteparse(&Q,argjson) < 0 ) return(-2); - printf("connect with.(%s)\n",jprint(argjson,0)); Q.destsatoshis = Q.satoshis * price; privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->S.mypub) == 0 ) From 2036c3af32584b334e91eb61a5156efb060809f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 17:17:14 +0300 Subject: [PATCH 422/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6ddf84009..f56fd27fe 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -46,7 +46,7 @@ char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) } if ( (method= jstr(argjson,"method")) == 0 ) { - if ( flag == 0 || jobj(argjson,"result") == 0 ) + if ( flag == 0 || jobj(argjson,"result") != 0 ) printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); return(clonestr("{\"error\":\"need method in request\"}")); } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c368b6b7a..ce5d8a2a6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -114,11 +114,13 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double portable_mutex_lock(&LP_commandmutex); if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { + printf("got forwardhex\n"); if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { + printf("got publish\n"); if ( jobj(argjson,"method2") != 0 ) jdelete(argjson,"method2"); jaddstr(argjson,"method2","broadcast"); @@ -138,16 +140,16 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double return(nonz); } -int32_t LP_subsock_check(struct LP_peerinfo *peer) +int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { int32_t recvsize,nonz = 0; char *retstr; void *ptr; cJSON *argjson; - while ( peer->subsock >= 0 && (recvsize= nn_recv(peer->subsock,&ptr,NN_MSG,0)) >= 0 ) + while ( sock >= 0 && (recvsize= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { portable_mutex_lock(&LP_commandmutex); - if ( (retstr= stats_JSON(-1,argjson,"127.0.0.1",0)) != 0 ) + if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) { //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); @@ -236,7 +238,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso if ( strcmp(peer->ipaddr,myipaddr) != 0 ) LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); } - nonz += LP_subsock_check(peer); + nonz += LP_subsock_check(myipaddr,pubsock,peer->pushsock,profitmargin); if ( peer->diduquery == 0 ) { LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); From 4796029a6b0b0065b2ca9acbd1715403a2e25b5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 17:23:02 +0300 Subject: [PATCH 423/910] Test --- iguana/exchanges/LP_forwarding.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index bedf01474..d5351f267 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -170,7 +170,12 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) jaddnum(retjson,"datalen",datalen); return(jprint(retjson,1)); } - } else return(clonestr("{\"error\":\"notfound\"}")); + } + else + { + char str[65]; printf("couldnt find %s to forward to\n",bits256_str(str,pubkey)); + return(clonestr("{\"error\":\"notfound\"}")); + } printf("couldnt find pubkey\n"); } From 1d25085708a68358e4ed88425faaecb991c853fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 17:29:23 +0300 Subject: [PATCH 424/910] Test --- iguana/exchanges/LP_forwarding.c | 39 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index d5351f267..2e93f9126 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -125,58 +125,59 @@ cJSON *LP_dereference(cJSON *argjson,char *excludemethod) char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { - struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson,*argjson,*reqjson; + struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson=0,*argjson=0,*reqjson=0; if ( hexstr == 0 || hexstr[0] == 0 ) return(clonestr("{\"error\":\"nohex\"}")); + datalen = (int32_t)strlen(hexstr) >> 1; + data = malloc(datalen); + decode_hex(data,datalen,hexstr); + if ( (argjson= cJSON_Parse((char *)data)) != 0 ) + reqjson = LP_dereference(argjson,"forward"); if ( bits256_nonz(pubkey) == 0 || bits256_cmp(pubkey,LP_mypubkey) == 0 ) { - datalen = (int32_t)strlen(hexstr) >> 1; - data = malloc(datalen); - decode_hex(data,datalen,hexstr); - if ( (argjson= cJSON_Parse((char *)data)) != 0 ) + if ( reqjson != 0 ) { - reqjson = LP_dereference(argjson,"forward"); retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) - LP_send(pubsock,jprint(reqjson,0),1); - free_json(reqjson); - free_json(argjson); + LP_send(pubsock,jprint(reqjson,0),0); } else printf("LP_forwardhex couldnt parse (%s)\n",(char *)data); - free(data); - return(retstr); } else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { if ( ptr->pushsock >= 0 ) { - datalen = (int32_t)strlen(hexstr) >> 1; - data = malloc(datalen); - decode_hex(data,datalen,hexstr); printf("forwardhex.(%s)\n",(char *)data); - sentbytes = LP_send(ptr->pushsock,(char *)data,1); + sentbytes = LP_send(ptr->pushsock,(char *)data,0); } retjson = cJSON_CreateObject(); if ( sentbytes == datalen ) { jaddstr(retjson,"result","success"); jaddnum(retjson,"forwarded",sentbytes); - return(jprint(retjson,1)); + retstr = jprint(retjson,1); } else { jaddstr(retjson,"error","send error"); jaddnum(retjson,"sentbytes",sentbytes); jaddnum(retjson,"datalen",datalen); - return(jprint(retjson,1)); + retstr = jprint(retjson,1); } } else { char str[65]; printf("couldnt find %s to forward to\n",bits256_str(str,pubkey)); - return(clonestr("{\"error\":\"notfound\"}")); + if ( pubsock >= 0 ) + LP_send(pubsock,jprint(reqjson,0),0); + retstr = clonestr("{\"error\":\"notfound\"}"); } - printf("couldnt find pubkey\n"); + free(data); + if ( reqjson != 0 ) + free_json(reqjson); + if ( argjson != 0 ) + free_json(argjson); + return(retstr); } int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) From 4b96701acad4572d1c25abf059fd5830d55ba3ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 17:37:18 +0300 Subject: [PATCH 425/910] Test --- iguana/exchanges/LP_forwarding.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 2e93f9126..e8a033252 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -147,7 +147,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { if ( ptr->pushsock >= 0 ) { - printf("forwardhex.(%s)\n",(char *)data); + printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,0); } retjson = cJSON_CreateObject(); @@ -209,7 +209,7 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) } else retval = 0; if ( retval == 0 && peer->pushsock >= 0 ) { - printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); + //printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; hexstr = malloc(len*2 + 1); init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); From 18b5c793b013837f7fc56d3ac527a0593a85009e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:06:51 +0300 Subject: [PATCH 426/910] Test --- iguana/exchanges/DEXstats.h | 2 +- iguana/exchanges/LP_commands.c | 8 ++++---- iguana/exchanges/LP_forwarding.c | 19 +++++++++++++++---- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_quotes.c | 18 +++++++++--------- iguana/exchanges/mm.c | 2 +- iguana/exchanges/stats.c | 7 +++---- 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/iguana/exchanges/DEXstats.h b/iguana/exchanges/DEXstats.h index 6982cb64d..dec43b0cc 100644 --- a/iguana/exchanges/DEXstats.h +++ b/iguana/exchanges/DEXstats.h @@ -927,7 +927,7 @@ char *stats_prices(char *symbol,char *dest,struct DEXstats_disp *prices,int32_t } #ifndef FROM_MARKETMAKER -char *stats_JSON(cJSON *argjson,char *remoteaddr,uint16_t port) +char *stats_JSON(char *myipaddr,int32_t mypubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port) { char *method,*agent,*retstr,*source,*dest; struct tai T; uint32_t endtimestamp; struct DEXstats_disp prices[365]; int32_t leftdatenum,seconds,numdates; if ( (method= jstr(argjson,"method")) == 0 ) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f56fd27fe..9a1275fbc 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -19,7 +19,7 @@ // -char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port +char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) @@ -100,7 +100,7 @@ forwardhex(pubkey,hex)\n\ { if ( LP_mypriceset(base,rel,price) < 0 ) return(clonestr("{\"error\":\"couldnt set price\"}")); - else return(LP_pricepings(LP_mypubsock,base,rel,price * LP_profitratio)); + else return(LP_pricepings(myipaddr,LP_mypubsock,profitmargin,base,rel,price * LP_profitratio)); } else return(clonestr("{\"error\":\"no price\"}")); } else if ( strcmp(method,"myprice") == 0 ) @@ -117,7 +117,7 @@ forwardhex(pubkey,hex)\n\ } else return(clonestr("{\"error\":\"no price set\"}")); } else if ( strcmp(method,"autotrade") == 0 ) - return(LP_autotrade(base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); + return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); } else if ( (coin= jstr(argjson,"coin")) != 0 ) { @@ -189,7 +189,7 @@ forwardhex(pubkey,hex)\n\ printf("FORWARDED.(%s)\n",jprint(argjson,0)); if ( (reqjson= LP_dereference(argjson,"forward")) != 0 ) { - if ( LP_forward(jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) + if ( LP_forward(myipaddr,pubsock,profitmargin,jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index e8a033252..0009e2b8a 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -180,14 +180,25 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) return(retstr); } -int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) +int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag) { - struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson; + struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson,*argjson; if ( jsonstr == 0 || jsonstr[0] == 0 ) return(-1); if ( bits256_nonz(pubkey) != 0 ) { - if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) + if ( bits256_cmp(pubkey,LP_mypubkey) == 0 ) + { + printf("GOT FORWARDED.(%s)\n",jsonstr); + if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) + free(retstr); + free_json(argjson); + } + return(1); + } + else if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) { return(LP_send(ptr->pushsock,jsonstr,1)); } @@ -207,7 +218,7 @@ int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag) free(retstr); } } else retval = 0; - if ( retval == 0 && peer->pushsock >= 0 ) + if ( retval >= 0 && peer->pushsock >= 0 ) { //printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 7b4bd45aa..86ef0c345 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -221,7 +221,7 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 //double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); -int32_t LP_forward(bits256 pubkey,char *jsonstr,int32_t freeflag); +int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag); int32_t LP_ismine(struct LP_utxoinfo *utxo); int32_t LP_isavailable(struct LP_utxoinfo *utxo); struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ce5d8a2a6..8ffea2f99 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -84,7 +84,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * char *retstr=0; if ( LP_tradecommand(myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) { - if ( (retstr= stats_JSON(pubsock,argjson,"127.0.0.1",0)) != 0 ) + if ( (retstr= stats_JSON(myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) { printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index fb1c431e0..758a83a07 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -171,7 +171,7 @@ char *LP_quotereceived(cJSON *argjson) } else return(clonestr("{\"error\":\"nullptr\"}")); } -char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) +char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *base,char *rel,double price) { bits256 zero; cJSON *reqjson = cJSON_CreateObject(); jaddbits256(reqjson,"pubkey",LP_mypubkey); @@ -189,7 +189,7 @@ char *LP_pricepings(int32_t pubsock,char *base,char *rel,double price) jaddstr(reqjson,"method","forward"); jaddstr(reqjson,"method2","postprice"); memset(zero.bytes,0,sizeof(zero)); - LP_forward(zero,jprint(reqjson,1),1); + LP_forward(myipaddr,pubsock,profitmargin,zero,jprint(reqjson,1),1); } return(clonestr("{\"result\":\"success\"}")); } @@ -229,7 +229,7 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) return(-1); } -double LP_query(char *method,struct LP_quoteinfo *qp) +double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *method,struct LP_quoteinfo *qp) { cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; if ( strcmp(method,"request") == 0 ) @@ -256,7 +256,7 @@ double LP_query(char *method,struct LP_quoteinfo *qp) { jaddstr(reqjson,"method2",method); jaddstr(reqjson,"method","forward"); - LP_forward(qp->srchash,jprint(reqjson,1),1); + LP_forward(myipaddr,mypubsock,profitmargin,qp->srchash,jprint(reqjson,1),1); } for (i=0; i<30; i++) { @@ -320,7 +320,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); - else LP_forward(utxo->S.otherpubkey,retstr,1); + else LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); retval = 0; } else printf("error launching swaploop\n"); } else printf("printf error nn_connect to %s\n",pairstr); @@ -427,7 +427,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); - else LP_forward(utxo->S.otherpubkey,retstr,1); + else LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); utxo->T.lasttime = (uint32_t)time(NULL); } else printf("null price\n"); } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); @@ -449,7 +449,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } -char *LP_autotrade(char *base,char *rel,double maxprice,double volume) +char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume) { uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) @@ -512,11 +512,11 @@ char *LP_autotrade(char *base,char *rel,double maxprice,double volume) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); - price = LP_query("request",&Q); + price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); if ( price <= maxprice ) { bestitem = LP_quotejson(&Q); - price = LP_query("connect",&Q); + price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); expiration = (uint32_t)time(NULL) + 10; while ( time(NULL) < expiration ) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 41bbd2e2e..05b95a9a8 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -24,7 +24,7 @@ #include #include "OS_portable.h" #define MAX(a,b) ((a) > (b) ? (a) : (b)) -char *stats_JSON(int32_t pubsock,cJSON *argjson,char *remoteaddr,uint16_t port); +char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port); #include "stats.c" void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); diff --git a/iguana/exchanges/stats.c b/iguana/exchanges/stats.c index 06d1cfeb7..b0b4b11d8 100644 --- a/iguana/exchanges/stats.c +++ b/iguana/exchanges/stats.c @@ -304,8 +304,7 @@ cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr,char *filetype,uint16_t port) { - cJSON *tokens,*argjson,*origargjson,*tmpjson=0,*json = 0; long filesize; - char symbol[64],buf[4096],*userpass=0,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,num=0; + cJSON *tokens,*argjson,*origargjson,*tmpjson=0,*json = 0; long filesize; double profitmargin = 0.; char *myipaddr="127.0.0.1",symbol[64],buf[4096],*userpass=0,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,num=0; //printf("rpcparse.(%s)\n",urlstr); for (i=0; i Date: Thu, 15 Jun 2017 20:14:00 +0300 Subject: [PATCH 427/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_quotes.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9a1275fbc..b0c387750 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -186,9 +186,9 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"forward") == 0 ) { cJSON *reqjson; - printf("FORWARDED.(%s)\n",jprint(argjson,0)); if ( (reqjson= LP_dereference(argjson,"forward")) != 0 ) { + printf("FORWARDED.(%s)\n",jprint(argjson,0)); if ( LP_forward(myipaddr,pubsock,profitmargin,jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 758a83a07..288d11741 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -256,6 +256,7 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho { jaddstr(reqjson,"method2",method); jaddstr(reqjson,"method","forward"); + jaddbits256(reqjson,"pubkey",qp->srchash); LP_forward(myipaddr,mypubsock,profitmargin,qp->srchash,jprint(reqjson,1),1); } for (i=0; i<30; i++) From 85acaa8dbac25edc943bb777d4c79c1bfee16cd0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:21:00 +0300 Subject: [PATCH 428/910] Test --- iguana/exchanges/LP_quotes.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 288d11741..0e72ff9ec 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -417,6 +417,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(-1); } Q.timestamp = (uint32_t)time(NULL); + utxo->T.swappending = Q.timestamp + LP_RESERVETIME; retjson = LP_quotejson(&Q); utxo->S.otherpubkey = jbits256(argjson,"desthash"); retval |= 2; @@ -443,7 +444,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d } if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) LP_connectstartbob(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); - else printf("swap %p when connect came in (%s)\n",utxo->S.swap,jprint(argjson,0)); + else printf("pend.%u swap %p when connect came in (%s)\n",utxo->T.swappending,utxo->S.swap,jprint(argjson,0)); } } } From fe6eca375d2b261fbd70c714d0bc39c5259aab5b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:22:41 +0300 Subject: [PATCH 429/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_forwarding.c | 6 +++--- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_quotes.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index b0c387750..88317a3c7 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -188,7 +188,7 @@ forwardhex(pubkey,hex)\n\ cJSON *reqjson; if ( (reqjson= LP_dereference(argjson,"forward")) != 0 ) { - printf("FORWARDED.(%s)\n",jprint(argjson,0)); + //printf("FORWARDED.(%s)\n",jprint(argjson,0)); if ( LP_forward(myipaddr,pubsock,profitmargin,jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 0009e2b8a..f29af26f5 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -138,7 +138,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) if ( reqjson != 0 ) { retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); - printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); + //printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) LP_send(pubsock,jprint(reqjson,0),0); } else printf("LP_forwardhex couldnt parse (%s)\n",(char *)data); @@ -147,7 +147,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { if ( ptr->pushsock >= 0 ) { - printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); + //printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,0); } retjson = cJSON_CreateObject(); @@ -189,7 +189,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu { if ( bits256_cmp(pubkey,LP_mypubkey) == 0 ) { - printf("GOT FORWARDED.(%s)\n",jsonstr); + //printf("GOT FORWARDED.(%s)\n",jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 8ffea2f99..c202dcae8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -86,7 +86,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * { if ( (retstr= stats_JSON(myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) { - printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); + //printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) LP_send(pubsock,retstr,0); } @@ -114,7 +114,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double portable_mutex_lock(&LP_commandmutex); if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { - printf("got forwardhex\n"); + //printf("got forwardhex\n"); if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); } diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 0e72ff9ec..eb8830ef1 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -387,7 +387,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { - printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); + //printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); retval = 1; txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) From 42cd2b60ea45553b0e04b1b07a9f7b2f9e77006e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:26:48 +0300 Subject: [PATCH 430/910] Test --- iguana/exchanges/LP_quotes.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index eb8830ef1..02d2e54a9 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -392,7 +392,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d txid = jbits256(argjson,"txid"); if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { - printf("LP_tradecommand.(%s)\n",jprint(argjson,0)); + printf("pend.%u LP_tradecommand.(%s)\n",utxo->T.swappending,jprint(argjson,0)); if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) { char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); @@ -425,12 +425,14 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); jaddnum(retjson,"pending",utxo->T.swappending); jaddbits256(retjson,"desthash",utxo->S.otherpubkey); + jaddbits256(retjson,"pubkey",utxo->S.otherpubkey); jaddstr(retjson,"method","reserved"); retstr = jprint(retjson,1); if ( pubsock >= 0 ) LP_send(pubsock,retstr,1); else LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); utxo->T.lasttime = (uint32_t)time(NULL); + printf("set swappending.%u\n",utxo->T.swappending); } else printf("null price\n"); } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); } From 5fed6f8081489a5d58bfad9fc7ea3642b048e278 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:36:56 +0300 Subject: [PATCH 431/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_quotes.c | 15 +++++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 88317a3c7..55f4ef46f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -58,7 +58,7 @@ myprice(base, rel)\n\ enable(coin)\n\ disable(coin)\n\ inventory(coin)\n\ -autotrade(base, rel, price, volume)\n\ +autotrade(base, rel, price, volume, timeout)\n\ swapstatus()\n\ swapstatus(requestid, quoteid)\n\ public API:\n \ @@ -117,7 +117,7 @@ forwardhex(pubkey,hex)\n\ } else return(clonestr("{\"error\":\"no price set\"}")); } else if ( strcmp(method,"autotrade") == 0 ) - return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"))); + return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"),jint(argjson,"timeout"))); } else if ( (coin= jstr(argjson,"coin")) != 0 ) { diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 86ef0c345..0a491d82e 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,6 +23,7 @@ #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 +#define LP_AUTOTRADE_TIMEOUT 3 #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 02d2e54a9..c4c3826ff 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -319,9 +319,10 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs jaddnum(retjson,"requestid",Q.R.requestid); jaddnum(retjson,"quoteid",Q.R.quoteid); retstr = jprint(retjson,1); + printf("BOB sends back.(%s)\n",retstr); if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); - else LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); + LP_send(pubsock,retstr,0); + LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); retval = 0; } else printf("error launching swaploop\n"); } else printf("printf error nn_connect to %s\n",pairstr); @@ -429,8 +430,8 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d jaddstr(retjson,"method","reserved"); retstr = jprint(retjson,1); if ( pubsock >= 0 ) - LP_send(pubsock,retstr,1); - else LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); + LP_send(pubsock,retstr,0); + LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); utxo->T.lasttime = (uint32_t)time(NULL); printf("set swappending.%u\n",utxo->T.swappending); } else printf("null price\n"); @@ -453,7 +454,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } -char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume) +char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) @@ -462,6 +463,8 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (autxo= LP_utxo_bestfit(rel,destsatoshis)) == 0 ) return(clonestr("{\"error\":\"cant find utxo that is big enough\"}")); bestmetric = ordermatchprice = 0.; + if ( timeout == 0 ) + timeout = LP_AUTOTRADE_TIMEOUT; if ( (obookstr= LP_orderbook(base,rel)) != 0 ) { if ( (orderbook= cJSON_Parse(obookstr)) != 0 ) @@ -522,7 +525,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestitem = LP_quotejson(&Q); price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - expiration = (uint32_t)time(NULL) + 10; + expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) { if ( autxo->S.swap != 0 ) From c6a48858249122602e7701cc966bcc7cb22b6ab9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:45:07 +0300 Subject: [PATCH 432/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- iguana/exchanges/LP_utxos.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index c4c3826ff..502e0cd8f 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -319,7 +319,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs jaddnum(retjson,"requestid",Q.R.requestid); jaddnum(retjson,"quoteid",Q.R.quoteid); retstr = jprint(retjson,1); - printf("BOB sends back.(%s)\n",retstr); + char str[65]; printf("BOB pubsock.%d sends back.(%s) to (%s)\n",pubsock,retstr,bits256_str(str,utxo->S.otherpubkey)); if ( pubsock >= 0 ) LP_send(pubsock,retstr,0); LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9e5be5bc5..1febfa78b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -140,27 +140,28 @@ void _LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) void LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) { - struct LP_utxoinfo *ptrs[8]; int32_t i,n; + struct LP_utxoinfo *ptrs[8]; int32_t i,n; struct _LP_utxoinfo u; memset(ptrs,0,sizeof(ptrs)); if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) { for (i=0; ipayment.txid),utxo->payment.vout,n); + char str[65],str2[65]; printf("UTXO.[%d] RESERVED %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); _LP_unavailableset(utxo,otherpubkey); } void LP_availableset(struct LP_utxoinfo *utxo) { - struct LP_utxoinfo *ptrs[8]; int32_t i,n; + struct LP_utxoinfo *ptrs[8]; int32_t i,n; struct _LP_utxoinfo u; memset(ptrs,0,sizeof(ptrs)); if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) { for (i=0; ipayment.txid),utxo->payment.vout,n); + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + char str[65],str2[65]; printf("UTXO.[%d] AVAIL %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); _LP_availableset(utxo); } From 59a85be27b820204f0d9ef0948d5611350d5fc02 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 20:52:18 +0300 Subject: [PATCH 433/910] Test --- iguana/exchanges/LP_forwarding.c | 3 ++- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index f29af26f5..fb49bf4be 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -200,6 +200,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu } else if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) { + printf("GOT FORWARDED.(%s)\n",jsonstr); return(LP_send(ptr->pushsock,jsonstr,1)); } } @@ -220,7 +221,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu } else retval = 0; if ( retval >= 0 && peer->pushsock >= 0 ) { - //printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); + printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; hexstr = malloc(len*2 + 1); init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c202dcae8..646ee24a1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -148,10 +148,10 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { + printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); portable_mutex_lock(&LP_commandmutex); if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) { - //printf("%s SUB.[%d] %s\n",peer->ipaddr,recvsize,(char *)ptr); free(retstr); } portable_mutex_unlock(&LP_commandmutex); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 1febfa78b..579be508a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -147,6 +147,7 @@ void LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) for (i=0; iiambob != 0) ? utxo->deposit : utxo->fee; char str[65],str2[65]; printf("UTXO.[%d] RESERVED %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); _LP_unavailableset(utxo,otherpubkey); } From 1c4f79980d1071127ba5efc01df0213937204186 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:01:52 +0300 Subject: [PATCH 434/910] Test --- iguana/exchanges/LP_quotes.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 502e0cd8f..1e06a4935 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -318,11 +318,13 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs jaddstr(retjson,"pair",pairstr); jaddnum(retjson,"requestid",Q.R.requestid); jaddnum(retjson,"quoteid",Q.R.quoteid); - retstr = jprint(retjson,1); - char str[65]; printf("BOB pubsock.%d sends back.(%s) to (%s)\n",pubsock,retstr,bits256_str(str,utxo->S.otherpubkey)); + char str[65]; printf("BOB pubsock.%d sends to (%s)\n",pubsock,bits256_str(str,utxo->S.otherpubkey)); if ( pubsock >= 0 ) - LP_send(pubsock,retstr,0); - LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); + LP_send(pubsock,jprint(retjson,0),1); + jdelete(retjson,"method"); + jaddstr(retjson,"method2","connected"); + jaddstr(retjson,"method","forward"); + LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); retval = 0; } else printf("error launching swaploop\n"); } else printf("printf error nn_connect to %s\n",pairstr); @@ -428,10 +430,12 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d jaddbits256(retjson,"desthash",utxo->S.otherpubkey); jaddbits256(retjson,"pubkey",utxo->S.otherpubkey); jaddstr(retjson,"method","reserved"); - retstr = jprint(retjson,1); if ( pubsock >= 0 ) - LP_send(pubsock,retstr,0); - LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,retstr,1); + LP_send(pubsock,jprint(retjson,0),1); + jdelete(retjson,"method"); + jaddstr(retjson,"method2","reserved"); + jaddstr(retjson,"method","forward"); + LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); utxo->T.lasttime = (uint32_t)time(NULL); printf("set swappending.%u\n",utxo->T.swappending); } else printf("null price\n"); From b7a478c0180b8c2b9955b823a03621d7d8039227 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:18:02 +0300 Subject: [PATCH 435/910] Test --- iguana/exchanges/LP_include.h | 4 ++-- iguana/exchanges/LP_quotes.c | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 0a491d82e..f13975b53 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -38,8 +38,8 @@ #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" -//#define BASILISK_DISABLEWAITTX -//#define BASILISK_DISABLESENDTX +#define BASILISK_DISABLEWAITTX +#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 100 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 1e06a4935..27973be58 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -276,8 +276,8 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { - char *retstr,pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; - printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); + char pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + //printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); if ( (price= LP_price(base,rel)) > SMALLVAL ) { price *= (1. + profitmargin); @@ -387,7 +387,7 @@ char *LP_connectedalice(cJSON *argjson) // alice int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method,*base,*rel,*retstr; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; + char *method,*base,*rel; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { //printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); @@ -437,7 +437,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d jaddstr(retjson,"method","forward"); LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); utxo->T.lasttime = (uint32_t)time(NULL); - printf("set swappending.%u\n",utxo->T.swappending); + //printf("set swappending.%u\n",utxo->T.swappending); } else printf("null price\n"); } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); } @@ -523,6 +523,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); + LP_unavailableset(autxo,bestutxo->pubkey); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); if ( price <= maxprice ) { From 5e48b0bce77bc04db6d1daddf1b338ae77ec7bd0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:31:30 +0300 Subject: [PATCH 436/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 27973be58..f52b7faf7 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -181,7 +181,7 @@ char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *bas if ( pubsock >= 0 ) { jaddstr(reqjson,"method","postprice"); - printf("pricepings.(%s)\n",jprint(reqjson,0)); + printf("%d pricepings.(%s)\n",pubsock,jprint(reqjson,0)); LP_send(pubsock,jprint(reqjson,1),1); } else @@ -197,7 +197,7 @@ char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *bas char *LP_postedprice(cJSON *argjson) { bits256 pubkey; double price; char *base,*rel; - //printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); + printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && (price= jdouble(argjson,"price")) > SMALLVAL ) { pubkey = jbits256(argjson,"pubkey"); From 18848a17ff27064b258422410fa6b8b37f842f80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:34:22 +0300 Subject: [PATCH 437/910] 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 646ee24a1..c04ff7d9e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -238,7 +238,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso if ( strcmp(peer->ipaddr,myipaddr) != 0 ) LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); } - nonz += LP_subsock_check(myipaddr,pubsock,peer->pushsock,profitmargin); + nonz += LP_subsock_check(myipaddr,pubsock,peer->subsock,profitmargin); if ( peer->diduquery == 0 ) { LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); From 2fd602efa58169185c112cde0bc5e974e937ccc5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:36:51 +0300 Subject: [PATCH 438/910] 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 c04ff7d9e..8ffae6f3f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -82,6 +82,8 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { char *retstr=0; + if ( jobj(argjson,"result") != 0 || jobj(argjson,"error") != 0 ) + return(0); if ( LP_tradecommand(myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) { if ( (retstr= stats_JSON(myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) From bd991ac1dcd6986fef9740a28a25253b7c158ef0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:43:57 +0300 Subject: [PATCH 439/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 8ffae6f3f..334d0c0a4 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -89,7 +89,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * if ( (retstr= stats_JSON(myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) { //printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); - if ( pubsock >= 0 ) + if ( pubsock >= 0 ) //strncmp("{\"error\":",retstr,strlen("{\"error\":")) != 0 && LP_send(pubsock,retstr,0); } } @@ -152,7 +152,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof { printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); portable_mutex_lock(&LP_commandmutex); - if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) + if ( (retstr= LP_command_process(myipaddr,-1,argjson,0,0,profitmargin)) != 0 ) { free(retstr); } From 00b8a949f832a076f17eabbf3ee2addaa57acedc Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 21:48:54 +0300 Subject: [PATCH 440/910] Test --- iguana/exchanges/LP_quotes.c | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index f52b7faf7..02b0ae7f8 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -523,7 +523,6 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); - LP_unavailableset(autxo,bestutxo->pubkey); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); if ( price <= maxprice ) { From fb75b100e0829bbab482a6879fd2a96cb5d52fbb Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:02:41 +0300 Subject: [PATCH 441/910] Test --- iguana/exchanges/LP_forwarding.c | 6 ++++-- iguana/exchanges/LP_network.c | 10 ++++++---- iguana/exchanges/LP_quotes.c | 21 +++++++++++++++------ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index fb49bf4be..6842f2dd8 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -200,8 +200,10 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu } else if ( IAMLP != 0 && (ptr= LP_forwardfind(pubkey)) != 0 && ptr->pushsock >= 0 && ptr->lasttime > time(NULL)-LP_KEEPALIVE ) { - printf("GOT FORWARDED.(%s)\n",jsonstr); - return(LP_send(ptr->pushsock,jsonstr,1)); + printf("GOT FORWARDED.(%s) -> pushsock.%d\n",jsonstr,ptr->pushsock); + len = (int32_t)strlen(jsonstr); + if ( LP_send(ptr->pushsock,jsonstr,1) == len+1 ) + return(1); } } HASH_ITER(hh,LP_peerinfos,peer,tmp) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f014e3095..4632f4f04 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -34,13 +34,13 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) free(msg); return(-1); } - for (i=0; i<100; i++) + len = (int32_t)strlen(msg) + 1; + for (i=0; i<1000; i++) { pfd.fd = sock; pfd.events = NN_POLLOUT; if ( nn_poll(&pfd,1,100) > 0 ) { - len = (int32_t)strlen(msg) + 1; if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); //else printf("SENT.(%s)\n",msg); @@ -50,10 +50,12 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) } usleep(1000); } - printf("error LP_send\n"); + printf("error LP_send, pipeline timeout\n"); + if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) + printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) free(msg); - return(-1); + return(sentbytes); } uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 02b0ae7f8..4918dff3b 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -276,11 +276,12 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { - char pairstr[512],destaddr[64]; cJSON *retjson; double price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + char pairstr[512],destaddr[64]; cJSON *retjson; double bid,ask,price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; //printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); - if ( (price= LP_price(base,rel)) > SMALLVAL ) + if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) { - price *= (1. + profitmargin); + price = ask; + //price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); if ( LP_quoteparse(&Q,argjson) < 0 ) @@ -411,7 +412,8 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d { if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) { - price *= (1. + profitmargin); + price = ask; + //price *= (1. + profitmargin); if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) return(-1); if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) @@ -524,9 +526,9 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); + bestitem = LP_quotejson(&Q); if ( price <= maxprice ) { - bestitem = LP_quotejson(&Q); price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); expiration = (uint32_t)time(NULL) + timeout; @@ -542,11 +544,18 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba LP_availableset(autxo); } else jaddstr(bestitem,"status","connected"); + jaddnum(bestitem,"quotedprice",price); jaddnum(bestitem,"maxprice",maxprice); jaddnum(bestitem,"requestid",Q.R.requestid); jaddnum(bestitem,"quoteid",Q.R.quoteid); printf("Alice r.%u q.%u\n",Q.R.requestid,Q.R.quoteid); - } else jaddstr(bestitem,"status","too expensive"); + } + else + { + jaddnum(bestitem,"quotedprice",price); + jaddnum(bestitem,"maxprice",maxprice); + jaddstr(bestitem,"status","too expensive"); + } return(jprint(bestitem,0)); } From b7c57d31940f13286a6614aaf1bbc559dd793032 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:12:21 +0300 Subject: [PATCH 442/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 10 +++++----- iguana/exchanges/LP_peers.c | 8 +++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 334d0c0a4..18a010a31 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -373,7 +373,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); timeout = 1; - maxsize = 1024 * 1024; + maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 4632f4f04..60cfed5f1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -35,7 +35,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) return(-1); } len = (int32_t)strlen(msg) + 1; - for (i=0; i<1000; i++) + for (i=0; i<100; i++) { pfd.fd = sock; pfd.events = NN_POLLOUT; @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); - //else printf("SENT.(%s)\n",msg); + else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); return(sentbytes); @@ -51,11 +51,11 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) usleep(1000); } printf("error LP_send, pipeline timeout\n"); - if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) - printf("LP_send sent %d instead of %d\n",sentbytes,len); + //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) + // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) free(msg); - return(sentbytes); + return(-1); } uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index b6dc4b1db..89fac7909 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -50,7 +50,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,double profitmargin,int32_t numpeers,int32_t numutxos) { - uint32_t ipbits; int32_t pushsock,subsock,timeout; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; + uint32_t ipbits; int32_t maxsize,pushsock,subsock,timeout; char checkip[64],pushaddr[64],subaddr[64]; struct LP_peerinfo *peer = 0; ipbits = (uint32_t)calc_ipbits(ipaddr); expand_ipbits(checkip,ipbits); if ( strcmp(checkip,ipaddr) == 0 ) @@ -72,11 +72,13 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char strcpy(peer->ipaddr,ipaddr); if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { - timeout = 1000; - nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nanomsg_tcpname(pushaddr,peer->ipaddr,pushport); if ( nn_connect(pushsock,pushaddr) >= 0 ) { + timeout = 100; + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + maxsize = 2 * 1024 * 1024; + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDBUF,&maxsize,sizeof(maxsize)); printf("connected to push.(%s) %d\n",pushaddr,pushsock); peer->connected = (uint32_t)time(NULL); peer->pushsock = pushsock; From 649052cbbf398cfbb0e6c903115faa529dd151e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:13:09 +0300 Subject: [PATCH 443/910] 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 60cfed5f1..e71afef66 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -39,7 +39,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { pfd.fd = sock; pfd.events = NN_POLLOUT; - if ( nn_poll(&pfd,1,100) > 0 ) + if ( nn_poll(&pfd,1,1) > 0 ) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); From dd44d68cd01b34dc30a9cbc1344244734ae64d81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:16:23 +0300 Subject: [PATCH 444/910] Test --- iguana/exchanges/LP_forwarding.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 6842f2dd8..6b2263712 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -202,7 +202,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu { printf("GOT FORWARDED.(%s) -> pushsock.%d\n",jsonstr,ptr->pushsock); len = (int32_t)strlen(jsonstr); - if ( LP_send(ptr->pushsock,jsonstr,1) == len+1 ) + if ( LP_send(ptr->pushsock,jsonstr,0) == len+1 ) return(1); } } @@ -237,6 +237,8 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu return(LP_send(peer->pushsock,jprint(reqjson,1),1)); } else retval = -1; } + if ( freeflag != 0 ) + free(jsonstr); return(-1); } From 4631609048e07cace4822b964d770e53e128d72a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:23:18 +0300 Subject: [PATCH 445/910] Test --- iguana/exchanges/LP_quotes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 4918dff3b..283b69dfe 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -523,6 +523,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba asatoshis = bestutxo->payment.value * ordermatchprice; if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); + printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(bestutxo->payment.value),ordermatchprice); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); From dbf22aebf8d698e2072a058bb382c7b57031a437 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:31:33 +0300 Subject: [PATCH 446/910] Test --- iguana/exchanges/LP_quotes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 283b69dfe..b31662b7c 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -332,7 +332,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs } else { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.satoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); } } else printf("no price for %s/%s\n",base,rel); if ( retval < 0 ) @@ -405,7 +405,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d } if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) utxo->T.swappending = 0; - if ( strcmp(method,"request") == 0 ) // bob + if ( strcmp(method,"request") == 0 ) // bob needs apayment + fee tx's { retval = 1; if ( LP_isavailable(utxo) > 0 ) @@ -520,10 +520,10 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba } if ( bestutxo == 0 || ordermatchprice == 0. ) return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); - asatoshis = bestutxo->payment.value * ordermatchprice; if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); - printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(bestutxo->payment.value),ordermatchprice); + asatoshis = Q.satoshis * ordermatchprice + Q.desttxfee; + printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); From 392474faf6c3e811cda66e50187c04941e988739 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:36:23 +0300 Subject: [PATCH 447/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index b31662b7c..f6f3da0d8 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -332,7 +332,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs } else { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending ,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 , LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout) >= price*Q.satoshis+Q.desttxfee,dstr(LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)),dstr(price*Q.satoshis+Q.desttxfee)); + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); } } else printf("no price for %s/%s\n",base,rel); if ( retval < 0 ) @@ -522,7 +522,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); - asatoshis = Q.satoshis * ordermatchprice + Q.desttxfee; + asatoshis = Q.satoshis * ordermatchprice + Q.desttxfee + 1; printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); From 3d8987b2ec6b4cfad17b7a2d54d79845cd7b761d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:41:26 +0300 Subject: [PATCH 448/910] Test --- iguana/exchanges/LP_quotes.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index f6f3da0d8..fe037b4b4 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -300,7 +300,8 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(utxo->payment.value),dstr(Q.satoshis)); return(-1); } - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime < utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && (destvalue= LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout)) >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + destvalue = LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout); + if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime <= utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && destvalue >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) { nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) @@ -332,7 +333,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs } else { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME ,Q.quotetime >= Q.timestamp ,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); + printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME,Q.quotetime >= Q.timestamp-3,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); } } else printf("no price for %s/%s\n",base,rel); if ( retval < 0 ) @@ -522,7 +523,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); - asatoshis = Q.satoshis * ordermatchprice + Q.desttxfee + 1; + asatoshis = 1.001 * (Q.satoshis * ordermatchprice + Q.desttxfee + 1); printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); From f0cbe33d0586ba79bb35818e5da898ed4fea0a2f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:45:24 +0300 Subject: [PATCH 449/910] Test --- iguana/exchanges/LP_quotes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index fe037b4b4..b04f7bc2b 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -286,7 +286,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs return(-1); if ( LP_quoteparse(&Q,argjson) < 0 ) return(-2); - Q.destsatoshis = Q.satoshis * price; + Q.destsatoshis = Q.satoshis * price + Q.desttxfee + 1; privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(utxo->S.mypub) == 0 ) utxo->S.mypub = LP_pubkey(privkey); @@ -523,7 +523,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); - asatoshis = 1.001 * (Q.satoshis * ordermatchprice + Q.desttxfee + 1); + asatoshis = (Q.satoshis * ordermatchprice + Q.desttxfee + 1); printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); From 4c5f4616789a9eb8bb73258bce29a44b3c8c5a17 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 22:55:20 +0300 Subject: [PATCH 450/910] Test --- iguana/exchanges/LP_quotes.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index b04f7bc2b..4c53039b1 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -68,7 +68,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) jaddbits256(retjson,"txid2",qp->txid2); jaddnum(retjson,"vout2",qp->vout2); } - if ( bits256_nonz(qp->desttxid) != 0 ) + //if ( bits256_nonz(qp->desttxid) != 0 ) { if ( qp->destaddr[0] != 0 ) jaddstr(retjson,"destaddr",qp->destaddr); @@ -277,7 +277,7 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) { char pairstr[512],destaddr[64]; cJSON *retjson; double bid,ask,price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; - //printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); + printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) { price = ask; @@ -333,7 +333,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs } else { - printf("dest %.8f < required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME,Q.quotetime >= Q.timestamp-3,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); + printf("dest %.8f vs required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME,Q.quotetime >= Q.timestamp-3,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); } } else printf("no price for %s/%s\n",base,rel); if ( retval < 0 ) @@ -398,12 +398,19 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) { printf("pend.%u LP_tradecommand.(%s)\n",utxo->T.swappending,jprint(argjson,0)); + if ( LP_quoteparse(&Q,argjson) < 0 ) + return(-2); if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) { char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); utxo->T.spentflag = (uint32_t)time(NULL); return(0); } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.destcoin,Q.desttxid,Q.destvout,Q.feetxid,Q.feevout)) >= 0 ) + { + char str[65]; printf("LP_tradecommand dest selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); + } if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) utxo->T.swappending = 0; if ( strcmp(method,"request") == 0 ) // bob needs apayment + fee tx's @@ -415,8 +422,8 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d { price = ask; //price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); + //if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) + // return(-1); if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) { printf("not eligible\n"); From 04b12eda4533d3f305c822300a848b165e483056 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 23:01:11 +0300 Subject: [PATCH 451/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_quotes.c | 14 ++++++++++---- iguana/exchanges/LP_utxos.c | 6 +++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 18a010a31..fbc22e7c1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -150,7 +150,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { - printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); + //printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); portable_mutex_lock(&LP_commandmutex); if ( (retstr= LP_command_process(myipaddr,-1,argjson,0,0,profitmargin)) != 0 ) { diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index e71afef66..4faf2e2a5 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); - else printf("SENT.(%s)\n",msg); + //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); return(sentbytes); diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index 4c53039b1..fd3b8af26 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -181,7 +181,7 @@ char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *bas if ( pubsock >= 0 ) { jaddstr(reqjson,"method","postprice"); - printf("%d pricepings.(%s)\n",pubsock,jprint(reqjson,0)); + //printf("%d pricepings.(%s)\n",pubsock,jprint(reqjson,0)); LP_send(pubsock,jprint(reqjson,1),1); } else @@ -197,7 +197,7 @@ char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *bas char *LP_postedprice(cJSON *argjson) { bits256 pubkey; double price; char *base,*rel; - printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); + //printf("PRICE POSTED.(%s)\n",jprint(argjson,0)); if ( (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && (price= jdouble(argjson,"price")) > SMALLVAL ) { pubkey = jbits256(argjson,"pubkey"); @@ -246,7 +246,7 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho reqjson = LP_quotejson(qp); if ( bits256_nonz(qp->desthash) != 0 ) flag = 1; - printf("QUERY.(%s)\n",jprint(reqjson,0)); + //printf("QUERY.(%s)\n",jprint(reqjson,0)); if ( IAMLP != 0 ) { jaddstr(reqjson,"method",method); @@ -384,7 +384,13 @@ char *LP_connectedalice(cJSON *argjson) // alice } else jaddstr(retjson,"error","couldnt aliceloop"); } return(jprint(retjson,1)); - } else return(clonestr("{\"result\",\"update stats\"}")); + } + else + { + utxo = LP_utxofind(0,Q.desttxid,Q.destvout); + printf("alice fails %d %d %d %d %d\n",IAMLP == 0,bits256_cmp(Q.desthash,LP_mypubkey) == 0, utxo != 0,LP_ismine(utxo) > 0,LP_isavailable(utxo) > 0); + return(clonestr("{\"result\",\"update stats\"}")); + } } int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 579be508a..b83c019e6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -20,21 +20,21 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) { - if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 ) + if ( utxo != 0 && bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 ) return(1); else return(0); } int32_t LP_isavailable(struct LP_utxoinfo *utxo) { - if ( utxo->T.swappending == 0 && utxo->S.swap == 0 ) + if ( utxo != 0 && utxo->T.swappending == 0 && utxo->S.swap == 0 ) return(1); else return(0); } int32_t LP_isunspent(struct LP_utxoinfo *utxo) { - if ( utxo->T.spentflag == 0 && LP_isavailable(utxo) > 0 ) + if ( utxo != 0 && utxo->T.spentflag == 0 && LP_isavailable(utxo) > 0 ) return(1); else return(0); } From bccf0c639e7beda8e4aa66b79b8e2f3b5ae2ec92 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Jun 2017 23:03:41 +0300 Subject: [PATCH 452/910] Test --- iguana/exchanges/LP_quotes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_quotes.c index fd3b8af26..e87212958 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_quotes.c @@ -350,7 +350,7 @@ char *LP_connectedalice(cJSON *argjson) // alice cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; LP_quoteparse(&Q,argjson); printf("CONNECTED.(%s)\n",jprint(argjson,0)); - if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) + if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 )//&& LP_isavailable(utxo) > 0 ) { if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) { From 3f0a715b8f22b9be0de3c97999fade397a963801 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 12:45:02 +0300 Subject: [PATCH 453/910] Test --- iguana/exchanges/LP_commands.c | 11 +- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 14 +- .../{LP_quotes.c => LP_ordermatch.c} | 331 ++++++++++-------- iguana/exchanges/LP_statemachine.c | 10 + iguana/exchanges/LP_transaction.c | 1 + iguana/exchanges/LP_utxos.c | 25 +- iguana/exchanges/help | 2 + 8 files changed, 225 insertions(+), 171 deletions(-) rename iguana/exchanges/{LP_quotes.c => LP_ordermatch.c} (65%) create mode 100755 iguana/exchanges/help diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 55f4ef46f..6d6b61abe 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -94,9 +94,10 @@ forwardhex(pubkey,hex)\n\ double price; if ( LP_isdisabled(base,rel) != 0 ) return(clonestr("{\"error\":\"at least one of coins disabled\"}")); + price = jdouble(argjson,"price"); if ( strcmp(method,"setprice") == 0 ) { - if ( (price= jdouble(argjson,"price")) > SMALLVAL ) + if ( price > SMALLVAL ) { if ( LP_mypriceset(base,rel,price) < 0 ) return(clonestr("{\"error\":\"couldnt set price\"}")); @@ -117,7 +118,13 @@ forwardhex(pubkey,hex)\n\ } else return(clonestr("{\"error\":\"no price set\"}")); } else if ( strcmp(method,"autotrade") == 0 ) - return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,jdouble(argjson,"price"),jdouble(argjson,"volume"),jint(argjson,"timeout"))); + { + if ( price > SMALLVAL ) + { + LP_mypriceset(base,rel,price); + return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,price,jdouble(argjson,"volume"),jint(argjson,"timeout"))); + } else return(clonestr("{\"error\":\"no price set\"}")); + } } else if ( (coin= jstr(argjson,"coin")) != 0 ) { diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index f13975b53..26520dd47 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -157,7 +157,7 @@ struct LP_utxobob { struct _LP_utxoinfo utxo,deposit; }; struct LP_utxoalice { struct _LP_utxoinfo utxo,fee; }; -struct LP_utxoswap { bits256 otherpubkey,mypub; void *swap; uint64_t satoshis; double profitmargin; }; +struct LP_utxoswap { bits256 otherpubkey; void *swap; uint64_t satoshis; double profitmargin; }; struct LP_utxoinfo { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fbc22e7c1..f8426ead9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -17,7 +17,6 @@ // LP_nativeDEX.c // marketmaker // -// jl777: profitmargin per coin, ignore peers with errors #include #include "LP_include.h" @@ -75,7 +74,7 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_swap.c" #include "LP_peers.c" #include "LP_utxos.c" -#include "LP_quotes.c" +#include "LP_ordermatch.c" #include "LP_forwarding.c" #include "LP_commands.c" @@ -183,14 +182,6 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma printf("txid2.%s %s/v%d %.8f has been spent\n",utxo->coin,bits256_str(str,u.txid),u.vout,dstr(u.value)); LP_spentnotify(utxo,1); } - /*else if ( LP_ismine(utxo) > 0 ) - { - printf("iterate through all locally generated quotes and update, or change to price feed\n"); - // jl777: iterated Q's - if ( strcmp(utxo->coin,"KMD") == 0 ) - LP_priceping(pubsock,utxo,"BTC",profitmargin); - else LP_priceping(pubsock,utxo,"KMD",profitmargin); - }*/ } } @@ -416,7 +407,4 @@ LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,pullsock,myport,passphras } -// splitfunds cant trade? -// timeout on bad peers - diff --git a/iguana/exchanges/LP_quotes.c b/iguana/exchanges/LP_ordermatch.c similarity index 65% rename from iguana/exchanges/LP_quotes.c rename to iguana/exchanges/LP_ordermatch.c index e87212958..498f33a6c 100644 --- a/iguana/exchanges/LP_quotes.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -15,7 +15,7 @@ ******************************************************************************/ // -// LP_quotes.c +// LP_ordermatch.c // marketmaker // @@ -68,7 +68,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) jaddbits256(retjson,"txid2",qp->txid2); jaddnum(retjson,"vout2",qp->vout2); } - //if ( bits256_nonz(qp->desttxid) != 0 ) + if ( bits256_nonz(qp->desttxid) != 0 ) { if ( qp->destaddr[0] != 0 ) jaddstr(retjson,"destaddr",qp->destaddr); @@ -122,7 +122,8 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char *destcoin,double price) { memset(qp,0,sizeof(*qp)); - qp->timestamp = (uint32_t)time(NULL); + if ( qp->timestamp == 0 ) + qp->timestamp = (uint32_t)time(NULL); safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; @@ -145,9 +146,8 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * return(0); } -int32_t LP_quotedestinfo(struct LP_quoteinfo *qp,uint32_t quotetime,uint64_t destsatoshis,bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout,bits256 desthash,char *destaddr) +int32_t LP_quotedestinfo(struct LP_quoteinfo *qp,uint64_t destsatoshis,bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout,bits256 desthash,char *destaddr) { - qp->quotetime = quotetime; qp->destsatoshis = destsatoshis; qp->desttxid = desttxid; qp->destvout = destvout; @@ -210,11 +210,70 @@ char *LP_postedprice(cJSON *argjson) return(clonestr("{\"error\":\"missing fields in posted price\"}")); } -int32_t LP_sizematch(uint64_t mysatoshis,uint64_t othersatoshis) +int32_t LP_quote_checkmempool(struct LP_quoteinfo *qp) { - if ( mysatoshis >= othersatoshis ) - return(0); - else return(-1); + int32_t selector,spendvini; bits256 spendtxid; + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,qp->srccoin,qp->txid,qp->vout,qp->txid2,qp->vout2)) >= 0 ) + { + char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(-1); + } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,qp->destcoin,qp->desttxid,qp->destvout,qp->feetxid,qp->feevout)) >= 0 ) + { + char str[65]; printf("LP_tradecommand dest selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(-1); + } + return(0); +} + +int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop,struct LP_quoteinfo *qp,int32_t iambob) +{ + double qprice; uint64_t srcvalue,srcvalue2,destvalue,destvalue2; + *autxop = *butxop = 0; + if ( LP_iseligible(&srcvalue,&srcvalue2,1,qp->srccoin,qp->txid,qp->vout,qp->satoshis,qp->txid2,qp->vout2) == 0 ) + { + printf("bob not eligible\n"); + return(-2); + } + if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) + { + printf("alice not eligible\n"); + return(-3); + } + if ( LP_quote_checkmempool(qp) < 0 ) + return(-4); + if ( (*butxop= LP_utxofind(1,qp->txid,qp->vout)) == 0 ) + return(-5); + if ( bits256_cmp((*butxop)->deposit.txid,qp->txid2) != 0 || (*butxop)->deposit.vout != qp->vout2 ) + return(-6); + if ( strcmp((*butxop)->coinaddr,qp->coinaddr) != 0 ) + return(-7); + if ( iambob == 0 ) + { + if ( (*autxop= LP_utxofind(0,qp->desttxid,qp->destvout)) == 0 ) + return(-8); + if ( bits256_cmp((*autxop)->fee.txid,qp->feetxid) != 0 || (*autxop)->fee.vout != qp->feevout ) + return(-9); + if ( strcmp((*autxop)->coinaddr,qp->destaddr) != 0 ) + return(-10); + } + if ( destvalue <= qp->desttxfee || srcvalue <= qp->txfee ) + { + printf("destsatoshis %.8f or satoshis %.8f is too small txfees %.8f %.8f?\n",dstr(qp->destsatoshis),dstr(qp->satoshis),dstr(qp->desttxfee),dstr(qp->txfee)); + return(-11); + } + qprice = ((double)(qp->destsatoshis - qp->desttxfee) / (qp->satoshis - qp->txfee)); + if ( qp->satoshis < (srcvalue >> 1) ) + { + printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(srcvalue),dstr(qp->satoshis)); + return(-12); + } + if ( qp->destsatoshis < (destvalue >> 1) ) + { + printf("destsatoshis %.8f is less than half of value %.8f\n",dstr(qp->destsatoshis),dstr(destvalue)); + return(-13); + } + return(qprice); } int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) @@ -234,7 +293,6 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; if ( strcmp(method,"request") == 0 ) { - qp->quotetime = (uint32_t)time(NULL); if ( (utxo= LP_utxofind(0,qp->desttxid,qp->destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) LP_unavailableset(utxo,qp->srchash); else @@ -274,68 +332,57 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho return(price); } -int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin) +int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) +{ + int32_t i; + for (i=0; i<10; i++) + { + nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 50000)); + if ( nn_bind(pair,pairstr) >= 0 ) + return(0); + } + return(-1); +} + +int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { - char pairstr[512],destaddr[64]; cJSON *retjson; double bid,ask,price; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; uint64_t destvalue; struct LP_quoteinfo Q; struct basilisk_swap *swap; + char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); - if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) - { - price = ask; - //price *= (1. + profitmargin); - if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - return(-1); - if ( LP_quoteparse(&Q,argjson) < 0 ) - return(-2); - Q.destsatoshis = Q.satoshis * price + Q.desttxfee + 1; - privkey = LP_privkey(utxo->coinaddr); - if ( bits256_nonz(utxo->S.mypub) == 0 ) - utxo->S.mypub = LP_pubkey(privkey); - if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) - { - printf("not eligible\n"); - return(-1); - } - if ( utxo->payment.value > (Q.satoshis << 1) ) - { - printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(utxo->payment.value),dstr(Q.satoshis)); - return(-1); - } - destvalue = LP_txvalue(destaddr,rel,Q.desttxid,Q.destvout); - if ( bits256_nonz(privkey) != 0 && Q.quotetime >= Q.timestamp-3 && Q.quotetime <= utxo->T.swappending && bits256_cmp(utxo->S.mypub,Q.srchash) == 0 && destvalue >= price*Q.satoshis+Q.desttxfee && destvalue >= Q.destsatoshis+Q.desttxfee ) + qp->quotetime = (uint32_t)time(NULL); + privkey = LP_privkey(utxo->coinaddr); + if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) + { + if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) + printf("error creating utxo->pair\n"); + else if ( LP_nanobind(pair,pairstr,myipaddr) >= 0 ) { - nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 10000)); - if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) - printf("error creating utxo->pair\n"); - else if ( nn_bind(pair,pairstr) >= 0 ) + LP_requestinit(&qp->R,qp->srchash,qp->desthash,base,qp->satoshis,rel,qp->destsatoshis,qp->timestamp,qp->quotetime,DEXselector); + swap = LP_swapinit(1,0,privkey,&qp->R,qp); + swap->N.pair = pair; + utxo->S.swap = swap; + swap->utxo = utxo; + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)swap) == 0 ) { - LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,rel,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - swap = LP_swapinit(1,0,privkey,&Q.R,&Q); - swap->N.pair = pair; - utxo->S.swap = swap; - swap->utxo = utxo; - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_bobloop,(void *)swap) == 0 ) - { - retjson = LP_quotejson(&Q); - jaddstr(retjson,"method","connected"); - jaddstr(retjson,"pair",pairstr); - jaddnum(retjson,"requestid",Q.R.requestid); - jaddnum(retjson,"quoteid",Q.R.quoteid); - char str[65]; printf("BOB pubsock.%d sends to (%s)\n",pubsock,bits256_str(str,utxo->S.otherpubkey)); - if ( pubsock >= 0 ) - LP_send(pubsock,jprint(retjson,0),1); - jdelete(retjson,"method"); - jaddstr(retjson,"method2","connected"); - jaddstr(retjson,"method","forward"); - LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); - retval = 0; - } else printf("error launching swaploop\n"); - } else printf("printf error nn_connect to %s\n",pairstr); - } - else - { - printf("dest %.8f vs required %.8f (%d %d %d %d %d %d) %.8f %.8f\n",dstr(Q.destsatoshis),dstr(price*(utxo->S.satoshis-Q.txfee)),bits256_nonz(privkey) != 0 ,Q.timestamp == utxo->T.swappending-LP_RESERVETIME,Q.quotetime >= Q.timestamp-3,Q.quotetime < utxo->T.swappending,bits256_cmp(utxo->S.mypub,Q.srchash) == 0 ,destvalue >= price*Q.satoshis+Q.desttxfee,dstr(destvalue),dstr(price*Q.satoshis+Q.desttxfee)); - } - } else printf("no price for %s/%s\n",base,rel); + retjson = LP_quotejson(qp); + jaddstr(retjson,"method","connected"); + jaddstr(retjson,"pair",pairstr); + jaddnum(retjson,"requestid",qp->R.requestid); + jaddnum(retjson,"quoteid",qp->R.quoteid); + char str[65]; printf("BOB pubsock.%d sends to (%s)\n",pubsock,bits256_str(str,utxo->S.otherpubkey)); + if ( pubsock >= 0 ) + LP_send(pubsock,jprint(retjson,0),1); + jdelete(retjson,"method"); + jaddstr(retjson,"method2","connected"); + jaddstr(retjson,"method","forward"); + LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); + retval = 0; + } else printf("error launching swaploop\n"); + } else printf("couldnt bind to any port %s\n",pairstr); + } + else + { + printf("dest %.8f vs required %.8f (%d %d %d %d %d)\n",dstr(qp->destsatoshis),dstr(price*(utxo->S.satoshis-qp->txfee)),bits256_nonz(privkey) != 0 ,qp->timestamp == utxo->T.swappending-LP_RESERVETIME,qp->quotetime >= qp->timestamp-3,qp->quotetime < utxo->T.swappending,bits256_cmp(LP_mypubkey,qp->srchash) == 0); + } if ( retval < 0 ) { if ( pair >= 0 ) @@ -347,33 +394,43 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs char *LP_connectedalice(cJSON *argjson) // alice { - cJSON *retjson; bits256 spendtxid; int32_t spendvini,selector,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *utxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; - LP_quoteparse(&Q,argjson); + cJSON *retjson; double bid,ask,price,qprice; int32_t pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *autxo,*butxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; + if ( LP_quoteparse(&Q,argjson) < 0 ) + clonestr("{\"error\":\"cant parse quote\"}"); + if ( bits256_cmp(Q.desthash,LP_mypubkey) != 0 ) + return(clonestr("{\"result\",\"update stats\"}")); printf("CONNECTED.(%s)\n",jprint(argjson,0)); - if ( IAMLP == 0 && bits256_cmp(Q.desthash,LP_mypubkey) == 0 && (utxo= LP_utxofind(0,Q.desttxid,Q.destvout)) != 0 && LP_ismine(utxo) > 0 )//&& LP_isavailable(utxo) > 0 ) + if ( (qprice= LP_quote_validate(&autxo,&butxo,&Q,0)) <= SMALLVAL ) + { + LP_availableset(autxo); + printf("quote validate error %.0f\n",qprice); + return(clonestr("{\"error\":\"quote validation error\"}")); + } + if ( (price= LP_myprice(&bid,&ask,Q.srccoin,Q.destcoin)) <= SMALLVAL || bid <= SMALLVAL ) + { + printf("this node has no price for %s/%s\n",Q.srccoin,Q.destcoin); + LP_availableset(autxo); + return(clonestr("{\"error\":\"no price set\"}")); + } + price = bid; + if ( qprice > price ) + { + LP_availableset(autxo); + return(clonestr("{\"error\":\"quote price too expensive\"}")); + } + Q.privkey = LP_privkey(Q.destaddr); + if ( bits256_nonz(Q.privkey) != 0 && Q.quotetime >= Q.timestamp-3 ) { - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) - { - char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(clonestr("{\"error\",\"src txid in mempool\"}")); - } - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.srccoin,Q.txid,Q.vout,Q.txid2,Q.vout2)) >= 0 ) - { - char str[65]; printf("LP_connected src selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(clonestr("{\"error\",\"dest txid in mempool\"}")); - } retjson = cJSON_CreateObject(); if ( (pairstr= jstr(argjson,"pair")) == 0 || (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) jaddstr(retjson,"error","couldnt create pairsock"); else if ( nn_connect(pairsock,pairstr) >= 0 ) { - LP_unavailableset(utxo,Q.srchash); - Q.privkey = LP_privkey(Q.destaddr); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); swap->N.pair = pairsock; - utxo->S.swap = swap; - swap->utxo = utxo; + autxo->S.swap = swap; + swap->utxo = autxo; printf("alice pairstr.(%s)\n",pairstr); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) { @@ -383,91 +440,73 @@ char *LP_connectedalice(cJSON *argjson) // alice jaddnum(retjson,"quoteid",Q.R.quoteid); } else jaddstr(retjson,"error","couldnt aliceloop"); } + if ( jobj(retjson,"error") != 0 ) + LP_availableset(autxo); return(jprint(retjson,1)); } else { - utxo = LP_utxofind(0,Q.desttxid,Q.destvout); - printf("alice fails %d %d %d %d %d\n",IAMLP == 0,bits256_cmp(Q.desthash,LP_mypubkey) == 0, utxo != 0,LP_ismine(utxo) > 0,LP_isavailable(utxo) > 0); - return(clonestr("{\"result\",\"update stats\"}")); + LP_availableset(autxo); + return(clonestr("{\"error\",\"no privkey\"}")); } } int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method,*base,*rel; cJSON *retjson; double price,bid,ask; bits256 txid,spendtxid; struct LP_utxoinfo *utxo; int32_t selector,spendvini,retval = -1; struct LP_quoteinfo Q; + char *method; cJSON *retjson; double qprice,price,bid,ask; struct LP_utxoinfo *autxo,*butxo; int32_t retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { //printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); retval = 1; - txid = jbits256(argjson,"txid"); - if ( (utxo= LP_utxofind(1,txid,jint(argjson,"vout"))) != 0 && LP_ismine(utxo) > 0 && (base= jstr(argjson,"base")) != 0 && (rel= jstr(argjson,"rel")) != 0 && strcmp(base,utxo->coin) == 0 ) + if ( LP_quoteparse(&Q,argjson) == 0 ) { - printf("pend.%u LP_tradecommand.(%s)\n",utxo->T.swappending,jprint(argjson,0)); - if ( LP_quoteparse(&Q,argjson) < 0 ) - return(-2); - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout)) >= 0 ) + if ( (price= LP_myprice(&bid,&ask,Q.srccoin,Q.destcoin)) <= SMALLVAL || ask <= SMALLVAL ) { - char str[65]; printf("LP_tradecommand selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - utxo->T.spentflag = (uint32_t)time(NULL); - return(0); + printf("this node has no price for %s/%s\n",Q.srccoin,Q.destcoin); + return(-3); } - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,Q.destcoin,Q.desttxid,Q.destvout,Q.feetxid,Q.feevout)) >= 0 ) + price = ask; + if ( (qprice= LP_quote_validate(&autxo,&butxo,&Q,1)) <= SMALLVAL ) { - char str[65]; printf("LP_tradecommand dest selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(0); + printf("quote validate error %.0f\n",qprice); + return(-4); } - if ( utxo->S.swap == 0 && time(NULL) > utxo->T.swappending ) - utxo->T.swappending = 0; + if ( qprice < price ) + { + printf("quote price %.8f too low vs %.8f for %s/%s\n",qprice,price,Q.srccoin,Q.destcoin); + return(-5); + } + if ( butxo->S.swap == 0 && time(NULL) > butxo->T.swappending ) + butxo->T.swappending = 0; if ( strcmp(method,"request") == 0 ) // bob needs apayment + fee tx's { - retval = 1; - if ( LP_isavailable(utxo) > 0 ) + if ( LP_isavailable(butxo) > 0 ) { - if ( (price= LP_myprice(&bid,&ask,base,rel)) > SMALLVAL ) - { - price = ask; - //price *= (1. + profitmargin); - //if ( LP_quoteinfoinit(&Q,utxo,rel,price) < 0 ) - // return(-1); - if ( LP_iseligible(1,Q.srccoin,Q.txid,Q.vout,Q.satoshis,Q.txid2,Q.vout2) == 0 ) - { - printf("not eligible\n"); - return(-1); - } - Q.timestamp = (uint32_t)time(NULL); - utxo->T.swappending = Q.timestamp + LP_RESERVETIME; - retjson = LP_quotejson(&Q); - utxo->S.otherpubkey = jbits256(argjson,"desthash"); - retval |= 2; - LP_unavailableset(utxo,utxo->S.otherpubkey); - jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); - jaddnum(retjson,"pending",utxo->T.swappending); - jaddbits256(retjson,"desthash",utxo->S.otherpubkey); - jaddbits256(retjson,"pubkey",utxo->S.otherpubkey); - jaddstr(retjson,"method","reserved"); - if ( pubsock >= 0 ) - LP_send(pubsock,jprint(retjson,0),1); - jdelete(retjson,"method"); - jaddstr(retjson,"method2","reserved"); - jaddstr(retjson,"method","forward"); - LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); - utxo->T.lasttime = (uint32_t)time(NULL); - //printf("set swappending.%u\n",utxo->T.swappending); - } else printf("null price\n"); - } else printf("swappending.%u swap.%p\n",utxo->T.swappending,utxo->S.swap); + butxo->T.swappending = Q.timestamp + LP_RESERVETIME; + retjson = LP_quotejson(&Q); + butxo->S.otherpubkey = jbits256(argjson,"desthash"); + LP_unavailableset(butxo,butxo->S.otherpubkey); + jaddnum(retjson,"quotetime",juint(argjson,"quotetime")); + jaddnum(retjson,"pending",butxo->T.swappending); + jaddbits256(retjson,"desthash",butxo->S.otherpubkey); + jaddbits256(retjson,"pubkey",butxo->S.otherpubkey); + jaddstr(retjson,"method","reserved"); + if ( pubsock >= 0 ) + LP_send(pubsock,jprint(retjson,0),1); + jdelete(retjson,"method"); + jaddstr(retjson,"method2","reserved"); + jaddstr(retjson,"method","forward"); + LP_forward(myipaddr,pubsock,profitmargin,butxo->S.otherpubkey,jprint(retjson,1),1); + butxo->T.lasttime = (uint32_t)time(NULL); + printf("set swappending.%u accept qprice %.8f, min %.8f\n",butxo->T.swappending,qprice,price); + } else printf("warning swappending.%u swap.%p\n",butxo->T.swappending,butxo->S.swap); } else if ( strcmp(method,"connect") == 0 ) // bob { retval = 4; - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,jstr(argjson,"destcoin"),jbits256(argjson,"desttxid"),jint(argjson,"destvout"),jbits256(argjson,"feetxid"),jint(argjson,"feevout"))) >= 0 ) - { - char str[65]; printf("LP_tradecommand fee selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(0); - } - if ( utxo->T.swappending != 0 && utxo->S.swap == 0 ) - LP_connectstartbob(pubsock,utxo,argjson,myipaddr,base,rel,profitmargin); - else printf("pend.%u swap %p when connect came in (%s)\n",utxo->T.swappending,utxo->S.swap,jprint(argjson,0)); + if ( butxo->T.swappending != 0 && butxo->S.swap == 0 ) + LP_connectstartbob(pubsock,butxo,argjson,myipaddr,Q.srccoin,Q.destcoin,profitmargin,qprice,&Q); + else printf("pend.%u swap %p when connect came in (%s)\n",butxo->T.swappending,butxo->S.swap,jprint(argjson,0)); } } } @@ -538,7 +577,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); asatoshis = (Q.satoshis * ordermatchprice + Q.desttxfee + 1); printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); - if ( LP_quotedestinfo(&Q,Q.timestamp+1,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) + if ( LP_quotedestinfo(&Q,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index 19e2adec8..f42043ab3 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -1423,3 +1423,13 @@ if ( (array= LP_tradecandidates(base)) != 0 ) free_json(array); } }*/ + +/*else if ( LP_ismine(utxo) > 0 ) + { + printf("iterate through all locally generated quotes and update, or change to price feed\n"); + // jl777: iterated Q's + if ( strcmp(utxo->coin,"KMD") == 0 ) + LP_priceping(pubsock,utxo,"BTC",profitmargin); + else LP_priceping(pubsock,utxo,"KMD",profitmargin); + }*/ + diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 9f1f0025a..c37c100a9 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -271,6 +271,7 @@ int32_t LP_waitmempool(char *symbol,bits256 txid,int32_t duration) { if ( LP_mempoolscan(symbol,txid) >= 0 ) return(0); + usleep(250000); } return(-1); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b83c019e6..9c0de17c9 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -348,30 +348,37 @@ char *LP_spentcheck(cJSON *argjson) return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -int32_t LP_iseligible(int32_t iambob,char *symbol,bits256 txid,int32_t vout,uint64_t satoshis,bits256 txid2,int32_t vout2) +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) { - uint64_t val,val2,threshold; char destaddr[64]; + uint64_t val,val2=0,threshold; char destaddr[64],destaddr2[64]; + destaddr[0] = destaddr2[0] = 0; if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) { threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); - if ( (val2= LP_txvalue(destaddr,symbol,txid2,vout2)) >= threshold ) + if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); - return(1); + if ( strcmp(destaddr,destaddr2) == 0 ) + { + *valp = val; + *val2p = val2; + return(1); + } else printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); } else printf("mismatched %s txid value2 %.8f < %.8f\n",symbol,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); + *valp = val; + *val2p = val2; return(0); } struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - char str[65],str2[65],destaddr[64],destaddr2[64]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + char str[65]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - destaddr2[0] = 0; if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; @@ -393,12 +400,12 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } else { - if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) + /*if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) { printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); return(0); - } - if ( LP_iseligible(iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + }*/ + if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); diff --git a/iguana/exchanges/help b/iguana/exchanges/help new file mode 100755 index 000000000..a5f08aa50 --- /dev/null +++ b/iguana/exchanges/help @@ -0,0 +1,2 @@ +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"help\"}" From f586d3948d9c2907e3f765c8700198e8b7f7d801 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 12:49:17 +0300 Subject: [PATCH 454/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6d6b61abe..db9d0eaee 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -21,7 +21,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { - char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport=0,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) @@ -47,7 +47,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs if ( (method= jstr(argjson,"method")) == 0 ) { if ( flag == 0 || jobj(argjson,"result") != 0 ) - printf("stats_JSON no method: (%s)\n",jprint(argjson,0)); + printf("stats_JSON no method: (%s) (%s:%u)\n",jprint(argjson,0),ipaddr,argport); return(clonestr("{\"error\":\"need method in request\"}")); } if ( strcmp(method,"help") == 0 ) From c1ee2388fd0bb63afe78071b60c9d84a20527df2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 12:49:44 +0300 Subject: [PATCH 455/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index db9d0eaee..40e8f7154 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -24,7 +24,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport=0,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { - if ( strcmp(ipaddr,"127.0.0.1") != 0 && port >= 1000 ) + if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) { flag = 1; if ( (pushport= juint(argjson,"push")) == 0 ) From 7126c3d19be839334b2d7a1fa5eb95133bc135f2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 12:56:09 +0300 Subject: [PATCH 456/910] 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 498f33a6c..55eb9cc6d 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -546,7 +546,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { asatoshis = butxo->payment.value * price; - if ( asatoshis <= destsatoshis && destsatoshis > (asatoshis >> 1) ) + if ( asatoshis <= destsatoshis && destsatoshis > (asatoshis >> 1) && asatoshis > (autxo->payment.value >> 1) ) { metric = price / bestprice; printf("%f %f %f %f ",price,metric,dstr(asatoshis),metric * metric * metric); From 4adc1818d83a28bc0c2aa5b2977284deeafee612 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 12:57:48 +0300 Subject: [PATCH 457/910] 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 55eb9cc6d..00a6365ea 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -561,7 +561,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestmetric = metric; } } - } + } printf("skip %.8f < half of %.8f\n",dstr(asatoshis),dstr(autxo->payment.value)); } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } } else break; From 348ea72061eb9507f9ef42d9d0dbfad802dd7470 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:00:30 +0300 Subject: [PATCH 458/910] 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 00a6365ea..59303e7a9 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -561,7 +561,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestmetric = metric; } } - } printf("skip %.8f < half of %.8f\n",dstr(asatoshis),dstr(autxo->payment.value)); + } printf("skip.(%d %d %d) destsatoshis %.8f asatoshis %.8f < half of %.8f\n",asatoshis <= destsatoshis,destsatoshis > (asatoshis >> 1),asatoshis > (autxo->payment.value >> 1),dstr(destsatoshis),dstr(asatoshis),dstr(autxo->payment.value)); } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } } else break; From 023fb100575710277cb44ac8a2e23484b08719d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:29:10 +0300 Subject: [PATCH 459/910] Test --- iguana/exchanges/LP_ordermatch.c | 55 +++++++++++++++----------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 59303e7a9..eb3c7b368 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -119,7 +119,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) return(0); } -int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char *destcoin,double price) +int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char *destcoin,double price,uint64_t destsatoshis) { memset(qp,0,sizeof(*qp)); if ( qp->timestamp == 0 ) @@ -127,14 +127,15 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; - if ( utxo->iambob == 0 || qp->txfee >= utxo->S.satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(utxo->S.satoshis) ) + qp->satoshis = destsatoshis / price; + if ( utxo->iambob == 0 || qp->txfee >= qp->satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis) ) return(-1); + qp->satoshis -= qp->txfee; qp->txid = utxo->payment.txid; qp->vout = utxo->payment.vout; qp->txid2 = utxo->deposit.txid; qp->vout2 = utxo->deposit.vout; - qp->satoshis = utxo->S.satoshis - qp->txfee; - qp->destsatoshis = qp->satoshis * price; + qp->destsatoshis = destsatoshis; if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) qp->desttxfee = 10000; if ( qp->desttxfee >= qp->destsatoshis ) @@ -146,9 +147,8 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * return(0); } -int32_t LP_quotedestinfo(struct LP_quoteinfo *qp,uint64_t destsatoshis,bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout,bits256 desthash,char *destaddr) +int32_t LP_quotedestinfo(struct LP_quoteinfo *qp,bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout,bits256 desthash,char *destaddr) { - qp->destsatoshis = destsatoshis; qp->desttxid = desttxid; qp->destvout = destvout; qp->desthash = desthash; @@ -515,13 +515,14 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { - uint64_t destsatoshis,asatoshis; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + uint64_t destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); - destsatoshis = SATOSHIDEN * volume; - if ( (autxo= LP_utxo_bestfit(rel,destsatoshis)) == 0 ) + if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) return(clonestr("{\"error\":\"cant find utxo that is big enough\"}")); bestmetric = ordermatchprice = 0.; + desttxfee = LP_getestimatedrate(rel) * LP_AVETXSIZE; + txfee = LP_getestimatedrate(base) * LP_AVETXSIZE; if ( timeout == 0 ) timeout = LP_AUTOTRADE_TIMEOUT; if ( (obookstr= LP_orderbook(base,rel)) != 0 ) @@ -543,25 +544,23 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba txid = jbits256(item,"txid"); vout = jint(item,"vout"); vol = jdouble(item,"volume"); - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + metric = price / bestprice; + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.1 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { - asatoshis = butxo->payment.value * price; - if ( asatoshis <= destsatoshis && destsatoshis > (asatoshis >> 1) && asatoshis > (autxo->payment.value >> 1) ) + if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee ) + destsatoshis *= ((double)autxo->payment.value / destsatoshis - desttxfee*2); + if ( destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) { - metric = price / bestprice; - printf("%f %f %f %f ",price,metric,dstr(asatoshis),metric * metric * metric); - if ( metric < 1.1 ) + metric = dstr(destsatoshis) * metric * metric * metric; + printf("(%f) <- metric\n",metric); + if ( bestmetric == 0. || metric < bestmetric ) { - metric = dstr(asatoshis) * metric * metric * metric; - printf("(%f) <- metric\n",metric); - if ( bestmetric == 0. || metric < bestmetric ) - { - bestutxo = butxo; - ordermatchprice = price; - bestmetric = metric; - } + bestutxo = butxo; + ordermatchprice = price; + bestdestsatoshis = destsatoshis; + bestmetric = metric; } - } printf("skip.(%d %d %d) destsatoshis %.8f asatoshis %.8f < half of %.8f\n",asatoshis <= destsatoshis,destsatoshis > (asatoshis >> 1),asatoshis > (autxo->payment.value >> 1),dstr(destsatoshis),dstr(asatoshis),dstr(autxo->payment.value)); + } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->payment.value >> 1),dstr(destsatoshis),dstr(butxo->payment.value),dstr(autxo->payment.value)); } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } } else break; @@ -571,13 +570,11 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba } free(obookstr); } - if ( bestutxo == 0 || ordermatchprice == 0. ) + if ( bestutxo == 0 || ordermatchprice == 0. || bestdestsatoshis == 0 ) return(clonestr("{\"error\":\"cant find ordermatch utxo\"}")); - if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice) < 0 ) + if ( LP_quoteinfoinit(&Q,bestutxo,rel,ordermatchprice,bestdestsatoshis) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); - asatoshis = (Q.satoshis * ordermatchprice + Q.desttxfee + 1); - printf("asatoshis %.8f = bvalue %.8f * ordermatch %.8f\n",dstr(asatoshis),dstr(Q.satoshis),ordermatchprice); - if ( LP_quotedestinfo(&Q,asatoshis,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) + if ( LP_quotedestinfo(&Q,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); From 2d8fa6bef0276615a9c62331656783a1ee994503 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:34:34 +0300 Subject: [PATCH 460/910] Test --- iguana/exchanges/LP_ordermatch.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index eb3c7b368..da27b3d86 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -515,7 +515,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { - uint64_t destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + int64_t destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) @@ -547,20 +547,22 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba metric = price / bestprice; if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.1 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { - if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee ) - destsatoshis *= ((double)autxo->payment.value / destsatoshis - desttxfee*2); - if ( destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) + if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) { - metric = dstr(destsatoshis) * metric * metric * metric; - printf("(%f) <- metric\n",metric); - if ( bestmetric == 0. || metric < bestmetric ) + destsatoshis *= ((double)autxo->payment.value / destsatoshis - desttxfee*2); + if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) { - bestutxo = butxo; - ordermatchprice = price; - bestdestsatoshis = destsatoshis; - bestmetric = metric; - } - } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->payment.value >> 1),dstr(destsatoshis),dstr(butxo->payment.value),dstr(autxo->payment.value)); + printf("best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); + metric = dstr(destsatoshis) * metric * metric * metric; + if ( bestmetric == 0. || metric < bestmetric ) + { + bestutxo = butxo; + ordermatchprice = price; + bestdestsatoshis = destsatoshis; + bestmetric = metric; + } + } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->payment.value >> 1),dstr(destsatoshis),dstr(butxo->payment.value),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } } else break; From f1c7e0d3f809035b97721b18471425f0d64b8d27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:36:00 +0300 Subject: [PATCH 461/910] 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 da27b3d86..0a61c77d8 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -549,7 +549,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba { if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) { - destsatoshis *= ((double)autxo->payment.value / destsatoshis - desttxfee*2); + destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee*2)); if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) { printf("best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); From f4a469b246e25f49edfc2beaf0f3b749df553fdf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:38:21 +0300 Subject: [PATCH 462/910] 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 0a61c77d8..c064bf0a0 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -552,7 +552,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee*2)); if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) { - printf("best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); + printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; if ( bestmetric == 0. || metric < bestmetric ) { From 643907500b10140d419deb504684c70a5084643d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:40:25 +0300 Subject: [PATCH 463/910] Test --- iguana/exchanges/LP_ordermatch.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c064bf0a0..c31e73254 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -545,7 +545,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba vout = jint(item,"vout"); vol = jdouble(item,"volume"); metric = price / bestprice; - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.1 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) { @@ -560,6 +560,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba ordermatchprice = price; bestdestsatoshis = destsatoshis; bestmetric = metric; + printf("set best!\n"); } } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->payment.value >> 1),dstr(destsatoshis),dstr(butxo->payment.value),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } From b6060d5e09ae01e1b3af835aa4cbf2d7ae0393b4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:42:56 +0300 Subject: [PATCH 464/910] Test --- iguana/exchanges/LP_ordermatch.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c31e73254..8294bed7b 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -129,7 +129,10 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * qp->txfee = 10000; qp->satoshis = destsatoshis / price; if ( utxo->iambob == 0 || qp->txfee >= qp->satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis) ) + { + printf("quoteinit error.(%d %d %d %d)\n",utxo->iambob == 0,qp->txfee >= qp->satoshis,qp->txfee >= utxo->deposit.value,utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis)); return(-1); + } qp->satoshis -= qp->txfee; qp->txid = utxo->payment.txid; qp->vout = utxo->payment.vout; @@ -139,7 +142,10 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) qp->desttxfee = 10000; if ( qp->desttxfee >= qp->destsatoshis ) + { + printf("quoteinit desttxfee %.8f < %.8f destsatoshis\n",dstr(qp->desttxfee),dstr(qp->destsatoshis)); return(-2); + } qp->destsatoshis -= qp->desttxfee; safecopy(qp->srccoin,utxo->coin,sizeof(qp->srccoin)); safecopy(qp->coinaddr,utxo->coinaddr,sizeof(qp->coinaddr)); From b777ae2b948112786ebb9f1f73ff5ca8ef771699 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:43:56 +0300 Subject: [PATCH 465/910] 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 8294bed7b..be4468b3e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -130,7 +130,7 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * qp->satoshis = destsatoshis / price; if ( utxo->iambob == 0 || qp->txfee >= qp->satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis) ) { - printf("quoteinit error.(%d %d %d %d)\n",utxo->iambob == 0,qp->txfee >= qp->satoshis,qp->txfee >= utxo->deposit.value,utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis)); + printf("quoteinit error.(%d %d %d %d) %.8f vs %.8f\n",utxo->iambob == 0,qp->txfee >= qp->satoshis,qp->txfee >= utxo->deposit.value,utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis),dstr(utxo->deposit.value),dstr(LP_DEPOSITSATOSHIS(qp->satoshis))); return(-1); } qp->satoshis -= qp->txfee; From bed2887867fbdd0a53599043ec85b3ac515aed7b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:47:25 +0300 Subject: [PATCH 466/910] Test --- iguana/exchanges/LP_ordermatch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index be4468b3e..0a1b4d064 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -553,10 +553,10 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba metric = price / bestprice; if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { - if ( (destsatoshis= (butxo->payment.value * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) + if ( (destsatoshis= (butxo->S.satoshis * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) { destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee*2)); - if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->payment.value >> 1) ) + if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) { printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; @@ -568,7 +568,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->payment.value >> 1),dstr(destsatoshis),dstr(butxo->payment.value),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->S.satoshis >> 1),dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } From 37412af68a063f61a2c59d304d2f560b4f9d3a35 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 13:57:19 +0300 Subject: [PATCH 467/910] Test --- iguana/exchanges/LP_ordermatch.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0a1b4d064..d5cd41c0f 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -87,7 +87,7 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) jadd64bits(retjson,"destsatoshis",qp->destsatoshis); if ( qp->satoshis != 0 ) { - price = (double)(qp->destsatoshis + qp->desttxfee) / qp->satoshis; + price = (double)qp->destsatoshis / qp->satoshis; jaddnum(retjson,"price",price); } } @@ -127,13 +127,12 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) qp->txfee = 10000; - qp->satoshis = destsatoshis / price; + qp->satoshis = destsatoshis / price + 0.49; if ( utxo->iambob == 0 || qp->txfee >= qp->satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis) ) { printf("quoteinit error.(%d %d %d %d) %.8f vs %.8f\n",utxo->iambob == 0,qp->txfee >= qp->satoshis,qp->txfee >= utxo->deposit.value,utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis),dstr(utxo->deposit.value),dstr(LP_DEPOSITSATOSHIS(qp->satoshis))); return(-1); } - qp->satoshis -= qp->txfee; qp->txid = utxo->payment.txid; qp->vout = utxo->payment.vout; qp->txid2 = utxo->deposit.txid; @@ -146,7 +145,6 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * printf("quoteinit desttxfee %.8f < %.8f destsatoshis\n",dstr(qp->desttxfee),dstr(qp->destsatoshis)); return(-2); } - qp->destsatoshis -= qp->desttxfee; safecopy(qp->srccoin,utxo->coin,sizeof(qp->srccoin)); safecopy(qp->coinaddr,utxo->coinaddr,sizeof(qp->coinaddr)); qp->srchash = utxo->pubkey; @@ -263,12 +261,12 @@ int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxo if ( strcmp((*autxop)->coinaddr,qp->destaddr) != 0 ) return(-10); } - if ( destvalue <= qp->desttxfee || srcvalue <= qp->txfee ) + if ( destvalue < qp->desttxfee+qp->destsatoshis || srcvalue < qp->txfee+qp->satoshis ) { printf("destsatoshis %.8f or satoshis %.8f is too small txfees %.8f %.8f?\n",dstr(qp->destsatoshis),dstr(qp->satoshis),dstr(qp->desttxfee),dstr(qp->txfee)); return(-11); } - qprice = ((double)(qp->destsatoshis - qp->desttxfee) / (qp->satoshis - qp->txfee)); + qprice = ((double)qp->destsatoshis / qp->satoshis); if ( qp->satoshis < (srcvalue >> 1) ) { printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(srcvalue),dstr(qp->satoshis)); @@ -279,6 +277,7 @@ int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxo printf("destsatoshis %.8f is less than half of value %.8f\n",dstr(qp->destsatoshis),dstr(destvalue)); return(-13); } + printf("qprice %.8f <- %.8f/%.8f txfees.(%.8f %.8f)\n",qprice,dstr(qp->destsatoshis),dstr(qp->satoshis),dstr(qp->txfee),dstr(qp->desttxfee)); return(qprice); } @@ -479,7 +478,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d } if ( qprice < price ) { - printf("quote price %.8f too low vs %.8f for %s/%s\n",qprice,price,Q.srccoin,Q.destcoin); + printf("(%.8f %.8f) quote price %.8f too low vs %.8f for %s/%s\n",bid,ask,qprice,price,Q.srccoin,Q.destcoin); return(-5); } if ( butxo->S.swap == 0 && time(NULL) > butxo->T.swappending ) From 381a036e04efee32d2096a5a2ab5bb3a601710c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:04:55 +0300 Subject: [PATCH 468/910] 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 d5cd41c0f..f66946973 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -241,7 +241,7 @@ int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxo } if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) { - printf("alice not eligible\n"); + printf("alice not eligible (%.8f %.8f)\n",dstr(destvalue),dstr(destvalue2)); return(-3); } if ( LP_quote_checkmempool(qp) < 0 ) From 52c35c4cf07c2bbd1696a1a67e5973f37d95af04 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:06:45 +0300 Subject: [PATCH 469/910] 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 f66946973..0a97a8d08 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -241,7 +241,7 @@ int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxo } if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) { - printf("alice not eligible (%.8f %.8f)\n",dstr(destvalue),dstr(destvalue2)); + 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_quote_checkmempool(qp) < 0 ) From 7f6454ca98c9214061fdf0798c2b0381bc616fe2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:14:44 +0300 Subject: [PATCH 470/910] Test --- iguana/exchanges/LP_ordermatch.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0a97a8d08..8414b882f 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -552,23 +552,22 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba metric = price / bestprice; if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { - if ( (destsatoshis= (butxo->S.satoshis * price)) > autxo->payment.value-desttxfee && destsatoshis > 2*desttxfee ) - { + destsatoshis = (butxo->S.satoshis * price); + if ( destsatoshis > autxo->payment.value-desttxfee ) destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee*2)); - if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) + if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) + { + printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); + metric = dstr(destsatoshis) * metric * metric * metric; + if ( bestmetric == 0. || metric < bestmetric ) { - printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); - metric = dstr(destsatoshis) * metric * metric * metric; - if ( bestmetric == 0. || metric < bestmetric ) - { - bestutxo = butxo; - ordermatchprice = price; - bestdestsatoshis = destsatoshis; - bestmetric = metric; - printf("set best!\n"); - } - } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->S.satoshis >> 1),dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); - } + bestutxo = butxo; + ordermatchprice = price; + bestdestsatoshis = destsatoshis; + bestmetric = metric; + printf("set best!\n"); + } + } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->S.satoshis >> 1),dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); } } else break; From 70d2b9d49f82f61873b665ef67206eb996fa05d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:17:59 +0300 Subject: [PATCH 471/910] Test --- iguana/exchanges/LP_ordermatch.c | 46 +++++++++++++++++++------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 8414b882f..90f5c24bc 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -585,34 +585,42 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); - if ( price <= maxprice ) + if ( price > SMALLVAL ) { - price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); - LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); - expiration = (uint32_t)time(NULL) + timeout; - while ( time(NULL) < expiration ) + if ( price <= maxprice ) { - if ( autxo->S.swap != 0 ) - break; - sleep(1); + price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); + LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); + expiration = (uint32_t)time(NULL) + timeout; + while ( time(NULL) < expiration ) + { + if ( autxo->S.swap != 0 ) + break; + sleep(1); + } + if ( autxo->S.swap == 0 ) + { + jaddstr(bestitem,"status","couldnt establish connection"); + LP_availableset(autxo); + } + else jaddstr(bestitem,"status","connected"); + jaddnum(bestitem,"quotedprice",price); + jaddnum(bestitem,"maxprice",maxprice); + jaddnum(bestitem,"requestid",Q.R.requestid); + jaddnum(bestitem,"quoteid",Q.R.quoteid); + printf("Alice r.%u q.%u\n",Q.R.requestid,Q.R.quoteid); } - if ( autxo->S.swap == 0 ) + else { - jaddstr(bestitem,"status","couldnt establish connection"); - LP_availableset(autxo); + jaddnum(bestitem,"quotedprice",price); + jaddnum(bestitem,"maxprice",maxprice); + jaddstr(bestitem,"status","too expensive"); } - else jaddstr(bestitem,"status","connected"); - jaddnum(bestitem,"quotedprice",price); - jaddnum(bestitem,"maxprice",maxprice); - jaddnum(bestitem,"requestid",Q.R.requestid); - jaddnum(bestitem,"quoteid",Q.R.quoteid); - printf("Alice r.%u q.%u\n",Q.R.requestid,Q.R.quoteid); } else { - jaddnum(bestitem,"quotedprice",price); jaddnum(bestitem,"maxprice",maxprice); - jaddstr(bestitem,"status","too expensive"); + jaddstr(bestitem,"status","no response to request"); } return(jprint(bestitem,0)); } From 73640984301bc9441ac1789d09721b06639b0783 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:21:15 +0300 Subject: [PATCH 472/910] 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 90f5c24bc..e684733e4 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -230,7 +230,7 @@ int32_t LP_quote_checkmempool(struct LP_quoteinfo *qp) return(0); } -int32_t LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop,struct LP_quoteinfo *qp,int32_t iambob) +double LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop,struct LP_quoteinfo *qp,int32_t iambob) { double qprice; uint64_t srcvalue,srcvalue2,destvalue,destvalue2; *autxop = *butxop = 0; From bc5b54016296f371b77897b798fac51e7753c7cc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:25:15 +0300 Subject: [PATCH 473/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 40e8f7154..eaffc014b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -121,7 +121,7 @@ forwardhex(pubkey,hex)\n\ { if ( price > SMALLVAL ) { - LP_mypriceset(base,rel,price); + LP_mypriceset(rel,base,1./price); return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,price,jdouble(argjson,"volume"),jint(argjson,"timeout"))); } else return(clonestr("{\"error\":\"no price set\"}")); } diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index e684733e4..80c4c4068 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -413,7 +413,7 @@ char *LP_connectedalice(cJSON *argjson) // alice } if ( (price= LP_myprice(&bid,&ask,Q.srccoin,Q.destcoin)) <= SMALLVAL || bid <= SMALLVAL ) { - printf("this node has no price for %s/%s\n",Q.srccoin,Q.destcoin); + printf("this node has no price for %s/%s (%.8f %.8f)\n",Q.srccoin,Q.destcoin,bid,ask); LP_availableset(autxo); return(clonestr("{\"error\":\"no price set\"}")); } From 5e7ff4fa3cf61c504b0c24e3bf6385be943178ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:27:02 +0300 Subject: [PATCH 474/910] Test --- iguana/exchanges/LP_commands.c | 1 + iguana/exchanges/LP_ordermatch.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index eaffc014b..f8ee69477 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -121,6 +121,7 @@ forwardhex(pubkey,hex)\n\ { if ( price > SMALLVAL ) { + printf("price set (%s/%s) <- %.8f\n",rel,base,1./price); LP_mypriceset(rel,base,1./price); return(LP_autotrade(myipaddr,pubsock,profitmargin,base,rel,price,jdouble(argjson,"volume"),jint(argjson,"timeout"))); } else return(clonestr("{\"error\":\"no price set\"}")); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 80c4c4068..3b2293ef5 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -411,13 +411,13 @@ char *LP_connectedalice(cJSON *argjson) // alice printf("quote validate error %.0f\n",qprice); return(clonestr("{\"error\":\"quote validation error\"}")); } - if ( (price= LP_myprice(&bid,&ask,Q.srccoin,Q.destcoin)) <= SMALLVAL || bid <= SMALLVAL ) + if ( (price= LP_myprice(&bid,&ask,Q.destcoin,Q.srccoin)) <= SMALLVAL || bid <= SMALLVAL ) { - printf("this node has no price for %s/%s (%.8f %.8f)\n",Q.srccoin,Q.destcoin,bid,ask); + printf("this node has no price for %s/%s (%.8f %.8f)\n",Q.destcoin,Q.srccoin,bid,ask); LP_availableset(autxo); return(clonestr("{\"error\":\"no price set\"}")); } - price = bid; + price = 1. / bid; if ( qprice > price ) { LP_availableset(autxo); From 714a45540e77b8ca446744e36e8de9918f2d95c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:31:40 +0300 Subject: [PATCH 475/910] Test --- iguana/exchanges/LP_ordermatch.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 3b2293ef5..08220a2a9 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -411,14 +411,14 @@ char *LP_connectedalice(cJSON *argjson) // alice printf("quote validate error %.0f\n",qprice); return(clonestr("{\"error\":\"quote validation error\"}")); } - if ( (price= LP_myprice(&bid,&ask,Q.destcoin,Q.srccoin)) <= SMALLVAL || bid <= SMALLVAL ) + if ( (price= LP_myprice(&bid,&ask,Q.destcoin,Q.srccoin)) <= SMALLVAL || ask <= SMALLVAL ) { printf("this node has no price for %s/%s (%.8f %.8f)\n",Q.destcoin,Q.srccoin,bid,ask); LP_availableset(autxo); return(clonestr("{\"error\":\"no price set\"}")); } - price = 1. / bid; - if ( qprice > price ) + price = 1. / ask; + if ( qprice > price+SMALLVAL ) { LP_availableset(autxo); return(clonestr("{\"error\":\"quote price too expensive\"}")); @@ -476,7 +476,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d printf("quote validate error %.0f\n",qprice); return(-4); } - if ( qprice < price ) + if ( qprice < price-SMALLVAL ) { printf("(%.8f %.8f) quote price %.8f too low vs %.8f for %s/%s\n",bid,ask,qprice,price,Q.srccoin,Q.destcoin); return(-5); From cf2035e002ef7df38abe79afc53197c21862a601 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:38:23 +0300 Subject: [PATCH 476/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_swap.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 6b2263712..0fcd9876f 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -223,7 +223,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu } else retval = 0; if ( retval >= 0 && peer->pushsock >= 0 ) { - printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); + //printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; hexstr = malloc(len*2 + 1); init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index fa674cf7a..b0facbf01 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -419,15 +419,15 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; - //printf("waitsend.%s\n",statename); + printf("waitsend.%s\n",statename); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { - //printf("waited for %s\n",statename); + printf("waited for %s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { - //printf("sent.%d after waitfor.%s\n",sendlen,statename); + printf("sent.%d after waitfor.%s\n",sendlen,statename); retval = 0; } else printf("send %s error\n",statename); } else printf("%s datagen no data\n",statename); From 3acf2894c5942643bb38f04bc20b817b16fdd90c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:41:57 +0300 Subject: [PATCH 477/910] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_swap.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 08220a2a9..71edf0d29 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -418,7 +418,7 @@ char *LP_connectedalice(cJSON *argjson) // alice return(clonestr("{\"error\":\"no price set\"}")); } price = 1. / ask; - if ( qprice > price+SMALLVAL ) + //if ( qprice > price+SMALLVAL ) { LP_availableset(autxo); return(clonestr("{\"error\":\"quote price too expensive\"}")); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b0facbf01..cf717ea35 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -403,12 +403,13 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i void *data; int32_t datalen,retval = -1; uint32_t expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) { - //printf("start wait\n"); + printf("start wait\n"); if ( (datalen= nn_recv(pairsock,&data,NN_MSG,0)) >= 0 ) { - //printf("wait for got.%d\n",datalen); + printf("wait for got.%d\n",datalen); retval = (*verify)(swap,data,datalen); nn_freemsg(data); + printf("retval.%d\n",retval); return(retval); } else printf("error nn_recv\n"); } From 5c253c727eb69c450273762e8cc4a9031baffa2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:46:07 +0300 Subject: [PATCH 478/910] Test --- iguana/exchanges/LP_ordermatch.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 71edf0d29..c19cb9086 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -339,12 +339,17 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) { - int32_t i; + int32_t i,timeout; for (i=0; i<10; i++) { nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 50000)); if ( nn_bind(pair,pairstr) >= 0 ) + { + timeout = 100; + nn_setsockopt(pair,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pair,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); return(0); + } } return(-1); } @@ -399,7 +404,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs char *LP_connectedalice(cJSON *argjson) // alice { - cJSON *retjson; double bid,ask,price,qprice; int32_t pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *autxo,*butxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; + cJSON *retjson; double bid,ask,price,qprice; int32_t timeout,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *autxo,*butxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; if ( LP_quoteparse(&Q,argjson) < 0 ) clonestr("{\"error\":\"cant parse quote\"}"); if ( bits256_cmp(Q.desthash,LP_mypubkey) != 0 ) @@ -431,6 +436,9 @@ char *LP_connectedalice(cJSON *argjson) // alice jaddstr(retjson,"error","couldnt create pairsock"); else if ( nn_connect(pairsock,pairstr) >= 0 ) { + timeout = 100; + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); swap->N.pair = pairsock; From 899c0ad3dad6a7db9e61e12ebed31fa7acc9a8a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:51:08 +0300 Subject: [PATCH 479/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_swap.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 26520dd47..b02350f2b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -227,6 +227,7 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo); int32_t LP_isavailable(struct LP_utxoinfo *utxo); struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); +void LP_availableset(struct LP_utxoinfo *utxo); #endif diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index cf717ea35..cf8b9f847 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -141,7 +141,10 @@ void basilisk_swap_finished(struct basilisk_swap *swap) if ( swap->N.pair >= 0 ) nn_close(swap->N.pair); if ( swap->utxo != 0 ) - swap->utxo->S.swap = 0; + { + printf("make available\n"); + LP_availableset(swap->utxo); + } } uint32_t basilisk_quoteid(struct basilisk_request *rp) From cef7fa69946aa551ccbf20a5981e04191055fa24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:52:53 +0300 Subject: [PATCH 480/910] Test --- iguana/exchanges/LP_swap.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index cf8b9f847..b488edefe 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -657,14 +657,14 @@ void LP_bobloop(void *_swap) fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); - expiration = (uint32_t)time(NULL) + 10; + expiration = (uint32_t)time(NULL) + 3; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",10,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); - else if ( LP_waitsend("choosei",10,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_waitsend("choosei",3,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); - else if ( LP_waitsend("mostprivs",10,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_waitsend("mostprivs",3,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error waitsend mostprivs\n"); else if ( basilisk_bobscripts_set(swap,1,1) < 0 ) printf("error bobscripts deposit\n"); @@ -675,11 +675,11 @@ void LP_bobloop(void *_swap) basilisk_bobdeposit_refund(swap,swap->I.putduration); //printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); - if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_otherfee) < 0 ) + if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_otherfee) < 0 ) printf("error waiting for alicefee\n"); else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0) == 0 ) printf("error sending bobdeposit\n"); - else if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_alicepayment) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_alicepayment) < 0 ) printf("error waiting for alicepayment\n"); else { @@ -708,15 +708,15 @@ void LP_aliceloop(void *_swap) uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = _swap; maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); - expiration = (uint32_t)time(NULL) + 10; + expiration = (uint32_t)time(NULL) + 3; if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - if ( LP_sendwait("pubkeys",10,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); - else if ( LP_sendwait("choosei",10,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_sendwait("choosei",3,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); - else if ( LP_sendwait("mostprivs",10,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_sendwait("mostprivs",3,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error LP_sendwait mostprivs\n"); else if ( basilisk_alicetxs(swap->N.pair,swap,data,maxlen) != 0 ) printf("basilisk_alicetxs error\n"); @@ -725,7 +725,7 @@ void LP_aliceloop(void *_swap) LP_swapsfp_update(&swap->I.req); if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x80,data,maxlen,&swap->myfee,0x40,0) == 0 ) printf("error sending alicefee\n"); - else if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_bobdeposit) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_bobdeposit) < 0 ) printf("error waiting for bobdeposit\n"); else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0) == 0 ) printf("error sending alicepayment\n"); From 8094a93566641835f19705984b31d68ac117a09c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:55:28 +0300 Subject: [PATCH 481/910] 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 4faf2e2a5..61e3ccb9a 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -50,7 +50,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) } usleep(1000); } - printf("error LP_send, pipeline timeout\n"); + printf("error LP_send, pipeline timeout.(%s)\n",msg); //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) From fdfef78938aa4fd68aa265f2186d664eb7ca5203 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 14:56:33 +0300 Subject: [PATCH 482/910] 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 61e3ccb9a..d75c68258 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); - //else printf("SENT.(%s)\n",msg); + else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); return(sentbytes); From 14d1a1ddacd1688b05c6b1e001ba8f0fc2c569eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:07:29 +0300 Subject: [PATCH 483/910] Test --- iguana/exchanges/LP_forwarding.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 0fcd9876f..f5186648d 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -48,6 +48,21 @@ char *LP_lookup(bits256 pubkey) else return(clonestr("{\"error\":\"notfound\"}")); } +int32_t LP_pushsock_create(char *pushaddr) +{ + int32_t pushsock,timeout; + if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) + return(-1); + else if ( nn_connect(pushsock,pushaddr) < 0 ) + { + nn_close(pushsock); + return(-1); + } + timeout = 100; + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + return(pushsock); +} + char *LP_register(bits256 pubkey,char *ipaddr) { struct LP_forwardinfo *ptr=0; int32_t pushsock; char pushaddr[64]; @@ -60,15 +75,17 @@ char *LP_register(bits256 pubkey,char *ipaddr) if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { ptr->lasttime = (uint32_t)time(NULL); + if ( ptr->pushsock >= 0 ) + { + nn_close(ptr->pushsock); + printf("recreate pushsock for %s\n",pushaddr); + if ( (ptr->pushsock= LP_pushsock_create(pushaddr)) < 0 ) + return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); + } return(clonestr("{\"error\":\"already registered\",\"registered\":1}")); } - else if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) - return(clonestr("{\"error\":\"out of sockets\"}")); - else if ( nn_connect(pushsock,pushaddr) < 0 ) - { - nn_close(pushsock); - return(clonestr("{\"error\":\"cant connect\"}")); - } + else if ( (pushsock= LP_pushsock_create(pushaddr)) < 0 ) + return(clonestr("{\"error\":\"couldnt create pushsock\"}")); else { char str[65]; printf("registered (%s) -> (%s)\n",bits256_str(str,pubkey),pushaddr); From 864663fb207c09e583b343c1331c734d64dd04d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:19:26 +0300 Subject: [PATCH 484/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f8426ead9..e21e43590 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -149,7 +149,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof nonz++; if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { - //printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); + printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); portable_mutex_lock(&LP_commandmutex); if ( (retstr= LP_command_process(myipaddr,-1,argjson,0,0,profitmargin)) != 0 ) { @@ -316,6 +316,8 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in free(retstr); while ( 1 ) { + if ( (rand() % 100) == 0 ) + printf("mainloop\n"); if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); } From ba3f984079ae92df6d89747fb17029f6a5441cbf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:30:38 +0300 Subject: [PATCH 485/910] Test --- iguana/exchanges/LP_nativeDEX.c | 91 ++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e21e43590..60ccb8830 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -95,59 +95,66 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * return(retstr); } -int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) +void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen) { - int32_t recvsize,len,datalen=0,nonz = 0; void *ptr; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; - while ( (recvsize= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + int32_t len,datalen=0,nonz = 0; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; + if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) { - nonz++; - if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) - { - datalen >>= 1; - jsonstr = malloc(datalen + 1); - decode_hex((void *)jsonstr,datalen,(char *)ptr); - jsonstr[datalen] = 0; - } else jsonstr = (char *)ptr; - printf("PULLED %d, datalen.%d (%s)\n",recvsize,datalen,jsonstr); - if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) + datalen >>= 1; + jsonstr = malloc(datalen + 1); + decode_hex((void *)jsonstr,datalen,(char *)ptr); + jsonstr[datalen] = 0; + } else jsonstr = (char *)ptr; + printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); + if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) + { + len = (int32_t)strlen(jsonstr) + 1; + portable_mutex_lock(&LP_commandmutex); + if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { - len = (int32_t)strlen(jsonstr) + 1; - portable_mutex_lock(&LP_commandmutex); - if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) - { - //printf("got forwardhex\n"); - if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) - free(retstr); - } - else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) - { - printf("got publish\n"); - if ( jobj(argjson,"method2") != 0 ) - jdelete(argjson,"method2"); - jaddstr(argjson,"method2","broadcast"); - if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) - LP_send(pubsock,jprint(reqjson,1),1); - } - else if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvsize - len,profitmargin)) != 0 ) + //printf("got forwardhex\n"); + if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) free(retstr); - portable_mutex_unlock(&LP_commandmutex); - free_json(argjson); - } else printf("error parsing(%s)\n",jsonstr); - if ( (void *)jsonstr != ptr ) - free(jsonstr); - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + } + else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) + { + printf("got publish\n"); + if ( jobj(argjson,"method2") != 0 ) + jdelete(argjson,"method2"); + jaddstr(argjson,"method2","broadcast"); + if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) + LP_send(pubsock,jprint(reqjson,1),1); + } + else if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len,profitmargin)) != 0 ) + free(retstr); + portable_mutex_unlock(&LP_commandmutex); + free_json(argjson); + } else printf("error parsing(%s)\n",jsonstr); + if ( (void *)jsonstr != ptr ) + free(jsonstr); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; +} + +int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) +{ + void *ptr; int32_t recvlen,nonz = 0; + while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + { + nonz++; + LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); } return(nonz); } int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { - int32_t recvsize,nonz = 0; char *retstr; void *ptr; cJSON *argjson; - while ( sock >= 0 && (recvsize= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) + int32_t recvlen,nonz = 0; void *ptr; + while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; - if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) + LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen); + /*if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); portable_mutex_lock(&LP_commandmutex); @@ -159,7 +166,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof free_json(argjson); } else printf("error parsing.(%s)\n",(char *)ptr); if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + nn_freemsg(ptr), ptr = 0;*/ } return(nonz); } From a6d32f1138b2213b60f62bc64a5dbef7128dc77d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:41:16 +0300 Subject: [PATCH 486/910] Test --- iguana/exchanges/LP_ordermatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c19cb9086..fec341f65 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -423,7 +423,7 @@ char *LP_connectedalice(cJSON *argjson) // alice return(clonestr("{\"error\":\"no price set\"}")); } price = 1. / ask; - //if ( qprice > price+SMALLVAL ) + //if ( qprice > price+0.00000001 ) { LP_availableset(autxo); return(clonestr("{\"error\":\"quote price too expensive\"}")); @@ -484,7 +484,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d printf("quote validate error %.0f\n",qprice); return(-4); } - if ( qprice < price-SMALLVAL ) + if ( qprice < price-0.00000001 ) { printf("(%.8f %.8f) quote price %.8f too low vs %.8f for %s/%s\n",bid,ask,qprice,price,Q.srccoin,Q.destcoin); return(-5); From 37c9e7fbfa4d4427a322ac1069af94e8230c1121 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:43:52 +0300 Subject: [PATCH 487/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f8ee69477..6642ee06c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -48,7 +48,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs { if ( flag == 0 || jobj(argjson,"result") != 0 ) printf("stats_JSON no method: (%s) (%s:%u)\n",jprint(argjson,0),ipaddr,argport); - return(clonestr("{\"error\":\"need method in request\"}")); + return(0); } if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index fec341f65..1d07debe2 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -471,7 +471,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d { //printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); retval = 1; - if ( LP_quoteparse(&Q,argjson) == 0 ) + if ( LP_quoteparse(&Q,argjson) == 0 && bits256_cmp(LP_mypubkey,Q.srchash) == 0 ) { if ( (price= LP_myprice(&bid,&ask,Q.srccoin,Q.destcoin)) <= SMALLVAL || ask <= SMALLVAL ) { From bfc179c4aa1a47975f65a5d638eeb7e6625bda94 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:49:30 +0300 Subject: [PATCH 488/910] Test --- iguana/exchanges/LP_commands.c | 35 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6642ee06c..6bd88ada0 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -170,27 +170,25 @@ forwardhex(pubkey,hex)\n\ return(LP_myprices()); } if ( LP_isdisabled(base,rel) != 0 ) - return(clonestr("{\"error\":\"at least one of coins disabled\"}")); - if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) - return(clonestr("{\"error\":\"coin is disabled\"}")); - if ( strcmp(method,"reserved") == 0 ) + retstr = clonestr("{\"error\":\"at least one of coins disabled\"}"); + else if ( LP_isdisabled(jstr(argjson,"coin"),0) != 0 ) + retstr = clonestr("{\"error\":\"coin is disabled\"}"); + else if ( strcmp(method,"reserved") == 0 ) retstr = LP_quotereceived(argjson); else if ( strcmp(method,"connected") == 0 ) retstr = LP_connectedalice(argjson); else if ( strcmp(method,"checktxid") == 0 ) retstr = LP_spentcheck(argjson); else if ( strcmp(method,"getcoins") == 0 ) - retstr = jprint(LP_coinsjson(),1); + return(jprint(LP_coinsjson(),1)); else if ( strcmp(method,"postprice") == 0 ) retstr = LP_postedprice(argjson); else if ( strcmp(method,"broadcast") == 0 ) retstr = LP_broadcasted(argjson); - //else if ( strcmp(method,"getprice") == 0 ) - // retstr = LP_pricestr(base,rel,0.); else if ( strcmp(method,"getprices") == 0 ) - retstr = LP_prices(); + return(LP_prices()); else if ( strcmp(method,"orderbook") == 0 ) - retstr = LP_orderbook(base,rel); + return(LP_orderbook(base,rel)); else if ( strcmp(method,"forward") == 0 ) { cJSON *reqjson; @@ -204,14 +202,12 @@ forwardhex(pubkey,hex)\n\ } else if ( strcmp(method,"getpeers") == 0 ) - retstr = LP_peers(); + return(LP_peers()); else if ( strcmp(method,"getutxos") == 0 ) - retstr = LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn")); + return(LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn"))); else if ( strcmp(method,"notified") == 0 ) { - //printf("utxonotify.(%s)\n",jprint(argjson,0)); - //if ( juint(argjson,"timestamp") > time(NULL)-60 ) - LP_utxoaddjson(1,LP_mypubsock,argjson); + LP_utxoaddjson(1,LP_mypubsock,argjson); retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); } else if ( IAMLP != 0 ) @@ -219,16 +215,17 @@ forwardhex(pubkey,hex)\n\ if ( strcmp(method,"register") == 0 ) retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); else if ( strcmp(method,"lookup") == 0 ) - retstr = LP_lookup(jbits256(argjson,"client")); + return(LP_lookup(jbits256(argjson,"client"))); else if ( strcmp(method,"forwardhex") == 0 ) retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); } if ( retstr != 0 ) - return(retstr); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"error","unrecognized command"); + { + free(retstr); + return(0); + } printf("ERROR.(%s)\n",jprint(argjson,0)); - return(clonestr(jprint(retjson,1))); + return(0); } From a5bcbfdffef9ba48c62e0c835000ce07fbdc44ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 15:56:43 +0300 Subject: [PATCH 489/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_ordermatch.c | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index f5186648d..0b30713c8 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -88,7 +88,6 @@ char *LP_register(bits256 pubkey,char *ipaddr) return(clonestr("{\"error\":\"couldnt create pushsock\"}")); else { - char str[65]; printf("registered (%s) -> (%s)\n",bits256_str(str,pubkey),pushaddr); ptr = calloc(1,sizeof(*ptr)); ptr->pubkey = pubkey; strcpy(ptr->pushaddr,pushaddr); @@ -97,6 +96,7 @@ char *LP_register(bits256 pubkey,char *ipaddr) portable_mutex_lock(&LP_forwardmutex); HASH_ADD_KEYPTR(hh,LP_forwardinfos,&ptr->pubkey,sizeof(ptr->pubkey),ptr); portable_mutex_unlock(&LP_forwardmutex); + char str[65]; printf("registered (%s) -> (%s) pushsock.%d\n",bits256_str(str,pubkey),pushaddr,ptr->pushsock); return(LP_lookup(pubkey)); } } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 60ccb8830..95dd98e85 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -97,7 +97,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen) { - int32_t len,datalen=0,nonz = 0; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; + int32_t len,datalen=0; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) { datalen >>= 1; @@ -383,7 +383,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { pubsock = -1; nanomsg_tcpname(subaddr,myipaddr,mypubport); - printf(">>>>>>>>> myipaddr.%s (%s %s)\n",myipaddr,pushaddr,subaddr); if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { if ( nn_bind(pubsock,subaddr) >= 0 ) @@ -398,6 +397,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_close(pubsock), pubsock = -1; } } else printf("error getting sockets %d %d\n",pullsock,pubsock); + printf(">>>>>>>>> myipaddr.%s (%s %s) pubsock.%d pullsock.%d\n",myipaddr,pushaddr,subaddr,pubsock,pullsock); LP_mypubsock = pubsock; LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index d75c68258..99884bcb4 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -50,7 +50,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) } usleep(1000); } - printf("error LP_send, pipeline timeout.(%s)\n",msg); + printf("error LP_send sock.%d, pipeline timeout.(%s)\n",sock,msg); //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 1d07debe2..1ba842b14 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -348,6 +348,7 @@ int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) timeout = 100; nn_setsockopt(pair,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(pair,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + printf("nanobind %s to %d\n",pairstr,pair); return(0); } } @@ -444,7 +445,7 @@ char *LP_connectedalice(cJSON *argjson) // alice swap->N.pair = pairsock; autxo->S.swap = swap; swap->utxo = autxo; - printf("alice pairstr.(%s)\n",pairstr); + printf("alice pairstr.(%s) pairsock.%d\n",pairstr,pairsock); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_aliceloop,(void *)swap) == 0 ) { jaddstr(retjson,"result","success"); From 5db55485b5352732d23c42abc960c0e9db6bf4c8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:02:26 +0300 Subject: [PATCH 490/910] 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 1ba842b14..884bf34ca 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -563,7 +563,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba { destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee ) - destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee*2)); + destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee)); if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) { printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); From 76601ae7d13a7fd66d95a65ee0f68545b74af327 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:05:35 +0300 Subject: [PATCH 491/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6bd88ada0..1edcc4e4d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -208,7 +208,7 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"notified") == 0 ) { LP_utxoaddjson(1,LP_mypubsock,argjson); - retstr = clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}"); + return(clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}")); } else if ( IAMLP != 0 ) { diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 884bf34ca..84d277f4e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -563,7 +563,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba { destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee ) - destsatoshis *= ((double)autxo->payment.value / (destsatoshis - desttxfee)); + destsatoshis *= ((double)autxo->payment.value / (destsatoshis + desttxfee)); if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) { printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); From ef13f460b6857a98f1126fcd1c325efe335a09b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:12:36 +0300 Subject: [PATCH 492/910] Test --- iguana/exchanges/LP_ordermatch.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 84d277f4e..0b475f1bb 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -529,7 +529,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { - int64_t destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) @@ -562,9 +562,10 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { destsatoshis = (butxo->S.satoshis * price); - if ( destsatoshis > autxo->payment.value-desttxfee ) - destsatoshis *= ((double)autxo->payment.value / (destsatoshis + desttxfee)); - if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && destsatoshis/price-txfee > (butxo->S.satoshis >> 1) ) + if ( destsatoshis > autxo->payment.value-2*desttxfee ) + destsatoshis *= ((double)autxo->payment.value / (destsatoshis + 2*desttxfee)); + satoshis = destsatoshis / price; + if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) { printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; From a7726b08eb742fdec36ccdb4f78346700ad63314 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:19:55 +0300 Subject: [PATCH 493/910] Test --- iguana/exchanges/LP_ordermatch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0b475f1bb..64b477a95 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -263,7 +263,7 @@ double LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop } if ( destvalue < qp->desttxfee+qp->destsatoshis || srcvalue < qp->txfee+qp->satoshis ) { - printf("destsatoshis %.8f or satoshis %.8f is too small txfees %.8f %.8f?\n",dstr(qp->destsatoshis),dstr(qp->satoshis),dstr(qp->desttxfee),dstr(qp->txfee)); + printf("destvalue %.8f srcvalue %.8f, destsatoshis %.8f or satoshis %.8f is too small txfees %.8f %.8f?\n",dstr(destvalue),dstr(srcvalue),dstr(qp->destsatoshis),dstr(qp->satoshis),dstr(qp->desttxfee),dstr(qp->txfee)); return(-11); } qprice = ((double)qp->destsatoshis / qp->satoshis); @@ -562,8 +562,8 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { destsatoshis = (butxo->S.satoshis * price); - if ( destsatoshis > autxo->payment.value-2*desttxfee ) - destsatoshis *= ((double)autxo->payment.value / (destsatoshis + 2*desttxfee)); + if ( destsatoshis > autxo->payment.value-desttxfee-1 ) + destsatoshis = autxo->payment.value-desttxfee-1; satoshis = destsatoshis / price; if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) { From 1de8e0dc389c59fc99f753d9db47375c171c1084 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:20:50 +0300 Subject: [PATCH 494/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 1edcc4e4d..05088c558 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -213,7 +213,7 @@ forwardhex(pubkey,hex)\n\ else if ( IAMLP != 0 ) { if ( strcmp(method,"register") == 0 ) - retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); + return(LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr"))); else if ( strcmp(method,"lookup") == 0 ) return(LP_lookup(jbits256(argjson,"client"))); else if ( strcmp(method,"forwardhex") == 0 ) From 4dcfe358b75e8ccc05a7b00e0c61343c26f9e81a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:28:29 +0300 Subject: [PATCH 495/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_ordermatch.c | 16 +++++++++------- iguana/exchanges/LP_transaction.c | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b02350f2b..9ddca6a0b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,6 +24,7 @@ #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 #define LP_AUTOTRADE_TIMEOUT 3 +#define LP_MIN_TXFEE 10000 #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 64b477a95..1263dc763 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -125,8 +125,8 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * if ( qp->timestamp == 0 ) qp->timestamp = (uint32_t)time(NULL); safecopy(qp->destcoin,destcoin,sizeof(qp->destcoin)); - if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < 10000 ) - qp->txfee = 10000; + if ( (qp->txfee= LP_getestimatedrate(utxo->coin)*LP_AVETXSIZE) < LP_MIN_TXFEE ) + qp->txfee = LP_MIN_TXFEE; qp->satoshis = destsatoshis / price + 0.49; if ( utxo->iambob == 0 || qp->txfee >= qp->satoshis || qp->txfee >= utxo->deposit.value || utxo->deposit.value < LP_DEPOSITSATOSHIS(qp->satoshis) ) { @@ -138,8 +138,8 @@ int32_t LP_quoteinfoinit(struct LP_quoteinfo *qp,struct LP_utxoinfo *utxo,char * qp->txid2 = utxo->deposit.txid; qp->vout2 = utxo->deposit.vout; qp->destsatoshis = destsatoshis; - if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < 10000 ) - qp->desttxfee = 10000; + if ( (qp->desttxfee= LP_getestimatedrate(qp->destcoin) * LP_AVETXSIZE) < LP_MIN_TXFEE ) + qp->desttxfee = LP_MIN_TXFEE; if ( qp->desttxfee >= qp->destsatoshis ) { printf("quoteinit desttxfee %.8f < %.8f destsatoshis\n",dstr(qp->desttxfee),dstr(qp->destsatoshis)); @@ -535,8 +535,10 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) return(clonestr("{\"error\":\"cant find utxo that is big enough\"}")); bestmetric = ordermatchprice = 0.; - desttxfee = LP_getestimatedrate(rel) * LP_AVETXSIZE; - txfee = LP_getestimatedrate(base) * LP_AVETXSIZE; + if ( (desttxfee= LP_getestimatedrate(rel) * LP_AVETXSIZE) < LP_MINTXFEE ) + desttxfee = LP_MIN_TXFEE; + if ( (txfee= LP_getestimatedrate(base) * LP_AVETXSIZE) < LP_MINTXFEE ) + txfee = LP_MIN_TXFEE; if ( timeout == 0 ) timeout = LP_AUTOTRADE_TIMEOUT; if ( (obookstr= LP_orderbook(base,rel)) != 0 ) @@ -567,7 +569,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba satoshis = destsatoshis / price; if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) { - printf("price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); + printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; if ( bestmetric == 0. || metric < bestmetric ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index c37c100a9..1af4c0395 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -881,8 +881,8 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub if ( coin->estimatedrate == 0. ) coin->estimatedrate = LP_getestimatedrate(coin->symbol); newtxfee = coin->estimatedrate * len; - if ( newtxfee < 10000 ) - newtxfee = 10000; + if ( newtxfee < LP_MIN_TXFEE ) + newtxfee = LP_MIN_TXFEE; printf("txfee %.8f -> newtxfee %.8f\n",dstr(txfee),dstr(newtxfee)); } else break; } From afc3650929dcea34bff6e9ba923b6d123d86a215 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:38:03 +0300 Subject: [PATCH 496/910] Test --- iguana/exchanges/LP_ordermatch.c | 8 ++++---- iguana/exchanges/LP_prices.c | 4 ++-- iguana/exchanges/LP_utxos.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 1263dc763..1d642d285 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -535,9 +535,9 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) return(clonestr("{\"error\":\"cant find utxo that is big enough\"}")); bestmetric = ordermatchprice = 0.; - if ( (desttxfee= LP_getestimatedrate(rel) * LP_AVETXSIZE) < LP_MINTXFEE ) + if ( (desttxfee= LP_getestimatedrate(rel) * LP_AVETXSIZE) < LP_MIN_TXFEE ) desttxfee = LP_MIN_TXFEE; - if ( (txfee= LP_getestimatedrate(base) * LP_AVETXSIZE) < LP_MINTXFEE ) + if ( (txfee= LP_getestimatedrate(base) * LP_AVETXSIZE) < LP_MIN_TXFEE ) txfee = LP_MIN_TXFEE; if ( timeout == 0 ) timeout = LP_AUTOTRADE_TIMEOUT; @@ -561,7 +561,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba vout = jint(item,"vout"); vol = jdouble(item,"volume"); metric = price / bestprice; - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->payment.value && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) @@ -580,7 +580,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba printf("set best!\n"); } } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->S.satoshis >> 1),dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); - } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->payment.value):0); + } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); } } else break; } diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 8028cb5df..c1284fad3 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -554,8 +554,8 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); if ( polarity > 0 ) - basesatoshis = utxo->payment.value; - else basesatoshis = utxo->payment.value * price; + basesatoshis = utxo->S.satoshis; + else basesatoshis = utxo->S.satoshis * price; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) (*arrayp)[num++] = op; if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9c0de17c9..bd0d53970 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -286,7 +286,7 @@ struct LP_utxoinfo *LP_utxo_bestfit(char *symbol,uint64_t destsatoshis) //char str[65]; printf("check %s.%s\n",utxo->coin,bits256_str(str,utxo->payment.txid)); if ( strcmp(symbol,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && LP_ismine(utxo) > 0 ) { - if ( utxo->payment.value >= destsatoshis && (bestutxo == 0 || utxo->payment.value < bestutxo->payment.value) ) + if ( utxo->S.satoshis >= destsatoshis && (bestutxo == 0 || utxo->S.satoshis < bestutxo->S.satoshis) ) bestutxo = utxo; } } From befa5bdaca9e9fb7492c49e490d115e6b435d11c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:46:14 +0300 Subject: [PATCH 497/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 95dd98e85..a189ca860 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -323,7 +323,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in free(retstr); while ( 1 ) { - if ( (rand() % 100) == 0 ) + if ( 0 && (rand() % 100) == 0 ) printf("mainloop\n"); if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 99884bcb4..344f4c204 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -35,7 +35,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) return(-1); } len = (int32_t)strlen(msg) + 1; - for (i=0; i<100; i++) + for (i=0; i<1000; i++) { pfd.fd = sock; pfd.events = NN_POLLOUT; From 006f428636cf34739ab8c8af5c18d8b975aab03f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 16:59:27 +0300 Subject: [PATCH 498/910] Test --- iguana/exchanges/LP_ordermatch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 1d642d285..54384fc60 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -557,6 +557,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba { if ( bestprice == 0. ) // assumes price ordered asks bestprice = price; + printf("item.[%d] %s\n",i,jprint(item,0)); txid = jbits256(item,"txid"); vout = jint(item,"vout"); vol = jdouble(item,"volume"); From 39b2c584fc1f318a0bc268e450e1650810e5a6a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:05:59 +0300 Subject: [PATCH 499/910] Test --- iguana/exchanges/LP_ordermatch.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 54384fc60..ff4ee3dd7 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -552,6 +552,9 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba item = jitem(asks,i); if ( (price= jdouble(item,"price")) > SMALLVAL && price <= maxprice ) { + price *= 1.0001; + if ( price > maxprice ) + price = maxprice; pubkey = jbits256(item,"pubkey"); if ( bits256_cmp(pubkey,LP_mypubkey) != 0 ) { From 3ec15809c85ed05fe068a6e73a6477ce1d3cab13 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:18:25 +0300 Subject: [PATCH 500/910] Test --- iguana/exchanges/LP_prices.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index c1284fad3..3d0e879c0 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -540,26 +540,30 @@ int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char *rel,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum) { - struct LP_utxoinfo *utxo,*tmp; struct LP_pubkeyinfo *pubp; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; double price; int32_t baseid,relid; uint64_t basesatoshis; + struct LP_utxoinfo *utxo,*tmp; struct LP_pubkeyinfo *pubp=0; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; double price; int32_t baseid,relid; uint64_t basesatoshis; if ( (basepp= LP_priceinfoptr(&relid,base,rel)) != 0 ) baseid = basepp->ind; else return(num); HASH_ITER(hh,LP_utxoinfos[1],utxo,tmp) { + if ( pubp == 0 || bits256_cmp(pubp->pubkey,utxo->pubkey) != 0 ) + pubp = LP_pubkeyfind(utxo->pubkey); //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); - if ( strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && (pubp= LP_pubkeyfind(utxo->pubkey)) != 0 && (price= pubp->matrix[baseid][relid]) > SMALLVAL ) + if ( strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && pubp != 0 && (price= pubp->matrix[baseid][relid]) > SMALLVAL ) { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); - *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); if ( polarity > 0 ) basesatoshis = utxo->S.satoshis; else basesatoshis = utxo->S.satoshis * price; if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) + { + *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); (*arrayp)[num++] = op; - if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) - LP_utxo_clientpublish(utxo); + if ( bits256_cmp(utxo->pubkey,LP_mypubkey) == 0 && utxo->T.lasttime == 0 ) + LP_utxo_clientpublish(utxo); + } } } } From b62a3869a90fd2328b59c816519fc79ec710fc28 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:23:09 +0300 Subject: [PATCH 501/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 3d0e879c0..02adf85d3 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -553,10 +553,10 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * { if ( LP_orderbookfind(*arrayp,cachednum,utxo->payment.txid,utxo->payment.vout) < 0 ) { - //char str[65]; printf("found utxo not in orderbook %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); if ( polarity > 0 ) basesatoshis = utxo->S.satoshis; else basesatoshis = utxo->S.satoshis * price; + char str[65]; printf("found utxo not in orderbook %s/v%d %.8f %.8f\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,dstr(basesatoshis),polarity > 0 ? price : 1./price); if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) { *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); From 8e04818a37b1b135c02e348eb8f51fd3bb278852 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:27:54 +0300 Subject: [PATCH 502/910] Test --- iguana/exchanges/LP_prices.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 02adf85d3..f9ed9828c 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -572,13 +572,14 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * char *LP_orderbook(char *base,char *rel) { - uint32_t now,i; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_cacheinfo *ptr,*tmp; struct LP_orderbookentry *op,**bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; + uint32_t now,i; struct LP_priceinfo *basepp=0,*relpp=0; struct LP_orderbookentry **bids = 0,**asks = 0; cJSON *retjson,*array; int32_t numbids=0,numasks=0,cachenumbids,cachenumasks,baseid,relid; if ( (basepp= LP_priceinfofind(base)) == 0 || (relpp= LP_priceinfofind(rel)) == 0 ) return(clonestr("{\"error\":\"base or rel not added\"}")); baseid = basepp->ind; relid = relpp->ind; now = (uint32_t)time(NULL); - HASH_ITER(hh,LP_cacheinfos,ptr,tmp) + /*struct LP_cacheinfo *ptr,*tmp; + HASH_ITER(hh,LP_cacheinfos,ptr,tmp) { if ( ptr->timestamp < now-3600*2 || ptr->price == 0. ) continue; @@ -594,7 +595,7 @@ char *LP_orderbook(char *base,char *rel) if ( (op= LP_orderbookentry(base,rel,ptr->Q.txid,ptr->Q.vout,ptr->Q.txid2,ptr->Q.vout2,1./ptr->price,ptr->Q.satoshis,ptr->Q.srchash)) != 0 ) bids[numbids++] = op; } - } + }*/ cachenumbids = numbids, cachenumasks = numasks; //printf("start cache.(%d %d) numbids.%d numasks.%d\n",cachenumbids,cachenumasks,numbids,numasks); numasks = LP_orderbook_utxoentries(now,1,base,rel,&asks,numasks,cachenumasks); From e75f8eb260c2ff6c7ea23f1ccf86acb742cd034b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:30:55 +0300 Subject: [PATCH 503/910] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_prices.c | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index ff4ee3dd7..fed378733 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -170,7 +170,7 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; - printf("\n>>>>>>>>>> received.(%s) quote %.8f\n\n",jprint(argjson,0),price); + printf("\n>>>>>>>>>> received quote %.8f\n\n",price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index f9ed9828c..361553dbb 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -453,9 +453,9 @@ static int _cmp_orderbook(const void *a,const void *b) #define ptr_a (*(struct LP_orderbookentry **)a)->price #define ptr_b (*(struct LP_orderbookentry **)b)->price if ( ptr_b > ptr_a ) - retval = 1; - else if ( ptr_b < ptr_a ) retval = -1; + else if ( ptr_b < ptr_a ) + retval = 1; else { #undef ptr_a @@ -463,9 +463,9 @@ static int _cmp_orderbook(const void *a,const void *b) #define ptr_a ((struct LP_orderbookentry *)a)->basesatoshis #define ptr_b ((struct LP_orderbookentry *)b)->basesatoshis if ( ptr_b > ptr_a ) - return(1); - else if ( ptr_b < ptr_a ) return(-1); + else if ( ptr_b < ptr_a ) + return(1); } // printf("%.8f vs %.8f -> %d\n",ptr_a,ptr_b,retval); return(retval); @@ -473,11 +473,6 @@ static int _cmp_orderbook(const void *a,const void *b) #undef ptr_b } -static int _cmp_orderbookrev(const void *a,const void *b) -{ - return(-_cmp_orderbook(a,b)); -} - cJSON *LP_orderbookjson(struct LP_orderbookentry *op) { cJSON *item = cJSON_CreateObject(); @@ -603,13 +598,13 @@ char *LP_orderbook(char *base,char *rel) retjson = cJSON_CreateObject(); array = cJSON_CreateArray(); if ( numbids > 1 ) - qsort(bids,numbids,sizeof(*bids),_cmp_orderbookrev); + qsort(bids,numbids,sizeof(*bids),_cmp_orderbook); if ( numasks > 1 ) { for (i=0; iprice); printf(" -> "); - qsort(asks,numasks,sizeof(*asks),_cmp_orderbookrev); + qsort(asks,numasks,sizeof(*asks),_cmp_orderbook); for (i=0; iprice); printf("sorted asks.%d\n",numasks); From a0986c7353179b883fbe249ed1d3f1d0a8b896a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:32:32 +0300 Subject: [PATCH 504/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_prices.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a189ca860..9b7c42610 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -105,7 +105,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); + //printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { len = (int32_t)strlen(jsonstr) + 1; diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 361553dbb..8d55d3e02 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -551,7 +551,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * if ( polarity > 0 ) basesatoshis = utxo->S.satoshis; else basesatoshis = utxo->S.satoshis * price; - char str[65]; printf("found utxo not in orderbook %s/v%d %.8f %.8f\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,dstr(basesatoshis),polarity > 0 ? price : 1./price); + //char str[65]; printf("found utxo not in orderbook %s/v%d %.8f %.8f\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,dstr(basesatoshis),polarity > 0 ? price : 1./price); if ( (op= LP_orderbookentry(base,rel,utxo->payment.txid,utxo->payment.vout,utxo->deposit.txid,utxo->deposit.vout,polarity > 0 ? price : 1./price,basesatoshis,utxo->pubkey)) != 0 ) { *arrayp = realloc(*arrayp,sizeof(*(*arrayp)) * (num+1)); From 61703097afb3702a036db537a246aca99e295ba7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:38:14 +0300 Subject: [PATCH 505/910] Test --- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_utxos.c | 29 +++++++++++++++++++---------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 344f4c204..7fd4414b4 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); - else printf("SENT.(%s)\n",msg); + //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); return(sentbytes); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index fed378733..d65519218 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -560,7 +560,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba { if ( bestprice == 0. ) // assumes price ordered asks bestprice = price; - printf("item.[%d] %s\n",i,jprint(item,0)); + //printf("item.[%d] %s\n",i,jprint(item,0)); txid = jbits256(item,"txid"); vout = jint(item,"vout"); vol = jdouble(item,"volume"); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bd0d53970..f1aa59266 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -114,19 +114,25 @@ int32_t LP_utxocollisions(struct LP_utxoinfo *ptrs[],struct LP_utxoinfo *refutxo n = LP_utxoaddptrs(ptrs,n,utxo); } portable_mutex_unlock(&LP_utxomutex); - if ( n > 0 ) + if ( 0 && n > 0 ) printf("LP_utxocollisions n.%d\n",n); return(n); } -void _LP_availableset(struct LP_utxoinfo *utxo) +int32_t _LP_availableset(struct LP_utxoinfo *utxo) { + int32_t flag = 0; if ( utxo != 0 ) { - memset(&utxo->S.otherpubkey,0,sizeof(utxo->S.otherpubkey)); - utxo->S.swap = 0; - utxo->T.swappending = 0; + if ( bits256_nonz(utxo->S.otherpubkey) != 0 ) + flag = 1, memset(&utxo->S.otherpubkey,0,sizeof(utxo->S.otherpubkey)); + if ( utxo->S.swap != 0 ) + flag = 1, utxo->S.swap = 0; + if ( utxo->T.swappending != 0 ) + flag = 1, utxo->T.swappending = 0; + return(flag); } + return(0); } void _LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) @@ -154,16 +160,19 @@ void LP_unavailableset(struct LP_utxoinfo *utxo,bits256 otherpubkey) void LP_availableset(struct LP_utxoinfo *utxo) { - struct LP_utxoinfo *ptrs[8]; int32_t i,n; struct _LP_utxoinfo u; + struct LP_utxoinfo *ptrs[8]; int32_t i,n,count = 0; struct _LP_utxoinfo u; memset(ptrs,0,sizeof(ptrs)); if ( (n= LP_utxocollisions(ptrs,utxo)) > 0 ) { for (i=0; i 0 ) + { + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + char str[65],str2[65]; printf("UTXO.[%d] AVAIL %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); } - u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; - char str[65],str2[65]; printf("UTXO.[%d] AVAIL %s/v%d %s/v%d collisions.%d\n",utxo->iambob,bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,u.txid),u.vout,n); - _LP_availableset(utxo); } int32_t LP_utxopurge(int32_t allutxos) From 396df9bb81b2d81039f352d3c9d28b793d30ceef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:41:37 +0300 Subject: [PATCH 506/910] Test --- iguana/exchanges/LP_ordermatch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index d65519218..a3f65d7cb 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -36,6 +36,7 @@ struct basilisk_request *LP_requestinit(struct basilisk_request *rp,bits256 srch rp->desthash = desthash; rp->destamount = destsatoshis; rp->quoteid = basilisk_quoteid(rp); + printf("r.%u %u, q.%u %u: %s %.8f -> %s %.8f\n",rp->timestamp,rp->requestid,rp->quotetime,rp->quoteid,rp->src,dstr(rp->srcamount),rp->dest,dstr(rp->destamount)); return(rp); } @@ -424,8 +425,9 @@ char *LP_connectedalice(cJSON *argjson) // alice return(clonestr("{\"error\":\"no price set\"}")); } price = 1. / ask; - //if ( qprice > price+0.00000001 ) + if ( qprice > price+0.00000001 ) { + printf("qprice %.8f too big vs %.8f\n",qprice,price); LP_availableset(autxo); return(clonestr("{\"error\":\"quote price too expensive\"}")); } From e8d4b07426f00f2cfff1d2f1d5a04ff80e67efdf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:49:56 +0300 Subject: [PATCH 507/910] Test --- iguana/exchanges/LP_swap.c | 12 ++++++------ iguana/exchanges/LP_transaction.c | 3 +-- iguana/exchanges/LP_utxos.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b488edefe..201ed38f0 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -406,13 +406,13 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i void *data; int32_t datalen,retval = -1; uint32_t expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) { - printf("start wait\n"); + //printf("start wait\n"); if ( (datalen= nn_recv(pairsock,&data,NN_MSG,0)) >= 0 ) { - printf("wait for got.%d\n",datalen); + //printf("wait for got.%d\n",datalen); retval = (*verify)(swap,data,datalen); nn_freemsg(data); - printf("retval.%d\n",retval); + //printf("retval.%d\n",retval); return(retval); } else printf("error nn_recv\n"); } @@ -423,15 +423,15 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; - printf("waitsend.%s\n",statename); + //printf("waitsend.%s\n",statename); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { - printf("waited for %s\n",statename); + //printf("waited for %s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { - printf("sent.%d after waitfor.%s\n",sendlen,statename); + //printf("sent.%d after waitfor.%s\n",sendlen,statename); retval = 0; } else printf("send %s error\n",statename); } else printf("%s datagen no data\n",statename); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 1af4c0395..2ba86473c 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1501,8 +1501,7 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d { bitcoin_address(swap->alicepayment.I.destaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); - if ( strcmp(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr) != 0 ) - printf("alice addr mismatch %s vs %s\n",swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); + strcpy(swap->alicepayment.p2shaddr,swap->alicepayment.I.destaddr); retval = 0; for (i=0; ialicepayment.I.datalen; i++) printf("%02x",swap->alicepayment.txbytes[i]); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f1aa59266..ffb383b21 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -448,7 +448,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - char str[65],str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + //char str[65],str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) From 518b3c5f2e62b6dea62bb46e98cbd05d3b943e57 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 17:56:17 +0300 Subject: [PATCH 508/910] Test --- iguana/exchanges/LP_ordermatch.c | 2 ++ iguana/exchanges/LP_swap.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index a3f65d7cb..a23528166 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -456,6 +456,7 @@ char *LP_connectedalice(cJSON *argjson) // alice jaddnum(retjson,"quoteid",Q.R.quoteid); } else jaddstr(retjson,"error","couldnt aliceloop"); } + printf("connected result.(%s)\n",jprint(retjson,0)); if ( jobj(retjson,"error") != 0 ) LP_availableset(autxo); return(jprint(retjson,1)); @@ -463,6 +464,7 @@ char *LP_connectedalice(cJSON *argjson) // alice else { LP_availableset(autxo); + printf("no privkey found\n"); return(clonestr("{\"error\",\"no privkey\"}")); } } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 201ed38f0..688ec46d7 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -414,7 +414,7 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i nn_freemsg(data); //printf("retval.%d\n",retval); return(retval); - } else printf("error nn_recv\n"); + } // else printf("error nn_recv\n"); } printf("waitfor timedout\n"); return(retval); From 5612e89df69608a9ec5f0cf0b322315d65cdd078 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 18:03:19 +0300 Subject: [PATCH 509/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_swap.c | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 9ddca6a0b..8a2636dd3 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -23,6 +23,7 @@ #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 +#define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 #define LP_MIN_TXFEE 10000 diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 688ec46d7..ef8cc573f 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -603,7 +603,7 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 if ( suppress_swapsend == 0 ) { retval = LP_swapsend(pairsock,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs); - if ( LP_waitmempool(rawtx->coin->symbol,rawtx->I.signedtxid,10) < 0 ) + if ( LP_waitmempool(rawtx->coin->symbol,rawtx->I.signedtxid,LP_SWAPSTEP_TIMEOUT) < 0 ) { char str[65]; printf("failed to find %s %s in the mempool?\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid)); retval = -1; @@ -657,14 +657,14 @@ void LP_bobloop(void *_swap) fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); - expiration = (uint32_t)time(NULL) + 3; + expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); - else if ( LP_waitsend("choosei",3,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); - else if ( LP_waitsend("mostprivs",3,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_waitsend("mostprivs",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error waitsend mostprivs\n"); else if ( basilisk_bobscripts_set(swap,1,1) < 0 ) printf("error bobscripts deposit\n"); @@ -675,11 +675,11 @@ void LP_bobloop(void *_swap) basilisk_bobdeposit_refund(swap,swap->I.putduration); //printf("depositlen.%d\n",swap->bobdeposit.I.datalen); LP_swapsfp_update(&swap->I.req); - if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_otherfee) < 0 ) + if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_otherfee) < 0 ) printf("error waiting for alicefee\n"); else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0) == 0 ) printf("error sending bobdeposit\n"); - else if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_alicepayment) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_alicepayment) < 0 ) printf("error waiting for alicepayment\n"); else { @@ -695,7 +695,7 @@ void LP_bobloop(void *_swap) printf("error bobscripts payment\n"); else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) printf("error sending bobpayment\n"); - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); } } basilisk_swap_finished(swap); @@ -708,15 +708,15 @@ void LP_aliceloop(void *_swap) uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = _swap; maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); - expiration = (uint32_t)time(NULL) + 3; + expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - if ( LP_sendwait("pubkeys",3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); - else if ( LP_sendwait("choosei",3,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) + else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); - else if ( LP_sendwait("mostprivs",3,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) + else if ( LP_sendwait("mostprivs",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_mostprivs_verify,LP_mostprivs_data) < 0 ) printf("error LP_sendwait mostprivs\n"); else if ( basilisk_alicetxs(swap->N.pair,swap,data,maxlen) != 0 ) printf("basilisk_alicetxs error\n"); @@ -725,7 +725,7 @@ void LP_aliceloop(void *_swap) LP_swapsfp_update(&swap->I.req); if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x80,data,maxlen,&swap->myfee,0x40,0) == 0 ) printf("error sending alicefee\n"); - else if ( LP_waitfor(swap->N.pair,swap,3,LP_verify_bobdeposit) < 0 ) + else if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobdeposit) < 0 ) printf("error waiting for bobdeposit\n"); else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0) == 0 ) printf("error sending alicepayment\n"); @@ -736,23 +736,23 @@ void LP_aliceloop(void *_swap) printf("waiting for alicepayment to confirm\n"); sleep(3); } - if ( LP_waitfor(swap->N.pair,swap,10,LP_verify_bobpayment) < 0 ) + if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); else { while ( LP_numconfirms(swap,&swap->bobpayment) < 1 ) { printf("waiting for bobpayment to confirm\n"); - sleep(3); + sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); while ( LP_numconfirms(swap,&swap->alicespend) < 1 ) { printf("waiting for alicespend to confirm\n"); - sleep(3); + sleep(LP_SWAPSTEP_TIMEOUT); } - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,600); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); } } } From 3c98281e3277be214dfb8b65dd1f0e05435a9a4a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 18:30:00 +0300 Subject: [PATCH 510/910] Test --- iguana/exchanges/LP_commands.c | 3 +++ iguana/exchanges/LP_include.h | 6 ++--- iguana/exchanges/LP_nativeDEX.c | 5 ----- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_prices.c | 23 ++++++++++++++++++- iguana/exchanges/LP_swap.c | 37 ++++++++++++++++--------------- iguana/exchanges/LP_transaction.c | 7 +++--- 7 files changed, 52 insertions(+), 31 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 05088c558..bcbd2541b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -68,6 +68,7 @@ getutxos()\n\ getutxos(coin, lastn)\n\ orderbook(base, rel)\n\ getprices(base, rel)\n\ +trust(pubkey, trust)\n\ register(pubkey,pushaddr)\n\ lookup(pubkey)\n\ forward(pubkey,method2,)\n\ @@ -168,6 +169,8 @@ forwardhex(pubkey,hex)\n\ } else if ( strcmp(method,"myprices") == 0 ) return(LP_myprices()); + else if ( strcmp(method,"trust") == 0 ) + return(LP_pubkey_trustset(jbits256(argjson,"pubkey"),jint(argjson,"trust"))); } if ( LP_isdisabled(base,rel) != 0 ) retstr = clonestr("{\"error\":\"at least one of coins disabled\"}"); diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 8a2636dd3..34a4bd009 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -40,14 +40,14 @@ #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" -#define BASILISK_DISABLEWAITTX -#define BASILISK_DISABLESENDTX +//#define BASILISK_DISABLEWAITTX +//#define BASILISK_DISABLESENDTX #define LP_PROPAGATION_SLACK 100 // txid ordering is not enforced, so getting extra recent txid #define LP_RESERVETIME 60 #define LP_AVETXSIZE 200 #define LP_CACHEDURATION 60 -#define BASILISK_DEFAULT_NUMCONFIRMS 5 +#define BASILISK_DEFAULT_NUMCONFIRMS 2 #define DEX_SLEEP 3 #define BASILISK_KEYSIZE ((int32_t)(2*sizeof(bits256)+sizeof(uint32_t)*2)) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9b7c42610..4678cbce7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -38,11 +38,6 @@ double LP_profitratio = 1.; bits256 LP_mypubkey; // stubs -int32_t basilisk_istrustedbob(struct basilisk_swap *swap) -{ - // for BTC and if trusted LP - return(0); -} void tradebot_swap_balancingtrade(struct basilisk_swap *swap,int32_t iambob) { diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7fd4414b4..58783ad03 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -77,7 +77,7 @@ uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbit { } } - printf("sent %d bytes\n",sentbytes); + //printf("sent %d bytes\n",sentbytes); //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(nextbits); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 8d55d3e02..3bbdfe01c 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -46,7 +46,7 @@ struct LP_pubkeyinfo UT_hash_handle hh; bits256 pubkey; double matrix[LP_MAXPRICEINFOS][LP_MAXPRICEINFOS]; - uint32_t timestamp; + uint32_t timestamp,istrusted; } *LP_pubkeyinfos; struct LP_priceinfo *LP_priceinfofind(char *symbol) @@ -134,6 +134,25 @@ struct LP_pubkeyinfo *LP_pubkeyadd(bits256 pubkey) return(pubp); } +int32_t LP_pubkey_istrusted(bits256 pubkey) +{ + struct LP_pubkeyinfo *pubp; + if ( (pubp= LP_pubkeyfind(pubkey)) != 0 ) + return(pubp->istrusted != 0); + return(0); +} + +char *LP_pubkey_trustedset(bits256 pubkey,uint32_t trustval) +{ + struct LP_pubkeyinfo *pubp; + if ( (pubp= LP_pubkeyfind(pubkey)) != 0 ) + { + pubp->istrusted = trustval; + return(clonestr("{\"result\":\"success\"}")); + } + return(clonestr("{\"error\":\"pubkey not found\"}")); +} + cJSON *LP_pubkeyjson(struct LP_pubkeyinfo *pubp) { int32_t baseid,relid; char *base; double price; cJSON *item,*array,*obj; @@ -157,6 +176,8 @@ cJSON *LP_pubkeyjson(struct LP_pubkeyinfo *pubp) jaddbits256(obj,"pubkey",pubp->pubkey); jaddnum(obj,"timestamp",pubp->timestamp); jadd(obj,"asks",array); + if ( pubp->istrusted != 0 ) + jaddnum(obj,"istrusted",pubp->istrusted); return(obj); } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index ef8cc573f..f310e0fa2 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -139,12 +139,9 @@ void basilisk_swap_finished(struct basilisk_swap *swap) free(swap->messages), swap->messages = 0; swap->nummessages = 0; if ( swap->N.pair >= 0 ) - nn_close(swap->N.pair); + nn_close(swap->N.pair), swap->N.pair = -1; if ( swap->utxo != 0 ) - { - printf("make available\n"); LP_availableset(swap->utxo); - } } uint32_t basilisk_quoteid(struct basilisk_request *rp) @@ -686,7 +683,7 @@ void LP_bobloop(void *_swap) swap->bobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); - while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + while ( LP_numconfirms(swap,&swap->alicepayment) < swap->I.aliceconfirms ) { printf("waiting for alicepayment to confirm\n"); sleep(3); @@ -731,7 +728,7 @@ void LP_aliceloop(void *_swap) printf("error sending alicepayment\n"); else { - while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + while ( LP_numconfirms(swap,&swap->alicepayment) < swap->I.aliceconfirms ) { printf("waiting for alicepayment to confirm\n"); sleep(3); @@ -740,14 +737,14 @@ void LP_aliceloop(void *_swap) printf("error waiting for bobpayment\n"); else { - while ( LP_numconfirms(swap,&swap->bobpayment) < 1 ) + while ( LP_numconfirms(swap,&swap->bobpayment) < swap->I.bobconfirms ) { printf("waiting for bobpayment to confirm\n"); sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); - while ( LP_numconfirms(swap,&swap->alicespend) < 1 ) + while ( LP_numconfirms(swap,&swap->alicespend) < swap->I.aliceconfirms ) { printf("waiting for alicespend to confirm\n"); sleep(LP_SWAPSTEP_TIMEOUT); @@ -843,6 +840,9 @@ int32_t instantdex_pubkeyargs(struct basilisk_swap *swap,int32_t numpubs,bits256 void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag) { +#ifdef BASILISK_DISABLEWAITTX + numconfirms = 0; +#endif strcpy(rawtx->name,name); rawtx->coin = coin; strcpy(rawtx->I.coinstr,coin->symbol); @@ -874,7 +874,7 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,struct LP_quoteinfo *qp) { //FILE *fp; char fname[512]; - uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag=-2,x = -1; struct iguana_info *coin; + uint8_t *alicepub33=0,*bobpub33=0; int32_t bobistrusted,aliceistrusted,jumblrflag=-2,x = -1; struct iguana_info *coin; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; @@ -900,11 +900,15 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 { swap->I.iambob = 0; swap->I.otherhash = swap->I.req.desthash; + aliceistrusted = 1; + bobistrusted = LP_pubkey_istrusted(swap->I.req.desthash); } else { swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; + bobistrusted = 1; + aliceistrusted = LP_pubkey_istrusted(swap->I.req.desthash); } if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { @@ -929,24 +933,21 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 } if ( strcmp("BTC",swap->bobcoin.symbol) == 0 ) { - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->I.aliceconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.bobconfirms * 3); + swap->I.bobconfirms = (1 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->I.aliceconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.bobconfirms + 1); } else if ( strcmp("BTC",swap->alicecoin.symbol) == 0 ) { - swap->I.aliceconfirms = (1*0 + sqrt(dstr(swap->I.alicesatoshis) * .1)); - swap->I.bobconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.bobconfirms * 3); + swap->I.aliceconfirms = (1 + sqrt(dstr(swap->I.alicesatoshis) * .1)); + swap->I.bobconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.aliceconfirms + 1); } else { swap->I.bobconfirms = BASILISK_DEFAULT_NUMCONFIRMS; swap->I.aliceconfirms = BASILISK_DEFAULT_NUMCONFIRMS; } - /*if ( swap->I.bobconfirms == 0 ) - swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; - if ( swap->I.aliceconfirms == 0 ) - swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms;*/ - //jumblrflag = (bits256_cmp(pubkey25519,myinfo->jumblr_pubkey) == 0 || bits256_cmp(pubkey25519,myinfo->jumblr_depositkey) == 0); + swap->I.bobconfirms *= !bobistrusted; + swap->I.aliceconfirms *= !aliceistrusted; printf(">>>>>>>>>> jumblrflag.%d <<<<<<<<< use smart address, %.8f bobconfs.%d, %.8f aliceconfs.%d\n",jumblrflag,dstr(swap->I.bobsatoshis),swap->I.bobconfirms,dstr(swap->I.alicesatoshis),swap->I.aliceconfirms); if ( swap->I.iambob != 0 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 2ba86473c..54fd5da35 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -251,16 +251,17 @@ int32_t LP_mempool_vinscan(bits256 *spendtxidp,int32_t *spendvinp,char *symbol,b int32_t LP_numconfirms(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { int32_t numconfirms = 100; -#ifndef BASILISK_DISABLEWAITTX +//#ifndef BASILISK_DISABLEWAITTX cJSON *txobj; numconfirms = -1; if ( (txobj= LP_gettx(rawtx->coin->symbol,rawtx->I.signedtxid)) != 0 ) { numconfirms = jint(txobj,"confirmations"); free_json(txobj); - } else if ( LP_mempoolscan(rawtx->coin->symbol,rawtx->I.signedtxid) >= 0 ) + } + else if ( LP_mempoolscan(rawtx->coin->symbol,rawtx->I.signedtxid) >= 0 ) numconfirms = 0; -#endif +//#endif return(numconfirms); } From 09d00d70460b81778dc0dc241482dec0ad814289 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 18:30:49 +0300 Subject: [PATCH 511/910] test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 3bbdfe01c..598d0d3ad 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -142,7 +142,7 @@ int32_t LP_pubkey_istrusted(bits256 pubkey) return(0); } -char *LP_pubkey_trustedset(bits256 pubkey,uint32_t trustval) +char *LP_pubkey_trustset(bits256 pubkey,uint32_t trustval) { struct LP_pubkeyinfo *pubp; if ( (pubp= LP_pubkeyfind(pubkey)) != 0 ) From cfb6801fb90ac9df286c40bcbff5a02784ff8663 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 18:50:59 +0300 Subject: [PATCH 512/910] Test --- iguana/exchanges/LP_network.c | 1 + iguana/exchanges/LP_utxos.c | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 58783ad03..535f027fd 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -17,6 +17,7 @@ // LP_network.c // marketmaker // +// jl777: might need to queue outbound packets and send via separate thread char *nanomsg_tcpname(char *str,char *ipaddr,uint16_t port) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index ffb383b21..9a1d9ddda 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -17,6 +17,7 @@ // LP_utxos.c // marketmaker // +// jl777: invalidate utxo when either part is spent. if not expected spend, mark as bad and generate new utxopair using other half int32_t LP_ismine(struct LP_utxoinfo *utxo) { @@ -285,6 +286,20 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la return(jprint(utxosjson,1)); } +int32_t LP_inventory_prevent(int32_t iambob,bits256 txid,int32_t vout) +{ + struct LP_utxoinfo *utxo; + if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 ) + { + if ( utxo->T.spentflag != 0 ) + { + char str[65]; printf("prevent adding %s/v%d to inventory\n",bits256_str(str,txid),vout); + return(1); + } + } + return(0); +} + struct LP_utxoinfo *LP_utxo_bestfit(char *symbol,uint64_t destsatoshis) { struct LP_utxoinfo *utxo,*tmp,*bestutxo = 0; @@ -608,17 +623,19 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr if ( iambob == 0 ) values = calloc(n,sizeof(*values)); else memset(values,0,n * sizeof(*values)); - if ( iambob == 0 && IAMLP != 0 ) - continue; + //if ( iambob == 0 && IAMLP != 0 ) + // continue; + used = 0; for (i=0; i Date: Sat, 17 Jun 2017 18:59:26 +0300 Subject: [PATCH 513/910] Test --- iguana/exchanges/LP_utxos.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9a1d9ddda..ddd96fd02 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,6 +406,16 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; + if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + { + printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); + return(0); + } + if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) + { + printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); + return(0); + } if ( (utxo= LP_utxofinds(iambob,txid,vout,txid2,vout2)) != 0 ) { if ( 0 && LP_ismine(utxo) == 0 ) @@ -417,7 +427,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { utxo->T.errors++; - char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s v %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,utxo->payment.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,utxo->payment.txid),bits256_str(str2,u.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; @@ -429,16 +439,6 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); return(0); }*/ - if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) - { - printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); - return(0); - } - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) - { - printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); - return(0); - } utxo = calloc(1,sizeof(*utxo)); utxo->S.profitmargin = profitmargin; utxo->pubkey = pubkey; From d1451ee19b0dca670ad0eecd4812cce0f2782935 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:02:41 +0300 Subject: [PATCH 514/910] 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 ddd96fd02..13e72aedf 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,6 +406,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; + char str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); @@ -463,7 +464,6 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } LP_utxosetkey(utxo->key,txid,vout); LP_utxosetkey(utxo->key2,txid2,vout2); - //char str[65],str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); portable_mutex_lock(&LP_utxomutex); HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) From 646a4f979ab8e5eea22406baa9834a3a97bf5ad2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:04:03 +0300 Subject: [PATCH 515/910] 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 13e72aedf..8a27f7b87 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,7 +406,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str2[65],str3[65]; printf("%s iambob.%d %s %s utxoadd.(%.8f %.8f) %s %s\n",utxo->coinaddr,iambob,bits256_str(str3,utxo->pubkey),utxo->coin,dstr(value),dstr(value2),bits256_str(str,utxo->payment.txid),bits256_str(str2,txid2)); + char str2[65]; printf("%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)); if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); From 96b64d1b775ed7c5ffc926378749c0404f299a2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:19:27 +0300 Subject: [PATCH 516/910] Test --- iguana/exchanges/LP_swap.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index f310e0fa2..af26c15fc 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -680,19 +680,22 @@ void LP_bobloop(void *_swap) printf("error waiting for alicepayment\n"); else { - swap->bobreclaim.utxovout = 0; - swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; - basilisk_bobpayment_reclaim(swap,swap->I.callduration); - while ( LP_numconfirms(swap,&swap->alicepayment) < swap->I.aliceconfirms ) - { - printf("waiting for alicepayment to confirm\n"); - sleep(3); - } if ( basilisk_bobscripts_set(swap,0,1) < 0 ) printf("error bobscripts payment\n"); - else if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) - printf("error sending bobpayment\n"); - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); + else + { + swap->bobreclaim.utxovout = 0; + swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; + basilisk_bobpayment_reclaim(swap,swap->I.callduration); + while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + { + char str[65];printf("waiting for alicepayment to be confirmed %s %s\n",swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + sleep(3); + } + if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) + printf("error sending bobpayment\n"); + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); + } } } basilisk_swap_finished(swap); @@ -728,10 +731,10 @@ void LP_aliceloop(void *_swap) printf("error sending alicepayment\n"); else { - while ( LP_numconfirms(swap,&swap->alicepayment) < swap->I.aliceconfirms ) + while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) { - printf("waiting for alicepayment to confirm\n"); - sleep(3); + char str[65];printf("waiting for alicepayment to be confirmed %s %s\n",swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); From 28b1a35cf7ee2722eedd7d3f7b72ea593cc1dc80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:43:20 +0300 Subject: [PATCH 517/910] Test --- iguana/exchanges/LP_remember.c | 18 ++++++++++++++++++ iguana/exchanges/LP_swap.c | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index dc02a419b..f5d083594 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -867,6 +867,24 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti if ( finishedflag != 0 ) jaddstr(item,"status","finished"); else jaddstr(item,"status","pending"); + if ( bits256_nonz(paymentspent) == 0 ) + { + if ( bits256_nonz(txids[BASILISK_ALICESPEND]) != 0 ) + paymentspent = txids[BASILISK_ALICESPEND]; + else paymentspent = txids[BASILISK_BOBRECLAIM]; + } + if ( bits256_nonz(depositspent) == 0 ) + { + if ( bits256_nonz(txids[BASILISK_BOBREFUND]) != 0 ) + depositspent = txids[BASILISK_BOBREFUND]; + else depositspent = txids[BASILISK_ALICECLAIM]; + } + if ( bits256_nonz(Apaymentspent) == 0 ) + { + if ( bits256_nonz(txids[BASILISK_BOBSPEND]) != 0 ) + Apaymentspent = txids[BASILISK_BOBSPEND]; + else Apaymentspent = txids[BASILISK_ALICERECLAIM]; + } bits256_str(str,paymentspent), jaddbits256(item,"paymentspent",paymentspent); bits256_str(str,Apaymentspent), jaddbits256(item,"Apaymentspent",Apaymentspent); bits256_str(str,depositspent), jaddbits256(item,"depositspent",depositspent); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index af26c15fc..44275bbc7 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -644,6 +644,11 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t { printf("SWAP completed! %u-%u %s\n",requestid,quoteid,jprint(retjson,0)); free_json(retjson); + if ( (retstr= basilisk_swapentry(requestid,quoteid)) != 0 ) + { + printf("second call.(%s)\n",retstr); + free(retstr); + } return(0); } else return(-1); } From e0b1efd47cdf2d92f655a98697fa167983b99013 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:53:48 +0300 Subject: [PATCH 518/910] 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 4678cbce7..83b703df3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -270,6 +270,11 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { char *retstr; uint8_t r; int32_t i,n,j; cJSON *item; + if ( (retstr= basilisk_swapentry(0,0)) != 0 ) + { + //printf("SWAPS.(%s)\n",retstr); + free(retstr); + } if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); From abbad6221d38b129be840c7a17ef5feef297d9b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 19:55:30 +0300 Subject: [PATCH 519/910] 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 8a27f7b87..30523f7d7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -406,7 +406,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str2[65]; printf("%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 str2[65]; printf("%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)); if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); From 51b3a0ac73e3bae248f0fd52b3fa3af54f513dd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:03:08 +0300 Subject: [PATCH 520/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_swap.c | 14 +++++------ iguana/exchanges/LP_transaction.c | 40 +++++++++++++++---------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 77f6a4b45..5c6621641 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -212,7 +212,7 @@ int32_t LP_importaddress(char *symbol,char *address) sprintf(buf,"[\"%s\", \"%s\", false]",address,address); if ( (retstr= bitcoind_passthru(symbol,coin->serverport,coin->userpass,"importaddress",buf)) != 0 ) { - printf("importaddress.(%s %s) -> (%s)\n",symbol,address,retstr); + //printf("importaddress.(%s %s) -> (%s)\n",symbol,address,retstr); free(retstr); } else printf("importaddress.(%s %s)\n",symbol,address); return(1); diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 44275bbc7..a723a775c 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -508,10 +508,10 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) { memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); - for (i=0; iI.redeemlen; i++) - printf("%02x",rawtx->redeemscript[i]); + //for (i=0; iI.redeemlen; i++) + // printf("%02x",rawtx->redeemscript[i]); bitcoin_address(redeemaddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); - printf(" received redeemscript.(%s)\n",redeemaddr); + //printf(" received redeemscript.(%s)\n",redeemaddr); LP_swap_coinaddr(swap,rawtx->coin,checkaddr,data,datalen); if ( strcmp(redeemaddr,checkaddr) != 0 ) { @@ -522,9 +522,9 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); if ( rawtx->I.datalen == 0 ) { - for (i=0; itxbytes,data,datalen); rawtx->I.datalen = datalen; } @@ -545,7 +545,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba if ( (txobj= bitcoin_data2json(rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) { rawtx->I.actualtxid = rawtx->I.signedtxid; - char str[65]; printf("got %s txid.%s (%s)\n",rawtx->name,bits256_str(str,rawtx->I.signedtxid),jprint(txobj,0)); + //char str[65]; printf("got %s txid.%s (%s)\n",rawtx->name,bits256_str(str,rawtx->I.signedtxid),jprint(txobj,0)); rawtx->I.locktime = rawtx->msgtx.lock_time; if ( (vouts= jarray(&n,txobj,"vout")) != 0 && v < n ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 54fd5da35..76b158391 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -218,7 +218,7 @@ int32_t LP_mempoolscan(char *symbol,bits256 txid) for (i=0; i satoshis+txfee ) change = value - (satoshis + txfee); - printf("utxo %.8f, destamount %.8f change %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(change),dstr(txfee)); + //printf("utxo %.8f, destamount %.8f change %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(change),dstr(txfee)); } else if ( value > txfee ) satoshis = value - txfee; else printf("unexpected small value %.8f vs txfee %.8f\n",dstr(value),dstr(txfee)); @@ -854,7 +854,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay,bits256 privkey,uint8_t *changermd160,char *vinaddr) { int32_t retval=-1,len,iter; char *signedtx,*changeaddr = 0,_changeaddr[64]; struct iguana_info *coin; int64_t newtxfee=0,destamount; - char str2[65]; printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str2,rawtx->utxotxid),rawtx->utxovout); + //char str2[65]; printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str2,rawtx->utxotxid),rawtx->utxovout); if ( (coin= rawtx->coin) == 0 ) return(-1); //return(_basilisk_rawtx_gen(str,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay,privkey)); @@ -904,7 +904,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ { changeaddr = _changeaddr; bitcoin_address(changeaddr,pubtype,changermd160,20); - printf("changeaddr.(%s)\n",changeaddr); + //printf("changeaddr.(%s)\n",changeaddr); } for (iter=0; iter<2; iter++) { @@ -1480,14 +1480,14 @@ void basilisk_alicepayment(struct basilisk_swap *swap,struct iguana_info *coin,s { int32_t i; char coinaddr[64]; alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->p2shtype,pubAm,pubBn); - for (i=0; i<33; i++) + /*for (i=0; i<33; i++) printf("%02x",swap->persistent_pubkey33[i]); printf(" pubkey33, "); for (i=0; i<20; i++) printf("%02x",swap->changermd160[i]); - printf(" rmd160, "); + printf(" rmd160, ");*/ bitcoin_address(coinaddr,coin->pubtype,swap->changermd160,20); - printf("%s suppress.%d fee.%d\n",coinaddr,alicepayment->I.suppress_pubkeys,swap->myfee.I.suppress_pubkeys); + //printf("%s suppress.%d fee.%d\n",coinaddr,alicepayment->I.suppress_pubkeys,swap->myfee.I.suppress_pubkeys); basilisk_rawtx_gen(swap->ctx,"alicepayment",swap->I.started,swap->persistent_pubkey33,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr); } @@ -1520,9 +1520,9 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d swap->I.statebits |= LP_swapdata_rawtxsend(pairsock,swap,0x80,data,maxlen,&swap->myfee,0x40,0); LP_unspents_mark(swap->I.iambob!=0?swap->bobcoin.symbol:swap->alicecoin.symbol,swap->myfee.vins); //basilisk_txlog(swap,&swap->myfee,-1); - for (i=0; imyfee.I.datalen; i++) - printf("%02x",swap->myfee.txbytes[i]); - printf(" <- fee state.%x\n",swap->I.statebits); + //for (i=0; imyfee.I.datalen; i++) + // printf("%02x",swap->myfee.txbytes[i]); + //printf(" <- fee state.%x\n",swap->I.statebits); swap->I.statebits |= 0x40; } else @@ -1568,12 +1568,12 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); - for (i=0; ibobdeposit.I.datalen; i++) + /*for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); printf(" <- bobdeposit.%d %s\n",swap->bobdeposit.I.datalen,bits256_str(str,swap->bobdeposit.I.signedtxid)); for (i=0; ibobdeposit.I.redeemlen; i++) printf("%02x",swap->bobdeposit.redeemscript[i]); - printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys); + printf(" <- bobdeposit redeem %d %s suppress.%d\n",i,swap->bobdeposit.I.destaddr,swap->aliceclaim.I.suppress_pubkeys);*/ memcpy(swap->aliceclaim.redeemscript,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); swap->aliceclaim.I.redeemlen = swap->bobdeposit.I.redeemlen; memcpy(swap->aliceclaim.I.pubkey33,swap->persistent_pubkey33,33); @@ -1581,12 +1581,12 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da retval = 0; if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) { - for (i=0; ibobdeposit.I.datalen; i++) + /*for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); printf(" <- bobdeposit\n"); for (i=0; ialiceclaim.I.datalen; i++) printf("%02x",swap->aliceclaim.txbytes[i]); - printf(" <- aliceclaim\n"); + printf(" <- aliceclaim\n");*/ //basilisk_txlog(swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); return(LP_waitmempool(swap->bobcoin.symbol,swap->bobdeposit.I.signedtxid,10)); } else printf("error signing aliceclaim suppress.%d vin.(%s)\n",swap->aliceclaim.I.suppress_pubkeys,swap->bobdeposit.I.destaddr); @@ -1632,26 +1632,26 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); - for (i=0; ibobpayment.I.datalen; i++) + /*for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); printf(" <- bobpayment.%d\n",swap->bobpayment.I.datalen); for (i=0; ibobpayment.I.redeemlen; i++) printf("%02x",swap->bobpayment.redeemscript[i]); - printf(" <- bobpayment redeem %d %s %s\n",i,swap->bobpayment.I.destaddr,bits256_str(str,swap->bobpayment.I.signedtxid)); + printf(" <- bobpayment redeem %d %s %s\n",i,swap->bobpayment.I.destaddr,bits256_str(str,swap->bobpayment.I.signedtxid));*/ memcpy(swap->I.userdata_alicespend,userdata,len); swap->I.userdata_alicespendlen = len; retval = 0; memcpy(swap->alicespend.I.pubkey33,swap->persistent_pubkey33,33); bitcoin_address(swap->alicespend.I.destaddr,swap->bobcoin.pubtype,swap->persistent_pubkey33,33); - char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); + //char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->alicepayment.I.destaddr)) == 0 ) { - for (i=0; ibobpayment.I.datalen; i++) + /*for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); printf(" <- bobpayment\n"); for (i=0; ialicespend.I.datalen; i++) printf("%02x",swap->alicespend.txbytes[i]); - printf(" <- alicespend\n\n"); + printf(" <- alicespend\n\n");*/ swap->I.alicespent = 1; return(LP_waitmempool(swap->bobcoin.symbol,swap->bobpayment.I.signedtxid,10)); } else printf("error signing aliceclaim suppress.%d vin.(%s)\n",swap->alicespend.I.suppress_pubkeys,swap->bobpayment.I.destaddr); From d92ea815b16c9e4d9ba16a5c691d1a87c137dfc1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:12:08 +0300 Subject: [PATCH 521/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_swap.c | 6 +++--- iguana/exchanges/LP_transaction.c | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5c6621641..8d6219288 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -214,7 +214,7 @@ int32_t LP_importaddress(char *symbol,char *address) { //printf("importaddress.(%s %s) -> (%s)\n",symbol,address,retstr); free(retstr); - } else printf("importaddress.(%s %s)\n",symbol,address); + } //else printf("importaddress.(%s %s)\n",symbol,address); return(1); } diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index a723a775c..d0c47063a 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -689,9 +689,6 @@ void LP_bobloop(void *_swap) printf("error bobscripts payment\n"); else { - swap->bobreclaim.utxovout = 0; - swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; - basilisk_bobpayment_reclaim(swap,swap->I.callduration); while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) { char str[65];printf("waiting for alicepayment to be confirmed %s %s\n",swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); @@ -699,6 +696,9 @@ void LP_bobloop(void *_swap) } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) printf("error sending bobpayment\n"); + swap->bobreclaim.utxovout = 0; + swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; + basilisk_bobpayment_reclaim(swap,swap->I.callduration); LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); } } diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 76b158391..c07863ba5 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1316,16 +1316,16 @@ int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,b int32_t basilisk_bobpayment_reclaim(struct basilisk_swap *swap,int32_t delay) { - uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; - printf("basilisk_bobpayment_reclaim\n"); + uint8_t userdata[512]; int32_t retval,len = 0; static bits256 zero; + //printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); memcpy(swap->I.userdata_bobreclaim,userdata,len); swap->I.userdata_bobreclaimlen = len; if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1,swap->changermd160,swap->bobpayment.I.destaddr)) == 0 ) { - for (i=0; ibobreclaim.I.datalen; i++) - printf("%02x",swap->bobreclaim.txbytes[i]); - printf(" <- bobreclaim\n"); + //for (i=0; ibobreclaim.I.datalen; i++) + // printf("%02x",swap->bobreclaim.txbytes[i]); + //printf(" <- bobreclaim\n"); //basilisk_txlog(swap,&swap->bobreclaim,delay); return(retval); } @@ -1478,7 +1478,7 @@ int32_t basilisk_alicepayment_spend(struct basilisk_swap *swap,struct basilisk_r void basilisk_alicepayment(struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) { - int32_t i; char coinaddr[64]; + char coinaddr[64]; alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->p2shtype,pubAm,pubBn); /*for (i=0; i<33; i++) printf("%02x",swap->persistent_pubkey33[i]); @@ -1554,7 +1554,7 @@ int32_t LP_verify_otherfee(struct basilisk_swap *swap,uint8_t *data,int32_t data int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t datalen) { - uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; static bits256 zero; + uint8_t userdata[512]; int32_t retval=-1,len = 0; static bits256 zero; if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { swap->aliceclaim.utxovout = 0; @@ -1617,7 +1617,7 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t datalen) { - uint8_t userdata[512]; char str[65]; int32_t i,retval=-1,len = 0; bits256 revAm; + uint8_t userdata[512]; int32_t i,retval=-1,len = 0; bits256 revAm; memset(revAm.bytes,0,sizeof(revAm)); if ( LP_rawtx_spendscript(swap,swap->bobcoin.longestchain,&swap->bobpayment,0,data,datalen,0) == 0 ) { From adc6b3000916217dcc55ef47a6969e00be28743d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:18:35 +0300 Subject: [PATCH 522/910] 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 30523f7d7..846163b3a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -291,7 +291,7 @@ int32_t LP_inventory_prevent(int32_t iambob,bits256 txid,int32_t vout) struct LP_utxoinfo *utxo; if ( (utxo= LP_utxofind(iambob,txid,vout)) != 0 || (utxo= LP_utxo2find(iambob,txid,vout)) != 0 ) { - if ( utxo->T.spentflag != 0 ) + //if ( utxo->T.spentflag != 0 ) { char str[65]; printf("prevent adding %s/v%d to inventory\n",bits256_str(str,txid),vout); return(1); From 16a71cec942b70b557548bce96916aa402b5b0b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:26:15 +0300 Subject: [PATCH 523/910] Test --- iguana/exchanges/LP_swap.c | 4 ++-- iguana/exchanges/LP_transaction.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index d0c47063a..b7bfa8256 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -747,14 +747,14 @@ void LP_aliceloop(void *_swap) { while ( LP_numconfirms(swap,&swap->bobpayment) < swap->I.bobconfirms ) { - printf("waiting for bobpayment to confirm\n"); + char str[65];printf("waiting for bobpayment to be confirmed %s %s\n",swap->bobcoin.symbol,bits256_str(str,swap->bobpayment.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); while ( LP_numconfirms(swap,&swap->alicespend) < swap->I.aliceconfirms ) { - printf("waiting for alicespend to confirm\n"); + char str[65];printf("waiting for alicespend to be confirmed %s %s\n",swap->bobcoin.symbol,bits256_str(str,swap->alicespend.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index c07863ba5..f3038a967 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -843,7 +843,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch printf("incomplete signing suppress.%d %s (%s)\n",suppress_pubkeys,name,jprint(vins,0)); if ( signedtx != 0 ) free(signedtx), signedtx = 0; - } else printf("%s -> %s\n",name,bits256_str(str,*signedtxidp)); + } else printf("basilisk_swap_bobtxspend %s -> %s\n",name,bits256_str(str,*signedtxidp)); free(rawtxbytes); } else printf("error making rawtx suppress.%d\n",suppress_pubkeys); free_json(privkeys); From 3c69590533d3ee465d0a0631b3f96cd770d45717 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:31:13 +0300 Subject: [PATCH 524/910] Test --- iguana/exchanges/LP_swap.c | 20 ++++++++++---------- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b7bfa8256..deb8de656 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -655,7 +655,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; uint32_t expiration; struct basilisk_swap *swap = _swap; + uint8_t *data; int32_t maxlen,n; uint32_t expiration; struct basilisk_swap *swap = _swap; fprintf(stderr,"start swap iambob\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -689,9 +689,9 @@ void LP_bobloop(void *_swap) printf("error bobscripts payment\n"); else { - while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + while ( (n= LP_numconfirms(swap,&swap->alicepayment)) < 1 ) { - char str[65];printf("waiting for alicepayment to be confirmed %s %s\n",swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); sleep(3); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) @@ -710,7 +710,7 @@ void LP_bobloop(void *_swap) void LP_aliceloop(void *_swap) { - uint8_t *data; int32_t maxlen; uint32_t expiration; struct basilisk_swap *swap = _swap; + uint8_t *data; int32_t maxlen,n; uint32_t expiration; struct basilisk_swap *swap = _swap; maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; @@ -736,25 +736,25 @@ void LP_aliceloop(void *_swap) printf("error sending alicepayment\n"); else { - while ( LP_numconfirms(swap,&swap->alicepayment) < 1 ) + while ( (n= LP_numconfirms(swap,&swap->alicepayment)) < 1 ) { - char str[65];printf("waiting for alicepayment to be confirmed %s %s\n",swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); else { - while ( LP_numconfirms(swap,&swap->bobpayment) < swap->I.bobconfirms ) + while ( (n= LP_numconfirms(swap,&swap->bobpayment)) < swap->I.bobconfirms ) { - char str[65];printf("waiting for bobpayment to be confirmed %s %s\n",swap->bobcoin.symbol,bits256_str(str,swap->bobpayment.I.signedtxid)); + char str[65];printf("%d waiting for bobpayment to be confirmed.%d %s %s\n",n,swap->I.bobconfirms,swap->bobcoin.symbol,bits256_str(str,swap->bobpayment.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x20000,data,maxlen,&swap->alicespend,0x40000,0) == 0 ) printf("error sending alicespend\n"); - while ( LP_numconfirms(swap,&swap->alicespend) < swap->I.aliceconfirms ) + while ( (n= LP_numconfirms(swap,&swap->alicespend)) < swap->I.aliceconfirms ) { - char str[65];printf("waiting for alicespend to be confirmed %s %s\n",swap->bobcoin.symbol,bits256_str(str,swap->alicespend.I.signedtxid)); + char str[65];printf("%d waiting for alicespend to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->bobcoin.symbol,bits256_str(str,swap->alicespend.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 846163b3a..f45d0665f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -293,7 +293,7 @@ int32_t LP_inventory_prevent(int32_t iambob,bits256 txid,int32_t vout) { //if ( utxo->T.spentflag != 0 ) { - char str[65]; printf("prevent adding %s/v%d to inventory\n",bits256_str(str,txid),vout); + //char str[65]; printf("prevent adding %s/v%d to inventory\n",bits256_str(str,txid),vout); return(1); } } From d3d65f86e0aa11220e3e0adc5245f7b18d77f9a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:35:08 +0300 Subject: [PATCH 525/910] Test --- iguana/exchanges/LP_swap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index deb8de656..b3fd8fc71 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -689,9 +689,9 @@ void LP_bobloop(void *_swap) printf("error bobscripts payment\n"); else { - while ( (n= LP_numconfirms(swap,&swap->alicepayment)) < 1 ) + while ( (n= LP_numconfirms(swap,&swap->alicepayment)) < 1 ) // sync with alice { - char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,1,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); sleep(3); } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) @@ -738,7 +738,7 @@ void LP_aliceloop(void *_swap) { while ( (n= LP_numconfirms(swap,&swap->alicepayment)) < 1 ) { - char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); + char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,1,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobpayment) < 0 ) @@ -942,12 +942,12 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 if ( strcmp("BTC",swap->bobcoin.symbol) == 0 ) { swap->I.bobconfirms = (1 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->I.aliceconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.bobconfirms + 1); + swap->I.aliceconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.bobconfirms); } else if ( strcmp("BTC",swap->alicecoin.symbol) == 0 ) { swap->I.aliceconfirms = (1 + sqrt(dstr(swap->I.alicesatoshis) * .1)); - swap->I.bobconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.aliceconfirms + 1); + swap->I.bobconfirms = MIN(BASILISK_DEFAULT_NUMCONFIRMS,swap->I.aliceconfirms); } else { From 5cf95595a46f2aa8875bcf06723371174d60bc7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Jun 2017 20:41:16 +0300 Subject: [PATCH 526/910] 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 34a4bd009..ca4c784c3 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -47,7 +47,7 @@ #define LP_RESERVETIME 60 #define LP_AVETXSIZE 200 #define LP_CACHEDURATION 60 -#define BASILISK_DEFAULT_NUMCONFIRMS 2 +#define BASILISK_DEFAULT_NUMCONFIRMS 1 #define DEX_SLEEP 3 #define BASILISK_KEYSIZE ((int32_t)(2*sizeof(bits256)+sizeof(uint32_t)*2)) From 8904263427c3a70ba58e1b31a7ea8f225fdb7065 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:13:03 +0300 Subject: [PATCH 527/910] Test --- iguana/exchanges/LP_utxos.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f45d0665f..223a6ab59 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -397,7 +397,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - char str[65]; uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); @@ -406,7 +406,14 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - //char str2[65]; printf("%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],dispflag = 0; + bits256_str(str,txid); + bits256_str(str2,txid2); + if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) + dispflag = 1; + if ( dispflag != 0 ) + printf("%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)); if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); @@ -428,7 +435,9 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { utxo->T.errors++; - char str[65],str2[65],str3[65],str4[65]; printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,utxo->payment.txid),bits256_str(str2,u.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + char str[65],str2[65],str3[65],str4[65]; + if ( dispflag != 0 ) + printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,utxo->payment.txid),bits256_str(str2,u.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; From 2929b269ad2b40e87f838e6465a2b28bd34c334a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:14:35 +0300 Subject: [PATCH 528/910] 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 223a6ab59..1baa8e44f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -437,7 +437,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit utxo->T.errors++; char str[65],str2[65],str3[65],str4[65]; if ( dispflag != 0 ) - printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,utxo->payment.txid),bits256_str(str2,u.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,txid2),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; From a9c9d3364d9d361c882e16397c74ecf10e6dbe34 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:23:11 +0300 Subject: [PATCH 529/910] Test --- iguana/exchanges/LP_remember.c | 6 +++--- iguana/exchanges/LP_utxos.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index f5d083594..d2a06d19f 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -427,13 +427,13 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti if ( bits256_nonz(privkey) != 0 ) { privAm = privkey; - printf("set privAm <- %s\n",bits256_str(str,privAm)); + //printf("set privAm <- %s\n",bits256_str(str,privAm)); } privkey = jbits256(item,"privBn"); if ( bits256_nonz(privkey) != 0 ) { privBn = privkey; - printf("set privBn <- %s\n",bits256_str(str,privBn)); + //printf("set privBn <- %s\n",bits256_str(str,privBn)); } expiration = juint(item,"expiration"); state = jint(item,"state"); @@ -554,7 +554,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } else if ( finishedflag == 0 ) printf("%s not finished\n",fname); } - printf("alicepayment.%s bobpayment.%s bobdeposit.%s\n",alicepaymentaddr,bobpaymentaddr,bobdepositaddr); + //printf("alicepayment.%s bobpayment.%s bobdeposit.%s\n",alicepaymentaddr,bobpaymentaddr,bobdepositaddr); //printf("iambob.%d src.%s dest.%s bob.%s alice.%s pubA0.(%s)\n",iambob,src,dest,bobcoin,alicecoin,bits256_str(str,pubA0)); Adestaddr[0] = destaddr[0] = 0; Adest = Bdest = AAdest = ABdest = 0; diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 1baa8e44f..838030769 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -412,13 +412,13 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit bits256_str(str2,txid2); if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) dispflag = 1; - if ( dispflag != 0 ) - printf("%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)); if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } + if ( dispflag != 0 ) + printf("%.8f %.8f %s iambob.%d %s utxoadd.(%.8f %.8f) %s %s\n",dstr(val),dstr(val2),coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) { printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); From b715e748a8dc93fe5892dff8436f47780f83180f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:24:24 +0300 Subject: [PATCH 530/910] 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 838030769..9230fd53f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -381,7 +381,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { - //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); if ( strcmp(destaddr,destaddr2) == 0 ) { *valp = val; From 673b20adbd00f40b7e8cfb94f82adc6a8134bbc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:31:12 +0300 Subject: [PATCH 531/910] 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 9230fd53f..10ca1fb76 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -382,7 +382,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); - if ( strcmp(destaddr,destaddr2) == 0 ) + if ( strcmp(destaddr,destaddr2) == 0 && ((iambob == 0 && val2 <= val) || (iambob != 0 && val2 >= val)) ) { *valp = val; *val2p = val2; From a18d308d078f364650644e28387ca32bbfff2b5f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:31:30 +0300 Subject: [PATCH 532/910] 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 10ca1fb76..24e69be3c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -381,7 +381,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { - printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); if ( strcmp(destaddr,destaddr2) == 0 && ((iambob == 0 && val2 <= val) || (iambob != 0 && val2 >= val)) ) { *valp = val; From b084e3aec48a040b5fe8a082e24f32d0a6c1f630 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:34:15 +0300 Subject: [PATCH 533/910] test --- iguana/exchanges/LP_utxos.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 24e69be3c..07a6f6f23 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -381,14 +381,17 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { - //printf("val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); - if ( strcmp(destaddr,destaddr2) == 0 && ((iambob == 0 && val2 <= val) || (iambob != 0 && val2 >= val)) ) + if ( strcmp(destaddr,destaddr2) == 0 ) + printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); + else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < val) ) + printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + else { *valp = val; *val2p = val2; return(1); - } else printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - } else printf("mismatched %s txid value2 %.8f < %.8f\n",symbol,dstr(val2),dstr(LP_DEPOSITSATOSHIS(satoshis))); + } + } } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); *valp = val; *val2p = val2; @@ -414,7 +417,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit dispflag = 1; if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { - printf("utxoadd got spent txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); + printf("utxoadd got ineligible txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } if ( dispflag != 0 ) From 7db4b8489c8bd785d653fa3095fb8bed84ca9f88 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:36:40 +0300 Subject: [PATCH 534/910] 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 07a6f6f23..6a4d404e0 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -417,7 +417,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit dispflag = 1; if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { - printf("utxoadd got ineligible txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",dstr(value),dstr(value2),dstr(tmpsatoshis)); + printf("iambob.%d utxoadd got ineligible txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",iambob,dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); } if ( dispflag != 0 ) From feb5ee76fccb06eb28b0a820fd631040334da7e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:37:28 +0300 Subject: [PATCH 535/910] 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 6a4d404e0..3d0c6320f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -381,7 +381,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) { - if ( strcmp(destaddr,destaddr2) == 0 ) + if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < val) ) printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); From de31bcdd7ce26292e85eaae707e1cc9a261a8d17 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:38:22 +0300 Subject: [PATCH 536/910] 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 3d0c6320f..2d73afe3c 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -410,7 +410,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str[65],str2[65],dispflag = 0; + char str[65],str2[65],dispflag = 1; bits256_str(str,txid); bits256_str(str2,txid2); if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) From f054b47f8fc49c89f551984e3b87cc7d04fdcec0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:39:20 +0300 Subject: [PATCH 537/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 2d73afe3c..53b5b95c7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -410,7 +410,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str[65],str2[65],dispflag = 1; + char str[65],str2[65],dispflag = 0; bits256_str(str,txid); bits256_str(str2,txid2); if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) @@ -422,6 +422,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit } if ( dispflag != 0 ) printf("%.8f %.8f %s iambob.%d %s utxoadd.(%.8f %.8f) %s %s\n",dstr(val),dstr(val2),coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); + dispflag = 1; if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) { printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); From 692a6a96a6a727c551077f8d3a8a6ffcef02a708 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:40:42 +0300 Subject: [PATCH 538/910] 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 53b5b95c7..b9f5675e3 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -441,7 +441,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit utxo->T.errors++; char str[65],str2[65],str3[65],str4[65]; if ( dispflag != 0 ) - printf("error on subsequent utxo add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",bits256_str(str,txid),bits256_str(str2,txid2),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + printf("error on subsequent utxo iambob.%d %.8f %.8f add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",iambob,dstr(val),dstr(val2),bits256_str(str,txid),bits256_str(str2,txid2),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; From 251b1ae736f57e6551e8567d8501e00ff0fbc92a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:41:34 +0300 Subject: [PATCH 539/910] 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 b9f5675e3..20fbd9b26 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -383,7 +383,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < val) ) + else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); else { From f68b949e7bee3f2854e1f226fd89d216253cd547 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:44:41 +0300 Subject: [PATCH 540/910] Test --- iguana/exchanges/LP_utxos.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 20fbd9b26..7306919d7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -409,8 +409,13 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str[65],str2[65],dispflag = 0; + if ( iambob == 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) + { + printf("trying to add Alice utxo when not mine? %s/v%d\n",bits256_str(str,txid),vout); + return(0); + } + bits256_str(str,txid); bits256_str(str2,txid2); if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) From a395f83c6930e8ba27e9e58f332d812f20f9ab5c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 10:51:43 +0300 Subject: [PATCH 541/910] Test --- iguana/exchanges/LP_utxos.c | 61 ++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7306919d7..8a3bb15bb 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -262,9 +262,35 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) return(item); } +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) +{ + uint64_t val,val2=0,threshold; char destaddr[64],destaddr2[64]; + destaddr[0] = destaddr2[0] = 0; + if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) + { + threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); + if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) + { + if ( strcmp(destaddr,destaddr2) != 0 ) + printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); + else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) + printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + else + { + *valp = val; + *val2p = val2; + return(1); + } + } + } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); + *valp = val; + *val2p = val2; + return(0); +} + char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t lastn) { - int32_t i,firsti,n; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); + int32_t i,firsti,n; uint64_t val,val2; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo,*tmp; cJSON *utxosjson = cJSON_CreateArray(); i = 0; n = mypeer != 0 ? mypeer->numutxos : 0; if ( lastn <= 0 ) @@ -280,7 +306,12 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la continue; if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) { - jaddi(utxosjson,LP_utxojson(utxo)); + u = (iambob != 0) ? utxo->deposit : utxo->fee; + if ( LP_iseligible(&val,&val2,0,symbol,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) + { + char str[65]; printf("iambob.%d not eligible (%.8f %.8f) %s/v%d\n",iambob,dstr(val),dstr(val2),bits256_str(str,utxo->payment.txid),utxo->payment.vout); + continue; + } else jaddi(utxosjson,LP_utxojson(utxo)); } } return(jprint(utxosjson,1)); @@ -372,32 +403,6 @@ char *LP_spentcheck(cJSON *argjson) return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -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) -{ - uint64_t val,val2=0,threshold; char destaddr[64],destaddr2[64]; - destaddr[0] = destaddr2[0] = 0; - if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) - { - threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); - if ( (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) >= threshold ) - { - if ( strcmp(destaddr,destaddr2) != 0 ) - printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) - printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); - else - { - *valp = val; - *val2p = val2; - return(1); - } - } - } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); - *valp = val; - *val2p = val2; - return(0); -} - struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; From 69e3ce00855bd20e62949f7e1757d27ab4d5852b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:12:01 +0300 Subject: [PATCH 542/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 8a3bb15bb..bef71b92a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -494,7 +494,8 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit portable_mutex_unlock(&LP_utxomutex); if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - else LP_utxo_clientpublish(utxo); + else if ( iambob != 0 ) + LP_utxo_clientpublish(utxo); if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) LP_mypeer->numutxos++; } From 4d5070eabb65c8943e44f0bea682585b9233f8f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:13:44 +0300 Subject: [PATCH 543/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bef71b92a..4b601f8d2 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -307,9 +307,9 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) { u = (iambob != 0) ? utxo->deposit : utxo->fee; - if ( LP_iseligible(&val,&val2,0,symbol,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) + if ( LP_iseligible(&val,&val2,0,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) { - char str[65]; printf("iambob.%d not eligible (%.8f %.8f) %s/v%d\n",iambob,dstr(val),dstr(val2),bits256_str(str,utxo->payment.txid),utxo->payment.vout); + char str[65]; printf("iambob.%d not eligible (%.8f %.8f) %s %s/v%d\n",iambob,dstr(val),dstr(val2),utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout); continue; } else jaddi(utxosjson,LP_utxojson(utxo)); } From 74d48ad2209d381bc53bfd84c217fc31e585bd90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:16:54 +0300 Subject: [PATCH 544/910] 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 4b601f8d2..0c994b8a7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -273,15 +273,15 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) - printf("ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",dstr(val),dstr(val2),dstr(satoshis)); + //else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < satoshis) ) + // printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",iambob,dstr(val),dstr(val2),dstr(satoshis)); else { *valp = val; *val2p = val2; return(1); } - } + } else printf("no val2\n"); } else printf("mismatched %s txid value %.8f < %.8f\n",symbol,dstr(val),dstr(satoshis)); *valp = val; *val2p = val2; From 051ec447f0b694db025c241a7f378a6d91c86e26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:18:20 +0300 Subject: [PATCH 545/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0c994b8a7..610574e3d 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -273,8 +273,8 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - //else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < satoshis) ) - // printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",iambob,dstr(val),dstr(val2),dstr(satoshis)); + else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < satoshis) ) + printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",iambob,dstr(val),dstr(val2),dstr(satoshis)); else { *valp = val; From 9a91e2486d419acec1612b78491d0d7712517393 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:19:25 +0300 Subject: [PATCH 546/910] 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 610574e3d..e73a97cc7 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -274,7 +274,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < satoshis) ) - printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f\n",iambob,dstr(val),dstr(val2),dstr(satoshis)); + printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f diff %lld\n",iambob,dstr(val),dstr(val2),dstr(satoshis),(long long)(val2 - val)); else { *valp = val; From f2a90d91ba0a11d92179c035fd1d6eb85370c92c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:20:02 +0300 Subject: [PATCH 547/910] 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 e73a97cc7..db6fce480 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -273,7 +273,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < satoshis) ) + else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < satoshis) ) printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f diff %lld\n",iambob,dstr(val),dstr(val2),dstr(satoshis),(long long)(val2 - val)); else { From 234714ab04e218834f61f137d7bba0bd8bd25241 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:21:49 +0300 Subject: [PATCH 548/910] 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 db6fce480..74fbe5449 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -307,7 +307,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) { u = (iambob != 0) ? utxo->deposit : utxo->fee; - if ( LP_iseligible(&val,&val2,0,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) + if ( LP_iseligible(&val,&val2,iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) { char str[65]; printf("iambob.%d not eligible (%.8f %.8f) %s %s/v%d\n",iambob,dstr(val),dstr(val2),utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout); continue; From 1c0241e74def8f2322a48c70e3d38da73da8c806 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:25:57 +0300 Subject: [PATCH 549/910] 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 74fbe5449..9a686dd40 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -273,7 +273,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < satoshis) ) + else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < val) ) printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f diff %lld\n",iambob,dstr(val),dstr(val2),dstr(satoshis),(long long)(val2 - val)); else { From 7572cfb08534ec34f595c6feb38b6b1277da6a37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:33:41 +0300 Subject: [PATCH 550/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- iguana/exchanges/LP_utxos.c | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 83b703df3..4f194727e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -31,7 +31,7 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // -portable_mutex_t LP_peermutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; +portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -346,6 +346,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } portable_mutex_init(&LP_peermutex); portable_mutex_init(&LP_utxomutex); + portable_mutex_init(&LP_UTXOmutex); portable_mutex_init(&LP_commandmutex); portable_mutex_init(&LP_swaplistmutex); portable_mutex_init(&LP_cachemutex); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 9a686dd40..025c3bb21 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -420,11 +420,6 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit printf("trying to add Alice utxo when not mine? %s/v%d\n",bits256_str(str,txid),vout); return(0); } - - bits256_str(str,txid); - bits256_str(str2,txid2); - if ( strcmp(str,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 || strcmp(str2,"7ea7481baf03698cbeb7b9cd0ed3f86f3c40debab72626516dda7e8d155630eb") == 0 ) - dispflag = 1; if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) { printf("iambob.%d utxoadd got ineligible txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",iambob,dstr(value),dstr(value2),dstr(tmpsatoshis)); @@ -504,7 +499,11 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson) { - return(LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"))); + struct LP_utxoinfo *utxo; + portable_mutex_lock(&LP_UTXOmutex); + utxo = LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit")); + portable_mutex_unlock(&LP_UTXOmutex); + return(utxo); } int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t now) @@ -684,6 +683,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr { value = values[i]; values[i] = 0, used++; + portable_mutex_lock(&LP_UTXOmutex); if ( iambob != 0 ) { if ( (utxo= LP_utxoadd(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) @@ -696,6 +696,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr { } } + portable_mutex_unlock(&LP_UTXOmutex); total += value; } } From c7a045dd50147fccbb3308b4f67e3391c51201f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:37:25 +0300 Subject: [PATCH 551/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 025c3bb21..57eb3e191 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -444,9 +444,9 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( bits256_cmp(txid,utxo->payment.txid) != 0 || bits256_cmp(txid2,u.txid) != 0 || vout != utxo->payment.vout || value != utxo->payment.value || tmpsatoshis != utxo->S.satoshis || vout2 != u.vout || value2 != u.value || strcmp(symbol,utxo->coin) != 0 || strcmp(spendscript,utxo->spendscript) != 0 || strcmp(coinaddr,utxo->coinaddr) != 0 || bits256_cmp(pubkey,utxo->pubkey) != 0 ) { utxo->T.errors++; - char str[65],str2[65],str3[65],str4[65]; + char str[65],str2[65],str3[65],str4[65],str5[65],str6[65]; if ( dispflag != 0 ) - printf("error on subsequent utxo iambob.%d %.8f %.8f add.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",iambob,dstr(val),dstr(val2),bits256_str(str,txid),bits256_str(str2,txid2),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str3,pubkey),bits256_str(str4,utxo->pubkey)); + printf("error on subsequent utxo iambob.%d %.8f %.8f add.(%s %s) when.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",iambob,dstr(val),dstr(val2),bits256_str(str,txid),bits256_str(str2,txid2),bits256_str(str3,utxo->payment.txid),bits256_str(str4,utxo->deposit.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str5,pubkey),bits256_str(str6,utxo->pubkey)); } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; From fbc663c204c950915d34c1b9cc1bc52099de8a35 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:39:12 +0300 Subject: [PATCH 552/910] 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 57eb3e191..43f9b193b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -273,7 +273,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 < val) ) + else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f diff %lld\n",iambob,dstr(val),dstr(val2),dstr(satoshis),(long long)(val2 - val)); else { From f576e4389e3812327da5833bb937f173bdbd89b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:42:41 +0300 Subject: [PATCH 553/910] Test --- iguana/exchanges/LP_utxos.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 43f9b193b..36661a074 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -218,6 +218,7 @@ cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) jaddstr(item,"method","notified"); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); + jaddnum(item,"iambob",utxo->iambob); jaddstr(item,"address",utxo->coinaddr); jaddbits256(item,"txid",utxo->payment.txid); jaddnum(item,"vout",utxo->payment.vout); @@ -500,6 +501,11 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson) { struct LP_utxoinfo *utxo; + if ( jobj(argjson,"iambob") == 0 || iambob != jint(argjson,"iambob") ) + { + printf("LP_utxoaddjson: iambob.%d != arg.%d obj.%p\n",iambob,jint(argjson,"iambob"),jobj(argjson,"iambob")); + return(0); + } portable_mutex_lock(&LP_UTXOmutex); utxo = LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit")); portable_mutex_unlock(&LP_UTXOmutex); From 48a1094355d3bb6dc7873ad521d06cd1c6f99d3f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:47:20 +0300 Subject: [PATCH 554/910] 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 36661a074..4006048b6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -274,7 +274,7 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { if ( strcmp(destaddr,destaddr2) != 0 ) printf("mismatched %s destaddr %s vs %s\n",symbol,destaddr,destaddr2); - else if ( (iambob == 0 && val2 >= val) || (iambob != 0 && val2 < val) ) + else if ( (iambob == 0 && val2 > val) || (iambob != 0 && val2 <= satoshis) ) printf("iambob.%d ineligible due to offsides: val %.8f and val2 %.8f vs %.8f diff %lld\n",iambob,dstr(val),dstr(val2),dstr(satoshis),(long long)(val2 - val)); else { From 7057701f2d3b5df3b9c047595f76544f7a841bce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:50:16 +0300 Subject: [PATCH 555/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4f194727e..780942e1d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -246,7 +246,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_forwarding_register(LP_mypubkey,pushaddr,10); lastforward = now; } - if ( (counter % 600) == 0 ) + if ( (counter % 600) == 300 ) LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( (counter % 600) == 0 ) { @@ -318,7 +318,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_priceinfoadd(jstr(item,"coin")); } } - LP_privkey_updates(pubsock,passphrase); + //LP_privkey_updates(pubsock,passphrase); if ( (retstr= basilisk_swaplist()) != 0 ) free(retstr); while ( 1 ) From 8554b2f600d5442aedd56922cf15d23582ecd003 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:51:00 +0300 Subject: [PATCH 556/910] 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 4006048b6..a9ac7a6a8 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -415,7 +415,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding tmpsatoshis = (((value2 - 100000) / 9) << 3); else tmpsatoshis = value; - char str[65],str2[65],dispflag = 0; + char str[65],str2[65],dispflag = (iambob == 0); if ( iambob == 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) { printf("trying to add Alice utxo when not mine? %s/v%d\n",bits256_str(str,txid),vout); From f7aa7cf5aa38f48b3b4c5ab4bad08425b0c7d51d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:52:09 +0300 Subject: [PATCH 557/910] 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 780942e1d..c851d0bf0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -241,13 +241,15 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->diduquery = now; } } - if ( lastforward < now-3600 ) - { - LP_forwarding_register(LP_mypubkey,pushaddr,10); - lastforward = now; - } if ( (counter % 600) == 300 ) + { LP_myutxo_updates(pubsock,passphrase,profitmargin); + if ( lastforward < now-3600 ) + { + LP_forwarding_register(LP_mypubkey,pushaddr,10); + lastforward = now; + } + } if ( (counter % 600) == 0 ) { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) From 36cead151c4709400bf1e02f4222dfa40d854f06 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:53:30 +0300 Subject: [PATCH 558/910] 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 c851d0bf0..c55580ad1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -241,7 +241,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->diduquery = now; } } - if ( (counter % 600) == 300 ) + if ( (counter % 600) == 100 ) { LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) From d496ac598dd6ffde57c17b0e078b3562cf64deaa Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:54:22 +0300 Subject: [PATCH 559/910] 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 c55580ad1..2ebdadbef 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -241,7 +241,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->diduquery = now; } } - if ( (counter % 600) == 100 ) + if ( (counter % 600) == 60 ) { LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) From 0fec1e979033ebbbe34bb4517d47d3aae69bc790 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:55:10 +0300 Subject: [PATCH 560/910] 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 a9ac7a6a8..0e2585918 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -503,7 +503,7 @@ struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson struct LP_utxoinfo *utxo; if ( jobj(argjson,"iambob") == 0 || iambob != jint(argjson,"iambob") ) { - printf("LP_utxoaddjson: iambob.%d != arg.%d obj.%p\n",iambob,jint(argjson,"iambob"),jobj(argjson,"iambob")); + printf("LP_utxoaddjson: iambob.%d != arg.%d obj.%p (%s)\n",iambob,jint(argjson,"iambob"),jobj(argjson,"iambob"),jprint(argjson,0)); return(0); } portable_mutex_lock(&LP_UTXOmutex); From 3f4cc31861319506f211a2f8816cf1fa11651992 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 11:56:50 +0300 Subject: [PATCH 561/910] 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 8d6219288..5d3823b4b 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -65,7 +65,7 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65],str3[65]; - sprintf(url,"http://%s:%u/api/stats/notified?pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(issue_curlt(url,LP_HTTP_TIMEOUT)); From 980fbf283f1ff59a20f0499bc6d790aa48439d56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:02:51 +0300 Subject: [PATCH 562/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_ordermatch.c | 4 ++-- iguana/exchanges/LP_rpc.c | 19 ++++++++++++++----- iguana/exchanges/LP_utxos.c | 11 ++++++++--- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index ca4c784c3..b66e2c47c 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -230,6 +230,7 @@ int32_t LP_isavailable(struct LP_utxoinfo *utxo); struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); 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,bits256 pubkey); #endif diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index a23528166..af2d2599e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -235,12 +235,12 @@ double LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop { double qprice; uint64_t srcvalue,srcvalue2,destvalue,destvalue2; *autxop = *butxop = 0; - if ( LP_iseligible(&srcvalue,&srcvalue2,1,qp->srccoin,qp->txid,qp->vout,qp->satoshis,qp->txid2,qp->vout2) == 0 ) + if ( LP_iseligible(&srcvalue,&srcvalue2,1,qp->srccoin,qp->txid,qp->vout,qp->satoshis,qp->txid2,qp->vout2,qp->srchash) == 0 ) { printf("bob not eligible\n"); return(-2); } - if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) == 0 ) + if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout,qp->desthash) == 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); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5d3823b4b..5cc5c8098 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -64,11 +64,20 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { - char url[4096],str[65],str2[65],str3[65]; - sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); - if ( strlen(url) > 1024 ) - printf("WARNING long url.(%s)\n",url); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + char url[4096],str[65],str2[65],str3[65]; struct _LP_utxoinfo u; uint64_t val,val2; + u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; + if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) + { + sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + if ( strlen(url) > 1024 ) + printf("WARNING long url.(%s)\n",url); + return(issue_curlt(url,LP_HTTP_TIMEOUT)); + } + else + { + printf("issue_LP_notifyutxo: ineligible utxo iambob.%d %.8f %.8f\n",utxo->iambob,dstr(val),dstr(val2)); + return(0); + } } char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0e2585918..8aeb74a50 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -263,10 +263,15 @@ cJSON *LP_utxojson(struct LP_utxoinfo *utxo) return(item); } -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_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,bits256 pubkey) { uint64_t val,val2=0,threshold; char destaddr[64],destaddr2[64]; destaddr[0] = destaddr2[0] = 0; + if ( iambob == 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) + { + char str[65]; printf("external Alice utxo.(%s) rejected\n",bits256_str(str,txid)); + return(0); + } if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) { threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); @@ -308,7 +313,7 @@ char *LP_utxos(int32_t iambob,struct LP_peerinfo *mypeer,char *symbol,int32_t la if ( (symbol == 0 || symbol[0] == 0 || strcmp(symbol,utxo->coin) == 0) && utxo->T.spentflag == 0 ) { u = (iambob != 0) ? utxo->deposit : utxo->fee; - if ( LP_iseligible(&val,&val2,iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout) == 0 ) + if ( LP_iseligible(&val,&val2,iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) == 0 ) { char str[65]; printf("iambob.%d not eligible (%.8f %.8f) %s %s/v%d\n",iambob,dstr(val),dstr(val2),utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout); continue; @@ -421,7 +426,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit printf("trying to add Alice utxo when not mine? %s/v%d\n",bits256_str(str,txid),vout); return(0); } - if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2) <= 0 ) + if ( LP_iseligible(&val,&val2,iambob,symbol,txid,vout,tmpsatoshis,txid2,vout2,pubkey) <= 0 ) { printf("iambob.%d utxoadd got ineligible txid value %.8f, value2 %.8f, tmpsatoshis %.8f\n",iambob,dstr(value),dstr(value2),dstr(tmpsatoshis)); return(0); From 2018f632ee0690bd52c3129bcfa6ee7531ef3ee3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:06:21 +0300 Subject: [PATCH 563/910] Test --- iguana/exchanges/LP_rpc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5cc5c8098..3cf0959b4 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -65,6 +65,11 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { char url[4096],str[65],str2[65],str3[65]; struct _LP_utxoinfo u; uint64_t val,val2; + if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) + { + printf("no need to notify ourselves\n"); + return(clonestr("{\"result\":\"success\"}")); + } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) { From e1eb7ff78f9dc450b97c9dc79f4f9aa5c9e05035 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:08:08 +0300 Subject: [PATCH 564/910] Test --- iguana/exchanges/LP_rpc.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 3cf0959b4..cbd18ea10 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -34,6 +34,15 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) return(retstr); } +char *LP_isitme(char *destip,uint16_t destport) +{ + if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) + { + printf("no need to notify ourselves\n"); + return(clonestr("{\"result\":\"success\"}")); + } else return(0); +} + char *issue_LP_getpeers(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) { char url[512]; @@ -57,14 +66,18 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) { - char url[512]; + char url[512],*retstr; + if ( (retstr= LP_isitme(destip,destport)) != 0 ) + return(retstr); sprintf(url,"http://%s:%u/api/stats/notify?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) { - char url[4096],str[65],str2[65],str3[65]; struct _LP_utxoinfo u; uint64_t val,val2; + char url[4096],str[65],str2[65],str3[65],*retstr; struct _LP_utxoinfo u; uint64_t val,val2; + if ( (retstr= LP_isitme(destip,destport)) != 0 ) + return(retstr); if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) { printf("no need to notify ourselves\n"); From 59a69be762e1a7dd85d2978061dd5d9e5ddd8319 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:10:30 +0300 Subject: [PATCH 565/910] 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 cbd18ea10..c361dd528 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -80,8 +80,8 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx return(retstr); if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) { - printf("no need to notify ourselves\n"); - return(clonestr("{\"result\":\"success\"}")); + //printf("no need to notify ourselves\n"); + return(0);//clonestr("{\"result\":\"success\"}")); } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) From ec0c531f4918b8184a8bac2ee13206a736d126a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:12:11 +0300 Subject: [PATCH 566/910] test --- iguana/exchanges/LP_rpc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index c361dd528..09534dc89 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -38,7 +38,7 @@ char *LP_isitme(char *destip,uint16_t destport) { if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) { - printf("no need to notify ourselves\n"); + //printf("no need to notify ourselves\n"); return(clonestr("{\"result\":\"success\"}")); } else return(0); } @@ -68,7 +68,10 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, { char url[512],*retstr; if ( (retstr= LP_isitme(destip,destport)) != 0 ) - return(retstr); + { + free(retstr); + return(0); + } sprintf(url,"http://%s:%u/api/stats/notify?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); return(issue_curlt(url,LP_HTTP_TIMEOUT)); } @@ -77,11 +80,9 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx { char url[4096],str[65],str2[65],str3[65],*retstr; struct _LP_utxoinfo u; uint64_t val,val2; if ( (retstr= LP_isitme(destip,destport)) != 0 ) - return(retstr); - if ( LP_mypeer != 0 && strcmp(destip,LP_mypeer->ipaddr) == 0 && LP_mypeer->port == destport ) { - //printf("no need to notify ourselves\n"); - return(0);//clonestr("{\"result\":\"success\"}")); + free(retstr); + return(0); } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) From 367508925d3eaff042e022e19aec85637d552ba9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:14:23 +0300 Subject: [PATCH 567/910] 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 8aeb74a50..e8cbdd937 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -541,7 +541,7 @@ int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t n if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - //printf("parse.(%s)\n",jprint(item,0)); + printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,-1,item)) != 0 ) utxo->T.lasttime = now; } From c2e469876230b1b9fd2be46deb0bd8595fcd634f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:24:21 +0300 Subject: [PATCH 568/910] Test --- iguana/exchanges/LP_utxos.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e8cbdd937..aa191f2c9 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -493,12 +493,15 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) HASH_ADD_KEYPTR(hh2,LP_utxoinfos2[iambob],utxo->key2,sizeof(utxo->key2),utxo); portable_mutex_unlock(&LP_utxomutex); - if ( mypubsock >= 0 ) - LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - else if ( iambob != 0 ) - LP_utxo_clientpublish(utxo); - if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) - LP_mypeer->numutxos++; + if ( iambob != 0 ) + { + if ( mypubsock >= 0 ) + LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); + else + LP_utxo_clientpublish(utxo); + if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) + LP_mypeer->numutxos++; + } } return(utxo); } From 4eda8c2d2a77b8d203040cb9baeb4060dfad5969 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:27:20 +0300 Subject: [PATCH 569/910] 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 aa191f2c9..cc8e71922 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -544,7 +544,7 @@ int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t n if ( jobj(item,"txid") != 0 ) { txid = jbits256(item,"txid"); - printf("parse.(%s)\n",jprint(item,0)); + //printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,-1,item)) != 0 ) utxo->T.lasttime = now; } From df63c672096f6d84d2c944ce842acf6d7fa56161 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:34:49 +0300 Subject: [PATCH 570/910] Test --- iguana/exchanges/LP_rpc.c | 5 +++++ iguana/exchanges/LP_utxos.c | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 09534dc89..cab431136 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -84,6 +84,11 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx free(retstr); return(0); } + if ( utxo->iambob == 0 ) + { + printf("issue_LP_notifyutxo trying to send Alice %s/v%d\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout); + return(0); + } u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index cc8e71922..4339493a6 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -267,11 +267,6 @@ int32_t LP_iseligible(uint64_t *valp,uint64_t *val2p,int32_t iambob,char *symbol { uint64_t val,val2=0,threshold; char destaddr[64],destaddr2[64]; destaddr[0] = destaddr2[0] = 0; - if ( iambob == 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) - { - char str[65]; printf("external Alice utxo.(%s) rejected\n",bits256_str(str,txid)); - return(0); - } if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) >= satoshis ) { threshold = (iambob != 0) ? LP_DEPOSITSATOSHIS(satoshis) : LP_DEXFEE(satoshis); From 32664507b4c174200d79bc993da51aab9dd31908 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:38:55 +0300 Subject: [PATCH 571/910] Test --- iguana/exchanges/LP_ordermatch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index af2d2599e..65116d8c4 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -569,13 +569,13 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba vout = jint(item,"vout"); vol = jdouble(item,"volume"); metric = price / bestprice; - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && metric < 1.2 && vol*SATOSHIDEN == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && vol*SATOSHIDEN == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; satoshis = destsatoshis / price; - if ( destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) + if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) { printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; @@ -587,7 +587,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d) destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1) ,destsatoshis/price > (butxo->S.satoshis >> 1),dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1),destsatoshis/price > (butxo->S.satoshis >> 1),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); } } else break; From a00e3d1ad7ec0aca1752a52be8b4dd60f764837f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:40:01 +0300 Subject: [PATCH 572/910] Test --- iguana/exchanges/LP_ordermatch.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 65116d8c4..72d72ff5c 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -619,10 +619,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba sleep(1); } if ( autxo->S.swap == 0 ) - { jaddstr(bestitem,"status","couldnt establish connection"); - LP_availableset(autxo); - } else jaddstr(bestitem,"status","connected"); jaddnum(bestitem,"quotedprice",price); jaddnum(bestitem,"maxprice",maxprice); @@ -642,6 +639,8 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba jaddnum(bestitem,"maxprice",maxprice); jaddstr(bestitem,"status","no response to request"); } + if ( autxo->S.swap == 0 ) + LP_availableset(autxo); return(jprint(bestitem,0)); } From 580c71cd06ea34aa4a6bc2a47dd3a15ce39678b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:42:30 +0300 Subject: [PATCH 573/910] Test --- iguana/exchanges/LP_ordermatch.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 72d72ff5c..0711cc871 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -588,7 +588,13 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba printf("set best!\n"); } } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1),destsatoshis/price > (butxo->S.satoshis >> 1),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); - } else printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); + } + else + { + if ( butxo != 0 ) + printf("%d %d %d: ",vol*SATOSHIDEN == butxo->S.satoshis,LP_isavailable(butxo) > 0,LP_ismine(butxo) == 0); + printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); + } } } else break; } From 93e248c999e207771a085fa1afc4349e854a583a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:44:30 +0300 Subject: [PATCH 574/910] 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 0711cc871..31916e03a 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -592,7 +592,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba else { if ( butxo != 0 ) - printf("%d %d %d: ",vol*SATOSHIDEN == butxo->S.satoshis,LP_isavailable(butxo) > 0,LP_ismine(butxo) == 0); + printf("%llu %llu %d %d %d: ",(long long)vol*SATOSHIDEN,(long long)butxo->S.satoshis,vol*SATOSHIDEN == butxo->S.satoshis,LP_isavailable(butxo) > 0,LP_ismine(butxo) == 0); printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); } } From bb89905db1160d4746146fa65327629cbd178146 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:45:32 +0300 Subject: [PATCH 575/910] 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 31916e03a..fb1e9d442 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -592,7 +592,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba else { if ( butxo != 0 ) - printf("%llu %llu %d %d %d: ",(long long)vol*SATOSHIDEN,(long long)butxo->S.satoshis,vol*SATOSHIDEN == butxo->S.satoshis,LP_isavailable(butxo) > 0,LP_ismine(butxo) == 0); + printf("%llu %llu %d %d %d: ",(long long)(vol*SATOSHIDEN),(long long)butxo->S.satoshis,vol*SATOSHIDEN == butxo->S.satoshis,LP_isavailable(butxo) > 0,LP_ismine(butxo) == 0); printf("cant find butxo.%p or value mismatch %.8f != %.8f\n",butxo,vol,butxo!=0?dstr(butxo->S.satoshis):0); } } From 8596b6e5c20b6fc572b457b6f66cc59b6981730e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:46:50 +0300 Subject: [PATCH 576/910] 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 fb1e9d442..48294f780 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -569,7 +569,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba vout = jint(item,"vout"); vol = jdouble(item,"volume"); metric = price / bestprice; - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && vol*SATOSHIDEN == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && (long long)(vol*SATOSHIDEN) == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) From f2cfa71be3d68b3e79eceda75d868a0312a7def8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:49:34 +0300 Subject: [PATCH 577/910] Test --- iguana/exchanges/LP_nativeDEX.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 2ebdadbef..3f99137c6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -212,7 +212,7 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; - struct LP_utxoinfo *utxo,*utmp; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0; + struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0; now = (uint32_t)time(NULL); if ( mypeer == 0 ) myipaddr = "127.0.0.1"; @@ -263,6 +263,14 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_utxo_clientpublish(utxo); } } + if ( (counter % 600) == 599 ) + { + if ( (retstr= basilisk_swapentry(0,0)) != 0 ) + { + //printf("SWAPS.(%s)\n",retstr); + free(retstr); + } + } if ( pullsock >= 0 ) nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); counter++; @@ -272,11 +280,6 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { char *retstr; uint8_t r; int32_t i,n,j; cJSON *item; - if ( (retstr= basilisk_swapentry(0,0)) != 0 ) - { - //printf("SWAPS.(%s)\n",retstr); - free(retstr); - } if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) { printf("error launching stats rpcloop for port.%u\n",myport); From caa75b4da5b19b34636ff4d1fe701fe0b39f3727 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:50:44 +0300 Subject: [PATCH 578/910] Test --- iguana/exchanges/LP_nativeDEX.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3f99137c6..1e998c33c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -279,12 +279,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { - char *retstr; uint8_t r; int32_t i,n,j; cJSON *item; - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) - { - printf("error launching stats rpcloop for port.%u\n",myport); - exit(-1); - } + uint8_t r; int32_t i,n,j; cJSON *item; if ( IAMLP != 0 ) { if ( seednode == 0 || seednode[0] == 0 ) @@ -324,8 +319,11 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } } //LP_privkey_updates(pubsock,passphrase); - if ( (retstr= basilisk_swaplist()) != 0 ) - free(retstr); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } while ( 1 ) { if ( 0 && (rand() % 100) == 0 ) From 54ef95a9f9c3e424f44760d066745fcbca516855 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:51:46 +0300 Subject: [PATCH 579/910] Test --- iguana/exchanges/LP_nativeDEX.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1e998c33c..18d50e2b5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -319,11 +319,6 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } } //LP_privkey_updates(pubsock,passphrase); - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) - { - printf("error launching stats rpcloop for port.%u\n",myport); - exit(-1); - } while ( 1 ) { if ( 0 && (rand() % 100) == 0 ) @@ -381,6 +376,11 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } } + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } if ( IAMLP != 0 ) { if ( myipaddr != 0 ) From 56345730b056f187cc3c1fb05ac0c1973ac07c68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:53:54 +0300 Subject: [PATCH 580/910] Test --- iguana/exchanges/LP_nativeDEX.c | 13 +++++++------ iguana/exchanges/LP_utxos.c | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 18d50e2b5..0b6c57171 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -190,7 +190,7 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma void LP_myutxo_updates(int32_t pubsock,char *passphrase,double profitmargin) { //LP_utxopurge(0); not good to disrupt existing pointers - LP_privkey_updates(pubsock,passphrase); + LP_privkey_updates(pubsock,passphrase,0); } void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) @@ -376,11 +376,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } } - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) - { - printf("error launching stats rpcloop for port.%u\n",myport); - exit(-1); - } if ( IAMLP != 0 ) { if ( myipaddr != 0 ) @@ -416,6 +411,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit printf("couldnt get myipaddr\n"); exit(-1); } + LP_privkey_updates(pubsock,passphrase,1); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins"),jstr(argjson,"seednode")); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 4339493a6..7640f424b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -756,7 +756,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co return(privkey); } -void LP_privkey_updates(int32_t pubsock,char *passphrase) +void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t initonly) { int32_t i; struct iguana_info *coin; bits256 pubkey,privkey; uint8_t pubkey33[33]; memset(privkey.bytes,0,sizeof(privkey)); @@ -768,7 +768,7 @@ void LP_privkey_updates(int32_t pubsock,char *passphrase) { if ( bits256_nonz(privkey) == 0 || coin->smartaddr[0] == 0 ) privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); - if ( coin->inactive == 0 ) + if ( coin->inactive == 0 && initonly == 0 ) LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33); } } From a31c92fc22e08a57004576dc5de3cee20fe1e7a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 12:57:47 +0300 Subject: [PATCH 581/910] Test --- iguana/exchanges/LP_utxos.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7640f424b..bab077f1a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -763,11 +763,14 @@ void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t initonly) pubkey = privkey; for (i=0; ismartaddr[0] == 0 ) + { + printf("LP_privkeycalc\n"); privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); + } if ( coin->inactive == 0 && initonly == 0 ) LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33); } From 850596d6140bf355e49214cf5cc8ef2c6129d012 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:00:26 +0300 Subject: [PATCH 582/910] Test --- iguana/exchanges/LP_nativeDEX.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0b6c57171..0dc3ab6d1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -318,7 +318,12 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in LP_priceinfoadd(jstr(item,"coin")); } } - //LP_privkey_updates(pubsock,passphrase); + LP_privkey_updates(pubsock,passphrase,1); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } while ( 1 ) { if ( 0 && (rand() % 100) == 0 ) @@ -411,12 +416,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit printf("couldnt get myipaddr\n"); exit(-1); } - LP_privkey_updates(pubsock,passphrase,1); - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) - { - printf("error launching stats rpcloop for port.%u\n",myport); - exit(-1); - } LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins"),jstr(argjson,"seednode")); } From 7381e22678849a12bcd5bedbbe1d713cf2061034 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:04:15 +0300 Subject: [PATCH 583/910] Test --- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_utxos.c | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 535f027fd..1cc3123da 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -51,7 +51,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) } usleep(1000); } - printf("error LP_send sock.%d, pipeline timeout.(%s)\n",sock,msg); + printf("error LP_send sock.%d, pipeline timeout.(%s) %s\n",sock,msg,nn_strerror(nn_errno())); //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index bab077f1a..7640f424b 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -763,14 +763,11 @@ void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t initonly) pubkey = privkey; for (i=0; ismartaddr[0] == 0 ) - { - printf("LP_privkeycalc\n"); privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); - } if ( coin->inactive == 0 && initonly == 0 ) LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33); } From 63225c20e420d913d839b08fa1d3e26ab92e6de8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:11:26 +0300 Subject: [PATCH 584/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +++- iguana/exchanges/LP_network.c | 3 +++ iguana/exchanges/LP_ordermatch.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0dc3ab6d1..4b4ba45d3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -20,6 +20,8 @@ #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; + #include "LP_network.c" struct LP_utxoinfo *LP_utxoinfos[2],*LP_utxoinfos2[2]; @@ -31,7 +33,6 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // -portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -353,6 +354,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit portable_mutex_init(&LP_commandmutex); portable_mutex_init(&LP_swaplistmutex); portable_mutex_init(&LP_cachemutex); + portable_mutex_init(&LP_networkmutex); portable_mutex_init(&LP_forwardmutex); portable_mutex_init(&LP_pubkeymutex); if ( profitmargin == 0. || profitmargin == 0.01 ) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 1cc3123da..6b83a356f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -40,6 +40,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { pfd.fd = sock; pfd.events = NN_POLLOUT; + portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) @@ -47,8 +48,10 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); + portable_mutex_unlock(&LP_networkmutex); return(sentbytes); } + portable_mutex_unlock(&LP_networkmutex); usleep(1000); } printf("error LP_send sock.%d, pipeline timeout.(%s) %s\n",sock,msg,nn_strerror(nn_errno())); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 48294f780..cdac078d2 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -171,7 +171,7 @@ char *LP_quotereceived(cJSON *argjson) if ( (ptr= LP_cacheadd(Q.srccoin,Q.destcoin,Q.txid,Q.vout,price,&Q)) != 0 ) { ptr->Q = Q; - printf("\n>>>>>>>>>> received quote %.8f\n\n",price); + printf(">>>>>>>>>> received quote %s/%s %.8f\n",Q.srccoin,Q.destcoin,price); return(clonestr("{\"result\":\"updated\"}")); } else return(clonestr("{\"error\":\"nullptr\"}")); } From 84dd15d45aea77b8f885f074369a6cbf0c05bbe1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:15:38 +0300 Subject: [PATCH 585/910] 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 4b4ba45d3..111e40623 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -138,6 +138,8 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; + if ( IAMLP == 0 ) + printf("pulled.%d (%s)\n",recvlen,(char *)ptr); LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); } return(nonz); From 262d0a95f07ff59689fe94145b7e2ad20ce48329 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:18:05 +0300 Subject: [PATCH 586/910] Test --- iguana/exchanges/LP_forwarding.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 0b30713c8..b6d36145f 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -58,8 +58,9 @@ int32_t LP_pushsock_create(char *pushaddr) nn_close(pushsock); return(-1); } - timeout = 100; + timeout = 1; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + LP_send(pushsock,"{\"method\":\"hello\"}",0); return(pushsock); } From a4adaa7030ef6e2d2c7a30a31f69eea077680e56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:24:13 +0300 Subject: [PATCH 587/910] Test --- iguana/exchanges/LP_forwarding.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index b6d36145f..eff4f29b8 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -50,7 +50,7 @@ char *LP_lookup(bits256 pubkey) int32_t LP_pushsock_create(char *pushaddr) { - int32_t pushsock,timeout; + int32_t pushsock,timeout,i; struct nn_pollfd pfd; if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) return(-1); else if ( nn_connect(pushsock,pushaddr) < 0 ) @@ -60,7 +60,18 @@ int32_t LP_pushsock_create(char *pushaddr) } timeout = 1; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - LP_send(pushsock,"{\"method\":\"hello\"}",0); + pfd.fd = pushsock; + pfd.events = NN_POLLOUT; + for (i=0; i<1000; i++) + { + if ( nn_poll(&pfd,1,1) > 0 ) + { + LP_send(pushsock,"{\"method\":\"hello\"}",0); + break; + } + } + if ( i == 100 ) + printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,pushaddr); return(pushsock); } From fdf10a96327ddba8304318141417c2ad86bfb10b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:26:10 +0300 Subject: [PATCH 588/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index eff4f29b8..34da1ee06 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -66,7 +66,7 @@ int32_t LP_pushsock_create(char *pushaddr) { if ( nn_poll(&pfd,1,1) > 0 ) { - LP_send(pushsock,"{\"method\":\"hello\"}",0); + printf("HELLO sent.%d bytes\n",LP_send(pushsock,"{\"method\":\"hello\"}",0)); break; } } From acd4a7f32d55dda0edb4901b80ffd0cf6e6fa25f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:29:47 +0300 Subject: [PATCH 589/910] Test --- iguana/exchanges/LP_forwarding.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 34da1ee06..f486faf1b 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -50,27 +50,31 @@ char *LP_lookup(bits256 pubkey) int32_t LP_pushsock_create(char *pushaddr) { - int32_t pushsock,timeout,i; struct nn_pollfd pfd; + int32_t pushsock,timeout,i,n=1000; struct nn_pollfd pfd; if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) + { + printf("LP_pushsock_create couldnt allocate socket for %s\n",pushaddr); return(-1); + } else if ( nn_connect(pushsock,pushaddr) < 0 ) { nn_close(pushsock); + printf("LP_pushsock_create couldnt connect to %s\n",pushaddr); return(-1); } timeout = 1; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); pfd.fd = pushsock; pfd.events = NN_POLLOUT; - for (i=0; i<1000; i++) + for (i=0; i 0 ) { - printf("HELLO sent.%d bytes\n",LP_send(pushsock,"{\"method\":\"hello\"}",0)); + printf("HELLO sent.%d bytes to %s\n",LP_send(pushsock,"{\"method\":\"hello\"}",0),pushaddr); break; } } - if ( i == 100 ) + if ( i == n ) printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,pushaddr); return(pushsock); } From 9a9a53a0b9667d89bd448002ebc671639a3d62dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:31:29 +0300 Subject: [PATCH 590/910] Test --- iguana/exchanges/LP_forwarding.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index f486faf1b..c93cfbc8d 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -50,7 +50,7 @@ char *LP_lookup(bits256 pubkey) int32_t LP_pushsock_create(char *pushaddr) { - int32_t pushsock,timeout,i,n=1000; struct nn_pollfd pfd; + int32_t pushsock,timeout,i,n=1000; char msg[512]; struct nn_pollfd pfd; if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) { printf("LP_pushsock_create couldnt allocate socket for %s\n",pushaddr); @@ -70,7 +70,8 @@ int32_t LP_pushsock_create(char *pushaddr) { if ( nn_poll(&pfd,1,1) > 0 ) { - printf("HELLO sent.%d bytes to %s\n",LP_send(pushsock,"{\"method\":\"hello\"}",0),pushaddr); + sprintf(msg,"{\"method\":\"hello\",\"from\":\"%s\"}",LP_mypeer != 0 ? LP_mypeer->ipaddr : ""); + printf("HELLO sent.%d bytes to %s\n",LP_send(pushsock,msg,0),pushaddr); break; } } From 6b2c6863e1dafda7a198a521d193f60804dce84f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:33:52 +0300 Subject: [PATCH 591/910] Test --- iguana/exchanges/LP_commands.c | 6 +++++- iguana/exchanges/LP_rpc.c | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bcbd2541b..9b1c9867e 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -216,7 +216,11 @@ forwardhex(pubkey,hex)\n\ else if ( IAMLP != 0 ) { if ( strcmp(method,"register") == 0 ) - return(LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr"))); + { + retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); + printf("got (%s) from register\n",retstr!=0?retstr:""); + return(retstr); + } else if ( strcmp(method,"lookup") == 0 ) return(LP_lookup(jbits256(argjson,"client"))); else if ( strcmp(method,"forwardhex") == 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index cab431136..c1cc0bb52 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -106,12 +106,13 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) { - char url[512],str[65]; + char url[512],str[65],*retstr; if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) return(clonestr("{\"error\":\"illegal pushaddr\"}")); sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); - //printf("getutxo.(%s)\n",url); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); + return(retstr); } char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) From c40593cea695ada0aa9d69680ffa32572f3ac0a7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:34:30 +0300 Subject: [PATCH 592/910] 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 c1cc0bb52..7de3a990c 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -110,7 +110,7 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) return(clonestr("{\"error\":\"illegal pushaddr\"}")); sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); - retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + retstr = issue_curlt(url,5); printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); return(retstr); } From bad675684016a5707ad408e1eb1a21efe3555e10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:39:37 +0300 Subject: [PATCH 593/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index c93cfbc8d..b11cbb962 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -50,7 +50,7 @@ char *LP_lookup(bits256 pubkey) int32_t LP_pushsock_create(char *pushaddr) { - int32_t pushsock,timeout,i,n=1000; char msg[512]; struct nn_pollfd pfd; + int32_t pushsock,timeout,i,n=10; char msg[512]; struct nn_pollfd pfd; if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) { printf("LP_pushsock_create couldnt allocate socket for %s\n",pushaddr); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 111e40623..d2c8bc2f8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -227,6 +227,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } HASH_ITER(hh,LP_peerinfos,peer,tmp) { + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { printf("numpeers.%d updatepeer.%s lag.%d\n",numpeers,peer->ipaddr,now-peer->lastpeers); @@ -246,10 +247,12 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } if ( (counter % 600) == 60 ) { + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { LP_forwarding_register(LP_mypubkey,pushaddr,10); + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); lastforward = now; } } @@ -257,10 +260,12 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) { + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_utxo_spentcheck(pubsock,utxo,profitmargin); } HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) { + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); @@ -268,14 +273,14 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } if ( (counter % 600) == 599 ) { + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) { //printf("SWAPS.(%s)\n",retstr); free(retstr); } } - if ( pullsock >= 0 ) - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); + nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); counter++; return(nonz); } @@ -380,7 +385,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 1; maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } From d2fea638633dfed2153b7c92c50feea5b4ab49e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:41:54 +0300 Subject: [PATCH 594/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 9b1c9867e..57454830f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -218,7 +218,7 @@ forwardhex(pubkey,hex)\n\ if ( strcmp(method,"register") == 0 ) { retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); - printf("got (%s) from register\n",retstr!=0?retstr:""); + //printf("got (%s) from register\n",retstr!=0?retstr:""); return(retstr); } else if ( strcmp(method,"lookup") == 0 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 7de3a990c..0003c99da 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -110,8 +110,8 @@ char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *push if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) return(clonestr("{\"error\":\"illegal pushaddr\"}")); sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); - retstr = issue_curlt(url,5); - printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); + retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); return(retstr); } From 123b9538f6e2efb47a4e46d9661533fb60cd0ed6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:51:15 +0300 Subject: [PATCH 595/910] Test --- iguana/exchanges/LP_forwarding.c | 56 ++++++++++++++++++++++---------- iguana/exchanges/LP_nativeDEX.c | 2 ++ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index b11cbb962..3ded921fd 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -24,7 +24,7 @@ struct LP_forwardinfo bits256 pubkey; char pushaddr[64]; int32_t pushsock; - uint32_t lasttime; + uint32_t lasttime,hello; } *LP_forwardinfos; #define LP_KEEPALIVE (3600 * 24) @@ -48,9 +48,39 @@ char *LP_lookup(bits256 pubkey) else return(clonestr("{\"error\":\"notfound\"}")); } -int32_t LP_pushsock_create(char *pushaddr) +int32_t LP_hello(struct LP_forwardinfo *ptr) { - int32_t pushsock,timeout,i,n=10; char msg[512]; struct nn_pollfd pfd; + int32_t i,n=10; char msg[512]; struct nn_pollfd pfd; + pfd.fd = ptr->pushsock; + pfd.events = NN_POLLOUT; + for (i=0; i 0 ) + { + sprintf(msg,"{\"method\":\"hello\",\"from\":\"%s\"}",LP_mypeer != 0 ? LP_mypeer->ipaddr : ""); + printf("HELLO sent.%d bytes to %s on i.%d\n",LP_send(ptr->pushsock,msg,0),ptr->pushaddr,i); + ptr->hello = (uint32_t)time(NULL); + return(i); + } + } + printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); + return(-1); +} + +int32_t LP_hellos() +{ + struct LP_forwardinfo *ptr,*tmp; int32_t nonz = 0; + HASH_ITER(hh,LP_forwardinfos,ptr,tmp) + { + if ( ptr->hello == 0 && LP_hello(ptr) >= 0 ) + nonz++; + } + return(nonz); +} + +int32_t LP_pushsock_create(struct LP_forwardinfo *ptr,char *pushaddr) +{ + int32_t pushsock,timeout; if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) { printf("LP_pushsock_create couldnt allocate socket for %s\n",pushaddr); @@ -64,19 +94,8 @@ int32_t LP_pushsock_create(char *pushaddr) } timeout = 1; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - pfd.fd = pushsock; - pfd.events = NN_POLLOUT; - for (i=0; i 0 ) - { - sprintf(msg,"{\"method\":\"hello\",\"from\":\"%s\"}",LP_mypeer != 0 ? LP_mypeer->ipaddr : ""); - printf("HELLO sent.%d bytes to %s\n",LP_send(pushsock,msg,0),pushaddr); - break; - } - } - if ( i == n ) - printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,pushaddr); + if ( ptr != 0 ) + LP_hello(ptr); return(pushsock); } @@ -96,12 +115,12 @@ char *LP_register(bits256 pubkey,char *ipaddr) { nn_close(ptr->pushsock); printf("recreate pushsock for %s\n",pushaddr); - if ( (ptr->pushsock= LP_pushsock_create(pushaddr)) < 0 ) + if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); } return(clonestr("{\"error\":\"already registered\",\"registered\":1}")); } - else if ( (pushsock= LP_pushsock_create(pushaddr)) < 0 ) + else if ( (pushsock= LP_pushsock_create(0,pushaddr)) < 0 ) return(clonestr("{\"error\":\"couldnt create pushsock\"}")); else { @@ -114,6 +133,7 @@ char *LP_register(bits256 pubkey,char *ipaddr) HASH_ADD_KEYPTR(hh,LP_forwardinfos,&ptr->pubkey,sizeof(ptr->pubkey),ptr); portable_mutex_unlock(&LP_forwardmutex); char str[65]; printf("registered (%s) -> (%s) pushsock.%d\n",bits256_str(str,pubkey),pushaddr,ptr->pushsock); + LP_hello(ptr); return(LP_lookup(pubkey)); } } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d2c8bc2f8..59929ce45 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -281,6 +281,8 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } } nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); + if ( (counter % 60) == 42 ) + LP_hellos(); counter++; return(nonz); } From ae9be1f4d8e82b3ab692e42fa521fcd6312f2f26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:54:43 +0300 Subject: [PATCH 596/910] Test --- iguana/exchanges/LP_forwarding.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 3ded921fd..fac22d1f0 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -51,20 +51,24 @@ char *LP_lookup(bits256 pubkey) int32_t LP_hello(struct LP_forwardinfo *ptr) { int32_t i,n=10; char msg[512]; struct nn_pollfd pfd; - pfd.fd = ptr->pushsock; - pfd.events = NN_POLLOUT; - for (i=0; ipubkey,LP_mypubkey) != 0 ) { - if ( nn_poll(&pfd,1,1) > 0 ) + pfd.fd = ptr->pushsock; + pfd.events = NN_POLLOUT; + for (i=0; iipaddr : ""); - printf("HELLO sent.%d bytes to %s on i.%d\n",LP_send(ptr->pushsock,msg,0),ptr->pushaddr,i); - ptr->hello = (uint32_t)time(NULL); - return(i); + if ( nn_poll(&pfd,1,1) > 0 ) + { + sprintf(msg,"{\"method\":\"hello\",\"from\":\"%s\"}",LP_mypeer != 0 ? LP_mypeer->ipaddr : ""); + printf("HELLO sent.%d bytes to %s on i.%d\n",LP_send(ptr->pushsock,msg,0),ptr->pushaddr,i); + ptr->hello = (uint32_t)time(NULL); + return(i); + } } + printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); + return(-1); } - printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); - return(-1); + return(0); } int32_t LP_hellos() From fec438de939c44dbbe67f8cf91c7c0a38f3b6dce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:57:41 +0300 Subject: [PATCH 597/910] Test --- iguana/exchanges/LP_forwarding.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index fac22d1f0..7962e0273 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -203,7 +203,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) } else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { - if ( ptr->pushsock >= 0 ) + if ( ptr->pushsock >= 0 && ptr->hello != 0 ) { //printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,0); @@ -220,6 +220,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) jaddstr(retjson,"error","send error"); jaddnum(retjson,"sentbytes",sentbytes); jaddnum(retjson,"datalen",datalen); + jaddnum(retjson,"hello",ptr->hello); retstr = jprint(retjson,1); } } From ed7fe542ce498f36f3f6e98aa65d96a4620b8221 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 13:59:17 +0300 Subject: [PATCH 598/910] Test --- iguana/exchanges/LP_commands.c | 4 +++- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 57454830f..92deb8e0f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -50,7 +50,9 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs printf("stats_JSON no method: (%s) (%s:%u)\n",jprint(argjson,0),ipaddr,argport); return(0); } - if ( strcmp(method,"help") == 0 ) + if ( strcmp(method,"hello") == 0 ) + return(0); + else if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ available localhost RPC commands:\n \ setprice(base, rel, price)\n\ diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 7962e0273..2c6e573e8 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -65,7 +65,7 @@ int32_t LP_hello(struct LP_forwardinfo *ptr) return(i); } } - printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); + //printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); return(-1); } return(0); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 59929ce45..c40d28861 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -281,7 +281,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } } nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); - if ( (counter % 60) == 42 ) + if ( (counter % 600) == 42 ) LP_hellos(); counter++; return(nonz); From b040ca290f347a47a4daf42cc30069866e9674af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:36:19 +0300 Subject: [PATCH 599/910] Test --- iguana/exchanges/LP_rpc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 0003c99da..fd0ff067f 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -59,9 +59,12 @@ char *issue_LP_getutxos(char *destip,uint16_t destport,char *coin,int32_t lastn, char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t lastn) { - char url[512]; + char url[512],*retstr; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + + printf("%s clientgetutxos.(%s)\n",url,retstr); + return(retstr); } char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) From b585a93f1097d9b816cc8a932240c73b067ef196 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:40:11 +0300 Subject: [PATCH 600/910] 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 c40d28861..c3dc3f9b8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -207,6 +207,7 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso if ( mypeer == 0 || strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) { peer->lastutxos = now; + printf("query utxos from %s\n",peer->ipaddr); LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } //else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); From 7abecd195c1a6b53dd2a093d22ff7784a0546739 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:43:11 +0300 Subject: [PATCH 601/910] 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 c3dc3f9b8..862778207 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -241,6 +241,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso nonz += LP_subsock_check(myipaddr,pubsock,peer->subsock,profitmargin); if ( peer->diduquery == 0 ) { + printf("do initial queries\n"); LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; From cf631adfaa35b9664244370a48ac5ccdb4f26284 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:44:59 +0300 Subject: [PATCH 602/910] 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 862778207..a3de37bf3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -247,6 +247,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso peer->diduquery = now; } } + printf("counter.%d numpeers %d\n",counter,numpeers); if ( (counter % 600) == 60 ) { nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); From 0b53fc75843b6a8f1d500af60e5eeaf13c775a94 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:46:26 +0300 Subject: [PATCH 603/910] 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 a3de37bf3..f64997a06 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -394,6 +394,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } } + printf("my command address is (%s)\n",pushaddr); if ( IAMLP != 0 ) { if ( myipaddr != 0 ) From bb8dde925c7613c99e52a053e82ff92f6e502117 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:48:42 +0300 Subject: [PATCH 604/910] Test --- iguana/exchanges/LP_nativeDEX.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f64997a06..218bf1cd2 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -220,12 +220,13 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso now = (uint32_t)time(NULL); if ( mypeer == 0 ) myipaddr = "127.0.0.1"; - //printf("start peers updates\n"); + printf("start peers updates\n"); numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { numpeers++; } + printf("counter.%d numpeers %d\n",counter,numpeers); HASH_ITER(hh,LP_peerinfos,peer,tmp) { nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); @@ -319,6 +320,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } for (i=0; i Date: Sun, 18 Jun 2017 14:50:35 +0300 Subject: [PATCH 605/910] Test --- iguana/exchanges/LP_nativeDEX.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 218bf1cd2..9023925f6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -229,7 +229,6 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso printf("counter.%d numpeers %d\n",counter,numpeers); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { printf("numpeers.%d updatepeer.%s lag.%d\n",numpeers,peer->ipaddr,now-peer->lastpeers); @@ -239,7 +238,6 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso if ( strcmp(peer->ipaddr,myipaddr) != 0 ) LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); } - nonz += LP_subsock_check(myipaddr,pubsock,peer->subsock,profitmargin); if ( peer->diduquery == 0 ) { printf("do initial queries\n"); @@ -251,12 +249,10 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso printf("counter.%d numpeers %d\n",counter,numpeers); if ( (counter % 600) == 60 ) { - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { LP_forwarding_register(LP_mypubkey,pushaddr,10); - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); lastforward = now; } } @@ -264,12 +260,10 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) { - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_utxo_spentcheck(pubsock,utxo,profitmargin); } HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) { - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); @@ -277,16 +271,18 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } if ( (counter % 600) == 599 ) { - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); + printf("check swaps\n"); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) { //printf("SWAPS.(%s)\n",retstr); free(retstr); } } + printf("check pullsock\n"); nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); - if ( (counter % 600) == 42 ) + if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); + printf("done pullsock\n"); counter++; return(nonz); } From 391a8b5ed0a061c3c4b6bbaa21dfb761c44f9b7c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:52:50 +0300 Subject: [PATCH 606/910] 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 9023925f6..ef7875a04 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -135,8 +135,10 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { void *ptr; int32_t recvlen,nonz = 0; + printf("call nn_recv\n"); while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { + printf("got %d\n",recvlen); nonz++; if ( IAMLP == 0 ) printf("pulled.%d (%s)\n",recvlen,(char *)ptr); From c8d84d722b7032ed5c92d3d027db13544ad9072c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:54:52 +0300 Subject: [PATCH 607/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ef7875a04..7ea1870a3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -392,8 +392,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - maxsize = 2 * 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + //maxsize = 2 * 1024 * 1024; + //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } } printf("my command address is (%s)\n",pushaddr); From c28f94520a829063a98fe8ac720f93c3ce72c8cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:58:20 +0300 Subject: [PATCH 608/910] Test --- iguana/exchanges/LP_nativeDEX.c | 21 ++++++++++----------- iguana/exchanges/LP_rpc.c | 3 +-- iguana/exchanges/LP_utxos.c | 9 +++++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7ea1870a3..6d2fc9368 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -198,9 +198,9 @@ void LP_myutxo_updates(int32_t pubsock,char *passphrase,double profitmargin) LP_privkey_updates(pubsock,passphrase,0); } -void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) +int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) { - int32_t lastn; + int32_t lastn,n = -1; if ( peer->lastutxos < now-interval ) { //lastn = peer->numutxos - mypeer->numutxos + LP_PROPAGATION_SLACK; @@ -210,25 +210,24 @@ void LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubso { peer->lastutxos = now; printf("query utxos from %s\n",peer->ipaddr); - LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); + n = LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } //else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); + return(n); } int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; - struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0; + struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; now = (uint32_t)time(NULL); if ( mypeer == 0 ) myipaddr = "127.0.0.1"; - printf("start peers updates\n"); numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { numpeers++; } - printf("counter.%d numpeers %d\n",counter,numpeers); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) @@ -242,13 +241,15 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } if ( peer->diduquery == 0 ) { - printf("do initial queries\n"); - LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); + if ( lastn != n || n < 20 ) + { + lastn = n; + n = LP_peer_utxosquery(mypeer,myport,pubsock,peer,now,profitmargin,60); + } LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; } } - printf("counter.%d numpeers %d\n",counter,numpeers); if ( (counter % 600) == 60 ) { LP_myutxo_updates(pubsock,passphrase,profitmargin); @@ -280,11 +281,9 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - printf("check pullsock\n"); nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); - printf("done pullsock\n"); counter++; return(nonz); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index fd0ff067f..c624cd7ac 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -62,8 +62,7 @@ char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t char url[512],*retstr; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); retstr = issue_curlt(url,LP_HTTP_TIMEOUT); - - printf("%s clientgetutxos.(%s)\n",url,retstr); + //printf("%s clientgetutxos.(%s)\n",url,retstr); return(retstr); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 7640f424b..e84276fb0 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -554,9 +554,9 @@ int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t n return(n); } -void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *coin,int32_t lastn,char *myipaddr,uint16_t myport,double myprofit) +int32_t LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr,uint16_t destport,char *coin,int32_t lastn,char *myipaddr,uint16_t myport,double myprofit) { - char *retstr; struct LP_peerinfo *peer; uint32_t now; + char *retstr; struct LP_peerinfo *peer; uint32_t now; int32_t retval = -1; peer = LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport); if ( coin == 0 ) coin = ""; @@ -567,7 +567,7 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr if ( retstr != 0 ) { now = (uint32_t)time(NULL); - LP_utxosparse(destipaddr,destport,retstr,now); + retval = LP_utxosparse(destipaddr,destport,retstr,now); //printf("got.(%s)\n",retstr); free(retstr); /*i = 0; @@ -588,7 +588,8 @@ void LP_utxosquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr } if ( flag != 0 ) printf(" <- missing utxos\n");*/ - } + } + return(retval); } cJSON *LP_inventory(char *symbol,int32_t iambob) From 738e3ef8c46e7a983f5528665bb666266de42cbe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 14:59:51 +0300 Subject: [PATCH 609/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6d2fc9368..f8811e832 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -349,7 +349,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128]; + char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128]; IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 6b83a356f..b2f820216 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -40,7 +40,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) { pfd.fd = sock; pfd.events = NN_POLLOUT; - portable_mutex_lock(&LP_networkmutex); + //portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) @@ -48,10 +48,10 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); - portable_mutex_unlock(&LP_networkmutex); + //portable_mutex_unlock(&LP_networkmutex); return(sentbytes); } - portable_mutex_unlock(&LP_networkmutex); + //portable_mutex_unlock(&LP_networkmutex); usleep(1000); } printf("error LP_send sock.%d, pipeline timeout.(%s) %s\n",sock,msg,nn_strerror(nn_errno())); From d766303be962cda99ef24d7c1ec7dd8bc76d37ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:02:32 +0300 Subject: [PATCH 610/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_statemachine.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index f8811e832..927cfb3dd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -136,7 +136,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double { void *ptr; int32_t recvlen,nonz = 0; printf("call nn_recv\n"); - while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { printf("got %d\n",recvlen); nonz++; @@ -150,7 +150,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { int32_t recvlen,nonz = 0; void *ptr; - while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) + while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { nonz++; LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen); diff --git a/iguana/exchanges/LP_statemachine.c b/iguana/exchanges/LP_statemachine.c index f42043ab3..70e6d1c7b 100644 --- a/iguana/exchanges/LP_statemachine.c +++ b/iguana/exchanges/LP_statemachine.c @@ -204,7 +204,7 @@ void basilisk_swapgotdata(struct basilisk_swap *swap,uint32_t crc32,bits256 srch int32_t basilisk_swapget(struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; - while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) + while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { swap->lasttime = (uint32_t)time(NULL); memset(srchash.bytes,0,sizeof(srchash)); From 9ead3107d7c952d7c499ad17fbd0891929985b71 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:03:18 +0300 Subject: [PATCH 611/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 927cfb3dd..ca7eccd2c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -135,10 +135,8 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { void *ptr; int32_t recvlen,nonz = 0; - printf("call nn_recv\n"); while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { - printf("got %d\n",recvlen); nonz++; if ( IAMLP == 0 ) printf("pulled.%d (%s)\n",recvlen,(char *)ptr); From 24f201bb367c9601f009b8ddb82028afe13f5f76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:06:37 +0300 Subject: [PATCH 612/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ca7eccd2c..c7f3f1444 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -101,7 +101,8 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - //printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); + if ( IAMLP == 0 ) + printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { len = (int32_t)strlen(jsonstr) + 1; @@ -138,8 +139,6 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { nonz++; - if ( IAMLP == 0 ) - printf("pulled.%d (%s)\n",recvlen,(char *)ptr); LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); } return(nonz); From 57f4c10b04a40faa75fed7763db009bfa3a0a284 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:18:16 +0300 Subject: [PATCH 613/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 2c6e573e8..7e537d3f0 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -203,7 +203,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) } else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { - if ( ptr->pushsock >= 0 && ptr->hello != 0 ) + if ( ptr->pushsock >= 0 )//&& ptr->hello != 0 ) { //printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,0); From 77dc0f63f6ed7f93aeee4932fe40380c5f62a93f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:20:49 +0300 Subject: [PATCH 614/910] 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 c7f3f1444..693d498f8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -246,6 +246,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; } + nonz += LP_subsock_check(myipaddr,pubsock,peer->subsock,profitmargin); } if ( (counter % 600) == 60 ) { @@ -271,7 +272,6 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } if ( (counter % 600) == 599 ) { - printf("check swaps\n"); if ( (retstr= basilisk_swapentry(0,0)) != 0 ) { //printf("SWAPS.(%s)\n",retstr); From b4b56dbf19b8604f3432a8bafcc9565d8bd3b930 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:29:18 +0300 Subject: [PATCH 615/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_ordermatch.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index b66e2c47c..da587d194 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -26,6 +26,7 @@ #define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 #define LP_MIN_TXFEE 10000 +#define LP_MINVOL 3 #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index cdac078d2..20a3acc61 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -268,12 +268,12 @@ double LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop return(-11); } qprice = ((double)qp->destsatoshis / qp->satoshis); - if ( qp->satoshis < (srcvalue >> 1) ) + if ( qp->satoshis < (srcvalue >> LP_MINVOL) ) { printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(srcvalue),dstr(qp->satoshis)); return(-12); } - if ( qp->destsatoshis < (destvalue >> 1) ) + if ( qp->destsatoshis < (destvalue >> LP_MINVOL) ) { printf("destsatoshis %.8f is less than half of value %.8f\n",dstr(qp->destsatoshis),dstr(destvalue)); return(-13); @@ -575,7 +575,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; satoshis = destsatoshis / price; - if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> 1) && satoshis-txfee > (butxo->S.satoshis >> 1) && satoshis < butxo->payment.value-txfee ) + if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis < butxo->payment.value-txfee ) { printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; @@ -587,7 +587,7 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> 1),destsatoshis/price > (butxo->S.satoshis >> 1),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> LP_MINVOL),destsatoshis/price > (butxo->S.satoshis >> LP_MINVOL),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } else { From c75ffee2500d2dc332c4e651019cc0bffb8ccf0a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 15:39:38 +0300 Subject: [PATCH 616/910] 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 693d498f8..591265d0d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -101,7 +101,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - if ( IAMLP == 0 ) + if ( 0 && IAMLP == 0 ) printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { From 2de0639d79aea06a50a7a97d2d9fc7e72d6ed443 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 20:09:58 +0300 Subject: [PATCH 617/910] Test --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index f166a52e6..ca8b97239 100755 --- a/.gitignore +++ b/.gitignore @@ -467,3 +467,7 @@ iguana/DB/SWAPS/1819165332-1507632737 iguana/DB/SWAPS/283982730-556239841 iguana/marketmaker.dSYM/Contents/Info.plist + +iguana/client + +iguana/marketmaker.dSYM/Contents/Resources/DWARF/marketmaker From 4ad4e8563bdb124c713a6414a194ad290da068c1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 20:58:04 +0300 Subject: [PATCH 618/910] Test --- iguana/exchanges/mm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 05b95a9a8..a80982185 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -28,7 +28,8 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs #include "stats.c" void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); -#if defined(__APPLE__) || defined(WIN32) || defined(USE_STATIC_NANOMSG) +//defined(__APPLE__) || +#if defined(WIN32) || defined(USE_STATIC_NANOMSG) #include "../../crypto777/nanosrc/nn.h" #include "../../crypto777/nanosrc/bus.h" #include "../../crypto777/nanosrc/pubsub.h" From 811129820c975a31aaa5c8b0d861229eeb24e1ec Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:19:41 +0300 Subject: [PATCH 619/910] Test --- iguana/exchanges/LP_nativeDEX.c | 14 +++++++++++--- iguana/exchanges/LP_ordermatch.c | 8 +++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 591265d0d..794f98dff 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -344,9 +344,14 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } } +void nn_tests() +{ + +} + void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128]; + char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); @@ -382,9 +387,11 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); + nn_tests(); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { - if ( nn_bind(pullsock,pushaddr) >= 0 ) + nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); + if ( nn_bind(pullsock,bindaddr) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -399,9 +406,10 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { pubsock = -1; nanomsg_tcpname(subaddr,myipaddr,mypubport); + nanomsg_tcpname(bindaddr,"0.0.0.0",mypubport); if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { - if ( nn_bind(pubsock,subaddr) >= 0 ) + if ( nn_bind(pubsock,bindaddr) >= 0 ) { timeout = 10; nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 20a3acc61..d48b70548 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -340,11 +340,13 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) { - int32_t i,timeout; + int32_t i,timeout,r; char bindaddr[128]; for (i=0; i<10; i++) { - nanomsg_tcpname(pairstr,myipaddr,10000+(rand() % 50000)); - if ( nn_bind(pair,pairstr) >= 0 ) + r = (10000 + (rand() % 50000)) & 0xffff; + nanomsg_tcpname(pairstr,myipaddr,r); + nanomsg_tcpname(bindaddr,myipaddr,r); + if ( nn_bind(pair,bindaddr) >= 0 ) { timeout = 100; nn_setsockopt(pair,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); From 44ae52415447987e4b2d5148bdca453060ec6ec2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:24:47 +0300 Subject: [PATCH 620/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 794f98dff..c42b83a90 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -397,7 +397,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); //maxsize = 2 * 1024 * 1024; //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - } + } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } printf("my command address is (%s)\n",pushaddr); if ( IAMLP != 0 ) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index d48b70548..0f82b46b0 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -353,7 +353,7 @@ int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) nn_setsockopt(pair,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("nanobind %s to %d\n",pairstr,pair); return(0); - } + } else printf("error binding to %s for %s\n",bindaddr,pairstr); } return(-1); } From 0973c5e218844d227a6a487b5f19623e08823b5f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:26:50 +0300 Subject: [PATCH 621/910] 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 c42b83a90..a0b69d234 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -399,7 +399,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } - printf("my command address is (%s)\n",pushaddr); + printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); if ( IAMLP != 0 ) { if ( myipaddr != 0 ) From 2946510a21af99ac392803fcb317fbe728bbedf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:27:49 +0300 Subject: [PATCH 622/910] 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 a0b69d234..1949357a9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,7 +346,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests() { - + nn_socket(AF_SP,NN_BUS); } void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) From 0ca4561fc11cfca6a9678ee65c26e2a92f03cd29 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:30:55 +0300 Subject: [PATCH 623/910] test --- iguana/exchanges/LP_nativeDEX.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1949357a9..bc6c7a40f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -344,9 +344,19 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } } -void nn_tests() +void nn_tests(char *pushaddr) { - nn_socket(AF_SP,NN_BUS); + int32_t sock,n; + if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) + { + if ( nn_connect(sock,pushaddr) < 0 ) + printf("connect error %s\n",nn_strerror(nn_errno())); + else + { + n = LP_send(sock,"nn_tests",0); + printf("sent %d bytes\n",n); + } + } } void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) @@ -387,7 +397,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - nn_tests(); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); @@ -399,6 +408,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } + nn_tests(pushaddr); printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); if ( IAMLP != 0 ) { From e347e3b1c5b91104fb19229a53192387d83b2c2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:34:18 +0300 Subject: [PATCH 624/910] 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 bc6c7a40f..6b929623a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -399,7 +399,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { - nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); + nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { timeout = 1; From a7b629e579fe6d93022312c1ea5c5d30889607df Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:40:44 +0300 Subject: [PATCH 625/910] Test --- iguana/exchanges/LP_nativeDEX.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6b929623a..0c63d2c16 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -361,7 +361,7 @@ void nn_tests(char *pushaddr) void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; + char *myipaddr=0; long filesize,n; int32_t maxsize,timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); @@ -399,13 +399,13 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { + timeout = 100; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - //maxsize = 2 * 1024 * 1024; - //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + maxsize = 2 * 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } nn_tests(pushaddr); From f5d0d3dc669ea40be4a497484ecdfa1ecbd2330b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 21:56:54 +0300 Subject: [PATCH 626/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0c63d2c16..95c0d966d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -401,7 +401,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { timeout = 100; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); + nanomsg_tcpname(bindaddr,myipaddr,mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { maxsize = 2 * 1024 * 1024; @@ -416,7 +416,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { pubsock = -1; nanomsg_tcpname(subaddr,myipaddr,mypubport); - nanomsg_tcpname(bindaddr,"0.0.0.0",mypubport); + nanomsg_tcpname(bindaddr,myipaddr,mypubport); if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { if ( nn_bind(pubsock,bindaddr) >= 0 ) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 0f82b46b0..2790df60c 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -345,7 +345,7 @@ int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) { r = (10000 + (rand() % 50000)) & 0xffff; nanomsg_tcpname(pairstr,myipaddr,r); - nanomsg_tcpname(bindaddr,myipaddr,r); + nanomsg_tcpname(bindaddr,"0.0.0.0",r); if ( nn_bind(pair,bindaddr) >= 0 ) { timeout = 100; From abd3054fb60818c2dbba5d57c7d120f254cf55c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:10:40 +0300 Subject: [PATCH 627/910] 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 95c0d966d..070eb314d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -401,7 +401,11 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { timeout = 100; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); +#ifdef __APPLE__ + nanomsg_tcpname(bindaddr,"eth0",mypullport); +#else nanomsg_tcpname(bindaddr,myipaddr,mypullport); +#endif if ( nn_bind(pullsock,bindaddr) >= 0 ) { maxsize = 2 * 1024 * 1024; From bb6d25858eeacbd47e0fcfb539fe9218bd373839 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:19:20 +0300 Subject: [PATCH 628/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_ordermatch.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 070eb314d..0a4c4b334 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -402,7 +402,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 100; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"eth0",mypullport); + nanomsg_tcpname(bindaddr,"*",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 2790df60c..b19679ae3 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -345,7 +345,11 @@ int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) { r = (10000 + (rand() % 50000)) & 0xffff; nanomsg_tcpname(pairstr,myipaddr,r); - nanomsg_tcpname(bindaddr,"0.0.0.0",r); +#ifdef __APPLE__ + nanomsg_tcpname(bindaddr,"*",r); +#else + nanomsg_tcpname(bindaddr,myipaddr,r); +#endif if ( nn_bind(pair,bindaddr) >= 0 ) { timeout = 100; From ddbd1e9dc1f37234d7fb78e45a8653e9111796ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:20:01 +0300 Subject: [PATCH 629/910] 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 0a4c4b334..b33d8827b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -399,7 +399,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { - timeout = 100; + timeout = 10000; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"*",mypullport); From 8cf858ab646126d9f7cc50921ae3bd81d45ee10d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:21:44 +0300 Subject: [PATCH 630/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b33d8827b..b1dab346c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -399,7 +399,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { - timeout = 10000; + timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"*",mypullport); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b2f820216..eb75a8e34 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { - if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) + if ( (sentbytes= nn_send(sock,msg,len,NN_DONTWAIT)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) From 592c1b3a6611ea37b7ea4328a4c8ef640dd1f990 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:23:29 +0300 Subject: [PATCH 631/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b1dab346c..e7b927ed6 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,7 +353,8 @@ void nn_tests(char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - n = LP_send(sock,"nn_tests",0); + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,NN_DONTWAIT); + // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); } } From 1e557a607dd7677c7782be666c2b03f5521c4a10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:24:31 +0300 Subject: [PATCH 632/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e7b927ed6..7bfc15d83 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,7 +353,7 @@ void nn_tests(char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,NN_DONTWAIT); + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index eb75a8e34..4a328a213 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -43,7 +43,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { - if ( (sentbytes= nn_send(sock,msg,len,NN_DONTWAIT)) != len ) + if ( (sentbytes= nn_send(sock,msg,len,0*NN_DONTWAIT)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) From 3680d4fb4b89e0f019fbc27c06ed02f3c0a850d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:28:27 +0300 Subject: [PATCH 633/910] 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 7bfc15d83..85fd808c9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,7 +403,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",mypullport); + nanomsg_tcpname(bindaddr,"en0",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From e1e3c1d38b2dbf4949009b9786ebaac86ad41d7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:31:12 +0300 Subject: [PATCH 634/910] 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 85fd808c9..7bfc15d83 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,7 +403,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"en0",mypullport); + nanomsg_tcpname(bindaddr,"*",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 8982a16594b15333e32d4f34450e04555d5be7ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:34:22 +0300 Subject: [PATCH 635/910] Test --- iguana/exchanges/LP_nativeDEX.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7bfc15d83..0390d6cc9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -344,17 +344,20 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in } } -void nn_tests(char *pushaddr) +void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n; + int32_t sock,n,timeout; if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { + timeout = 1000; + nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - // n = LP_send(sock,"nn_tests",0); + LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); } } @@ -411,9 +414,10 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + LP_pullsock_check(myipaddr,-1,pullsock,0.); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } - nn_tests(pushaddr); + nn_tests(pullsock,pushaddr); printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); if ( IAMLP != 0 ) { From 37477da46ce40a549b8fa743bdb3aa6fe17acd8e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:35:05 +0300 Subject: [PATCH 636/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0390d6cc9..4c81fc778 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout; - if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -401,7 +401,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From 441ac65b71eac07b1f8a0780a4a1fcbf7495c9c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:36:00 +0300 Subject: [PATCH 637/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4c81fc778..d51900fa2 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout; - if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -401,7 +401,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From 68e08938df89563bf78f85285fe899149e20a88d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:51:47 +0300 Subject: [PATCH 638/910] Test --- iguana/exchanges/LP_nativeDEX.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d51900fa2..fbf9cde25 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,14 +346,15 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout; + int32_t sock,n,timeout,sndprio = 1; if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 1000; + timeout = 100; + nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); @@ -365,7 +366,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t maxsize,timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; + char *myipaddr=0; long filesize,n; int32_t rcvprio,maxsize,timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); @@ -404,7 +405,9 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit if ( (pullsock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { timeout = 1; + rcvprio = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"*",mypullport); #else From 045c6aa0145f45ac7999a68ce03d46bec23fef2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 22:52:37 +0300 Subject: [PATCH 639/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fbf9cde25..aa36463e0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,10 +353,10 @@ void nn_tests(int32_t pullsock,char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 100; + timeout = 3000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); From a8b73d77b3b42740fbdeb6a61dd5cf3ef5553d56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:00:09 +0300 Subject: [PATCH 640/910] Test --- iguana/exchanges/LP_nativeDEX.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index aa36463e0..dae7a1388 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,15 +346,15 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,sndprio = 1; - if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) + int32_t sock,n,timeout;//,sndprio = 1; + if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 3000; - nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); + timeout = 100; + //nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); @@ -366,7 +366,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t rcvprio,maxsize,timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; + char *myipaddr=0; long filesize,n; int32_t maxsize,timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; IAMLP = !amclient; LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); @@ -402,12 +402,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) { timeout = 1; - rcvprio = 1; + //rcvprio = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); + //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"*",mypullport); #else From 4c5b6727e2f6363bdbb0d7f0c4d79e2537779473 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:02:12 +0300 Subject: [PATCH 641/910] Test --- iguana/exchanges/LP_nativeDEX.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index dae7a1388..b17303474 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,9 +353,11 @@ void nn_tests(int32_t pullsock,char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 100; + timeout = 1; //nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1000; + nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); @@ -407,6 +409,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; //rcvprio = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 100; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"*",mypullport); From 7ccded019b4e7d3915a2a210a005330b4999b4b5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:03:40 +0300 Subject: [PATCH 642/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b17303474..9325751f1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -101,7 +101,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - if ( 0 && IAMLP == 0 ) + if ( 1 && IAMLP == 0 ) printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { @@ -139,7 +139,8 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { nonz++; - LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); + //LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); + LP_process_message("PULL",myipaddr,pullsock,profitmargin,ptr,recvlen); } return(nonz); } From 53ef74e20eab41b577b308184c9aae2169246663 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:06:39 +0300 Subject: [PATCH 643/910] Test --- iguana/exchanges/LP_commands.c | 5 +++++ iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 92deb8e0f..2a22c49c6 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -52,6 +52,11 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs } if ( strcmp(method,"hello") == 0 ) return(0); + else if ( strcmp(method,"nn_tests") == 0 ) + { + LP_send(pubsock,"nn_test return",0); + return(0); + } else if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ available localhost RPC commands:\n \ diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9325751f1..fad2d3d0d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -359,7 +359,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0); + n = nn_send(sock,"{\"method\":\"nn_tests\"}",(int32_t)strlen("{\"method\":\"nn_tests\"}")+1,0); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); From e067601abf0cd784813b8a3f0ddaa551b8568692 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:07:25 +0300 Subject: [PATCH 644/910] 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 fad2d3d0d..c289e0c2a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -360,7 +360,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"{\"method\":\"nn_tests\"}",(int32_t)strlen("{\"method\":\"nn_tests\"}")+1,0); - LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); } From 7805faff0a535918bf74983ad6f645b6d24f5899 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:07:57 +0300 Subject: [PATCH 645/910] Test --- iguana/exchanges/LP_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2a22c49c6..a362f2c52 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -55,6 +55,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs else if ( strcmp(method,"nn_tests") == 0 ) { LP_send(pubsock,"nn_test return",0); + printf("send back nn_test return -> %d\n",pubsock); return(0); } else if ( strcmp(method,"help") == 0 ) From ca809e0b723b16a7ca32d577df055e0f0aa32d31 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:09:11 +0300 Subject: [PATCH 646/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c289e0c2a..5754fe923 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -360,7 +360,8 @@ void nn_tests(int32_t pullsock,char *pushaddr) timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"{\"method\":\"nn_tests\"}",(int32_t)strlen("{\"method\":\"nn_tests\"}")+1,0); - //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + usleep(100000); + LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes\n",n); } From d30c4280aa8480f71a4d3a2130d86a36fdc1c631 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:11:05 +0300 Subject: [PATCH 647/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5754fe923..fc49af080 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout;//,sndprio = 1; + int32_t sock,n,m,timeout; void *ptr; if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -362,8 +362,9 @@ void nn_tests(int32_t pullsock,char *pushaddr) n = nn_send(sock,"{\"method\":\"nn_tests\"}",(int32_t)strlen("{\"method\":\"nn_tests\"}")+1,0); usleep(100000); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + m = nn_recv(sock,&ptr,NN_MSG,0); // n = LP_send(sock,"nn_tests",0); - printf("sent %d bytes\n",n); + printf("sent %d bytes, recv.%d\n",n,m); } } } From 684500ae40033890635c4295f556b90fcddab48e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:13:28 +0300 Subject: [PATCH 648/910] 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 fc49af080..62d554657 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -416,7 +416,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",mypullport); + nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 1340e0c49a37de5a83e1fcd324c7285d56ac0277 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:14:56 +0300 Subject: [PATCH 649/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 62d554657..3ae88cee0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -416,7 +416,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,myipaddr,mypullport); + nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif @@ -424,7 +424,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - LP_pullsock_check(myipaddr,-1,pullsock,0.); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } nn_tests(pullsock,pushaddr); From 0f5d655ed6558b7bf10bb3190d88b05d5bba2cc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:15:49 +0300 Subject: [PATCH 650/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3ae88cee0..4d45bf88d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -348,7 +348,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,m,timeout; void *ptr; - if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -407,7 +407,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { timeout = 1; //rcvprio = 1; From 775e1bf9d04ceff18a1476c3d992e4aa08eda13c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:17:04 +0300 Subject: [PATCH 651/910] Test --- iguana/exchanges/LP_nativeDEX.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4d45bf88d..4c81fc778 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -101,7 +101,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - if ( 1 && IAMLP == 0 ) + if ( 0 && IAMLP == 0 ) printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { @@ -139,8 +139,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) { nonz++; - //LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); - LP_process_message("PULL",myipaddr,pullsock,profitmargin,ptr,recvlen); + LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); } return(nonz); } @@ -347,24 +346,19 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,m,timeout; void *ptr; + int32_t sock,n,timeout; if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 1; - //nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDPRIO,&sndprio,sizeof(sndprio)); - nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 1000; - nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"{\"method\":\"nn_tests\"}",(int32_t)strlen("{\"method\":\"nn_tests\"}")+1,0); - usleep(100000); + nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); - m = nn_recv(sock,&ptr,NN_MSG,0); // n = LP_send(sock,"nn_tests",0); - printf("sent %d bytes, recv.%d\n",n,m); + printf("sent %d bytes\n",n); } } } @@ -410,13 +404,9 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { timeout = 1; - //rcvprio = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 100; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVPRIO,&rcvprio,sizeof(rcvprio)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); + nanomsg_tcpname(bindaddr,"*",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif @@ -424,6 +414,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + LP_pullsock_check(myipaddr,-1,pullsock,0.); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } nn_tests(pullsock,pushaddr); From 8de0aa157b3a63cd403dc6b40b4156a3f91c6f04 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:17:57 +0300 Subject: [PATCH 652/910] 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 4c81fc778..f0b843317 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -414,7 +414,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - LP_pullsock_check(myipaddr,-1,pullsock,0.); + //LP_pullsock_check(myipaddr,-1,pullsock,0.); } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); } nn_tests(pullsock,pushaddr); From b02a6edfe005e52ab1cb1955c030b4917aefdd62 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:18:28 +0300 Subject: [PATCH 653/910] 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 f0b843317..785b44853 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -101,7 +101,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - if ( 0 && IAMLP == 0 ) + if ( 1 && IAMLP == 0 ) printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { From ae346f757e343ccd470870ea0c56ad7acbf19671 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:19:43 +0300 Subject: [PATCH 654/910] test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 785b44853..00939e67c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -136,7 +136,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { void *ptr; int32_t recvlen,nonz = 0; - while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) + while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); @@ -147,7 +147,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { int32_t recvlen,nonz = 0; void *ptr; - while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,NN_DONTWAIT)) >= 0 ) + while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen); From e833e776a6047848ff8d31687b09dfb246d3df99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:21:48 +0300 Subject: [PATCH 655/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 00939e67c..bb796b70d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,7 +346,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout; + int32_t sock,n,timeout,m; void *ptr; if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -356,9 +356,10 @@ void nn_tests(int32_t pullsock,char *pushaddr) timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + m = nn_recv(pullsock,&ptr,NN_MSG,0); + //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); - printf("sent %d bytes\n",n); + printf("sent %d bytes, recv.%d\n",n,m); } } } From 2a53928af950cbed21f5e21e66d533dac31e981e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:23:34 +0300 Subject: [PATCH 656/910] 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 bb796b70d..ccd754b46 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -407,7 +407,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",mypullport); + nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 6be44c24235041e8f69fc8bfb8f34503a5ae3f56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:24:17 +0300 Subject: [PATCH 657/910] 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 ccd754b46..234695aa1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -407,7 +407,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,myipaddr,mypullport); + nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 85db6f534acb0e3b0d95125a228781356aefe541 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:26:38 +0300 Subject: [PATCH 658/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 234695aa1..3146929fa 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -355,7 +355,8 @@ void nn_tests(int32_t pullsock,char *pushaddr) { timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + n = LP_send(sock,"nn_tests",0);// m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); @@ -404,7 +405,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - timeout = 1; + timeout = 100; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); From 28b274e5789a7c8997622fac0052ce97146990c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:29:17 +0300 Subject: [PATCH 659/910] 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 3146929fa..e83338d2a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -405,7 +405,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - timeout = 100; + timeout = 1000; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); From e3aacef829b4f8d250276ca6ead8744135d0e2f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:29:59 +0300 Subject: [PATCH 660/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a362f2c52..bdc6a5593 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -52,7 +52,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs } if ( strcmp(method,"hello") == 0 ) return(0); - else if ( strcmp(method,"nn_tests") == 0 ) + else if ( 0 && strcmp(method,"nn_tests") == 0 ) { LP_send(pubsock,"nn_test return",0); printf("send back nn_test return -> %d\n",pubsock); From 027b19da8b571362fc83bbc0dbfa75198f69697d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:30:48 +0300 Subject: [PATCH 661/910] 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 e83338d2a..eb415b3bd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,7 +346,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m; void *ptr; + int32_t sock,n,timeout,m=0; //void *ptr; if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -357,7 +357,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); n = LP_send(sock,"nn_tests",0);// - m = nn_recv(pullsock,&ptr,NN_MSG,0); + //m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes, recv.%d\n",n,m); @@ -405,7 +405,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - timeout = 1000; + timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); From 275ea728cce20ee5738389a9083ce08abb18d3bf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:32:17 +0300 Subject: [PATCH 662/910] 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 eb415b3bd..3ff655556 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -403,12 +403,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"127.0.0.1",mypullport); + nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 2f5cea7bfb080eebdde45245ea15ed9e95900fe3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:33:26 +0300 Subject: [PATCH 663/910] 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 3ff655556..3e2916c1d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -355,8 +355,8 @@ void nn_tests(int32_t pullsock,char *pushaddr) { timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - n = LP_send(sock,"nn_tests",0);// + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + //n = LP_send(sock,"nn_tests",0);// //m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); @@ -408,7 +408,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); + nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From f07d7fc23c12beb4ca1810ce43eab2003c805339 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:36:19 +0300 Subject: [PATCH 664/910] 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 3e2916c1d..1743f2129 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -408,7 +408,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,myipaddr,mypullport); + nanomsg_tcpname(bindaddr,"*",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From d8a449d4bab32b7c1b4b9f709d75c9456c5991e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:37:55 +0300 Subject: [PATCH 665/910] 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 1743f2129..de03bf214 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,7 +403,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From 9a4d381f3265aed32a489fbfcbe6ff1c61c7742b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:38:31 +0300 Subject: [PATCH 666/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index de03bf214..9430616a7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,12 +403,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",mypullport); + nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 5437aebb60569d3da6ae511f91ee4f682ec7eee7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:39:21 +0300 Subject: [PATCH 667/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9430616a7..a9923fc48 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -403,7 +403,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From f486972b4e98ec5ed63bcaf257fc5feb9918f30c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:41:37 +0300 Subject: [PATCH 668/910] 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 a9923fc48..c7b8e5cf5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,15 +347,17 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 1000; - nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + timeout = 1; + nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(sock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + n = nn_send(pullsock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); //n = LP_send(sock,"nn_tests",0);// //m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); @@ -403,7 +405,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From 0fc8db34834d1e98f615322e886e2f10f20b3fcb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:42:23 +0300 Subject: [PATCH 669/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c7b8e5cf5..603daf5a9 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,7 +346,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m=0; //void *ptr; + int32_t sock,n,timeout,m=0; void *ptr; if ( (sock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -359,7 +359,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(pullsock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); //n = LP_send(sock,"nn_tests",0);// - //m = nn_recv(pullsock,&ptr,NN_MSG,0); + m = nn_recv(sock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes, recv.%d\n",n,m); From ae1e0cbf04baee9b88b3598e7760cb31a648e62d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:44:01 +0300 Subject: [PATCH 670/910] 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 603daf5a9..838c50d26 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,7 +353,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - timeout = 1; + timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(sock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); From 6e001b90bfc0ae1157c2ec19f3dc6eb132ea9c92 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Jun 2017 23:45:47 +0300 Subject: [PATCH 671/910] Test --- iguana/exchanges/LP_nativeDEX.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 838c50d26..1743f2129 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -346,20 +346,18 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m=0; void *ptr; - if ( (sock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + int32_t sock,n,timeout,m=0; //void *ptr; + if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); else { timeout = 1000; - nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(sock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - n = nn_send(pullsock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); //n = LP_send(sock,"nn_tests",0);// - m = nn_recv(sock,&ptr,NN_MSG,0); + //m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf("sent %d bytes, recv.%d\n",n,m); @@ -405,12 +403,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"0.0.0.0",mypullport); + nanomsg_tcpname(bindaddr,"*",mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From caf44fb48d8f1f5eb2f42b203e6a1e5224c48fa6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 09:30:16 +0300 Subject: [PATCH 672/910] Test --- crypto777/nanosrc/aio/worker_posix.c | 2 +- crypto777/nanosrc/core/global.c | 46 ++++++++++++++-------------- crypto777/nanosrc/utils/efd_pipe.c | 4 +-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/crypto777/nanosrc/aio/worker_posix.c b/crypto777/nanosrc/aio/worker_posix.c index a2662d078..070a87a86 100755 --- a/crypto777/nanosrc/aio/worker_posix.c +++ b/crypto777/nanosrc/aio/worker_posix.c @@ -103,7 +103,7 @@ int nn_worker_init(struct nn_worker *self) { int32_t rc; PNACL_message("nn_worker_init %p\n",self); - sleep(1); + //sleep(1); rc = nn_efd_init(&self->efd); PNACL_message("efd init: rc.%d\n",rc); if ( rc < 0 ) diff --git a/crypto777/nanosrc/core/global.c b/crypto777/nanosrc/core/global.c index 51ab91709..e8f750f88 100755 --- a/crypto777/nanosrc/core/global.c +++ b/crypto777/nanosrc/core/global.c @@ -240,7 +240,7 @@ PNACL_message("list init\n"); // Initialise other parts of the global state. nn_list_init(&SELF.transports); nn_list_init(&SELF.socktypes); - sleep(1); + //sleep(1); PNACL_message("transports init\n"); // Plug in individual transports. //nn_global_add_transport(nn_ipc); @@ -248,36 +248,36 @@ PNACL_message("transports init\n"); //nn_global_add_transport(nn_inproc); //nn_global_add_transport(nn_ws); //nn_global_add_transport(nn_tcpmux); - sleep(1); + //sleep(1); PNACL_message("socktypes init\n"); // Plug in individual socktypes nn_global_add_socktype(nn_pair_socktype); - sleep(1); + //sleep(1); PNACL_message("nn_xpair_socktype init\n"); nn_global_add_socktype(nn_xpair_socktype); PNACL_message("did nn_xpair_socktype init\n"); - //nn_global_add_socktype(nn_rep_socktype); - //nn_global_add_socktype(nn_req_socktype); - //nn_global_add_socktype(nn_xrep_socktype); - //nn_global_add_socktype(nn_xreq_socktype); - //nn_global_add_socktype(nn_respondent_socktype); - //nn_global_add_socktype(nn_surveyor_socktype); - //nn_global_add_socktype(nn_xrespondent_socktype); - //nn_global_add_socktype(nn_xsurveyor_socktype); - //nn_global_add_socktype(nn_pub_socktype); - //nn_global_add_socktype(nn_sub_socktype); - //nn_global_add_socktype(nn_xpub_socktype); - //nn_global_add_socktype(nn_xsub_socktype); - //nn_global_add_socktype(nn_push_socktype); - //nn_global_add_socktype(nn_xpush_socktype); - //nn_global_add_socktype(nn_pull_socktype); - //nn_global_add_socktype(nn_xpull_socktype); - //nn_global_add_socktype(nn_bus_socktype); - //nn_global_add_socktype(nn_xbus_socktype); - sleep(1); + nn_global_add_socktype(nn_rep_socktype); + nn_global_add_socktype(nn_req_socktype); + nn_global_add_socktype(nn_xrep_socktype); + nn_global_add_socktype(nn_xreq_socktype); + nn_global_add_socktype(nn_respondent_socktype); + nn_global_add_socktype(nn_surveyor_socktype); + nn_global_add_socktype(nn_xrespondent_socktype); + nn_global_add_socktype(nn_xsurveyor_socktype); + nn_global_add_socktype(nn_pub_socktype); + nn_global_add_socktype(nn_sub_socktype); + nn_global_add_socktype(nn_xpub_socktype); + nn_global_add_socktype(nn_xsub_socktype); + nn_global_add_socktype(nn_push_socktype); + nn_global_add_socktype(nn_xpush_socktype); + nn_global_add_socktype(nn_pull_socktype); + nn_global_add_socktype(nn_xpull_socktype); + nn_global_add_socktype(nn_bus_socktype); + nn_global_add_socktype(nn_xbus_socktype); + //sleep(1); PNACL_message("do pool init\n"); nn_pool_init(&SELF.pool); // Start the worker threads - sleep(1); + //sleep(1); PNACL_message("do FSM init\n"); nn_fsm_init_root(&SELF.fsm,nn_global_handler,nn_global_shutdown,&SELF.ctx); // Start FSM SELF.state = NN_GLOBAL_STATE_IDLE; diff --git a/crypto777/nanosrc/utils/efd_pipe.c b/crypto777/nanosrc/utils/efd_pipe.c index ddce06119..4df5fd3b3 100755 --- a/crypto777/nanosrc/utils/efd_pipe.c +++ b/crypto777/nanosrc/utils/efd_pipe.c @@ -34,14 +34,14 @@ int nn_efd_init(struct nn_efd *self) { int rc,flags,p[2]; PNACL_message("inside efd_init: pipe\n"); - sleep(1); + //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); - sleep(1); + //sleep(1); if (rc != 0 && (errno == EMFILE || errno == ENFILE)) return -EMFILE; errno_assert (rc == 0); From a8dcf0c8006245de8ff4940354a7bcc9b2a1ab58 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 09:37:31 +0300 Subject: [PATCH 673/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1743f2129..c8d1eda08 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,6 +353,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { + sleep(3); timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); @@ -360,7 +361,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) //m = nn_recv(pullsock,&ptr,NN_MSG,0); //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); - printf("sent %d bytes, recv.%d\n",n,m); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes, recv.%d\n",n,m); } } } @@ -408,7 +409,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",mypullport); + nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From f36e7b2a331678a52e4eedb97b679235dab82725 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 09:38:23 +0300 Subject: [PATCH 674/910] 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 c8d1eda08..897e11547 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -353,7 +353,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) printf("connect error %s\n",nn_strerror(nn_errno())); else { - sleep(3); + sleep(2); timeout = 1000; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); From dbb0ee985a592fb049bf183f294242bcd53003a6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 09:41:31 +0300 Subject: [PATCH 675/910] Test --- crypto777/nanosrc/nn_config.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 4 ++-- includes/iguana_defines.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index d9e9c6468..bb34eaf01 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -56,7 +56,7 @@ void PNACL_message(const char* format, ...); #else #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 -#define PNACL_message printf +#define PNACL_message //printf #include #include #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 897e11547..48e901726 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -404,7 +404,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index ba7e106cb..0133fb0d3 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -108,7 +108,7 @@ extern int32_t IGUANA_NUMHELPERS; #define MS_ASYNC 1 /* Sync memory asynchronously. */ #define MS_SYNC 4 /* Synchronous memory sync. */ #else -#define PNACL_message printf +#define PNACL_message //printf #endif #ifndef WIN32 From d4f15d6744fef68f4a02a0524e5c5b3c65e93320 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 09:41:52 +0300 Subject: [PATCH 676/910] Test --- crypto777/nanosrc/nn_config.h | 2 +- includes/iguana_defines.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/nanosrc/nn_config.h b/crypto777/nanosrc/nn_config.h index bb34eaf01..d9e9c6468 100755 --- a/crypto777/nanosrc/nn_config.h +++ b/crypto777/nanosrc/nn_config.h @@ -56,7 +56,7 @@ void PNACL_message(const char* format, ...); #else #if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 -#define PNACL_message //printf +#define PNACL_message printf #include #include #endif diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 0133fb0d3..ba7e106cb 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -108,7 +108,7 @@ extern int32_t IGUANA_NUMHELPERS; #define MS_ASYNC 1 /* Sync memory asynchronously. */ #define MS_SYNC 4 /* Synchronous memory sync. */ #else -#define PNACL_message //printf +#define PNACL_message printf #endif #ifndef WIN32 From aafffa2cbc088fe5e5df9146075798ddb02e3946 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 10:57:26 +0300 Subject: [PATCH 677/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 48e901726..fc5c9d976 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -404,12 +404,13 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_tcpname(pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - nanomsg_tcpname(bindaddr,myipaddr,mypullport); + sprintf(bindaddr,"ws://%s:%u",myipaddr,mypullport); + //nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); #endif From 67a17d20975d3737ab480a67218ef029186cbacf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:02:56 +0300 Subject: [PATCH 678/910] 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 fc5c9d976..5dc541d77 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -409,7 +409,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - sprintf(bindaddr,"ws://%s:%u",myipaddr,mypullport); + sprintf(bindaddr,"ws://[*]:%u",mypullport); //nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); From c2b3980ee168174231e25dca3e499cb9c5d81d7d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:03:50 +0300 Subject: [PATCH 679/910] Test --- iguana/exchanges/LP_nativeDEX.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5dc541d77..eda8b02f3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -409,7 +409,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - sprintf(bindaddr,"ws://[*]:%u",mypullport); + sprintf(bindaddr,"tcp://*:%u",mypullport); //nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); @@ -419,7 +419,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); //LP_pullsock_check(myipaddr,-1,pullsock,0.); - } else printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); + } + else + { + printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); + exit(-1); + } } nn_tests(pullsock,pushaddr); printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); From f0f4918cd5dc03be67ff22d6dcd571c0e9c5c890 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:05:15 +0300 Subject: [PATCH 680/910] 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 eda8b02f3..a0a0d860f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -409,7 +409,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); #ifdef __APPLE__ - sprintf(bindaddr,"tcp://*:%u",mypullport); + sprintf(bindaddr,"ws://*:%u",mypullport); //nanomsg_tcpname(bindaddr,myipaddr,mypullport); #else nanomsg_tcpname(bindaddr,myipaddr,mypullport); From 4c816fd1e4b76908aaca6b38bd85eb503f3f9c22 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:08:46 +0300 Subject: [PATCH 681/910] Test --- iguana/exchanges/LP_forwarding.c | 4 +--- iguana/exchanges/LP_nativeDEX.c | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 7e537d3f0..899addd23 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -108,9 +108,7 @@ char *LP_register(bits256 pubkey,char *ipaddr) struct LP_forwardinfo *ptr=0; int32_t pushsock; char pushaddr[64]; if ( ipaddr == 0 || ipaddr[0] == 0 || is_ipaddr(ipaddr) == 0 || bits256_nonz(pubkey) == 0 ) return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); - //if ( strlen(pushaddr) <= strlen("tcp://") || is_ipaddr(pushaddr+strlen("tcp://")) == 0 ) - // return(clonestr("{\"error\":\"illegal ipaddr\"}")); - sprintf(pushaddr,"tcp://%s",ipaddr); + sprintf(pushaddr,"ws://%s:%u",ipaddr,7780); char str[65]; printf("register.(%s) %s\n",pushaddr,bits256_str(str,pubkey)); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a0a0d860f..4019b1d28 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,7 +403,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit myipaddr[--n] = 0; } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); - nanomsg_tcpname(pushaddr,myipaddr,mypullport); + sprintf(pushaddr,"ws://%s:%u",myipaddr,mypullport); + //nanomsg_tcpname(pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; From 92188ecaf5532fbc772d8d0b5034b6211ef85211 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:09:53 +0300 Subject: [PATCH 682/910] Test --- iguana/exchanges/LP_forwarding.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 899addd23..63e5fb4b8 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -103,12 +103,12 @@ int32_t LP_pushsock_create(struct LP_forwardinfo *ptr,char *pushaddr) return(pushsock); } -char *LP_register(bits256 pubkey,char *ipaddr) +char *LP_register(bits256 pubkey,char *ip_port) { struct LP_forwardinfo *ptr=0; int32_t pushsock; char pushaddr[64]; - if ( ipaddr == 0 || ipaddr[0] == 0 || is_ipaddr(ipaddr) == 0 || bits256_nonz(pubkey) == 0 ) - return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); - sprintf(pushaddr,"ws://%s:%u",ipaddr,7780); + if ( ip_port == 0 || ip_port[0] == 0 || is_ipaddr(ip_port) == 0 || bits256_nonz(pubkey) == 0 ) + return(clonestr("{\"error\":\"illegal ip_port or null pubkey\"}")); + sprintf(pushaddr,"ws://%s",ip_port); char str[65]; printf("register.(%s) %s\n",pushaddr,bits256_str(str,pubkey)); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { From 39b7b043b23d9eaff04e460e5f1bb45a3a52ba3e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:14:05 +0300 Subject: [PATCH 683/910] Test --- iguana/exchanges/LP_nativeDEX.c | 14 ++++---------- iguana/exchanges/LP_network.c | 4 ++-- iguana/exchanges/LP_ordermatch.c | 8 ++------ iguana/exchanges/LP_peers.c | 4 ++-- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4019b1d28..fac19be10 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -403,18 +403,12 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit myipaddr[--n] = 0; } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); - sprintf(pushaddr,"ws://%s:%u",myipaddr,mypullport); - //nanomsg_tcpname(pushaddr,myipaddr,mypullport); + nanomsg_transportname(0,pushaddr,myipaddr,mypullport); if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); -#ifdef __APPLE__ - sprintf(bindaddr,"ws://*:%u",mypullport); - //nanomsg_tcpname(bindaddr,myipaddr,mypullport); -#else - nanomsg_tcpname(bindaddr,myipaddr,mypullport); -#endif + nanomsg_transportname(1,bindaddr,myipaddr,mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { maxsize = 2 * 1024 * 1024; @@ -434,8 +428,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit if ( myipaddr != 0 ) { pubsock = -1; - nanomsg_tcpname(subaddr,myipaddr,mypubport); - nanomsg_tcpname(bindaddr,myipaddr,mypubport); + nanomsg_transportname(0,subaddr,myipaddr,mypubport); + nanomsg_transportname(1,bindaddr,myipaddr,mypubport); if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { if ( nn_bind(pubsock,bindaddr) >= 0 ) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 4a328a213..da995ef5f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -19,9 +19,9 @@ // // jl777: might need to queue outbound packets and send via separate thread -char *nanomsg_tcpname(char *str,char *ipaddr,uint16_t port) +char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"tcp://%s:%u",ipaddr,port); + sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index b19679ae3..f9562a7b7 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -344,12 +344,8 @@ int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) for (i=0; i<10; i++) { r = (10000 + (rand() % 50000)) & 0xffff; - nanomsg_tcpname(pairstr,myipaddr,r); -#ifdef __APPLE__ - nanomsg_tcpname(bindaddr,"*",r); -#else - nanomsg_tcpname(bindaddr,myipaddr,r); -#endif + nanomsg_transportname(0,pairstr,myipaddr,r); + nanomsg_transportname(1,bindaddr,myipaddr,r); if ( nn_bind(pair,bindaddr) >= 0 ) { timeout = 100; diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 89fac7909..7207e53a7 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -72,7 +72,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char strcpy(peer->ipaddr,ipaddr); if ( pushport != 0 && subport != 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) { - nanomsg_tcpname(pushaddr,peer->ipaddr,pushport); + nanomsg_transportname(0,pushaddr,peer->ipaddr,pushport); if ( nn_connect(pushsock,pushaddr) >= 0 ) { timeout = 100; @@ -87,7 +87,7 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char timeout = 1; nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - nanomsg_tcpname(subaddr,peer->ipaddr,subport); + nanomsg_transportname(0,subaddr,peer->ipaddr,subport); if ( nn_connect(subsock,subaddr) >= 0 ) { peer->subsock = subsock; From 8bb7d8e54922c677ce47726d70f268fd1665e5fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:20:26 +0300 Subject: [PATCH 684/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index fac19be10..4d21177f4 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -347,7 +347,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; //void *ptr; - if ( (sock= nn_socket(AF_SP,NN_PUSH)) >= 0 ) + if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -404,7 +404,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_transportname(0,pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From fc488f6b866fb92e61b9b1d3935d5889aa4f1aaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:22:15 +0300 Subject: [PATCH 685/910] Test --- iguana/exchanges/LP_nativeDEX.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4d21177f4..5742b3a65 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -354,12 +354,14 @@ void nn_tests(int32_t pullsock,char *pushaddr) else { sleep(2); - timeout = 1000; + timeout = 1; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - //n = LP_send(sock,"nn_tests",0);// + nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); + n = LP_send(sock,"nn_tests",0);// //m = nn_recv(pullsock,&ptr,NN_MSG,0); - //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + sleep(1); + LP_pullsock_check("127.0.0.1",-1,pullsock,0.); // n = LP_send(sock,"nn_tests",0); printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes, recv.%d\n",n,m); } @@ -408,6 +410,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nanomsg_transportname(1,bindaddr,myipaddr,mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { From 8dfc5a7dbc1e5d0b178e0923d01a554c0db1388d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:23:10 +0300 Subject: [PATCH 686/910] 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 da995ef5f..4f893fef1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -21,7 +21,7 @@ char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } From b5fa84dc0b954200cc2b4e93a791a1125c70ccac Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:25:10 +0300 Subject: [PATCH 687/910] Test --- iguana/exchanges/LP_coins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 821acca4c..d2c4b994c 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -119,7 +119,7 @@ void LP_statefname(char *fname,char *symbol,char *assetname,char *str) strcat(fname,"/"); #endif strcat(fname,str); - printf("LP_statefname.(%s) <- %s %s %s\n",fname,symbol,assetname,str); + //printf("LP_statefname.(%s) <- %s %s %s\n",fname,symbol,assetname,str); } int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) From 4e4028b6433b21df5167c7be187805f707f5d0ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:31:54 +0300 Subject: [PATCH 688/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_forwarding.c | 13 +++++++------ iguana/exchanges/LP_nativeDEX.c | 10 +++++----- iguana/exchanges/LP_rpc.c | 6 ++---- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bdc6a5593..38d2fc3d2 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -225,7 +225,7 @@ forwardhex(pubkey,hex)\n\ { if ( strcmp(method,"register") == 0 ) { - retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr")); + retstr = LP_register(jbits256(argjson,"client"),jstr(argjson,"pushaddr"),juint(argjson,"pushport")); //printf("got (%s) from register\n",retstr!=0?retstr:""); return(retstr); } diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 63e5fb4b8..36edbf176 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -98,17 +98,18 @@ int32_t LP_pushsock_create(struct LP_forwardinfo *ptr,char *pushaddr) } timeout = 1; nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); if ( ptr != 0 ) LP_hello(ptr); return(pushsock); } -char *LP_register(bits256 pubkey,char *ip_port) +char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) { struct LP_forwardinfo *ptr=0; int32_t pushsock; char pushaddr[64]; - if ( ip_port == 0 || ip_port[0] == 0 || is_ipaddr(ip_port) == 0 || bits256_nonz(pubkey) == 0 ) - return(clonestr("{\"error\":\"illegal ip_port or null pubkey\"}")); - sprintf(pushaddr,"ws://%s",ip_port); + if ( ipaddr == 0 || ipaddr[0] == 0 || is_ipaddr(ipaddr) == 0 || bits256_nonz(pubkey) == 0 ) + return(clonestr("{\"error\":\"illegal ipaddr or null pubkey\"}")); + nanomsg_transportname(0,pushaddr,ipaddr,port); char str[65]; printf("register.(%s) %s\n",pushaddr,bits256_str(str,pubkey)); if ( (ptr= LP_forwardfind(pubkey)) != 0 ) { @@ -140,7 +141,7 @@ char *LP_register(bits256 pubkey,char *ip_port) } } -void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) +void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) { char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) @@ -151,7 +152,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,int32_t max) HASH_ITER(hh,LP_peerinfos,peer,tmp) { //printf("register with (%s)\n",peer->ipaddr); - if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr)) != 0 ) + if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr,pushport)) != 0 ) { //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5742b3a65..5ed772c85 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -213,7 +213,7 @@ int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pu return(n); } -int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) +int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; @@ -253,7 +253,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr,10); + LP_forwarding_register(LP_mypubkey,myipaddr,pushport,10); lastforward = now; } } @@ -285,7 +285,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso return(nonz); } -void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) +void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) { uint8_t r; int32_t i,n,j; cJSON *item; if ( IAMLP != 0 ) @@ -339,7 +339,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in { if ( 0 && (rand() % 100) == 0 ) printf("mainloop\n"); - if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin) == 0 ) + if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,pushport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); } } @@ -462,7 +462,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit printf("couldnt get myipaddr\n"); exit(-1); } -LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins"),jstr(argjson,"seednode")); +LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins"),jstr(argjson,"seednode")); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index c624cd7ac..89e52a64b 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -106,12 +106,10 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx } } -char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *pushaddr) +char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *ipaddr,uint16_t pushport) { char url[512],str[65],*retstr; - if ( strncmp("tcp://",pushaddr,strlen("tcp://")) != 0 || strlen(pushaddr) <= strlen("tcp://") ) - return(clonestr("{\"error\":\"illegal pushaddr\"}")); - sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s",destip,destport,bits256_str(str,pubkey),pushaddr+strlen("tcp://")); + sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s&pushport=%u",destip,destport,bits256_str(str,pubkey),ipaddr,pushport); retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); return(retstr); From c7ae7076594529d130942fbae7632f5923f3f244 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:35:42 +0300 Subject: [PATCH 689/910] 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 5ed772c85..9c301c0ae 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -218,7 +218,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso static uint32_t counter,lastforward,numpeers; struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; now = (uint32_t)time(NULL); - if ( mypeer == 0 ) + if ( myipaddr == 0 ) myipaddr = "127.0.0.1"; numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) From 7cac6d532cca9cf8dcaa5bf57634c71fa36c1637 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:36:42 +0300 Subject: [PATCH 690/910] Test --- iguana/exchanges/LP_nativeDEX.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9c301c0ae..10bfe93e1 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -216,9 +216,11 @@ int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pu int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; - struct LP_utxoinfo *utxo,*utmp; char *retstr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; + struct LP_utxoinfo *utxo,*utmp; char *retstr,*origipaddr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; now = (uint32_t)time(NULL); - if ( myipaddr == 0 ) + if ( (origipaddr= myipaddr) == 0 ) + origipaddr = "127.0.0.1"; + if ( mypeer == 0 ) myipaddr = "127.0.0.1"; numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) @@ -253,7 +255,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,myipaddr,pushport,10); + LP_forwarding_register(LP_mypubkey,origipaddr,pushport,10); lastforward = now; } } From 491c51105c5439e802b150db795f97f6c229ddad Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:37:55 +0300 Subject: [PATCH 691/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 10bfe93e1..31b684c8e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -348,7 +348,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m=0; //void *ptr; + int32_t sock,n,timeout,m=0; char msg[512];//void *ptr; if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -360,7 +360,8 @@ void nn_tests(int32_t pullsock,char *pushaddr) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - n = LP_send(sock,"nn_tests",0);// + sprintf(msg,"{\"nn_tests\":\"%s\"}",pushaddr); + n = LP_send(sock,msg,0);// //m = nn_recv(pullsock,&ptr,NN_MSG,0); sleep(1); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); From f6e15c7d144ca8b60990ad10b4e3a083a48c3700 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:41:27 +0300 Subject: [PATCH 692/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_include.h | 3 +++ iguana/exchanges/LP_nativeDEX.c | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 36edbf176..74a00a427 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -85,7 +85,7 @@ int32_t LP_hellos() int32_t LP_pushsock_create(struct LP_forwardinfo *ptr,char *pushaddr) { int32_t pushsock,timeout; - if ( (pushsock= nn_socket(AF_SP,NN_PUSH)) < 0 ) + if ( (pushsock= nn_socket(AF_SP,LP_COMMAND_SENDSOCK)) < 0 ) { printf("LP_pushsock_create couldnt allocate socket for %s\n",pushaddr); return(-1); diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index da587d194..9fd54eb64 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 +#define LP_COMMAND_SENDSOCK NN_REQ +#define LP_COMMAND_RECVSOCK NN_REP + #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 #define LP_SWAPSTEP_TIMEOUT 3 diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 31b684c8e..bedd2e18d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -349,7 +349,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { int32_t sock,n,timeout,m=0; char msg[512];//void *ptr; - if ( (sock= nn_socket(AF_SP,NN_REQ)) >= 0 ) + if ( (sock= nn_socket(AF_SP,LP_COMMAND_SENDSOCK)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) printf("connect error %s\n",nn_strerror(nn_errno())); @@ -409,7 +409,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); nanomsg_transportname(0,pushaddr,myipaddr,mypullport); - if ( (pullsock= nn_socket(AF_SP,NN_REP)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,LP_COMMAND_RECVSOCK)) >= 0 ) { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); From 7eaf2dd85d6f78c5bdea8210153da1e60f9c96c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:42:46 +0300 Subject: [PATCH 693/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 74a00a427..ab03abc87 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -65,7 +65,7 @@ int32_t LP_hello(struct LP_forwardinfo *ptr) return(i); } } - //printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); + printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); return(-1); } return(0); From bc43cad51d0db5f930ef950843af7d5f88a4ae57 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:49:53 +0300 Subject: [PATCH 694/910] 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 bedd2e18d..76d022378 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -414,6 +414,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_MAXTTL,&timeout,sizeof(timeout)); nanomsg_transportname(1,bindaddr,myipaddr,mypullport); if ( nn_bind(pullsock,bindaddr) >= 0 ) { From 0164604e29cd6df7332e7468420aa20a3633c541 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:51:23 +0300 Subject: [PATCH 695/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 76d022378..6ed6f9f85 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -348,7 +348,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m=0; char msg[512];//void *ptr; + int32_t sock,n,timeout,m=0; char msg[512]; void *ptr; if ( (sock= nn_socket(AF_SP,LP_COMMAND_SENDSOCK)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -362,10 +362,9 @@ void nn_tests(int32_t pullsock,char *pushaddr) //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); sprintf(msg,"{\"nn_tests\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0);// - //m = nn_recv(pullsock,&ptr,NN_MSG,0); sleep(1); - LP_pullsock_check("127.0.0.1",-1,pullsock,0.); - // n = LP_send(sock,"nn_tests",0); + m = nn_recv(pullsock,&ptr,NN_MSG,0); + //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes, recv.%d\n",n,m); } } From 7e6b0891fc1e3942949e5c3dd093dc641ae8d3f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:56:07 +0300 Subject: [PATCH 696/910] Test --- iguana/exchanges/LP_nativeDEX.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 6ed6f9f85..372e75fe7 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -91,7 +91,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * return(retstr); } -void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen) +void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) { int32_t len,datalen=0; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) @@ -111,7 +111,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof { //printf("got forwardhex\n"); if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) - free(retstr); + free(retstr), retstr = 0; } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { @@ -123,8 +123,18 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof LP_send(pubsock,jprint(reqjson,1),1); } else if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len,profitmargin)) != 0 ) - free(retstr); + { + } portable_mutex_unlock(&LP_commandmutex); + if ( retstr != 0 ) + { + if ( strcmp("PULL",typestr) == 0 && LP_COMMAND_RECVSOCK == NN_REP ) + { + printf("got REQ.(%s) -> (%s)\n",jprint(argjson,0),retstr); + LP_send(recvsock,retstr,0); + } + free(retstr); + } free_json(argjson); } else printf("error parsing(%s)\n",jsonstr); if ( (void *)jsonstr != ptr ) @@ -139,7 +149,7 @@ int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; - LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen); + LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); } return(nonz); } @@ -150,7 +160,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; - LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen); + LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock); /*if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); From 4c45b3774979e1bf5cba3439a45d8c0fc0fbf5b5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:56:55 +0300 Subject: [PATCH 697/910] 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 372e75fe7..3ee58231d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -358,7 +358,7 @@ void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,in void nn_tests(int32_t pullsock,char *pushaddr) { - int32_t sock,n,timeout,m=0; char msg[512]; void *ptr; + int32_t sock,n,timeout,m=0; char msg[512]; //void *ptr; if ( (sock= nn_socket(AF_SP,LP_COMMAND_SENDSOCK)) >= 0 ) { if ( nn_connect(sock,pushaddr) < 0 ) @@ -373,8 +373,8 @@ void nn_tests(int32_t pullsock,char *pushaddr) sprintf(msg,"{\"nn_tests\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0);// sleep(1); - m = nn_recv(pullsock,&ptr,NN_MSG,0); - //LP_pullsock_check("127.0.0.1",-1,pullsock,0.); + //m = nn_recv(pullsock,&ptr,NN_MSG,0); + LP_pullsock_check("127.0.0.1",-1,pullsock,0.); printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes, recv.%d\n",n,m); } } From 1298841a128efcc9dc49018ccc22e64d91b4c37a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 11:58:29 +0300 Subject: [PATCH 698/910] Test --- iguana/exchanges/LP_commands.c | 4 ++-- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 38d2fc3d2..c4cbf97dd 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -52,11 +52,11 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs } if ( strcmp(method,"hello") == 0 ) return(0); - else if ( 0 && strcmp(method,"nn_tests") == 0 ) + else if ( strcmp(method,"nn_tests") == 0 ) { LP_send(pubsock,"nn_test return",0); printf("send back nn_test return -> %d\n",pubsock); - return(0); + return(clonestr("{\"result\":\"success\"}")); } else if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 3ee58231d..7f3ff41ad 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -370,7 +370,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - sprintf(msg,"{\"nn_tests\":\"%s\"}",pushaddr); + sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0);// sleep(1); //m = nn_recv(pullsock,&ptr,NN_MSG,0); From f4d11eff0eac419d545dac7b961f714f70edb702 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:02:17 +0300 Subject: [PATCH 699/910] Test --- iguana/exchanges/LP_nativeDEX.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7f3ff41ad..a58bc493f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -93,7 +93,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) { - int32_t len,datalen=0; char *retstr,*jsonstr=0; cJSON *argjson,*reqjson; + int32_t len,datalen=0; char *retstr=0,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) { datalen >>= 1; @@ -126,14 +126,22 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof { } portable_mutex_unlock(&LP_commandmutex); - if ( retstr != 0 ) + if ( LP_COMMAND_RECVSOCK == NN_REP ) { - if ( strcmp("PULL",typestr) == 0 && LP_COMMAND_RECVSOCK == NN_REP ) + if ( retstr != 0 ) { - printf("got REQ.(%s) -> (%s)\n",jprint(argjson,0),retstr); - LP_send(recvsock,retstr,0); + if ( strcmp("PULL",typestr) == 0 ) + { + printf("%d got REQ.(%s) -> (%s)\n",recvsock,jprint(argjson,0),retstr); + LP_send(recvsock,retstr,0); + } + free(retstr); + } + if ( strcmp("PULL",typestr) == 0 ) + { + printf("%d got REQ.(%s) -> null\n",recvsock,jprint(argjson,0)); + LP_send(recvsock,"{\"result\":null}",0); } - free(retstr); } free_json(argjson); } else printf("error parsing(%s)\n",jsonstr); @@ -375,7 +383,7 @@ void nn_tests(int32_t pullsock,char *pushaddr) sleep(1); //m = nn_recv(pullsock,&ptr,NN_MSG,0); LP_pullsock_check("127.0.0.1",-1,pullsock,0.); - printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes, recv.%d\n",n,m); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes -> %d, recv.%d\n",n,pullsock,m); } } } From aa7ddba14319834a4d2069cfd0389db6f3e1e32d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:04:24 +0300 Subject: [PATCH 700/910] Test --- iguana/exchanges/LP_commands.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index c4cbf97dd..7a957a052 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -53,11 +53,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs if ( strcmp(method,"hello") == 0 ) return(0); else if ( strcmp(method,"nn_tests") == 0 ) - { - LP_send(pubsock,"nn_test return",0); - printf("send back nn_test return -> %d\n",pubsock); return(clonestr("{\"result\":\"success\"}")); - } else if ( strcmp(method,"help") == 0 ) return(clonestr("{\"result\":\" \ available localhost RPC commands:\n \ From 3f335fa34d5bcac2d61ec9234a6aab84d49c8072 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:06:05 +0300 Subject: [PATCH 701/910] 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 a58bc493f..456253d33 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -137,7 +137,7 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof } free(retstr); } - if ( strcmp("PULL",typestr) == 0 ) + else if ( strcmp("PULL",typestr) == 0 ) { printf("%d got REQ.(%s) -> null\n",recvsock,jprint(argjson,0)); LP_send(recvsock,"{\"result\":null}",0); From b2aa023163d1032dc4a85f48a168ddfef5e49589 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:07:50 +0300 Subject: [PATCH 702/910] 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 4f893fef1..da995ef5f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -21,7 +21,7 @@ char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } From 1c2840ead6e8c93d466cc16c0261c0bafb26b5b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:15:58 +0300 Subject: [PATCH 703/910] Test --- iguana/exchanges/LP_include.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 9fd54eb64..87c53db39 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -21,8 +21,8 @@ #ifndef LP_INCLUDE_H #define LP_INCLUDE_H -#define LP_COMMAND_SENDSOCK NN_REQ -#define LP_COMMAND_RECVSOCK NN_REP +#define LP_COMMAND_SENDSOCK NN_BUS +#define LP_COMMAND_RECVSOCK NN_BUS #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 From 79073e3c62d0e935ad8dfa0be32539a0c015242d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:17:51 +0300 Subject: [PATCH 704/910] Test --- iguana/exchanges/LP_commands.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 7a957a052..bd0b5a21f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -51,7 +51,10 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs return(0); } if ( strcmp(method,"hello") == 0 ) + { + printf("got hello from %s:%u\n",ipaddr!=0?ipaddr:"",argport); return(0); + } else if ( strcmp(method,"nn_tests") == 0 ) return(clonestr("{\"result\":\"success\"}")); else if ( strcmp(method,"help") == 0 ) From 57431ba7c7d7a4427dfe0f0b2c6276fe90f5cb4e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:20:58 +0300 Subject: [PATCH 705/910] Test --- iguana/exchanges/LP_include.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 87c53db39..400feb53c 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -21,8 +21,8 @@ #ifndef LP_INCLUDE_H #define LP_INCLUDE_H -#define LP_COMMAND_SENDSOCK NN_BUS -#define LP_COMMAND_RECVSOCK NN_BUS +#define LP_COMMAND_SENDSOCK NN_PUSH +#define LP_COMMAND_RECVSOCK NN_PULL #define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 From e886038d5b53c79e6df3f4aacbfebb04715671bc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:30:00 +0300 Subject: [PATCH 706/910] Test --- iguana/exchanges/LP_swap.c | 2 +- iguana/exchanges/LP_transaction.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b3fd8fc71..b45181822 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -642,7 +642,7 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t } if ( retjson != 0 ) { - printf("SWAP completed! %u-%u %s\n",requestid,quoteid,jprint(retjson,0)); + printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>\nSWAP completed! %u-%u %s\n",requestid,quoteid,jprint(retjson,0)); free_json(retjson); if ( (retstr= basilisk_swapentry(requestid,quoteid)) != 0 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index f3038a967..67d5b7fca 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1494,6 +1494,7 @@ void basilisk_alicepayment(struct basilisk_swap *swap,struct iguana_info *coin,s int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { char coinaddr[64]; int32_t i,retval = -1; + printf("alicetx\n"); if ( swap->alicepayment.I.datalen == 0 ) basilisk_alicepayment(swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.spendlen == 0 ) @@ -1513,16 +1514,17 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d } if ( swap->myfee.I.datalen == 0 ) { - //printf("generate fee\n"); + printf("generate fee\n"); bitcoin_address(coinaddr,swap->alicecoin.pubtype,swap->changermd160,20); if ( basilisk_rawtx_gen(swap->ctx,"myfee",swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr) == 0 ) { + printf("rawtxsend\n"); swap->I.statebits |= LP_swapdata_rawtxsend(pairsock,swap,0x80,data,maxlen,&swap->myfee,0x40,0); LP_unspents_mark(swap->I.iambob!=0?swap->bobcoin.symbol:swap->alicecoin.symbol,swap->myfee.vins); //basilisk_txlog(swap,&swap->myfee,-1); - //for (i=0; imyfee.I.datalen; i++) - // printf("%02x",swap->myfee.txbytes[i]); - //printf(" <- fee state.%x\n",swap->I.statebits); + for (i=0; imyfee.I.datalen; i++) + printf("%02x",swap->myfee.txbytes[i]); + printf(" <- fee state.%x\n",swap->I.statebits); swap->I.statebits |= 0x40; } else From 3cb22ee165e2ed34fb9f58df8856362f5e416138 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:32:33 +0300 Subject: [PATCH 707/910] Test --- iguana/exchanges/LP_transaction.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 67d5b7fca..dba8acc98 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -735,7 +735,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch memset(signedtxidp,0,sizeof(*signedtxidp)); if ( finalseqid == 0 ) locktime = expiration; - //printf("bobtxspend.%s redeem.[%d]\n",symbol,redeemlen); + printf("bobtxspend.%s redeem.[%d]\n",symbol,redeemlen); if ( redeemlen < 0 ) return(0); #ifndef BASILISK_DISABLESENDTX @@ -752,7 +752,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch { if ( value > satoshis+txfee ) change = value - (satoshis + txfee); - //printf("utxo %.8f, destamount %.8f change %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(change),dstr(txfee)); + printf("utxo %.8f, destamount %.8f change %.8f txfee %.8f\n",dstr(value),dstr(satoshis),dstr(change),dstr(txfee)); } else if ( value > txfee ) satoshis = value - txfee; else printf("unexpected small value %.8f vs txfee %.8f\n",dstr(value),dstr(txfee)); @@ -834,7 +834,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch char str[65]; completed = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); - //printf("locktime.%u sequenceid.%x rawtx.(%s) vins.(%s)\n",locktime,sequenceid,rawtxbytes,jprint(vins,0)); + printf("locktime.%u sequenceid.%x rawtx.(%s) vins.(%s)\n",locktime,sequenceid,rawtxbytes,jprint(vins,0)); if ( (completed= iguana_signrawtransaction(ctx,symbol,pubtype,p2shtype,isPoS,1000000,&msgtx,&signedtx,signedtxidp,V,1,rawtxbytes,vins,privkeys)) < 0 ) //if ( (signedtx= LP_signrawtx(symbol,signedtxidp,&completed,vins,rawtxbytes,privkeys,V)) == 0 ) printf("couldnt sign transaction.%s %s\n",name,bits256_str(str,*signedtxidp)); @@ -854,7 +854,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay,bits256 privkey,uint8_t *changermd160,char *vinaddr) { int32_t retval=-1,len,iter; char *signedtx,*changeaddr = 0,_changeaddr[64]; struct iguana_info *coin; int64_t newtxfee=0,destamount; - //char str2[65]; printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str2,rawtx->utxotxid),rawtx->utxovout); + char str2[65]; printf("%s rawtxgen.(%s/v%d)\n",rawtx->name,bits256_str(str2,rawtx->utxotxid),rawtx->utxovout); if ( (coin= rawtx->coin) == 0 ) return(-1); //return(_basilisk_rawtx_gen(str,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay,privkey)); From 594e3c4fd7db79e74098ad1b4072997215e42bc2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:41:33 +0300 Subject: [PATCH 708/910] Test --- iguana/exchanges/LP_transaction.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index dba8acc98..69dc5b5d3 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -768,6 +768,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; } else V[0].N = V[0].M = 1; + printf("what?\n"); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(ctx,V[0].signers[0].pubkey,privkey); bitcoin_priv2wif(wifstr,privkey,wiftype); @@ -790,6 +791,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch jaddnum(item,"vout",vout); bitcoin_address(tmpaddr,pubtype,pubkey33,33); bitcoin_addr2rmd160(&addrtype,rmd160,tmpaddr); + printf("before redeem\n"); if ( redeemlen != 0 ) { init_hexbytes_noT(hexstr,redeemscript,redeemlen); @@ -829,6 +831,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch changelen = bitcoin_standardspend(changescript,0,changermd160); txobj = bitcoin_txoutput(txobj,changescript,changelen,change); } + printf("call json2hex\n"); if ( (rawtxbytes= bitcoin_json2hex(isPoS,&txid,txobj,V)) != 0 ) { char str[65]; From 94235c6051b35d41713d4d001f0c2b60f442f520 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:44:35 +0300 Subject: [PATCH 709/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_transaction.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 456253d33..472833f71 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -445,7 +445,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit exit(-1); } } - nn_tests(pullsock,pushaddr); + //nn_tests(pullsock,pushaddr); printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); if ( IAMLP != 0 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 69dc5b5d3..1fec85240 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -756,9 +756,13 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch } else if ( value > txfee ) satoshis = value - txfee; else printf("unexpected small value %.8f vs txfee %.8f\n",dstr(value),dstr(txfee)); - *destamountp = satoshis; + if ( destamountp != 0 ) + *destamountp = satoshis; + printf("destamountp %p\n",destamountp); timestamp = (uint32_t)time(NULL); + printf("t %u V.%p %ld\n",timestamp,V,sizeof(V)); memset(V,0,sizeof(V)); + printf("cleared V\n"); privkeys = cJSON_CreateArray(); if ( privkey2p != 0 ) { From 9bde8c06bd0971fa3b658348e7e6a81c9f5ea4ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 12:57:07 +0300 Subject: [PATCH 710/910] Test --- iguana/exchanges/LP_transaction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 1fec85240..ef3d623c6 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -730,7 +730,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,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 vout,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,tmpaddr[64],hexstr[999],wifstr[128],txdestaddr[64],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[16]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; + char *rawtxbytes=0,*signedtx=0,tmpaddr[64],hexstr[999],wifstr[128],txdestaddr[64],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[2]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; *destamountp = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); if ( finalseqid == 0 ) From b2f5e3e426d985ff4afc9a4c14d71cf3d6c72343 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:24:46 +0300 Subject: [PATCH 711/910] Test --- iguana/exchanges/LP_commands.c | 8 + iguana/exchanges/LP_forwarding.c | 11 +- iguana/exchanges/LP_include.h | 2 + iguana/exchanges/LP_nativeDEX.c | 226 +++++++++++---------- iguana/exchanges/LP_network.c | 315 +++++++++++++++++++++++++++++- iguana/exchanges/LP_ordermatch.c | 42 ++-- iguana/exchanges/LP_rpc.c | 37 +++- iguana/exchanges/LP_transaction.c | 11 +- 8 files changed, 501 insertions(+), 151 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index bd0b5a21f..ade4ba249 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -211,6 +211,12 @@ forwardhex(pubkey,hex)\n\ } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); } + else if ( strcmp(method,"keepalive") == 0 ) + { + printf("got keepalive lag.%d\n",(int32_t)time(NULL) - LP_deadman_switch); + LP_deadman_switch = (uint32_t)time(NULL); + return(0); + } else if ( strcmp(method,"getpeers") == 0 ) return(LP_peers()); else if ( strcmp(method,"getutxos") == 0 ) @@ -232,6 +238,8 @@ forwardhex(pubkey,hex)\n\ return(LP_lookup(jbits256(argjson,"client"))); else if ( strcmp(method,"forwardhex") == 0 ) retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); + else if ( strcmp(method,"psock") == 0 ) + return(LP_psock(myipaddr,jint(argjson,"ispaired"))); else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); } diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index ab03abc87..5bd361ae4 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -116,10 +116,13 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) ptr->lasttime = (uint32_t)time(NULL); if ( ptr->pushsock >= 0 ) { - nn_close(ptr->pushsock); - printf("recreate pushsock for %s\n",pushaddr); - if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) - return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); + if ( strcmp(pushaddr,ptr->pushaddr) != 0 ) + { + nn_close(ptr->pushsock); + printf("recreate pushsock for %s\n",pushaddr); + if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) + return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); + } else printf("no need to create identical endpoint\n"); } return(clonestr("{\"error\":\"already registered\",\"registered\":1}")); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 400feb53c..e706d124c 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -235,6 +235,8 @@ struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); 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,bits256 pubkey); +int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin); +uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired); #endif diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 472833f71..e61d6f4f5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -20,12 +20,13 @@ #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; - +portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex; +int32_t LP_canbind; #include "LP_network.c" struct LP_utxoinfo *LP_utxoinfos[2],*LP_utxoinfos2[2]; struct LP_peerinfo *LP_peerinfos,*LP_mypeer; +struct LP_forwardinfo *LP_forwardinfos; char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; @@ -33,6 +34,7 @@ char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +uint32_t LP_deadman_switch; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -91,7 +93,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * return(retstr); } -void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) +char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) { int32_t len,datalen=0; char *retstr=0,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) @@ -111,7 +113,8 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof { //printf("got forwardhex\n"); if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) - free(retstr), retstr = 0; + { + } } else if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"publish") == 0 ) { @@ -135,7 +138,6 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof printf("%d got REQ.(%s) -> (%s)\n",recvsock,jprint(argjson,0),retstr); LP_send(recvsock,retstr,0); } - free(retstr); } else if ( strcmp("PULL",typestr) == 0 ) { @@ -149,26 +151,29 @@ void LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double prof free(jsonstr); if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; + return(retstr); } -int32_t LP_pullsock_check(char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) +int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { void *ptr; int32_t recvlen,nonz = 0; + *retstrp = 0; while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; - LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); + *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); } return(nonz); } int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { - int32_t recvlen,nonz = 0; void *ptr; + int32_t recvlen,nonz = 0; void *ptr; char *retstr; while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; - LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock); + if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) + free(retstr); /*if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) { printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); @@ -298,40 +303,18 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - nonz += LP_pullsock_check(myipaddr,pubsock,pullsock,profitmargin); + nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); + if ( retstr != 0 ) + free(retstr); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); counter++; return(nonz); } -void LP_mainloop(char *myipaddr,struct LP_peerinfo *mypeer,uint16_t mypubport,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin,cJSON *coins,char *seednode) +void LP_initcoins(int32_t pubsock,cJSON *coins,char *passphrase) { - uint8_t r; int32_t i,n,j; cJSON *item; - if ( IAMLP != 0 ) - { - if ( seednode == 0 || seednode[0] == 0 ) - { - for (i=0; i 25 ) - continue; - LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); - } - } else LP_peersquery(mypeer,pubsock,seednode,myport,mypeer->ipaddr,myport,profitmargin); - } - else - { - if ( seednode == 0 || seednode[0] == 0 ) - { - OS_randombytes((void *)&r,sizeof(r)); - for (j=0; j= 0 ) + int32_t i,j; uint32_t r; + if ( IAMLP != 0 ) { - if ( nn_connect(sock,pushaddr) < 0 ) - printf("connect error %s\n",nn_strerror(nn_errno())); - else + LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); + if ( myipaddr == 0 || mypeer == 0 ) { - sleep(2); - timeout = 1; - nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - //n = nn_send(sock,"nn_tests",(int32_t)strlen("nn_tests")+1,0*NN_DONTWAIT); - sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); - n = LP_send(sock,msg,0);// - sleep(1); - //m = nn_recv(pullsock,&ptr,NN_MSG,0); - LP_pullsock_check("127.0.0.1",-1,pullsock,0.); - printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes -> %d, recv.%d\n",n,pullsock,m); + printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); + exit(-1); } + if ( seednode == 0 || seednode[0] == 0 ) + { + for (i=0; i 25 ) + continue; + LP_peersquery(mypeer,pubsock,default_LPnodes[i],myport,mypeer->ipaddr,myport,profitmargin); + } + } else LP_peersquery(mypeer,pubsock,seednode,myport,mypeer->ipaddr,myport,profitmargin); + } + else + { + if ( myipaddr == 0 ) + { + printf("couldnt get myipaddr\n"); + exit(-1); + } + if ( seednode == 0 || seednode[0] == 0 ) + { + OS_randombytes((void *)&r,sizeof(r)); + for (j=0; j= 0 ) - { - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_MAXTTL,&timeout,sizeof(timeout)); - nanomsg_transportname(1,bindaddr,myipaddr,mypullport); - if ( nn_bind(pullsock,bindaddr) >= 0 ) - { - maxsize = 2 * 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - //LP_pullsock_check(myipaddr,-1,pullsock,0.); - } - else - { - printf("bind to %s error for %s: %s\n",bindaddr,pushaddr,nn_strerror(nn_errno())); - exit(-1); - } - } - //nn_tests(pullsock,pushaddr); - printf("my command address is (%s) pullsock.%d\n",pushaddr,pullsock); if ( IAMLP != 0 ) { - if ( myipaddr != 0 ) + pubsock = -1; + nanomsg_transportname(0,subaddr,myipaddr,mypubport); + nanomsg_transportname(1,bindaddr,myipaddr,mypubport); + if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { - pubsock = -1; - nanomsg_transportname(0,subaddr,myipaddr,mypubport); - nanomsg_transportname(1,bindaddr,myipaddr,mypubport); - if ( (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + if ( nn_bind(pubsock,bindaddr) >= 0 ) { - if ( nn_bind(pubsock,bindaddr) >= 0 ) - { - timeout = 10; - nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - } - else - { - printf("error binding to (%s).%d (%s).%d\n",pushaddr,pullsock,subaddr,pubsock); - if ( pubsock >= 0 ) - nn_close(pubsock), pubsock = -1; - } - } else printf("error getting sockets %d %d\n",pullsock,pubsock); - printf(">>>>>>>>> myipaddr.%s (%s %s) pubsock.%d pullsock.%d\n",myipaddr,pushaddr,subaddr,pubsock,pullsock); - LP_mypubsock = pubsock; - LP_mypeer = mypeer = LP_addpeer(mypeer,pubsock,myipaddr,myport,0,0,profitmargin,0,0); - } - if ( myipaddr == 0 || mypeer == 0 ) - { - printf("couldnt get myipaddr or null mypeer.%p\n",mypeer); - exit(-1); - } + timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + } + else + { + printf("error binding to (%s).%d\n",subaddr,pubsock); + if ( pubsock >= 0 ) + nn_close(pubsock), pubsock = -1; + } + } else printf("error getting pubsock %d\n",pubsock); + printf(">>>>>>>>> myipaddr.%s (%s) pullsock.%d\n",myipaddr,subaddr,pubsock); + LP_mypubsock = pubsock; } - else if ( myipaddr == 0 ) + LP_initpeers(pubsock,mypeer,myipaddr,myport,jstr(argjson,"seednode"),profitmargin); + pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); + LP_deadman_switch = (uint32_t)time(NULL); + printf("my command address is (%s) pullsock.%d pullport.%u\n",pushaddr,pullsock,mypullport); + LP_initcoins(pubsock,jobj(argjson,"coins"),passphrase); + if ( IAMLP != 0 && OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)LP_psockloop,(void *)&myipaddr) != 0 ) { - printf("couldnt get myipaddr\n"); + printf("error launching LP_psockloop for (%s)\n",myipaddr); exit(-1); } -LP_mainloop(myipaddr,mypeer,mypubport,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin,jobj(argjson,"coins"),jstr(argjson,"seednode")); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)stats_rpcloop,(void *)&myport) != 0 ) + { + printf("error launching stats rpcloop for port.%u\n",myport); + exit(-1); + } + while ( 1 ) + { + if ( 0 && (rand() % 100) == 0 ) + printf("mainloop\n"); + if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) + usleep(100000); + if ( LP_canbind == 0 && LP_deadman_switch < time(NULL)-777 ) + { + printf("DEAD man's switch activated, register forwarding again\n"); + if ( pullsock >= 0 ) + nn_close(pullsock); + pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); + LP_deadman_switch = (uint32_t)time(NULL); + LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); + } + } } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index da995ef5f..ca3204cf5 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -17,7 +17,17 @@ // LP_network.c // marketmaker // -// jl777: might need to queue outbound packets and send via separate thread + +#define PSOCK_IDLETIMEOUT (2 * INSTANTDEX_LOCKTIME + 600) +struct psock +{ + uint32_t lasttime,lastping; + int32_t recvsock,sendsock,ispaired; + uint16_t recvport,sendport; + char sendaddr[128]; +} *PSOCKS; + +uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { @@ -43,7 +53,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { - if ( (sentbytes= nn_send(sock,msg,len,0*NN_DONTWAIT)) != len ) + if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) printf("LP_send sent %d instead of %d\n",sentbytes,len); //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) @@ -86,3 +96,304 @@ uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbit free(buf); return(nextbits); } + +void LP_psockloop(void *_ptr) +{ + int32_t i,n,nonz,iter,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd pfd,*pfds; char keepalive[512];//,*myipaddr = _ptr; + while ( 1 ) + { + now = (uint32_t)time(NULL); + if ( buf != 0 && ptr != 0 && sendsock >= 0 ) + { + if ( size > 0 ) + { + pfd.fd = ptr->sendsock; + pfd.events = NN_POLLOUT; + if ( nn_poll(&pfd,1,1) > 0 ) + { + if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) + { + ptr->lasttime = now; + printf("PSOCKS (%d %d %d) -> %d/%d bytes\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes); + } else printf("send error to %s\n",ptr->sendaddr); + if ( buf != 0 ) + { + if ( buf != keepalive ) + nn_freemsg(buf); + buf = 0; + size = 0; + ptr = 0; + sendsock = -1; + } + } + } + } + else if ( Numpsocks > 0 ) + { + pfds = calloc(Numpsocks,sizeof(*pfds) * 2); + portable_mutex_lock(&LP_psockmutex); + for (iter=0; iter<2; iter++) + { + for (i=n=0; irecvsock; + pfds[n].events = POLLIN; + } + else + { + if ( pfds[n].fd != ptr->recvsock ) + { + printf("unexpected fd.%d mismatched recvsock.%d\n",pfds[n].fd,ptr->recvsock); + break; + } + else if ( (pfds[n].revents & POLLIN) != 0 ) + { + if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) + { + ptr->lasttime = now; + sendsock = ptr->sendsock; + break; + } + } + } + n++; + if ( ptr->ispaired != 0 ) + { + if ( iter == 0 ) + { + pfds[n].fd = ptr->sendsock; + pfds[n].events = POLLIN; + } + else + { + if ( pfds[n].fd != ptr->sendsock ) + { + printf("unexpected fd.%d mismatched sendsock.%d\n",pfds[n].fd,ptr->sendsock); + break; + } + else if ( (pfds[n].revents & POLLIN) != 0 ) + { + ptr->lasttime = now; + sendsock = ptr->recvsock; + } + } + n++; + } + } + if ( iter == 0 && nn_poll(pfds,n,10) <= 0 ) + break; + } + portable_mutex_unlock(&LP_psockmutex); + if ( sendsock < 0 ) + { + for (i=nonz=0; i ptr->lasttime+PSOCK_IDLETIMEOUT ) + { + printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); + if ( ptr->recvsock >= 0 ) + nn_close(ptr->recvsock); + if ( ptr->sendsock >= 0 ) + nn_close(ptr->sendsock); + portable_mutex_lock(&LP_psockmutex); + if ( Numpsocks > 1 ) + { + PSOCKS[i] = PSOCKS[--Numpsocks]; + memset(&PSOCKS[Numpsocks],0,sizeof(*ptr)); + } else Numpsocks = 0; + portable_mutex_unlock(&LP_psockmutex); + break; + } + else if ( now > ptr->lastping+600 ) + { + ptr->lastping = now; + sendsock = ptr->sendsock; + printf("keep %s alive\n",ptr->sendaddr); + sprintf(keepalive,"{\"method\":\"keepalive\",\"endpoint\":\"%s\"}",ptr->sendaddr); + size = (int32_t)strlen(keepalive) + 1; + buf = keepalive; + break; + } + } + } + if ( nonz == 0 && i == Numpsocks ) + usleep(100000); + } + } else usleep(100000); + } +} + +void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr) +{ + struct psock *ptr; + portable_mutex_lock(&LP_psockmutex); + PSOCKS = realloc(PSOCKS,sizeof(*PSOCKS) * (Numpsocks + 1)); + ptr = &PSOCKS[Numpsocks++]; + ptr->ispaired = ispaired; + ptr->recvsock = recvsock; + ptr->recvport = recvport; + ptr->sendsock = sendsock; + ptr->sendport = sendport; + safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); + ptr->lasttime = (uint32_t)time(NULL); + portable_mutex_unlock(&LP_psockmutex); +} + +char *LP_psock(char *myipaddr,int32_t ispaired) +{ + char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; + retjson = cJSON_CreateObject(); + pushport = Psockport++; + subport = Psockport++; + for (i=0; i<100; i++) + { + if ( pushport < 10000 ) + pushport = 10001; + if ( subport <= pushport ) + subport = pushport + 1; + pullsock = pubsock = -1; + nanomsg_transportname(1,pushaddr,myipaddr,pushport), pushport += 2; + nanomsg_transportname(1,subaddr,myipaddr,subport), subport += 2; + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PUB)) >= 0 ) + { + if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) + { + timeout = 1; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + maxsize = 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + if ( ispaired != 0 ) + { + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + } + LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"connectaddr",subaddr); + jaddstr(retjson,"LPipaddr",myipaddr); + jaddnum(retjson,"connectport",subport); + jaddnum(retjson,"ispaired",ispaired); + jaddstr(retjson,"publicaddr",pushaddr); + jaddnum(retjson,"publicport",pushport); + break; + } + if ( pullsock >= 0 ) + nn_close(pullsock); + if ( pubsock >= 0 ) + nn_close(pubsock); + } + } + if ( Psockport > 60000 ) + Psockport = 10000; + if ( i == 100 ) + jaddstr(retjson,"error","cant find psock ports"); + return(jprint(retjson,1)); +} + +/* + LP_pushaddr_get makes transparent the fact that most nodes cannot bind()! + + The idea is to create an LP node NN_PAIR sock that the LP node binds to and client node connects to. Additionally, the LP node creates an NN_PULL that other nodes can NN_PUSH to and returns this address in pushaddr/retval for the client node to register with. The desired result is that other than the initial LP node, all the other nodes do a normal NN_PUSH, requiring no change to the NN_PUSH/NN_PULL logic. Of course, the initial LP node needs to autoforward all packets from the public NN_PULL to the NN_PUB + + similar to LP_pushaddr_get, create an NN_PAIR for DEX atomic data, can be assumed to have a max lifetime of 2*INSTANTDEX_LOCKTIME + + both are combined in LP_psock_get + +*/ + +int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) +{ + int32_t sock,n,timeout,retval = -1; char msg[512],*retstr; + printf("nn_tests.(%s)\n",pushaddr); + if ( (sock= nn_socket(AF_SP,nnother)) >= 0 ) + { + if ( nn_connect(sock,pushaddr) < 0 ) + printf("connect error %s\n",nn_strerror(nn_errno())); + else + { + timeout = 1; + //nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); + n = LP_send(sock,msg,0); + LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes -> %d (%s)\n",n,pullsock,retstr!=0?retstr:""); + if ( retstr != 0 ) + { + free(retstr); + retval = 0; + } + } + nn_close(sock); + } + return(retval); +} + +int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr,uint16_t mypullport,int32_t ispaired) +{ + int32_t nntype,pullsock,timeout,maxsize; char bindaddr[128],connectaddr[128]; + *mypullportp = mypullport; + if ( ispaired == 0 ) + { + if ( LP_canbind != 0 ) + nntype = LP_COMMAND_RECVSOCK; + else nntype = NN_SUB; + } + else nntype = NN_PAIR; + if ( LP_canbind != 0 ) + { + nanomsg_transportname(0,publicaddr,myipaddr,mypullport); + nanomsg_transportname(1,bindaddr,myipaddr,mypullport); + } + else + { + *mypullportp = 0; + while ( *mypullportp == 0 ) + { + *mypullportp = LP_psock_get(connectaddr,publicaddr,ispaired); + sleep(10); + printf("try to get publicaddr again\n"); + } + } + if ( (pullsock= nn_socket(AF_SP,nntype)) >= 0 ) + { + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_MAXTTL,&timeout,sizeof(timeout)); + maxsize = 2 * 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + if ( LP_canbind == 0 ) + { + if ( nn_connect(pullsock,connectaddr) < 0 ) + { + printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); + exit(-1); + } + if ( nntype == NN_SUB ) + nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + } + else + { + if ( nn_bind(pullsock,bindaddr) < 0 ) + { + printf("bind to %s error for %s: %s\n",bindaddr,publicaddr,nn_strerror(nn_errno())); + exit(-1); + } + } + } + if ( ispaired == 0 && nn_tests(pullsock,publicaddr,LP_COMMAND_SENDSOCK) < 0 ) + { + printf("command socket didnt work\n"); + exit(-1); + } + return(pullsock); +} diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index f9562a7b7..376cd8a91 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -338,24 +338,32 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho return(price); } -int32_t LP_nanobind(int32_t pair,char *pairstr,char *myipaddr) +int32_t LP_nanobind(char *pairstr,char *myipaddr) { - int32_t i,timeout,r; char bindaddr[128]; - for (i=0; i<10; i++) + int32_t i,timeout,r,pairsock = -1; uint16_t mypullport; char bindaddr[128]; + if ( LP_canbind != 0 ) { - r = (10000 + (rand() % 50000)) & 0xffff; - nanomsg_transportname(0,pairstr,myipaddr,r); - nanomsg_transportname(1,bindaddr,myipaddr,r); - if ( nn_bind(pair,bindaddr) >= 0 ) + if ( (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) + printf("error creating utxo->pair\n"); + else { - timeout = 100; - nn_setsockopt(pair,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pair,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - printf("nanobind %s to %d\n",pairstr,pair); - return(0); - } else printf("error binding to %s for %s\n",bindaddr,pairstr); - } - return(-1); + for (i=0; i<10; i++) + { + r = (10000 + (rand() % 50000)) & 0xffff; + nanomsg_transportname(0,pairstr,myipaddr,r); + nanomsg_transportname(1,bindaddr,myipaddr,r); + if ( nn_bind(pairsock,bindaddr) >= 0 ) + { + timeout = 100; + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + printf("nanobind %s to %d\n",pairstr,pairsock); + return(pairsock); + } else printf("error binding to %s for %s\n",bindaddr,pairstr); + } + } + } else pairsock = LP_initpublicaddr(&mypullport,pairstr,myipaddr,0,0); + return(pairsock); } int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) @@ -366,9 +374,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) { - if ( (pair= nn_socket(AF_SP,NN_PAIR)) < 0 ) - printf("error creating utxo->pair\n"); - else if ( LP_nanobind(pair,pairstr,myipaddr) >= 0 ) + if ( (pair= LP_nanobind(pairstr,myipaddr)) >= 0 ) { LP_requestinit(&qp->R,qp->srchash,qp->desthash,base,qp->satoshis,rel,qp->destsatoshis,qp->timestamp,qp->quotetime,DEXselector); swap = LP_swapinit(1,0,privkey,&qp->R,qp); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 89e52a64b..751696ceb 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -109,12 +109,47 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *ipaddr,uint16_t pushport) { char url[512],str[65],*retstr; - sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s&pushport=%u",destip,destport,bits256_str(str,pubkey),ipaddr,pushport); + sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s&pushport=%u",destip,destport,bits256_str(str,pubkey),ipaddr,pushport); retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); return(retstr); } +char *issue_LP_psock(char *destip,uint16_t destport,int32_t ispaired) +{ + char url[512],*retstr; + sprintf(url,"http://%s:%u/api/stats/psock?ispaired=%d",destip,destport,ispaired); + retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); + return(retstr); +} + +uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) +{ + uint16_t publicport = 0; char *retstr,*addr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; + connectaddr[0] = publicaddr[0] = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + if ( (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (addr= jstr(retjson,"publicaddr")) != 0 ) + safecopy(publicaddr,addr,128); + if ( (addr= jstr(retjson,"connectaddr")) != 0 ) + safecopy(connectaddr,addr,128); + if ( publicaddr[0] != 0 && connectaddr[0] != 0 ) + publicport = juint(retjson,"publicport"); + free_json(retjson); + } + free(retstr); + } + if ( publicport != 0 ) + break; + } + return(publicport); +} + char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) { char url[512],str[65]; diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index ef3d623c6..28f3b6aa4 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -735,7 +735,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch memset(signedtxidp,0,sizeof(*signedtxidp)); if ( finalseqid == 0 ) locktime = expiration; - printf("bobtxspend.%s redeem.[%d]\n",symbol,redeemlen); + //printf("bobtxspend.%s redeem.[%d]\n",symbol,redeemlen); if ( redeemlen < 0 ) return(0); #ifndef BASILISK_DISABLESENDTX @@ -758,11 +758,8 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch else printf("unexpected small value %.8f vs txfee %.8f\n",dstr(value),dstr(txfee)); if ( destamountp != 0 ) *destamountp = satoshis; - printf("destamountp %p\n",destamountp); timestamp = (uint32_t)time(NULL); - printf("t %u V.%p %ld\n",timestamp,V,sizeof(V)); memset(V,0,sizeof(V)); - printf("cleared V\n"); privkeys = cJSON_CreateArray(); if ( privkey2p != 0 ) { @@ -772,7 +769,6 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; } else V[0].N = V[0].M = 1; - printf("what?\n"); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(ctx,V[0].signers[0].pubkey,privkey); bitcoin_priv2wif(wifstr,privkey,wiftype); @@ -795,7 +791,6 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch jaddnum(item,"vout",vout); bitcoin_address(tmpaddr,pubtype,pubkey33,33); bitcoin_addr2rmd160(&addrtype,rmd160,tmpaddr); - printf("before redeem\n"); if ( redeemlen != 0 ) { init_hexbytes_noT(hexstr,redeemscript,redeemlen); @@ -835,13 +830,12 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch changelen = bitcoin_standardspend(changescript,0,changermd160); txobj = bitcoin_txoutput(txobj,changescript,changelen,change); } - printf("call json2hex\n"); if ( (rawtxbytes= bitcoin_json2hex(isPoS,&txid,txobj,V)) != 0 ) { char str[65]; completed = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); - printf("locktime.%u sequenceid.%x rawtx.(%s) vins.(%s)\n",locktime,sequenceid,rawtxbytes,jprint(vins,0)); + //printf("locktime.%u sequenceid.%x rawtx.(%s) vins.(%s)\n",locktime,sequenceid,rawtxbytes,jprint(vins,0)); if ( (completed= iguana_signrawtransaction(ctx,symbol,pubtype,p2shtype,isPoS,1000000,&msgtx,&signedtx,signedtxidp,V,1,rawtxbytes,vins,privkeys)) < 0 ) //if ( (signedtx= LP_signrawtx(symbol,signedtxidp,&completed,vins,rawtxbytes,privkeys,V)) == 0 ) printf("couldnt sign transaction.%s %s\n",name,bits256_str(str,*signedtxidp)); @@ -1501,7 +1495,6 @@ void basilisk_alicepayment(struct basilisk_swap *swap,struct iguana_info *coin,s int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { char coinaddr[64]; int32_t i,retval = -1; - printf("alicetx\n"); if ( swap->alicepayment.I.datalen == 0 ) basilisk_alicepayment(swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.spendlen == 0 ) From 752ba42479f9d21416697ff4f2314250342a3c8f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:33:42 +0300 Subject: [PATCH 712/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 6 +++--- iguana/exchanges/LP_ordermatch.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 5bd361ae4..f11f17828 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -250,7 +250,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu { if ( bits256_cmp(pubkey,LP_mypubkey) == 0 ) { - //printf("GOT FORWARDED.(%s)\n",jsonstr); + printf("GOT FORWARDED.(%s)\n",myipaddr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index e61d6f4f5..837f94dfb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -229,7 +229,7 @@ int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pu if ( mypeer == 0 || strcmp(peer->ipaddr,mypeer->ipaddr) != 0 ) { peer->lastutxos = now; - printf("query utxos from %s\n",peer->ipaddr); + //printf("query utxos from %s\n",peer->ipaddr); n = LP_utxosquery(mypeer,pubsock,peer->ipaddr,peer->port,"",lastn,mypeer != 0 ? mypeer->ipaddr : "127.0.0.1",myport,profitmargin); } } //else printf("LP_peer_utxosquery skip.(%s) %u\n",peer->ipaddr,peer->lastutxos); @@ -271,7 +271,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; } - nonz += LP_subsock_check(myipaddr,pubsock,peer->subsock,profitmargin); + nonz += LP_subsock_check(origipaddr,pubsock,peer->subsock,profitmargin); } if ( (counter % 600) == 60 ) { @@ -303,7 +303,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); + nonz += LP_pullsock_check(&retstr,origipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) free(retstr); if ( IAMLP != 0 && (counter % 600) == 42 ) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 376cd8a91..f03da6a7e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -369,7 +369,7 @@ int32_t LP_nanobind(char *pairstr,char *myipaddr) int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; - printf("LP_connectstartbob with.(%s)\n",jprint(argjson,0)); + printf("LP_connectstartbob.(%s) with.(%s)\n",myipaddr,jprint(argjson,0)); qp->quotetime = (uint32_t)time(NULL); privkey = LP_privkey(utxo->coinaddr); if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) From 95c6ac69007971fe57fa28550c529fcc37a8d6a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:37:53 +0300 Subject: [PATCH 713/910] Test --- iguana/exchanges/LP_network.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index ca3204cf5..7a1044edf 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -275,6 +275,8 @@ char *LP_psock(char *myipaddr,int32_t ispaired) nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } + nanomsg_transportname(0,pushaddr,myipaddr,pushport); + nanomsg_transportname(0,subaddr,myipaddr,subport); LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr); jaddstr(retjson,"result","success"); jaddstr(retjson,"connectaddr",subaddr); From c5f600267f90ecc9313a00f0d9a0a41b060deeff Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:43:26 +0300 Subject: [PATCH 714/910] Test --- iguana/exchanges/LP_commands.c | 8 ++++++++ iguana/exchanges/LP_rpc.c | 1 + 2 files changed, 9 insertions(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index ade4ba249..2a1880b42 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -239,7 +239,15 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"forwardhex") == 0 ) retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"psock") == 0 ) + { + if ( myipaddr == 0 || myipaddr[0] == 0 || strcmp(myipaddr,"127.0.0.1") == 0 ) + { + if ( LP_mypeer != 0 ) + myipaddr = LP_mypeer->ipaddr; + else printf("LP_psock dont have actual ipaddr?\n"); + } return(LP_psock(myipaddr,jint(argjson,"ispaired"))); + } else if ( strcmp(method,"notify") == 0 ) retstr = clonestr("{\"result\":\"success\",\"notify\":\"received\"}"); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 751696ceb..cd9155e5c 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -132,6 +132,7 @@ uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) { if ( (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) { + printf("got.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (addr= jstr(retjson,"publicaddr")) != 0 ) From 6ad435df91c6b4d0aead1463fb6eb2f5f94e6e6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:50:35 +0300 Subject: [PATCH 715/910] Test --- iguana/exchanges/LP_network.c | 3 ++- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7a1044edf..ec3bf6c42 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -279,8 +279,8 @@ char *LP_psock(char *myipaddr,int32_t ispaired) nanomsg_transportname(0,subaddr,myipaddr,subport); LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr); jaddstr(retjson,"result","success"); - jaddstr(retjson,"connectaddr",subaddr); jaddstr(retjson,"LPipaddr",myipaddr); + jaddstr(retjson,"connectaddr",subaddr); jaddnum(retjson,"connectport",subport); jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); @@ -321,6 +321,7 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) printf("connect error %s\n",nn_strerror(nn_errno())); else { + sleep(3); timeout = 1; //nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index cd9155e5c..5f3007957 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -132,7 +132,7 @@ uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) { if ( (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) { - printf("got.(%s)\n",retstr); + //printf("got.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (addr= jstr(retjson,"publicaddr")) != 0 ) From a7529c86d9242c236e453773efac2a5a8ff4bab7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 22:58:40 +0300 Subject: [PATCH 716/910] Test --- iguana/exchanges/LP_network.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index ec3bf6c42..a1279b840 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -99,7 +99,7 @@ uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbit void LP_psockloop(void *_ptr) { - int32_t i,n,nonz,iter,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd pfd,*pfds; char keepalive[512];//,*myipaddr = _ptr; + int32_t i,n,nonz,iter,retval,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd pfd,*pfds; char keepalive[512];//,*myipaddr = _ptr; while ( 1 ) { now = (uint32_t)time(NULL); @@ -151,6 +151,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { + printf("%s has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) { ptr->lasttime = now; @@ -176,17 +177,29 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - ptr->lasttime = now; - sendsock = ptr->recvsock; + printf("%s paired has pollin\n",ptr->sendaddr); + if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) + { + ptr->lasttime = now; + sendsock = ptr->recvsock; + break; + } } } n++; } } - if ( iter == 0 && nn_poll(pfds,n,10) <= 0 ) - break; + if ( iter == 0 ) + { + if ( (retval= nn_poll(pfds,n,10)) <= 0 ) + { + printf("nn_poll retval.%d\n",retval); + break; + } + } } portable_mutex_unlock(&LP_psockmutex); + free(pfds); if ( sendsock < 0 ) { for (i=nonz=0; i Date: Mon, 19 Jun 2017 23:05:55 +0300 Subject: [PATCH 717/910] Test --- iguana/exchanges/LP_network.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index a1279b840..5f6f653d6 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -193,7 +193,8 @@ void LP_psockloop(void *_ptr) { if ( (retval= nn_poll(pfds,n,10)) <= 0 ) { - printf("nn_poll retval.%d\n",retval); + if ( retval != 0 ) + printf("nn_poll retval.%d\n",retval); break; } } @@ -207,7 +208,14 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) + if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) + { + printf("got %d bytes for %s\n",size,ptr->sendaddr); + ptr->lasttime = now; + sendsock = ptr->sendsock; + break; + } + else if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); if ( ptr->recvsock >= 0 ) From 4e6b7b4db9ed9b5b3b1da3a2d5871a5c61a2ff7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:13:09 +0300 Subject: [PATCH 718/910] Test --- iguana/exchanges/LP_network.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 5f6f653d6..a01263ea4 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -306,6 +306,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); + printf("pushaddr.(%s) for %s\n",pushaddr,subaddr); break; } if ( pullsock >= 0 ) @@ -413,7 +414,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } } } - if ( ispaired == 0 && nn_tests(pullsock,publicaddr,LP_COMMAND_SENDSOCK) < 0 ) + if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,LP_COMMAND_SENDSOCK) < 0 ) { printf("command socket didnt work\n"); exit(-1); From 31a9d64ece7b0c44f739f23d3896e2da0e19c8fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:15:56 +0300 Subject: [PATCH 719/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index f11f17828..3f781bac9 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -154,7 +154,7 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int3 } HASH_ITER(hh,LP_peerinfos,peer,tmp) { - //printf("register with (%s)\n",peer->ipaddr); + printf("register %s %u with (%s)\n",pushaddr,pushport,peer->ipaddr); if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr,pushport)) != 0 ) { //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); From 798c2b20dab81f57a4782a4817e2412f44fbbc54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:19:14 +0300 Subject: [PATCH 720/910] Test --- iguana/exchanges/LP_forwarding.c | 7 ++++--- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 3f781bac9..d1d94f943 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -146,16 +146,17 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) { - char *retstr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; + char *retstr,ipaddr[64];; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) { printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); return; } + parse_ipaddr(ipaddr,pushaddr); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("register %s %u with (%s)\n",pushaddr,pushport,peer->ipaddr); - if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,pushaddr,pushport)) != 0 ) + printf("register %s %u with (%s)\n",ipaddr,pushport,peer->ipaddr); + if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,ipaddr,pushport)) != 0 ) { //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 837f94dfb..c475c64e8 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -278,7 +278,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_myutxo_updates(pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,origipaddr,pushport,10); + LP_forwarding_register(LP_mypubkey,pushaddr,pushport,10); lastforward = now; } } From cbb169d8a714d0ec32b421b7d923748335ad8864 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:21:37 +0300 Subject: [PATCH 721/910] Test --- iguana/exchanges/LP_forwarding.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index d1d94f943..7d629226f 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -146,16 +146,19 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) { - char *retstr,ipaddr[64];; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t n=0,retval = -1; + char *retstr,ipaddr[64]; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t j,n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) { printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); return; } - parse_ipaddr(ipaddr,pushaddr); + for (j=0; pushaddr[j]!=0; j++) + if ( pushaddr[j] >= '0' && pushaddr[j] <= '9' ) + break; + parse_ipaddr(ipaddr,pushaddr+j); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("register %s %u with (%s)\n",ipaddr,pushport,peer->ipaddr); + printf("register.(%s) %s %u with (%s)\n",pushaddr,ipaddr,pushport,peer->ipaddr); if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,ipaddr,pushport)) != 0 ) { //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); From bdebe8a6b2f485a8cd1a1f1efca39f7ea4e5a14c Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:23:10 +0300 Subject: [PATCH 722/910] 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 a01263ea4..7b0491b73 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -31,7 +31,7 @@ uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } From 6fb2469baa406ab72e0c3c5a70443ee0d80e68c6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:31:08 +0300 Subject: [PATCH 723/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c475c64e8..7cb8c592a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -303,7 +303,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - nonz += LP_pullsock_check(&retstr,origipaddr,pubsock,pullsock,profitmargin); + nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) free(retstr); if ( IAMLP != 0 && (counter % 600) == 42 ) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7b0491b73..2840d3a95 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -401,7 +401,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); - } + } else printf("nntype.%d NN_SUB.%d to %s\n",nntype,NN_SUB,connectaddr); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } From 524699a3c752493eb60c4542c677a1acce655479 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:40:48 +0300 Subject: [PATCH 724/910] Test --- iguana/exchanges/LP_forwarding.c | 1 + iguana/exchanges/LP_network.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 7d629226f..f7096f3fc 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -120,6 +120,7 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) { nn_close(ptr->pushsock); printf("recreate pushsock for %s\n",pushaddr); + strcpy(ptr->pushaddr,pushaddr); if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); } else printf("no need to create identical endpoint\n"); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 2840d3a95..163fe57f7 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -114,7 +114,7 @@ void LP_psockloop(void *_ptr) if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) { ptr->lasttime = now; - printf("PSOCKS (%d %d %d) -> %d/%d bytes\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes); + printf("PSOCKS (%d %d %d) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes,ptr->sendaddr); } else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) { @@ -156,6 +156,7 @@ void LP_psockloop(void *_ptr) { ptr->lasttime = now; sendsock = ptr->sendsock; + printf("[%s]\n",(char *)buf); break; } } @@ -208,14 +209,14 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) + /*if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) { printf("got %d bytes for %s\n",size,ptr->sendaddr); ptr->lasttime = now; sendsock = ptr->sendsock; break; } - else if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) + else*/ if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); if ( ptr->recvsock >= 0 ) From 58e085cd9c04d32ca1fd356498e9ebe1d4506897 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Jun 2017 23:57:18 +0300 Subject: [PATCH 725/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 163fe57f7..ecabf3e4e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -392,8 +392,8 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_MAXTTL,&timeout,sizeof(timeout)); + if ( nntype == NN_PAIR ) + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( LP_canbind == 0 ) From dba572ca23254beff47fe0f6aeb5d127d4b7d0d9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 00:06:35 +0300 Subject: [PATCH 726/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 ++ iguana/exchanges/LP_network.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7cb8c592a..7f720ef5e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -160,6 +160,8 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t *retstrp = 0; while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { + if ( IAMLP == 0 ) + printf("pullsock.%d recv.%d (%s)\n",pullsock,recvlen,(char *)ptr); nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index ecabf3e4e..0c7c4b60e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -383,7 +383,8 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, *mypullportp = 0; while ( *mypullportp == 0 ) { - *mypullportp = LP_psock_get(connectaddr,publicaddr,ispaired); + if ( (*mypullportp= LP_psock_get(connectaddr,publicaddr,ispaired)) != 0 ) + break; sleep(10); printf("try to get publicaddr again\n"); } From 2c38bf9e42da502a389d1637c53ab9ab2737d621 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 00:10:10 +0300 Subject: [PATCH 727/910] Test --- iguana/exchanges/LP_network.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 0c7c4b60e..1b063d9ba 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -403,9 +403,15 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); - } else printf("nntype.%d NN_SUB.%d to %s\n",nntype,NN_SUB,connectaddr); + } else printf("nntype.%d NN_SUB.%d connect to %s\n",nntype,NN_SUB,connectaddr); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + while ( 1 ) + { + int32_t size; void *buf; + if ( (size= nn_recv(pullsock,&buf,NN_MSG,0)) > 0 ) + printf("SUBPULL.(%s)\n",(char *)buf); + } } else { From 8aac839d06a4e26badba76b2a90b96dfd3fb5094 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 00:17:20 +0300 Subject: [PATCH 728/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_network.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index f7096f3fc..b2fec4bbf 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -65,7 +65,7 @@ int32_t LP_hello(struct LP_forwardinfo *ptr) return(i); } } - printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); + //printf("%d iterations on nn_poll and %s pushsock still not ready\n",i,ptr->pushaddr); return(-1); } return(0); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 1b063d9ba..8f0a2f64e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -232,7 +232,7 @@ void LP_psockloop(void *_ptr) portable_mutex_unlock(&LP_psockmutex); break; } - else if ( now > ptr->lastping+600 ) + else if ( now > ptr->lastping+60 ) { ptr->lastping = now; sendsock = ptr->sendsock; @@ -286,8 +286,9 @@ char *LP_psock(char *myipaddr,int32_t ispaired) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { - timeout = 1; + timeout = 10; nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); @@ -406,7 +407,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } else printf("nntype.%d NN_SUB.%d connect to %s\n",nntype,NN_SUB,connectaddr); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - while ( 1 ) + while ( 0 ) { int32_t size; void *buf; if ( (size= nn_recv(pullsock,&buf,NN_MSG,0)) > 0 ) From 2b79dff117f838f8ca30a37f7e6f5bcf6abae97f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 00:19:49 +0300 Subject: [PATCH 729/910] 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 8f0a2f64e..9fd93d54e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -310,7 +310,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"publicport",pushport); printf("pushaddr.(%s) for %s\n",pushaddr,subaddr); break; - } + } else printf("bind error on %s or %s\n",pushaddr,subaddr); if ( pullsock >= 0 ) nn_close(pullsock); if ( pubsock >= 0 ) From 51b18b1dea7452df95aaabbca110dff7d6da921e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 09:44:49 +0300 Subject: [PATCH 730/910] Test --- iguana/exchanges/LP_forwarding.c | 2 ++ iguana/exchanges/LP_network.c | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index b2fec4bbf..505ae8a33 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -119,6 +119,8 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) if ( strcmp(pushaddr,ptr->pushaddr) != 0 ) { nn_close(ptr->pushsock); + if ( LP_psockmark(ptr->pushaddr) < 0 ) + printf("cant mark (%s)\n",ptr->pushaddr); printf("recreate pushsock for %s\n",pushaddr); strcpy(ptr->pushaddr,pushaddr); if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 9fd93d54e..71cc904f8 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -24,7 +24,7 @@ struct psock uint32_t lasttime,lastping; int32_t recvsock,sendsock,ispaired; uint16_t recvport,sendport; - char sendaddr[128]; + char sendaddr[128],publicaddr[128]; } *PSOCKS; uint16_t Numpsocks,Psockport = 10000; @@ -113,7 +113,6 @@ void LP_psockloop(void *_ptr) { if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) { - ptr->lasttime = now; printf("PSOCKS (%d %d %d) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes,ptr->sendaddr); } else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) @@ -251,7 +250,7 @@ void LP_psockloop(void *_ptr) } } -void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr) +void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr,char *publicaddr) { struct psock *ptr; portable_mutex_lock(&LP_psockmutex); @@ -263,10 +262,30 @@ void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sen ptr->sendsock = sendsock; ptr->sendport = sendport; safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); + safecopy(ptr->publicaddr,publicaddr,sizeof(ptr->publicaddr)); ptr->lasttime = (uint32_t)time(NULL); portable_mutex_unlock(&LP_psockmutex); } +int32_t LP_psockmark(char *publicaddr) +{ + int32_t i,retval = -1; struct psock *ptr; + portable_mutex_lock(&LP_psockmutex); + for (i=0; ipublicaddr) == 0 ) + { + printf("mark PSOCKS[%d] %s for deletion\n",i,publicaddr); + ptr->lasttime = 0; + retval = i; + break; + } + } + portable_mutex_unlock(&LP_psockmutex); + return(retval); +} + char *LP_psock(char *myipaddr,int32_t ispaired) { char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; @@ -300,7 +319,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) } nanomsg_transportname(0,pushaddr,myipaddr,pushport); nanomsg_transportname(0,subaddr,myipaddr,subport); - LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr); + LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr,pushaddr); jaddstr(retjson,"result","success"); jaddstr(retjson,"LPipaddr",myipaddr); jaddstr(retjson,"connectaddr",subaddr); From 7e01c0abc2bc36ac4112d58cd8445ab6500a42d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:02:00 +0300 Subject: [PATCH 731/910] Test --- iguana/exchanges/LP_coins.c | 1 + iguana/exchanges/LP_network.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index d2c4b994c..06ea91849 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -256,6 +256,7 @@ struct iguana_info *LP_coinfind(char *symbol) } // "coins":[{"coin":"", "rpcport":pppp}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }] +// {"coin":"HUSH", "name":"hushcoin", "rpcport":8822, "taddr":28, "pubtype":184, "p2shtype":189, "wiftype":128, "txfee":10000 } struct iguana_info *LP_coincreate(cJSON *item) { diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 71cc904f8..7b29283c9 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -327,7 +327,12 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); - printf("pushaddr.(%s) for %s\n",pushaddr,subaddr); + printf("publicaddr.(%s) for %s\n",pushaddr,subaddr); + while ( 1 ) + { + LP_send(pubsock,"hello",0); + sleep(10); + } break; } else printf("bind error on %s or %s\n",pushaddr,subaddr); if ( pullsock >= 0 ) @@ -426,11 +431,13 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } else printf("nntype.%d NN_SUB.%d connect to %s\n",nntype,NN_SUB,connectaddr); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - while ( 0 ) + while ( 1 ) { int32_t size; void *buf; if ( (size= nn_recv(pullsock,&buf,NN_MSG,0)) > 0 ) printf("SUBPULL.(%s)\n",(char *)buf); + else printf("size.%d\n",size); + sleep(10); } } else From 1a3d64ac2c1c0dcae664a518b055fd90ecad2646 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:05:59 +0300 Subject: [PATCH 732/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7f720ef5e..88b064f4e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -32,7 +32,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +char *default_LPnodes[] = { "5.9.253.195", };//"5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // uint32_t LP_deadman_switch; int32_t LP_mypubsock = -1; diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7b29283c9..1f9eaeb4e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -330,7 +330,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) printf("publicaddr.(%s) for %s\n",pushaddr,subaddr); while ( 1 ) { - LP_send(pubsock,"hello",0); + printf("LP_Send %d\n",LP_send(pubsock,"hello",0)); sleep(10); } break; From 6e48150672545efaa456135df748509b7f6d4712 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:11:54 +0300 Subject: [PATCH 733/910] 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 1f9eaeb4e..a189d1bf5 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -431,7 +431,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } else printf("nntype.%d NN_SUB.%d connect to %s\n",nntype,NN_SUB,connectaddr); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - while ( 1 ) + while ( 0 ) { int32_t size; void *buf; if ( (size= nn_recv(pullsock,&buf,NN_MSG,0)) > 0 ) From c8d2cb7e1fc691d736390c92b1f165dd395806b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:24:48 +0300 Subject: [PATCH 734/910] Test --- iguana/exchanges/LP_nativeDEX.c | 13 ------------- iguana/exchanges/LP_network.c | 4 ++-- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 88b064f4e..10b06b80d 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -176,19 +176,6 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof nonz++; if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) free(retstr); - /*if ( (argjson= cJSON_Parse((char *)ptr)) != 0 ) - { - printf("%s SUB.[%d] %s\n",myipaddr,recvsize,jprint(argjson,0)); - portable_mutex_lock(&LP_commandmutex); - if ( (retstr= LP_command_process(myipaddr,-1,argjson,0,0,profitmargin)) != 0 ) - { - free(retstr); - } - portable_mutex_unlock(&LP_commandmutex); - free_json(argjson); - } else printf("error parsing.(%s)\n",(char *)ptr); - if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0;*/ } return(nonz); } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index a189d1bf5..8dfdd478f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -231,7 +231,7 @@ void LP_psockloop(void *_ptr) portable_mutex_unlock(&LP_psockmutex); break; } - else if ( now > ptr->lastping+60 ) + else if ( now > ptr->lastping+6 ) { ptr->lastping = now; sendsock = ptr->sendsock; @@ -328,7 +328,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); printf("publicaddr.(%s) for %s\n",pushaddr,subaddr); - while ( 1 ) + while ( 0 ) { printf("LP_Send %d\n",LP_send(pubsock,"hello",0)); sleep(10); From fad2841f0aebf5b29a48292ba334620c67fdb50d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:34:20 +0300 Subject: [PATCH 735/910] test --- iguana/exchanges/LP_nativeDEX.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 10b06b80d..1743f8e42 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -156,14 +156,17 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { - void *ptr; int32_t recvlen,nonz = 0; + void *ptr; int32_t recvlen=-1,nonz = 0; *retstrp = 0; - while ( pullsock >= 0 && (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( pullsock >= 0 ) { - if ( IAMLP == 0 ) - printf("pullsock.%d recv.%d (%s)\n",pullsock,recvlen,(char *)ptr); - nonz++; - *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); + if ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + { + if ( IAMLP == 0 ) + printf("pullsock.%d recv.%d (%s)\n",pullsock,recvlen,(char *)ptr); + nonz++; + *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); + } else printf("pullsock.%d recvlen.%d\n",pullsock,recvlen); } return(nonz); } From ecdbef648a4a9323afa68144b641d169441cba41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:35:04 +0300 Subject: [PATCH 736/910] 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 1743f8e42..60065b77b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -166,7 +166,7 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t printf("pullsock.%d recv.%d (%s)\n",pullsock,recvlen,(char *)ptr); nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); - } else printf("pullsock.%d recvlen.%d\n",pullsock,recvlen); + } //else printf("pullsock.%d recvlen.%d\n",pullsock,recvlen); } return(nonz); } From a326077dbee98da75e4940a9dfbc9af3a7883360 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:36:55 +0300 Subject: [PATCH 737/910] Test --- iguana/exchanges/LP_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 8dfdd478f..3ec9983dd 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -424,13 +424,13 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( LP_canbind == 0 ) { + if ( nntype == NN_SUB ) + nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); if ( nn_connect(pullsock,connectaddr) < 0 ) { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); - } else printf("nntype.%d NN_SUB.%d connect to %s\n",nntype,NN_SUB,connectaddr); - if ( nntype == NN_SUB ) - nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + } else printf("nntype.%d NN_SUB.%d connect to %s pullsock.%d\n",nntype,NN_SUB,connectaddr,pullsock); while ( 0 ) { int32_t size; void *buf; From 5ab9a062ec38afe337f343df7f7ee4705da61ccd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:50:40 +0300 Subject: [PATCH 738/910] Test --- iguana/exchanges/LP_network.c | 51 ++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 3ec9983dd..68250d23d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -107,25 +107,37 @@ void LP_psockloop(void *_ptr) { if ( size > 0 ) { - pfd.fd = ptr->sendsock; - pfd.events = NN_POLLOUT; - if ( nn_poll(&pfd,1,1) > 0 ) + if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) + printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + else printf("send error to %s\n",ptr->sendaddr); + if ( buf != 0 ) { - if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) - { - printf("PSOCKS (%d %d %d) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,size,sentbytes,ptr->sendaddr); - } else printf("send error to %s\n",ptr->sendaddr); - if ( buf != 0 ) - { - if ( buf != keepalive ) - nn_freemsg(buf); - buf = 0; - size = 0; - ptr = 0; - sendsock = -1; - } + if ( buf != keepalive ) + nn_freemsg(buf); + buf = 0; + size = 0; + ptr = 0; + sendsock = -1; } } + /* pfd.fd = ptr->sendsock; + pfd.events = NN_POLLOUT; + if ( nn_poll(&pfd,1,1) > 0 ) + { + if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) + { + printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + } else printf("send error to %s\n",ptr->sendaddr); + if ( buf != 0 ) + { + if ( buf != keepalive ) + nn_freemsg(buf); + buf = 0; + size = 0; + ptr = 0; + sendsock = -1; + } + }*/ } else if ( Numpsocks > 0 ) { @@ -327,12 +339,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); - printf("publicaddr.(%s) for %s\n",pushaddr,subaddr); - while ( 0 ) - { - printf("LP_Send %d\n",LP_send(pubsock,"hello",0)); - sleep(10); - } + printf("i.%d publicaddr.(%s) for %s\n",i,pushaddr,subaddr); break; } else printf("bind error on %s or %s\n",pushaddr,subaddr); if ( pullsock >= 0 ) From e4673d49c9ac509bd35fa408436969e4e29a63c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:52:22 +0300 Subject: [PATCH 739/910] 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 68250d23d..f069a9d84 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -31,7 +31,7 @@ uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } From d68173a40d65572c9cdbd5043535efa1d7a3009a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:53:55 +0300 Subject: [PATCH 740/910] Test --- iguana/exchanges/LP_network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f069a9d84..8c7e3d806 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -313,7 +313,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport), pushport += 2; nanomsg_transportname(1,subaddr,myipaddr,subport), subport += 2; - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PUB)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -404,7 +404,8 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nntype = LP_COMMAND_RECVSOCK; else nntype = NN_SUB; } - else nntype = NN_PAIR; + //else + nntype = NN_PAIR; if ( LP_canbind != 0 ) { nanomsg_transportname(0,publicaddr,myipaddr,mypullport); From 629542a6ffb0dc2dc8403e2316261cca44630b1e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:55:49 +0300 Subject: [PATCH 741/910] Test --- iguana/exchanges/LP_network.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 8c7e3d806..be7cb8bb3 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -402,10 +402,9 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_SUB; + else nntype = NN_PAIR; //NN_SUB; } - //else - nntype = NN_PAIR; + else nntype = NN_PAIR; if ( LP_canbind != 0 ) { nanomsg_transportname(0,publicaddr,myipaddr,mypullport); From 9259d38583a1a836213db9e6ce411e3bc9f574e1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:57:29 +0300 Subject: [PATCH 742/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index be7cb8bb3..2c72aced1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -65,8 +65,8 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) usleep(1000); } printf("error LP_send sock.%d, pipeline timeout.(%s) %s\n",sock,msg,nn_strerror(nn_errno())); - //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) - // printf("LP_send sent %d instead of %d\n",sentbytes,len); + if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) + printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) free(msg); return(-1); From b6771da96ae7bb612c07ba0e4546dfc61320b667 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 11:58:21 +0300 Subject: [PATCH 743/910] 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 2c72aced1..25506230b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -31,7 +31,7 @@ uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } From e9c3536f80ef6106a2a521646e86fea0f203716d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:00:43 +0300 Subject: [PATCH 744/910] Test --- iguana/exchanges/LP_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 25506230b..d8a7d2121 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -64,9 +64,9 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //portable_mutex_unlock(&LP_networkmutex); usleep(1000); } - printf("error LP_send sock.%d, pipeline timeout.(%s) %s\n",sock,msg,nn_strerror(nn_errno())); - if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) - printf("LP_send sent %d instead of %d\n",sentbytes,len); + printf("error LP_send sock.%d, i.%d timeout.(%s) %s\n",sock,i,msg,nn_strerror(nn_errno())); + //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) + // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) free(msg); return(-1); @@ -339,7 +339,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); - printf("i.%d publicaddr.(%s) for %s\n",i,pushaddr,subaddr); + printf("i.%d publicaddr.(%s) for %s, pullsock.%d pubsock.%d\n",i,pushaddr,subaddr,pullsock,pubsock); break; } else printf("bind error on %s or %s\n",pushaddr,subaddr); if ( pullsock >= 0 ) From c94ad82fe6238aa97f0dacc5bbb7347518e51b19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:01:56 +0300 Subject: [PATCH 745/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index d8a7d2121..de0d94a8e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -313,7 +313,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport), pushport += 2; nanomsg_transportname(1,subaddr,myipaddr,subport), subport += 2; - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -402,7 +402,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_PAIR; //NN_SUB; + else nntype = NN_BUS; //NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) From 04794a9c0e9890c85537d1fce21184ab738ac801 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:09:47 +0300 Subject: [PATCH 746/910] Test --- iguana/exchanges/LP_network.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index de0d94a8e..b1b3d83e7 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -313,7 +313,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport), pushport += 2; nanomsg_transportname(1,subaddr,myipaddr,subport), subport += 2; - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PUB)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -402,7 +402,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_BUS; //NN_SUB; + else nntype = NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) @@ -423,16 +423,8 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } if ( (pullsock= nn_socket(AF_SP,nntype)) >= 0 ) { - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - if ( nntype == NN_PAIR ) - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - maxsize = 2 * 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( LP_canbind == 0 ) { - if ( nntype == NN_SUB ) - nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); if ( nn_connect(pullsock,connectaddr) < 0 ) { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); @@ -455,6 +447,14 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, exit(-1); } } + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + if ( nntype == NN_PAIR ) + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + maxsize = 2 * 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + if ( nntype == NN_SUB ) + nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,LP_COMMAND_SENDSOCK) < 0 ) { From a7eef6a35d3b45204d93f10ef0500bddfa348b88 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:14:17 +0300 Subject: [PATCH 747/910] Test --- iguana/exchanges/LP_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b1b3d83e7..f261a58ff 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -304,15 +304,15 @@ char *LP_psock(char *myipaddr,int32_t ispaired) retjson = cJSON_CreateObject(); pushport = Psockport++; subport = Psockport++; - for (i=0; i<100; i++) + for (i=0; i<100; i++,pushport += 2,subport += 2) { if ( pushport < 10000 ) pushport = 10001; if ( subport <= pushport ) subport = pushport + 1; pullsock = pubsock = -1; - nanomsg_transportname(1,pushaddr,myipaddr,pushport), pushport += 2; - nanomsg_transportname(1,subaddr,myipaddr,subport), subport += 2; + nanomsg_transportname(1,pushaddr,myipaddr,pushport); + nanomsg_transportname(1,subaddr,myipaddr,subport); if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PUB)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) From a4ccad7d1f3d1f6928f896bb39fa4914c3120e50 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:17:08 +0300 Subject: [PATCH 748/910] Test --- iguana/exchanges/LP_network.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f261a58ff..9ed659003 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -313,7 +313,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PUB)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -402,7 +402,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_SUB; + else nntype = NN_PAIR;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) @@ -430,14 +430,6 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); } else printf("nntype.%d NN_SUB.%d connect to %s pullsock.%d\n",nntype,NN_SUB,connectaddr,pullsock); - while ( 0 ) - { - int32_t size; void *buf; - if ( (size= nn_recv(pullsock,&buf,NN_MSG,0)) > 0 ) - printf("SUBPULL.(%s)\n",(char *)buf); - else printf("size.%d\n",size); - sleep(10); - } } else { @@ -456,7 +448,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } - if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,LP_COMMAND_SENDSOCK) < 0 ) + if ( ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) { printf("command socket didnt work\n"); exit(-1); From 3a6f7734f1af22aa735c3b5f5424e93debdff3be Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:18:12 +0300 Subject: [PATCH 749/910] 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 9ed659003..412eec997 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -448,7 +448,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } - if ( ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) + if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) { printf("command socket didnt work\n"); exit(-1); From 285642625f8866dfb3182a196ac673dea063e65b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:22:44 +0300 Subject: [PATCH 750/910] Test --- iguana/exchanges/LP_network.c | 41 +++++++---------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 412eec997..b75c8cbc1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -18,7 +18,8 @@ // marketmaker // -#define PSOCK_IDLETIMEOUT (2 * INSTANTDEX_LOCKTIME + 600) +#define PSOCK_KEEPALIVE 6 + struct psock { uint32_t lasttime,lastping; @@ -99,7 +100,7 @@ uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbit void LP_psockloop(void *_ptr) { - int32_t i,n,nonz,iter,retval,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd pfd,*pfds; char keepalive[512];//,*myipaddr = _ptr; + int32_t i,n,nonz,iter,retval,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd *pfds; char keepalive[512];//,*myipaddr = _ptr; while ( 1 ) { now = (uint32_t)time(NULL); @@ -120,24 +121,6 @@ void LP_psockloop(void *_ptr) sendsock = -1; } } - /* pfd.fd = ptr->sendsock; - pfd.events = NN_POLLOUT; - if ( nn_poll(&pfd,1,1) > 0 ) - { - if ( (sentbytes= nn_send(sendsock,buf,size,0)) > 0 ) - { - printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); - } else printf("send error to %s\n",ptr->sendaddr); - if ( buf != 0 ) - { - if ( buf != keepalive ) - nn_freemsg(buf); - buf = 0; - size = 0; - ptr = 0; - sendsock = -1; - } - }*/ } else if ( Numpsocks > 0 ) { @@ -165,7 +148,6 @@ void LP_psockloop(void *_ptr) printf("%s has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) { - ptr->lasttime = now; sendsock = ptr->sendsock; printf("[%s]\n",(char *)buf); break; @@ -173,7 +155,7 @@ void LP_psockloop(void *_ptr) } } n++; - if ( ptr->ispaired != 0 ) + //if ( ptr->ispaired != 0 ) { if ( iter == 0 ) { @@ -220,14 +202,7 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - /*if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) - { - printf("got %d bytes for %s\n",size,ptr->sendaddr); - ptr->lasttime = now; - sendsock = ptr->sendsock; - break; - } - else*/ if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) + if ( now > ptr->lasttime+PSOCK_KEEPALIVE ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); if ( ptr->recvsock >= 0 ) @@ -243,11 +218,11 @@ void LP_psockloop(void *_ptr) portable_mutex_unlock(&LP_psockmutex); break; } - else if ( now > ptr->lastping+6 ) + else if ( now > ptr->lastping+PSOCK_KEEPALIVE ) { ptr->lastping = now; sendsock = ptr->sendsock; - printf("keep %s alive\n",ptr->sendaddr); + //printf("keep %s alive\n",ptr->sendaddr); sprintf(keepalive,"{\"method\":\"keepalive\",\"endpoint\":\"%s\"}",ptr->sendaddr); size = (int32_t)strlen(keepalive) + 1; buf = keepalive; @@ -304,7 +279,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) retjson = cJSON_CreateObject(); pushport = Psockport++; subport = Psockport++; - for (i=0; i<100; i++,pushport += 2,subport += 2) + for (i=0; i<100; i++,pushport+=2,subport+=2) { if ( pushport < 10000 ) pushport = 10001; From 655f7f359d602cbb286f9e7c0b7d6578f831441a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:28:37 +0300 Subject: [PATCH 751/910] Test --- iguana/exchanges/LP_nativeDEX.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 60065b77b..77df59431 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -162,11 +162,9 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t { if ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { - if ( IAMLP == 0 ) - printf("pullsock.%d recv.%d (%s)\n",pullsock,recvlen,(char *)ptr); nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); - } //else printf("pullsock.%d recvlen.%d\n",pullsock,recvlen); + } } return(nonz); } @@ -369,7 +367,7 @@ void LP_initpeers(int32_t pubsock,struct LP_peerinfo *mypeer,char *myipaddr,uint void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; + char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],keepalive[128]; IAMLP = !amclient; #ifndef __linux__ if ( IAMLP != 0 ) @@ -458,14 +456,22 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit printf("mainloop\n"); if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); - if ( LP_canbind == 0 && LP_deadman_switch < time(NULL)-777 ) + if ( LP_canbind == 0 ) { - printf("DEAD man's switch activated, register forwarding again\n"); - if ( pullsock >= 0 ) - nn_close(pullsock); - pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); - LP_deadman_switch = (uint32_t)time(NULL); - LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); + if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE ) + { + printf("DEAD man's switch activated, register forwarding again\n"); + if ( pullsock >= 0 ) + nn_close(pullsock); + pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); + LP_deadman_switch = (uint32_t)time(NULL); + LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); + } + else + { + sprintf(keepalive,"{\"method\":\"keepalive\"}"); + LP_send(pullsock,keepalive,0); + } } } } From 1f29a7562cc0b2347ee094fbaa2bf674cde60a6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:30:04 +0300 Subject: [PATCH 752/910] 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 77df59431..ef3c1660b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -471,6 +471,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { sprintf(keepalive,"{\"method\":\"keepalive\"}"); LP_send(pullsock,keepalive,0); + printf("send keepalive\n"); } } } From dff29527c388d614b88cfeebab159e76819bb99e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:31:10 +0300 Subject: [PATCH 753/910] 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 ef3c1660b..ed52707eb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -467,7 +467,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit LP_deadman_switch = (uint32_t)time(NULL); LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); } - else + else if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE/2 ) { sprintf(keepalive,"{\"method\":\"keepalive\"}"); LP_send(pullsock,keepalive,0); From 2cc4fdb7dce6cd25b4b91f30b30b77c648f328b4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:37:04 +0300 Subject: [PATCH 754/910] Test --- iguana/exchanges/LP_network.c | 41 ++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b75c8cbc1..03066b98a 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -155,29 +155,35 @@ void LP_psockloop(void *_ptr) } } n++; - //if ( ptr->ispaired != 0 ) + if ( iter == 0 ) { - if ( iter == 0 ) + pfds[n].fd = ptr->sendsock; + pfds[n].events = POLLIN; + } + else + { + if ( pfds[n].fd != ptr->sendsock ) { - pfds[n].fd = ptr->sendsock; - pfds[n].events = POLLIN; + printf("unexpected fd.%d mismatched sendsock.%d\n",pfds[n].fd,ptr->sendsock); + break; } - else + else if ( (pfds[n].revents & POLLIN) != 0 ) { - if ( pfds[n].fd != ptr->sendsock ) + printf("%s paired has pollin\n",ptr->sendaddr); + if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { - printf("unexpected fd.%d mismatched sendsock.%d\n",pfds[n].fd,ptr->sendsock); - break; - } - else if ( (pfds[n].revents & POLLIN) != 0 ) - { - printf("%s paired has pollin\n",ptr->sendaddr); - if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) + ptr->lasttime = now; + if ( ptr->ispaired != 0 ) { - ptr->lasttime = now; sendsock = ptr->recvsock; break; } + else + { + nn_freemsg(buf); + buf = 0; + size = 0; + } } } n++; @@ -292,13 +298,13 @@ char *LP_psock(char *myipaddr,int32_t ispaired) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { - timeout = 10; + timeout = 1; nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - if ( ispaired != 0 ) + //if ( ispaired != 0 ) { nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); @@ -378,8 +384,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; else nntype = NN_PAIR;//NN_SUB; - } - else nntype = NN_PAIR; + } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { nanomsg_transportname(0,publicaddr,myipaddr,mypullport); From 2dddc8f54b1baaa41bc96d1530d847a64a63f291 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:38:25 +0300 Subject: [PATCH 755/910] 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 03066b98a..d676b1a8d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -18,7 +18,7 @@ // marketmaker // -#define PSOCK_KEEPALIVE 6 +#define PSOCK_KEEPALIVE 60 struct psock { From d458b327d43452dc8718f5cd62b05b560a16cb79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:41:09 +0300 Subject: [PATCH 756/910] Test --- iguana/exchanges/LP_nativeDEX.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ed52707eb..18f44c125 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -298,6 +298,13 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); + if ( LP_canbind == 0 && (counter % 60) == 13 ) + { + char keepalive[128]; + sprintf(keepalive,"{\"method\":\"keepalive\"}"); + LP_send(pullsock,keepalive,0); + printf("send keepalive\n"); + } counter++; return(nonz); } @@ -367,7 +374,7 @@ void LP_initpeers(int32_t pubsock,struct LP_peerinfo *mypeer,char *myipaddr,uint void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profitmargin,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { - char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],keepalive[128]; + char *myipaddr=0; long filesize,n; int32_t timeout,pullsock=-1,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128]; IAMLP = !amclient; #ifndef __linux__ if ( IAMLP != 0 ) @@ -467,12 +474,6 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit LP_deadman_switch = (uint32_t)time(NULL); LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); } - else if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE/2 ) - { - sprintf(keepalive,"{\"method\":\"keepalive\"}"); - LP_send(pullsock,keepalive,0); - printf("send keepalive\n"); - } } } } From 2fe97816afb32f5e0ffd6112c9f61aadc63359c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:47:08 +0300 Subject: [PATCH 757/910] 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 18f44c125..723d5c96b 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -235,6 +235,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso origipaddr = "127.0.0.1"; if ( mypeer == 0 ) myipaddr = "127.0.0.1"; + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d peers\n",counter,LP_canbind); numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -263,6 +264,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } nonz += LP_subsock_check(origipaddr,pubsock,peer->subsock,profitmargin); } + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d forwarding\n",counter,LP_canbind); if ( (counter % 600) == 60 ) { LP_myutxo_updates(pubsock,passphrase,profitmargin); @@ -272,6 +274,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso lastforward = now; } } + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d utxos\n",counter,LP_canbind); if ( (counter % 600) == 0 ) { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) @@ -285,6 +288,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_utxo_clientpublish(utxo); } } + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); if ( (counter % 600) == 599 ) { if ( (retstr= basilisk_swapentry(0,0)) != 0 ) @@ -293,11 +297,13 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) free(retstr); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); if ( LP_canbind == 0 && (counter % 60) == 13 ) { char keepalive[128]; From 6fdbe4ceb9d2e1a2dc596b15ccd24cb7fb7828d3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:52:14 +0300 Subject: [PATCH 758/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 723d5c96b..4ef2345be 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -465,12 +465,13 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } while ( 1 ) { - if ( 0 && (rand() % 100) == 0 ) + if ( LP_canbind == 0 ) printf("mainloop\n"); if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); if ( LP_canbind == 0 ) { + printf("check deadman %u vs %u\n",LP_deadman_switch,(uint32_t)time(NULL)); if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE ) { printf("DEAD man's switch activated, register forwarding again\n"); From e517a65086efaca9ae73f469d6fbdde413cd272a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:53:12 +0300 Subject: [PATCH 759/910] Test --- iguana/exchanges/LP_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 2a1880b42..09a329480 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -215,7 +215,7 @@ forwardhex(pubkey,hex)\n\ { printf("got keepalive lag.%d\n",(int32_t)time(NULL) - LP_deadman_switch); LP_deadman_switch = (uint32_t)time(NULL); - return(0); + return(clonestr("{\"result\":\"success\"}")); } else if ( strcmp(method,"getpeers") == 0 ) return(LP_peers()); From bd061c313583221661ccf58c4509554afed1f231 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:55:35 +0300 Subject: [PATCH 760/910] Test --- iguana/exchanges/LP_nativeDEX.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4ef2345be..d94acdc26 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -164,6 +164,7 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t { nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); + printf("got retstr.%p\n",*retstrp); } } return(nonz); @@ -297,10 +298,11 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d pullsock check\n",counter,LP_canbind); nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) free(retstr); + if ( LP_canbind == 0 ) printf("counter.%d canbind.%d hellos\n",counter,LP_canbind); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); @@ -308,8 +310,9 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - LP_send(pullsock,keepalive,0); printf("send keepalive\n"); + LP_send(pullsock,keepalive,0); + printf("sent keepalive\n"); } counter++; return(nonz); From ced6fd608a13a574f180ff1e675ed628e0a9d4ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 12:57:42 +0300 Subject: [PATCH 761/910] 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 d94acdc26..7e2ed4b87 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -301,7 +301,11 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso if ( LP_canbind == 0 ) printf("counter.%d canbind.%d pullsock check\n",counter,LP_canbind); nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) + { + printf("free (%s)\n",retstr); free(retstr); + printf("Freed\n"); + } if ( LP_canbind == 0 ) printf("counter.%d canbind.%d hellos\n",counter,LP_canbind); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); From c58b04ab12fdcb56048458c7f9f03cb1fa1ec599 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:00:31 +0300 Subject: [PATCH 762/910] Test --- iguana/exchanges/LP_nativeDEX.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7e2ed4b87..1afb731f5 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -158,9 +158,9 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t { void *ptr; int32_t recvlen=-1,nonz = 0; *retstrp = 0; - while ( pullsock >= 0 ) + if ( pullsock >= 0 ) { - if ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) { nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); @@ -173,11 +173,14 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { int32_t recvlen,nonz = 0; void *ptr; char *retstr; - while ( sock >= 0 && (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) + if ( sock >= 0 ) { - nonz++; - if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) - free(retstr); + while ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) + { + nonz++; + if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) + free(retstr); + } } return(nonz); } From db86f30637bdbcdd21464d31b53807f79d92c9ec Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:02:07 +0300 Subject: [PATCH 763/910] Test --- iguana/exchanges/LP_nativeDEX.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 1afb731f5..958408524 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -164,7 +164,6 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t { nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); - printf("got retstr.%p\n",*retstrp); } } return(nonz); @@ -239,7 +238,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso origipaddr = "127.0.0.1"; if ( mypeer == 0 ) myipaddr = "127.0.0.1"; - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d peers\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d peers\n",counter,LP_canbind); numpeers = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { @@ -268,7 +267,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } nonz += LP_subsock_check(origipaddr,pubsock,peer->subsock,profitmargin); } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d forwarding\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d forwarding\n",counter,LP_canbind); if ( (counter % 600) == 60 ) { LP_myutxo_updates(pubsock,passphrase,profitmargin); @@ -278,7 +277,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso lastforward = now; } } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d utxos\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d utxos\n",counter,LP_canbind); if ( (counter % 600) == 0 ) { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) @@ -292,7 +291,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_utxo_clientpublish(utxo); } } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); if ( (counter % 600) == 599 ) { if ( (retstr= basilisk_swapentry(0,0)) != 0 ) @@ -301,25 +300,20 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso free(retstr); } } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d pullsock check\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d pullsock check\n",counter,LP_canbind); nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) - { - printf("free (%s)\n",retstr); free(retstr); - printf("Freed\n"); - } - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d hellos\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d hellos\n",counter,LP_canbind); if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); - if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); + //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); if ( LP_canbind == 0 && (counter % 60) == 13 ) { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); printf("send keepalive\n"); LP_send(pullsock,keepalive,0); - printf("sent keepalive\n"); } counter++; return(nonz); @@ -475,13 +469,11 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } while ( 1 ) { - if ( LP_canbind == 0 ) - printf("mainloop\n"); if ( LP_mainloop_iter(myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); if ( LP_canbind == 0 ) { - printf("check deadman %u vs %u\n",LP_deadman_switch,(uint32_t)time(NULL)); + //printf("check deadman %u vs %u\n",LP_deadman_switch,(uint32_t)time(NULL)); if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE ) { printf("DEAD man's switch activated, register forwarding again\n"); From 0b51b6b26d3a849e8013cd14769013a42f343091 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:14:41 +0300 Subject: [PATCH 764/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 958408524..503e1904a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - printf("send keepalive\n"); + //printf("send keepalive\n"); LP_send(pullsock,keepalive,0); } counter++; diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index d676b1a8d..2ade33b1e 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -145,11 +145,11 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("%s has pollin\n",ptr->sendaddr); + //printf("%s has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) { sendsock = ptr->sendsock; - printf("[%s]\n",(char *)buf); + //printf("[%s]\n",(char *)buf); break; } } @@ -169,7 +169,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("%s paired has pollin\n",ptr->sendaddr); + //printf("%s paired has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { ptr->lasttime = now; From 515b8a75ec930dc0caa334bf7d772739484cc14a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:24:30 +0300 Subject: [PATCH 765/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 09a329480..4cc96c755 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -213,7 +213,7 @@ forwardhex(pubkey,hex)\n\ } else if ( strcmp(method,"keepalive") == 0 ) { - printf("got keepalive lag.%d\n",(int32_t)time(NULL) - LP_deadman_switch); + printf("got keepalive lag.%d switch.%u\n",(int32_t)time(NULL) - LP_deadman_switch,LP_deadman_switch); LP_deadman_switch = (uint32_t)time(NULL); return(clonestr("{\"result\":\"success\"}")); } diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 503e1904a..1f7b74932 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -476,7 +476,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit //printf("check deadman %u vs %u\n",LP_deadman_switch,(uint32_t)time(NULL)); if ( LP_deadman_switch < time(NULL)-PSOCK_KEEPALIVE ) { - printf("DEAD man's switch activated, register forwarding again\n"); + printf("DEAD man's switch %u activated at %u lag.%d, register forwarding again\n",LP_deadman_switch,(uint32_t)time(NULL),(uint32_t)(time(NULL) - LP_deadman_switch)); if ( pullsock >= 0 ) nn_close(pullsock); pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); From 14f9769cb827796eef6b14f97d5d7120c59109f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:27:46 +0300 Subject: [PATCH 766/910] 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 2ade33b1e..5394c2d05 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -224,7 +224,7 @@ void LP_psockloop(void *_ptr) portable_mutex_unlock(&LP_psockmutex); break; } - else if ( now > ptr->lastping+PSOCK_KEEPALIVE ) + else if ( now > ptr->lastping+PSOCK_KEEPALIVE/2 ) { ptr->lastping = now; sendsock = ptr->sendsock; From 2d071816ef9a8ad9dc319d02aa126bf0dcf6d209 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:31:35 +0300 Subject: [PATCH 767/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 5394c2d05..303459fe4 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -169,9 +169,9 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - //printf("%s paired has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { + printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); ptr->lasttime = now; if ( ptr->ispaired != 0 ) { @@ -208,7 +208,7 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( now > ptr->lasttime+PSOCK_KEEPALIVE ) + if ( now > ptr->lasttime+PSOCK_KEEPALIVE*2 ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); if ( ptr->recvsock >= 0 ) From b7d882ad9649c6d3bba72951620dec557c318818 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:34:31 +0300 Subject: [PATCH 768/910] 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 1f7b74932..33aff2988 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - //printf("send keepalive\n"); + printf("send keepalive\n"); LP_send(pullsock,keepalive,0); } counter++; From 3f254b0b7ea9c2803a93d8d3a8aebc26b64af40b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:35:08 +0300 Subject: [PATCH 769/910] 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 33aff2988..49ef0ac3e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - printf("send keepalive\n"); + printf("send keepalive to %s\n",pushaddr); LP_send(pullsock,keepalive,0); } counter++; From 39797f0e8f7fc405f284ead61fba892daa56c912 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:40:37 +0300 Subject: [PATCH 770/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 49ef0ac3e..4e3f5da47 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,8 +312,9 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - printf("send keepalive to %s\n",pushaddr); - LP_send(pullsock,keepalive,0); + printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); + if ( LP_send(pullsock,keepalive,0) < 0 ) + LP_deadman_switch = 0; } counter++; return(nonz); From 8cc3141fb9eb4205750a6052c15a658c649e5625 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:46:09 +0300 Subject: [PATCH 771/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 4e3f5da47..58c082160 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -160,7 +160,7 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t *retstrp = 0; if ( pullsock >= 0 ) { - while ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) >= 0 ) + while ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) > 0 ) { nonz++; *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); @@ -174,7 +174,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof int32_t recvlen,nonz = 0; void *ptr; char *retstr; if ( sock >= 0 ) { - while ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) >= 0 ) + while ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) { nonz++; if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) From ea6fc93be45024d5d5fd5034d5928183f4c93005 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:49:49 +0300 Subject: [PATCH 772/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 303459fe4..5ad630bfd 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -294,7 +294,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -383,7 +383,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_PAIR;//NN_SUB; + else nntype = NN_BUS;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { From 597f270d601239f8ddc121f07ab9e214654715c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:52:53 +0300 Subject: [PATCH 773/910] Test --- iguana/exchanges/LP_network.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 5ad630bfd..70260f95f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -421,8 +421,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - if ( nntype == NN_PAIR ) - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( nntype == NN_SUB ) From e4068f3b7577dde9413bc5474a17542d7b3f4646 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 13:59:42 +0300 Subject: [PATCH 774/910] Test --- iguana/exchanges/LP_network.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 70260f95f..371e8a6de 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -228,7 +228,6 @@ void LP_psockloop(void *_ptr) { ptr->lastping = now; sendsock = ptr->sendsock; - //printf("keep %s alive\n",ptr->sendaddr); sprintf(keepalive,"{\"method\":\"keepalive\",\"endpoint\":\"%s\"}",ptr->sendaddr); size = (int32_t)strlen(keepalive) + 1; buf = keepalive; @@ -294,7 +293,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,pushport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -383,7 +382,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_BUS;//NN_SUB; + else nntype = NN_PAIR;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { From 98b42d635ab55b2354ff6264a7e1f6c93d3b654f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:05:49 +0300 Subject: [PATCH 775/910] Test --- iguana/exchanges/LP_network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 371e8a6de..f0e64735f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -191,7 +191,7 @@ void LP_psockloop(void *_ptr) } if ( iter == 0 ) { - if ( (retval= nn_poll(pfds,n,10)) <= 0 ) + if ( (retval= nn_poll(pfds,n,1)) <= 0 ) { if ( retval != 0 ) printf("nn_poll retval.%d\n",retval); @@ -297,7 +297,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { - timeout = 1; + timeout = 10; nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -420,6 +420,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 10; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); From 1f37eb816a5aaff0a4853a9ff7bf6c6f0ae10cee Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:16:08 +0300 Subject: [PATCH 776/910] Test --- iguana/exchanges/LP_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f0e64735f..382fa95db 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -32,7 +32,7 @@ uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } @@ -297,7 +297,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { - timeout = 10; + timeout = 1; nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -319,7 +319,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); jaddnum(retjson,"publicport",pushport); - printf("i.%d publicaddr.(%s) for %s, pullsock.%d pubsock.%d\n",i,pushaddr,subaddr,pullsock,pubsock); + printf("i.%d publicaddr.(%s) for subaddr.(%s), pullsock.%d pubsock.%d\n",i,pushaddr,subaddr,pullsock,pubsock); break; } else printf("bind error on %s or %s\n",pushaddr,subaddr); if ( pullsock >= 0 ) @@ -420,7 +420,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, } timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 10; + timeout = 1; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); maxsize = 2 * 1024 * 1024; nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); From 553a16d97bbf177250e4b77e6fa091378a6508f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:18:14 +0300 Subject: [PATCH 777/910] Test --- iguana/exchanges/LP_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 382fa95db..6e833bdb0 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -426,6 +426,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + LP_send(pullsock,"hello init",0); } if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) { From 06b0884f3280e6dd90397e6f00e532312d7d519b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:20:41 +0300 Subject: [PATCH 778/910] 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 6e833bdb0..4e01c73e3 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -196,7 +196,7 @@ void LP_psockloop(void *_ptr) if ( retval != 0 ) printf("nn_poll retval.%d\n",retval); break; - } + } else printf("num pfds.%d\n",n); } } portable_mutex_unlock(&LP_psockmutex); From 9e62e833f2f5c3d243453b76e2eb444300d7e447 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:23:24 +0300 Subject: [PATCH 779/910] Test --- iguana/exchanges/LP_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 4e01c73e3..536a2a788 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -145,7 +145,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - //printf("%s has pollin\n",ptr->sendaddr); + printf("%s has pollin\n",ptr->sendaddr); if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) { sendsock = ptr->sendsock; @@ -169,9 +169,9 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { + printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { - printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); ptr->lasttime = now; if ( ptr->ispaired != 0 ) { @@ -196,7 +196,7 @@ void LP_psockloop(void *_ptr) if ( retval != 0 ) printf("nn_poll retval.%d\n",retval); break; - } else printf("num pfds.%d\n",n); + } else printf("num pfds.%d retval.%d\n",n,retval); } } portable_mutex_unlock(&LP_psockmutex); From a571558c2cb4b99a411f73a9bcb23f72c8c4d265 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:29:48 +0300 Subject: [PATCH 780/910] Test --- iguana/exchanges/LP_network.c | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 536a2a788..86987340f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -23,8 +23,8 @@ struct psock { uint32_t lasttime,lastping; - int32_t recvsock,sendsock,ispaired; - uint16_t recvport,sendport; + int32_t publicsock,sendsock,ispaired; + uint16_t publicport,sendport; char sendaddr[128],publicaddr[128]; } *PSOCKS; @@ -109,7 +109,7 @@ void LP_psockloop(void *_ptr) if ( size > 0 ) { if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) - printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->recvsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) { @@ -133,23 +133,23 @@ void LP_psockloop(void *_ptr) ptr = &PSOCKS[i]; if ( iter == 0 ) { - pfds[n].fd = ptr->recvsock; + pfds[n].fd = ptr->publicsock; pfds[n].events = POLLIN; } else { - if ( pfds[n].fd != ptr->recvsock ) + if ( pfds[n].fd != ptr->publicsock ) { - printf("unexpected fd.%d mismatched recvsock.%d\n",pfds[n].fd,ptr->recvsock); + printf("unexpected fd.%d mismatched publicsock.%d\n",pfds[n].fd,ptr->publicsock); break; } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("%s has pollin\n",ptr->sendaddr); - if ( (size= nn_recv(ptr->recvsock,&buf,NN_MSG,0)) > 0 ) + printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); + if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { sendsock = ptr->sendsock; - //printf("[%s]\n",(char *)buf); + printf("[%s] -> sendsock.%d\n",(char *)buf,sendsock); break; } } @@ -175,7 +175,7 @@ void LP_psockloop(void *_ptr) ptr->lasttime = now; if ( ptr->ispaired != 0 ) { - sendsock = ptr->recvsock; + sendsock = ptr->publicsock; break; } else @@ -196,7 +196,7 @@ void LP_psockloop(void *_ptr) if ( retval != 0 ) printf("nn_poll retval.%d\n",retval); break; - } else printf("num pfds.%d retval.%d\n",n,retval); + } // else printf("num pfds.%d retval.%d\n",n,retval); } } portable_mutex_unlock(&LP_psockmutex); @@ -210,9 +210,9 @@ void LP_psockloop(void *_ptr) ptr = &PSOCKS[i]; if ( now > ptr->lasttime+PSOCK_KEEPALIVE*2 ) { - printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->recvport,ptr->sendport,now - ptr->lasttime); - if ( ptr->recvsock >= 0 ) - nn_close(ptr->recvsock); + printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); + if ( ptr->publicsock >= 0 ) + nn_close(ptr->publicsock); if ( ptr->sendsock >= 0 ) nn_close(ptr->sendsock); portable_mutex_lock(&LP_psockmutex); @@ -242,15 +242,15 @@ void LP_psockloop(void *_ptr) } } -void LP_psockadd(int32_t ispaired,int32_t recvsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr,char *publicaddr) +void LP_psockadd(int32_t ispaired,int32_t publicsock,uint16_t recvport,int32_t sendsock,uint16_t sendport,char *subaddr,char *publicaddr) { struct psock *ptr; portable_mutex_lock(&LP_psockmutex); PSOCKS = realloc(PSOCKS,sizeof(*PSOCKS) * (Numpsocks + 1)); ptr = &PSOCKS[Numpsocks++]; ptr->ispaired = ispaired; - ptr->recvsock = recvsock; - ptr->recvport = recvport; + ptr->publicsock = publicsock; + ptr->publicport = recvport; ptr->sendsock = sendsock; ptr->sendport = sendport; safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); @@ -280,18 +280,18 @@ int32_t LP_psockmark(char *publicaddr) char *LP_psock(char *myipaddr,int32_t ispaired) { - char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; + char pushaddr[128],subaddr[128]; uint16_t i,publicport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; retjson = cJSON_CreateObject(); - pushport = Psockport++; + publicport = Psockport++; subport = Psockport++; - for (i=0; i<100; i++,pushport+=2,subport+=2) + for (i=0; i<100; i++,publicport+=2,subport+=2) { - if ( pushport < 10000 ) - pushport = 10001; - if ( subport <= pushport ) - subport = pushport + 1; + if ( publicport < 10000 ) + publicport = 10001; + if ( subport <= publicport ) + subport = publicport + 1; pullsock = pubsock = -1; - nanomsg_transportname(1,pushaddr,myipaddr,pushport); + nanomsg_transportname(1,pushaddr,myipaddr,publicport); nanomsg_transportname(1,subaddr,myipaddr,subport); if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { @@ -309,16 +309,16 @@ char *LP_psock(char *myipaddr,int32_t ispaired) nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); } - nanomsg_transportname(0,pushaddr,myipaddr,pushport); + nanomsg_transportname(0,pushaddr,myipaddr,publicport); nanomsg_transportname(0,subaddr,myipaddr,subport); - LP_psockadd(ispaired,pullsock,pushport,pubsock,subport,subaddr,pushaddr); + LP_psockadd(ispaired,pullsock,publicport,pubsock,subport,subaddr,pushaddr); jaddstr(retjson,"result","success"); jaddstr(retjson,"LPipaddr",myipaddr); jaddstr(retjson,"connectaddr",subaddr); jaddnum(retjson,"connectport",subport); jaddnum(retjson,"ispaired",ispaired); jaddstr(retjson,"publicaddr",pushaddr); - jaddnum(retjson,"publicport",pushport); + jaddnum(retjson,"publicport",publicport); printf("i.%d publicaddr.(%s) for subaddr.(%s), pullsock.%d pubsock.%d\n",i,pushaddr,subaddr,pullsock,pubsock); break; } else printf("bind error on %s or %s\n",pushaddr,subaddr); From a8a3db008c00cdefb7e952a0a33d4a0db5771b81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:41:27 +0300 Subject: [PATCH 781/910] Test --- iguana/exchanges/LP_network.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 86987340f..ff468217c 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -32,7 +32,7 @@ uint16_t Numpsocks,Psockport = 10000; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { - sprintf(str,"ws://%s:%u",bindflag == 0 ? ipaddr : "*",port); + sprintf(str,"tcp://%s:%u",bindflag == 0 ? ipaddr : "*",port); return(str); } @@ -249,10 +249,10 @@ void LP_psockadd(int32_t ispaired,int32_t publicsock,uint16_t recvport,int32_t s PSOCKS = realloc(PSOCKS,sizeof(*PSOCKS) * (Numpsocks + 1)); ptr = &PSOCKS[Numpsocks++]; ptr->ispaired = ispaired; - ptr->publicsock = publicsock; - ptr->publicport = recvport; - ptr->sendsock = sendsock; - ptr->sendport = sendport; + ptr->publicsock = sendsock;//publicsock; + ptr->publicport = sendport;//recvport; + ptr->sendsock = publicsock;//sendsock; + ptr->sendport = recvport;//sendport; safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); safecopy(ptr->publicaddr,publicaddr,sizeof(ptr->publicaddr)); ptr->lasttime = (uint32_t)time(NULL); @@ -408,7 +408,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); - } else printf("nntype.%d NN_SUB.%d connect to %s pullsock.%d\n",nntype,NN_SUB,connectaddr,pullsock); + } else printf("nntype.%d NN_PAIR.%d connect to %s pullsock.%d\n",nntype,NN_PAIR,connectaddr,pullsock); } else { From 2fa7ad229c98d4ca5d812d5133274470ed3f3538 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:47:09 +0300 Subject: [PATCH 782/910] Test --- iguana/exchanges/LP_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index ff468217c..553bf7597 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -249,10 +249,10 @@ void LP_psockadd(int32_t ispaired,int32_t publicsock,uint16_t recvport,int32_t s PSOCKS = realloc(PSOCKS,sizeof(*PSOCKS) * (Numpsocks + 1)); ptr = &PSOCKS[Numpsocks++]; ptr->ispaired = ispaired; - ptr->publicsock = sendsock;//publicsock; - ptr->publicport = sendport;//recvport; - ptr->sendsock = publicsock;//sendsock; - ptr->sendport = recvport;//sendport; + ptr->publicsock = publicsock; + ptr->publicport = recvport; + ptr->sendsock = sendsock; + ptr->sendport = sendport; safecopy(ptr->sendaddr,subaddr,sizeof(ptr->sendaddr)); safecopy(ptr->publicaddr,publicaddr,sizeof(ptr->publicaddr)); ptr->lasttime = (uint32_t)time(NULL); From c4ab07bbef92b913fc697264d96aadfff9da1161 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:48:50 +0300 Subject: [PATCH 783/910] Test --- iguana/exchanges/LP_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 553bf7597..58ae1c8e1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -148,6 +148,7 @@ void LP_psockloop(void *_ptr) printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { + ptr->lasttime = now; sendsock = ptr->sendsock; printf("[%s] -> sendsock.%d\n",(char *)buf,sendsock); break; From 78fe51f6c494f977be8dce6bc1c972ba0690c101 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:52:44 +0300 Subject: [PATCH 784/910] 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 58ae1c8e1..7be68096f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -145,7 +145,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); + //printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { ptr->lasttime = now; From 5064fc08aae751aa58f1479629a028849db517cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 14:56:59 +0300 Subject: [PATCH 785/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 58c082160..82dbcfc35 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); + //printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); if ( LP_send(pullsock,keepalive,0) < 0 ) LP_deadman_switch = 0; } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7be68096f..5eaf5a71f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -109,8 +109,9 @@ void LP_psockloop(void *_ptr) if ( size > 0 ) { if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) - printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); - else printf("send error to %s\n",ptr->sendaddr); + { + //printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + } else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) { if ( buf != keepalive ) @@ -150,7 +151,7 @@ void LP_psockloop(void *_ptr) { ptr->lasttime = now; sendsock = ptr->sendsock; - printf("[%s] -> sendsock.%d\n",(char *)buf,sendsock); + printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,sendsock); break; } } From fb86481cbccabefd187ede41d870a6a6944d8db4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:01:25 +0300 Subject: [PATCH 786/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 82dbcfc35..58c082160 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - //printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); + printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); if ( LP_send(pullsock,keepalive,0) < 0 ) LP_deadman_switch = 0; } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 5eaf5a71f..c65f9e24d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -146,7 +146,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - //printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); + printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { ptr->lasttime = now; From a6b6387069745ac057c88d194cbf265b46b376cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:03:54 +0300 Subject: [PATCH 787/910] 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 c65f9e24d..b931fbb7f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -210,7 +210,7 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( now > ptr->lasttime+PSOCK_KEEPALIVE*2 ) + if ( now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); if ( ptr->publicsock >= 0 ) From 87a22745f1f2642bfaccfc079d5ed02c9f6449e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:09:15 +0300 Subject: [PATCH 788/910] Test --- iguana/exchanges/LP_network.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b931fbb7f..5ea3a1a1c 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -149,8 +149,13 @@ void LP_psockloop(void *_ptr) printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { - ptr->lasttime = now; - sendsock = ptr->sendsock; + cJSON *retjson; + if ( (retjson= cJSON_Parse((char *)buf)) != 0 ) + { + //ptr->lasttime = now; + //sendsock = ptr->sendsock; + free_json(retjson); + } printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,sendsock); break; } From edfb24f00016ac4a16933b31ae86d8770c89b681 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:11:59 +0300 Subject: [PATCH 789/910] Test --- iguana/exchanges/LP_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 5ea3a1a1c..deae086a6 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -149,15 +149,15 @@ void LP_psockloop(void *_ptr) printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { + printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,sendsock); cJSON *retjson; if ( (retjson= cJSON_Parse((char *)buf)) != 0 ) { - //ptr->lasttime = now; - //sendsock = ptr->sendsock; free_json(retjson); + ptr->lasttime = now; + sendsock = ptr->sendsock; + break; } - printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,sendsock); - break; } } } From 506bb45b480fcbff0ed1756ed79c5b2fae508cb7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:15:06 +0300 Subject: [PATCH 790/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index deae086a6..28e9d3382 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -300,7 +300,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,publicport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -389,7 +389,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_PAIR;//NN_SUB; + else nntype = NN_BUS;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { From 29b1141a334cae80588b9f7a9d716efa11f69aa7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 15:20:04 +0300 Subject: [PATCH 791/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 28e9d3382..deae086a6 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -300,7 +300,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,publicport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -389,7 +389,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_BUS;//NN_SUB; + else nntype = NN_PAIR;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 5f3007957..c4e4a00af 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -132,7 +132,6 @@ uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) { if ( (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) { - //printf("got.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (addr= jstr(retjson,"publicaddr")) != 0 ) @@ -143,6 +142,7 @@ uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) publicport = juint(retjson,"publicport"); free_json(retjson); } + printf("got.(%s) connect.%s public.%s\n",retstr,connectaddr,publicaddr); free(retstr); } if ( publicport != 0 ) From 5d223a5c6a430d8b273df269f14cc80d6bb2c24d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:02:23 +0300 Subject: [PATCH 792/910] 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 58c082160..7e23ae448 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -129,7 +129,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro { } portable_mutex_unlock(&LP_commandmutex); - if ( LP_COMMAND_RECVSOCK == NN_REP ) + //if ( LP_COMMAND_RECVSOCK == NN_REP ) { if ( retstr != 0 ) { From 58926a9ceabfa5a6fd4e0da15f09c03cf2061dc0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:22:24 +0300 Subject: [PATCH 793/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7e23ae448..58c082160 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -129,7 +129,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro { } portable_mutex_unlock(&LP_commandmutex); - //if ( LP_COMMAND_RECVSOCK == NN_REP ) + if ( LP_COMMAND_RECVSOCK == NN_REP ) { if ( retstr != 0 ) { diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index deae086a6..2866cb9fc 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -300,7 +300,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,publicport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -389,7 +389,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_PAIR;//NN_SUB; + else nntype = NN_BUS;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { From bc2f4a32fc362bb8c1d582b2fd69255551d87e36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:24:38 +0300 Subject: [PATCH 794/910] 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 58c082160..7e23ae448 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -129,7 +129,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro { } portable_mutex_unlock(&LP_commandmutex); - if ( LP_COMMAND_RECVSOCK == NN_REP ) + //if ( LP_COMMAND_RECVSOCK == NN_REP ) { if ( retstr != 0 ) { From f114af135dd89e41f7031f4b349a6f98b34e941e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:33:23 +0300 Subject: [PATCH 795/910] Test --- iguana/exchanges/LP_network.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 2866cb9fc..42c89c49f 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -123,7 +123,7 @@ void LP_psockloop(void *_ptr) } } } - else if ( Numpsocks > 0 ) + else if ( 0 && Numpsocks > 0 ) { pfds = calloc(Numpsocks,sizeof(*pfds) * 2); portable_mutex_lock(&LP_psockmutex); @@ -215,7 +215,19 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) + if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) + { + printf("publicsock got (%s)\n",(char *)buf); + sendsock = ptr->sendsock; + break; + } + else if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) + { + printf("sendsock got (%s)\n",(char *)buf); + sendsock = ptr->publicsock; + break; + } + else if ( 0 && now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); if ( ptr->publicsock >= 0 ) @@ -300,7 +312,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) pullsock = pubsock = -1; nanomsg_transportname(1,pushaddr,myipaddr,publicport); nanomsg_transportname(1,subaddr,myipaddr,subport); - if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_BUS)) >= 0 ) + if ( (pullsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,ispaired!=0?NN_PAIR:NN_PAIR)) >= 0 ) { if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) { @@ -389,7 +401,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { if ( LP_canbind != 0 ) nntype = LP_COMMAND_RECVSOCK; - else nntype = NN_BUS;//NN_SUB; + else nntype = NN_PAIR;//NN_SUB; } else nntype = NN_PAIR; if ( LP_canbind != 0 ) { From d24bc16098b94a70af1eec10cf89870ee30d4796 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:37:40 +0300 Subject: [PATCH 796/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 42c89c49f..54ef4a071 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -427,7 +427,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, { printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); exit(-1); - } else printf("nntype.%d NN_PAIR.%d connect to %s pullsock.%d\n",nntype,NN_PAIR,connectaddr,pullsock); + } else printf("nntype.%d NN_PAIR.%d connect to %s connectsock.%d\n",nntype,NN_PAIR,connectaddr,pullsock); } else { @@ -445,7 +445,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); if ( nntype == NN_SUB ) nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - LP_send(pullsock,"hello init",0); + //LP_send(pullsock,"hello init",0); } if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) { From c8fe81585dd3a414eba9e60d6096970340d8b4ce Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 18:40:38 +0300 Subject: [PATCH 797/910] 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 7e23ae448..58c082160 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -129,7 +129,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro { } portable_mutex_unlock(&LP_commandmutex); - //if ( LP_COMMAND_RECVSOCK == NN_REP ) + if ( LP_COMMAND_RECVSOCK == NN_REP ) { if ( retstr != 0 ) { From f3a5dbdfc15e1b0aeaaafe361c44cc9284f40397 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:04:46 +0300 Subject: [PATCH 798/910] Test --- iguana/exchanges/LP_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 54ef4a071..fa0035d4d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -367,7 +367,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) { - int32_t sock,n,timeout,retval = -1; char msg[512],*retstr; + int32_t sock,n,m,timeout,retval = -1; char msg[512],*retstr; printf("nn_tests.(%s)\n",pushaddr); if ( (sock= nn_socket(AF_SP,nnother)) >= 0 ) { @@ -380,8 +380,10 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0); + sprintf(msg,"{\"method\":\"nn_tests2\",\"ipaddr\":\"%s\"}",pushaddr); + m = LP_send(pullsock,msg,0); LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); - printf(">>>>>>>>>>>>>>>>>>>>>> sent %d bytes -> %d (%s)\n",n,pullsock,retstr!=0?retstr:""); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> %d (%s)\n",n,m,pullsock,retstr!=0?retstr:""); if ( retstr != 0 ) { free(retstr); @@ -447,7 +449,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); //LP_send(pullsock,"hello init",0); } - if ( 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) + if ( 1 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) { printf("command socket didnt work\n"); exit(-1); From 71cc8d23ae8b8732f5241e342029e40902019b2a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:08:50 +0300 Subject: [PATCH 799/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index fa0035d4d..3daa21b28 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -380,10 +380,10 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0); + LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); sprintf(msg,"{\"method\":\"nn_tests2\",\"ipaddr\":\"%s\"}",pushaddr); m = LP_send(pullsock,msg,0); - LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); - printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> %d (%s)\n",n,m,pullsock,retstr!=0?retstr:""); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> pullsock.%d (%s)\n",n,m,pullsock,retstr!=0?retstr:""); if ( retstr != 0 ) { free(retstr); From 6f3b411e2e9ce9099fca12f66a39bda4139b793f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:10:33 +0300 Subject: [PATCH 800/910] 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 3daa21b28..49aed9d2d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -449,7 +449,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); //LP_send(pullsock,"hello init",0); } - if ( 1 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PAIR) < 0 ) + if ( 1 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PUSH) < 0 ) { printf("command socket didnt work\n"); exit(-1); From d7d9ea20f40527b6617714a8c0dc57e82b4831c1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:14:23 +0300 Subject: [PATCH 801/910] Test --- iguana/exchanges/LP_network.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 49aed9d2d..bdcbe3e28 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -206,8 +206,8 @@ void LP_psockloop(void *_ptr) } // else printf("num pfds.%d retval.%d\n",n,retval); } } - portable_mutex_unlock(&LP_psockmutex); free(pfds); + printf("sendsock.%d Numpsocks.%d\n",sendsock,Numpsocks); if ( sendsock < 0 ) { for (i=nonz=0; ipublicsock); if ( ptr->sendsock >= 0 ) nn_close(ptr->sendsock); - portable_mutex_lock(&LP_psockmutex); + //portable_mutex_lock(&LP_psockmutex); if ( Numpsocks > 1 ) { PSOCKS[i] = PSOCKS[--Numpsocks]; memset(&PSOCKS[Numpsocks],0,sizeof(*ptr)); } else Numpsocks = 0; - portable_mutex_unlock(&LP_psockmutex); + //portable_mutex_unlock(&LP_psockmutex); break; } else if ( now > ptr->lastping+PSOCK_KEEPALIVE/2 ) @@ -254,6 +254,7 @@ void LP_psockloop(void *_ptr) } } } + portable_mutex_unlock(&LP_psockmutex); if ( nonz == 0 && i == Numpsocks ) usleep(100000); } From 9d7f33e2679477d4bdf4ad4429af900ae8015779 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:18:14 +0300 Subject: [PATCH 802/910] 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 bdcbe3e28..60689277b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -123,7 +123,7 @@ void LP_psockloop(void *_ptr) } } } - else if ( 0 && Numpsocks > 0 ) + else if ( Numpsocks > 0 ) { pfds = calloc(Numpsocks,sizeof(*pfds) * 2); portable_mutex_lock(&LP_psockmutex); From 21a7743592aaa2850e8bc9044369915579e53c7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:19:29 +0300 Subject: [PATCH 803/910] 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 60689277b..dd207786c 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -450,7 +450,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); //LP_send(pullsock,"hello init",0); } - if ( 1 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PUSH) < 0 ) + if ( LP_canbind == 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PUSH) < 0 ) { printf("command socket didnt work\n"); exit(-1); From a3e0286d96c517c2af4665ca3eccc937079c3df5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:24:20 +0300 Subject: [PATCH 804/910] Test --- iguana/exchanges/LP_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index dd207786c..eac4dcad7 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -110,7 +110,7 @@ void LP_psockloop(void *_ptr) { if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) { - //printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); } else printf("send error to %s\n",ptr->sendaddr); if ( buf != 0 ) { @@ -149,7 +149,7 @@ void LP_psockloop(void *_ptr) printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { - printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,sendsock); + printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,ptr->sendsock); cJSON *retjson; if ( (retjson= cJSON_Parse((char *)buf)) != 0 ) { @@ -254,10 +254,10 @@ void LP_psockloop(void *_ptr) } } } - portable_mutex_unlock(&LP_psockmutex); if ( nonz == 0 && i == Numpsocks ) usleep(100000); } + portable_mutex_unlock(&LP_psockmutex); } else usleep(100000); } } From 1b2eec844676d16f311f41c2bfe94bda2ee71031 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:26:22 +0300 Subject: [PATCH 805/910] Test --- iguana/exchanges/LP_network.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index eac4dcad7..80eeb624b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -207,7 +207,7 @@ void LP_psockloop(void *_ptr) } } free(pfds); - printf("sendsock.%d Numpsocks.%d\n",sendsock,Numpsocks); + //printf("sendsock.%d Numpsocks.%d\n",sendsock,Numpsocks); if ( sendsock < 0 ) { for (i=nonz=0; ipublicsock,&buf,NN_MSG,0)) > 0 ) - { - printf("publicsock got (%s)\n",(char *)buf); - sendsock = ptr->sendsock; - break; - } - else if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) - { - printf("sendsock got (%s)\n",(char *)buf); - sendsock = ptr->publicsock; - break; - } - else if ( 0 && now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) + if ( 0 && now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); if ( ptr->publicsock >= 0 ) From d4ff09bca3c6fb0f4ad3a3370ba8ffac1c81000e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:28:37 +0300 Subject: [PATCH 806/910] 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 80eeb624b..d6ab12de7 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -193,8 +193,8 @@ void LP_psockloop(void *_ptr) } } } - n++; } + n++; } if ( iter == 0 ) { From 5820f03d76f5b0ec8e3887ba860ca98ac424b8e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:32:38 +0300 Subject: [PATCH 807/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index d6ab12de7..eaf6ef689 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -176,9 +176,9 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { + printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); ptr->lasttime = now; if ( ptr->ispaired != 0 ) { @@ -212,7 +212,7 @@ void LP_psockloop(void *_ptr) { for (i=nonz=0; i ptr->lasttime+PSOCK_KEEPALIVE*10 ) From 30a23bd7e778ea732335373cee41fcfce2a3830e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:35:18 +0300 Subject: [PATCH 808/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index eaf6ef689..22021f72d 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -364,15 +364,15 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) printf("connect error %s\n",nn_strerror(nn_errno())); else { - sleep(1); timeout = 1; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0); + sleep(3); LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); sprintf(msg,"{\"method\":\"nn_tests2\",\"ipaddr\":\"%s\"}",pushaddr); m = LP_send(pullsock,msg,0); - printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> pullsock.%d (%s)\n",n,m,pullsock,retstr!=0?retstr:""); + printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> pullsock.%d retstr.(%s)\n",n,m,pullsock,retstr!=0?retstr:""); if ( retstr != 0 ) { free(retstr); From 86c03de6075ced53cb865290dfa9fdeb8b69e872 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:36:43 +0300 Subject: [PATCH 809/910] Test --- iguana/exchanges/LP_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 22021f72d..0faab537b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -364,6 +364,7 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) printf("connect error %s\n",nn_strerror(nn_errno())); else { + sleep(3); timeout = 1; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); From 164bffeca9e1071c839d198d945ddb4cdf0fa56f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:38:31 +0300 Subject: [PATCH 810/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 0faab537b..c9ce77790 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -212,10 +212,10 @@ void LP_psockloop(void *_ptr) { for (i=nonz=0; i ptr->lasttime+PSOCK_KEEPALIVE*10 ) + if ( now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); if ( ptr->publicsock >= 0 ) From 52f0034182f525475f4a7b3dbb26bfa1c53e82df Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 21:52:10 +0300 Subject: [PATCH 811/910] Test --- iguana/exchanges/LP_network.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index c9ce77790..4a6c8ddf0 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -22,7 +22,7 @@ struct psock { - uint32_t lasttime,lastping; + uint32_t lasttime,lastping,errors; int32_t publicsock,sendsock,ispaired; uint16_t publicport,sendport; char sendaddr[128],publicaddr[128]; @@ -111,7 +111,12 @@ void LP_psockloop(void *_ptr) if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) { printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); - } else printf("send error to %s\n",ptr->sendaddr); + } + else + { + ptr->errors++; + printf("send error.%d to %s\n",ptr->errors,ptr->sendaddr); + } if ( buf != 0 ) { if ( buf != keepalive ) @@ -215,7 +220,7 @@ void LP_psockloop(void *_ptr) if ( i < Numpsocks ) { ptr = &PSOCKS[i]; - if ( now > ptr->lasttime+PSOCK_KEEPALIVE*10 ) + if ( now > ptr->lasttime+PSOCK_KEEPALIVE ) { printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,Numpsocks,ptr->publicport,ptr->sendport,now - ptr->lasttime); if ( ptr->publicsock >= 0 ) @@ -231,7 +236,7 @@ void LP_psockloop(void *_ptr) //portable_mutex_unlock(&LP_psockmutex); break; } - else if ( now > ptr->lastping+PSOCK_KEEPALIVE/2 ) + else if ( now > ptr->lastping+PSOCK_KEEPALIVE/2 && ptr->errors < 3 ) { ptr->lastping = now; sendsock = ptr->sendsock; From 107b953b381177f796d44a13ff2047d6f359c788 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 22:08:45 +0300 Subject: [PATCH 812/910] Test --- iguana/exchanges/LP_ordermatch.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index f03da6a7e..4e660f225 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -343,6 +343,16 @@ int32_t LP_nanobind(char *pairstr,char *myipaddr) int32_t i,timeout,r,pairsock = -1; uint16_t mypullport; char bindaddr[128]; if ( LP_canbind != 0 ) { + if ( strcmp(myipaddr,"127.0.0.1") == 0 ) + { + if ( LP_mypeer != 0 ) + myipaddr = LP_mypeer->ipaddr; + } + if ( strcmp(myipaddr,"127.0.0.1") == 0 ) + { + printf("cant nanobind to localhost\n"); + return(-1); + } if ( (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) printf("error creating utxo->pair\n"); else From a891433d308e76ba20cdf8925f7ae9bd3bc42189 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 22:36:07 +0300 Subject: [PATCH 813/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_swap.c | 6 ++++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index e706d124c..de84ed0c5 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -212,7 +212,7 @@ struct basilisk_swap struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; - struct basilisk_swapmessage *messages; int32_t nummessages; + struct basilisk_swapmessage *messages; int32_t nummessages,sentflag; char Bdeposit[64],Bpayment[64]; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],changermd160[20],pad[15],verifybuf[65536]; diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 58c082160..432bc4ce0 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -103,7 +103,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro decode_hex((void *)jsonstr,datalen,(char *)ptr); jsonstr[datalen] = 0; } else jsonstr = (char *)ptr; - if ( 1 && IAMLP == 0 ) + if ( 0 && IAMLP == 0 ) printf("%s %d, datalen.%d (%s)\n",typestr,recvlen,datalen,jsonstr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { @@ -312,7 +312,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); - printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); + //printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); if ( LP_send(pullsock,keepalive,0) < 0 ) LP_deadman_switch = 0; } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 4a6c8ddf0..9c6321b86 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -18,7 +18,7 @@ // marketmaker // -#define PSOCK_KEEPALIVE 60 +#define PSOCK_KEEPALIVE 600 struct psock { diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index b45181822..3bed48c10 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -120,6 +120,8 @@ void basilisk_rawtx_purge(struct basilisk_rawtx *rawtx) void basilisk_swap_finished(struct basilisk_swap *swap) { int32_t i; + if ( swap->utxo != 0 && swap->sentflag == 0 ) + LP_availableset(swap->utxo); swap->I.finished = (uint32_t)time(NULL); // save to permanent storage basilisk_rawtx_purge(&swap->bobdeposit); @@ -140,8 +142,6 @@ void basilisk_swap_finished(struct basilisk_swap *swap) swap->nummessages = 0; if ( swap->N.pair >= 0 ) nn_close(swap->N.pair), swap->N.pair = -1; - if ( swap->utxo != 0 ) - LP_availableset(swap->utxo); } uint32_t basilisk_quoteid(struct basilisk_request *rp) @@ -696,6 +696,7 @@ void LP_bobloop(void *_swap) } if ( LP_swapdata_rawtxsend(swap->N.pair,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0) == 0 ) printf("error sending bobpayment\n"); + swap->sentflag = 1; swap->bobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); @@ -741,6 +742,7 @@ void LP_aliceloop(void *_swap) char str[65];printf("%d waiting for alicepayment to be confirmed.%d %s %s\n",n,1,swap->alicecoin.symbol,bits256_str(str,swap->alicepayment.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } + swap->sentflag = 1; if ( LP_waitfor(swap->N.pair,swap,LP_SWAPSTEP_TIMEOUT,LP_verify_bobpayment) < 0 ) printf("error waiting for bobpayment\n"); else From 43a6a971afeada1f5ade4d3ae32e9cb550e3fe29 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 22:43:02 +0300 Subject: [PATCH 814/910] Test --- iguana/exchanges/LP_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 9c6321b86..29a4313f1 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -110,7 +110,7 @@ void LP_psockloop(void *_ptr) { if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) { - printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); + //printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); } else { @@ -151,7 +151,7 @@ void LP_psockloop(void *_ptr) } else if ( (pfds[n].revents & POLLIN) != 0 ) { - printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); + //printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,ptr->sendsock); @@ -183,7 +183,7 @@ void LP_psockloop(void *_ptr) { if ( (size= nn_recv(ptr->sendsock,&buf,NN_MSG,0)) > 0 ) { - printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); + //printf("%s paired has pollin (%s)\n",ptr->sendaddr,(char *)buf); ptr->lasttime = now; if ( ptr->ispaired != 0 ) { From 82c04f740e6a84654e89ccccde302faec14bd3eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 22:46:19 +0300 Subject: [PATCH 815/910] 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 432bc4ce0..9dde8e1cd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -32,7 +32,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.195", };//"5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // uint32_t LP_deadman_switch; int32_t LP_mypubsock = -1; From 8ef3dbe88f1c8626ff633e80cf82a6c9f5ff84cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 23:22:24 +0300 Subject: [PATCH 816/910] Test --- iguana/exchanges/LP_bitcoin.c | 125 ++++++++++++++++-------------- iguana/exchanges/LP_coins.c | 7 +- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_ordermatch.c | 17 +++- iguana/exchanges/LP_remember.c | 24 +++--- iguana/exchanges/LP_swap.c | 12 +-- iguana/exchanges/LP_transaction.c | 98 +++++++++++------------ iguana/exchanges/LP_utxos.c | 2 +- iguana/exchanges/client | 1 + iguana/exchanges/run | 1 + 11 files changed, 155 insertions(+), 136 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 12b975c02..9f07c094b 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2028,19 +2028,20 @@ char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *meth return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params,0)); } -int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr) +int32_t bitcoin_addr2rmd160(uint8_t taddr,uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr) { - bits256 hash; uint8_t *buf,_buf[25]; int32_t len; + bits256 hash; uint8_t *buf,_buf[26]; int32_t len,offset; + offset = 1 + (taddr != 0); memset(rmd160,0,20); *addrtypep = 0; buf = _buf; if ( (len= bitcoin_base58decode(buf,coinaddr)) >= 4 ) { // validate with trailing hash, then remove hash - hash = bits256_doublesha256(0,buf,21); + hash = bits256_doublesha256(0,buf,20+offset); *addrtypep = *buf; - memcpy(rmd160,buf+1,20); - if ( (buf[21]&0xff) == hash.bytes[31] && (buf[22]&0xff) == hash.bytes[30] &&(buf[23]&0xff) == hash.bytes[29] && (buf[24]&0xff) == hash.bytes[28] ) + memcpy(rmd160,buf+offset,20); + if ( (buf[20+offset]&0xff) == hash.bytes[31] && (buf[21+offset]&0xff) == hash.bytes[30] &&(buf[22+offset]&0xff) == hash.bytes[29] && (buf[23+offset]&0xff) == hash.bytes[28] ) { //printf("coinaddr.(%s) valid checksum addrtype.%02x\n",coinaddr,*addrtypep); return(20); @@ -2060,18 +2061,21 @@ int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr return(0); } -char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len) +char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len) { - int32_t i; uint8_t data[25]; bits256 hash;// char checkaddr[65]; + int32_t offset,i; uint8_t data[26]; bits256 hash;// char checkaddr[65]; + offset = 1 + (taddr != 0); if ( len != 20 ) - calc_rmd160_sha256(data+1,pubkey_or_rmd160,len); - else memcpy(data+1,pubkey_or_rmd160,20); + calc_rmd160_sha256(data+offset,pubkey_or_rmd160,len); + else memcpy(data+offset,pubkey_or_rmd160,20); //btc_convrmd160(checkaddr,addrtype,data+1); data[0] = addrtype; - hash = bits256_doublesha256(0,data,21); + if ( taddr != 0 ) + data[1] = taddr; + hash = bits256_doublesha256(0,data,20+offset); for (i=0; i<4; i++) - data[21+i] = hash.bytes[31-i]; - if ( (coinaddr= bitcoin_base58encode(coinaddr,data,25)) != 0 ) + data[20+offset+i] = hash.bytes[31-i]; + if ( (coinaddr= bitcoin_base58encode(coinaddr,data,24+offset)) != 0 ) { //uint8_t checktype,rmd160[20]; //bitcoin_addr2rmd160(&checktype,rmd160,coinaddr); @@ -2081,34 +2085,37 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160, return(coinaddr); } -int32_t bitcoin_validaddress(uint8_t pubtype,uint8_t p2shtype,char *coinaddr) +int32_t bitcoin_validaddress(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,char *coinaddr) { uint8_t rmd160[20],addrtype; char checkaddr[128]; if ( coinaddr == 0 || coinaddr[0] == 0 ) return(-1); - else if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) < 0 ) + else if ( bitcoin_addr2rmd160(taddr,&addrtype,rmd160,coinaddr) < 0 ) return(-1); else if ( addrtype != pubtype && addrtype != p2shtype ) return(-1); - else if ( bitcoin_address(checkaddr,addrtype,rmd160,sizeof(rmd160)) != checkaddr || strcmp(checkaddr,coinaddr) != 0 ) + else if ( bitcoin_address(checkaddr,addrtype,taddr,rmd160,sizeof(rmd160)) != checkaddr || strcmp(checkaddr,coinaddr) != 0 ) return(-1); return(0); } -int32_t base58encode_checkbuf(uint8_t addrtype,uint8_t *data,int32_t data_len) +int32_t base58encode_checkbuf(uint8_t taddr,uint8_t addrtype,uint8_t *data,int32_t data_len) { - uint8_t i; bits256 hash; + uint8_t i,offset; bits256 hash; + offset = 1 + (taddr != 0); data[0] = addrtype; + if ( taddr != 0 ) + data[1] = taddr; //for (i=0; i "); - hash = bits256_doublesha256(0,data,(int32_t)data_len+1); + hash = bits256_doublesha256(0,data,(int32_t)data_len+offset); //for (i=0; i<32; i++) // printf("%02x",hash.bytes[i]); //printf(" checkhash\n"); for (i=0; i<4; i++) - data[data_len+i+1] = hash.bytes[31-i]; - return(data_len + 5); + data[data_len+i+offset] = hash.bytes[31-i]; + return(data_len + 4 + offset); } int32_t bitcoin_wif2priv(uint8_t *addrtypep,bits256 *privkeyp,char *wifstr) @@ -2146,7 +2153,7 @@ int32_t bitcoin_priv2wif(char *wifstr,bits256 privkey,uint8_t addrtype) uint8_t data[128]; int32_t len = 32; memcpy(data+1,privkey.bytes,sizeof(privkey)); data[1 + len++] = 1; - len = base58encode_checkbuf(addrtype,data,len); + len = base58encode_checkbuf(0,addrtype,data,len); if ( bitcoin_base58encode(wifstr,data,len) == 0 ) return(-1); if ( 1 ) @@ -2165,7 +2172,7 @@ int32_t bitcoin_priv2wiflong(char *wifstr,bits256 privkey,uint8_t addrtype) { uint8_t data[128]; int32_t len = 32; memcpy(data+1,privkey.bytes,sizeof(privkey)); - len = base58encode_checkbuf(addrtype,data,len); + len = base58encode_checkbuf(0,addrtype,data,len); if ( bitcoin_base58encode(wifstr,data,len) == 0 ) return(-1); if ( 1 ) @@ -2180,10 +2187,10 @@ int32_t bitcoin_priv2wiflong(char *wifstr,bits256 privkey,uint8_t addrtype) return((int32_t)strlen(wifstr)); } -bits256 LP_privkey(char *coinaddr) +bits256 LP_privkey(char *coinaddr,uint8_t taddr) { bits256 privkey; uint8_t addrtype,rmd160[20]; - bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); + bitcoin_addr2rmd160(taddr,&addrtype,rmd160,coinaddr); privkey = LP_privkeyfind(rmd160); return(privkey); } @@ -2216,7 +2223,7 @@ uint8_t iguana_addrtype(uint8_t pubtype,uint8_t p2shtype,uint8_t script_type) } } -int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *nump,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,const struct vin_info *vp,int32_t txi) +int32_t iguana_scriptgen(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *nump,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,const struct vin_info *vp,int32_t txi) { uint8_t addrtype; char rmd160str[41],pubkeystr[256]; int32_t plen,i,m,n,flag = 0,scriptlen = 0; m = n = 0; @@ -2226,7 +2233,7 @@ int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *n if ( type == IGUANA_SCRIPT_76A988AC || type == IGUANA_SCRIPT_AC || type == IGUANA_SCRIPT_76AC || type == IGUANA_SCRIPT_P2SH ) { init_hexbytes_noT(rmd160str,rmd160,20); - bitcoin_address(coinaddr,addrtype,rmd160,20); + bitcoin_address(coinaddr,taddr,addrtype,rmd160,20); } switch ( type ) { @@ -2265,7 +2272,7 @@ int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *n case IGUANA_SCRIPT_OPRETURN: if ( asmstr != 0 ) strcpy(asmstr,"OP_RETURN "); - bitcoin_address(coinaddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); + bitcoin_address(coinaddr,taddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); flag++; break; case IGUANA_SCRIPT_3of3: m = 3, n = 3; break; @@ -2278,13 +2285,13 @@ int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *n case IGUANA_SCRIPT_DATA: if ( asmstr != 0 ) strcpy(asmstr,"DATA ONLY"); - bitcoin_address(coinaddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); + bitcoin_address(coinaddr,taddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); flag++; break; case IGUANA_SCRIPT_STRANGE: if ( asmstr != 0 ) strcpy(asmstr,"STRANGE SCRIPT "); - bitcoin_address(coinaddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); + bitcoin_address(coinaddr,taddr,addrtype,(uint8_t *)&vp->spendscript[0],vp->spendlen); flag++; break; default: break;//printf("unexpected script type.%d\n",type); break; @@ -2292,7 +2299,7 @@ int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *n if ( n > 0 ) { scriptlen = bitcoin_MofNspendscript(rmd160,script,0,vp); - bitcoin_address(coinaddr,p2shtype,script,scriptlen); + bitcoin_address(coinaddr,taddr,p2shtype,script,scriptlen); if ( asmstr != 0 ) { sprintf(asmstr,"%d ",m); @@ -2319,7 +2326,7 @@ int32_t iguana_scriptgen(uint8_t pubtype,uint8_t p2shtype,int32_t *Mp,int32_t *n return(scriptlen); } -int32_t bitcoin_scriptget(uint8_t pubtype,uint8_t p2shtype,int32_t *hashtypep,uint32_t *sigsizep,uint32_t *pubkeysizep,uint8_t **userdatap,uint32_t *userdatalenp,struct vin_info *vp,uint8_t *scriptsig,int32_t len,int32_t spendtype) +int32_t bitcoin_scriptget(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,int32_t *hashtypep,uint32_t *sigsizep,uint32_t *pubkeysizep,uint8_t **userdatap,uint32_t *userdatalenp,struct vin_info *vp,uint8_t *scriptsig,int32_t len,int32_t spendtype) { int32_t j,n,siglen,plen; uint8_t *p2shscript; j = n = 0; @@ -2393,12 +2400,12 @@ int32_t bitcoin_scriptget(uint8_t pubtype,uint8_t p2shtype,int32_t *hashtypep,ui decode_hex(vp->rmd160,20,"010966776006953d5567439e5e39f86a0d273bee");//3564a74f9ddb4372301c49154605573d7d1a88fe"); vp->type = IGUANA_SCRIPT_76A988AC; }*/ - vp->spendlen = iguana_scriptgen(pubtype,p2shtype,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,0,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); + vp->spendlen = iguana_scriptgen(taddr,pubtype,p2shtype,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,0,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); //printf("type.%d asmstr.(%s) spendlen.%d\n",vp->type,asmstr,vp->spendlen); return(vp->spendlen); } -int32_t _iguana_calcrmd160(uint8_t pubtype,uint8_t p2shtype,struct vin_info *vp) +int32_t _iguana_calcrmd160(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,struct vin_info *vp) { static uint8_t zero_rmd160[20]; char hexstr[8192]; uint8_t *script,type; int32_t i,n,m,plen; @@ -2473,7 +2480,7 @@ int32_t _iguana_calcrmd160(uint8_t pubtype,uint8_t p2shtype,struct vin_info *vp) } memcpy(vp->signers[i].pubkey,script,plen); calc_rmd160_sha256(vp->signers[i].rmd160,vp->signers[i].pubkey,plen); - bitcoin_address(vp->signers[i].coinaddr,pubtype,vp->signers[i].pubkey,plen); + bitcoin_address(vp->signers[i].coinaddr,taddr,pubtype,vp->signers[i].pubkey,plen); } if ( (int32_t)((long)script - (long)vp->spendscript) == vp->spendlen-2 ) { @@ -2526,7 +2533,7 @@ int32_t _iguana_calcrmd160(uint8_t pubtype,uint8_t p2shtype,struct vin_info *vp) return(type); } -int32_t iguana_calcrmd160(uint8_t pubtype,uint8_t p2shtype,char *asmstr,struct vin_info *vp,uint8_t *pk_script,int32_t pk_scriptlen,bits256 debugtxid,int32_t vout,uint32_t sequence) +int32_t iguana_calcrmd160(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,char *asmstr,struct vin_info *vp,uint8_t *pk_script,int32_t pk_scriptlen,bits256 debugtxid,int32_t vout,uint32_t sequence) { int32_t scriptlen; uint8_t script[IGUANA_MAXSCRIPTSIZE]; memset(vp,0,sizeof(*vp)); @@ -2534,9 +2541,9 @@ int32_t iguana_calcrmd160(uint8_t pubtype,uint8_t p2shtype,char *asmstr,struct v vp->spendlen = pk_scriptlen; vp->vin.sequence = sequence; memcpy(vp->spendscript,pk_script,pk_scriptlen); - if ( (vp->type= _iguana_calcrmd160(pubtype,p2shtype,vp)) >= 0 ) + if ( (vp->type= _iguana_calcrmd160(taddr,pubtype,p2shtype,vp)) >= 0 ) { - scriptlen = iguana_scriptgen(pubtype,p2shtype,&vp->M,&vp->N,vp->coinaddr,script,asmstr,vp->rmd160,vp->type,(const struct vin_info *)vp,vout); + scriptlen = iguana_scriptgen(taddr,pubtype,p2shtype,&vp->M,&vp->N,vp->coinaddr,script,asmstr,vp->rmd160,vp->type,(const struct vin_info *)vp,vout); if ( vp->M == 0 && vp->N == 0 ) { vp->M = vp->N = 1; @@ -2578,11 +2585,11 @@ cJSON *bitcoin_txscript(char *asmstr,char **vardata,int32_t numvars) return(scriptjson); } -cJSON *iguana_scriptpubkeys(uint8_t pubtype,uint8_t p2shtype,uint8_t *script,int32_t scriptlen,bits256 txid,int16_t vout,uint32_t sequenceid) +cJSON *iguana_scriptpubkeys(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t *script,int32_t scriptlen,bits256 txid,int16_t vout,uint32_t sequenceid) { int32_t type,i,n,plen; struct vin_info V; cJSON *pubkeys; char pubkeystr[256]; pubkeys = cJSON_CreateArray(); - if ( (type= iguana_calcrmd160(pubtype,p2shtype,0,&V,script,scriptlen,txid,vout,sequenceid)) >= 0 ) + if ( (type= iguana_calcrmd160(taddr,pubtype,p2shtype,0,&V,script,scriptlen,txid,vout,sequenceid)) >= 0 ) { if ( (n= V.N) == 0 ) n = 1; @@ -2634,7 +2641,7 @@ cJSON *iguana_pubkeysjson(uint8_t *pubkeyptrs[],int32_t numpubkeys) return(pubkeysjson); } -cJSON *bitcoin_txinput(uint8_t pubtype,uint8_t p2shtype,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys,uint8_t *sig,int32_t siglen) +cJSON *bitcoin_txinput(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys,uint8_t *sig,int32_t siglen) { cJSON *item,*vins; char p2shscriptstr[IGUANA_MAXSCRIPTSIZE*2+1]; uint8_t *script,len=0; vins = jduplicate(jobj(txobj,"vin")); @@ -2654,7 +2661,7 @@ cJSON *bitcoin_txinput(uint8_t pubtype,uint8_t p2shtype,cJSON *txobj,bits256 txi script = redeemscript, len = p2shlen; } else script = 0; if ( script != 0 && numpubkeys == 0 ) - jadd(item,"pubkeys",iguana_scriptpubkeys(pubtype,p2shtype,script,len,txid,vout,sequenceid)); + jadd(item,"pubkeys",iguana_scriptpubkeys(taddr,pubtype,p2shtype,script,len,txid,vout,sequenceid)); else if ( pubkeys != 0 && numpubkeys > 0 ) jadd(item,"pubkeys",iguana_pubkeysjson(pubkeys,numpubkeys)); jaddbits256(item,"txid",txid); @@ -2698,12 +2705,12 @@ cJSON *bitcoin_txoutput(cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t return(txobj); } -int32_t bitcoin_txaddspend(uint8_t pubtype,uint8_t p2shtype,cJSON *txobj,char *destaddress,uint64_t satoshis) +int32_t bitcoin_txaddspend(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,cJSON *txobj,char *destaddress,uint64_t satoshis) { uint8_t outputscript[128],addrtype,rmd160[20]; int32_t scriptlen; - if ( bitcoin_validaddress(pubtype,p2shtype,destaddress) == 0 && satoshis != 0 ) + if ( bitcoin_validaddress(taddr,pubtype,p2shtype,destaddress) == 0 && satoshis != 0 ) { - bitcoin_addr2rmd160(&addrtype,rmd160,destaddress); + bitcoin_addr2rmd160(taddr,&addrtype,rmd160,destaddress); scriptlen = bitcoin_standardspend(outputscript,0,rmd160); bitcoin_txoutput(txobj,outputscript,scriptlen,satoshis); return(0); @@ -3130,7 +3137,7 @@ int32_t iguana_parsevoutobj(uint8_t *serialized,int32_t maxsize,struct iguana_ms return(len); } -cJSON *iguana_voutjson(uint8_t pubtype,uint8_t p2shtype,struct iguana_msgvout *vout,int32_t txi,bits256 txid) +cJSON *iguana_voutjson(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,struct iguana_msgvout *vout,int32_t txi,bits256 txid) { // 035f1321ed17d387e4433b2fa229c53616057964af065f98bfcae2233c5108055e OP_CHECKSIG char scriptstr[IGUANA_MAXSCRIPTSIZE+1],asmstr[2*IGUANA_MAXSCRIPTSIZE+1]; int32_t i,m,n,scriptlen,asmtype; struct vin_info *vp; @@ -3143,10 +3150,10 @@ cJSON *iguana_voutjson(uint8_t pubtype,uint8_t p2shtype,struct iguana_msgvout *v if ( vout->pk_script != 0 && vout->pk_scriptlen*2+1 < sizeof(scriptstr) ) { memset(vp,0,sizeof(*vp)); - if ( (asmtype= iguana_calcrmd160(pubtype,p2shtype,asmstr,vp,vout->pk_script,vout->pk_scriptlen,txid,txi,0xffffffff)) >= 0 ) + if ( (asmtype= iguana_calcrmd160(taddr,pubtype,p2shtype,asmstr,vp,vout->pk_script,vout->pk_scriptlen,txid,txi,0xffffffff)) >= 0 ) { skey = cJSON_CreateObject(); - scriptlen = iguana_scriptgen(pubtype,p2shtype,&m,&n,vp->coinaddr,space,asmstr,vp->rmd160,asmtype,vp,txi); + scriptlen = iguana_scriptgen(taddr,pubtype,p2shtype,&m,&n,vp->coinaddr,space,asmstr,vp->rmd160,asmtype,vp,txi); if ( asmstr[0] != 0 ) jaddstr(skey,"asm",asmstr); addrs = cJSON_CreateArray(); @@ -3223,9 +3230,9 @@ int32_t iguana_vinarray_check(cJSON *vinarray,bits256 txid,int32_t vout) return(-1); } -int32_t iguana_rwmsgtx(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,int32_t rwflag,cJSON *json,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msg,bits256 *txidp,char *vpnstr,uint8_t *extraspace,int32_t extralen,cJSON *vins,int32_t suppress_pubkeys); +int32_t iguana_rwmsgtx(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,int32_t rwflag,cJSON *json,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msg,bits256 *txidp,char *vpnstr,uint8_t *extraspace,int32_t extralen,cJSON *vins,int32_t suppress_pubkeys); -bits256 bitcoin_sigtxid(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,uint8_t *serialized,int32_t maxlen,struct iguana_msgtx *msgtx,int32_t vini,uint8_t *spendscript,int32_t spendlen,int32_t hashtype,char *vpnstr,int32_t suppress_pubkeys) +bits256 bitcoin_sigtxid(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,uint8_t *serialized,int32_t maxlen,struct iguana_msgtx *msgtx,int32_t vini,uint8_t *spendscript,int32_t spendlen,int32_t hashtype,char *vpnstr,int32_t suppress_pubkeys) { int32_t i,len; bits256 sigtxid,txid,revsigtxid; struct iguana_msgtx dest; dest = *msgtx; @@ -3259,7 +3266,7 @@ bits256 bitcoin_sigtxid(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t h dest.vins[i].userdata = 0; dest.vins[i].userdatalen = 0; } - len = iguana_rwmsgtx(pubtype,p2shtype,isPoS,height,1,0,serialized,maxlen,&dest,&txid,vpnstr,0,0,0,suppress_pubkeys); + len = iguana_rwmsgtx(taddr,pubtype,p2shtype,isPoS,height,1,0,serialized,maxlen,&dest,&txid,vpnstr,0,0,0,suppress_pubkeys); //for (i=0; iversion),&msg->version); @@ -3366,7 +3373,7 @@ int32_t iguana_rwmsgtx(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t he return(-1); } if ( voutarray != 0 ) - jaddi(voutarray,iguana_voutjson(pubtype,p2shtype,&msg->vouts[i],i,*txidp)); + jaddi(voutarray,iguana_voutjson(taddr,pubtype,p2shtype,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); //printf("lock_time.%08x len.%d\n",msg->lock_time,len); @@ -3398,7 +3405,7 @@ int32_t iguana_rwmsgtx(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t he if ( vins != 0 && jitem(vins,i) != 0 ) { iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); - sigtxid = bitcoin_sigtxid(pubtype,p2shtype,isPoS,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); + sigtxid = bitcoin_sigtxid(taddr,pubtype,p2shtype,isPoS,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); if ( iguana_vinarray_check(vinarray,msg->vins[i].prev_hash,msg->vins[i].prev_vout) < 0 ) jaddi(vinarray,iguana_vinjson(&msg->vins[i],sigtxid)); @@ -3495,13 +3502,13 @@ bits256 iguana_parsetxobj(uint8_t isPoS,int32_t *txstartp,uint8_t *serialized,in return(txid); } -char *iguana_rawtxbytes(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,cJSON *json,struct iguana_msgtx *msgtx,int32_t suppress_pubkeys) +char *iguana_rawtxbytes(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,cJSON *json,struct iguana_msgtx *msgtx,int32_t suppress_pubkeys) { int32_t n; char *txbytes = 0,vpnstr[64]; uint8_t *serialized; serialized = malloc(IGUANA_MAXPACKETSIZE); vpnstr[0] = 0; //char str[65]; printf("%d of %d: %s\n",i,msg.txn_count,bits256_str(str,tx.txid)); - if ( (n= iguana_rwmsgtx(pubtype,p2shtype,isPoS,height,1,json,serialized,IGUANA_MAXPACKETSIZE,msgtx,&msgtx->txid,vpnstr,0,0,0,suppress_pubkeys)) > 0 ) + if ( (n= iguana_rwmsgtx(taddr,pubtype,p2shtype,isPoS,height,1,json,serialized,IGUANA_MAXPACKETSIZE,msgtx,&msgtx->txid,vpnstr,0,0,0,suppress_pubkeys)) > 0 ) { txbytes = malloc(n*2+1); init_hexbytes_noT(txbytes,serialized,n); @@ -3529,7 +3536,7 @@ char *bitcoin_json2hex(uint8_t isPoS,bits256 *txidp,cJSON *txjson,struct vin_inf return(txbytes); } -cJSON *bitcoin_data2json(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *txidp,struct iguana_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,uint8_t *serialized,int32_t len,cJSON *vins,int32_t suppress_pubkeys) +cJSON *bitcoin_data2json(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *txidp,struct iguana_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,uint8_t *serialized,int32_t len,cJSON *vins,int32_t suppress_pubkeys) { int32_t n; char vpnstr[64]; struct iguana_msgtx M; cJSON *txobj; if ( serialized == 0 ) @@ -3540,7 +3547,7 @@ cJSON *bitcoin_data2json(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t memset(msgtx,0,sizeof(M)); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); - if ( (n= iguana_rwmsgtx(pubtype,p2shtype,isPoS,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) + if ( (n= iguana_rwmsgtx(taddr,pubtype,p2shtype,isPoS,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) { printf("errortxobj.(%s)\n",jprint(txobj,0)); free_json(txobj); @@ -3558,7 +3565,7 @@ cJSON *bitcoin_data2json(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t return(txobj); } -cJSON *bitcoin_hex2json(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *txidp,struct iguana_msgtx *msgtx,char *txbytes,uint8_t *extraspace,int32_t extralen,uint8_t *origserialized,cJSON *vins,int32_t suppress_pubkeys) +cJSON *bitcoin_hex2json(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *txidp,struct iguana_msgtx *msgtx,char *txbytes,uint8_t *extraspace,int32_t extralen,uint8_t *origserialized,cJSON *vins,int32_t suppress_pubkeys) { int32_t len; uint8_t *serialized; cJSON *txobj; if ( txbytes == 0 ) @@ -3567,7 +3574,7 @@ cJSON *bitcoin_hex2json(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t h if ( (serialized= origserialized) == 0 ) serialized = calloc(1,len+4096); decode_hex(serialized,len,txbytes); - txobj = bitcoin_data2json(pubtype,p2shtype,isPoS,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); + txobj = bitcoin_data2json(taddr,pubtype,p2shtype,isPoS,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); if ( serialized != origserialized ) free(serialized); return(txobj); diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 06ea91849..65ba8bc43 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -173,12 +173,13 @@ cJSON *LP_coinsjson() return(array); } -void 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) +void 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 taddr) { memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); sprintf(coin->serverport,"127.0.0.1:%u",port); coin->isPoS = isPoS; + coin->taddr = taddr; coin->longestchain = longestchain; coin->txfee = txfee; coin->estimatedrate = estimatedrate; @@ -249,7 +250,7 @@ struct iguana_info *LP_coinfind(char *symbol) name = symbol; assetname = symbol; } - LP_coininit(&cdata,symbol,name,assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + LP_coininit(&cdata,symbol,name,assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,0); if ( (coin= LP_coinadd(&cdata)) != 0 && strcmp(symbol,"KMD") == 0 ) coin->inactive = 0; return(coin); @@ -278,7 +279,7 @@ struct iguana_info *LP_coincreate(cJSON *item) name = assetname; else if ( (name= jstr(item,"name")) == 0 ) name = symbol; - LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain); + LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,jint(item,"taddr")); coin = LP_coinadd(&cdata); } if ( coin != 0 && item != 0 ) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 4cc96c755..dde474f84 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -52,7 +52,7 @@ char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjs } if ( strcmp(method,"hello") == 0 ) { - printf("got hello from %s:%u\n",ipaddr!=0?ipaddr:"",argport); + //printf("got hello from %s:%u\n",ipaddr!=0?ipaddr:"",argport); return(0); } else if ( strcmp(method,"nn_tests") == 0 ) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index de84ed0c5..79127306d 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -151,7 +151,7 @@ struct iguana_info { uint64_t txfee; double estimatedrate,profitmargin; int32_t longestchain; uint32_t counter,inactive; - uint8_t pubtype,p2shtype,isPoS,wiftype; + uint8_t pubtype,p2shtype,isPoS,wiftype,taddr; char symbol[16],smartaddr[64],userpass[1024],serverport[128]; }; diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 4e660f225..c67c105bb 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -378,10 +378,15 @@ int32_t LP_nanobind(char *pairstr,char *myipaddr) int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { - char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; + char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; printf("LP_connectstartbob.(%s) with.(%s)\n",myipaddr,jprint(argjson,0)); qp->quotetime = (uint32_t)time(NULL); - privkey = LP_privkey(utxo->coinaddr); + if ( (coin= LP_coinfind(utxo->coin)) == 0 ) + { + printf("cant find coin.%s\n",utxo->coin); + return(-1); + } + privkey = LP_privkey(utxo->coinaddr,coin->taddr); if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) { if ( (pair= LP_nanobind(pairstr,myipaddr)) >= 0 ) @@ -424,7 +429,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs char *LP_connectedalice(cJSON *argjson) // alice { - cJSON *retjson; double bid,ask,price,qprice; int32_t timeout,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *autxo,*butxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; + cJSON *retjson; double bid,ask,price,qprice; int32_t timeout,pairsock = -1; char *pairstr; int32_t DEXselector = 0; struct LP_utxoinfo *autxo,*butxo; struct LP_quoteinfo Q; struct basilisk_swap *swap; struct iguana_info *coin; if ( LP_quoteparse(&Q,argjson) < 0 ) clonestr("{\"error\":\"cant parse quote\"}"); if ( bits256_cmp(Q.desthash,LP_mypubkey) != 0 ) @@ -449,7 +454,11 @@ char *LP_connectedalice(cJSON *argjson) // alice LP_availableset(autxo); return(clonestr("{\"error\":\"quote price too expensive\"}")); } - Q.privkey = LP_privkey(Q.destaddr); + if ( (coin= LP_coinfind(Q.destcoin)) == 0 ) + { + 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 ) { retjson = cJSON_CreateObject(); diff --git a/iguana/exchanges/LP_remember.c b/iguana/exchanges/LP_remember.c index d2a06d19f..78ce4a783 100644 --- a/iguana/exchanges/LP_remember.c +++ b/iguana/exchanges/LP_remember.c @@ -71,7 +71,7 @@ void basilisk_dontforget(struct basilisk_swap *swap,struct basilisk_rawtx *rawtx fprintf(fp,",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); if ( bits256_nonz(swap->I.pubAm) != 0 && bits256_nonz(swap->I.pubBn) != 0 ) { - basilisk_alicescript(redeemscript,&len,script,0,coinaddr,swap->alicecoin.p2shtype,swap->I.pubAm,swap->I.pubBn); + basilisk_alicescript(redeemscript,&len,script,0,coinaddr,swap->alicecoin.taddr,swap->alicecoin.p2shtype,swap->I.pubAm,swap->I.pubBn); LP_importaddress(swap->alicecoin.symbol,coinaddr); fprintf(fp,",\"Apayment\":\"%s\"",coinaddr); } @@ -568,12 +568,12 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti { if ( (alice= LP_coinfind(alicecoin)) != 0 ) { - bitcoin_address(Adestaddr,alice->pubtype,pubkey33,33); + bitcoin_address(Adestaddr,alice->taddr,alice->pubtype,pubkey33,33); AAdest = Adestaddr; } if ( (bob= LP_coinfind(bobcoin)) != 0 ) { - bitcoin_address(destaddr,bob->pubtype,pubkey33,33); + bitcoin_address(destaddr,bob->taddr,bob->pubtype,pubkey33,33); Adest = destaddr; } } @@ -581,12 +581,12 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti { if ( (bob= LP_coinfind(bobcoin)) != 0 ) { - bitcoin_address(destaddr,bob->pubtype,pubkey33,33); + bitcoin_address(destaddr,bob->taddr,bob->pubtype,pubkey33,33); Bdest = destaddr; } if ( (alice= LP_coinfind(alicecoin)) != 0 ) { - bitcoin_address(Adestaddr,alice->pubtype,pubkey33,33); + bitcoin_address(Adestaddr,alice->taddr,alice->pubtype,pubkey33,33); ABdest = Adestaddr; } } @@ -625,12 +625,12 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti { char privaddr[64]; uint8_t privpub33[33]; bitcoin_pubkey33(ctx,privpub33,myprivs[0]); - bitcoin_address(privaddr,60,privpub33,33); + bitcoin_address(privaddr,0,60,privpub33,33); printf("alicespend len.%d redeemlen.%d priv0addr.(%s) priv0.(%s)\n",len,redeemlen,privaddr,bits256_str(str,myprivs[0])); } for (j=0; j<32; j++) rev.bytes[j] = myprivs[0].bytes[31 - j]; - if ( (txbytes[BASILISK_ALICESPEND]= basilisk_swap_bobtxspend(&signedtxid,txfee,"alicespend",bobcoin,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBPAYMENT],0,0,pubkey33,1,expiration,&values[BASILISK_ALICESPEND],0,0,bobpaymentaddr,1)) != 0 ) + if ( (txbytes[BASILISK_ALICESPEND]= basilisk_swap_bobtxspend(&signedtxid,txfee,"alicespend",bobcoin,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBPAYMENT],0,0,pubkey33,1,expiration,&values[BASILISK_ALICESPEND],0,0,bobpaymentaddr,1)) != 0 ) printf("alicespend.(%s)\n",txbytes[BASILISK_ALICESPEND]); } } @@ -655,7 +655,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti if ( redeemlen > 0 ) { len = basilisk_swapuserdata(userdata,zero,1,myprivs[0],redeemscript,redeemlen); - if ( (txbytes[BASILISK_ALICECLAIM]= basilisk_swap_bobtxspend(&signedtxid,txfee,"aliceclaim",bobcoin,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBDEPOSIT],0,0,pubkey33,0,expiration,&values[BASILISK_ALICECLAIM],0,0,bobdepositaddr,1)) != 0 ) + if ( (txbytes[BASILISK_ALICECLAIM]= basilisk_swap_bobtxspend(&signedtxid,txfee,"aliceclaim",bobcoin,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBDEPOSIT],0,0,pubkey33,0,expiration,&values[BASILISK_ALICECLAIM],0,0,bobdepositaddr,1)) != 0 ) printf("privBn.(%s) aliceclaim.(%s)\n",bits256_str(str,privBn),txbytes[BASILISK_ALICECLAIM]); } } @@ -677,7 +677,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti privBn = basilisk_swap_privBn_extract(&txids[BASILISK_BOBREFUND],bobcoin,txids[BASILISK_BOBDEPOSIT],privBn); if ( bits256_nonz(txids[BASILISK_ALICEPAYMENT]) != 0 && bits256_nonz(privAm) != 0 && bits256_nonz(privBn) != 0 ) { - if ( (txbytes[BASILISK_ALICERECLAIM]= basilisk_swap_Aspend("alicereclaim",alicecoin,alice->pubtype,alice->p2shtype,alice->isPoS,alice->wiftype,ctx,privAm,privBn,txids[BASILISK_ALICEPAYMENT],0,pubkey33,expiration,&values[BASILISK_ALICERECLAIM],alicepaymentaddr)) != 0 ) + if ( (txbytes[BASILISK_ALICERECLAIM]= basilisk_swap_Aspend("alicereclaim",alicecoin,alice->taddr,alice->pubtype,alice->p2shtype,alice->isPoS,alice->wiftype,ctx,privAm,privBn,txids[BASILISK_ALICEPAYMENT],0,pubkey33,expiration,&values[BASILISK_ALICERECLAIM],alicepaymentaddr)) != 0 ) printf("privBn.(%s) alicereclaim.(%s)\n",bits256_str(str,privBn),txbytes[BASILISK_ALICERECLAIM]); } } @@ -707,7 +707,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti } if ( bits256_nonz(privAm) != 0 && bits256_nonz(privBn) != 0 ) { - if ( (txbytes[BASILISK_BOBSPEND]= basilisk_swap_Aspend("bobspend",alicecoin,alice->pubtype,alice->p2shtype,alice->isPoS,alice->wiftype,ctx,privAm,privBn,txids[BASILISK_ALICEPAYMENT],0,pubkey33,expiration,&values[BASILISK_BOBSPEND],alicepaymentaddr)) != 0 ) + if ( (txbytes[BASILISK_BOBSPEND]= basilisk_swap_Aspend("bobspend",alicecoin,alice->taddr,alice->pubtype,alice->p2shtype,alice->isPoS,alice->wiftype,ctx,privAm,privBn,txids[BASILISK_ALICEPAYMENT],0,pubkey33,expiration,&values[BASILISK_BOBSPEND],alicepaymentaddr)) != 0 ) printf("bobspend.(%s)\n",txbytes[BASILISK_BOBSPEND]); } } @@ -731,7 +731,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti if ( redeemlen > 0 ) { len = basilisk_swapuserdata(userdata,zero,1,myprivs[1],redeemscript,redeemlen); - if ( (txbytes[BASILISK_BOBRECLAIM]= basilisk_swap_bobtxspend(&signedtxid,txfee,"bobrefund",bobcoin,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[1],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBPAYMENT],0,0,pubkey33,0,expiration,&values[BASILISK_BOBRECLAIM],0,0,bobpaymentaddr,1)) != 0 ) + if ( (txbytes[BASILISK_BOBRECLAIM]= basilisk_swap_bobtxspend(&signedtxid,txfee,"bobrefund",bobcoin,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[1],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBPAYMENT],0,0,pubkey33,0,expiration,&values[BASILISK_BOBRECLAIM],0,0,bobpaymentaddr,1)) != 0 ) { int32_t z; for (z=0; z<20; z++) @@ -761,7 +761,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti vcalc_sha256(0,secretBn256,privBn.bytes,sizeof(privBn)); redeemlen = basilisk_swap_bobredeemscript(1,&secretstart,redeemscript,dlocktime,pubA0,pubB0,pubB1,privAm,privBn,secretAm,secretAm256,secretBn,secretBn256); len = basilisk_swapuserdata(userdata,privBn,0,myprivs[0],redeemscript,redeemlen); - if ( (txbytes[BASILISK_BOBREFUND]= basilisk_swap_bobtxspend(&signedtxid,txfee,"bobrefund",bobcoin,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBDEPOSIT],0,0,pubkey33,1,expiration,&values[BASILISK_BOBREFUND],0,0,bobdepositaddr,1)) != 0 ) + if ( (txbytes[BASILISK_BOBREFUND]= basilisk_swap_bobtxspend(&signedtxid,txfee,"bobrefund",bobcoin,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,myprivs[0],0,redeemscript,redeemlen,userdata,len,txids[BASILISK_BOBDEPOSIT],0,0,pubkey33,1,expiration,&values[BASILISK_BOBREFUND],0,0,bobdepositaddr,1)) != 0 ) printf("pubB1.(%s) bobrefund.(%s)\n",bits256_str(str,pubB1),txbytes[BASILISK_BOBREFUND]); } if ( txbytes[BASILISK_BOBREFUND] != 0 ) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 3bed48c10..158ccf323 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -510,7 +510,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); //for (i=0; iI.redeemlen; i++) // printf("%02x",rawtx->redeemscript[i]); - bitcoin_address(redeemaddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); + bitcoin_address(redeemaddr,rawtx->coin->taddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); //printf(" received redeemscript.(%s)\n",redeemaddr); LP_swap_coinaddr(swap,rawtx->coin,checkaddr,data,datalen); if ( strcmp(redeemaddr,checkaddr) != 0 ) @@ -542,7 +542,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba //char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) rawtx->I.actualtxid = txid; - if ( (txobj= bitcoin_data2json(rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) + if ( (txobj= bitcoin_data2json(rawtx->coin->taddr,rawtx->coin->pubtype,rawtx->coin->p2shtype,rawtx->coin->isPoS,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) { rawtx->I.actualtxid = rawtx->I.signedtxid; //char str[65]; printf("got %s txid.%s (%s)\n",rawtx->name,bits256_str(str,rawtx->I.signedtxid),jprint(txobj,0)); @@ -556,7 +556,7 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - bitcoin_address(rawtx->p2shaddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); + bitcoin_address(rawtx->p2shaddr,rawtx->coin->taddr,rawtx->coin->p2shtype,rawtx->spendscript,hexlen); //if ( swap != 0 ) // basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; @@ -866,13 +866,13 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * if ( strcmp(coin->symbol,"BTC") == 0 && (quoteid % 10) == 0 ) decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); - bitcoin_address(rawtx->I.destaddr,rawtx->coin->pubtype,rawtx->I.rmd160,20); + bitcoin_address(rawtx->I.destaddr,rawtx->coin->taddr,rawtx->coin->pubtype,rawtx->I.rmd160,20); } if ( pubkey33 != 0 ) { memcpy(rawtx->I.pubkey33,pubkey33,33); - bitcoin_address(rawtx->I.destaddr,rawtx->coin->pubtype,rawtx->I.pubkey33,33); - bitcoin_addr2rmd160(&rawtx->I.addrtype,rawtx->I.rmd160,rawtx->I.destaddr); + bitcoin_address(rawtx->I.destaddr,rawtx->coin->taddr,rawtx->coin->pubtype,rawtx->I.pubkey33,33); + bitcoin_addr2rmd160(rawtx->coin->taddr,&rawtx->I.addrtype,rawtx->I.rmd160,rawtx->I.destaddr); } if ( rawtx->I.vouttype <= 1 && rawtx->I.destaddr[0] != 0 ) { diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 28f3b6aa4..81cc74a93 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -454,7 +454,7 @@ bits256 iguana_str2priv(char *str) return(privkey); } -int32_t iguana_vininfo_create(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msgtx,cJSON *vins,int32_t numinputs,struct vin_info *V) +int32_t iguana_vininfo_create(uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msgtx,cJSON *vins,int32_t numinputs,struct vin_info *V) { int32_t i,plen,finalized = 1,len = 0; struct vin_info *vp; //struct iguana_waccount *wacct; struct iguana_waddress *waddr; uint32_t sigsize,pubkeysize,p2shsize,userdatalen; msgtx->tx_in = numinputs; @@ -486,9 +486,9 @@ int32_t iguana_vininfo_create(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uin { memcpy(vp->spendscript,msgtx->vins[i].spendscript,msgtx->vins[i].spendlen); vp->spendlen = msgtx->vins[i].spendlen; - _iguana_calcrmd160(pubtype,p2shtype,vp); + _iguana_calcrmd160(taddr,pubtype,p2shtype,vp); if ( (plen= bitcoin_pubkeylen(vp->signers[0].pubkey)) > 0 ) - bitcoin_address(vp->coinaddr,pubtype,vp->signers[0].pubkey,plen); + bitcoin_address(vp->coinaddr,taddr,pubtype,vp->signers[0].pubkey,plen); } if ( vp->M == 0 && vp->N == 0 ) vp->M = vp->N = 1; @@ -506,7 +506,7 @@ int32_t iguana_vininfo_create(uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uin return(finalized); } -int32_t bitcoin_verifyvins(void *ctx,char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *signedtxidp,char **signedtx,struct iguana_msgtx *msgtx,uint8_t *serialized,int32_t maxlen,struct vin_info *V,uint32_t sighash,int32_t signtx,int32_t suppress_pubkeys) +int32_t bitcoin_verifyvins(void *ctx,char *symbol,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,bits256 *signedtxidp,char **signedtx,struct iguana_msgtx *msgtx,uint8_t *serialized,int32_t maxlen,struct vin_info *V,uint32_t sighash,int32_t signtx,int32_t suppress_pubkeys) { bits256 sigtxid; uint8_t *sig,*script; struct vin_info *vp; char vpnstr[64]; int32_t scriptlen,complete=0,j,vini=0,flag=0,siglen,numvouts,numsigs; numvouts = msgtx->tx_out; @@ -528,7 +528,7 @@ int32_t bitcoin_verifyvins(void *ctx,char *symbol,uint8_t pubtype,uint8_t p2shty script = msgtx->vins[vini].spendscript; scriptlen = msgtx->vins[vini].spendlen; } - sigtxid = bitcoin_sigtxid(pubtype,p2shtype,isPoS,height,serialized,maxlen,msgtx,vini,script,scriptlen,sighash,vpnstr,suppress_pubkeys); + sigtxid = bitcoin_sigtxid(taddr,pubtype,p2shtype,isPoS,height,serialized,maxlen,msgtx,vini,script,scriptlen,sighash,vpnstr,suppress_pubkeys); if ( bits256_nonz(sigtxid) != 0 ) { vp = &V[vini]; @@ -584,7 +584,7 @@ int32_t bitcoin_verifyvins(void *ctx,char *symbol,uint8_t pubtype,uint8_t p2shty } iguana_msgtx_Vset(serialized,maxlen,msgtx,V); cJSON *txobj = cJSON_CreateObject(); - *signedtx = iguana_rawtxbytes(pubtype,p2shtype,isPoS,height,txobj,msgtx,suppress_pubkeys); + *signedtx = iguana_rawtxbytes(taddr,pubtype,p2shtype,isPoS,height,txobj,msgtx,suppress_pubkeys); //printf("SIGNEDTX.(%s)\n",jprint(txobj,1)); *signedtxidp = msgtx->txid; return(complete); @@ -598,7 +598,7 @@ int64_t iguana_lockval(int32_t finalized,int64_t locktime) return(lockval); } -int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) +int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) { uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; maxsize = 1000000; @@ -613,7 +613,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); // printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); - if ( (txobj= bitcoin_hex2json(pubtype,p2shtype,isPoS,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) + if ( (txobj= bitcoin_hex2json(taddr,pubtype,p2shtype,isPoS,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { //printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); @@ -621,7 +621,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t { //printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(pubtype,p2shtype,isPoS,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(taddr,pubtype,p2shtype,isPoS,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); @@ -649,14 +649,14 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t coinaddr[0] = 0; sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); - type = bitcoin_scriptget(pubtype,p2shtype,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); + type = bitcoin_scriptget(taddr,pubtype,p2shtype,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); //printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); if ( msgtx->vins[i].redeemscript != 0 ) { //for (j=0; jvins[i].p2shlen; j++) // printf("%02x",msgtx->vins[i].redeemscript[j]); - bitcoin_address(coinaddr,p2shtype,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen); - type = iguana_calcrmd160(pubtype,p2shtype,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,0); + bitcoin_address(coinaddr,taddr,p2shtype,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen); + type = iguana_calcrmd160(taddr,pubtype,p2shtype,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,0); for (j=0; jsuppress_pubkeys == 0 ) @@ -706,9 +706,9 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t } } } - finalized = iguana_vininfo_create(pubtype,p2shtype,isPoS,serialized2,maxsize,msgtx,vins,numinputs,V); + finalized = iguana_vininfo_create(taddr,pubtype,p2shtype,isPoS,serialized2,maxsize,msgtx,vins,numinputs,V); //printf("finalized.%d ignore_cltverr.%d suppress.%d\n",finalized,V[0].ignore_cltverr,V[0].suppress_pubkeys); - if ( (complete= bitcoin_verifyvins(ctx,symbol,pubtype,p2shtype,isPoS,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) + if ( (complete= bitcoin_verifyvins(ctx,symbol,taddr,pubtype,p2shtype,isPoS,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { /*int32_t tmp; //char str[65]; if ( (tmp= iguana_interpreter(ctx,cJSON_CreateArray(),iguana_lockval(finalized,jint(txobj,"locktime")),V,numinputs)) < 0 ) @@ -728,7 +728,7 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t pubtype,uint8_t return(complete); } -char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,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 vout,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 *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,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 vout,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,tmpaddr[64],hexstr[999],wifstr[128],txdestaddr[64],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*item,*privkeys; int32_t completed,spendlen,ignore_cltverr=1; struct vin_info V[2]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value,change = 0; struct iguana_msgtx msgtx; *destamountp = 0; @@ -789,14 +789,14 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch } jaddbits256(item,"txid",utxotxid); jaddnum(item,"vout",vout); - bitcoin_address(tmpaddr,pubtype,pubkey33,33); - bitcoin_addr2rmd160(&addrtype,rmd160,tmpaddr); + bitcoin_address(tmpaddr,taddr,pubtype,pubkey33,33); + bitcoin_addr2rmd160(taddr,&addrtype,rmd160,tmpaddr); if ( redeemlen != 0 ) { init_hexbytes_noT(hexstr,redeemscript,redeemlen); jaddstr(item,"redeemScript",hexstr); if ( vinaddr != 0 ) - bitcoin_addr2rmd160(&addrtype,rmd160,vinaddr); + bitcoin_addr2rmd160(taddr,&addrtype,rmd160,vinaddr); spendlen = bitcoin_p2shspend(spendscript,0,rmd160); //printf("P2SH path.%s\n",vinaddr!=0?vinaddr:0); } else spendlen = bitcoin_standardspend(spendscript,0,rmd160); @@ -810,9 +810,9 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch if ( destaddr == 0 ) { destaddr = _destaddr; - bitcoin_address(destaddr,pubtype,pubkey33,33); + bitcoin_address(destaddr,taddr,pubtype,pubkey33,33); } - bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); + bitcoin_addr2rmd160(taddr,&addrtype,rmd160,destaddr); if ( addrtype == p2shtype ) spendlen = bitcoin_p2shspend(spendscript,0,rmd160); else spendlen = bitcoin_standardspend(spendscript,0,rmd160); @@ -826,7 +826,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch if ( change != 0 ) { int32_t changelen; uint8_t changescript[1024],changetype,changermd160[20]; - bitcoin_addr2rmd160(&changetype,changermd160,changeaddr); + bitcoin_addr2rmd160(taddr,&changetype,changermd160,changeaddr); changelen = bitcoin_standardspend(changescript,0,changermd160); txobj = bitcoin_txoutput(txobj,changescript,changelen,change); } @@ -836,7 +836,7 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch completed = 0; memset(signedtxidp,0,sizeof(*signedtxidp)); //printf("locktime.%u sequenceid.%x rawtx.(%s) vins.(%s)\n",locktime,sequenceid,rawtxbytes,jprint(vins,0)); - if ( (completed= iguana_signrawtransaction(ctx,symbol,pubtype,p2shtype,isPoS,1000000,&msgtx,&signedtx,signedtxidp,V,1,rawtxbytes,vins,privkeys)) < 0 ) + if ( (completed= iguana_signrawtransaction(ctx,symbol,taddr,pubtype,p2shtype,isPoS,1000000,&msgtx,&signedtx,signedtxidp,V,1,rawtxbytes,vins,privkeys)) < 0 ) //if ( (signedtx= LP_signrawtx(symbol,signedtxidp,&completed,vins,rawtxbytes,privkeys,V)) == 0 ) printf("couldnt sign transaction.%s %s\n",name,bits256_str(str,*signedtxidp)); else if ( completed == 0 ) @@ -862,12 +862,12 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub if ( changermd160 != 0 ) { changeaddr = _changeaddr; - bitcoin_address(changeaddr,coin->pubtype,changermd160,20); + bitcoin_address(changeaddr,coin->taddr,coin->pubtype,changermd160,20); //printf("changeaddr.(%s) vs destaddr.(%s)\n",changeaddr,rawtx->I.destaddr); } for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,str,coin->symbol,coin->pubtype,coin->p2shtype,coin->isPoS,coin->wiftype,ctx,privkey,0,0,0,0,0,rawtx->utxotxid,rawtx->utxovout,rawtx->I.destaddr,pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,str,coin->symbol,coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->wiftype,ctx,privkey,0,0,0,0,0,rawtx->utxotxid,rawtx->utxovout,rawtx->I.destaddr,pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys)) != 0 ) { rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) ) @@ -891,7 +891,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub return(retval); } -int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr,uint8_t *changermd160,char *vinaddr) +int32_t basilisk_rawtx_sign(char *symbol,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr,uint8_t *changermd160,char *vinaddr) { char *signedtx,*changeaddr = 0,_changeaddr[64]; int64_t txfee,newtxfee=0,destamount; uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; int32_t iter,retval = -1; double estimatedrate; //char str2[65]; printf("%s rawtxsign.(%s/v%d)\n",dest->name,bits256_str(str2,dest->utxotxid),dest->utxovout); @@ -904,12 +904,12 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ if ( changermd160 != 0 ) { changeaddr = _changeaddr; - bitcoin_address(changeaddr,pubtype,changermd160,20); + bitcoin_address(changeaddr,taddr,pubtype,changermd160,20); //printf("changeaddr.(%s)\n",changeaddr); } for (iter=0; iter<2; iter++) { - if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,dest->utxotxid,dest->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) + if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,taddr,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,dest->utxotxid,dest->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; if ( dest->I.datalen <= sizeof(dest->txbytes) ) @@ -929,7 +929,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t pubtype,uint8_t p2shtype,uint8_ //return(_basilisk_rawtx_sign(symbol,pubtype,p2shtype,isPoS,wiftype,swap,timestamp,locktime,sequenceid,dest,rawtx,privkey,privkey2,userdata,userdatalen,ignore_cltverr)); } -int32_t basilisk_alicescript(uint8_t *redeemscript,int32_t *redeemlenp,uint8_t *script,int32_t n,char *msigaddr,uint8_t altps2h,bits256 pubAm,bits256 pubBn) +int32_t basilisk_alicescript(uint8_t *redeemscript,int32_t *redeemlenp,uint8_t *script,int32_t n,char *msigaddr,uint8_t taddr,uint8_t altps2h,bits256 pubAm,bits256 pubBn) { uint8_t p2sh160[20]; struct vin_info V; memset(&V,0,sizeof(V)); @@ -937,7 +937,7 @@ int32_t basilisk_alicescript(uint8_t *redeemscript,int32_t *redeemlenp,uint8_t * memcpy(&V.signers[1].pubkey[1],pubBn.bytes,sizeof(pubBn)), V.signers[1].pubkey[0] = 0x03; V.M = V.N = 2; *redeemlenp = bitcoin_MofNspendscript(p2sh160,redeemscript,n,&V); - bitcoin_address(msigaddr,altps2h,p2sh160,sizeof(p2sh160)); + bitcoin_address(msigaddr,taddr,altps2h,p2sh160,sizeof(p2sh160)); n = bitcoin_p2shspend(script,0,p2sh160); //for (i=0; i<*redeemlenp; i++) // printf("%02x",redeemscript[i]); @@ -945,7 +945,7 @@ int32_t basilisk_alicescript(uint8_t *redeemscript,int32_t *redeemlenp,uint8_t * return(n); } -char *basilisk_swap_Aspend(char *name,char *symbol,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,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 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 ) @@ -955,7 +955,7 @@ char *basilisk_swap_Aspend(char *name,char *symbol,uint8_t pubtype,uint8_t p2sht //char str[65]; //printf("pubAm.(%s)\n",bits256_str(str,pubAm)); //printf("pubBn.(%s)\n",bits256_str(str,pubBn)); - spendlen = basilisk_alicescript(redeemscript,&redeemlen,spendscript,0,msigaddr,p2shtype,pubAm,pubBn); + spendlen = basilisk_alicescript(redeemscript,&redeemlen,spendscript,0,msigaddr,taddr,p2shtype,pubAm,pubBn); //char str[65]; printf("%s utxo.(%s) redeemlen.%d spendlen.%d\n",msigaddr,bits256_str(str,utxotxid),redeemlen,spendlen); /*rev = privAm; for (i=0; i<32; i++) @@ -964,7 +964,7 @@ char *basilisk_swap_Aspend(char *name,char *symbol,uint8_t pubtype,uint8_t p2sht for (i=0; i<32; i++) privBn.bytes[i] = rev.bytes[31 - i];*/ txfee = LP_txfee(symbol); - signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,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,taddr,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,vout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1); } return(signedtx); } @@ -1322,7 +1322,7 @@ int32_t basilisk_bobpayment_reclaim(struct basilisk_swap *swap,int32_t delay) len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); memcpy(swap->I.userdata_bobreclaim,userdata,len); swap->I.userdata_bobreclaimlen = len; - if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1,swap->changermd160,swap->bobpayment.I.destaddr)) == 0 ) + if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1,swap->changermd160,swap->bobpayment.I.destaddr)) == 0 ) { //for (i=0; ibobreclaim.I.datalen; i++) // printf("%02x",swap->bobreclaim.txbytes[i]); @@ -1339,7 +1339,7 @@ int32_t basilisk_bobdeposit_refund(struct basilisk_swap *swap,int32_t delay) len = basilisk_swapuserdata(userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); memcpy(swap->I.userdata_bobrefund,userdata,len); swap->I.userdata_bobrefundlen = len; - if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) + if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); @@ -1353,13 +1353,13 @@ int32_t basilisk_bobdeposit_refund(struct basilisk_swap *swap,int32_t delay) int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) { int32_t j; char coinaddr[64]; - bitcoin_address(coinaddr,swap->bobcoin.pubtype,swap->changermd160,20); + bitcoin_address(coinaddr,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->changermd160,20); if ( genflag != 0 && swap->I.iambob == 0 ) printf("basilisk_bobscripts_set WARNING: alice generating BOB tx\n"); if ( depositflag == 0 ) { swap->bobpayment.I.spendlen = basilisk_bobscript(swap->bobpayment.I.rmd160,swap->bobpayment.redeemscript,&swap->bobpayment.I.redeemlen,swap->bobpayment.spendscript,0,&swap->bobpayment.I.locktime,&swap->bobpayment.I.secretstart,&swap->I,0); - bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.taddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); //int32_t i; for (i=0; ibobpayment.I.redeemlen; i++) @@ -1391,7 +1391,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i else { swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); - bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.taddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); //int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) @@ -1424,7 +1424,7 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i void LP_swap_coinaddr(struct basilisk_swap *swap,struct iguana_info *coin,char *coinaddr,uint8_t *data,int32_t datalen) { cJSON *txobj,*vouts,*vout,*addresses,*item,*skey; uint8_t extraspace[8192]; bits256 signedtxid; struct iguana_msgtx msgtx; char *addr; int32_t n,m,suppress_pubkeys = 0; - if ( (txobj= bitcoin_data2json(coin->pubtype,coin->p2shtype,coin->isPoS,coin->longestchain,&signedtxid,&msgtx,extraspace,sizeof(extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) + if ( (txobj= bitcoin_data2json(coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->longestchain,&signedtxid,&msgtx,extraspace,sizeof(extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) { //char str[65]; printf("got txid.%s (%s)\n",bits256_str(str,signedtxid),jprint(txobj,0)); if ( (vouts= jarray(&n,txobj,"vout")) != 0 && n > 0 ) @@ -1480,14 +1480,14 @@ int32_t basilisk_alicepayment_spend(struct basilisk_swap *swap,struct basilisk_r void basilisk_alicepayment(struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) { char coinaddr[64]; - alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->p2shtype,pubAm,pubBn); + alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->taddr,coin->p2shtype,pubAm,pubBn); /*for (i=0; i<33; i++) printf("%02x",swap->persistent_pubkey33[i]); printf(" pubkey33, "); for (i=0; i<20; i++) printf("%02x",swap->changermd160[i]); printf(" rmd160, ");*/ - bitcoin_address(coinaddr,coin->pubtype,swap->changermd160,20); + bitcoin_address(coinaddr,coin->taddr,coin->pubtype,swap->changermd160,20); //printf("%s suppress.%d fee.%d\n",coinaddr,alicepayment->I.suppress_pubkeys,swap->myfee.I.suppress_pubkeys); basilisk_rawtx_gen(swap->ctx,"alicepayment",swap->I.started,swap->persistent_pubkey33,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr); } @@ -1501,7 +1501,7 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); else { - bitcoin_address(swap->alicepayment.I.destaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); + bitcoin_address(swap->alicepayment.I.destaddr,swap->alicecoin.taddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); //LP_importaddress(swap->alicecoin.symbol,swap->alicepayment.I.destaddr); strcpy(swap->alicepayment.p2shaddr,swap->alicepayment.I.destaddr); retval = 0; @@ -1515,7 +1515,7 @@ int32_t basilisk_alicetxs(int32_t pairsock,struct basilisk_swap *swap,uint8_t *d if ( swap->myfee.I.datalen == 0 ) { printf("generate fee\n"); - bitcoin_address(coinaddr,swap->alicecoin.pubtype,swap->changermd160,20); + bitcoin_address(coinaddr,swap->alicecoin.taddr,swap->alicecoin.pubtype,swap->changermd160,20); if ( basilisk_rawtx_gen(swap->ctx,"myfee",swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr) == 0 ) { printf("rawtxsend\n"); @@ -1567,7 +1567,7 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); memcpy(swap->I.userdata_aliceclaim,userdata,len); swap->I.userdata_aliceclaimlen = len; - bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.taddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); /*for (i=0; ibobdeposit.I.datalen; i++) @@ -1579,9 +1579,9 @@ int32_t LP_verify_bobdeposit(struct basilisk_swap *swap,uint8_t *data,int32_t da memcpy(swap->aliceclaim.redeemscript,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); swap->aliceclaim.I.redeemlen = swap->bobdeposit.I.redeemlen; memcpy(swap->aliceclaim.I.pubkey33,swap->persistent_pubkey33,33); - bitcoin_address(swap->aliceclaim.I.destaddr,swap->alicecoin.pubtype,swap->persistent_pubkey33,33); + bitcoin_address(swap->aliceclaim.I.destaddr,swap->alicecoin.taddr,swap->alicecoin.pubtype,swap->persistent_pubkey33,33); retval = 0; - if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) + if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->bobdeposit.I.destaddr)) == 0 ) { /*for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -1603,7 +1603,7 @@ int32_t LP_verify_alicepayment(struct basilisk_swap *swap,uint8_t *data,int32_t { swap->bobspend.utxovout = 0; swap->bobspend.utxotxid = swap->alicepayment.I.signedtxid = LP_broadcast_tx(swap->alicepayment.name,swap->alicecoin.symbol,swap->alicepayment.txbytes,swap->alicepayment.I.datalen); - bitcoin_address(swap->alicepayment.p2shaddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); + bitcoin_address(swap->alicepayment.p2shaddr,swap->alicecoin.taddr,swap->alicecoin.p2shtype,swap->alicepayment.redeemscript,swap->alicepayment.I.redeemlen); strcpy(swap->alicepayment.I.destaddr,swap->alicepayment.p2shaddr); if ( bits256_nonz(swap->alicepayment.I.signedtxid) != 0 ) swap->aliceunconf = 1; @@ -1631,7 +1631,7 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + bitcoin_address(swap->bobpayment.p2shaddr,swap->bobcoin.taddr,swap->bobcoin.p2shtype,swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); strcpy(swap->bobpayment.I.destaddr,swap->bobpayment.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobpayment.I.destaddr); /*for (i=0; ibobpayment.I.datalen; i++) @@ -1644,9 +1644,9 @@ int32_t LP_verify_bobpayment(struct basilisk_swap *swap,uint8_t *data,int32_t da swap->I.userdata_alicespendlen = len; retval = 0; memcpy(swap->alicespend.I.pubkey33,swap->persistent_pubkey33,33); - bitcoin_address(swap->alicespend.I.destaddr,swap->bobcoin.pubtype,swap->persistent_pubkey33,33); + bitcoin_address(swap->alicespend.I.destaddr,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->persistent_pubkey33,33); //char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); - if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->alicepayment.I.destaddr)) == 0 ) + if ( (retval= basilisk_rawtx_sign(swap->bobcoin.symbol,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->bobcoin.p2shtype,swap->bobcoin.isPoS,swap->bobcoin.wiftype,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1,swap->changermd160,swap->alicepayment.I.destaddr)) == 0 ) { /*for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e84276fb0..80f6de979 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -738,7 +738,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co { coin->counter++; bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); - bitcoin_addr2rmd160(&tmptype,rmd160,coin->smartaddr); + bitcoin_addr2rmd160(coin->taddr,&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 0f89a0f95..2cb11e60c 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -5,6 +5,7 @@ git pull; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"active\":1,\"coin\":\"HUSH\",\"name\":\"hushcoin\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, diff --git a/iguana/exchanges/run b/iguana/exchanges/run index ff014cfd2..858fe930d 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -1,6 +1,7 @@ source randval pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, +{\"coin\":\"HUSH\",\"name\":\"hushcoin\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, From 470f22f01529a49bfda8bb5e31a608b11e408c28 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 23:25:49 +0300 Subject: [PATCH 817/910] test --- iguana/exchanges/LP_bitcoin.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 9f07c094b..a766566b6 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2069,9 +2069,11 @@ char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pub calc_rmd160_sha256(data+offset,pubkey_or_rmd160,len); else memcpy(data+offset,pubkey_or_rmd160,20); //btc_convrmd160(checkaddr,addrtype,data+1); - data[0] = addrtype; if ( taddr != 0 ) - data[1] = taddr; + { + data[0] = taddr; + data[1] = addrtype; + } else data[0] = addrtype; hash = bits256_doublesha256(0,data,20+offset); for (i=0; i<4; i++) data[20+offset+i] = hash.bytes[31-i]; @@ -2103,9 +2105,11 @@ int32_t base58encode_checkbuf(uint8_t taddr,uint8_t addrtype,uint8_t *data,int32 { uint8_t i,offset; bits256 hash; offset = 1 + (taddr != 0); - data[0] = addrtype; if ( taddr != 0 ) - data[1] = taddr; + { + data[0] = taddr; + data[1] = addrtype; + } else data[0] = addrtype; //for (i=0; i "); From 32b780f3e4ad9303b82cf3a3063482abcc421768 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 23:28:25 +0300 Subject: [PATCH 818/910] Test --- iguana/exchanges/LP_bitcoin.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index a766566b6..e1e0c5b2a 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2079,10 +2079,10 @@ char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pub data[20+offset+i] = hash.bytes[31-i]; if ( (coinaddr= bitcoin_base58encode(coinaddr,data,24+offset)) != 0 ) { - //uint8_t checktype,rmd160[20]; - //bitcoin_addr2rmd160(&checktype,rmd160,coinaddr); - //if ( strcmp(checkaddr,coinaddr) != 0 ) - // printf("checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20)); + uint8_t checktype,rmd160[20]; char checkaddr[65]; + bitcoin_addr2rmd160(taddr,&checktype,rmd160,coinaddr); + if ( strcmp(checkaddr,coinaddr) != 0 ) + printf("taddr.%02x checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",taddr,checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20)); } return(coinaddr); } From a25708698f881ce4b75553a8e9d5de15a38ad964 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 23:31:16 +0300 Subject: [PATCH 819/910] Test --- iguana/exchanges/LP_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index e1e0c5b2a..9c2492c7e 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2083,7 +2083,7 @@ char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pub bitcoin_addr2rmd160(taddr,&checktype,rmd160,coinaddr); if ( strcmp(checkaddr,coinaddr) != 0 ) printf("taddr.%02x checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",taddr,checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20)); - } + } else printf("null coinaddr taddr.%02x\n",taddr); return(coinaddr); } From 47ec0d31a9e228fcb037b98ff998df73e0db9b25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Jun 2017 23:55:47 +0300 Subject: [PATCH 820/910] Test --- iguana/exchanges/LP_bitcoin.c | 29 +++++++++++++++++++- iguana/exchanges/LP_commands.c | 12 ++++----- iguana/exchanges/LP_forwarding.c | 8 +++--- iguana/exchanges/LP_include.h | 6 ++--- iguana/exchanges/LP_nativeDEX.c | 46 ++++++++++++++++---------------- iguana/exchanges/LP_network.c | 8 +++--- iguana/exchanges/LP_ordermatch.c | 30 ++++++++++----------- iguana/exchanges/LP_utxos.c | 8 +++--- iguana/exchanges/mm.c | 24 +---------------- iguana/exchanges/stats.c | 9 +++++-- 10 files changed, 95 insertions(+), 85 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 9c2492c7e..3185da0f0 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2055,7 +2055,7 @@ int32_t bitcoin_addr2rmd160(uint8_t taddr,uint8_t *addrtypep,uint8_t rmd160[20], } for (i=0; i 0 ) + if ( LP_forward(ctx,myipaddr,pubsock,profitmargin,jbits256(argjson,"pubkey"),jprint(reqjson,1),1) > 0 ) retstr = clonestr("{\"result\":\"success\"}"); else retstr = clonestr("{\"error\":\"error forwarding\"}"); } else retstr = clonestr("{\"error\":\"cant recurse forwards\"}"); @@ -237,7 +237,7 @@ forwardhex(pubkey,hex)\n\ else if ( strcmp(method,"lookup") == 0 ) return(LP_lookup(jbits256(argjson,"client"))); else if ( strcmp(method,"forwardhex") == 0 ) - retstr = LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); + retstr = LP_forwardhex(ctx,pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex")); else if ( strcmp(method,"psock") == 0 ) { if ( myipaddr == 0 || myipaddr[0] == 0 || strcmp(myipaddr,"127.0.0.1") == 0 ) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 505ae8a33..cb368afe2 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -190,7 +190,7 @@ cJSON *LP_dereference(cJSON *argjson,char *excludemethod) return(reqjson); } -char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) +char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) { struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson=0,*argjson=0,*reqjson=0; if ( hexstr == 0 || hexstr[0] == 0 ) @@ -204,7 +204,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) { if ( reqjson != 0 ) { - retstr = LP_command_process(LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); + retstr = LP_command_process(ctx,LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); //printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) LP_send(pubsock,jprint(reqjson,0),0); @@ -248,7 +248,7 @@ char *LP_forwardhex(int32_t pubsock,bits256 pubkey,char *hexstr) return(retstr); } -int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag) +int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag) { struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson,*argjson; if ( jsonstr == 0 || jsonstr[0] == 0 ) @@ -260,7 +260,7 @@ int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pu printf("GOT FORWARDED.(%s)\n",myipaddr); if ( (argjson= cJSON_Parse(jsonstr)) != 0 ) { - if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) + if ( (retstr= LP_command_process(ctx,myipaddr,pubsock,argjson,0,0,profitmargin)) != 0 ) free(retstr); free_json(argjson); } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 79127306d..b00ef444f 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -228,14 +228,14 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 //double LP_query(char *method,struct LP_quoteinfo *qp,char *base,char *rel,bits256 mypub); int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys); void LP_quotesinit(char *base,char *rel); -int32_t LP_forward(char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag); +int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag); int32_t LP_ismine(struct LP_utxoinfo *utxo); int32_t LP_isavailable(struct LP_utxoinfo *utxo); struct LP_peerinfo *LP_peerfind(uint32_t ipbits,uint16_t port); -char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); +char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin); 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,bits256 pubkey); -int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin); +int32_t LP_pullsock_check(void *ctx,char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin); uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 9dde8e1cd..a1dadda84 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -76,14 +76,14 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_forwarding.c" #include "LP_commands.c" -char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) +char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { char *retstr=0; if ( jobj(argjson,"result") != 0 || jobj(argjson,"error") != 0 ) return(0); - if ( LP_tradecommand(myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) + if ( LP_tradecommand(ctx,myipaddr,pubsock,argjson,data,datalen,profitmargin) <= 0 ) { - if ( (retstr= stats_JSON(myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) + if ( (retstr= stats_JSON(ctx,myipaddr,pubsock,profitmargin,argjson,"127.0.0.1",0)) != 0 ) { //printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) //strncmp("{\"error\":",retstr,strlen("{\"error\":")) != 0 && @@ -93,7 +93,7 @@ char *LP_command_process(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t * return(retstr); } -char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) +char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) { int32_t len,datalen=0; char *retstr=0,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) @@ -112,7 +112,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro if ( jstr(argjson,"method") != 0 && strcmp(jstr(argjson,"method"),"forwardhex") == 0 ) { //printf("got forwardhex\n"); - if ( (retstr= LP_forwardhex(pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) + if ( (retstr= LP_forwardhex(ctx,pubsock,jbits256(argjson,"pubkey"),jstr(argjson,"hex"))) != 0 ) { } } @@ -125,7 +125,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) LP_send(pubsock,jprint(reqjson,1),1); } - else if ( (retstr= LP_command_process(myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len,profitmargin)) != 0 ) + else if ( (retstr= LP_command_process(ctx,myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len,profitmargin)) != 0 ) { } portable_mutex_unlock(&LP_commandmutex); @@ -154,7 +154,7 @@ char *LP_process_message(char *typestr,char *myipaddr,int32_t pubsock,double pro return(retstr); } -int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) +int32_t LP_pullsock_check(void *ctx,char **retstrp,char *myipaddr,int32_t pubsock,int32_t pullsock,double profitmargin) { void *ptr; int32_t recvlen=-1,nonz = 0; *retstrp = 0; @@ -163,13 +163,13 @@ int32_t LP_pullsock_check(char **retstrp,char *myipaddr,int32_t pubsock,int32_t while ( (recvlen= nn_recv(pullsock,&ptr,NN_MSG,0)) > 0 ) { nonz++; - *retstrp = LP_process_message("PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); + *retstrp = LP_process_message(ctx,"PULL",myipaddr,pubsock,profitmargin,ptr,recvlen,pullsock); } } return(nonz); } -int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) +int32_t LP_subsock_check(void *ctx,char *myipaddr,int32_t pubsock,int32_t sock,double profitmargin) { int32_t recvlen,nonz = 0; void *ptr; char *retstr; if ( sock >= 0 ) @@ -177,7 +177,7 @@ int32_t LP_subsock_check(char *myipaddr,int32_t pubsock,int32_t sock,double prof while ( (recvlen= nn_recv(sock,&ptr,NN_MSG,0)) > 0 ) { nonz++; - if ( (retstr= LP_process_message("SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) + if ( (retstr= LP_process_message(ctx,"SUB",myipaddr,pubsock,profitmargin,ptr,recvlen,sock)) != 0 ) free(retstr); } } @@ -205,10 +205,10 @@ void LP_utxo_spentcheck(int32_t pubsock,struct LP_utxoinfo *utxo,double profitma } } -void LP_myutxo_updates(int32_t pubsock,char *passphrase,double profitmargin) +void LP_myutxo_updates(void *ctx,int32_t pubsock,char *passphrase,double profitmargin) { //LP_utxopurge(0); not good to disrupt existing pointers - LP_privkey_updates(pubsock,passphrase,0); + LP_privkey_updates(ctx,pubsock,passphrase,0); } int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pubsock,struct LP_peerinfo *peer,uint32_t now,double profitmargin,int32_t interval) @@ -229,7 +229,7 @@ int32_t LP_peer_utxosquery(struct LP_peerinfo *mypeer,uint16_t myport,int32_t pu return(n); } -int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) +int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubsock,char *pushaddr,uint16_t pushport,int32_t pullsock,uint16_t myport,char *passphrase,double profitmargin) { static uint32_t counter,lastforward,numpeers; struct LP_utxoinfo *utxo,*utmp; char *retstr,*origipaddr; struct LP_peerinfo *peer,*tmp; uint32_t now; int32_t nonz = 0,n=0,lastn=-1; @@ -265,12 +265,12 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso LP_peer_pricesquery(peer->ipaddr,peer->port); peer->diduquery = now; } - nonz += LP_subsock_check(origipaddr,pubsock,peer->subsock,profitmargin); + nonz += LP_subsock_check(ctx,origipaddr,pubsock,peer->subsock,profitmargin); } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d forwarding\n",counter,LP_canbind); if ( (counter % 600) == 60 ) { - LP_myutxo_updates(pubsock,passphrase,profitmargin); + LP_myutxo_updates(ctx,pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { LP_forwarding_register(LP_mypubkey,pushaddr,pushport,10); @@ -301,7 +301,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso } } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d pullsock check\n",counter,LP_canbind); - nonz += LP_pullsock_check(&retstr,myipaddr,pubsock,pullsock,profitmargin); + nonz += LP_pullsock_check(ctx,&retstr,myipaddr,pubsock,pullsock,profitmargin); if ( retstr != 0 ) free(retstr); //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d hellos\n",counter,LP_canbind); @@ -320,7 +320,7 @@ int32_t LP_mainloop_iter(char *myipaddr,struct LP_peerinfo *mypeer,int32_t pubso return(nonz); } -void LP_initcoins(int32_t pubsock,cJSON *coins,char *passphrase) +void LP_initcoins(void *ctx,int32_t pubsock,cJSON *coins,char *passphrase) { int32_t i,n; cJSON *item; for (i=0; i= 0 ) nn_close(pullsock); - pullsock = LP_initpublicaddr(&mypullport,pushaddr,myipaddr,mypullport,0); + pullsock = LP_initpublicaddr(ctx,&mypullport,pushaddr,myipaddr,mypullport,0); LP_deadman_switch = (uint32_t)time(NULL); LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 29a4313f1..1d669009a 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -359,7 +359,7 @@ char *LP_psock(char *myipaddr,int32_t ispaired) */ -int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) +int32_t nn_tests(void *ctx,int32_t pullsock,char *pushaddr,int32_t nnother) { int32_t sock,n,m,timeout,retval = -1; char msg[512],*retstr; printf("nn_tests.(%s)\n",pushaddr); @@ -375,7 +375,7 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); n = LP_send(sock,msg,0); sleep(3); - LP_pullsock_check(&retstr,"127.0.0.1",-1,pullsock,0.); + LP_pullsock_check(ctx,&retstr,"127.0.0.1",-1,pullsock,0.); sprintf(msg,"{\"method\":\"nn_tests2\",\"ipaddr\":\"%s\"}",pushaddr); m = LP_send(pullsock,msg,0); printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> pullsock.%d retstr.(%s)\n",n,m,pullsock,retstr!=0?retstr:""); @@ -390,7 +390,7 @@ int32_t nn_tests(int32_t pullsock,char *pushaddr,int32_t nnother) return(retval); } -int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr,uint16_t mypullport,int32_t ispaired) +int32_t LP_initpublicaddr(void *ctx,uint16_t *mypullportp,char *publicaddr,char *myipaddr,uint16_t mypullport,int32_t ispaired) { int32_t nntype,pullsock,timeout,maxsize; char bindaddr[128],connectaddr[128]; *mypullportp = mypullport; @@ -444,7 +444,7 @@ int32_t LP_initpublicaddr(uint16_t *mypullportp,char *publicaddr,char *myipaddr, nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); //LP_send(pullsock,"hello init",0); } - if ( LP_canbind == 0 && ispaired == 0 && nn_tests(pullsock,publicaddr,NN_PUSH) < 0 ) + if ( LP_canbind == 0 && ispaired == 0 && nn_tests(ctx,pullsock,publicaddr,NN_PUSH) < 0 ) { printf("command socket didnt work\n"); exit(-1); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c67c105bb..8416d8ad9 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -176,7 +176,7 @@ char *LP_quotereceived(cJSON *argjson) } else return(clonestr("{\"error\":\"nullptr\"}")); } -char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *base,char *rel,double price) +char *LP_pricepings(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,char *base,char *rel,double price) { bits256 zero; cJSON *reqjson = cJSON_CreateObject(); jaddbits256(reqjson,"pubkey",LP_mypubkey); @@ -194,7 +194,7 @@ char *LP_pricepings(char *myipaddr,int32_t pubsock,double profitmargin,char *bas jaddstr(reqjson,"method","forward"); jaddstr(reqjson,"method2","postprice"); memset(zero.bytes,0,sizeof(zero)); - LP_forward(myipaddr,pubsock,profitmargin,zero,jprint(reqjson,1),1); + LP_forward(ctx,myipaddr,pubsock,profitmargin,zero,jprint(reqjson,1),1); } return(clonestr("{\"result\":\"success\"}")); } @@ -294,7 +294,7 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) return(-1); } -double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *method,struct LP_quoteinfo *qp) +double LP_query(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,char *method,struct LP_quoteinfo *qp) { cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; if ( strcmp(method,"request") == 0 ) @@ -321,7 +321,7 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho jaddstr(reqjson,"method2",method); jaddstr(reqjson,"method","forward"); jaddbits256(reqjson,"pubkey",qp->srchash); - LP_forward(myipaddr,mypubsock,profitmargin,qp->srchash,jprint(reqjson,1),1); + LP_forward(ctx,myipaddr,mypubsock,profitmargin,qp->srchash,jprint(reqjson,1),1); } for (i=0; i<30; i++) { @@ -338,7 +338,7 @@ double LP_query(char *myipaddr,int32_t mypubsock,double profitmargin,char *metho return(price); } -int32_t LP_nanobind(char *pairstr,char *myipaddr) +int32_t LP_nanobind(void *ctx,char *pairstr,char *myipaddr) { int32_t i,timeout,r,pairsock = -1; uint16_t mypullport; char bindaddr[128]; if ( LP_canbind != 0 ) @@ -372,11 +372,11 @@ int32_t LP_nanobind(char *pairstr,char *myipaddr) } else printf("error binding to %s for %s\n",bindaddr,pairstr); } } - } else pairsock = LP_initpublicaddr(&mypullport,pairstr,myipaddr,0,0); + } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,myipaddr,0,0); return(pairsock); } -int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) +int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; printf("LP_connectstartbob.(%s) with.(%s)\n",myipaddr,jprint(argjson,0)); @@ -389,7 +389,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs privkey = LP_privkey(utxo->coinaddr,coin->taddr); if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) { - if ( (pair= LP_nanobind(pairstr,myipaddr)) >= 0 ) + if ( (pair= LP_nanobind(ctx,pairstr,myipaddr)) >= 0 ) { LP_requestinit(&qp->R,qp->srchash,qp->desthash,base,qp->satoshis,rel,qp->destsatoshis,qp->timestamp,qp->quotetime,DEXselector); swap = LP_swapinit(1,0,privkey,&qp->R,qp); @@ -409,7 +409,7 @@ int32_t LP_connectstartbob(int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjs jdelete(retjson,"method"); jaddstr(retjson,"method2","connected"); jaddstr(retjson,"method","forward"); - LP_forward(myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); + LP_forward(ctx,myipaddr,pubsock,profitmargin,utxo->S.otherpubkey,jprint(retjson,1),1); retval = 0; } else printf("error launching swaploop\n"); } else printf("couldnt bind to any port %s\n",pairstr); @@ -496,7 +496,7 @@ char *LP_connectedalice(cJSON *argjson) // alice } } -int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) +int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { char *method; cJSON *retjson; double qprice,price,bid,ask; struct LP_utxoinfo *autxo,*butxo; int32_t retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) @@ -541,7 +541,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d jdelete(retjson,"method"); jaddstr(retjson,"method2","reserved"); jaddstr(retjson,"method","forward"); - LP_forward(myipaddr,pubsock,profitmargin,butxo->S.otherpubkey,jprint(retjson,1),1); + LP_forward(ctx,myipaddr,pubsock,profitmargin,butxo->S.otherpubkey,jprint(retjson,1),1); butxo->T.lasttime = (uint32_t)time(NULL); printf("set swappending.%u accept qprice %.8f, min %.8f\n",butxo->T.swappending,qprice,price); } else printf("warning swappending.%u swap.%p\n",butxo->T.swappending,butxo->S.swap); @@ -550,7 +550,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d { retval = 4; if ( butxo->T.swappending != 0 && butxo->S.swap == 0 ) - LP_connectstartbob(pubsock,butxo,argjson,myipaddr,Q.srccoin,Q.destcoin,profitmargin,qprice,&Q); + LP_connectstartbob(ctx,pubsock,butxo,argjson,myipaddr,Q.srccoin,Q.destcoin,profitmargin,qprice,&Q); else printf("pend.%u swap %p when connect came in (%s)\n",butxo->T.swappending,butxo->S.swap,jprint(argjson,0)); } } @@ -558,7 +558,7 @@ int32_t LP_tradecommand(char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *d return(retval); } -char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) +char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) @@ -636,13 +636,13 @@ char *LP_autotrade(char *myipaddr,int32_t mypubsock,double profitmargin,char *ba return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); if ( LP_quotedestinfo(&Q,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); - price = LP_query(myipaddr,mypubsock,profitmargin,"request",&Q); + price = LP_query(ctx,myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); if ( price > SMALLVAL ) { if ( price <= maxprice ) { - price = LP_query(myipaddr,mypubsock,profitmargin,"connect",&Q); + price = LP_query(ctx,myipaddr,mypubsock,profitmargin,"connect",&Q); LP_requestinit(&Q.R,Q.srchash,Q.desthash,base,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); expiration = (uint32_t)time(NULL) + timeout; while ( time(NULL) < expiration ) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 80f6de979..66f239e59 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -722,7 +722,7 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr return(total); } -bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) +bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *coin,char *passphrase,char *wifstr) { static uint32_t counter; bits256 privkey,userpub,userpass; char tmpstr[128]; cJSON *retjson; uint8_t tmptype,rmd160[20]; @@ -733,7 +733,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co privkey = iguana_wif2privkey(wifstr); //printf("WIF.(%s) -> %s\n",wifstr,bits256_str(str,privkey)); } - iguana_priv2pub(pubkey33,coin->smartaddr,privkey,coin->pubtype); + iguana_priv2pub(ctx,pubkey33,coin->smartaddr,privkey,coin->taddr,coin->pubtype); if ( coin->counter == 0 ) { coin->counter++; @@ -757,7 +757,7 @@ bits256 LP_privkeycalc(uint8_t *pubkey33,bits256 *pubkeyp,struct iguana_info *co return(privkey); } -void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t initonly) +void LP_privkey_updates(void *ctx,int32_t pubsock,char *passphrase,int32_t initonly) { int32_t i; struct iguana_info *coin; bits256 pubkey,privkey; uint8_t pubkey33[33]; memset(privkey.bytes,0,sizeof(privkey)); @@ -768,7 +768,7 @@ void LP_privkey_updates(int32_t pubsock,char *passphrase,int32_t initonly) if ( (coin= LP_coinfind(LP_coins[i].symbol)) != 0 ) { if ( bits256_nonz(privkey) == 0 || coin->smartaddr[0] == 0 ) - privkey = LP_privkeycalc(pubkey33,&pubkey,coin,passphrase,""); + privkey = LP_privkeycalc(ctx,pubkey33,&pubkey,coin,passphrase,""); if ( coin->inactive == 0 && initonly == 0 ) LP_privkey_init(pubsock,coin,privkey,pubkey,pubkey33); } diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index a80982185..1babc9d76 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -24,7 +24,7 @@ #include #include "OS_portable.h" #define MAX(a,b) ((a) > (b) ? (a) : (b)) -char *stats_JSON(char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port); +char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port); #include "stats.c" void LP_priceupdate(char *base,char *rel,double price,double avebid,double aveask,double highbid,double lowask,double PAXPRICES[32]); @@ -220,28 +220,6 @@ bits256 iguana_wif2privkey(char *wifstr) return(privkey); } -void iguana_priv2pub(uint8_t *pubkey33,char *coinaddr,bits256 privkey,uint8_t addrtype) -{ - char privstr[65],url[512],postdata[1024],*retstr,*pubstr,*addr; cJSON *retjson; - memset(pubkey33,0,33); - coinaddr[0] = 0; - bits256_str(privstr,privkey); - sprintf(url,"%s/?",IGUANA_URL); - sprintf(postdata,"{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"%s\",\"addrtype\":%u}",privstr,addrtype); - if ( (retstr= bitcoind_RPC(0,"SuperNET",url,0,"priv2pub",postdata,0)) != 0 ) - { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - if ( (pubstr= jstr(retjson,"secp256k1")) != 0 && strlen(pubstr) == 66 ) - decode_hex(pubkey33,33,pubstr); - if ( (addr= jstr(retjson,"result")) != 0 && strlen(addr) < 64 ) - strcpy(coinaddr,addr); - free_json(retjson); - } - free(retstr); - } -} - double bittrex_balance(char *base,char *coinaddr) { char *retstr; cJSON *retjson; double balance = 0.; diff --git a/iguana/exchanges/stats.c b/iguana/exchanges/stats.c index b0b4b11d8..64e4f985e 100644 --- a/iguana/exchanges/stats.c +++ b/iguana/exchanges/stats.c @@ -302,10 +302,15 @@ cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) return(json); } +extern void *bitcoin_ctx(); + char *stats_rpcparse(char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr,char *filetype,uint16_t port) { + static void *ctx; cJSON *tokens,*argjson,*origargjson,*tmpjson=0,*json = 0; long filesize; double profitmargin = 0.; char *myipaddr="127.0.0.1",symbol[64],buf[4096],*userpass=0,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,num=0; //printf("rpcparse.(%s)\n",urlstr); + if ( ctx == 0 ) + ctx = bitcoin_ctx(); for (i=0; i Date: Tue, 20 Jun 2017 23:57:01 +0300 Subject: [PATCH 821/910] Test --- iguana/exchanges/LP_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 3185da0f0..3e8667445 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2080,7 +2080,7 @@ char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pub if ( (coinaddr= bitcoin_base58encode(coinaddr,data,24+offset)) != 0 ) { uint8_t checktype,rmd160[20]; char checkaddr[65]; - bitcoin_addr2rmd160(taddr,&checktype,rmd160,coinaddr); + bitcoin_addr2rmd160(taddr,&checktype,rmd160,checkaddr); if ( strcmp(checkaddr,coinaddr) != 0 ) printf("taddr.%02x checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",taddr,checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20)); } else printf("null coinaddr taddr.%02x\n",taddr); From 87190c0b091d4bf43ffd78d8ea7323b396853c19 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 00:00:06 +0300 Subject: [PATCH 822/910] Test --- iguana/exchanges/LP_bitcoin.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 3e8667445..9f3fae745 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2079,10 +2079,6 @@ char *bitcoin_address(char *coinaddr,uint8_t taddr,uint8_t addrtype,uint8_t *pub data[20+offset+i] = hash.bytes[31-i]; if ( (coinaddr= bitcoin_base58encode(coinaddr,data,24+offset)) != 0 ) { - uint8_t checktype,rmd160[20]; char checkaddr[65]; - bitcoin_addr2rmd160(taddr,&checktype,rmd160,checkaddr); - if ( strcmp(checkaddr,coinaddr) != 0 ) - printf("taddr.%02x checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",taddr,checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20)); } else printf("null coinaddr taddr.%02x\n",taddr); return(coinaddr); } From ae155c5577d11102cded747634185a55985f89c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 00:40:56 +0300 Subject: [PATCH 823/910] 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 65ba8bc43..4a8c4ed81 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -245,6 +245,8 @@ struct iguana_info *LP_coinfind(char *symbol) } else if ( strcmp(symbol,"KMD") == 0 ) name = "komodo"; + else if ( strcmp(symbol,"HUSH") == 0 ) + name = "hush"; else { name = symbol; From 304b6cf3c91c2b137167191d0684798b3c3d4d70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 09:32:16 +0300 Subject: [PATCH 824/910] Test --- iguana/exchanges/LP_prices.c | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 598d0d3ad..50a147ecd 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -52,6 +52,8 @@ struct LP_pubkeyinfo struct LP_priceinfo *LP_priceinfofind(char *symbol) { int32_t i; struct LP_priceinfo *pp; uint64_t coinbits; + if ( symbol == 0 || symbol[0] == 0 ) + return(0); if ( LP_numpriceinfos > 0 ) { coinbits = stringbits(symbol); @@ -93,6 +95,8 @@ int32_t LP_cachekey(uint8_t *key,char *base,char *rel,bits256 txid,int32_t vout) struct LP_cacheinfo *LP_cachefind(char *base,char *rel,bits256 txid,int32_t vout) { struct LP_cacheinfo *ptr=0; uint8_t key[sizeof(bits256)+sizeof(uint64_t)*2+sizeof(vout)]; + if ( base == 0 || rel == 0 ) + return(0); if ( LP_cachekey(key,base,rel,txid,vout) == sizeof(key) ) { portable_mutex_lock(&LP_cachemutex); @@ -265,32 +269,6 @@ void LP_priceinfoupdate(char *base,char *rel,double price) } } -/*double LP_myprice(double *bidp,double *askp,char *base,char *rel) -{ - struct LP_priceinfo *basepp,*relpp; double val; - *bidp = *askp = 0.; - if ( (basepp= LP_priceinfofind(base)) != 0 && (relpp= LP_priceinfofind(rel)) != 0 ) - { - if ( (*askp= basepp->myprices[relpp->ind]) > SMALLVAL ) - { - if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) - { - *bidp = 1. / val; - } else *bidp = *askp * 0.99; - return((*askp + *bidp) * 0.5); - } - else - { - if ( (val= relpp->myprices[basepp->ind]) > SMALLVAL ) - { - *bidp = 1. / val; - *askp = *bidp / 0.99; - } - } - } - return(0.); -}*/ - double LP_myprice(double *bidp,double *askp,char *base,char *rel) { struct LP_priceinfo *basepp,*relpp; double val; From 369f2e0f2b356ae6e9c974a47919e8b4a3168be7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:14:25 +0300 Subject: [PATCH 825/910] Test --- iguana/exchanges/LP_network.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 1d669009a..b482dee2b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -100,7 +100,8 @@ uint32_t LP_swapsend(int32_t pairsock,struct basilisk_swap *swap,uint32_t msgbit void LP_psockloop(void *_ptr) { - int32_t i,n,nonz,iter,retval,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; struct nn_pollfd *pfds; char keepalive[512];//,*myipaddr = _ptr; + static struct nn_pollfd *pfds; + int32_t i,n,nonz,iter,retval,size=0,sentbytes,sendsock = -1; uint32_t now; struct psock *ptr=0; void *buf=0; char keepalive[512];//,*myipaddr = _ptr; while ( 1 ) { now = (uint32_t)time(NULL); @@ -130,8 +131,10 @@ void LP_psockloop(void *_ptr) } else if ( Numpsocks > 0 ) { - pfds = calloc(Numpsocks,sizeof(*pfds) * 2); + if ( pfds == 0 ) + pfds = calloc(60000,sizeof(*pfds)); portable_mutex_lock(&LP_psockmutex); + memset(pfds,0,sizeof(*pfds) * ((Numpsocks < 30000) ? Numpsocks*2 : 60000)); for (iter=0; iter<2; iter++) { for (i=n=0; i Date: Wed, 21 Jun 2017 10:28:51 +0300 Subject: [PATCH 826/910] Test --- iguana/exchanges/LP_coins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 4a8c4ed81..2634b914e 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -119,7 +119,6 @@ void LP_statefname(char *fname,char *symbol,char *assetname,char *str) strcat(fname,"/"); #endif strcat(fname,str); - //printf("LP_statefname.(%s) <- %s %s %s\n",fname,symbol,assetname,str); } int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) @@ -140,6 +139,7 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); + printf("LP_statefname.(%s) <- %s %s (%s)\n",fname,symbol,assetname,userpass); return((int32_t)strlen(userpass)); } else printf("cant open.(%s)\n",fname); return(-1); From 388f1e8de66b10e0208844c33bba8a334767ac07 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:36:36 +0300 Subject: [PATCH 827/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_network.c | 89 +++++++++++++++++---------------- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index a1dadda84..798cda041 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -482,7 +482,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_close(pullsock); pullsock = LP_initpublicaddr(ctx,&mypullport,pushaddr,myipaddr,mypullport,0); LP_deadman_switch = (uint32_t)time(NULL); - LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,100000); + LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,MAX_PSOCK_PORT); } } } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b482dee2b..cf95fc9db 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -19,6 +19,8 @@ // #define PSOCK_KEEPALIVE 600 +#define MAX_PSOCK_PORT 60000 +#define MIN_PSOCK_PORT 10000 struct psock { @@ -28,7 +30,7 @@ struct psock char sendaddr[128],publicaddr[128]; } *PSOCKS; -uint16_t Numpsocks,Psockport = 10000; +uint16_t Numpsocks,Psockport = MIN_PSOCK_PORT; char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t port) { @@ -47,7 +49,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) return(-1); } len = (int32_t)strlen(msg) + 1; - for (i=0; i<1000; i++) + for (i=0; i<1000; i++) // 1000 * (1 ms + 1000 us) = 2 seconds { pfd.fd = sock; pfd.events = NN_POLLOUT; @@ -66,8 +68,6 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) usleep(1000); } printf("error LP_send sock.%d, i.%d timeout.(%s) %s\n",sock,i,msg,nn_strerror(nn_errno())); - //if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) - // printf("LP_send sent %d instead of %d\n",sentbytes,len); if ( freeflag != 0 ) free(msg); return(-1); @@ -132,9 +132,9 @@ void LP_psockloop(void *_ptr) else if ( Numpsocks > 0 ) { if ( pfds == 0 ) - pfds = calloc(60000,sizeof(*pfds)); + pfds = calloc(MAX_PSOCK_PORT,sizeof(*pfds)); portable_mutex_lock(&LP_psockmutex); - memset(pfds,0,sizeof(*pfds) * ((Numpsocks < 30000) ? Numpsocks*2 : 60000)); + memset(pfds,0,sizeof(*pfds) * ((Numpsocks*2 <= MAX_PSOCK_PORT) ? Numpsocks*2 : MAX_PSOCK_PORT)); for (iter=0; iter<2; iter++) { for (i=n=0; i 60000 ) - Psockport = 10000; - if ( i == 100 ) + if ( Psockport > MAX_PSOCK_PORT ) + Psockport = MIN_PSOCK_PORT; + if ( i == maxiters ) jaddstr(retjson,"error","cant find psock ports"); return(jprint(retjson,1)); } @@ -419,38 +421,41 @@ int32_t LP_initpublicaddr(void *ctx,uint16_t *mypullportp,char *publicaddr,char printf("try to get publicaddr again\n"); } } - if ( (pullsock= nn_socket(AF_SP,nntype)) >= 0 ) + while ( 1 ) { - if ( LP_canbind == 0 ) + if ( (pullsock= nn_socket(AF_SP,nntype)) >= 0 ) { - if ( nn_connect(pullsock,connectaddr) < 0 ) + if ( LP_canbind == 0 ) { - printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); - exit(-1); - } else printf("nntype.%d NN_PAIR.%d connect to %s connectsock.%d\n",nntype,NN_PAIR,connectaddr,pullsock); - } - else - { - if ( nn_bind(pullsock,bindaddr) < 0 ) + if ( nn_connect(pullsock,connectaddr) < 0 ) + { + printf("bind to %s error for %s: %s\n",connectaddr,publicaddr,nn_strerror(nn_errno())); + exit(-1); + } else printf("nntype.%d NN_PAIR.%d connect to %s connectsock.%d\n",nntype,NN_PAIR,connectaddr,pullsock); + } + else { - printf("bind to %s error for %s: %s\n",bindaddr,publicaddr,nn_strerror(nn_errno())); - exit(-1); + if ( nn_bind(pullsock,bindaddr) < 0 ) + { + printf("bind to %s error for %s: %s\n",bindaddr,publicaddr,nn_strerror(nn_errno())); + exit(-1); + } } + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + //maxsize = 2 * 1024 * 1024; + //nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + if ( nntype == NN_SUB ) + nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); } - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 1; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - maxsize = 2 * 1024 * 1024; - nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); - if ( nntype == NN_SUB ) - nn_setsockopt(pullsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - //LP_send(pullsock,"hello init",0); - } - if ( LP_canbind == 0 && ispaired == 0 && nn_tests(ctx,pullsock,publicaddr,NN_PUSH) < 0 ) - { - printf("command socket didnt work\n"); - exit(-1); + if ( LP_canbind != 0 || ispaired != 0 || nn_tests(ctx,pullsock,publicaddr,NN_PUSH) >= 0 ) + break; + printf("nn_tests failed, try again\n"); + sleep(3); + if ( pullsock >= 0 ) + nn_close(pullsock); } return(pullsock); } From 27c1f19942249b1721b325c1e7287c135c302edc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:40:08 +0300 Subject: [PATCH 828/910] 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 798cda041..ab690eabd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -470,6 +470,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } while ( 1 ) { + fprintf(stderr,"."); if ( LP_mainloop_iter(ctx,myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); if ( LP_canbind == 0 ) From 94514cd68739ea3eb50817aec3127b8bdbd3b7ba Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:55:39 +0300 Subject: [PATCH 829/910] Test --- iguana/exchanges/LP_forwarding.c | 8 +++++--- iguana/exchanges/LP_nativeDEX.c | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index cb368afe2..ad1207901 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -60,7 +60,7 @@ int32_t LP_hello(struct LP_forwardinfo *ptr) if ( nn_poll(&pfd,1,1) > 0 ) { sprintf(msg,"{\"method\":\"hello\",\"from\":\"%s\"}",LP_mypeer != 0 ? LP_mypeer->ipaddr : ""); - printf("HELLO sent.%d bytes to %s on i.%d\n",LP_send(ptr->pushsock,msg,0),ptr->pushaddr,i); + //printf("HELLO sent.%d bytes to %s on i.%d\n",LP_send(ptr->pushsock,msg,0),ptr->pushaddr,i); ptr->hello = (uint32_t)time(NULL); return(i); } @@ -120,8 +120,10 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) { nn_close(ptr->pushsock); if ( LP_psockmark(ptr->pushaddr) < 0 ) - printf("cant mark (%s)\n",ptr->pushaddr); - printf("recreate pushsock for %s\n",pushaddr); + { + //printf("cant mark (%s)\n",ptr->pushaddr); + } + char str[65]; printf("%u recreate pushsock for %s <- %s\n",(uint32_t)time(NULL),pushaddr,bits256_str(str,pubkey)); strcpy(ptr->pushaddr,pushaddr); if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index ab690eabd..d2615f54e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -397,7 +397,13 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); if ( jobj(argjson,"canbind") == 0 ) + { +#ifndef __linux__ + LP_canbind = 1; +#else LP_canbind = IAMLP; +#endif + } else LP_canbind = jint(argjson,"canbind"); srand((int32_t)n); if ( userhome != 0 && userhome[0] != 0 ) @@ -470,7 +476,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } while ( 1 ) { - fprintf(stderr,"."); + //fprintf(stderr,"."); if ( LP_mainloop_iter(ctx,myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) usleep(100000); if ( LP_canbind == 0 ) From c72f737e9a09b6024213081fcbc4a08428089e54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:58:42 +0300 Subject: [PATCH 830/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d2615f54e..06b90943f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -314,7 +314,9 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int sprintf(keepalive,"{\"method\":\"keepalive\"}"); //printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); if ( LP_send(pullsock,keepalive,0) < 0 ) - LP_deadman_switch = 0; + { + //LP_deadman_switch = 0; + } } counter++; return(nonz); From bb55ff4095b6cf8f383e9332c0025c2538e3c549 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 10:58:58 +0300 Subject: [PATCH 831/910] 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 06b90943f..0a4aa8d08 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -401,7 +401,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit if ( jobj(argjson,"canbind") == 0 ) { #ifndef __linux__ - LP_canbind = 1; + LP_canbind = IAMLP; #else LP_canbind = IAMLP; #endif From f0e2b7122f761397c018be411cdc75b2570044c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:02:00 +0300 Subject: [PATCH 832/910] 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 b00ef444f..f28054ab2 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,7 +24,7 @@ #define LP_COMMAND_SENDSOCK NN_PUSH #define LP_COMMAND_RECVSOCK NN_PULL -#define LP_HTTP_TIMEOUT 1 +#define LP_HTTP_TIMEOUT 3 #define LP_MAXPEER_ERRORS 3 #define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 From 76b05f86e65dda7bb82a3991eaf3fe105b12422f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:05:12 +0300 Subject: [PATCH 833/910] Test --- iguana/exchanges/LP_include.h | 6 ++++++ iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_network.c | 4 ---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index f28054ab2..1e797b2e7 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,6 +24,12 @@ #define LP_COMMAND_SENDSOCK NN_PUSH #define LP_COMMAND_RECVSOCK NN_PULL + +#define PSOCK_KEEPALIVE 600 +#define MAINLOOP_PERSEC 10 +#define MAX_PSOCK_PORT 60000 +#define MIN_PSOCK_PORT 10000 + #define LP_HTTP_TIMEOUT 3 #define LP_MAXPEER_ERRORS 3 #define LP_SWAPSTEP_TIMEOUT 3 diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 0a4aa8d08..1432c4537 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -308,7 +308,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int if ( IAMLP != 0 && (counter % 600) == 42 ) LP_hellos(); //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d\n",counter,LP_canbind); - if ( LP_canbind == 0 && (counter % 60) == 13 ) + if ( LP_canbind == 0 && (counter % (PSOCK_KEEPALIVE*MAINLOOP_PERSEC/2)) == 13 ) { char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); @@ -480,7 +480,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit { //fprintf(stderr,"."); if ( LP_mainloop_iter(ctx,myipaddr,mypeer,pubsock,pushaddr,mypullport,pullsock,myport,passphrase,profitmargin) == 0 ) - usleep(100000); + usleep(1000000 / MAINLOOP_PERSEC); if ( LP_canbind == 0 ) { //printf("check deadman %u vs %u\n",LP_deadman_switch,(uint32_t)time(NULL)); diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index cf95fc9db..b69385cb2 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -18,10 +18,6 @@ // marketmaker // -#define PSOCK_KEEPALIVE 600 -#define MAX_PSOCK_PORT 60000 -#define MIN_PSOCK_PORT 10000 - struct psock { uint32_t lasttime,lastping,errors; From 8205b9e4583075861c3a5619282725fbb59f292a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:17:42 +0300 Subject: [PATCH 834/910] Test --- iguana/exchanges/LP_coins.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 2634b914e..83d01b2c8 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -245,13 +245,7 @@ struct iguana_info *LP_coinfind(char *symbol) } else if ( strcmp(symbol,"KMD") == 0 ) name = "komodo"; - else if ( strcmp(symbol,"HUSH") == 0 ) - name = "hush"; - else - { - name = symbol; - assetname = symbol; - } + else return(0); LP_coininit(&cdata,symbol,name,assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,0); if ( (coin= LP_coinadd(&cdata)) != 0 && strcmp(symbol,"KMD") == 0 ) coin->inactive = 0; @@ -281,6 +275,8 @@ struct iguana_info *LP_coincreate(cJSON *item) name = assetname; else if ( (name= jstr(item,"name")) == 0 ) name = symbol; + if ( strcmp(symbol,"HUSH") == 0 ) + printf("init HUSH %s %s %s\n",symbol,name,assetname); LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,jint(item,"taddr")); coin = LP_coinadd(&cdata); } From 1ac4b90ff107d1e63940cf4951fdb511f65c345a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:28:49 +0300 Subject: [PATCH 835/910] Test --- iguana/exchanges/LP_coins.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 83d01b2c8..c00c6008d 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -72,7 +72,7 @@ void LP_userpassfp(char *symbol,char *username,char *password,FILE *fp) free(rpcpassword); } -void LP_statefname(char *fname,char *symbol,char *assetname,char *str) +void LP_statefname(char *fname,char *symbol,char *assetname,char *str,char *name) { sprintf(fname,"%s",LP_getdatadir()); #ifdef WIN32 @@ -88,13 +88,9 @@ void LP_statefname(char *fname,char *symbol,char *assetname,char *str) strcat(fname,".bitcoin"); #endif } - else if ( strcmp(symbol,"LTC") == 0 ) + else if ( name != 0 ) { -#ifdef __APPLE__ - strcat(fname,"Litecoin"); -#else - strcat(fname,".litecoin"); -#endif + strcat(fname,name); } else { @@ -121,7 +117,7 @@ void LP_statefname(char *fname,char *symbol,char *assetname,char *str) strcat(fname,str); } -int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) +int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot,char *name) { FILE *fp; char fname[512],username[512],password[512],confname[16]; userpass[0] = 0; @@ -133,13 +129,13 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot) if ( strcmp(&confname[len-4],"coin") == 0 ) confname[len - 4] = 'C'; #endif - LP_statefname(fname,symbol,assetname,confname); + LP_statefname(fname,symbol,assetname,confname,name); if ( (fp= fopen(fname,"rb")) != 0 ) { LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); - printf("LP_statefname.(%s) <- %s %s (%s)\n",fname,symbol,assetname,userpass); + printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); return((int32_t)strlen(userpass)); } else printf("cant open.(%s)\n",fname); return(-1); @@ -175,6 +171,7 @@ cJSON *LP_coinsjson() void 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 taddr) { + char *name2; memset(coin,0,sizeof(*coin)); safecopy(coin->symbol,symbol,sizeof(coin->symbol)); sprintf(coin->serverport,"127.0.0.1:%u",port); @@ -187,7 +184,10 @@ void LP_coininit(struct iguana_info *coin,char *symbol,char *name,char *assetnam coin->p2shtype = p2shtype; coin->wiftype = wiftype; coin->inactive = (uint32_t)time(NULL); - LP_userpass(coin->userpass,symbol,assetname,name); + if ( strcmp(symbol,"KMD") == 0 || (assetname != 0 && assetname[0] != 0) ) + name2 = 0; + else name2 = name; + LP_userpass(coin->userpass,symbol,assetname,name,name2); } struct iguana_info *LP_coinadd(struct iguana_info *cdata) From 110a2a786bdc9919f5e995b2461f52128d714c2f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:36:02 +0300 Subject: [PATCH 836/910] Test --- iguana/exchanges/LP_coins.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index c00c6008d..103fa1ea2 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -90,7 +90,19 @@ void LP_statefname(char *fname,char *symbol,char *assetname,char *str,char *name } else if ( name != 0 ) { - strcat(fname,name); + char name2[64]; +#ifdef __APPLE__ + int32_t len; + strcpy(name2,name); + name2[0] = toupper(name2[0]); + len = (int32_t)strlen(name2); + if ( strcmp(&name2[len-4],"coin") == 0 ) + name2[len - 4] = 'C'; +#else + name2[0] = '.'; + strcpy(name2+1,name); +#endif + strcat(fname,name2); } else { From df686624483655098f4f1e86a4a81c7273fad84f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:41:19 +0300 Subject: [PATCH 837/910] Test --- iguana/exchanges/LP_coins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 103fa1ea2..4e4d22bc3 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -147,7 +147,7 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot,c LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); - printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); + //printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); return((int32_t)strlen(userpass)); } else printf("cant open.(%s)\n",fname); return(-1); From 502ef895999f66d512cc013c1afeb54a6c6a8a34 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 11:41:32 +0300 Subject: [PATCH 838/910] Test --- iguana/exchanges/LP_coins.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index 4e4d22bc3..f636594d0 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -287,8 +287,6 @@ struct iguana_info *LP_coincreate(cJSON *item) name = assetname; else if ( (name= jstr(item,"name")) == 0 ) name = symbol; - if ( strcmp(symbol,"HUSH") == 0 ) - printf("init HUSH %s %s %s\n",symbol,name,assetname); LP_coininit(&cdata,symbol,name,assetname==0?"":assetname,isPoS,port,pubtype,p2shtype,wiftype,txfee,estimatedrate,longestchain,jint(item,"taddr")); coin = LP_coinadd(&cdata); } From 1f80f3f3ab5128872ece5c66feb7ce714f2437fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 12:10:49 +0300 Subject: [PATCH 839/910] Test --- iguana/exchanges/LP_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index b69385cb2..dc387a2fe 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -242,6 +242,7 @@ void LP_psockloop(void *_ptr) sprintf(keepalive,"{\"method\":\"keepalive\",\"endpoint\":\"%s\"}",ptr->sendaddr); size = (int32_t)strlen(keepalive) + 1; buf = keepalive; + printf("send keepalive.(%s)\n",keepalive); break; } } From 12105fa3334c1363af38c8ac5efbbf18976a37f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 12:20:24 +0300 Subject: [PATCH 840/910] 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 1432c4537..7e2e2d8cd 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -32,7 +32,7 @@ char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; -char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", "5.9.253.204" }; // +char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // uint32_t LP_deadman_switch; int32_t LP_mypubsock = -1; From fb05a798c0cdbf98176214a520d81f9de0903524 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 13:07:30 +0300 Subject: [PATCH 841/910] Test --- iguana/exchanges/LP_coins.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index f636594d0..fcabe7c27 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -147,7 +147,8 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot,c LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); - //printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); + if ( strcmp(symbol,"HUSH") == 0 ) + printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); return((int32_t)strlen(userpass)); } else printf("cant open.(%s)\n",fname); return(-1); From fc17778de1319b040ccca70ca4235d2663cb0e37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 13:22:21 +0300 Subject: [PATCH 842/910] Test --- iguana/exchanges/LP_coins.c | 2 +- iguana/exchanges/client | 2 +- iguana/exchanges/run | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index fcabe7c27..e8e35f882 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -147,7 +147,7 @@ int32_t LP_userpass(char *userpass,char *symbol,char *assetname,char *confroot,c LP_userpassfp(symbol,username,password,fp); sprintf(userpass,"%s:%s",username,password); fclose(fp); - if ( strcmp(symbol,"HUSH") == 0 ) + if ( 0 && strcmp(symbol,"HUSH") == 0 ) printf("LP_statefname.(%s) <- %s %s %s (%s)\n",fname,name,symbol,assetname,userpass); return((int32_t)strlen(userpass)); } else printf("cant open.(%s)\n",fname); diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 2cb11e60c..494e686c6 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -5,7 +5,7 @@ git pull; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, -{\"active\":1,\"coin\":\"HUSH\",\"name\":\"hushcoin\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, +{\"active\":1,\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, diff --git a/iguana/exchanges/run b/iguana/exchanges/run index 858fe930d..d0e1e557f 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -1,7 +1,7 @@ source randval pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, -{\"coin\":\"HUSH\",\"name\":\"hushcoin\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, +{\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, From 002e0fdcf45a22c578a25632e3dbc45b67c09604 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 16:07:54 +0300 Subject: [PATCH 843/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 7e2e2d8cd..d63b7ca89 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -248,9 +248,10 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int { if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { - printf("numpeers.%d updatepeer.%s lag.%d\n",numpeers,peer->ipaddr,now-peer->lastpeers); + if ( IAMLP != 0 ) + printf("numpeers.%d updatepeer.%s lag.%d\n",numpeers,peer->ipaddr,now-peer->lastpeers); peer->lastpeers = now; - if ( peer->numpeers != numpeers ) + if ( IAMLP != 0 && peer->numpeers != numpeers ) printf("%s num.%d vs %d\n",peer->ipaddr,peer->numpeers,numpeers); if ( strcmp(peer->ipaddr,myipaddr) != 0 ) LP_peersquery(mypeer,pubsock,peer->ipaddr,peer->port,myipaddr,myport,profitmargin); From f16d4e83af2399d8d14ed2541be2b36743d967f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 16:39:12 +0300 Subject: [PATCH 844/910] Test --- iguana/exchanges/LP_network.c | 2 +- iguana/exchanges/LP_ordermatch.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index dc387a2fe..f63fc2438 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -394,7 +394,7 @@ int32_t nn_tests(void *ctx,int32_t pullsock,char *pushaddr,int32_t nnother) int32_t LP_initpublicaddr(void *ctx,uint16_t *mypullportp,char *publicaddr,char *myipaddr,uint16_t mypullport,int32_t ispaired) { - int32_t nntype,pullsock,timeout,maxsize; char bindaddr[128],connectaddr[128]; + int32_t nntype,pullsock,timeout; char bindaddr[128],connectaddr[128]; *mypullportp = mypullport; if ( ispaired == 0 ) { diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 8416d8ad9..929d0aac5 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -372,7 +372,7 @@ int32_t LP_nanobind(void *ctx,char *pairstr,char *myipaddr) } else printf("error binding to %s for %s\n",bindaddr,pairstr); } } - } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,myipaddr,0,0); + } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,myipaddr,0,1); return(pairsock); } From 7476c49052f6efc7d3d56b1be0b54976fd88ca7d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 19:53:23 +0300 Subject: [PATCH 845/910] Test --- iguana/exchanges/LP_utxos.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 66f239e59..8310ff735 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -28,6 +28,8 @@ int32_t LP_ismine(struct LP_utxoinfo *utxo) int32_t LP_isavailable(struct LP_utxoinfo *utxo) { + if ( time(NULL) > utxo->T.swappending ) + utxo->T.swappending = 0; if ( utxo != 0 && utxo->T.swappending == 0 && utxo->S.swap == 0 ) return(1); else return(0); From 82d883aa276afb8f26b0b53203f63decd183698b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 20:30:04 +0300 Subject: [PATCH 846/910] Test --- iguana/exchanges/LP_nativeDEX.c | 3 ++- iguana/exchanges/LP_ordermatch.c | 18 ++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index d63b7ca89..2681d5dad 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,7 +30,7 @@ struct LP_forwardinfo *LP_forwardinfos; char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; -char USERPASS[65],USERPASS_WIFSTR[64],USERHOME[512] = { "/root" }; +char USERPASS[65],USERPASS_WIFSTR[64],LP_myipaddr[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // @@ -438,6 +438,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit n = strlen(myipaddr); if ( myipaddr[n-1] == '\n' ) myipaddr[--n] = 0; + strcpy(LP_myipaddr,myipaddr); } else printf("error getting myipaddr\n"); } else printf("error issuing curl\n"); if ( IAMLP != 0 ) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 929d0aac5..a59f825d0 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -338,21 +338,11 @@ double LP_query(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,c return(price); } -int32_t LP_nanobind(void *ctx,char *pairstr,char *myipaddr) +int32_t LP_nanobind(void *ctx,char *pairstr) { int32_t i,timeout,r,pairsock = -1; uint16_t mypullport; char bindaddr[128]; if ( LP_canbind != 0 ) { - if ( strcmp(myipaddr,"127.0.0.1") == 0 ) - { - if ( LP_mypeer != 0 ) - myipaddr = LP_mypeer->ipaddr; - } - if ( strcmp(myipaddr,"127.0.0.1") == 0 ) - { - printf("cant nanobind to localhost\n"); - return(-1); - } if ( (pairsock= nn_socket(AF_SP,NN_PAIR)) < 0 ) printf("error creating utxo->pair\n"); else @@ -360,8 +350,8 @@ int32_t LP_nanobind(void *ctx,char *pairstr,char *myipaddr) for (i=0; i<10; i++) { r = (10000 + (rand() % 50000)) & 0xffff; - nanomsg_transportname(0,pairstr,myipaddr,r); - nanomsg_transportname(1,bindaddr,myipaddr,r); + nanomsg_transportname(0,pairstr,LP_myipaddr,r); + nanomsg_transportname(1,bindaddr,LP_myipaddr,r); if ( nn_bind(pairsock,bindaddr) >= 0 ) { timeout = 100; @@ -372,7 +362,7 @@ int32_t LP_nanobind(void *ctx,char *pairstr,char *myipaddr) } else printf("error binding to %s for %s\n",bindaddr,pairstr); } } - } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,myipaddr,0,1); + } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,"127.0.0.1",0,1); return(pairsock); } From cca4176eb17c4e64bb8a209424089d6958e8346f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 20:33:19 +0300 Subject: [PATCH 847/910] 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 a59f825d0..723105cec 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -369,7 +369,7 @@ int32_t LP_nanobind(void *ctx,char *pairstr) int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; - printf("LP_connectstartbob.(%s) with.(%s)\n",myipaddr,jprint(argjson,0)); + printf("LP_connectstartbob.(%s) with.(%s) %s\n",myipaddr,jprint(argjson,0),LP_myipaddr); qp->quotetime = (uint32_t)time(NULL); if ( (coin= LP_coinfind(utxo->coin)) == 0 ) { From 988028e79ead5d23bf8395a98f53343e27beb6e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Jun 2017 20:34:53 +0300 Subject: [PATCH 848/910] 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 723105cec..01d43690b 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -379,7 +379,7 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJ privkey = LP_privkey(utxo->coinaddr,coin->taddr); if ( bits256_nonz(privkey) != 0 && qp->quotetime >= qp->timestamp-3 && qp->quotetime <= utxo->T.swappending && bits256_cmp(LP_mypubkey,qp->srchash) == 0 ) { - if ( (pair= LP_nanobind(ctx,pairstr,myipaddr)) >= 0 ) + if ( (pair= LP_nanobind(ctx,pairstr)) >= 0 ) { LP_requestinit(&qp->R,qp->srchash,qp->desthash,base,qp->satoshis,rel,qp->destsatoshis,qp->timestamp,qp->quotetime,DEXselector); swap = LP_swapinit(1,0,privkey,&qp->R,qp); From 23da4a615add7e54a79cb46030f8097f83bd7c79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 16:33:44 +0300 Subject: [PATCH 849/910] test --- iguana/exchanges/LP_forwarding.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index ad1207901..9e9e4b320 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -207,7 +207,7 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) if ( reqjson != 0 ) { retstr = LP_command_process(ctx,LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); - //printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); + printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) LP_send(pubsock,jprint(reqjson,0),0); } else printf("LP_forwardhex couldnt parse (%s)\n",(char *)data); @@ -216,7 +216,7 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) { if ( ptr->pushsock >= 0 )//&& ptr->hello != 0 ) { - //printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); + printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); sentbytes = LP_send(ptr->pushsock,(char *)data,0); } retjson = cJSON_CreateObject(); @@ -293,7 +293,7 @@ int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin, } else retval = 0; if ( retval >= 0 && peer->pushsock >= 0 ) { - //printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); + printf("found LPnode.(%s) forward.(%s)\n",peer->ipaddr,jsonstr); len = (int32_t)strlen(jsonstr) + 1; hexstr = malloc(len*2 + 1); init_hexbytes_noT(hexstr,(uint8_t *)jsonstr,len); From fb8451e888e1ca700419a7239b0a35f8ca1cb3eb Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:22:22 +0300 Subject: [PATCH 850/910] Test --- iguana/exchanges/LP_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 158ccf323..55e2b2832 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",5*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); @@ -718,7 +718,7 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - if ( LP_sendwait("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",5*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From 6757d89640386ee9f7f068d1e57204dfd8def482 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:30:31 +0300 Subject: [PATCH 851/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_swap.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 1e797b2e7..0036bb5fc 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -30,7 +30,7 @@ #define MAX_PSOCK_PORT 60000 #define MIN_PSOCK_PORT 10000 -#define LP_HTTP_TIMEOUT 3 +#define LP_HTTP_TIMEOUT 1 #define LP_MAXPEER_ERRORS 3 #define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 55e2b2832..bd832e817 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",5*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",15*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); @@ -718,7 +718,7 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - if ( LP_sendwait("pubkeys",5*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",15*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From c421a6ca493483561baad1530abc572b51dc1231 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:32:45 +0300 Subject: [PATCH 852/910] Test --- iguana/exchanges/LP_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index bd832e817..8ef6167d1 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",15*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); @@ -718,7 +718,7 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - if ( LP_sendwait("pubkeys",15*LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From f440fdd68b10f2f62657b6b996c678e193c02b21 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:36:38 +0300 Subject: [PATCH 853/910] Test --- iguana/exchanges/LP_swap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 8ef6167d1..4c94d6365 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -718,6 +718,7 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); + sleep(10); if ( LP_sendwait("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) From 63afa00559777cc384cc3c78d8f4587e1a831b80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:42:26 +0300 Subject: [PATCH 854/910] Test --- iguana/exchanges/LP_rpc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index c4e4a00af..71362afed 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -20,9 +20,12 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) { - char *retstr = 0; struct LP_peerinfo *peer = 0; + char *retstr = 0; int32_t maxerrs; struct LP_peerinfo *peer = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); - if ( peer == 0 || peer->errors < LP_MAXPEER_ERRORS ) + if ( strncmp("5.9.253",destip,strlen("5.9.253")) == 0 ) + maxerrs = LP_MAXPEER_ERRORS; + else maxerrs = 1; + if ( peer == 0 || peer->errors < maxerrs ) { if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) { From fee18da6da632c4682f8d00d6d9deb0055c3cc30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:48:54 +0300 Subject: [PATCH 855/910] Test --- iguana/exchanges/LP_ordermatch.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 01d43690b..4a61874ac 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -355,8 +355,8 @@ int32_t LP_nanobind(void *ctx,char *pairstr) if ( nn_bind(pairsock,bindaddr) >= 0 ) { timeout = 100; - nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("nanobind %s to %d\n",pairstr,pairsock); return(pairsock); } else printf("error binding to %s for %s\n",bindaddr,pairstr); @@ -456,9 +456,9 @@ char *LP_connectedalice(cJSON *argjson) // alice jaddstr(retjson,"error","couldnt create pairsock"); else if ( nn_connect(pairsock,pairstr) >= 0 ) { - timeout = 100; - nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + //timeout = 100; + //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); swap->N.pair = pairsock; @@ -472,7 +472,7 @@ char *LP_connectedalice(cJSON *argjson) // alice 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)); if ( jobj(retjson,"error") != 0 ) LP_availableset(autxo); From 6f0edcf7c7554ca57021c4afe9f63457ac9df449 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:53:13 +0300 Subject: [PATCH 856/910] Test --- iguana/exchanges/LP_ordermatch.c | 10 +++++----- iguana/exchanges/LP_swap.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 4a61874ac..3bc28c3b7 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -355,8 +355,8 @@ int32_t LP_nanobind(void *ctx,char *pairstr) if ( nn_bind(pairsock,bindaddr) >= 0 ) { timeout = 100; - //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("nanobind %s to %d\n",pairstr,pairsock); return(pairsock); } else printf("error binding to %s for %s\n",bindaddr,pairstr); @@ -456,9 +456,9 @@ char *LP_connectedalice(cJSON *argjson) // alice jaddstr(retjson,"error","couldnt create pairsock"); else if ( nn_connect(pairsock,pairstr) >= 0 ) { - //timeout = 100; - //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 100; + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(pairsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); LP_requestinit(&Q.R,Q.srchash,Q.desthash,Q.srccoin,Q.satoshis,Q.destcoin,Q.destsatoshis,Q.timestamp,Q.quotetime,DEXselector); swap = LP_swapinit(0,0,Q.privkey,&Q.R,&Q); swap->N.pair = pairsock; diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 4c94d6365..d3a5ac463 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT*3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); @@ -718,8 +718,8 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - sleep(10); - if ( LP_sendwait("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + sleep(1); + if ( LP_sendwait("pubkeys",LP_SWAPSTEP_TIMEOUT*3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From 9fbb13ab5b7c95cd88db160b99631964ba037436 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 19:57:29 +0300 Subject: [PATCH 857/910] Test --- iguana/exchanges/LP_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index d3a5ac463..7b24fbcf1 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -420,15 +420,15 @@ int32_t LP_waitfor(int32_t pairsock,struct basilisk_swap *swap,int32_t timeout,i int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,int32_t (*verify)(struct basilisk_swap *swap,uint8_t *data,int32_t datalen),int32_t (*datagen)(struct basilisk_swap *swap,uint8_t *data,int32_t maxlen)) { int32_t datalen,sendlen,retval = -1; - //printf("waitsend.%s\n",statename); + printf("waitsend.%s\n",statename); if ( LP_waitfor(pairsock,swap,timeout,verify) == 0 ) { - //printf("waited for %s\n",statename); + printf("waited for %s\n",statename); if ( (datalen= (*datagen)(swap,data,maxlen)) > 0 ) { if ( (sendlen= nn_send(pairsock,data,datalen,0)) == datalen ) { - //printf("sent.%d after waitfor.%s\n",sendlen,statename); + printf("sent.%d after waitfor.%s\n",sendlen,statename); retval = 0; } else printf("send %s error\n",statename); } else printf("%s datagen no data\n",statename); From 5bfc7f7c5b61b5231134878dcdf0ae3a0e5a419c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 20:04:47 +0300 Subject: [PATCH 858/910] Test --- iguana/exchanges/LP_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 7b24fbcf1..5f6eabfbd 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -432,7 +432,7 @@ int32_t LP_waitsend(char *statename,int32_t timeout,int32_t pairsock,struct basi retval = 0; } else printf("send %s error\n",statename); } else printf("%s datagen no data\n",statename); - } else printf("didnt get valid data\n"); + } else printf("didnt get valid data after %d\n",timeout); return(retval); } @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT*3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT*30,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); From 55920f142279c7a26f6626da771cf88d310df354 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Jun 2017 20:06:24 +0300 Subject: [PATCH 859/910] Test --- iguana/exchanges/LP_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 5f6eabfbd..c819e80ad 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -718,8 +718,8 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - sleep(1); - if ( LP_sendwait("pubkeys",LP_SWAPSTEP_TIMEOUT*3,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + sleep(10); + if ( LP_sendwait("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From b3db01b63ee031159b65e28410ac9e282ccf0986 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 09:15:52 +0300 Subject: [PATCH 860/910] Test --- iguana/exchanges/LP_nativeDEX.c | 10 +++++++--- iguana/exchanges/LP_ordermatch.c | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 2681d5dad..7f61ccc17 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -35,6 +35,7 @@ char USERPASS[65],USERPASS_WIFSTR[64],LP_myipaddr[64],USERHOME[512] = { "/root" char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // uint32_t LP_deadman_switch; +uint16_t LP_fixed_pairport; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -402,12 +403,15 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit if ( jobj(argjson,"canbind") == 0 ) { #ifndef __linux__ - LP_canbind = IAMLP; + LP_canbind = 1; #else LP_canbind = IAMLP; #endif - } - else LP_canbind = jint(argjson,"canbind"); + } else LP_canbind = jint(argjson,"canbind"); + if ( LP_canbind > 1000 && LP_canbind < 65536 ) + LP_fixed_pairport = LP_canbind; + if ( LP_canbind != 0 ) + LP_canbind = 1; srand((int32_t)n); if ( userhome != 0 && userhome[0] != 0 ) { diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 3bc28c3b7..7d16f4b6b 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -350,6 +350,8 @@ int32_t LP_nanobind(void *ctx,char *pairstr) for (i=0; i<10; i++) { r = (10000 + (rand() % 50000)) & 0xffff; + if ( LP_fixed_pairport != 0 ) + r = LP_fixed_pairport; nanomsg_transportname(0,pairstr,LP_myipaddr,r); nanomsg_transportname(1,bindaddr,LP_myipaddr,r); if ( nn_bind(pairsock,bindaddr) >= 0 ) @@ -360,6 +362,8 @@ int32_t LP_nanobind(void *ctx,char *pairstr) printf("nanobind %s to %d\n",pairstr,pairsock); return(pairsock); } else printf("error binding to %s for %s\n",bindaddr,pairstr); + if ( LP_fixed_pairport != 0 ) + break; } } } else pairsock = LP_initpublicaddr(ctx,&mypullport,pairstr,"127.0.0.1",0,1); From 533361a6032b122eb8a3e40cac44d4105cd45681 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 09:17:09 +0300 Subject: [PATCH 861/910] Test --- iguana/exchanges/LP_swap.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index c819e80ad..6d6b22d28 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -662,7 +662,7 @@ void LP_bobloop(void *_swap) expiration = (uint32_t)time(NULL) + LP_SWAPSTEP_TIMEOUT; if ( swap != 0 ) { - if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT*30,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_waitsend("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error waitsend pubkeys\n"); else if ( LP_waitsend("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error waitsend choosei\n"); @@ -718,8 +718,7 @@ void LP_aliceloop(void *_swap) if ( swap != 0 ) { fprintf(stderr,"start swap iamalice pair.%d\n",swap->N.pair); - sleep(10); - if ( LP_sendwait("pubkeys",60,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) + if ( LP_sendwait("pubkeys",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_pubkeys_verify,LP_pubkeys_data) < 0 ) printf("error LP_sendwait pubkeys\n"); else if ( LP_sendwait("choosei",LP_SWAPSTEP_TIMEOUT,swap->N.pair,swap,data,maxlen,LP_choosei_verify,LP_choosei_data) < 0 ) printf("error LP_sendwait choosei\n"); From 167537db2f0d8234267d13fe800c4a5daba70fff Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 10:09:39 +0300 Subject: [PATCH 862/910] Test --- iguana/exchanges/LP_swap.c | 18 ++++--- iguana/exchanges/LP_transaction.c | 78 ++++++++++++++++++------------- 2 files changed, 56 insertions(+), 40 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 6d6b22d28..0079c1d35 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -508,10 +508,10 @@ int32_t LP_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct ba if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) { memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); - //for (i=0; iI.redeemlen; i++) - // printf("%02x",rawtx->redeemscript[i]); + for (i=0; iI.redeemlen; i++) + printf("%02x",rawtx->redeemscript[i]); bitcoin_address(redeemaddr,rawtx->coin->taddr,rawtx->coin->p2shtype,rawtx->redeemscript,rawtx->I.redeemlen); - //printf(" received redeemscript.(%s)\n",redeemaddr); + printf(" received redeemscript.(%s) %s taddr.%d\n",redeemaddr,rawtx->coin->symbol,rawtx->coin->taddr); LP_swap_coinaddr(swap,rawtx->coin,checkaddr,data,datalen); if ( strcmp(redeemaddr,checkaddr) != 0 ) { @@ -624,9 +624,9 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t { char *retstr; cJSON *retjson=0; uint32_t expiration = (uint32_t)(time(NULL) + duration); printf("wait %d:%d for SWAP.(r%u/q%u) to complete\n",duration,sleeptime,requestid,quoteid); + sleep(10); while ( time(NULL) < expiration ) { - sleep(3); if ( (retstr= basilisk_swapentry(requestid,quoteid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -700,7 +700,9 @@ void LP_bobloop(void *_swap) swap->bobreclaim.utxovout = 0; swap->bobreclaim.utxotxid = swap->bobpayment.I.signedtxid; basilisk_bobpayment_reclaim(swap,swap->I.callduration); - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); + if ( swap->N.pair >= 0 ) + nn_close(swap->N.pair), swap->N.pair = -1; + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,300); } } } @@ -759,7 +761,9 @@ void LP_aliceloop(void *_swap) char str[65];printf("%d waiting for alicespend to be confirmed.%d %s %s\n",n,swap->I.aliceconfirms,swap->bobcoin.symbol,bits256_str(str,swap->alicespend.I.signedtxid)); sleep(LP_SWAPSTEP_TIMEOUT); } - LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,60); + if ( swap->N.pair >= 0 ) + nn_close(swap->N.pair), swap->N.pair = -1; + LP_swapwait(swap->I.req.requestid,swap->I.req.quoteid,4*3600,300); } } } @@ -958,7 +962,7 @@ struct basilisk_swap *bitcoin_swapinit(bits256 privkey,uint8_t *pubkey33,bits256 } swap->I.bobconfirms *= !bobistrusted; swap->I.aliceconfirms *= !aliceistrusted; - printf(">>>>>>>>>> jumblrflag.%d <<<<<<<<< use smart address, %.8f bobconfs.%d, %.8f aliceconfs.%d\n",jumblrflag,dstr(swap->I.bobsatoshis),swap->I.bobconfirms,dstr(swap->I.alicesatoshis),swap->I.aliceconfirms); + printf(">>>>>>>>>> jumblrflag.%d <<<<<<<<< use smart address, %.8f bobconfs.%d, %.8f aliceconfs.%d taddr.%d %d\n",jumblrflag,dstr(swap->I.bobsatoshis),swap->I.bobconfirms,dstr(swap->I.alicesatoshis),swap->I.aliceconfirms,swap->bobcoin.taddr,swap->alicecoin.taddr); if ( swap->I.iambob != 0 ) { basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,&swap->bobcoin,0,0,LP_DEXFEE(swap->I.bobsatoshis),0,0,jumblrflag); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 81cc74a93..9a3d73225 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -1283,9 +1283,9 @@ int32_t basilisk_bobscript(uint8_t *rmd160,uint8_t *redeemscript,int32_t *redeem { calc_rmd160_sha256(rmd160,redeemscript,n); n = bitcoin_p2shspend(script,0,rmd160); - //for (i=0; itaddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->longestchain,&signedtxid,&msgtx,extraspace,sizeof(extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) + { + //char str[65]; printf("got txid.%s (%s)\n",bits256_str(str,signedtxid),jprint(txobj,0)); + if ( (vouts= jarray(&n,txobj,"vout")) != 0 && n > 0 ) + { + vout = jitem(vouts,0); + //printf("VOUT.(%s)\n",jprint(vout,0)); + if ( (skey= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&m,skey,"addresses")) != 0 ) + { + item = jitem(addresses,0); + //printf("item.(%s)\n",jprint(item,0)); + if ( (addr= jstr(item,0)) != 0 ) + { + safecopy(coinaddr,addr,64); + //printf("extracted.(%s)\n",coinaddr); + } + } + } + free_json(txobj); + } +} + int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) { - int32_t j; char coinaddr[64]; + int32_t j; char coinaddr[64],checkaddr[64]; bitcoin_address(coinaddr,swap->bobcoin.taddr,swap->bobcoin.pubtype,swap->changermd160,20); if ( genflag != 0 && swap->I.iambob == 0 ) printf("basilisk_bobscripts_set WARNING: alice generating BOB tx\n"); @@ -1382,6 +1407,12 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i printf("%02x",swap->bobpayment.redeemscript[j]); printf(" <- redeem.%d\n",swap->bobpayment.I.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d destaddr.(%s)\n",swap->bobpayment.I.datalen,swap->bobpayment.I.destaddr); + LP_swap_coinaddr(swap,&swap->bobcoin,checkaddr,swap->bobpayment.txbytes,swap->bobpayment.I.datalen); + if ( strcmp(swap->bobpayment.I.destaddr,checkaddr) != 0 ) + { + printf("BOBPAYMENT REDEEMADDR MISMATCH??? %s != %s\n",swap->bobpayment.I.destaddr,checkaddr); + return(-1); + } LP_unspents_mark(swap->bobcoin.symbol,swap->bobpayment.vins); //printf("bobscripts set completed\n"); return(0); @@ -1394,9 +1425,9 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i bitcoin_address(swap->bobdeposit.p2shaddr,swap->bobcoin.taddr,swap->bobcoin.p2shtype,swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); strcpy(swap->bobdeposit.I.destaddr,swap->bobdeposit.p2shaddr); //LP_importaddress(swap->bobcoin.symbol,swap->bobdeposit.I.destaddr); - //int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) - // printf("%02x",swap->bobdeposit.redeemscript[i]); - //printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); + int32_t i; for (i=0; ibobdeposit.I.redeemlen; i++) + printf("%02x",swap->bobdeposit.redeemscript[i]); + printf(" <- bobdeposit redeem %d %s\n",i,swap->bobdeposit.I.destaddr); if ( genflag != 0 && (swap->bobdeposit.I.datalen == 0 || swap->bobrefund.I.datalen == 0) ) { basilisk_rawtx_gen(swap->ctx,"deposit",swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->txfee,1,0,swap->persistent_privkey,swap->changermd160,coinaddr); @@ -1409,7 +1440,13 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i { for (j=0; jbobdeposit.I.datalen; j++) printf("%02x",swap->bobdeposit.txbytes[j]); - printf(" <- GENERATED BOB DEPOSIT.%d\n",swap->bobdeposit.I.datalen); + printf(" <- GENERATED BOB DEPOSIT.%d (%s)\n",swap->bobdeposit.I.datalen,swap->bobdeposit.I.destaddr); + LP_swap_coinaddr(swap,&swap->bobcoin,checkaddr,swap->bobdeposit.txbytes,swap->bobdeposit.I.datalen); + if ( strcmp(swap->bobdeposit.I.destaddr,checkaddr) != 0 ) + { + printf("BOBDEPOSIT REDEEMADDR MISMATCH??? %s != %s\n",swap->bobdeposit.I.destaddr,checkaddr); + return(-1); + } LP_unspents_mark(swap->bobcoin.symbol,swap->bobdeposit.vins); printf("bobscripts set completed\n"); return(0); @@ -1421,31 +1458,6 @@ int32_t basilisk_bobscripts_set(struct basilisk_swap *swap,int32_t depositflag,i /**/ -void LP_swap_coinaddr(struct basilisk_swap *swap,struct iguana_info *coin,char *coinaddr,uint8_t *data,int32_t datalen) -{ - cJSON *txobj,*vouts,*vout,*addresses,*item,*skey; uint8_t extraspace[8192]; bits256 signedtxid; struct iguana_msgtx msgtx; char *addr; int32_t n,m,suppress_pubkeys = 0; - if ( (txobj= bitcoin_data2json(coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->longestchain,&signedtxid,&msgtx,extraspace,sizeof(extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) - { - //char str[65]; printf("got txid.%s (%s)\n",bits256_str(str,signedtxid),jprint(txobj,0)); - if ( (vouts= jarray(&n,txobj,"vout")) != 0 && n > 0 ) - { - vout = jitem(vouts,0); - //printf("VOUT.(%s)\n",jprint(vout,0)); - if ( (skey= jobj(vout,"scriptPubKey")) != 0 && (addresses= jarray(&m,skey,"addresses")) != 0 ) - { - item = jitem(addresses,0); - //printf("item.(%s)\n",jprint(item,0)); - if ( (addr= jstr(item,0)) != 0 ) - { - safecopy(coinaddr,addr,64); - //printf("extracted.(%s)\n",coinaddr); - } - } - } - free_json(txobj); - } -} - #ifdef old int32_t basilisk_alicepayment_spend(struct basilisk_swap *swap,struct basilisk_rawtx *dest) { From cdb81bcb62e777446228db4f8049a4d4f848c9d1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 10:20:44 +0300 Subject: [PATCH 863/910] 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 7f61ccc17..967a43bdb 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -270,7 +270,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int nonz += LP_subsock_check(ctx,origipaddr,pubsock,peer->subsock,profitmargin); } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d forwarding\n",counter,LP_canbind); - if ( (counter % 600) == 60 ) + if ( (counter % 600) == 20 ) { LP_myutxo_updates(ctx,pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) @@ -280,7 +280,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int } } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d utxos\n",counter,LP_canbind); - if ( (counter % 600) == 0 ) + if ( (counter % 600) == 60 ) { HASH_ITER(hh,LP_utxoinfos[0],utxo,utmp) { @@ -288,9 +288,11 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int } HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) { + char str[65]; LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); + else printf("lasttime set %s\n",bits256_str(str,utxo->payment.txid)); } } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); From 6cfcb572ec9d0358c86a2c77c14aaefe4641709a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 10:22:01 +0300 Subject: [PATCH 864/910] Test --- iguana/exchanges/LP_nativeDEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 967a43bdb..de858f992 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -292,11 +292,12 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); - else printf("lasttime set %s\n",bits256_str(str,utxo->payment.txid)); + else if ( strcmp(utxo->coin,"HUSH") == 0 ) + printf("lasttime set %s\n",bits256_str(str,utxo->payment.txid)); } } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); - if ( (counter % 600) == 599 ) + if ( (counter % 6000) == 5999 ) { if ( (retstr= basilisk_swapentry(0,0)) != 0 ) { From 9f9243777fa9ac84146d41c210cca44db4604385 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 10:24:43 +0300 Subject: [PATCH 865/910] Test --- iguana/exchanges/LP_utxos.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 8310ff735..79fdbb394 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -543,7 +543,11 @@ int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t n txid = jbits256(item,"txid"); //printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,-1,item)) != 0 ) + { + if ( strcmp(utxo->coin,"HUSH") == 0 ) + printf("%s set lasttime (%s)\n",destipaddr,jprint(item,0)); utxo->T.lasttime = now; + } } } if ( (destpeer= LP_peerfind((uint32_t)calc_ipbits(destipaddr),destport)) != 0 ) From f82c946b96b020a235afadc16f0b527f1e36f14f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 10:27:24 +0300 Subject: [PATCH 866/910] Test --- iguana/exchanges/LP_prices.c | 4 ++++ iguana/exchanges/LP_utxos.c | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 50a147ecd..e0771709a 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -521,7 +521,11 @@ int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jobj(retjson,"error") == 0 ) + { + if ( strcmp("HUSH",utxo->coin) == 0 ) + printf("clientpublish %s (%s)\n",peer->ipaddr,retstr); utxo->T.lasttime = (uint32_t)time(NULL); + } free_json(retjson); } free(retstr); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 79fdbb394..d2879210a 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -494,8 +494,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit { if ( mypubsock >= 0 ) LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - else - LP_utxo_clientpublish(utxo); + else LP_utxo_clientpublish(utxo); if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) LP_mypeer->numutxos++; } From 22a8120d0fa898b8dbe08ab6754fbfd832b066e5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 11:09:51 +0300 Subject: [PATCH 867/910] Test --- iguana/exchanges/LP_commands.c | 5 +- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_rpc.c | 40 ++++++++------- iguana/exchanges/LP_utxos.c | 86 ++++++++++++++++---------------- 4 files changed, 70 insertions(+), 63 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 5e45829a5..dda9c8d1d 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -223,8 +223,9 @@ forwardhex(pubkey,hex)\n\ return(LP_utxos(1,LP_mypeer,jstr(argjson,"coin"),jint(argjson,"lastn"))); else if ( strcmp(method,"notified") == 0 ) { - LP_utxoaddjson(1,LP_mypubsock,argjson); - return(clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}")); + if ( LP_utxoaddjson(1,LP_mypubsock,argjson) != 0 ) + return(clonestr("{\"result\":\"success\",\"notifyutxo\":\"received\"}")); + else return(clonestr("{\"error\":\"couldnt add utxo\"}")); } else if ( IAMLP != 0 ) { diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 9e9e4b320..e7b733505 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -127,7 +127,7 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) strcpy(ptr->pushaddr,pushaddr); if ( (ptr->pushsock= LP_pushsock_create(ptr,pushaddr)) < 0 ) return(clonestr("{\"error\":\"couldnt recreate pushsock\",\"registered\":0}")); - } else printf("no need to create identical endpoint\n"); + } //else printf("no need to create identical endpoint\n"); } return(clonestr("{\"error\":\"already registered\",\"registered\":1}")); } diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 71362afed..242f0fcf5 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -22,9 +22,7 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) { char *retstr = 0; int32_t maxerrs; struct LP_peerinfo *peer = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); - if ( strncmp("5.9.253",destip,strlen("5.9.253")) == 0 ) - maxerrs = LP_MAXPEER_ERRORS; - else maxerrs = 1; + maxerrs = LP_MAXPEER_ERRORS; if ( peer == 0 || peer->errors < maxerrs ) { if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) @@ -57,16 +55,18 @@ char *issue_LP_getutxos(char *destip,uint16_t destport,char *coin,int32_t lastn, { char url[512]; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,coin,lastn,ipaddr,port,profitmargin,numpeers,numutxos); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + return(LP_issue_curl("getutxos",destip,destport,url)); + //return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_clientgetutxos(char *destip,uint16_t destport,char *coin,int32_t lastn) { - char url[512],*retstr; + char url[512];//,*retstr; sprintf(url,"http://%s:%u/api/stats/getutxos?coin=%s&lastn=%d&ipaddr=127.0.0.1&port=0",destip,destport,coin,lastn); - retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + return(LP_issue_curl("clientgetutxos",destip,destport,url)); + //retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("%s clientgetutxos.(%s)\n",url,retstr); - return(retstr); + //return(retstr); } char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port,double profitmargin,int32_t numpeers,int32_t numutxos) @@ -78,7 +78,8 @@ char *issue_LP_notify(char *destip,uint16_t destport,char *ipaddr,uint16_t port, return(0); } sprintf(url,"http://%s:%u/api/stats/notify?ipaddr=%s&port=%u&profit=%.6f&numpeers=%d&numutxos=%d",destip,destport,ipaddr,port,profitmargin,numpeers,numutxos); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + return(LP_issue_curl("notify",destip,destport,url)); + //return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utxo) @@ -100,7 +101,8 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + return(LP_issue_curl("notifyutxo",destip,destport,url)); + //return(issue_curlt(url,LP_HTTP_TIMEOUT)); } else { @@ -111,20 +113,22 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx char *issue_LP_register(char *destip,uint16_t destport,bits256 pubkey,char *ipaddr,uint16_t pushport) { - char url[512],str[65],*retstr; + char url[512],str[65];//*retstr; sprintf(url,"http://%s:%u/api/stats/register?client=%s&pushaddr=%s&pushport=%u",destip,destport,bits256_str(str,pubkey),ipaddr,pushport); - retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + return(LP_issue_curl("register",destip,destport,url)); + //retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); - return(retstr); + //return(retstr); } char *issue_LP_psock(char *destip,uint16_t destport,int32_t ispaired) { - char url[512],*retstr; + char url[512]; sprintf(url,"http://%s:%u/api/stats/psock?ispaired=%d",destip,destport,ispaired); - retstr = issue_curlt(url,LP_HTTP_TIMEOUT); + return(LP_issue_curl("psock",destip,destport,url)); + //retstr = issue_curlt(url,LP_HTTP_TIMEOUT); //printf("getutxo.(%s) -> (%s)\n",url,retstr!=0?retstr:""); - return(retstr); + //return(retstr); } uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) @@ -159,7 +163,8 @@ char *issue_LP_lookup(char *destip,uint16_t destport,bits256 pubkey) char url[512],str[65]; sprintf(url,"http://%s:%u/api/stats/lookup?client=%s",destip,destport,bits256_str(str,pubkey)); //printf("getutxo.(%s)\n",url); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + return(LP_issue_curl("lookup",destip,destport,url)); + //return(issue_curlt(url,LP_HTTP_TIMEOUT)); } char *issue_LP_getprices(char *destip,uint16_t destport) @@ -167,7 +172,8 @@ char *issue_LP_getprices(char *destip,uint16_t destport) char url[512]; sprintf(url,"http://%s:%u/api/stats/getprices",destip,destport); //printf("getutxo.(%s)\n",url); - return(issue_curlt(url,LP_HTTP_TIMEOUT)); + return(LP_issue_curl("getprices",destip,destport,url)); + //return(issue_curlt(url,LP_HTTP_TIMEOUT)); } cJSON *bitcoin_json(struct iguana_info *coin,char *method,char *params) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index d2879210a..b64e8dfc8 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -17,7 +17,6 @@ // LP_utxos.c // marketmaker // -// jl777: invalidate utxo when either part is spent. if not expected spend, mark as bad and generate new utxopair using other half int32_t LP_ismine(struct LP_utxoinfo *utxo) { @@ -450,54 +449,55 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit char str[65],str2[65],str3[65],str4[65],str5[65],str6[65]; if ( dispflag != 0 ) printf("error on subsequent utxo iambob.%d %.8f %.8f add.(%s %s) when.(%s %s) %d %d %d %d %d %d %d %d %d %d %d pubkeys.(%s vs %s)\n",iambob,dstr(val),dstr(val2),bits256_str(str,txid),bits256_str(str2,txid2),bits256_str(str3,utxo->payment.txid),bits256_str(str4,utxo->deposit.txid),bits256_cmp(txid,utxo->payment.txid) != 0,bits256_cmp(txid2,u.txid) != 0,vout != utxo->payment.vout,tmpsatoshis != utxo->S.satoshis,vout2 != u.vout,value2 != u.value,strcmp(symbol,utxo->coin) != 0,strcmp(spendscript,utxo->spendscript) != 0,strcmp(coinaddr,utxo->coinaddr) != 0,bits256_cmp(pubkey,utxo->pubkey) != 0,value != utxo->payment.value,bits256_str(str5,pubkey),bits256_str(str6,utxo->pubkey)); + if ( utxo->T.spentflag != 0 || LP_txvalue(utxo->coinaddr,utxo->coin,utxo->payment.txid,utxo->payment.vout) < utxo->payment.value || LP_txvalue(utxo->coinaddr,utxo->coin,u.txid,u.vout) < u.value ) + { + if ( utxo->T.spentflag == 0 ) + utxo->T.spentflag = (uint32_t)time(NULL); + printf("original utxo pair not valid\n"); + utxo = 0; + } } else if ( profitmargin > SMALLVAL ) utxo->S.profitmargin = profitmargin; + if ( utxo != 0 ) + return(utxo); + } + utxo = calloc(1,sizeof(*utxo)); + utxo->S.profitmargin = profitmargin; + utxo->pubkey = pubkey; + safecopy(utxo->coin,symbol,sizeof(utxo->coin)); + safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); + safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); + utxo->payment.txid = txid; + utxo->payment.vout = vout; + utxo->payment.value = value; + utxo->S.satoshis = tmpsatoshis; + if ( (utxo->iambob= iambob) != 0 ) + { + utxo->deposit.txid = txid2; + utxo->deposit.vout = vout2; + utxo->deposit.value = value2; } else { - /*if ( (val= LP_txvalue(destaddr,symbol,txid,vout)) != value || (val2= LP_txvalue(destaddr2,symbol,txid2,vout2)) != value2 || strcmp(destaddr,destaddr2) != 0 || strcmp(coinaddr,destaddr) != 0 ) - { - printf("utxoadd mismatch %s/v%d (%s %.8f) + %s/v%d (%s %.8f) != %s %.8f %.8f\n",bits256_str(str,txid),vout,destaddr,dstr(val),bits256_str(str2,txid2),vout2,destaddr2,dstr(val2),coinaddr,dstr(value),dstr(value2)); - return(0); - }*/ - utxo = calloc(1,sizeof(*utxo)); - utxo->S.profitmargin = profitmargin; - utxo->pubkey = pubkey; - safecopy(utxo->coin,symbol,sizeof(utxo->coin)); - safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); - safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); - utxo->payment.txid = txid; - utxo->payment.vout = vout; - utxo->payment.value = value; - utxo->S.satoshis = tmpsatoshis; - if ( (utxo->iambob= iambob) != 0 ) - { - utxo->deposit.txid = txid2; - utxo->deposit.vout = vout2; - utxo->deposit.value = value2; - } - else - { - utxo->fee.txid = txid2; - utxo->fee.vout = vout2; - utxo->fee.value = value2; - } - LP_utxosetkey(utxo->key,txid,vout); - LP_utxosetkey(utxo->key2,txid2,vout2); - portable_mutex_lock(&LP_utxomutex); - HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); - if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) - HASH_ADD_KEYPTR(hh2,LP_utxoinfos2[iambob],utxo->key2,sizeof(utxo->key2),utxo); - portable_mutex_unlock(&LP_utxomutex); - if ( iambob != 0 ) - { - if ( mypubsock >= 0 ) - LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - else LP_utxo_clientpublish(utxo); - if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) - LP_mypeer->numutxos++; - } + utxo->fee.txid = txid2; + utxo->fee.vout = vout2; + utxo->fee.value = value2; + } + LP_utxosetkey(utxo->key,txid,vout); + LP_utxosetkey(utxo->key2,txid2,vout2); + portable_mutex_lock(&LP_utxomutex); + HASH_ADD_KEYPTR(hh,LP_utxoinfos[iambob],utxo->key,sizeof(utxo->key),utxo); + if ( _LP_utxo2find(iambob,txid2,vout2) == 0 ) + HASH_ADD_KEYPTR(hh2,LP_utxoinfos2[iambob],utxo->key2,sizeof(utxo->key2),utxo); + portable_mutex_unlock(&LP_utxomutex); + if ( iambob != 0 ) + { + if ( mypubsock >= 0 ) + LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); + else LP_utxo_clientpublish(utxo); + if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) + LP_mypeer->numutxos++; } return(utxo); } From 94a28caa02456c92bc44d929b8fe22d13ec870d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 11:19:24 +0300 Subject: [PATCH 868/910] Test --- iguana/exchanges/LP_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_bitcoin.c b/iguana/exchanges/LP_bitcoin.c index 9f3fae745..168b728ec 100644 --- a/iguana/exchanges/LP_bitcoin.c +++ b/iguana/exchanges/LP_bitcoin.c @@ -2039,7 +2039,7 @@ int32_t bitcoin_addr2rmd160(uint8_t taddr,uint8_t *addrtypep,uint8_t rmd160[20], { // validate with trailing hash, then remove hash hash = bits256_doublesha256(0,buf,20+offset); - *addrtypep = *buf; + *addrtypep = (taddr == 0) ? *buf : buf[1]; memcpy(rmd160,buf+offset,20); if ( (buf[20+offset]&0xff) == hash.bytes[31] && (buf[21+offset]&0xff) == hash.bytes[30] &&(buf[22+offset]&0xff) == hash.bytes[29] && (buf[23+offset]&0xff) == hash.bytes[28] ) { From a4784cf4f0cf6e7333a19cb6faa25bab5f554c24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 11:51:02 +0300 Subject: [PATCH 869/910] Test --- iguana/exchanges/LP_nativeDEX.c | 4 ++-- iguana/exchanges/LP_prices.c | 4 ++-- iguana/exchanges/LP_utxos.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index de858f992..bc5a1ac9e 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -292,8 +292,8 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); - else if ( strcmp(utxo->coin,"HUSH") == 0 ) - printf("lasttime set %s\n",bits256_str(str,utxo->payment.txid)); + //else if ( strcmp(utxo->coin,"HUSH") == 0 ) + // printf("lasttime set %s\n",bits256_str(str,utxo->payment.txid)); } } //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d swapentry\n",counter,LP_canbind); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index e0771709a..6ca36fd5d 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -522,8 +522,8 @@ int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) { if ( jobj(retjson,"error") == 0 ) { - if ( strcmp("HUSH",utxo->coin) == 0 ) - printf("clientpublish %s (%s)\n",peer->ipaddr,retstr); + //if ( strcmp("HUSH",utxo->coin) == 0 ) + // printf("clientpublish %s (%s)\n",peer->ipaddr,retstr); utxo->T.lasttime = (uint32_t)time(NULL); } free_json(retjson); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b64e8dfc8..b8c30c953 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -543,8 +543,8 @@ int32_t LP_utxosparse(char *destipaddr,uint16_t destport,char *retstr,uint32_t n //printf("parse.(%s)\n",jprint(item,0)); if ( (utxo= LP_utxoaddjson(1,-1,item)) != 0 ) { - if ( strcmp(utxo->coin,"HUSH") == 0 ) - printf("%s set lasttime (%s)\n",destipaddr,jprint(item,0)); + //if ( strcmp(utxo->coin,"HUSH") == 0 ) + // printf("%s set lasttime (%s)\n",destipaddr,jprint(item,0)); utxo->T.lasttime = now; } } From f90dbc3e4a2d412f483c11c164512fa6fd55f365 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Jun 2017 12:24:23 +0300 Subject: [PATCH 870/910] Test --- iguana/exchanges/LP_swap.c | 8 ++++++-- iguana/exchanges/LP_utxos.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_swap.c b/iguana/exchanges/LP_swap.c index 0079c1d35..6f0c8aa34 100644 --- a/iguana/exchanges/LP_swap.c +++ b/iguana/exchanges/LP_swap.c @@ -622,9 +622,11 @@ uint32_t LP_swapdata_rawtxsend(int32_t pairsock,struct basilisk_swap *swap,uint3 int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t sleeptime) { - char *retstr; cJSON *retjson=0; uint32_t expiration = (uint32_t)(time(NULL) + duration); + char *retstr; cJSON *retjson=0; uint32_t divisor=8,expiration = (uint32_t)(time(NULL) + duration); printf("wait %d:%d for SWAP.(r%u/q%u) to complete\n",duration,sleeptime,requestid,quoteid); sleep(10); + if ( sleeptime < divisor*60 ) + sleeptime = divisor * 60; while ( time(NULL) < expiration ) { if ( (retstr= basilisk_swapentry(requestid,quoteid)) != 0 ) @@ -638,7 +640,9 @@ int32_t LP_swapwait(uint32_t requestid,uint32_t quoteid,int32_t duration,int32_t } free(retstr); } - sleep(sleeptime); + sleep(sleeptime/divisor); + if ( divisor > 1 ) + divisor--; } if ( retjson != 0 ) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index b8c30c953..f86cbb0b0 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -689,6 +689,8 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr targetval = (depositval / 776) + 100000; else targetval = (depositval / 9) * 8 + 100000; //printf("i.%d %.8f target %.8f\n",i,dstr(depositval),dstr(targetval)); + if ( (i= LP_nearestvalue(values,n,targetval)) < 0 && iambob != 0 ) + targetval /= 4; if ( (i= LP_nearestvalue(values,n,targetval)) >= 0 ) { item = jitem(array,i); From 074dffaa72538d23b59dcaad12b6a7ae968846a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Jun 2017 20:24:51 +0300 Subject: [PATCH 871/910] Test --- iguana/exchanges/LP_coins.c | 2 +- iguana/exchanges/LP_utxos.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_coins.c b/iguana/exchanges/LP_coins.c index e8e35f882..73a77a3df 100644 --- a/iguana/exchanges/LP_coins.c +++ b/iguana/exchanges/LP_coins.c @@ -266,7 +266,7 @@ struct iguana_info *LP_coinfind(char *symbol) } // "coins":[{"coin":"", "rpcport":pppp}, {"coin":"LTC", "name":"litecoin", "rpcport":9332, "pubtype":48, "p2shtype":5, "wiftype":176, "txfee":100000 }] -// {"coin":"HUSH", "name":"hushcoin", "rpcport":8822, "taddr":28, "pubtype":184, "p2shtype":189, "wiftype":128, "txfee":10000 } +// {"coin":"HUSH", "name":"hush", "rpcport":8822, "taddr":28, "pubtype":184, "p2shtype":189, "wiftype":128, "txfee":10000 } struct iguana_info *LP_coincreate(cJSON *item) { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index f86cbb0b0..de5ab7d29 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -745,6 +745,7 @@ bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguan { coin->counter++; bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); + LP_importprivkey(coin->symbol,tmpstr,"",0); bitcoin_addr2rmd160(coin->taddr,&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) From 58bbd9396b18ca04831c41e7600fc9b729118e4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Jun 2017 22:09:41 +0300 Subject: [PATCH 872/910] Test --- iguana/exchanges/LP_utxos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index de5ab7d29..e5c438677 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -745,7 +745,8 @@ bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguan { coin->counter++; bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); - LP_importprivkey(coin->symbol,tmpstr,"",0); + if ( coin->inactive == 0 ) + LP_importprivkey(coin->symbol,tmpstr,"",0); bitcoin_addr2rmd160(coin->taddr,&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) From 25978c585495efac7e64c250df1ce77f5ae00400 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 16:49:01 +0300 Subject: [PATCH 873/910] Test --- iguana/exchanges/LP_nativeDEX.c | 2 +- iguana/exchanges/LP_utxos.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index bc5a1ac9e..38ea5550c 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -288,7 +288,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int } HASH_ITER(hh,LP_utxoinfos[1],utxo,utmp) { - char str[65]; + //char str[65]; LP_utxo_spentcheck(pubsock,utxo,profitmargin); if ( utxo->T.lasttime == 0 ) LP_utxo_clientpublish(utxo); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index e5c438677..5f0506b26 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -407,15 +407,18 @@ char *LP_spentcheck(cJSON *argjson) struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - uint64_t val,val2=0,tmpsatoshis; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + uint64_t val,val2=0,tmpsatoshis,bigtxfee = 100000; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); return(0); } - if ( iambob != 0 && value2 < 9 * (value >> 3) + 100000 ) // big txfee padding - tmpsatoshis = (((value2 - 100000) / 9) << 3); - else tmpsatoshis = value; + if ( iambob != 0 && value2 < 9 * (value >> 3) + bigtxfee ) // big txfee padding + { + if ( value2 > bigtxfee+20000 ) + tmpsatoshis = (((value2 - bigtxfee) / 9) << 3); + else return(0); + } else tmpsatoshis = value; char str[65],str2[65],dispflag = (iambob == 0); if ( iambob == 0 && bits256_cmp(pubkey,LP_mypubkey) != 0 ) { @@ -745,12 +748,12 @@ bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguan { coin->counter++; bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); - if ( coin->inactive == 0 ) - LP_importprivkey(coin->symbol,tmpstr,"",0); bitcoin_addr2rmd160(coin->taddr,&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) + //if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); + if ( coin->inactive == 0 ) + printf("importprivkey: %s\n",jprint(LP_importprivkey(coin->symbol,tmpstr,"",0),1)); if ( counter++ == 0 ) { bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); From d159adcca1140e5a0b461fefe65a78ebec778e96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 16:50:06 +0300 Subject: [PATCH 874/910] 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 5f0506b26..1673a5964 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -753,7 +753,7 @@ bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguan //if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( coin->inactive == 0 ) - printf("importprivkey: %s\n",jprint(LP_importprivkey(coin->symbol,tmpstr,"",0),1)); + printf("importprivkey: %s\n",jprint(LP_importprivkey(coin->symbol,tmpstr,"",-1),1)); if ( counter++ == 0 ) { bitcoin_priv2wif(USERPASS_WIFSTR,privkey,188); From 51dcc6a2e1f31b6d012d5728539a4111b64ba94c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 17:52:59 +0300 Subject: [PATCH 875/910] Test --- iguana/exchanges/LP_include.h | 1 + iguana/exchanges/LP_ordermatch.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 0036bb5fc..e521aad1b 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -36,6 +36,7 @@ #define LP_AUTOTRADE_TIMEOUT 3 #define LP_MIN_TXFEE 10000 #define LP_MINVOL 3 +#define LP_MINCLIENTVOL 6 #define LP_DEXFEE(destsatoshis) ((destsatoshis) / INSTANTDEX_INSURANCEDIV) #define LP_DEPOSITSATOSHIS(satoshis) ((satoshis) + (satoshis >> 3)) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 7d16f4b6b..390374762 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -273,7 +273,7 @@ double LP_quote_validate(struct LP_utxoinfo **autxop,struct LP_utxoinfo **butxop printf("utxo payment %.8f is less than half covered by Q %.8f\n",dstr(srcvalue),dstr(qp->satoshis)); return(-12); } - if ( qp->destsatoshis < (destvalue >> LP_MINVOL) ) + if ( qp->destsatoshis < (destvalue >> LP_MINCLIENTVOL) ) { printf("destsatoshis %.8f is less than half of value %.8f\n",dstr(qp->destsatoshis),dstr(destvalue)); return(-13); @@ -596,7 +596,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; satoshis = destsatoshis / price; - if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis < butxo->payment.value-txfee ) + if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis < butxo->payment.value-txfee ) { printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; @@ -608,7 +608,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> LP_MINVOL),destsatoshis/price > (butxo->S.satoshis >> LP_MINVOL),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> LP_MINCLIENTVOL),destsatoshis/price > (butxo->S.satoshis >> LP_MINVOL),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } else { From b30266ba04386db1a8e96d14e03285da6896776a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 17:57:33 +0300 Subject: [PATCH 876/910] 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 390374762..c66ab3565 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -608,7 +608,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",destsatoshis > (autxo->payment.value >> LP_MINCLIENTVOL),destsatoshis/price > (butxo->S.satoshis >> LP_MINVOL),metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d %d %d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",metric < 1.2,destsatoshis > desttxfee,destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL),satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL),satoshis < butxo->payment.value-txfee,metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); } else { From 27b1c568a8b24fb9d3dad01bd1af8679a4b4327a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 17:59:53 +0300 Subject: [PATCH 877/910] Test --- iguana/exchanges/LP_ordermatch.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c66ab3565..c97754351 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -608,7 +608,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi bestmetric = metric; printf("set best!\n"); } - } else printf("skip.(%d %d %d %d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f\n",metric < 1.2,destsatoshis > desttxfee,destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL),satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL),satoshis < butxo->payment.value-txfee,metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee)); + } else printf("skip.(%d %d %d %d %d) metric %f destsatoshis %.8f value %.8f destvalue %.8f txfees %.8f %.8f sats %.8f\n",metric < 1.2,destsatoshis > desttxfee,destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL),satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL),satoshis < butxo->payment.value-txfee,metric,dstr(destsatoshis),dstr(butxo->S.satoshis),dstr(autxo->payment.value),dstr(txfee),dstr(desttxfee),dstr(satoshis)); } else { diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 1673a5964..37160a1b8 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -750,7 +750,7 @@ bits256 LP_privkeycalc(void *ctx,uint8_t *pubkey33,bits256 *pubkeyp,struct iguan bitcoin_priv2wif(tmpstr,privkey,coin->wiftype); bitcoin_addr2rmd160(coin->taddr,&tmptype,rmd160,coin->smartaddr); LP_privkeyadd(privkey,rmd160); - //if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) + if ( coin->pubtype != 60 || strcmp(coin->symbol,"KMD") == 0 ) printf("%s (%s) %d wif.(%s) (%s)\n",coin->symbol,coin->smartaddr,coin->pubtype,tmpstr,passphrase); if ( coin->inactive == 0 ) printf("importprivkey: %s\n",jprint(LP_importprivkey(coin->symbol,tmpstr,"",-1),1)); From c9977816bfbf6fb9ebecfe279c4dbca1b551a627 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 18:01:36 +0300 Subject: [PATCH 878/910] Test --- iguana/exchanges/LP_ordermatch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index c97754351..f6f54b8c5 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -595,8 +595,8 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; - satoshis = destsatoshis / price; - if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis < butxo->payment.value-txfee ) + satoshis = destsatoshis / price + 0.0000000049; + if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis <= butxo->payment.value-txfee ) { printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); metric = dstr(destsatoshis) * metric * metric * metric; From db91e5ff20c96dcc6f44aec6961c2070d9008272 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 18:09:50 +0300 Subject: [PATCH 879/910] 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 f6f54b8c5..d8e108841 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -595,7 +595,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi destsatoshis = (butxo->S.satoshis * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; - satoshis = destsatoshis / price + 0.0000000049; + satoshis = (destsatoshis / price + 0.0000000049) - txfee; if ( metric < 1.2 && destsatoshis > desttxfee && destsatoshis-desttxfee > (autxo->payment.value >> LP_MINCLIENTVOL) && satoshis-txfee > (butxo->S.satoshis >> LP_MINVOL) && satoshis <= butxo->payment.value-txfee ) { printf("value %.8f price %.8f/%.8f best %.8f destsatoshis %.8f * metric %.8f -> (%f)\n",dstr(autxo->payment.value),price,bestprice,bestmetric,dstr(destsatoshis),metric,dstr(destsatoshis) * metric * metric * metric); From 4286403f6803c02863956f8a4429ce25b1d1b3b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Jun 2017 18:26:49 +0300 Subject: [PATCH 880/910] 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 d8e108841..d2df17e54 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -592,7 +592,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi metric = price / bestprice; if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && (long long)(vol*SATOSHIDEN) == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) { - destsatoshis = (butxo->S.satoshis * price); + destsatoshis = ((butxo->S.satoshis - txfee) * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) destsatoshis = autxo->payment.value-desttxfee-1; satoshis = (destsatoshis / price + 0.0000000049) - txfee; From 7cd19bb1c503603c819cf2c094f45d41526ce4ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Jun 2017 13:27:21 +0300 Subject: [PATCH 881/910] Test --- iguana/exchanges/client | 3 ++- iguana/exchanges/run | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 494e686c6..9c3f3cdfa 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -5,7 +5,8 @@ git pull; ./m_mm; ./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, -{\"active\":1,\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, +{\"active\":0,\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, +{\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, diff --git a/iguana/exchanges/run b/iguana/exchanges/run index d0e1e557f..e02aa5e4a 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -2,6 +2,7 @@ source randval pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, {\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, +{\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"coin\":\"DGB\", \"name\":\"digibyte\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":10000}, {\"coin\":\"MZC\", \"name\":\"mazacoin\", \"pubtype\":50, \"p2shtype\":9, \"wiftype\":224, \"txfee\":0}, {\"coin\":\"SYS\", \"name\":\"syscoin\", \"pubtype\":0, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000}, From 23903882df5f51744bbc51f8c1244678fc002d53 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 10:40:43 +0300 Subject: [PATCH 882/910] Blacklisting --- iguana/exchanges/LP_include.h | 4 ++-- iguana/exchanges/LP_ordermatch.c | 12 ++++++++---- iguana/exchanges/LP_prices.c | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index e521aad1b..43e9a9508 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -24,7 +24,7 @@ #define LP_COMMAND_SENDSOCK NN_PUSH #define LP_COMMAND_RECVSOCK NN_PULL - +#define LP_MAXPUBKEY_ERRORS 3 #define PSOCK_KEEPALIVE 600 #define MAINLOOP_PERSEC 10 #define MAX_PSOCK_PORT 60000 @@ -164,7 +164,7 @@ struct iguana_info struct _LP_utxoinfo { bits256 txid; uint64_t value; int32_t vout; }; -struct LP_utxostats { uint32_t lasttime,errors,swappending,spentflag,lastspentcheck; }; +struct LP_utxostats { uint32_t lasttime,errors,swappending,spentflag,lastspentcheck,bestflag; }; struct LP_utxobob { struct _LP_utxoinfo utxo,deposit; }; diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index d2df17e54..d5d4ca042 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -554,7 +554,7 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { - int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; + int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; struct LP_pubkeyinfo *pubp; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) @@ -581,7 +581,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi if ( price > maxprice ) price = maxprice; pubkey = jbits256(item,"pubkey"); - if ( bits256_cmp(pubkey,LP_mypubkey) != 0 ) + if ( bits256_cmp(pubkey,LP_mypubkey) != 0 && (pubp= LP_pubkeyadd(pubkey)) != 0 && pubp->numerrors < LP_MAXPUBKEY_ERRORS ) { if ( bestprice == 0. ) // assumes price ordered asks bestprice = price; @@ -590,7 +590,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi vout = jint(item,"vout"); vol = jdouble(item,"volume"); metric = price / bestprice; - if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && (long long)(vol*SATOSHIDEN) == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 ) + if ( (butxo= LP_utxofind(1,txid,vout)) != 0 && (long long)(vol*SATOSHIDEN) == butxo->S.satoshis && LP_isavailable(butxo) > 0 && LP_ismine(butxo) == 0 && butxo->T.bestflag == 0 ) { destsatoshis = ((butxo->S.satoshis - txfee) * price); if ( destsatoshis > autxo->payment.value-desttxfee-1 ) @@ -630,6 +630,7 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi return(clonestr("{\"error\":\"cant set ordermatch quote\"}")); if ( LP_quotedestinfo(&Q,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); + bestutxo->T.bestflag = (uint32_t)time(NULL); price = LP_query(ctx,myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); if ( price > SMALLVAL ) @@ -646,8 +647,11 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi sleep(1); } if ( autxo->S.swap == 0 ) + { + if ( (pubp= LP_pubkeyadd(bestutxo->pubkey)) != 0 ) + pubp->numerrors++; jaddstr(bestitem,"status","couldnt establish connection"); - else jaddstr(bestitem,"status","connected"); + } else jaddstr(bestitem,"status","connected"); jaddnum(bestitem,"quotedprice",price); jaddnum(bestitem,"maxprice",maxprice); jaddnum(bestitem,"requestid",Q.R.requestid); diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 6ca36fd5d..46d15fcda 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -46,7 +46,7 @@ struct LP_pubkeyinfo UT_hash_handle hh; bits256 pubkey; double matrix[LP_MAXPRICEINFOS][LP_MAXPRICEINFOS]; - uint32_t timestamp,istrusted; + uint32_t timestamp,istrusted,numerrors; } *LP_pubkeyinfos; struct LP_priceinfo *LP_priceinfofind(char *symbol) From e2f1248ea3f64f63052055432dea8e1cec1f76d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 10:45:23 +0300 Subject: [PATCH 883/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_rpc.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 43e9a9508..5050388a3 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -25,7 +25,7 @@ #define LP_COMMAND_RECVSOCK NN_PULL #define LP_MAXPUBKEY_ERRORS 3 -#define PSOCK_KEEPALIVE 600 +#define PSOCK_KEEPALIVE 3600 #define MAINLOOP_PERSEC 10 #define MAX_PSOCK_PORT 60000 #define MIN_PSOCK_PORT 10000 diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 242f0fcf5..d71800242 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -134,10 +134,10 @@ char *issue_LP_psock(char *destip,uint16_t destport,int32_t ispaired) uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired) { uint16_t publicport = 0; char *retstr,*addr; cJSON *retjson; struct LP_peerinfo *peer,*tmp; - connectaddr[0] = publicaddr[0] = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { - if ( (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) + connectaddr[0] = publicaddr[0] = 0; + if ( peer->errors < LP_MAXPEER_ERRORS && (retstr= issue_LP_psock(peer->ipaddr,peer->port,ispaired)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { From 97580c9ea596768ad0b10979cf2988c071945561 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 10:49:14 +0300 Subject: [PATCH 884/910] Test --- iguana/exchanges/LP_prices.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 46d15fcda..27751556a 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -546,6 +546,8 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * { if ( pubp == 0 || bits256_cmp(pubp->pubkey,utxo->pubkey) != 0 ) pubp = LP_pubkeyfind(utxo->pubkey); + if ( pubp->numerrors >= LP_MAXPUBKEY_ERRORS ) + continue; //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); if ( strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && pubp != 0 && (price= pubp->matrix[baseid][relid]) > SMALLVAL ) { From 134840f1dba0d9efaf691ae9d0f7156afd722978 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:04:04 +0300 Subject: [PATCH 885/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 27751556a..1633b2d7c 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -546,7 +546,7 @@ int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char * { if ( pubp == 0 || bits256_cmp(pubp->pubkey,utxo->pubkey) != 0 ) pubp = LP_pubkeyfind(utxo->pubkey); - if ( pubp->numerrors >= LP_MAXPUBKEY_ERRORS ) + if ( pubp != 0 && pubp->numerrors >= LP_MAXPUBKEY_ERRORS ) continue; //char str[65],str2[65]; printf("check utxo.%s/v%d from %s\n",bits256_str(str,utxo->payment.txid),utxo->payment.vout,bits256_str(str2,utxo->pubkey)); if ( strcmp(base,utxo->coin) == 0 && LP_isavailable(utxo) > 0 && pubp != 0 && (price= pubp->matrix[baseid][relid]) > SMALLVAL ) From 898227421e5c69c278972037c7eb30f4ab71bcf8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:37:29 +0300 Subject: [PATCH 886/910] Test --- iguana/exchanges/LP_commands.c | 3 +++ iguana/exchanges/LP_forwarding.c | 23 +++++++++++++++++++++-- iguana/exchanges/LP_nativeDEX.c | 18 +++++++++--------- iguana/exchanges/LP_ordermatch.c | 4 +++- iguana/exchanges/LP_peers.c | 10 ++++++++++ 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index dda9c8d1d..a07054c5c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -77,6 +77,7 @@ orderbook(base, rel)\n\ getprices(base, rel)\n\ trust(pubkey, trust)\n\ register(pubkey,pushaddr)\n\ +registerall(numnodes)\n\ lookup(pubkey)\n\ forward(pubkey,method2,)\n\ forward(pubkey,method2=publish,)\n\ @@ -199,6 +200,8 @@ forwardhex(pubkey,hex)\n\ return(LP_prices()); else if ( strcmp(method,"orderbook") == 0 ) return(LP_orderbook(base,rel)); + else if ( strcmp(method,"registerall") == 0 ) + return(LP_registerall(jint(argjson,"numnodes"))); else if ( strcmp(method,"forward") == 0 ) { cJSON *reqjson; diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index e7b733505..c56170d67 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -149,13 +149,13 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) } } -void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) +int32_t LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) { char *retstr,ipaddr[64]; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t j,n=0,retval = -1; if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) { printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); - return; + return(0); } for (j=0; pushaddr[j]!=0; j++) if ( pushaddr[j] >= '0' && pushaddr[j] <= '9' ) @@ -178,6 +178,25 @@ void LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int3 if ( retval == 0 ) break; } + return(n); +} + +char *LP_registerall(int32_t numnodes) +{ + int32_t i,maxnodes,n=0; cJSON *retjson; + if ( numnodes < sizeof(default_LPnodes)/sizeof(*default_LPnodes) ) + numnodes = (int32_t)(sizeof(default_LPnodes)/sizeof(*default_LPnodes)); + if ( (maxnodes= LP_numpeers()) < numnodes ) + numnodes = maxnodes; + for (i=0; i= numnodes ) + break; + retjson = cJSON_CreateObject(); + if ( i < numnodes ) + jaddstr(retjson,"error","not enough nodes"); + jaddnum(retjson,"numnodes",numnodes); + jaddnum(retjson,"registered",n); + return(jprint(retjson,1)); } cJSON *LP_dereference(cJSON *argjson,char *excludemethod) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 38ea5550c..16156cd19 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -30,12 +30,12 @@ struct LP_forwardinfo *LP_forwardinfos; char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; -char USERPASS[65],USERPASS_WIFSTR[64],LP_myipaddr[64],USERHOME[512] = { "/root" }; +char USERPASS[65],USERPASS_WIFSTR[64],LP_myipaddr[64],LP_publicaddr[64],USERHOME[512] = { "/root" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // uint32_t LP_deadman_switch; -uint16_t LP_fixed_pairport; +uint16_t LP_fixed_pairport,LP_publicport; int32_t LP_mypubsock = -1; int32_t USERPASS_COUNTER,IAMLP = 0; double LP_profitratio = 1.; @@ -73,8 +73,8 @@ char *blocktrail_listtransactions(char *symbol,char *coinaddr,int32_t num,int32_ #include "LP_swap.c" #include "LP_peers.c" #include "LP_utxos.c" -#include "LP_ordermatch.c" #include "LP_forwarding.c" +#include "LP_ordermatch.c" #include "LP_commands.c" char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) @@ -240,11 +240,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int if ( mypeer == 0 ) myipaddr = "127.0.0.1"; //if ( LP_canbind == 0 ) printf("counter.%d canbind.%d peers\n",counter,LP_canbind); - numpeers = 0; - HASH_ITER(hh,LP_peerinfos,peer,tmp) - { - numpeers++; - } + numpeers = LP_numpeers(); HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) @@ -275,7 +271,9 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int LP_myutxo_updates(ctx,pubsock,passphrase,profitmargin); if ( lastforward < now-3600 ) { - LP_forwarding_register(LP_mypubkey,pushaddr,pushport,10); + if ( (retstr= LP_registerall(0)) != 0 ) + free(retstr); + //LP_forwarding_register(LP_mypubkey,pushaddr,pushport,10); lastforward = now; } } @@ -500,6 +498,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit nn_close(pullsock); pullsock = LP_initpublicaddr(ctx,&mypullport,pushaddr,myipaddr,mypullport,0); LP_deadman_switch = (uint32_t)time(NULL); + strcpy(LP_publicaddr,pushaddr); + LP_publicport = mypullport; LP_forwarding_register(LP_mypubkey,pushaddr,mypullport,MAX_PSOCK_PORT); } } diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index d5d4ca042..6a2415236 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -554,7 +554,7 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,char *base,char *rel,double maxprice,double volume,int32_t timeout) { - int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; struct LP_pubkeyinfo *pubp; + int64_t satoshis,destsatoshis,desttxfee,txfee,bestdestsatoshis=0; bits256 txid,pubkey; char *obookstr,*retstr; cJSON *orderbook,*asks,*item,*bestitem=0; struct LP_utxoinfo *autxo,*butxo,*bestutxo = 0; int32_t i,vout,numasks,DEXselector=0; uint32_t expiration; double ordermatchprice,bestmetric,metric,bestprice=0.,vol,price; struct LP_quoteinfo Q; struct LP_pubkeyinfo *pubp; if ( maxprice <= 0. || volume <= 0. || LP_priceinfofind(base) == 0 || LP_priceinfofind(rel) == 0 ) return(clonestr("{\"error\":\"invalid parameter\"}")); if ( (autxo= LP_utxo_bestfit(rel,SATOSHIDEN * volume)) == 0 ) @@ -631,6 +631,8 @@ char *LP_autotrade(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargi if ( LP_quotedestinfo(&Q,autxo->payment.txid,autxo->payment.vout,autxo->fee.txid,autxo->fee.vout,LP_mypubkey,autxo->coinaddr) < 0 ) return(clonestr("{\"error\":\"cant set ordermatch quote info\"}")); bestutxo->T.bestflag = (uint32_t)time(NULL); + if ( (retstr= LP_registerall(0)) != 0 ) + free(retstr); price = LP_query(ctx,myipaddr,mypubsock,profitmargin,"request",&Q); bestitem = LP_quotejson(&Q); if ( price > SMALLVAL ) diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 7207e53a7..7193a522c 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -182,3 +182,13 @@ void LP_peersquery(struct LP_peerinfo *mypeer,int32_t mypubsock,char *destipaddr } } } + +int32_t LP_numpeers() +{ + struct LP_peerinfo *peer,*tmp; int32_t numpeers = 0; + HASH_ITER(hh,LP_peerinfos,peer,tmp) + { + numpeers++; + } + return(numpeers); +} From c9e7ec42a3907d1239f49a195ebdb556ca11aa2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:38:36 +0300 Subject: [PATCH 887/910] Test --- iguana/exchanges/registerall | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 iguana/exchanges/registerall diff --git a/iguana/exchanges/registerall b/iguana/exchanges/registerall new file mode 100755 index 000000000..9024b8230 --- /dev/null +++ b/iguana/exchanges/registerall @@ -0,0 +1,3 @@ + +source userpass +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"registerall\",\"numnodes\":10}" From eac8a5aefb5c3d590f7af92f6e49ac5c6f787ddb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:39:42 +0300 Subject: [PATCH 888/910] 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 5050388a3..7774a0070 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -30,7 +30,7 @@ #define MAX_PSOCK_PORT 60000 #define MIN_PSOCK_PORT 10000 -#define LP_HTTP_TIMEOUT 1 +#define LP_HTTP_TIMEOUT 2 // 1 is too small due to edge cases of time(NULL) #define LP_MAXPEER_ERRORS 3 #define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 From ba412011d20ceccbafd56e69a4939586c3564011 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:42:57 +0300 Subject: [PATCH 889/910] Test --- iguana/exchanges/LP_forwarding.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index c56170d67..dc33c3ea6 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -149,24 +149,24 @@ char *LP_register(bits256 pubkey,char *ipaddr,uint16_t port) } } -int32_t LP_forwarding_register(bits256 pubkey,char *pushaddr,uint16_t pushport,int32_t max) +int32_t LP_forwarding_register(bits256 pubkey,char *publicaddr,uint16_t publicport,int32_t max) { char *retstr,ipaddr[64]; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t j,n=0,retval = -1; - if ( pushaddr == 0 || pushaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) + if ( publicaddr == 0 || publicaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) { - printf("LP_forwarding_register illegal pushaddr or null pubkey\n"); + char str[65]; printf("LP_forwarding_register illegal publicaddr.(%s) or null pubkey (%s)\n",publicaddr,bits256_str(str,pubkey)); return(0); } - for (j=0; pushaddr[j]!=0; j++) - if ( pushaddr[j] >= '0' && pushaddr[j] <= '9' ) + for (j=0; publicaddr[j]!=0; j++) + if ( publicaddr[j] >= '0' && publicaddr[j] <= '9' ) break; - parse_ipaddr(ipaddr,pushaddr+j); + parse_ipaddr(ipaddr,publicaddr+j); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("register.(%s) %s %u with (%s)\n",pushaddr,ipaddr,pushport,peer->ipaddr); - if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,ipaddr,pushport)) != 0 ) + printf("register.(%s) %s %u with (%s)\n",publicaddr,ipaddr,publicport,peer->ipaddr); + if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,ipaddr,publicport)) != 0 ) { - //printf("[%s] LP_register.(%s) returned.(%s)\n",pushaddr,peer->ipaddr,retstr); + //printf("[%s] LP_register.(%s) returned.(%s)\n",publicaddr,peer->ipaddr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( jint(retjson,"registered") != 0 && ++n >= max ) From e91ca453e31ea9654a78dafcaa569d6fdd846b75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:44:57 +0300 Subject: [PATCH 890/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_nativeDEX.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index dc33c3ea6..3c506c826 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -154,7 +154,7 @@ int32_t LP_forwarding_register(bits256 pubkey,char *publicaddr,uint16_t publicpo char *retstr,ipaddr[64]; cJSON *retjson; struct LP_peerinfo *peer,*tmp; int32_t j,n=0,retval = -1; if ( publicaddr == 0 || publicaddr[0] == 0 || bits256_nonz(pubkey) == 0 ) { - char str[65]; printf("LP_forwarding_register illegal publicaddr.(%s) or null pubkey (%s)\n",publicaddr,bits256_str(str,pubkey)); + char str[65]; printf("LP_forwarding_register illegal publicaddr.(%s):%u or null pubkey (%s)\n",publicaddr,publicport,bits256_str(str,pubkey)); return(0); } for (j=0; publicaddr[j]!=0; j++) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 16156cd19..7e748a743 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -470,6 +470,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit } LP_initpeers(pubsock,mypeer,myipaddr,myport,jstr(argjson,"seednode"),profitmargin); pullsock = LP_initpublicaddr(ctx,&mypullport,pushaddr,myipaddr,mypullport,0); + strcpy(LP_publicaddr,pushaddr); + LP_publicport = mypullport; LP_deadman_switch = (uint32_t)time(NULL); printf("my command address is (%s) pullsock.%d pullport.%u\n",pushaddr,pullsock,mypullport); LP_initcoins(ctx,pubsock,jobj(argjson,"coins"),passphrase); From 72d1f7daaf6e77341acbdfd41be966eb98a687b2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:48:14 +0300 Subject: [PATCH 891/910] Test --- iguana/exchanges/LP_forwarding.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 3c506c826..cf655535c 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -192,10 +192,11 @@ char *LP_registerall(int32_t numnodes) if ( (n= LP_forwarding_register(LP_mypubkey,LP_publicaddr,LP_publicport,numnodes)) >= numnodes ) break; retjson = cJSON_CreateObject(); - if ( i < numnodes ) + if ( i == numnodes ) jaddstr(retjson,"error","not enough nodes"); jaddnum(retjson,"numnodes",numnodes); jaddnum(retjson,"registered",n); + jaddnum(retjson,"iters",i); return(jprint(retjson,1)); } From ac0e1ea593169edd41e914ae9570ad99526a4a18 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 11:58:59 +0300 Subject: [PATCH 892/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- iguana/exchanges/LP_include.h | 5 ++++- iguana/exchanges/LP_rpc.c | 8 +++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index cf655535c..588d2ea12 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -174,7 +174,7 @@ int32_t LP_forwarding_register(bits256 pubkey,char *publicaddr,uint16_t publicpo free_json(retjson); } free(retstr); - } else printf("error registering with %s\n",peer->ipaddr); + } else printf("timeout registering with %s errs.%d good.%d\n",peer->ipaddr,peer->errors,peer->good); if ( retval == 0 ) break; } diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 7774a0070..207f67afa 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -32,6 +32,9 @@ #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 100 +#define LP_PEERGOOD_ERRORDECAY 0.9 + #define LP_SWAPSTEP_TIMEOUT 3 #define LP_AUTOTRADE_TIMEOUT 3 #define LP_MIN_TXFEE 10000 @@ -191,7 +194,7 @@ struct LP_peerinfo UT_hash_handle hh; uint64_t ip_port; double profitmargin; - uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos,lastpeers,diduquery; + uint32_t ipbits,errortime,errors,numpeers,numutxos,lasttime,connected,lastutxos,lastpeers,diduquery,good; int32_t pushsock,subsock; uint16_t port; char ipaddr[64]; diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index d71800242..547a05be2 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -23,14 +23,16 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) char *retstr = 0; int32_t maxerrs; struct LP_peerinfo *peer = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); maxerrs = LP_MAXPEER_ERRORS; - if ( peer == 0 || peer->errors < maxerrs ) + if ( peer == 0 || (peer->errors < maxerrs && peer->good < LP_MINPEER_GOOD) ) { if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) { if ( peer != 0 ) + { peer->errors++; - else printf("%s error on (%s:%u) without peer\n",debugstr,destip,port); - } + peer->good *= LP_PEERGOOD_ERRORDECAY; + } else printf("%s error on (%s:%u) without peer\n",debugstr,destip,port); + } else peer->good++; } return(retstr); } From 2851ea07edcde596b0ee8d2b9e01b4a743d0b9ee Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 12:08:30 +0300 Subject: [PATCH 893/910] Test --- iguana/exchanges/LP_rpc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 547a05be2..ec45c7fd1 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -32,7 +32,9 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) peer->errors++; peer->good *= LP_PEERGOOD_ERRORDECAY; } else printf("%s error on (%s:%u) without peer\n",debugstr,destip,port); - } else peer->good++; + } + else if ( peer != 0 ) + peer->good++; } return(retstr); } From 4d30edaaeb239b6fbcb87bcffe21811e243ac816 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 12:16:36 +0300 Subject: [PATCH 894/910] 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 207f67afa..62da124fb 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -32,7 +32,7 @@ #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 100 +#define LP_MINPEER_GOOD 20 #define LP_PEERGOOD_ERRORDECAY 0.9 #define LP_SWAPSTEP_TIMEOUT 3 From fe2a204b6e8fe1918cf1afbb6e11030783cff312 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 12:18:26 +0300 Subject: [PATCH 895/910] 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 7e748a743..b2fd99459 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -243,6 +243,12 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int numpeers = LP_numpeers(); HASH_ITER(hh,LP_peerinfos,peer,tmp) { + if ( peer->errors >= LP_MAXPEER_ERRORS ) + { + if ( (rand() % 10000) == 0 ) + peer->errors--; + else continue; + } if ( now > peer->lastpeers+60 && peer->numpeers > 0 && (peer->numpeers != numpeers || (rand() % 10000) == 0) ) { if ( IAMLP != 0 ) From 90ec75f6565c07faa16dc7aac5c32a2c5058c473 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 12:27:42 +0300 Subject: [PATCH 896/910] 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 ec45c7fd1..dfd48bcda 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -23,7 +23,7 @@ char *LP_issue_curl(char *debugstr,char *destip,uint16_t port,char *url) char *retstr = 0; int32_t maxerrs; struct LP_peerinfo *peer = 0; peer = LP_peerfind((uint32_t)calc_ipbits(destip),port); maxerrs = LP_MAXPEER_ERRORS; - if ( peer == 0 || (peer->errors < maxerrs && peer->good < LP_MINPEER_GOOD) ) + if ( peer == 0 || (peer->errors < maxerrs || peer->good >= LP_MINPEER_GOOD) ) { if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) == 0 ) { From 7d2b7a113b6978a37543ad5d3279d61dc58a052e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 13:57:03 +0300 Subject: [PATCH 897/910] Test --- iguana/exchanges/LP_forwarding.c | 21 ++++++++++++++------- iguana/exchanges/LP_nativeDEX.c | 15 +++++++++------ iguana/exchanges/LP_network.c | 28 +++++++++++----------------- iguana/exchanges/LP_ordermatch.c | 24 ++++++++++++++++-------- iguana/exchanges/LP_peers.c | 5 ++++- iguana/exchanges/LP_utxos.c | 13 ++++++++----- 6 files changed, 62 insertions(+), 44 deletions(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 588d2ea12..98a6df18c 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -214,7 +214,7 @@ cJSON *LP_dereference(cJSON *argjson,char *excludemethod) char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) { - struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *retstr=0; cJSON *retjson=0,*argjson=0,*reqjson=0; + struct LP_forwardinfo *ptr=0; uint8_t *data; int32_t datalen=0,sentbytes=0; char *msg,*retstr=0; cJSON *retjson=0,*argjson=0,*reqjson=0; if ( hexstr == 0 || hexstr[0] == 0 ) return(clonestr("{\"error\":\"nohex\"}")); datalen = (int32_t)strlen(hexstr) >> 1; @@ -229,7 +229,10 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) retstr = LP_command_process(ctx,LP_mypeer != 0 ? LP_mypeer->ipaddr : "127.0.0.1",LP_mypubsock,reqjson,0,0,LP_profitratio - 1.); printf("LP_forwardhex.(%s) -> (%s)\n",jprint(reqjson,0),retstr!=0?retstr:""); if ( pubsock >= 0 ) - LP_send(pubsock,jprint(reqjson,0),0); + { + msg = jprint(reqjson,0); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,0); + } } else printf("LP_forwardhex couldnt parse (%s)\n",(char *)data); } else if ( (ptr= LP_forwardfind(pubkey)) != 0 ) @@ -237,7 +240,7 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) if ( ptr->pushsock >= 0 )//&& ptr->hello != 0 ) { printf("%s forwardhex.(%s)\n",ptr->pushaddr,(char *)data); - sentbytes = LP_send(ptr->pushsock,(char *)data,0); + sentbytes = LP_send(ptr->pushsock,(char *)data,datalen,0); } retjson = cJSON_CreateObject(); if ( sentbytes == datalen ) @@ -259,7 +262,10 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) { char str[65]; printf("couldnt find %s to forward to\n",bits256_str(str,pubkey)); if ( pubsock >= 0 ) - LP_send(pubsock,jprint(reqjson,0),0); + { + msg = jprint(reqjson,0); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,1); + } retstr = clonestr("{\"error\":\"notfound\"}"); } free(data); @@ -272,7 +278,7 @@ char *LP_forwardhex(void *ctx,int32_t pubsock,bits256 pubkey,char *hexstr) int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,bits256 pubkey,char *jsonstr,int32_t freeflag) { - struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson,*argjson; + struct LP_forwardinfo *ptr; struct LP_peerinfo *peer,*tmp; char *msg,*hexstr,*retstr; int32_t len,retval = -1; cJSON *retjson,*reqjson,*argjson; if ( jsonstr == 0 || jsonstr[0] == 0 ) return(-1); if ( bits256_nonz(pubkey) != 0 ) @@ -292,7 +298,7 @@ int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin, { printf("GOT FORWARDED.(%s) -> pushsock.%d\n",jsonstr,ptr->pushsock); len = (int32_t)strlen(jsonstr); - if ( LP_send(ptr->pushsock,jsonstr,0) == len+1 ) + if ( LP_send(ptr->pushsock,jsonstr,(int32_t)strlen(jsonstr)+1,0) == len+1 ) return(1); } } @@ -324,7 +330,8 @@ int32_t LP_forward(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin, jaddstr(reqjson,"hex",hexstr); jaddbits256(reqjson,"pubkey",pubkey); free(hexstr); - return(LP_send(peer->pushsock,jprint(reqjson,1),1)); + msg = jprint(reqjson,1); + return(LP_send(peer->pushsock,msg,(int32_t)strlen(msg)+1,1)); } else retval = -1; } if ( freeflag != 0 ) diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index b2fd99459..c5d00e332 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -88,7 +88,7 @@ char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson { //printf("%s PULL.[%d]-> (%s)\n",myipaddr != 0 ? myipaddr : "127.0.0.1",datalen,retstr); if ( pubsock >= 0 ) //strncmp("{\"error\":",retstr,strlen("{\"error\":")) != 0 && - LP_send(pubsock,retstr,0); + LP_send(pubsock,retstr,(int32_t)strlen(retstr)+1,0); } } return(retstr); @@ -96,7 +96,7 @@ char *LP_command_process(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock,double profitmargin,void *ptr,int32_t recvlen,int32_t recvsock) { - int32_t len,datalen=0; char *retstr=0,*jsonstr=0; cJSON *argjson,*reqjson; + int32_t len,datalen=0; char *msg,*retstr=0,*jsonstr=0; cJSON *argjson,*reqjson; if ( (datalen= is_hexstr((char *)ptr,0)) > 0 ) { datalen >>= 1; @@ -124,7 +124,10 @@ char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock, jdelete(argjson,"method2"); jaddstr(argjson,"method2","broadcast"); if ( pubsock >= 0 && (reqjson= LP_dereference(argjson,"publish")) != 0 ) - LP_send(pubsock,jprint(reqjson,1),1); + { + msg = jprint(reqjson,1); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,1); + } } else if ( (retstr= LP_command_process(ctx,myipaddr,pubsock,argjson,&((uint8_t *)ptr)[len],recvlen - len,profitmargin)) != 0 ) { @@ -137,13 +140,13 @@ char *LP_process_message(void *ctx,char *typestr,char *myipaddr,int32_t pubsock, if ( strcmp("PULL",typestr) == 0 ) { printf("%d got REQ.(%s) -> (%s)\n",recvsock,jprint(argjson,0),retstr); - LP_send(recvsock,retstr,0); + LP_send(recvsock,retstr,(int32_t)strlen(retstr)+1,0); } } else if ( strcmp("PULL",typestr) == 0 ) { printf("%d got REQ.(%s) -> null\n",recvsock,jprint(argjson,0)); - LP_send(recvsock,"{\"result\":null}",0); + LP_send(recvsock,"{\"result\":null}",(int32_t)strlen("{\"result\":null}")+1,0); } } free_json(argjson); @@ -322,7 +325,7 @@ int32_t LP_mainloop_iter(void *ctx,char *myipaddr,struct LP_peerinfo *mypeer,int char keepalive[128]; sprintf(keepalive,"{\"method\":\"keepalive\"}"); //printf("send keepalive to %s pullsock.%d\n",pushaddr,pullsock); - if ( LP_send(pullsock,keepalive,0) < 0 ) + if ( LP_send(pullsock,keepalive,(int32_t)strlen(keepalive)+1,0) < 0 ) { //LP_deadman_switch = 0; } diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index f63fc2438..7713c380b 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -34,9 +34,9 @@ char *nanomsg_transportname(int32_t bindflag,char *str,char *ipaddr,uint16_t por return(str); } -int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) +int32_t LP_send(int32_t sock,void *msg,int32_t sendlen,int32_t freeflag) { - int32_t sentbytes,len,i; struct nn_pollfd pfd; + int32_t sentbytes,i; struct nn_pollfd pfd; if ( sock < 0 ) { printf("LP_send.(%s) to illegal socket\n",msg); @@ -44,7 +44,7 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) free(msg); return(-1); } - len = (int32_t)strlen(msg) + 1; + //len = (int32_t)strlen(msg) + 1; for (i=0; i<1000; i++) // 1000 * (1 ms + 1000 us) = 2 seconds { pfd.fd = sock; @@ -52,8 +52,8 @@ int32_t LP_send(int32_t sock,char *msg,int32_t freeflag) //portable_mutex_lock(&LP_networkmutex); if ( nn_poll(&pfd,1,1) > 0 ) { - if ( (sentbytes= nn_send(sock,msg,len,0)) != len ) - printf("LP_send sent %d instead of %d\n",sentbytes,len); + if ( (sentbytes= nn_send(sock,msg,sendlen,0)) != sendlen ) + printf("LP_send sent %d instead of %d\n",sentbytes,sendlen); //else printf("SENT.(%s)\n",msg); if ( freeflag != 0 ) free(msg); @@ -105,7 +105,7 @@ void LP_psockloop(void *_ptr) { if ( size > 0 ) { - if ( (sentbytes= LP_send(sendsock,buf,0)) > 0 ) + if ( (sentbytes= LP_send(sendsock,buf,size,0)) > 0 ) { //printf("PSOCKS (%d %d %d) (%s) -> %d/%d bytes %s\n",ptr->publicsock,ptr->sendsock,sendsock,(char *)buf,size,sentbytes,ptr->sendaddr); } @@ -153,15 +153,9 @@ void LP_psockloop(void *_ptr) //printf("publicsock.%d %s has pollin\n",ptr->publicsock,ptr->publicaddr); if ( (size= nn_recv(ptr->publicsock,&buf,NN_MSG,0)) > 0 ) { - printf("keepalive.%u [%s] -> sendsock.%d\n",now,(char *)buf,ptr->sendsock); - cJSON *retjson; - if ( (retjson= cJSON_Parse((char *)buf)) != 0 ) - { - free_json(retjson); - ptr->lasttime = now; - sendsock = ptr->sendsock; - break; - } + ptr->lasttime = now; + sendsock = ptr->sendsock; + break; } } } @@ -375,11 +369,11 @@ int32_t nn_tests(void *ctx,int32_t pullsock,char *pushaddr,int32_t nnother) timeout = 1; nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); sprintf(msg,"{\"method\":\"nn_tests\",\"ipaddr\":\"%s\"}",pushaddr); - n = LP_send(sock,msg,0); + n = LP_send(sock,msg,(int32_t)strlen(msg)+1,0); sleep(3); LP_pullsock_check(ctx,&retstr,"127.0.0.1",-1,pullsock,0.); sprintf(msg,"{\"method\":\"nn_tests2\",\"ipaddr\":\"%s\"}",pushaddr); - m = LP_send(pullsock,msg,0); + m = LP_send(pullsock,msg,(int32_t)strlen(msg)+1,0); printf(">>>>>>>>>>>>>>>>>>>>>> sent %d+%d bytes -> pullsock.%d retstr.(%s)\n",n,m,pullsock,retstr!=0?retstr:""); if ( retstr != 0 ) { diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 6a2415236..9153fb449 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -178,7 +178,7 @@ char *LP_quotereceived(cJSON *argjson) char *LP_pricepings(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,char *base,char *rel,double price) { - bits256 zero; cJSON *reqjson = cJSON_CreateObject(); + bits256 zero; char *msg; cJSON *reqjson = cJSON_CreateObject(); jaddbits256(reqjson,"pubkey",LP_mypubkey); jaddstr(reqjson,"base",base); jaddstr(reqjson,"rel",rel); @@ -187,7 +187,8 @@ char *LP_pricepings(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin { jaddstr(reqjson,"method","postprice"); //printf("%d pricepings.(%s)\n",pubsock,jprint(reqjson,0)); - LP_send(pubsock,jprint(reqjson,1),1); + msg = jprint(reqjson,1); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,1); } else { @@ -296,7 +297,7 @@ int32_t LP_arrayfind(cJSON *array,bits256 txid,int32_t vout) double LP_query(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,char *method,struct LP_quoteinfo *qp) { - cJSON *reqjson; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; + cJSON *reqjson; char *msg; int32_t i,flag = 0; double price = 0.; struct LP_utxoinfo *utxo; if ( strcmp(method,"request") == 0 ) { if ( (utxo= LP_utxofind(0,qp->desttxid,qp->destvout)) != 0 && LP_ismine(utxo) > 0 && LP_isavailable(utxo) > 0 ) @@ -314,7 +315,8 @@ double LP_query(void *ctx,char *myipaddr,int32_t mypubsock,double profitmargin,c if ( IAMLP != 0 ) { jaddstr(reqjson,"method",method); - LP_send(LP_mypubsock,jprint(reqjson,1),1); + msg = jprint(reqjson,1); + LP_send(LP_mypubsock,msg,(int32_t)strlen(msg)+1,1); } else { @@ -372,7 +374,7 @@ int32_t LP_nanobind(void *ctx,char *pairstr) int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *myipaddr,char *base,char *rel,double profitmargin,double price,struct LP_quoteinfo *qp) { - char pairstr[512]; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; + char pairstr[512],*msg; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; printf("LP_connectstartbob.(%s) with.(%s) %s\n",myipaddr,jprint(argjson,0),LP_myipaddr); qp->quotetime = (uint32_t)time(NULL); if ( (coin= LP_coinfind(utxo->coin)) == 0 ) @@ -399,7 +401,10 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJ jaddnum(retjson,"quoteid",qp->R.quoteid); char str[65]; printf("BOB pubsock.%d sends to (%s)\n",pubsock,bits256_str(str,utxo->S.otherpubkey)); if ( pubsock >= 0 ) - LP_send(pubsock,jprint(retjson,0),1); + { + msg = jprint(retjson,0); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,1); + } jdelete(retjson,"method"); jaddstr(retjson,"method2","connected"); jaddstr(retjson,"method","forward"); @@ -492,7 +497,7 @@ char *LP_connectedalice(cJSON *argjson) // alice int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen,double profitmargin) { - char *method; cJSON *retjson; double qprice,price,bid,ask; struct LP_utxoinfo *autxo,*butxo; int32_t retval = -1; struct LP_quoteinfo Q; + char *method,*msg; cJSON *retjson; double qprice,price,bid,ask; struct LP_utxoinfo *autxo,*butxo; int32_t retval = -1; struct LP_quoteinfo Q; if ( (method= jstr(argjson,"method")) != 0 && (strcmp(method,"request") == 0 ||strcmp(method,"connect") == 0) ) { //printf("TRADECOMMAND.(%s)\n",jprint(argjson,0)); @@ -531,7 +536,10 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, jaddbits256(retjson,"pubkey",butxo->S.otherpubkey); jaddstr(retjson,"method","reserved"); if ( pubsock >= 0 ) - LP_send(pubsock,jprint(retjson,0),1); + { + msg = jprint(retjson,0); + LP_send(pubsock,msg,(int32_t)strlen(msg)+1,1); + } jdelete(retjson,"method"); jaddstr(retjson,"method2","reserved"); jaddstr(retjson,"method","forward"); diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 7193a522c..95c708348 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -114,7 +114,10 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char } else peer->numpeers = 1; // will become mypeer portable_mutex_unlock(&LP_peermutex); if ( mypubsock >= 0 ) - LP_send(mypubsock,jprint(LP_peerjson(peer),1),1); + { + char *msg = jprint(LP_peerjson(peer),1); + LP_send(mypubsock,msg,(int32_t)strlen(msg)+1,1); + } } } else printf("LP_addpeer: checkip.(%s) vs (%s)\n",checkip,ipaddr); return(peer); diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 37160a1b8..0eeecbc5f 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -352,7 +352,7 @@ struct LP_utxoinfo *LP_utxo_bestfit(char *symbol,uint64_t destsatoshis) void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) { - cJSON *argjson; struct _LP_utxoinfo u; + cJSON *argjson; struct _LP_utxoinfo u; char *msg; utxo->T.spentflag = (uint32_t)time(NULL); if ( LP_mypeer != 0 && LP_mypeer->numutxos > 0 ) LP_mypeer->numutxos--; @@ -370,7 +370,8 @@ void LP_spentnotify(struct LP_utxoinfo *utxo,int32_t selector) jaddbits256(argjson,"checktxid",u.txid); jaddnum(argjson,"checkvout",u.vout); } - LP_send(LP_mypubsock,jprint(argjson,1),1); + msg = jprint(argjson,1); + LP_send(LP_mypubsock,msg,(int32_t)strlen(msg)+1,1); } } @@ -407,7 +408,7 @@ char *LP_spentcheck(cJSON *argjson) struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) { - uint64_t val,val2=0,tmpsatoshis,bigtxfee = 100000; int32_t spendvini,selector; bits256 spendtxid; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; + uint64_t val,val2=0,tmpsatoshis,bigtxfee = 100000; int32_t spendvini,selector; bits256 spendtxid; char *msg; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) { printf("malformed addutxo %d %d %d %d %d %d %d %d %d\n", symbol == 0,spendscript == 0,coinaddr == 0,bits256_nonz(txid) == 0,bits256_nonz(txid2) == 0,vout < 0,vout2 < 0,value <= 0,value2 <= 0); @@ -497,8 +498,10 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( iambob != 0 ) { if ( mypubsock >= 0 ) - LP_send(mypubsock,jprint(LP_utxojson(utxo),1),1); - else LP_utxo_clientpublish(utxo); + { + msg = jprint(LP_utxojson(utxo),1); + LP_send(mypubsock,msg,(int32_t)strlen(msg)+1,1); + } else LP_utxo_clientpublish(utxo); if ( LP_mypeer != 0 && LP_ismine(utxo) > 0 ) LP_mypeer->numutxos++; } From 61d4f04155c8542e69af95c1f7b17ed4d1f21088 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 14:00:16 +0300 Subject: [PATCH 898/910] Test --- iguana/exchanges/LP_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_network.c b/iguana/exchanges/LP_network.c index 7713c380b..b25dc824a 100644 --- a/iguana/exchanges/LP_network.c +++ b/iguana/exchanges/LP_network.c @@ -39,7 +39,7 @@ int32_t LP_send(int32_t sock,void *msg,int32_t sendlen,int32_t freeflag) int32_t sentbytes,i; struct nn_pollfd pfd; if ( sock < 0 ) { - printf("LP_send.(%s) to illegal socket\n",msg); + printf("LP_send.(%s) to illegal socket\n",(char *)msg); if ( freeflag != 0 ) free(msg); return(-1); @@ -63,7 +63,7 @@ int32_t LP_send(int32_t sock,void *msg,int32_t sendlen,int32_t freeflag) //portable_mutex_unlock(&LP_networkmutex); usleep(1000); } - printf("error LP_send sock.%d, i.%d timeout.(%s) %s\n",sock,i,msg,nn_strerror(nn_errno())); + printf("error LP_send sock.%d, i.%d timeout.(%s) %s\n",sock,i,(char *)msg,nn_strerror(nn_errno())); if ( freeflag != 0 ) free(msg); return(-1); From 91f5543d6c684796a142efc4534516c0e511c4c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 14:13:11 +0300 Subject: [PATCH 899/910] Test --- iguana/exchanges/LP_prices.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 1633b2d7c..d124af247 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -513,7 +513,7 @@ int32_t LP_orderbookfind(struct LP_orderbookentry **array,int32_t num,bits256 tx int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) { - struct LP_peerinfo *peer,*tmp; cJSON *retjson; char *retstr; + struct LP_peerinfo *peer,*tmp; cJSON *retjson; char *retstr; int32_t n = 0; HASH_ITER(hh,LP_peerinfos,peer,tmp) { if ( (retstr= issue_LP_notifyutxo(peer->ipaddr,peer->port,utxo)) != 0 ) @@ -525,15 +525,16 @@ int32_t LP_utxo_clientpublish(struct LP_utxoinfo *utxo) //if ( strcmp("HUSH",utxo->coin) == 0 ) // printf("clientpublish %s (%s)\n",peer->ipaddr,retstr); utxo->T.lasttime = (uint32_t)time(NULL); + n++; } free_json(retjson); } free(retstr); } - if ( utxo->T.lasttime != 0 ) - return(0); + //if ( utxo->T.lasttime != 0 ) + // return(0); } - return(-1); + return(n); } int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char *rel,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum) From 46cc1644bf6436ef338a4ca6308eefa6e988afdb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 15:22:35 +0300 Subject: [PATCH 900/910] Test --- iguana/exchanges/LP_include.h | 2 +- iguana/exchanges/LP_nativeDEX.c | 3 +++ iguana/exchanges/LP_utxos.c | 11 +++++++---- iguana/exchanges/client | 2 +- iguana/exchanges/run | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 62da124fb..41c5286c8 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -186,7 +186,7 @@ struct LP_utxoinfo int32_t iambob,iamlp; uint8_t key[sizeof(bits256) + sizeof(int32_t)]; uint8_t key2[sizeof(bits256) + sizeof(int32_t)]; - char coin[16],coinaddr[64],spendscript[256]; + char coin[16],coinaddr[64],spendscript[256],gui[16]; }; struct LP_peerinfo diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index c5d00e332..78903fd2a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -31,6 +31,7 @@ struct LP_forwardinfo *LP_forwardinfos; char *activecoins[] = { "BTC", "KMD" }; char GLOBAL_DBDIR[] = { "DB" }; char USERPASS[65],USERPASS_WIFSTR[64],LP_myipaddr[64],LP_publicaddr[64],USERHOME[512] = { "/root" }; +char LP_gui[16] = { "cli" }; char *default_LPnodes[] = { "5.9.253.195", "5.9.253.196", "5.9.253.197", "5.9.253.198", "5.9.253.199", "5.9.253.200", "5.9.253.201", "5.9.253.202", "5.9.253.203", };//"5.9.253.204" }; // @@ -410,6 +411,8 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,double profit #endif LP_profitratio += profitmargin; OS_randombytes((void *)&n,sizeof(n)); + if ( jobj(argjson,"gui") != 0 ) + safecopy(LP_gui,jstr(argjson,"gui"),sizeof(LP_gui)); if ( jobj(argjson,"canbind") == 0 ) { #ifndef __linux__ diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 0eeecbc5f..87e0117ba 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -217,6 +217,8 @@ cJSON *LP_inventoryjson(cJSON *item,struct LP_utxoinfo *utxo) { struct _LP_utxoinfo u; jaddstr(item,"method","notified"); + if ( utxo->gui[0] != 0 ) + jaddstr(item,"gui",utxo->gui); jaddstr(item,"coin",utxo->coin); jaddnum(item,"now",time(NULL)); jaddnum(item,"iambob",utxo->iambob); @@ -406,7 +408,7 @@ char *LP_spentcheck(cJSON *argjson) return(clonestr("{\"error\":\"cant find txid to check spent status\"}")); } -struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin) +struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bits256 txid,int32_t vout,int64_t value,bits256 txid2,int32_t vout2,int64_t value2,char *spendscript,char *coinaddr,bits256 pubkey,double profitmargin,char *gui) { uint64_t val,val2=0,tmpsatoshis,bigtxfee = 100000; int32_t spendvini,selector; bits256 spendtxid; char *msg; struct _LP_utxoinfo u; struct LP_utxoinfo *utxo = 0; if ( symbol == 0 || symbol[0] == 0 || spendscript == 0 || spendscript[0] == 0 || coinaddr == 0 || coinaddr[0] == 0 || bits256_nonz(txid) == 0 || bits256_nonz(txid2) == 0 || vout < 0 || vout2 < 0 || value <= 0 || value2 <= 0 ) @@ -469,6 +471,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit utxo = calloc(1,sizeof(*utxo)); utxo->S.profitmargin = profitmargin; utxo->pubkey = pubkey; + safecopy(utxo->gui,gui,sizeof(utxo->gui)); safecopy(utxo->coin,symbol,sizeof(utxo->coin)); safecopy(utxo->coinaddr,coinaddr,sizeof(utxo->coinaddr)); safecopy(utxo->spendscript,spendscript,sizeof(utxo->spendscript)); @@ -517,7 +520,7 @@ struct LP_utxoinfo *LP_utxoaddjson(int32_t iambob,int32_t pubsock,cJSON *argjson return(0); } portable_mutex_lock(&LP_UTXOmutex); - utxo = LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit")); + utxo = LP_utxoadd(iambob,pubsock,jstr(argjson,"coin"),jbits256(argjson,"txid"),jint(argjson,"vout"),j64bits(argjson,"value"),jbits256(argjson,"txid2"),jint(argjson,"vout2"),j64bits(argjson,"value2"),jstr(argjson,"script"),jstr(argjson,"address"),jbits256(argjson,"pubkey"),jdouble(argjson,"profit"),jstr(argjson,"gui")); portable_mutex_unlock(&LP_UTXOmutex); return(utxo); } @@ -709,13 +712,13 @@ uint64_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypr portable_mutex_lock(&LP_UTXOmutex); if ( iambob != 0 ) { - if ( (utxo= LP_utxoadd(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01)) != 0 ) + if ( (utxo= LP_utxoadd(1,mypubsock,coin->symbol,txid,vout,value,deposittxid,depositvout,depositval,script,coin->smartaddr,mypub,LP_mypeer != 0 ? LP_mypeer->profitmargin : 0.01,LP_gui)) != 0 ) { } } else { - if ( (utxo= LP_utxoadd(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0.)) != 0 ) + if ( (utxo= LP_utxoadd(0,mypubsock,coin->symbol,deposittxid,depositvout,depositval,txid,vout,value,script,coin->smartaddr,mypub,0.,LP_gui)) != 0 ) { } } diff --git a/iguana/exchanges/client b/iguana/exchanges/client index 9c3f3cdfa..f4c37a458 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -3,7 +3,7 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; -./marketmaker "{\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +./marketmaker "{\"gui\":\"nogui\",\"client\":1,\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, {\"active\":0,\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, diff --git a/iguana/exchanges/run b/iguana/exchanges/run index e02aa5e4a..8238af326 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -1,5 +1,5 @@ source randval -pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, +pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"gui\":\"nogui\",\"profitmargin\":0.01,\"passphrase\":\"$randval\",\"coins\":[{\"coin\":\"REVS\",\"active\":1, \"asset\":\"REVS\",\"rpcport\":10196},{\"coin\":\"JUMBLR\",\"active\":1, \"asset\":\"JUMBLR\",\"rpcport\":15106}, {\"coin\":\"DOGE\", \"name\":\"dogecoin\", \"pubtype\":30, \"p2shtype\":5, \"wiftype\":128, \"txfee\":100000000}, {\"coin\":\"HUSH\",\"name\":\"hush\",\"rpcport\":8822,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, {\"active\":0,\"coin\":\"ZEC\",\"name\":\"zcash\",\"rpcport\":8232,\"taddr\":28,\"pubtype\":184,\"p2shtype\":189,\"wiftype\":128,\"txfee\":10000 }, From 6216a160dfc165e21caf3ca14b9f5624bf97ca99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 28 Jun 2017 15:26:38 +0300 Subject: [PATCH 901/910] 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 dfd48bcda..4b4a3e4c2 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -102,7 +102,7 @@ char *issue_LP_notifyutxo(char *destip,uint16_t destport,struct LP_utxoinfo *utx u = (utxo->iambob != 0) ? utxo->deposit : utxo->fee; if ( LP_iseligible(&val,&val2,utxo->iambob,utxo->coin,utxo->payment.txid,utxo->payment.vout,utxo->S.satoshis,u.txid,u.vout,utxo->pubkey) > 0 ) { - sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL)); + sprintf(url,"http://%s:%u/api/stats/notified?iambob=%d&pubkey=%s&profit=%.6f&coin=%s&txid=%s&vout=%d&value=%llu&txid2=%s&vout2=%d&value2=%llu&script=%s&address=%s×tamp=%u&gui=%s",destip,destport,utxo->iambob,bits256_str(str3,utxo->pubkey),utxo->S.profitmargin,utxo->coin,bits256_str(str,utxo->payment.txid),utxo->payment.vout,(long long)utxo->payment.value,bits256_str(str2,utxo->deposit.txid),utxo->deposit.vout,(long long)utxo->deposit.value,utxo->spendscript,utxo->coinaddr,(uint32_t)time(NULL),utxo->gui); if ( strlen(url) > 1024 ) printf("WARNING long url.(%s)\n",url); return(LP_issue_curl("notifyutxo",destip,destport,url)); From debc63cd93d3f5d77033c84c58c83e5417812388 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 11:26:21 +0300 Subject: [PATCH 902/910] Test --- iguana/exchanges/enable | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/enable b/iguana/exchanges/enable index a5edfdb35..a974c1860 100755 --- a/iguana/exchanges/enable +++ b/iguana/exchanges/enable @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"REVS\"}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"enable\",\"coin\":\"BTC\"}" From cdd2e07213951e375d5c92d3920c206a8de0abee Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 11:28:59 +0300 Subject: [PATCH 903/910] Test --- iguana/exchanges/LP_forwarding.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_forwarding.c b/iguana/exchanges/LP_forwarding.c index 98a6df18c..cbde40d71 100644 --- a/iguana/exchanges/LP_forwarding.c +++ b/iguana/exchanges/LP_forwarding.c @@ -163,7 +163,7 @@ int32_t LP_forwarding_register(bits256 pubkey,char *publicaddr,uint16_t publicpo parse_ipaddr(ipaddr,publicaddr+j); HASH_ITER(hh,LP_peerinfos,peer,tmp) { - printf("register.(%s) %s %u with (%s)\n",publicaddr,ipaddr,publicport,peer->ipaddr); + //printf("register.(%s) %s %u with (%s)\n",publicaddr,ipaddr,publicport,peer->ipaddr); if ( (retstr= issue_LP_register(peer->ipaddr,peer->port,pubkey,ipaddr,publicport)) != 0 ) { //printf("[%s] LP_register.(%s) returned.(%s)\n",publicaddr,peer->ipaddr,retstr); From 5aa58faa5c3bd1b85c25bc144e9457044a5543ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 11:31:44 +0300 Subject: [PATCH 904/910] Test --- iguana/exchanges/inv | 2 +- iguana/exchanges/orderbook | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/inv b/iguana/exchanges/inv index 0009b7af4..3d6669329 100755 --- a/iguana/exchanges/inv +++ b/iguana/exchanges/inv @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"inventory\",\"coin\":\"REVS\"}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"inventory\",\"coin\":\"BTC\"}" diff --git a/iguana/exchanges/orderbook b/iguana/exchanges/orderbook index 4d2367a42..a2110f07b 100755 --- a/iguana/exchanges/orderbook +++ b/iguana/exchanges/orderbook @@ -1,2 +1,2 @@ source userpass -curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"orderbook\",\"base\":\"REVS\",\"rel\":\"KMD\"}" +curl --url "http://127.0.0.1:7779" --data "{\"userpass\":\"$userpass\",\"method\":\"orderbook\",\"base\":\"KMD\",\"rel\":\"BTC\"}" From 068533aa7848fe02f333fe84b3c9c5a363b00194 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 14:29:20 +0300 Subject: [PATCH 905/910] Test --- iguana/exchanges/LP_commands.c | 2 ++ iguana/exchanges/LP_transaction.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index a07054c5c..6ea87069f 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -162,6 +162,8 @@ forwardhex(pubkey,hex)\n\ LP_privkey_init(-1,ptr,privkey,pubkey,pubkey33); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); + jaddstr(retjson,"coin",coin); + jaddnum(retjson,"timestamp",time(NULL)); jadd(retjson,"alice",LP_inventory(coin,0)); jadd(retjson,"bob",LP_inventory(coin,1)); return(jprint(retjson,1)); diff --git a/iguana/exchanges/LP_transaction.c b/iguana/exchanges/LP_transaction.c index 9a3d73225..2e3d57a89 100644 --- a/iguana/exchanges/LP_transaction.c +++ b/iguana/exchanges/LP_transaction.c @@ -136,7 +136,8 @@ int32_t LP_vinscan(bits256 *spendtxidp,int32_t *spendvinip,char *symbol,bits256 { if ( bits256_cmp(txid,jbits256(txobj,"txid")) != 0 ) { - printf("txid mismatch error\n"); + char str[65]; printf("txid mismatch error %s vs %s\n",bits256_str(str,txid),jprint(txobj,0)); + free_json(txobj); return(-2); } vins = jarray(&numvins,txobj,"vin"); From 2044cd286d624994795c79e6b69cca7245a62361 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 14:30:12 +0300 Subject: [PATCH 906/910] Test --- iguana/exchanges/LP_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 6ea87069f..f8b55823b 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -22,6 +22,7 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport=0,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; + printf("stats_JSON(%s)\n",jprint(argjson,0)); if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) From 2eca9f6ba56df5e67240b26a8104773435d22218 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 15:23:22 +0300 Subject: [PATCH 907/910] Test --- iguana/exchanges/LP_rpc.c | 2 +- iguana/exchanges/LP_utxos.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index 4b4a3e4c2..db72f04d4 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -219,7 +219,7 @@ cJSON *LP_getmempool(char *symbol) cJSON *LP_gettxout(char *symbol,bits256 txid,int32_t vout) { char buf[128],str[65]; struct iguana_info *coin = LP_coinfind(symbol); - sprintf(buf,"\"%s\", %d",bits256_str(str,txid),vout); + sprintf(buf,"\"%s\", %d, 1",bits256_str(str,txid),vout); return(bitcoin_json(coin,"gettxout",buf)); } diff --git a/iguana/exchanges/LP_utxos.c b/iguana/exchanges/LP_utxos.c index 87e0117ba..7cb030d60 100644 --- a/iguana/exchanges/LP_utxos.c +++ b/iguana/exchanges/LP_utxos.c @@ -436,7 +436,7 @@ struct LP_utxoinfo *LP_utxoadd(int32_t iambob,int32_t mypubsock,char *symbol,bit if ( dispflag != 0 ) printf("%.8f %.8f %s iambob.%d %s utxoadd.(%.8f %.8f) %s %s\n",dstr(val),dstr(val2),coinaddr,iambob,symbol,dstr(value),dstr(value2),bits256_str(str,txid),bits256_str(str2,txid2)); dispflag = 1; - if ( (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) + if ( 0 && (selector= LP_mempool_vinscan(&spendtxid,&spendvini,symbol,txid,vout,txid2,vout2)) >= 0 ) { printf("utxoadd selector.%d in mempool %s vini.%d",selector,bits256_str(str,spendtxid),spendvini); return(0); From 6f62d98798300f41a6a229fd20961423cbfe6a4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 15:25:14 +0300 Subject: [PATCH 908/910] Test --- iguana/exchanges/LP_commands.c | 2 +- iguana/exchanges/LP_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index f8b55823b..5d9dfb80a 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -22,7 +22,7 @@ char *stats_JSON(void *ctx,char *myipaddr,int32_t pubsock,double profitmargin,cJSON *argjson,char *remoteaddr,uint16_t port) // from rpc port { char *method,*ipaddr,*userpass,*base,*rel,*coin,*retstr = 0; uint16_t argport=0,pushport,subport; int32_t otherpeers,othernumutxos,flag = 0; struct LP_peerinfo *peer; cJSON *retjson; struct iguana_info *ptr; - printf("stats_JSON(%s)\n",jprint(argjson,0)); + //printf("stats_JSON(%s)\n",jprint(argjson,0)); if ( (ipaddr= jstr(argjson,"ipaddr")) != 0 && (argport= juint(argjson,"port")) != 0 ) { if ( strcmp(ipaddr,"127.0.0.1") != 0 && argport >= 1000 ) diff --git a/iguana/exchanges/LP_rpc.c b/iguana/exchanges/LP_rpc.c index db72f04d4..adcbdd420 100644 --- a/iguana/exchanges/LP_rpc.c +++ b/iguana/exchanges/LP_rpc.c @@ -219,7 +219,7 @@ cJSON *LP_getmempool(char *symbol) cJSON *LP_gettxout(char *symbol,bits256 txid,int32_t vout) { char buf[128],str[65]; struct iguana_info *coin = LP_coinfind(symbol); - sprintf(buf,"\"%s\", %d, 1",bits256_str(str,txid),vout); + sprintf(buf,"\"%s\", %d, true",bits256_str(str,txid),vout); return(bitcoin_json(coin,"gettxout",buf)); } From c5c5f0d958b19a6ea96310034d0acb1cf28f2a31 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 18:47:56 +0300 Subject: [PATCH 909/910] Coqui --- basilisk/basilisk_tradebot.c | 1 - iguana/coins/basilisk/coqui | 2 ++ iguana/coins/coqui_7776 | 1 + iguana/exchanges/client | 2 +- iguana/exchanges/run | 2 +- iguana/iguana_notary.c | 2 +- iguana/m_notary | 3 ++- 7 files changed, 8 insertions(+), 5 deletions(-) create mode 100755 iguana/coins/basilisk/coqui create mode 100755 iguana/coins/coqui_7776 diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index e98a64509..2635cde97 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -316,7 +316,6 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } } else noquoteflag++; } - // MVP -> USD myrequest.0 pendingid.0 noquoteflag.1 havequoteflag.0 maxi.-1 0.00000000 struct iguana_info *coin; char coinaddr[64]; double retvals[4],refprice=0.,profitmargin,aveprice,destvolume; destvolume = dstr(maxamount); //printf("destvolume <- %.8f\n",dstr(destvolume)); diff --git a/iguana/coins/basilisk/coqui b/iguana/coins/basilisk/coqui new file mode 100755 index 000000000..cc86f422a --- /dev/null +++ b/iguana/coins/basilisk/coqui @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"COQUI.conf\",\"path\":\"${HOME#"/"}/.komodo/COQUI\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"COQUI\",\"name\":\"COQUI\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":12455,\"rpc\":12456,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/coqui_7776 b/iguana/coins/coqui_7776 new file mode 100755 index 000000000..7233677cf --- /dev/null +++ b/iguana/coins/coqui_7776 @@ -0,0 +1 @@ +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"COQUI.conf\",\"path\":\"${HOME#"/"}/.komodo/COQUI\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"COQUI\",\"name\":\"COQUI\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"fa05f107\",\"p2p\":12455,\"rpc\":12456,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" diff --git a/iguana/exchanges/client b/iguana/exchanges/client index f4c37a458..6582e2c82 100755 --- a/iguana/exchanges/client +++ b/iguana/exchanges/client @@ -19,6 +19,6 @@ git pull; {\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, {\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +{\"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\":12456},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} ], \"userhome\":\"/${HOME#"/"}\",\"passphrase\":\"$randval\"}" & diff --git a/iguana/exchanges/run b/iguana/exchanges/run index 8238af326..a81c74556 100755 --- a/iguana/exchanges/run +++ b/iguana/exchanges/run @@ -15,5 +15,5 @@ pkill -15 marketmaker; git pull; cd ..; ./m_mm; $1 ./marketmaker "{\"gui\":\"nog {\"coin\":\"FRK\", \"name\":\"franko\", \"pubtype\":35, \"p2shtype\":5, \"wiftype\":163, \"txfee\":0}, {\"coin\":\"GAME\", \"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\":\"MVP\",\"asset\":\"MVP\",\"rpcport\":8655},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} +{\"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\":12456},{\"coin\":\"KV\",\"asset\":\"KV\",\"rpcport\":9747},{\"coin\":\"CEAL\",\"asset\":\"CEAL\",\"rpcport\":11116},{\"coin\":\"MESH\",\"asset\":\"MESH\",\"rpcport\":9455} ]}" & diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index e7c02acda..fe9d14c60 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -437,7 +437,7 @@ STRING_ARG(iguana,addnotary,ipaddr) char NOTARY_CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "MVP", "WLC", "KV", "CEAL", "MESH", "LTC" }; + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "COQUI", "WLC", "KV", "CEAL", "MESH", "LTC" }; ZERO_ARGS(dpow,notarychains) { diff --git a/iguana/m_notary b/iguana/m_notary index 633fb4583..d2c82c7c0 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -35,7 +35,8 @@ coins/jumblr_7776 coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 -coins/mvp_7776 +#coins/mvp_7776 +coins/coqui_7776 coins/wlc_7776 coins/kv_7776 coins/ceal_7776 From 9a28b4be4eeed3323835b1054c8073cf3ad9e22f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 29 Jun 2017 18:55:07 +0300 Subject: [PATCH 910/910] Test --- iguana/exchanges/LP_prices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index d124af247..eaf3db19a 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -20,7 +20,7 @@ struct LP_orderbookentry { bits256 txid,txid2,pubkey; double price; uint64_t basesatoshis; int32_t vout,vout2; }; -#define LP_MAXPRICEINFOS 64 +#define LP_MAXPRICEINFOS 256 struct LP_priceinfo { char symbol[16];