diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index 8acc60b7c..a61fe617c 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -521,11 +521,9 @@ dividends(coin, height, )\n\ } else { - char *msg; memset(zero.bytes,0,sizeof(zero)); - msg = jprint(reqjson,0); //printf("broadcast.(%s)\n",msg); - LP_broadcast_message(LP_mypubsock,base!=0?base:jstr(argjson,"coin"),rel,zero,msg); + LP_reserved_msg(base!=0?base:jstr(argjson,"coin"),rel,zero,jprint(reqjson,0)); } retstr = clonestr("{\"result\":\"success\"}"); } else retstr = clonestr("{\"error\":\"couldnt dereference sendmessage\"}"); diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 8dadf593a..34f16721a 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -43,7 +43,7 @@ #define LP_PEERGOOD_ERRORDECAY 0.9 #define LP_SWAPSTEP_TIMEOUT 30 -#define LP_AUTOTRADE_TIMEOUT 60 +#define LP_AUTOTRADE_TIMEOUT 10 #define LP_MIN_TXFEE 10000 #define LP_MINVOL 20 #define LP_MINCLIENTVOL 50 @@ -296,6 +296,7 @@ uint16_t LP_psock_get(char *connectaddr,char *publicaddr,int32_t ispaired); //void LP_utxo_clientpublish(struct LP_utxoinfo *utxo); int32_t LP_coinbus(uint16_t coin_busport); int32_t LP_reserved_msgs(); +int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg); struct iguana_info *LP_coinfind(char *symbol); int32_t LP_crc32find(int32_t *duplicatep,int32_t ind,uint32_t crc32); char *LP_pricepings(void *ctx,char *myipaddr,int32_t pubsock,char *base,char *rel,double price); diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index cb75ec172..be9c2519f 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -20,7 +20,7 @@ // marketmaker // -// SPV at tx level and limit SPV proofing +// -SPV at tx level and limit SPV proofing // stats, fix pricearray // sign packets // dPoW security @@ -35,7 +35,7 @@ portable_mutex_t LP_peermutex,LP_UTXOmutex,LP_utxomutex,LP_commandmutex,LP_cachemutex,LP_swaplistmutex,LP_forwardmutex,LP_pubkeymutex,LP_networkmutex,LP_psockmutex,LP_coinmutex,LP_messagemutex,LP_portfoliomutex,LP_electrummutex,LP_butxomutex,LP_reservedmutex; int32_t LP_canbind; char *Broadcaststr,*Reserved_msgs[1000]; -int32_t num_Reserved_msgs; +int32_t num_Reserved_msgs,max_Reserved_msgs; struct LP_peerinfo *LP_peerinfos,*LP_mypeer; struct LP_forwardinfo *LP_forwardinfos; struct iguana_info *LP_coins; @@ -355,7 +355,7 @@ void LP_smartutxos_push(struct iguana_info *coin) jaddnum(req,"ht",height); jadd64bits(req,"value",value); //printf("ADDR_UNSPENTS[] <- %s\n",jprint(req,0)); - LP_broadcast_message(LP_mypubsock,"","",zero,jprint(req,1)); + LP_reserved_msg("","",zero,jprint(req,1)); } } } @@ -704,6 +704,24 @@ int32_t LP_reserved_msgs() return(n); } +int32_t LP_reserved_msg(char *base,char *rel,bits256 pubkey,char *msg) +{ + int32_t n = 0; + portable_mutex_lock(&LP_reservedmutex); + if ( num_Reserved_msgs < sizeof(Reserved_msgs)/sizeof(*Reserved_msgs) ) + { + Reserved_msgs[num_Reserved_msgs++] = msg; + n = num_Reserved_msgs; + } else LP_broadcast_message(LP_mypubsock,base,rel,pubkey,msg); + portable_mutex_unlock(&LP_reservedmutex); + if ( num_Reserved_msgs > max_Reserved_msgs ) + { + max_Reserved_msgs = num_Reserved_msgs; + printf("New max_Reserved_msgs.%d\n",max_Reserved_msgs); + } + return(n); +} + void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybusport,char *passphrase,int32_t amclient,char *userhome,cJSON *argjson) { char *myipaddr=0; long filesize,n; int32_t timeout,pubsock=-1; struct LP_peerinfo *mypeer=0; char pushaddr[128],subaddr[128],bindaddr[128],*coins_str=0; cJSON *coinsjson=0; void *ctx = bitcoin_ctx(); diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index ab79fdb7a..9779c1c55 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -219,41 +219,37 @@ char *LP_quotereceived(cJSON *argjson) char *LP_pricepings(void *ctx,char *myipaddr,int32_t pubsock,char *base,char *rel,double price) { - bits256 zero; char *msg; cJSON *reqjson = cJSON_CreateObject(); + bits256 zero; cJSON *reqjson = cJSON_CreateObject(); memset(zero.bytes,0,sizeof(zero)); jaddbits256(reqjson,"pubkey",G.LP_mypub25519); jaddstr(reqjson,"base",base); jaddstr(reqjson,"rel",rel); jaddnum(reqjson,"price",price); jaddstr(reqjson,"method","postprice"); - msg = jprint(reqjson,1); - LP_broadcast_message(pubsock,base,rel,zero,msg); + LP_reserved_msg(base,rel,zero,jprint(reqjson,1)); return(clonestr("{\"result\":\"success\"}")); } void LP_notify_pubkeys(void *ctx,int32_t pubsock) { - bits256 zero; char *msg,secpstr[67]; cJSON *reqjson = cJSON_CreateObject(); + bits256 zero; char secpstr[67]; cJSON *reqjson = cJSON_CreateObject(); memset(zero.bytes,0,sizeof(zero)); jaddstr(reqjson,"method","notify"); jaddstr(reqjson,"rmd160",G.LP_myrmd160str); jaddbits256(reqjson,"pub",G.LP_mypub25519); init_hexbytes_noT(secpstr,G.LP_pubsecp,33); jaddstr(reqjson,"pubsecp",secpstr); - msg = jprint(reqjson,1); - LP_broadcast_message(pubsock,"","",zero,msg); + LP_reserved_msg("","",zero,jprint(reqjson,1)); } void LP_listunspent_query(char *symbol,char *coinaddr) { - bits256 zero; char *msg; cJSON *reqjson = cJSON_CreateObject(); + bits256 zero; cJSON *reqjson = cJSON_CreateObject(); memset(zero.bytes,0,sizeof(zero)); jaddstr(reqjson,"method","addr_unspents"); jaddstr(reqjson,"coin",symbol); jaddstr(reqjson,"address",coinaddr); - msg = jprint(reqjson,1); - //printf("BROADCAST.(%s)\n",msg); - LP_broadcast_message(LP_mypubsock,"","",zero,msg); + LP_reserved_msg("","",zero,jprint(reqjson,1)); } char *LP_postedprice(cJSON *argjson) @@ -401,11 +397,16 @@ double LP_query(void *ctx,char *myipaddr,int32_t mypubsock,char *method,struct L msg = jprint(reqjson,1); printf("QUERY.(%s)\n",msg); memset(&zero,0,sizeof(zero)); - if ( 1 && strcmp(method,"request") == 0 ) + portable_mutex_lock(&LP_reservedmutex); + if ( num_Reserved_msgs < sizeof(Reserved_msgs)/sizeof(*Reserved_msgs) ) + Reserved_msgs[num_Reserved_msgs++] = msg; + else { - sleep(3); - LP_broadcast_message(LP_mypubsock,qp->srccoin,qp->destcoin,zero,msg); - } else LP_broadcast_message(LP_mypubsock,qp->srccoin,qp->destcoin,qp->srchash,msg); + if ( 1 && strcmp(method,"request") == 0 ) + LP_broadcast_message(LP_mypubsock,qp->srccoin,qp->destcoin,zero,msg); + else LP_broadcast_message(LP_mypubsock,qp->srccoin,qp->destcoin,qp->srchash,msg); + } + portable_mutex_unlock(&LP_reservedmutex); for (i=0; i<20; i++) { if ( (price= LP_pricecache(qp,qp->srccoin,qp->destcoin,qp->txid,qp->vout)) > SMALLVAL ) @@ -581,7 +582,7 @@ void LP_abutxo_set(struct LP_utxoinfo *autxo,struct LP_utxoinfo *butxo,struct LP int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJSON *argjson,char *base,char *rel,double price,struct LP_quoteinfo *qp) { - char pairstr[512],*msg; cJSON *retjson; bits256 privkey; int32_t pair=-1,retval = -1,DEXselector = 0; struct basilisk_swap *swap; struct iguana_info *coin; + 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) %s\n",LP_myipaddr,jprint(argjson,0),LP_myipaddr); qp->quotetime = (uint32_t)time(NULL); if ( (coin= LP_coinfind(utxo->coin)) == 0 ) @@ -609,8 +610,7 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,struct LP_utxoinfo *utxo,cJ jaddnum(retjson,"requestid",qp->R.requestid); jaddnum(retjson,"quoteid",qp->R.quoteid); char str[65]; printf("BOB pubsock.%d binds to %d (%s)\n",pubsock,pair,bits256_str(str,utxo->S.otherpubkey)); - msg = jprint(retjson,1); - LP_broadcast_message(pubsock,base,rel,utxo->S.otherpubkey,msg); + LP_reserved_msg(base,rel,utxo->S.otherpubkey,jprint(retjson,1)); retval = 0; } else printf("error launching swaploop\n"); } else printf("couldnt bind to any port %s\n",pairstr); @@ -856,16 +856,9 @@ int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson, jaddstr(retjson,"method","reserved"); msg = jprint(retjson,1); butxo->T.lasttime = (uint32_t)time(NULL); - printf("set swappending.%u accept qprice %.8f, min %.8f\n(%s)\n",butxo->T.swappending,qprice,price,msg); - { - portable_mutex_lock(&LP_reservedmutex); - if ( num_Reserved_msgs < sizeof(Reserved_msgs)/sizeof(*Reserved_msgs) ) - Reserved_msgs[num_Reserved_msgs++] = msg; - else LP_broadcast_message(pubsock,Q.srccoin,Q.destcoin,butxo->S.otherpubkey,msg); - portable_mutex_unlock(&LP_reservedmutex); - printf("return after queued RESERVED\n"); - return(2); - } + printf("return after queued RESERVED: set swappending.%u accept qprice %.8f, min %.8f\n(%s)\n",butxo->T.swappending,qprice,price,msg); + LP_reserved_msg(Q.srccoin,Q.destcoin,butxo->S.otherpubkey,msg); + return(2); } else printf("warning swappending.%u swap.%p\n",butxo->T.swappending,butxo->S.swap); } else if ( strcmp(method,"connect") == 0 ) // bob diff --git a/iguana/exchanges/LP_peers.c b/iguana/exchanges/LP_peers.c index 5c7efb7e7..a7ffdf846 100644 --- a/iguana/exchanges/LP_peers.c +++ b/iguana/exchanges/LP_peers.c @@ -128,11 +128,10 @@ struct LP_peerinfo *LP_addpeer(struct LP_peerinfo *mypeer,int32_t mypubsock,char portable_mutex_unlock(&LP_peermutex); if ( IAMLP != 0 && mypubsock >= 0 ) { - struct iguana_info *coin,*ctmp; bits256 zero; char *msg,busaddr[64]; - msg = jprint(LP_peerjson(peer),1); + struct iguana_info *coin,*ctmp; bits256 zero; char busaddr[64]; memset(zero.bytes,0,sizeof(zero)); //LP_send(mypubsock,msg,(int32_t)strlen(msg)+1,1); - LP_broadcast_message(mypubsock,"","",zero,msg); + LP_reserved_msg("","",zero,jprint(LP_peerjson(peer),1)); if ( 0 ) { HASH_ITER(hh,LP_coins,coin,ctmp) diff --git a/iguana/exchanges/LP_utxo.c b/iguana/exchanges/LP_utxo.c index d15ae08b1..214bef80b 100644 --- a/iguana/exchanges/LP_utxo.c +++ b/iguana/exchanges/LP_utxo.c @@ -417,7 +417,7 @@ cJSON *LP_address_balance(struct iguana_info *coin,char *coinaddr,int32_t electr void LP_postutxos(char *symbol,char *coinaddr) { - bits256 zero; char *msg; struct iguana_info *coin; cJSON *array,*reqjson = cJSON_CreateObject(); + bits256 zero; struct iguana_info *coin; cJSON *array,*reqjson = cJSON_CreateObject(); if ( (coin= LP_coinfind(symbol)) != 0 && (array= LP_address_utxos(coin,coinaddr,1)) != 0 ) { //printf("LP_postutxos pubsock.%d %s %s\n",pubsock,symbol,coin->smartaddr); @@ -430,9 +430,8 @@ void LP_postutxos(char *symbol,char *coinaddr) jaddstr(reqjson,"coin",symbol); jaddstr(reqjson,"coinaddr",coinaddr); jadd(reqjson,"utxos",array); - msg = jprint(reqjson,1); //printf("post (%s) -> %d\n",msg,LP_mypubsock); - LP_broadcast_message(LP_mypubsock,symbol,symbol,zero,msg); + LP_reserved_msg(symbol,symbol,zero,jprint(reqjson,1)); } } }