static inline juint get_native_u4(address p) { if (HARDWARE_LITTLE_ENDIAN) { return juint(p[0]) | (juint(p[1]) << 8) | (juint(p[2]) << 16) | (juint(p[3]) << 24); } else { return get_Java_u4(p); } }
struct crypto777_block *parse_block777(struct consensus_model *model,struct crypto777_node *nn,struct crypto777_block *block,int32_t len,uint32_t peerid) { char *blockstr = (char *)block->rawblock; uint64_t metric; int32_t bestacct; cJSON *json; uint32_t timestamp,blocknum = 0; if ( (bestacct= validate_block(block)) >= 0 && peerid < nn->numpeers && (json= cJSON_Parse(blockstr)) != 0 ) { blocknum = juint(json,"blocknum"); timestamp = juint(json,"timestamp"); metric = get_API_nxt64bits(cJSON_GetObjectItem(json,"metric")); model->peermetrics[blocknum][peerid] = metric; model->peerblocknum[peerid] = blocknum; free_json(json); if ( block->blocknum == blocknum ) // block->gen.metric == metric && return(block); else printf("error parse.(%s) metric %.8f vs %.8f blocknum %u vs %u\n",blockstr,dstr(block->gen.metric),dstr(metric),block->blocknum,blocknum); } else { int i; for (i=0; i<len; i++) printf("%02x ",((uint8_t *)block)[i]); printf("block.%d (%s) peerid.%d numpeers.%d\n",block->blocknum,blockstr,peerid,nn->numpeers); } return(0); }
struct basilisk_request *basilisk_parsejson(struct basilisk_request *rp,cJSON *reqjson) { uint32_t requestid,quoteid; memset(rp,0,sizeof(*rp)); rp->hash = jbits256(reqjson,"hash"); rp->desthash = jbits256(reqjson,"desthash"); rp->srcamount = j64bits(reqjson,"srcamount"); rp->minamount = j64bits(reqjson,"minamount"); rp->destamount = j64bits(reqjson,"destamount"); requestid = juint(reqjson,"requestid"); quoteid = juint(reqjson,"quoteid"); if ( jstr(reqjson,"relay") != 0 ) rp->relaybits = (uint32_t)calc_ipbits(jstr(reqjson,"relay")); rp->timestamp = juint(reqjson,"timestamp"); rp->quotetime = juint(reqjson,"quotetime"); safecopy(rp->src,jstr(reqjson,"src"),sizeof(rp->src)); safecopy(rp->dest,jstr(reqjson,"dest"),sizeof(rp->dest)); if ( quoteid != 0 ) { rp->quoteid = basilisk_quoteid(rp); if ( quoteid != rp->quoteid ) printf("basilisk_parsejson quoteid.%u != %u error\n",quoteid,rp->quoteid); } rp->requestid = basilisk_requestid(rp); if ( requestid != rp->requestid ) printf("basilisk_parsejson requestid.%u != %u error\n",requestid,rp->requestid); return(rp); }
int32_t basilisk_messagekey(uint8_t *key,bits256 hash,cJSON *valsobj) { uint32_t channel,msgid; int32_t keylen = 0; channel = juint(valsobj,"channel"); msgid = juint(valsobj,"msgid"); keylen += iguana_rwbignum(1,&key[keylen],sizeof(hash),hash.bytes); keylen += iguana_rwnum(1,&key[keylen],sizeof(uint32_t),&channel); keylen += iguana_rwnum(1,&key[keylen],sizeof(uint32_t),&msgid); return(keylen); }
// Write the compact table's entries juint* CompactHashtableWriter::dump_buckets(juint* compact_table, juint* p, NumberSeq* summary) { uintx base_address = 0; uintx max_delta = 0; int num_compact_buckets = 0; if (_type == CompactHashtable<Symbol*, char>::_symbol_table) { base_address = uintx(MetaspaceShared::shared_rs()->base()); max_delta = uintx(MetaspaceShared::shared_rs()->size()); assert(max_delta <= 0x7fffffff, "range check"); } else { assert((_type == CompactHashtable<oop, char>::_string_table), "unknown table"); assert(UseCompressedOops, "UseCompressedOops is required"); } assert(p != NULL, "sanity"); for (int index = 0; index < _num_buckets; index++) { juint count = 0; int bucket_size = _bucket_sizes[index]; int bucket_type = BUCKET_TYPE(compact_table[index]); if (bucket_size == 1) { assert(bucket_type == COMPACT_BUCKET_TYPE, "Bad bucket type"); num_compact_buckets ++; } for (Entry* tent = _buckets[index]; tent; tent = tent->next()) { if (bucket_type == REGULAR_BUCKET_TYPE) { *p++ = juint(tent->hash()); // write entry hash } if (_type == CompactHashtable<Symbol*, char>::_symbol_table) { uintx deltax = uintx(tent->value()) - base_address; assert(deltax < max_delta, "range check"); juint delta = juint(deltax); *p++ = delta; // write entry offset } else { *p++ = oopDesc::encode_heap_oop(tent->string()); } count ++; } assert(count == _bucket_sizes[index], "sanity"); } // Adjust the hashentry_bytes in CompactHashtableStats. Each compact // bucket saves 4-byte. _stats->hashentry_bytes -= num_compact_buckets * 4; return p; }
void prices777_instaforex(uint32_t timestamps[NUM_INSTAFOREX],double bids[NUM_INSTAFOREX],double asks[NUM_INSTAFOREX]) { //{"NZDUSD":{"symbol":"NZDUSD","lasttime":1437580206,"digits":4,"change":"-0.0001","bid":"0.6590","ask":"0.6593"}, char contract[32],*jsonstr; cJSON *json,*item; int32_t i; memset(timestamps,0,sizeof(*timestamps) * NUM_INSTAFOREX); memset(bids,0,sizeof(*bids) * NUM_INSTAFOREX); memset(asks,0,sizeof(*asks) * NUM_INSTAFOREX); jsonstr = issue_curl("https://quotes.instaforex.com/get_quotes.php?q=NZDUSD,NZDCHF,NZDCAD,NZDJPY,GBPNZD,EURNZD,AUDNZD,CADJPY,CADCHF,USDCAD,EURCAD,GBPCAD,AUDCAD,USDCHF,CHFJPY,EURCHF,GBPCHF,AUDCHF,EURUSD,EURAUD,EURJPY,EURGBP,GBPUSD,GBPJPY,GBPAUD,USDJPY,AUDJPY,AUDUSD,XAUUSD&m=json"); if ( jsonstr != 0 ) { printf("(%s)\n",jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { for (i=0; i<NUM_INSTAFOREX; i++) { sprintf(contract,"%s%s",BASERELS[i][0],BASERELS[i][1]); if ( (item= jobj(json,contract)) != 0 ) { timestamps[i] = juint(item,"lasttime"); bids[i] = jdouble(item,"bid"); asks[i] = jdouble(item,"ask"); } } free_json(json); } free(jsonstr); } }
cJSON *gecko_paymentsobj(struct supernet_info *myinfo,cJSON *txjson,cJSON *valsobj,int32_t reusedaddrs) { cJSON *item,*array; char *coinaddr; uint64_t satoshis; uint8_t addrtype,pubkey33[33],rmd160[20],outputscript[512]; int32_t i,n,scriptlen; uint32_t locktime,txversion; struct iguana_waddress *waddr; struct iguana_waccount *wacct; locktime = jint(valsobj,"locktime"); if ( (txversion= juint(valsobj,"txversion")) == 0 ) txversion = (locktime == 0) ? IGUANA_NORMAL_TXVERSION : IGUANA_LOCKTIME_TXVERSION; if ( txjson == 0 ) txjson = bitcoin_txcreate(1,locktime,txversion); if ( (array= jarray(&n,valsobj,"payments")) != 0 && n > 0 ) { for (i=0; i<n; i++) { item = jitem(array,i); if ( (coinaddr= jfieldname(item)) != 0 && (satoshis= j64bits(item,coinaddr)) > 0 ) { printf("payment.%s <- %.8f\n",coinaddr,dstr(satoshis)); bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); scriptlen = 0; if ( reusedaddrs == 0 ) { if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) { if ( bitcoin_pubkeylen(waddr->pubkey) > 0 ) scriptlen = bitcoin_pubkeyspend(outputscript,0,pubkey33); } } if ( scriptlen == 0 ) scriptlen = bitcoin_standardspend(outputscript,0,rmd160); bitcoin_txoutput(txjson,outputscript,scriptlen,satoshis); } } } return(txjson); }
address OsFile_ImagePreferredAddress(const JvmPathChar* jar_file_name) { // Change this if this range is usually not free on your port address base = (address)0x44000000; #if ENABLE_ISOLATES // Use this much of virtual space above the base address for images int reserve_size = 0x04000000; // 64 MB. // usually an image is no larger than 512K (eembc is below 300K) int image_size = 512 * 1024; // The default setting above allow 128 simultaneuos images to be mapped // to their own desired address (if there's no conflict) int num_slots = reserve_size / image_size; juint hash = 0; while (*jar_file_name) { JvmPathChar c = *jar_file_name++; hash = 31 * hash + juint(c); } base += image_size * (hash % num_slots); #else // In SVM mode we never load two images at the same time so we just always // use the same base address; (void)jar_file_name; #endif return base; }
char *SuperNET_parsemainargs(struct supernet_info *myinfo,bits256 *wallethashp,bits256 *wallet2privp,char *argjsonstr) { cJSON *exchanges=0,*json = 0; char *wallet2fname,*coinargs=0,*secret,*filestr; long allocsize; bits256 wallethash,wallet2priv; int32_t n,len; uint8_t secretbuf[8192]; wallethash = wallet2priv = GENESIS_PRIVKEY; if ( argjsonstr != 0 ) { if ( (filestr= OS_filestr(&allocsize,argjsonstr)) != 0 ) { json = cJSON_Parse(filestr); free(filestr); } if ( json != 0 || (json= cJSON_Parse(argjsonstr)) != 0 ) { printf("ARGSTR.(%s)\n",argjsonstr); if ( jobj(json,"numhelpers") != 0 ) IGUANA_NUMHELPERS = juint(json,"numhelpers"); if ( (secret= jstr(json,"passphrase")) != 0 ) { len = (int32_t)strlen(secret); if ( is_hexstr(secret,0) != 0 && len == 128 ) { len >>= 1; decode_hex(secretbuf,len,secret); } else vcalc_sha256(0,secretbuf,(void *)secret,len), len = sizeof(bits256);
char *TRADEHISTORY(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { char payload[1024],pair[64],*retstr = 0; cJSON *json; uint32_t timestamp,endstamp; poloniex_setpair(pair,argjson); timestamp = juint(argjson,"start"); endstamp = juint(argjson,"end"); sprintf(payload,"command=returnTradeHistory&nonce=%llu¤cyPair=%s",(long long)exchange_nonce(exchange),pair); if ( timestamp != 0 ) sprintf(payload + strlen(payload),"&start=%u",timestamp); if ( endstamp != 0 ) sprintf(payload + strlen(payload),"&end=%u",endstamp); if ( (json= SIGNPOST(cHandlep,1,&retstr,exchange,EXCHANGE_AUTHURL,payload)) != 0 ) { free_json(json); } return(retstr); // return standardized tradehistory }
char *basilisk_respond_OUT(struct supernet_info *myinfo,char *CMD,void *addr,char *remoteaddr,uint32_t basilisktag,cJSON *valsobj,uint8_t *data,int32_t datalen,bits256 hash,int32_t from_basilisk) { int32_t keylen; uint8_t key[64]; keylen = basilisk_messagekey(key,hash,valsobj); //printf("keylen.%d datalen.%d\n",keylen,datalen); char str[65]; printf("add message.[%d] channel.%u msgid.%x %s\n",datalen,juint(valsobj,"channel"),juint(valsobj,"msgid"),bits256_str(str,hash)); return(basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,1)); }
void process_json(cJSON *json,char *remoteaddr,int32_t localaccess) { int32_t sock,len,checklen,sendtimeout,recvtimeout; uint32_t apitag; uint64_t tag; char endpoint[128],numstr[64],*resultstr,*jsonstr; jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); len = (int32_t)strlen(jsonstr)+1; apitag = _crc32(0,jsonstr,len); sprintf(endpoint,"ipc://api.%u",apitag); free(jsonstr); if ( (recvtimeout= juint(json,"timeout")) == 0 ) recvtimeout = 30000; sendtimeout = 30000; randombytes((uint8_t *)&tag,sizeof(tag)); if ( cJSON_GetObjectItem(json,"tag") == 0 ) sprintf(numstr,"%llu",(long long)tag), cJSON_AddItemToObject(json,"tag",cJSON_CreateString(numstr)); if ( cJSON_GetObjectItem(json,"apitag") == 0 ) cJSON_AddItemToObject(json,"apitag",cJSON_CreateString(endpoint)); if ( remoteaddr != 0 ) cJSON_AddItemToObject(json,"broadcast",cJSON_CreateString("remoteaccess")); if ( localaccess != 0 ) cJSON_AddItemToObject(json,"localaccess",cJSON_CreateNumber(1)); jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); //fprintf(stderr,"localacess.%d remote.(%s) jsonstr.(%s)\r\n",localaccess,remoteaddr!=0?remoteaddr:"",jsonstr); len = (int32_t)strlen(jsonstr)+1; if ( jsonstr != 0 ) { if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_connect(sock,SUPERNET_APIENDPOINT) < 0 ) printf("error connecting to apiendpoint sock.%d type.%d (%s) %s\r\n",sock,NN_PUSH,SUPERNET_APIENDPOINT,nn_errstr()); else if ( (checklen= nn_send(sock,jsonstr,len,0)) != len ) printf("checklen.%d != len.%d for nn_send to (%s)\r\n",checklen,len,SUPERNET_APIENDPOINT); else { if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_recv(sock,&resultstr,NN_MSG,0) > 0 ) { printf("Content-Length: %ld\r\n\r\n",strlen(resultstr)+2); printf("%s\r\n",resultstr); nn_freemsg(resultstr); } else printf("error getting results %s\r\n",nn_errstr()); } nn_shutdown(sock,0); } else printf("error getting pushsock.%s\r\n",nn_errstr()); } free(jsonstr); }
// Write the compact table's entries juint* CompactHashtableWriter::dump_buckets(juint* compact_table, juint* p, NumberSeq* summary) { uintx base_address = uintx(MetaspaceShared::shared_rs()->base()); uintx max_delta = uintx(MetaspaceShared::shared_rs()->size()); assert(max_delta <= 0x7fffffff, "range check"); int num_compact_buckets = 0; assert(p != NULL, "sanity"); for (int index = 0; index < _num_buckets; index++) { juint count = 0; int bucket_size = _bucket_sizes[index]; int bucket_type = BUCKET_TYPE(compact_table[index]); if (bucket_size == 1) { assert(bucket_type == COMPACT_BUCKET_TYPE, "Bad bucket type"); num_compact_buckets ++; } for (Entry* tent = _buckets[index]; tent; tent = tent->next()) { if (bucket_type == REGULAR_BUCKET_TYPE) { *p++ = juint(tent->hash()); // write symbol hash } uintx deltax = uintx(tent->value()) - base_address; assert(deltax < max_delta, "range check"); juint delta = juint(deltax); *p++ = delta; // write symbol offset count ++; } assert(count == _bucket_sizes[index], "sanity"); } // Adjust the hashentry_bytes in CompactHashtableStats. Each compact // bucket saves 4-byte. _stats->hashentry_bytes -= num_compact_buckets * 4; return p; }
TWO_STRINGS(iguana,persistent,activecoin,ipaddr) { int32_t i; if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) { for (i=0; i<IGUANA_MAXPEERS; i++) { if ( strcmp(coin->peers->active[i].ipaddr,ipaddr) == 0 ) { coin->peers->active[i].persistent_peer = juint(json,"interval")+3; return(clonestr("{\"result\":\"node marked as persistent\"}")); } } return(clonestr("{\"result\":\"node wasnt active\"}")); } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); }
uint64_t TRADE(void **cHandlep,int32_t dotrade,char **retstrp,struct exchange_info *exchange,char *base,char *rel,int32_t dir,double price,double volume) { char payload[1024],market[16],coinname[16],fmtstr[512],*pricefmt,*extra,*volfmt = "%.3f"; cJSON *json,*resultobj; uint64_t txid = 0; if ( (extra= *retstrp) != 0 ) *retstrp = 0; if ( (dir= cny_flip(market,coinname,base,rel,dir,&price,&volume)) == 0 ) { fprintf(stderr,"btc38_trade illegal base.(%s) or rel.(%s)\n",base,rel); return(0); } if ( strcmp(market,"cny") == 0 ) pricefmt = "%.5f"; else pricefmt = "%.6f"; //sprintf(fmtstr,"key=%%s&time=%%llu&md5=%%s&type=%%s&mk_type=%%s&coinname=%%s&price=%s&amount=%s",pricefmt,volfmt); //sprintf(payload,fmtstr,exchange->apikey,(long long)nonce,digest,dir>0?"1":"2",market,coinname,price,volume); sprintf(fmtstr,"&type=%%s&mk_type=%%s&coinname=%%s&price=%s&amount=%s",pricefmt,volfmt); sprintf(payload,fmtstr,dir>0?"1":"2",market,coinname,price,volume); if ( CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume) == 0 && (json= SIGNPOST(cHandlep,dotrade,retstrp,exchange,payload,"submitOrder.php")) != 0 ) { if ( juint(json,"success") > 0 && (resultobj= jobj(json,"return")) != 0 ) { if ( (txid= j64bits(resultobj,"order_id")) == 0 ) { if ( j64bits(resultobj,"remains") == 0 ) txid = _crc32(0,payload,strlen(payload)); } } free_json(json); if ( retstrp != 0 && *retstrp != 0 ) { if ( (json= cJSON_Parse(*retstrp)) == 0 ) { json = cJSON_CreateObject(); jaddstr(json,"result",*retstrp); free(*retstrp); *retstrp = jprint(json,1); } else free_json(json); } } return(txid); }
char *parse_expandedline(char *plugin,int32_t max,char *method,int32_t *timeoutp,char *line,int32_t broadcastflag) { int32_t i,j; char numstr[64],*pubstr,*cmdstr = 0; cJSON *json; uint64_t tag; struct destbuf tmp; for (i=0; i<512&&line[i]!=' '&&line[i]!=0; i++) plugin[i] = line[i]; plugin[i] = 0; *timeoutp = 0; pubstr = line; if ( strcmp(plugin,"pub") == 0 ) strcpy(plugin,"subscriptions"), strcpy(method,"publish"), pubstr += 4; else if ( line[i+1] != 0 ) { for (++i,j=0; i<512&&line[i]!=' '&&line[i]!=0; i++,j++) method[j] = line[i]; method[j] = 0; } else method[0] = 0; if ( (json= cJSON_Parse(line+i+1)) == 0 ) json = cJSON_CreateObject(); if ( json != 0 ) { if ( strcmp("direct",method) == 0 && cJSON_GetObjectItem(json,"myipaddr") == 0 ) cJSON_AddItemToObject(json,"myipaddr",cJSON_CreateString(SUPERNET.myipaddr)); if ( cJSON_GetObjectItem(json,"tag") == 0 ) randombytes((void *)&tag,sizeof(tag)), sprintf(numstr,"%llu",(long long)tag), cJSON_AddItemToObject(json,"tag",cJSON_CreateString(numstr)); //if ( cJSON_GetObjectItem(json,"NXT") == 0 ) // cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(SUPERNET.NXTADDR)); *timeoutp = juint(json,"timeout"); if ( plugin[0] == 0 ) strcpy(plugin,"relay"); if ( cJSON_GetObjectItem(json,"plugin") == 0 ) cJSON_AddItemToObject(json,"plugin",cJSON_CreateString(plugin)); else copy_cJSON(&tmp,cJSON_GetObjectItem(json,"plugin")), safecopy(plugin,tmp.buf,max); if ( method[0] == 0 ) strcpy(method,"help"); cJSON_AddItemToObject(json,"method",cJSON_CreateString(method)); if ( broadcastflag != 0 ) cJSON_AddItemToObject(json,"broadcast",cJSON_CreateString("allrelays")); cmdstr = cJSON_Print(json), _stripwhite(cmdstr,' '); return(cmdstr); } else return(clonestr(pubstr)); }
char *TRADEHISTORY(struct exchange_info *exchange,cJSON *argjson) { char payload[1024],baserel[16],*method,*base,*rel,*retstr = 0; uint32_t timestamp; cJSON *json; method = "mytrades"; base = jstr(argjson,"base"); rel = jstr(argjson,"rel"); if ( base == 0 || rel == 0 ) { base = "BTC"; rel = "USD"; } sprintf(baserel,"%s%s",base,rel); timestamp = juint(argjson,"start"); sprintf(payload,"{\"request\":\"/v1/%s\",\"nonce\":\"%llu\",\"symbol\":\"%s\",\"timestamp\":%u}",method,(long long)exchange_nonce(exchange),baserel,timestamp); //printf("TRADEHISTORY.(%s)\n",payload); if ( (json= SIGNPOST(&retstr,exchange,payload,method)) != 0 ) { free_json(json); } return(retstr); // return standardized tradehistory }
char *SuperNET_processJSON(struct supernet_info *myinfo,cJSON *json,char *remoteaddr) { cJSON *retjson; uint64_t tag; uint32_t timeout; char *jsonstr,*method,*retjsonstr,*retstr = 0; //char str[65]; printf("processJSON %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey)); if ( json != 0 ) { if ( (tag= j64bits(json,"tag")) == 0 ) { OS_randombytes((uint8_t *)&tag,sizeof(tag)); jadd64bits(json,"tag",tag); } if ( (timeout= juint(json,"timeout")) == 0 ) timeout = IGUANA_JSONTIMEOUT; if ( (method= jstr(json,"method")) != 0 && strcmp(method,"DHT") == 0 && remoteaddr != 0 ) { SuperNET_hexmsgprocess(myinfo,0,json,jstr(json,"hexmsg"),remoteaddr); return(clonestr("{\"result\":\"processed remote DHT\"}")); } jsonstr = jprint(json,0); if ( remoteaddr == 0 || jstr(json,"immediate") != 0 ) retjsonstr = SuperNET_jsonstr(myinfo,jsonstr,remoteaddr); else retjsonstr = iguana_blockingjsonstr(myinfo,jsonstr,tag,timeout,remoteaddr); if ( retjsonstr != 0 ) { if ( (retjson= cJSON_Parse(retjsonstr)) != 0 ) { jdelete(retjson,"tag"); jadd64bits(retjson,"tag",tag); retstr = jprint(retjson,1); //printf("retstr.(%s) retjsonstr.%p retjson.%p\n",retstr,retjsonstr,retjson); free(retjsonstr);//,strlen(retjsonstr)+1); } else retstr = retjsonstr; } free(jsonstr); } else retstr = clonestr("{\"error\":\"cant parse JSON\"}"); if ( retstr == 0 ) retstr = clonestr("{\"error\":\"null return\"}"); return(retstr); }
int32_t basilisk_respond_geckogetheaders(struct supernet_info *myinfo,struct iguana_info *virt,uint8_t *serialized,int32_t maxsize,cJSON *valsobj,bits256 hash2) { int32_t i,n,num,height,len=0; struct iguana_block *block; if ( (block= iguana_blockfind("geckohdr",virt,hash2)) != 0 ) { if ( (height= block->height) >= 0 ) { if ( (num= juint(valsobj,"num")) == 0 || num > virt->chain->bundlesize ) num = virt->chain->bundlesize; for (i=0; i<num; i++) { if ( block != 0 ) { if ( (n= iguana_headerget(myinfo,virt,&serialized[len],maxsize-len,block)) > 0 ) len += n; } hash2 = iguana_blockhash(virt,height+i+1); block = iguana_blockfind("geckohdri",virt,hash2); } return(len); } } return(-1); }
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); }
void PAX_btcprices(struct peggy_info *PEGS,int32_t enddatenum,int32_t numdates) { int32_t i,n,year,month,day,seconds,datenum; char url[1024],date[64],*dstr,*str; uint32_t timestamp,utc32[MAX_SPLINES]; struct tai t; cJSON *coindesk,*quandl,*btcdhist,*bpi,*array,*item; double btcddaily[MAX_SPLINES],cdaily[MAX_SPLINES],qdaily[MAX_SPLINES],ask,high,low,bid,close,vol,quotevol,open,price = 0.; coindesk = url_json("http://api.coindesk.com/v1/bpi/historical/close.json"); sprintf(url,"https://poloniex.com/public?command=returnChartData¤cyPair=BTC_BTCD&start=%ld&end=9999999999&period=86400",(long)(time(NULL)-numdates*3600*24)); if ( (bpi= jobj(coindesk,"bpi")) != 0 ) { datenum = enddatenum; memset(utc32,0,sizeof(utc32)); memset(cdaily,0,sizeof(cdaily)); if ( datenum == 0 ) { datenum = OS_conv_unixtime(&t,&seconds,(uint32_t)time(NULL)); printf("got datenum.%d %d %d %d\n",datenum,seconds/3600,(seconds/60)%24,seconds%60); } for (i=0; i<numdates; i++) { expand_datenum(date,datenum); if ( (price= jdouble(bpi,date)) != 0 ) { utc32[numdates - 1 - i] = OS_conv_datenum(datenum,12,0,0); cdaily[numdates - 1 - i] = price * .001; //printf("(%s %u %f) ",date,utc32[numdates - 1 - i],price); } datenum = ecb_decrdate(&year,&month,&day,date,datenum); } PAX_genspline(&PEGS->splines[MAX_CURRENCIES],MAX_CURRENCIES,"coindesk",utc32,cdaily,numdates,cdaily); } else printf("no bpi\n"); quandl = url_json("https://www.quandl.com/api/v1/datasets/BAVERAGE/USD.json?rows=64"); if ( (str= jstr(quandl,"updated_at")) != 0 && (datenum= conv_date(&seconds,str)) > 0 && (array= jarray(&n,quandl,"data")) != 0 ) { printf("datenum.%d data.%d %d\n",datenum,n,cJSON_GetArraySize(array)); memset(utc32,0,sizeof(utc32)), memset(qdaily,0,sizeof(qdaily)); for (i=0; i<n&&i<MAX_SPLINES; i++) { // ["Date","24h Average","Ask","Bid","Last","Total Volume"] // ["2015-07-25",289.27,288.84,288.68,288.87,44978.61] item = jitem(array,i); if ( Debuglevel > 2 ) printf("(%s) ",cJSON_Print(item)); if ( (dstr= jstr(jitem(item,0),0)) != 0 && (datenum= conv_date(&seconds,dstr)) > 0 ) { price = jdouble(jitem(item,1),0), ask = jdouble(jitem(item,2),0), bid = jdouble(jitem(item,3),0); close = jdouble(jitem(item,4),0), vol = jdouble(jitem(item,5),0); if ( Debuglevel > 2 ) fprintf(stderr,"%d.[%d %f %f %f %f %f].%d ",i,datenum,price,ask,bid,close,vol,n); utc32[numdates - 1 - i] = OS_conv_datenum(datenum,12,0,0), qdaily[numdates - 1 - i] = price * .001; } } PAX_genspline(&PEGS->splines[MAX_CURRENCIES+1],MAX_CURRENCIES+1,"quandl",utc32,qdaily,n<MAX_SPLINES?n:MAX_SPLINES,qdaily); } btcdhist = url_json(url); //{"date":1406160000,"high":0.01,"low":0.00125,"open":0.01,"close":0.001375,"volume":1.50179994,"quoteVolume":903.58818412,"weightedAverage":0.00166204}, if ( (array= jarray(&n,btcdhist,0)) != 0 ) { memset(utc32,0,sizeof(utc32)), memset(btcddaily,0,sizeof(btcddaily)); //printf("GOT.(%s)\n",cJSON_Print(array)); for (i=0; i<n; i++) { item = jitem(array,i); timestamp = juint(item,"date"), high = jdouble(item,"high"), low = jdouble(item,"low"), open = jdouble(item,"open"); close = jdouble(item,"close"), vol = jdouble(item,"volume"), quotevol = jdouble(item,"quoteVolume"), price = jdouble(item,"weightedAverage"); //printf("[%u %f %f %f %f %f %f %f]",timestamp,high,low,open,close,vol,quotevol,price); if ( Debuglevel > 2 ) printf("[%u %d %f]",timestamp,OS_conv_unixtime(&t,&seconds,timestamp),price); utc32[i] = timestamp - 12*3600, btcddaily[i] = price * 100.; } if ( Debuglevel > 2 ) printf("poloniex.%d\n",n); PAX_genspline(&PEGS->splines[MAX_CURRENCIES+2],MAX_CURRENCIES+2,"btcdhist",utc32,btcddaily,n<MAX_SPLINES?n:MAX_SPLINES,btcddaily); } // https://poloniex.com/public?command=returnChartData¤cyPair=BTC_BTCD&start=1405699200&end=9999999999&period=86400 }
void PAX_update(struct peggy_info *PEGS,double *btcusdp,double *btcdbtcp) { int32_t i,n,seconds,datenum; uint32_t timestamp; char url[1024],*dstr,*str; double btcddaily=0.,btcusd=0.,ask,high,low,bid,close,vol,quotevol,open,price = 0.; //cJSON *btcdtrades,*btcdtrades2,*,*bitcoincharts,; cJSON *quandl,*btcdhist,*array,*item,*bitcoinave,*blockchaininfo,*coindesk=0; //btcdtrades = url_json("https://poloniex.com/public?command=returnTradeHistory¤cyPair=BTC_BTCD"); //btcdtrades2 = url_json("https://bittrex.com/api/v1.1/public/getmarkethistory?market=BTC-BTCD&count=50"); bitcoinave = url_json("https://api.bitcoinaverage.com/ticker/USD/"); //bitcoincharts = url_json("http://api.bitcoincharts.com/v1/weighted_prices.json"); blockchaininfo = url_json("https://blockchain.info/ticker"); coindesk = url_json("http://api.coindesk.com/v1/bpi/historical/close.json"); sprintf(url,"https://poloniex.com/public?command=returnChartData¤cyPair=BTC_BTCD&start=%ld&end=9999999999&period=86400",(long)(time(NULL)-2*3600*24)); quandl = url_json("https://www.quandl.com/api/v1/datasets/BAVERAGE/USD.json?rows=1"); if ( quandl != 0 && (str= jstr(quandl,"updated_at")) != 0 && (datenum= conv_date(&seconds,str)) > 0 && (array= jarray(&n,quandl,"data")) != 0 ) { //printf("datenum.%d data.%d %d\n",datenum,n,cJSON_GetArraySize(array)); for (i=0; i<1; i++) { // ["Date","24h Average","Ask","Bid","Last","Total Volume"] // ["2015-07-25",289.27,288.84,288.68,288.87,44978.61] item = jitem(array,i); if ( (dstr= jstr(jitem(item,0),0)) != 0 && (datenum= conv_date(&seconds,dstr)) > 0 ) { btcusd = price = jdouble(jitem(item,1),0), ask = jdouble(jitem(item,2),0), bid = jdouble(jitem(item,3),0); close = jdouble(jitem(item,4),0), vol = jdouble(jitem(item,5),0); //fprintf(stderr,"%d.[%d %f %f %f %f %f].%d ",i,datenum,price,ask,bid,close,vol,n); } } } { double avebid,aveask,bidvol,askvol; struct exchange_quote sortbuf[512]; struct supernet_info *myinfo = SuperNET_MYINFO(0); cJSON *argjson = cJSON_Parse("{}"); aveask = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&askvol,"BTCD","BTC",1,argjson); avebid = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&bidvol,"BTCD","BTC",-1,argjson); if ( avebid > SMALLVAL && aveask > SMALLVAL ) { price = (avebid*bidvol + aveask*askvol) / (bidvol + askvol); *btcdbtcp = price; printf("set BTCD price %f\n",price); PEGS->btcdbtc = price; } else { btcdhist = url_json(url); //{"date":1406160000,"high":0.01,"low":0.00125,"open":0.01,"close":0.001375,"volume":1.50179994,"quoteVolume":903.58818412,"weightedAverage":0.00166204}, if ( btcdhist != 0 && (array= jarray(&n,btcdhist,0)) != 0 ) { //printf("GOT.(%s)\n",cJSON_Print(array)); for (i=0; i<1; i++) { item = jitem(array,i); timestamp = juint(item,"date"), high = jdouble(item,"high"), low = jdouble(item,"low"), open = jdouble(item,"open"); close = jdouble(item,"close"), vol = jdouble(item,"volume"), quotevol = jdouble(item,"quoteVolume"), price = jdouble(item,"weightedAverage"); //printf("[%u %f %f %f %f %f %f %f]",timestamp,high,low,open,close,vol,quotevol,price); //printf("[%u %d %f]",timestamp,OS_conv_unixtime(&seconds,timestamp),price); btcddaily = price; if ( btcddaily != 0 ) PEGS->btcdbtc = *btcdbtcp = btcddaily; } //printf("poloniex.%d\n",n); } if ( btcdhist != 0 ) free_json(btcdhist); } } if ( bitcoinave != 0 ) { if ( (price= jdouble(bitcoinave,"24h_avg")) > SMALLVAL ) { //printf("bitcoinave %f %f\n",btcusd,price); dxblend(&btcusd,price,0.5); } free_json(bitcoinave); } if ( quandl != 0 ) free_json(quandl); if ( coindesk != 0 ) free_json(coindesk); if ( blockchaininfo != 0 ) { if ( (item= jobj(blockchaininfo,"USD")) != 0 && item != 0 && (price= jdouble(item,"15m")) > SMALLVAL ) { //printf("blockchaininfo %f %f\n",btcusd,price); dxblend(&btcusd,price,0.5); } free_json(blockchaininfo); } if ( btcusd != 0 ) PEGS->btcusd = *btcusdp = btcusd; }
static inline juint get_Java_u4(address p) { return juint(p[0] << 24) | (juint(p[1]) << 16) | (juint(p[2]) << 8) | (juint(p[3])); }
uint64_t bitcoin_parseunspent(struct iguana_info *coin,struct bitcoin_unspent *unspent,double minconfirms,char *account,cJSON *item) { char *hexstr,coinaddr[64]; memset(unspent,0,sizeof(*unspent)); if ( jstr(item,"address") != 0 ) { safecopy(coinaddr,jstr(item,"address"),sizeof(coinaddr)); bitcoin_addr2rmd160(&unspent->addrtype,unspent->rmd160,coinaddr); /*sprintf(args,"[\"%s\"]",coinaddr); wifstr = bitcoind_RPC(0,coin->symbol,coin->chain->serverport,coin->chain->userpass,"dumpprivkey",args); if ( wifstr != 0 ) { bitcoin_wif2priv(&addrtype,&unspent->privkeys[0],wifstr); //printf("wifstr.(%s) -> %s\n",wifstr,bits256_str(str,unspent->privkeys[0])); free(wifstr); } else fprintf(stderr,"error (%s) cant find privkey\n",coinaddr);*/ } if ( (account == 0 || jstr(item,"account") == 0 || strcmp(account,jstr(item,"account")) == 0) && (minconfirms <= 0 || juint(item,"confirmations") >= minconfirms-SMALLVAL) ) { if ( (hexstr= jstr(item,"scriptPubKey")) != 0 ) { unspent->spendlen = (int32_t)strlen(hexstr) >> 1; if ( unspent->spendlen < sizeof(unspent->spendscript) ) decode_hex(unspent->spendscript,unspent->spendlen,hexstr); } unspent->txid = jbits256(item,"txid"); unspent->value = SATOSHIDEN * jdouble(item,"amount"); unspent->vout = jint(item,"vout"); //char str[65]; printf("(%s) -> %s %.8f scriptlen.%d\n",jprint(item,0),bits256_str(str,unspent->txid),dstr(unspent->value),unspent->scriptlen); } else printf("skip.(%s) minconfirms.%f\n",jprint(item,0),minconfirms);
ReturnOop SymbolTable::symbol_for(TypeArray *byte_array, utf8 s, int len, bool check_only JVM_TRAPS) { if (byte_array == NULL) { // If the source of the new symbol lives in the heap, you must // GC-protect it by passing the source in a byte_array GUARANTEE(!ObjectHeap::contains((OopDesc*)s), "must not be in heap"); } if (unsigned(len) > 0xfff0) { // Symbol's string length is a unsigned 16-bit number Throw::out_of_memory_error(JVM_SINGLE_ARG_THROW_0); } const juint hash_value = hash(s, len); if (UseROM) { // The ROM symbol table's layout is different than that of the // symbol table in heap. The main reason is to avoids holes in // the table. // // ************************************************************** // WARNING: the value of ROM::symbol_table_num_buckets() is 1 off // what you would think. Read the following carefully. // ************************************************************** // // Layout of the ROM symbol table with <n> buckets: // // (a) The first <n> elements are pointers to the start of the // <n> buckets. Note that element <n> also marks the exclusive // end of the <n-1> bucket. // (b) One additional element is written at to mark the exclusive // end of the very last bucket. // (c) If RewriteROMConstantPool is disabled, the contents of // bucket #0 starts here, followed by the contents of bucket #1, // and so forth. // // For example, say we have two buckets; bucket #0 contains "foo"; // bucket #1 contains "bar" and "blah": // // symbol_table_size = 2; // symbol_table[] = { // &symbol_table[3]; // (a) start of bucket#0 // &symbol_table[4]; // (a) end of bucket#0/start of bucket#1 // &symbol_table[6]; // (b) end of bucket#1 // pointer to Symbol "foo"; // (c) item in bucket#0 // pointer to Symbol "bar"; // (c) item in bucket#1 // pointer to Symbol "blah"; // (c) item in bucket#1 // }; // // Note that if RewriteROMConstantPool is enabled (the default), // part (c) is actually stored inside the merged constant pool; // parts (a) and (b) are written with special macros to point to // the merged constant pool instead. ReturnOop old_sym = ROM::symbol_for(s, hash_value, len); if( old_sym ) { return old_sym; } } const juint mask = juint(length() - 1); juint index = hash_value & mask; const juint start = index; SymbolDesc**base = (SymbolDesc**)base_address(); SymbolDesc* old; if (0 < len && len <= 6) { // Quicker search. This happens very frequently if a MIDlet is // obfuscated -- many variables will have name length <= 6 // // Note: this requires that the unused space in the SymbolDesc be filled // with zeros. union { jushort shorts[4]; juint ints[2]; } blob; blob.ints[0] = 0; blob.ints[1] = 0; blob.shorts[0] = (jushort)len; jvm_memcpy(&blob.shorts[1], s, len); const juint blob0 = blob.ints[0]; if( len <= 2 ) { do { old = base[index]; if( old == NULL ) break; const juint *body = ((const juint*)old) + sizeof(OopDesc)/BytesPerWord; if (blob0 == body[0]) { return (ReturnOop)old; } index ++; index &= mask; // Do not rewrite as while( (index = (++index & mask)) != start ); // ADS compiler generates incorrect code. } while( index != start ); } else { const juint blob1 = blob.ints[1]; do { old = base[index]; if( old == NULL ) break; const juint *body = ((const juint*)old) + sizeof(OopDesc)/BytesPerWord; if( blob0 == body[0] && blob1 == body[1] ) { return (ReturnOop)old; } index ++; index &= mask; // Do not rewrite as while( (index = (++index & mask)) != start ); // ADS compiler generates incorrect code. } while( index != start ); } } else { do { old = base[index]; if( old == NULL ) break; if( old->matches(s, len)) { return (ReturnOop)old; } index ++; index &= mask; // Do not rewrite as while( (index = (++index & mask)) != start ); // ADS compiler generates incorrect code. } while( index != start ); } if (check_only) { // The specified symbol is not found return NULL; } else { if( old ) { // We'd come to here if we're really out of memory Throw::out_of_memory_error(JVM_SINGLE_ARG_THROW_0); } // Create a new Symbol of the specified value UsingFastOops fast_oops; Symbol::Fast new_symbol = Universe::new_symbol(byte_array, s, len JVM_CHECK_0); obj_at_put(index, &new_symbol); int new_count = Task::current()->incr_symbol_table_count(); if (new_count > desired_max_symbol_count()) { grow_and_replace_symbol_table(); } return new_symbol.obj(); } }
char *InstantDEX(char *jsonstr,char *remoteaddr,int32_t localaccess) { char *prices777_allorderbooks(); char *InstantDEX_openorders(); char *InstantDEX_tradehistory(int32_t firsti,int32_t endi); char *InstantDEX_cancelorder(char *activenxt,char *secret,uint64_t sequenceid,uint64_t quoteid); struct destbuf exchangestr,method,gui,name,base,rel; double balance; char *retstr = 0,key[512],retbuf[1024],*activenxt,*secret,*coinstr; struct InstantDEX_quote iQ; struct exchange_info *exchange; cJSON *json; uint64_t assetbits,sequenceid; uint32_t maxdepth; int32_t invert=0,keysize,allfields; struct prices777 *prices; //printf("INSTANTDEX.(%s)\n",jsonstr); if ( INSTANTDEX.readyflag == 0 ) return(0); if ( jsonstr != 0 && (json= cJSON_Parse(jsonstr)) != 0 ) { // test: asset/asset, asset/external, external/external, autofill and automatch // peggy integration bidask_parse(&exchangestr,&name,&base,&rel,&gui,&iQ,json); if ( iQ.s.offerNXT == 0 ) iQ.s.offerNXT = SUPERNET.my64bits; //printf("isask.%d base.(%s) rel.(%s)\n",iQ.s.isask,base.buf,rel.buf); copy_cJSON(&method,jobj(json,"method")); if ( (sequenceid= j64bits(json,"orderid")) == 0 ) sequenceid = j64bits(json,"sequenceid"); allfields = juint(json,"allfields"); if ( (maxdepth= juint(json,"maxdepth")) <= 0 ) maxdepth = MAX_DEPTH; if ( exchangestr.buf[0] == 0 ) { if ( iQ.s.baseid != 0 && iQ.s.relid != 0 ) strcpy(exchangestr.buf,"nxtae"); else strcpy(exchangestr.buf,"basket"); } assetbits = InstantDEX_name(key,&keysize,exchangestr.buf,name.buf,base.buf,&iQ.s.baseid,rel.buf,&iQ.s.relid); //printf("2nd isask.%d base.(%s) rel.(%s)\n",iQ.s.isask,base.buf,rel.buf); exchange = exchange_find(exchangestr.buf); secret = jstr(json,"secret"), activenxt = jstr(json,"activenxt"); if ( secret == 0 ) { secret = SUPERNET.NXTACCTSECRET; activenxt = SUPERNET.NXTADDR; } if ( strcmp(method.buf,"allorderbooks") == 0 ) retstr = prices777_allorderbooks(); /*else if ( strcmp(method.buf,"coinshuffle") == 0 ) { if ( strcmp(exchangestr.buf,"shuffle") == 0 ) retstr = InstantDEX_coinshuffle(base.buf,&iQ,json); else retstr = clonestr("{\"error\":\"coinshuffle must use shuffle exchange\"}"); }*/ else if ( strcmp(method.buf,"openorders") == 0 ) retstr = InstantDEX_openorders(SUPERNET.NXTADDR,juint(json,"allorders")); else if ( strcmp(method.buf,"allexchanges") == 0 ) retstr = jprint(exchanges_json(),1); else if ( strcmp(method.buf,"cancelorder") == 0 ) retstr = InstantDEX_cancelorder(jstr(json,"activenxt"),jstr(json,"secret"),sequenceid,iQ.s.quoteid); else if ( strcmp(method.buf,"orderstatus") == 0 ) retstr = InstantDEX_orderstatus(sequenceid,iQ.s.quoteid); else if ( strcmp(method.buf,"tradehistory") == 0 ) retstr = InstantDEX_tradehistory(juint(json,"firsti"),juint(json,"endi")); else if ( strcmp(method.buf,"lottostats") == 0 ) retstr = jprint(InstantDEX_lottostats(),1); else if ( strcmp(method.buf,"balance") == 0 ) { if ( exchange != 0 && exchange->trade != 0 ) { if ( (coinstr= jstr(json,"base")) != 0 ) { if ( exchange->coinbalance != 0 ) { if ( exchange->balancejson == 0 ) { (*exchange->trade)(&retstr,exchange,0,0,0,0,0); if ( retstr != 0 ) { exchange->balancejson = cJSON_Parse(retstr); free(retstr); } } return((*exchange->coinbalance)(exchange,&balance,coinstr)); } else retstr = clonestr("{\"error\":\"coinbalance missing\"}"); } else (*exchange->trade)(&retstr,exchange,0,0,0,0,0); } else retstr = clonestr("{\"error\":\"cant find exchange\"}"); printf("%s ptr%.p trade.%p\n",exchangestr.buf,exchange,exchange!=0?exchange->trade:0); } else if ( strcmp(method.buf,"tradesequence") == 0 ) { //printf("call tradesequence.(%s)\n",jsonstr); retstr = InstantDEX_tradesequence(activenxt,secret,json); } else if ( strcmp(method.buf,"makebasket") == 0 ) { if ( (prices= prices777_makebasket(0,json,1,"basket",0,0)) != 0 ) retstr = clonestr("{\"result\":\"basket made\"}"); else retstr = clonestr("{\"error\":\"couldnt make basket\"}"); } else if ( strcmp(method.buf,"peggyrates") == 0 ) { if ( SUPERNET.peggy != 0 ) retstr = peggyrates(juint(json,"timestamp")); else retstr = clonestr("{\"error\":\"peggy disabled\"}"); } else if ( strcmp(method.buf,"LSUM") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\",\"amount\":%d}",(rand() & 1) ? "BUY" : "SELL",(rand() % 100) * 100000); retstr = clonestr(retbuf); } else if ( strcmp(method.buf,"placebid") == 0 || strcmp(method.buf,"placeask") == 0 ) return(InstantDEX_placebidask(0,sequenceid,exchangestr.buf,name.buf,base.buf,rel.buf,&iQ,jstr(json,"extra"),secret,activenxt,json)); else if ( strcmp(exchangestr.buf,"active") == 0 && strcmp(method.buf,"orderbook") == 0 ) retstr = prices777_activebooks(name.buf,base.buf,rel.buf,iQ.s.baseid,iQ.s.relid,maxdepth,allfields,strcmp(exchangestr.buf,"active") == 0 || juint(json,"tradeable")); else if ( (prices= prices777_find(&invert,iQ.s.baseid,iQ.s.relid,exchangestr.buf)) == 0 ) { if ( (prices= prices777_poll(exchangestr.buf,name.buf,base.buf,iQ.s.baseid,rel.buf,iQ.s.relid)) != 0 ) { if ( prices777_equiv(prices->baseid) == prices777_equiv(iQ.s.baseid) && prices777_equiv(prices->relid) == prices777_equiv(iQ.s.relid) ) invert = 0; else if ( prices777_equiv(prices->baseid) == prices777_equiv(iQ.s.relid) && prices777_equiv(prices->relid) == prices777_equiv(iQ.s.baseid) ) invert = 1; else invert = 0, printf("baserel not matching (%s %s) %llu %llu vs (%s %s) %llu %llu\n",prices->base,prices->rel,(long long)prices->baseid,(long long)prices->relid,base.buf,rel.buf,(long long)iQ.s.baseid,(long long)iQ.s.relid); } } if ( retstr == 0 && prices != 0 ) { if ( strcmp(method.buf,"disable") == 0 ) { if ( prices != 0 ) { if ( strcmp(prices->exchange,"unconf") == 0 ) return(clonestr("{\"error\":\"cannot disable unconf\"}")); prices->disabled = 1; return(clonestr("{\"result\":\"success\"}")); } else return(clonestr("{\"error\":\"no prices to disable\"}")); } else if ( strcmp(method.buf,"enable") == 0 ) { if ( prices != 0 ) { prices->disabled = 0; return(clonestr("{\"result\":\"success\"}")); } else return(clonestr("{\"error\":\"no prices to enable\"}")); } else if ( strcmp(method.buf,"orderbook") == 0 ) { if ( maxdepth < MAX_DEPTH ) return(prices777_orderbook_jsonstr(invert,SUPERNET.my64bits,prices,&prices->O,maxdepth,allfields)); else if ( (retstr= prices->orderbook_jsonstrs[invert][allfields]) == 0 ) { retstr = prices777_orderbook_jsonstr(invert,SUPERNET.my64bits,prices,&prices->O,MAX_DEPTH,allfields); portable_mutex_lock(&prices->mutex); if ( prices->orderbook_jsonstrs[invert][allfields] != 0 ) free(prices->orderbook_jsonstrs[invert][allfields]); prices->orderbook_jsonstrs[invert][allfields] = retstr; portable_mutex_unlock(&prices->mutex); if ( retstr == 0 ) retstr = clonestr("{}"); } if ( retstr != 0 ) retstr = clonestr(retstr); } } //if ( Debuglevel > 2 ) printf("(%s) %p exchange.(%s) base.(%s) %llu rel.(%s) %llu | name.(%s) %llu\n",retstr!=0?retstr:"",prices,exchangestr.buf,base.buf,(long long)iQ.s.baseid,rel.buf,(long long)iQ.s.relid,name.buf,(long long)assetbits); } return(retstr); }