diff --git a/iguana/exchanges/LP_stats.c b/iguana/exchanges/LP_stats.c index 21228ef9c..62125740f 100644 --- a/iguana/exchanges/LP_stats.c +++ b/iguana/exchanges/LP_stats.c @@ -38,22 +38,50 @@ void LP_tradecommand_log(cJSON *argjson) } } -static uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_numridqids; +static uint32_t LP_requests,LP_reserveds,LP_connects,LP_connecteds,LP_tradestatuses,LP_parse_errors,LP_unknowns,LP_duplicates,LP_aliceids; struct LP_swapstats { + UT_hash_handle hh; + struct LP_quoteinfo Q; + double qprice; uint64_t aliceid; -}; -uint64_t Ridqids[128]; + char method[16]; +} *LP_swapstats; + +struct LP_swapstats *LP_swapstats_find(uint64_t aliceid) +{ + struct LP_swapstats *sp; + HASH_FIND(hh,LP_swapstats,&aliceid,sizeof(aliceid),sp); + return(sp); +} + +struct LP_swapstats *LP_swapstats_add(uint64_t aliceid) +{ + struct LP_swapstats *sp; + if ( (sp= LP_swapstats_find(aliceid)) == 0 ) + { + sp = calloc(1,sizeof(*sp)); + sp->aliceid = aliceid; + HASH_ADD(hh,LP_swapstats,aliceid,sizeof(aliceid),sp); + } + return(LP_swapstats_find(aliceid)); +} uint64_t LP_aliceid_calc(bits256 desttxid,int32_t destvout,bits256 feetxid,int32_t feevout) { return((((uint64_t)desttxid.uints[0] << 48) | ((uint64_t)destvout << 32) | ((uint64_t)feetxid.uints[0] << 16) | (uint32_t)feevout)); } +void LP_swapstats_line(char *line,struct LP_swapstats *sp) +{ + char tstr[64]; + printf("%s %8s %-4d %9s swap.%016llx: (%.8f %5s) -> (%.8f %5s) qprice %.8f",utc_str(tstr,sp->Q.timestamp),sp->Q.gui,LP_aliceids,sp->method,(long long)sp->aliceid,dstr(sp->Q.satoshis),sp->Q.srccoin,dstr(sp->Q.destsatoshis),sp->Q.destcoin,sp->qprice); +} + int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) { - double qprice; uint32_t timestamp; int32_t i,destvout,feevout,duplicate=0; char *gui,*base,*rel,tstr[128]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t aliceid; + struct LP_swapstats *sp; double qprice; uint32_t timestamp; int32_t destvout,feevout,duplicate=0; char *gui,*base,*rel,line[1024]; uint64_t txfee,satoshis,destsatoshis; bits256 desttxid,feetxid; struct LP_quoteinfo Q; uint64_t aliceid; memset(&Q,0,sizeof(Q)); if ( LP_quoteparse(&Q,lineobj) < 0 ) { @@ -83,20 +111,21 @@ int32_t LP_statslog_parsequote(char *method,cJSON *lineobj) qprice = ((double)destsatoshis / (satoshis - txfee)); //printf("%s/v%d %s/v%d\n",bits256_str(str,desttxid),destvout,bits256_str(str2,feetxid),feevout); aliceid = LP_aliceid_calc(desttxid,destvout,feetxid,feevout); - for (i=0; i (%.8f %5s) qprice %.8f\n",utc_str(tstr,timestamp),gui!=0?gui:"",LP_numridqids,method,(long long)aliceid,dstr(satoshis),base,dstr(destsatoshis),rel,qprice); - LP_numridqids++; + if ( (sp= LP_swapstats_add(aliceid)) != 0 ) + { + sp->Q = Q; + sp->qprice = qprice; + LP_swapstats_line(line,sp); + printf("%s\n",line); + LP_aliceids++; + } else printf("unexpected LP_swapstats_add failure\n"); } } return(duplicate == 0); @@ -135,7 +164,7 @@ void LP_statslog_parseline(cJSON *lineobj) char *LP_statslog_disp(int32_t n) { - cJSON *retjson; + cJSON *retjson,*array; struct LP_swapstats *sp,*tmp; char line[1024]; retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddnum(retjson,"newlines",n); @@ -145,9 +174,16 @@ char *LP_statslog_disp(int32_t n) jaddnum(retjson,"connected",LP_connecteds); jaddnum(retjson,"duplicates",LP_duplicates); jaddnum(retjson,"parse_errors",LP_parse_errors); - jaddnum(retjson,"uniques",LP_numridqids); + jaddnum(retjson,"uniques",LP_aliceids); jaddnum(retjson,"tradestatus",LP_tradestatuses); jaddnum(retjson,"unknown",LP_unknowns); + array = cJSON_CreateArray(); + HASH_ITER(hh,LP_swapstats,sp,tmp) + { + LP_swapstats_line(line,sp); + jaddistr(array,line); + } + jadd(retjson,"swaps",array); return(jprint(retjson,1)); }