diff --git a/iguana/exchanges/LP_include.h b/iguana/exchanges/LP_include.h index 4cbf9a89f..11ef6e96a 100644 --- a/iguana/exchanges/LP_include.h +++ b/iguana/exchanges/LP_include.h @@ -378,6 +378,7 @@ struct LP_quoteinfo { struct basilisk_request R; bits256 srchash,desthash,txid,txid2,desttxid,feetxid,privkey; + double maxprice; int64_t othercredits; uint64_t satoshis,txfee,destsatoshis,desttxfee,aliceid; uint32_t timestamp,quotetime,tradeid,gtc,fill,mpnet; diff --git a/iguana/exchanges/LP_mpnet.c b/iguana/exchanges/LP_mpnet.c index bba19b3bf..53673ebea 100644 --- a/iguana/exchanges/LP_mpnet.c +++ b/iguana/exchanges/LP_mpnet.c @@ -19,10 +19,57 @@ // int32_t LP_tradecommand(void *ctx,char *myipaddr,int32_t pubsock,cJSON *argjson,uint8_t *data,int32_t datalen); +int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson); -void LP_mpnet_send(char *msg) +int32_t LP_mpnet_addorder(struct LP_quoteinfo *qp) { - + uint64_t destvalue,destvalue2; + if ( LP_iseligible(&destvalue,&destvalue2,0,qp->destcoin,qp->desttxid,qp->destvout,qp->destsatoshis,qp->feetxid,qp->feevout) > 0 ) + { + LP_gtc_addorder(qp); + return(0); + } + return(-1); +} + +void LP_mpnet_init() +{ + char fname[1024],line[8192]; FILE *fp; struct LP_quoteinfo Q; + sprintf(fname,"%s/GTC/orders",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + while ( fgets(line,sizeof(line),fp) > 0 ) + { + if ( (argjson= cJSON_Parse(line)) != 0 ) + { + if ( LP_quoteparse(&Q,argjson) == 0 ) + { + if ( LP_mpnet_addorder(&Q) == 0 ) + printf("GTC %s",line); + } + free_json(argjson); + } + } + fclose(fp); + } +} + +void LP_mpnet_send(int32_t localcopy,char *msg,int32_t sendflag) +{ + char fname[1024]; FILE *fp; + if ( localcopy != 0 ) + { + sprintf(fname,"%s/GTC/orders",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) == 0 ) + fp = fopen(fname,"wb+"); + else fseek(fp,0,SEEK_END); + fprintf(fp,"%s\n",msg); + fclose(fp); + } + if ( G.mpnet != 0 && sendflag != 0 ) + { + + } } cJSON *LP_mpnet_get() diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 5ddc56f45..5aa2749e3 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -1649,6 +1649,7 @@ void LPinit(uint16_t myport,uint16_t mypullport,uint16_t mypubport,uint16_t mybu int32_t nonz,didremote=0; LP_statslog_parse(); bitcoind_RPC_inittime = 0; + LP_mpnet_init(); while ( LP_STOP_RECEIVED == 0 ) { nonz = 0; diff --git a/iguana/exchanges/LP_ordermatch.c b/iguana/exchanges/LP_ordermatch.c index 6ce1b93d9..53c29910e 100644 --- a/iguana/exchanges/LP_ordermatch.c +++ b/iguana/exchanges/LP_ordermatch.c @@ -23,7 +23,6 @@ struct LP_gtcorder { struct LP_gtcorder *next,*prev; struct LP_quoteinfo Q; - double maxprice; uint32_t cancelled,pending; } *GTCorders; @@ -551,7 +550,7 @@ int32_t LP_connectstartbob(void *ctx,int32_t pubsock,char *base,char *rel,double if ( qp->mpnet != 0 && qp->fill != 0 && qp->gtc != 0 ) { char *msg = jprint(reqjson,0); - LP_mpnet_send(msg); + LP_mpnet_send(0,msg,1); free(msg); } free_json(reqjson); @@ -616,14 +615,25 @@ void LP_gtc_iteration(void *ctx,char *myipaddr,int32_t mypubsock) { gtc->pending = qp->timestamp = (uint32_t)time(NULL); LP_query(ctx,myipaddr,mypubsock,"request",qp); - LP_Alicequery = *qp, LP_Alicemaxprice = gtc->maxprice, Alice_expiration = qp->timestamp + 2*LP_AUTOTRADE_TIMEOUT, LP_Alicedestpubkey = qp->srchash; - char str[65]; printf("LP_gtc fill.%d gtc.%d %s/%s %.8f vol %.8f dest.(%s) maxprice %.8f etomicdest.(%s) uuid.%s fill.%d gtc.%d\n",qp->fill,qp->gtc,qp->srccoin,qp->destcoin,dstr(qp->satoshis),dstr(qp->destsatoshis),bits256_str(str,LP_Alicedestpubkey),gtc->maxprice,qp->etomicdest,qp->uuidstr,qp->fill,qp->gtc); + LP_Alicequery = *qp, LP_Alicemaxprice = gtc->Q.maxprice, Alice_expiration = qp->timestamp + 2*LP_AUTOTRADE_TIMEOUT, LP_Alicedestpubkey = qp->srchash; + char str[65]; printf("LP_gtc fill.%d gtc.%d %s/%s %.8f vol %.8f dest.(%s) maxprice %.8f etomicdest.(%s) uuid.%s fill.%d gtc.%d\n",qp->fill,qp->gtc,qp->srccoin,qp->destcoin,dstr(qp->satoshis),dstr(qp->destsatoshis),bits256_str(str,LP_Alicedestpubkey),gtc->Q.maxprice,qp->etomicdest,qp->uuidstr,qp->fill,qp->gtc); break; } } } } +void LP_gtc_addorder(struct LP_quoteinfo *qp) +{ + struct LP_gtcorder *gtc; + gtc = calloc(1,sizeof(*gtc)); + gtc->Q = *qp; + gtc->pending = (uint32_t)time(NULL); + portable_mutex_lock(&LP_gtcmutex); + DL_APPEND(GTCorders,gtc); + portable_mutex_unlock(&LP_gtcmutex); +} + char *LP_trade(void *ctx,char *myipaddr,int32_t mypubsock,struct LP_quoteinfo *qp,double maxprice,int32_t timeout,int32_t duration,uint32_t tradeid,bits256 destpubkey,char *uuidstr) { struct LP_gtcorder *gtc; @@ -634,30 +644,25 @@ char *LP_trade(void *ctx,char *myipaddr,int32_t mypubsock,struct LP_quoteinfo *q qp->tradeid = LP_rand(); qp->srchash = destpubkey; strncpy(qp->uuidstr,uuidstr,sizeof(qp->uuidstr)-1); + qp->maxprice = maxprice; qp->timestamp = (uint32_t)time(NULL); if ( qp->gtc != 0 ) { strcpy(&qp->uuidstr[strlen(qp->uuidstr)-6],"cccccc"); - gtc = calloc(1,sizeof(*gtc)); - gtc->Q = *qp; - gtc->maxprice = maxprice; - gtc->pending = (uint32_t)time(NULL); - portable_mutex_lock(&LP_gtcmutex); - DL_APPEND(GTCorders,gtc); - portable_mutex_unlock(&LP_gtcmutex); + LP_gtc_addorder(qp); } { LP_query(ctx,myipaddr,mypubsock,"request",qp); - LP_Alicequery = *qp, LP_Alicemaxprice = maxprice, Alice_expiration = qp->timestamp + timeout, LP_Alicedestpubkey = qp->srchash; + LP_Alicequery = *qp, LP_Alicemaxprice = qp->maxprice, Alice_expiration = qp->timestamp + timeout, LP_Alicedestpubkey = qp->srchash; } - if ( qp->mpnet != 0 && qp->gtc != 0 && qp->fill != 0 ) + if ( qp->gtc != 0 ) { cJSON *reqjson = LP_quotejson(qp); char *msg = jprint(reqjson,1); - LP_mpnet_send(msg); + LP_mpnet_send(1,msg,qp->fill); free(msg); } - char str[65]; printf("LP_trade mpnet.%d fill.%d gtc.%d %s/%s %.8f vol %.8f dest.(%s) maxprice %.8f etomicdest.(%s) uuid.%s fill.%d gtc.%d\n",qp->mpnet,qp->fill,qp->gtc,qp->srccoin,qp->destcoin,dstr(qp->satoshis),dstr(qp->destsatoshis),bits256_str(str,LP_Alicedestpubkey),maxprice,qp->etomicdest,qp->uuidstr,qp->fill,qp->gtc); + char str[65]; printf("LP_trade mpnet.%d fill.%d gtc.%d %s/%s %.8f vol %.8f dest.(%s) maxprice %.8f etomicdest.(%s) uuid.%s fill.%d gtc.%d\n",qp->mpnet,qp->fill,qp->gtc,qp->srccoin,qp->destcoin,dstr(qp->satoshis),dstr(qp->destsatoshis),bits256_str(str,LP_Alicedestpubkey),qp->maxprice,qp->etomicdest,qp->uuidstr,qp->fill,qp->gtc); return(LP_recent_swaps(0,uuidstr)); } @@ -1203,7 +1208,7 @@ printf("bob %s received REQUEST.(%s) mpnet.%d fill.%d gtc.%d\n",bits256_str(str, if ( qp->mpnet != 0 && qp->gtc != 0 && qp->fill != 0 ) { char *msg = jprint(reqjson,0); - LP_mpnet_send(msg); + LP_mpnet_send(0,msg,1); free(msg); } free_json(reqjson); diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 079dd43fe..d639ec0ad 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -45,6 +45,8 @@ cJSON *LP_quotejson(struct LP_quoteinfo *qp) if ( jobj(retjson,"gui") == 0 ) jaddstr(retjson,"gui",qp->gui[0] != 0 ? qp->gui : LP_gui); jaddstr(retjson,"uuid",qp->uuidstr); + if ( qp->maxprice != 0 ) + jaddnum(retjson,"maxprice",qp->maxprice); if ( qp->mpnet != 0 ) jaddnum(retjson,"mpnet",qp->mpnet); if ( qp->gtc != 0 ) @@ -119,6 +121,7 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) { uint32_t rid,qid; char etomic[64],activesymbol[65],*etomicstr; memset(qp,0,sizeof(*qp)); + qp->maxprice = jdouble(argjson,"maxprice"); qp->mpnet = juint(argjson,"mpnet"); qp->gtc = juint(argjson,"gtc"); qp->fill = juint(argjson,"fill"); @@ -161,9 +164,9 @@ int32_t LP_quoteparse(struct LP_quoteinfo *qp,cJSON *argjson) qp->destvout = jint(argjson,"destvout"); qp->desthash = jbits256(argjson,"desthash"); qp->txfee = j64bits(argjson,"txfee"); - if ( (qp->satoshis= j64bits(argjson,"satoshis")) > qp->txfee ) + if ( (qp->satoshis= j64bits(argjson,"satoshis")) > qp->txfee && fabs(qp->maxprice) < SMALLVAL ) { - //qp->price = (double)qp->destsatoshis / (qp->satoshis = qp->txfee); + qp->maxprice = (double)qp->destsatoshis / (qp->satoshis - qp->txfee); } qp->destsatoshis = j64bits(argjson,"destsatoshis"); qp->desttxfee = j64bits(argjson,"desttxfee"); @@ -739,7 +742,7 @@ void LP_query(void *ctx,char *myipaddr,int32_t mypubsock,char *method,struct LP_ } } if ( qp->mpnet != 0 && qp->gtc != 0 && qp->fill != 0 ) - LP_mpnet_send(msg); + LP_mpnet_send(0,msg,1); free(msg); } diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index aa0866b07..5e17513d3 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -346,6 +346,12 @@ int main(int argc, const char * argv[]) printf("couldnt write to (%s)\n",dirname); exit(0); } + sprintf(dirname,"%s/GTC",GLOBAL_DBDIR), OS_ensure_directory(dirname); + if ( ensure_writable(dirname) < 0 ) + { + printf("couldnt write to (%s)\n",dirname); + exit(0); + } sprintf(dirname,"%s/PRICES",GLOBAL_DBDIR), OS_ensure_directory(dirname); if ( ensure_writable(dirname) < 0 ) {