uint64_t calc_rpsbits(char *move) { uint64_t rpsbits; if ( (rpsbits= stringbits(move)) == stringbits("rock") || rpsbits == stringbits("paper") || rpsbits == stringbits("scissors") ) return(rpsbits); return(0); }
void init_InstantDEX(uint64_t nxt64bits,int32_t testflag,cJSON *json) { int32_t a,b; init_pingpong_queue(&Pending_offersQ,"pending_offers",0,0,0); Pending_offersQ.offset = 0; init_exchanges(json); find_exchange(&a,INSTANTDEX_NXTAENAME), find_exchange(&b,INSTANTDEX_NAME); if ( a != INSTANTDEX_NXTAEID || b != INSTANTDEX_EXCHANGEID ) printf("invalid exchangeid %d, %d\n",a,b); printf("NXT-> %llu BTC -> %llu\n",(long long)stringbits("NXT"),(long long)stringbits("BTC")); }
uint64_t prices777_equiv(uint64_t assetid) { char *str; if ( (str= is_MGWasset(0,assetid)) != 0 ) return(stringbits(str)); return(assetid); }
char *instantdex_parse(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen) { static struct { char *cmdstr; char *(*func)(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen); uint64_t cmdbits; } cmds[] = { { "request", instantdex_request }, { "proposal", instantdex_proposal }, { "accepted", instantdex_accepted }, { "confirmed", instantdex_confirmed }, }; char *retstr = 0; int32_t i; uint64_t cmdbits; if ( cmds[0].cmdbits == 0 ) { for (i=0; i<sizeof(cmds)/sizeof(*cmds); i++) cmds[i].cmdbits = stringbits(cmds[i].cmdstr); } cmdbits = stringbits(msg->cmd); for (i=0; i<sizeof(cmds)/sizeof(*cmds); i++) { if ( cmds[i].cmdbits == cmdbits ) { retstr = (*cmds[i].func)(myinfo,msg,argjson,remoteaddr,signerbits,data,datalen); break; } } return(retstr); }
int32_t bidask_parse(struct destbuf *exchangestr,struct destbuf *name,struct destbuf *base,struct destbuf *rel,struct destbuf *gui,struct InstantDEX_quote *iQ,cJSON *json) { uint64_t basemult,relmult,baseamount,relamount; double price,volume; int32_t exchangeid,keysize,flag; char key[1024],buf[64],*methodstr; memset(iQ,0,sizeof(*iQ)); iQ->s.baseid = j64bits(json,"baseid"); iQ->s.relid = j64bits(json,"relid"); iQ->s.baseamount = j64bits(json,"baseamount"), iQ->s.relamount = j64bits(json,"relamount"); iQ->s.vol = jdouble(json,"volume"); iQ->s.price = jdouble(json,"price"); copy_cJSON(exchangestr,jobj(json,"exchange")); if ( exchangestr->buf[0] == 0 || find_exchange(&exchangeid,exchangestr->buf) == 0 ) exchangeid = -1; iQ->exchangeid = exchangeid; copy_cJSON(base,jobj(json,"base")); copy_cJSON(rel,jobj(json,"rel")); copy_cJSON(name,jobj(json,"name")); methodstr = jstr(json,"method"); if ( methodstr != 0 && (strcmp(methodstr,"placeask") == 0 || strcmp(methodstr,"ask") == 0) ) iQ->s.isask = 1; if ( strcmp(exchangestr->buf,"wallet") == 0 && (iQ->s.baseid == NXT_ASSETID || strcmp(base->buf,"NXT") == 0) ) { flag = 1; if ( strcmp(methodstr,"placeask") == 0 ) methodstr = "placebid"; else if ( strcmp(methodstr,"placebid") == 0 ) methodstr = "placeask"; else if ( strcmp(methodstr,"ask") == 0 ) methodstr = "bid"; else if ( strcmp(methodstr,"bid") == 0 ) methodstr = "ask"; else flag = 0; if ( flag != 0 ) { iQ->s.baseid = iQ->s.relid, iQ->s.relid = NXT_ASSETID; strcpy(base->buf,rel->buf), strcpy(rel->buf,"NXT"); baseamount = iQ->s.baseamount; iQ->s.baseamount = iQ->s.relamount, iQ->s.relamount = baseamount; name->buf[0] = 0; if ( iQ->s.vol > SMALLVAL && iQ->s.price > SMALLVAL ) { iQ->s.vol *= iQ->s.price; iQ->s.price = 1. / iQ->s.price; } iQ->s.isask ^= 1; printf("INVERT\n"); } } if ( (iQ->s.timestamp= juint(json,"timestamp")) == 0 ) iQ->s.timestamp = (uint32_t)time(NULL); copy_cJSON(gui,jobj(json,"gui")), strncpy(iQ->gui,gui->buf,sizeof(iQ->gui)-1); iQ->s.automatch = juint(json,"automatch"); iQ->s.minperc = juint(json,"minperc"); if ( (iQ->s.duration= juint(json,"duration")) == 0 || iQ->s.duration > ORDERBOOK_EXPIRATION ) iQ->s.duration = ORDERBOOK_EXPIRATION; InstantDEX_name(key,&keysize,exchangestr->buf,name->buf,base->buf,&iQ->s.baseid,rel->buf,&iQ->s.relid); //printf(">>>>>>>>>>>> BASE.(%s) REL.(%s)\n",base->buf,rel->buf); iQ->s.basebits = stringbits(base->buf); iQ->s.relbits = stringbits(rel->buf); iQ->s.offerNXT = j64bits(json,"offerNXT"); iQ->s.quoteid = j64bits(json,"quoteid"); if ( strcmp(exchangestr->buf,"shuffle") == 0 ) { if ( iQ->s.price == 0. ) iQ->s.price = 1.; if ( iQ->s.vol == 0. ) iQ->s.vol = 1.; if ( iQ->s.baseamount == 0 ) iQ->s.baseamount = iQ->s.price * SATOSHIDEN; } else { if ( iQ->s.baseamount == 0 || iQ->s.relamount == 0 ) { if ( iQ->s.price <= SMALLVAL || iQ->s.vol <= SMALLVAL ) return(-1); set_best_amounts(&iQ->s.baseamount,&iQ->s.relamount,iQ->s.price,iQ->s.vol); } } if ( iQ->s.quoteid == 0 ) iQ->s.quoteid = calc_quoteid(iQ); else if ( iQ->s.quoteid != calc_quoteid(iQ) ) { printf("bidask_parse quoteid.%llu != calc.%llu\n",(long long)iQ->s.quoteid,(long long)calc_quoteid(iQ)); return(-1); } if ( iQ->s.price > SMALLVAL && iQ->s.vol > SMALLVAL && iQ->s.baseid != 0 && iQ->s.relid != 0 ) { buf[0] = 0, _set_assetname(&basemult,buf,0,iQ->s.baseid); //printf("baseid.%llu -> %s mult.%llu\n",(long long)iQ->baseid,buf,(long long)basemult); buf[0] = 0, _set_assetname(&relmult,buf,0,iQ->s.relid); //printf("relid.%llu -> %s mult.%llu\n",(long long)iQ->relid,buf,(long long)relmult); //basemult = get_assetmult(iQ->baseid), relmult = get_assetmult(iQ->relid); baseamount = (iQ->s.baseamount + basemult/2) / basemult, baseamount *= basemult; relamount = (iQ->s.relamount + relmult/2) / relmult, relamount *= relmult; if ( iQ->s.price != 0. && iQ->s.vol != 0 ) { price = prices777_price_volume(&volume,baseamount,relamount); if ( fabs(iQ->s.price - price)/price > 0.001 ) { printf("cant create accurate price ref.(%f %f) -> (%f %f)\n",iQ->s.price,iQ->s.vol,price,volume); return(-1); } } } return(0); }
uint64_t InstantDEX_name(char *key,int32_t *keysizep,char *exchange,char *name,char *base,uint64_t *baseidp,char *rel,uint64_t *relidp) { uint64_t baseid,relid,assetbits = 0; char *s,*str; baseid = *baseidp, relid = *relidp; //printf(">>>>>> name.(%s) (%s/%s) %llu/%llu\n",name,base,rel,(long long)baseid,(long long)relid); if ( strcmp(base,"5527630") == 0 || baseid == 5527630 ) strcpy(base,"NXT"); if ( strcmp(rel,"5527630") == 0 || relid == 5527630 ) strcpy(rel,"NXT"); if ( relid == 0 && rel[0] != 0 ) { if ( is_decimalstr(rel) != 0 ) relid = calc_nxt64bits(rel); else relid = is_MGWcoin(rel); } else if ( (str= is_MGWasset(0,relid)) != 0 ) strcpy(rel,str); if ( baseid == 0 && base[0] != 0 ) { if ( is_decimalstr(base) != 0 ) baseid = calc_nxt64bits(base); else baseid = is_MGWcoin(base); } else if ( (str= is_MGWasset(0,baseid)) != 0 ) strcpy(base,str); if ( strcmp("InstantDEX",exchange) == 0 || strcmp("nxtae",exchange) == 0 || strcmp("unconf",exchange) == 0 || (baseid != 0 && relid != 0) ) { if ( strcmp(rel,"NXT") == 0 ) s = "+", relid = stringbits("NXT"), strcpy(rel,"NXT"); else if ( strcmp(base,"NXT") == 0 ) s = "-", baseid = stringbits("NXT"), strcpy(base,"NXT"); else s = ""; if ( base[0] == 0 ) { get_assetname(base,baseid); //printf("mapped %llu -> (%s)\n",(long long)baseid,base); } if ( rel[0] == 0 ) { get_assetname(rel,relid); //printf("mapped %llu -> (%s)\n",(long long)relid,rel); } if ( name[0] == 0 ) { if ( relid == NXT_ASSETID ) sprintf(name,"%llu",(long long)baseid); else if ( baseid == NXT_ASSETID ) sprintf(name,"-%llu",(long long)relid); else sprintf(name,"%llu/%llu",(long long)baseid,(long long)relid); } } else { if ( base[0] != 0 && rel[0] != 0 && baseid == 0 && relid == 0 ) { baseid = peggy_basebits(base), relid = peggy_basebits(rel); if ( name[0] == 0 && baseid != 0 && relid != 0 ) { strcpy(name,base); // need to be smarter strcat(name,"/"); strcat(name,rel); } } if ( name[0] == 0 || baseid == 0 || relid == 0 || base[0] == 0 || rel[0] == 0 ) { if ( baseid == 0 && base[0] != 0 ) baseid = stringbits(base); else if ( baseid != 0 && base[0] == 0 ) sprintf(base,"%llu",(long long)baseid); if ( relid == 0 && rel[0] != 0 ) { relid = stringbits(rel); printf("set relid.%llu <- (%s)\n",(long long)relid,rel); } else if ( relid != 0 && rel[0] == 0 ) sprintf(rel,"%llu",(long long)relid); if ( name[0] == 0 ) strcpy(name,base), strcat(name,"/"), strcat(name,rel); } } *baseidp = baseid, *relidp = relid; *keysizep = prices777_key(key,exchange,name,base,baseid,rel,relid); //printf("<<<<<<< name.(%s) (%s/%s) %llu/%llu\n",name,base,rel,(long long)baseid,(long long)relid); return(assetbits); }