cJSON *LP_assethbla(char *assetid) { char url[1024],*retstr; int32_t n; cJSON *array,*bid=0,*ask=0,*retjson; sprintf(url,"http://%s:7876/nxt?requestType=getBidOrders&asset=%s&firstIndex=0&lastIndex=0",NXTnodes[LP_rand() % (sizeof(NXTnodes)/sizeof(*NXTnodes))],assetid); if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) { bid = cJSON_Parse(retstr); free(retstr); } sprintf(url,"http://%s:7876/nxt?requestType=getAskOrders&asset=%s&firstIndex=0&lastIndex=0",NXTnodes[LP_rand() % (sizeof(NXTnodes)/sizeof(*NXTnodes))],assetid); if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) { ask = cJSON_Parse(retstr); free(retstr); } retjson = cJSON_CreateObject(); if ( bid != 0 && ask != 0 ) { if ( (array= jarray(&n,bid,"bidOrders")) != 0 ) jadd(retjson,"bid",jduplicate(jitem(array,0))); if ( (array= jarray(&n,ask,"askOrders")) != 0 ) jadd(retjson,"ask",jduplicate(jitem(array,0))); } if ( bid != 0 ) free_json(bid); if ( ask != 0 ) free_json(ask); return(retjson); }
char *pangea_dispsummary(struct supernet_info *myinfo,struct table_info *tp,int32_t verbose,uint8_t *summary,int32_t summarysize,bits256 tablehash,int32_t handid,int32_t numplayers) { int32_t i,cardi,n = 0,len = 0; uint8_t type; uint64_t valA,bits64[CARDS777_MAXPLAYERS + (CARDS777_MAXCARDS+1)*4]; bits256 card; cJSON *item,*json,*all,*cardis[52],*players[CARDS777_MAXPLAYERS],*pitem,*array = cJSON_CreateArray(); all = cJSON_CreateArray(); memset(cardis,0,sizeof(cardis)); memset(players,0,sizeof(players)); for (i=0; i<numplayers; i++) players[i] = cJSON_CreateArray(); while ( len < summarysize ) { memset(bits64,0,sizeof(bits64)); len = pangea_parsesummary(&type,&valA,bits64,&card,summary,len); if ( (item= pangea_handitem(&cardi,&pitem,type,valA,bits64,card,numplayers)) != 0 ) { if ( cardi >= 0 && cardi < 52 ) { //printf("cardis[%d] <- %p\n",cardi,item); cardis[cardi] = item; } else jaddi(array,item); item = 0; } if ( pitem != 0 ) { jaddnum(pitem,"n",n), n++; if ( (int32_t)valA >= 0 && valA < numplayers ) jaddi(players[valA],pitem); else free_json(pitem), printf("illegal player.%llu\n",(long long)valA); pitem = 0; } } for (i=0; i<numplayers; i++) jaddi(all,players[i]); if ( verbose == 0 ) { for (i=0; i<52; i++) if ( cardis[i] != 0 ) free_json(cardis[i]); free_json(array); return(jprint(all,1)); } else { json = cJSON_CreateObject(); jaddbits256(json,"tablehash",tablehash); jaddnum(json,"size",summarysize); jaddnum(json,"handid",handid); //jaddnum(json,"crc",_crc32(0,summary,summarysize)); jadd(json,"hand",array); array = cJSON_CreateArray(); for (i=0; i<52; i++) if ( cardis[i] != 0 ) jaddi(array,cardis[i]); jadd(json,"cards",array); //jadd(json,"players",all); return(jprint(json,1)); } }
int main(int argc, const char * argv[]) { char *base,*rel,*name,*exchange,*apikey,*apisecret,*blocktrail; double profitmargin,maxexposure,incrratio,start_rel,start_base,minask,maxbid; cJSON *retjson,*addrjson; char *retstr,*baseaddr,*reladdr,*passphrase; if ( argc > 1 && (retjson= cJSON_Parse(argv[1])) != 0 ) { minask = jdouble(retjson,"minask"); maxbid = jdouble(retjson,"maxbid"); profitmargin = jdouble(retjson,"profitmargin"); maxexposure = jdouble(retjson,"maxexposure"); incrratio = jdouble(retjson,"lotratio"); start_base = jdouble(retjson,"start_base"); start_rel = jdouble(retjson,"start_rel"); passphrase = jstr(retjson,"passphrase"); apikey = jstr(retjson,"apikey"); apisecret = jstr(retjson,"apisecret"); base = jstr(retjson,"base"); name = jstr(retjson,"name"); rel = jstr(retjson,"rel"); blocktrail = jstr(retjson,"blocktrail"); exchange = jstr(retjson,"exchange"); if ( profitmargin < 0. || maxexposure <= 0. || incrratio <= 0. || apikey == 0 || apisecret == 0 || base == 0 || name == 0 || rel == 0 || exchange == 0 || blocktrail == 0 ) { printf("illegal parameter (%s)\n",jprint(retjson,0)); exit(-1); } if ( (retstr= iguana_walletpassphrase(passphrase,999999)) != 0 ) { printf("%s\n",DEX_apikeypair(exchange,apikey,apisecret)); printf("%s %s\n",base,DEX_balance(exchange,base,"")); printf("%s %s\n",rel,DEX_balance(exchange,rel,"")); marketmaker_pendinginit(exchange,base,rel); if ( (addrjson= cJSON_Parse(retstr)) != 0 ) { baseaddr = jstr(addrjson,base); reladdr = jstr(addrjson,rel); if ( baseaddr != 0 && reladdr != 0 ) { printf("%s\n",DEX_amlp(blocktrail)); printf("%s.%s %s\n",base,baseaddr,DEX_balance("DEX",base,baseaddr)); printf("%s.%s %s\n",rel,reladdr,DEX_balance("DEX",rel,reladdr)); // initialize state using DEX_pendingorders, etc. marketmaker(minask,maxbid,baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); } free_json(addrjson); } else printf("ERROR parsing.(%s)\n",retstr); free(retstr); } free_json(retjson); } return 0; }
void marketmaker_pendingupdate(char *exchange,char *base,char *rel) { char *retstr; cJSON *retjson,*obj; int32_t i; struct mmpending_order *ptr; for (i=0; i<Num_Pending; i++) { ptr = &Pending_orders[i]; if ( strcmp(exchange,ptr->exchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) continue; if ( ptr->completed == 0 && (retstr= DEX_orderstatus(exchange,ptr->orderid)) != 0 ) { //printf("%s status.(%s)\n",ptr->orderid,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { obj = jobj(retjson,"result"); if ( is_cJSON_Array(obj) != 0 ) obj = jitem(retjson,0); if ( jdouble(obj,"QuantityRemaining") == 0. || is_cJSON_True(jobj(obj,"IsOpen")) == 0 ) { //{"Uuid":null,"OrderUuid":"e7b0789c-0c4e-413b-a768-3d5734d9cbe5","Exchange":"BTC-KMD","OrderType":"LIMIT_SELL","Quantity":877.77700000,"QuantityRemaining":462.50512234,"Limit":0.00011770,"CommissionPaid":0.00012219,"Price":0.04887750,"PricePerUnit":0.00011769,"Opened":"2017-02-20T13:16:22.29","Closed":null,"CancelInitiated":false,"ImmediateOrCancel":false,"IsConditional":false,"Condition":"NONE","ConditionTarget":null} printf("uuid.(%s) finished.(%s)\n",ptr->orderid,jprint(retjson,0)); ptr->completed = (uint32_t)time(NULL); ptr->pending = 0; } free_json(retjson); } free(retstr); } } }
/* Make sure that we have enough storage to write "len" bytes at the * current offset. */ static void set_json_buffer (GJSON * json, int len) { char *tmp = NULL; /* Maintain a null byte at the end of the buffer */ size_t need = json->offset + len + 1, newlen = 0; if (need <= json->size) return; if (json->size == 0) { newlen = INIT_BUF_SIZE; } else { newlen = json->size; newlen += newlen / 2; /* resize by 3/2 */ } if (newlen < need) newlen = need; tmp = realloc (json->buf, newlen); if (tmp == NULL) { free_json (json); FATAL (("Unable to realloc JSON buffer.\n")); } json->buf = tmp; json->size = newlen; }
void recv_nonces(void *_ptr) { int32_t i,j,n; cJSON *json,*item,*array,*nonces; char *jsonstr; struct applicant_info A,*ptr = _ptr; if ( ptr->startflag != 0 ) { double endmilli = milliseconds() + 60000; printf("start receiving nonces\n"); SUPERNET.numnonces = 0; while ( milliseconds() < endmilli ) sleep(1); printf("finished.%d recv_nonces\n",SUPERNET.numnonces); free(ptr); if ( (n= SUPERNET.numnonces) > 0 ) { json = cJSON_CreateObject(); array = cJSON_CreateArray(); while ( n > 0 ) { A = SUPERNET.responses[0]; item = cJSON_CreateObject(); nonces = cJSON_CreateArray(); SUPERNET.responses[0] = SUPERNET.responses[--n]; for (i=0; i<=n; i++) { if ( strcmp(A.lbendpoint,SUPERNET.responses[i].lbendpoint) == 0 ) { cJSON_AddItemToArray(nonces,cJSON_CreateNumber(SUPERNET.responses[i].nonce)); memset(&SUPERNET.responses[i],0,sizeof(SUPERNET.responses[i])); } } for (j=0,i=1; i<n; i++) if ( SUPERNET.responses[i].senderbits != 0 ) SUPERNET.responses[j++] = SUPERNET.responses[i]; n = j; cJSON_AddItemToObject(item,"lbendpoint",cJSON_CreateString(A.lbendpoint)); cJSON_AddItemToObject(item,"relaypoint",cJSON_CreateString(A.relayendpoint)); cJSON_AddItemToObject(item,"glboalpoint",cJSON_CreateString(A.globalendpoint)); cJSON_AddItemToObject(item,"nonces",nonces); cJSON_AddItemToArray(array,item); } cJSON_AddItemToObject(json,"peers",array); cJSON_AddItemToObject(json,"lbendpoint",cJSON_CreateString(SUPERNET.lbendpoint)); cJSON_AddItemToObject(json,"relaypoint",cJSON_CreateString(SUPERNET.relayendpoint)); cJSON_AddItemToObject(json,"glboalpoint",cJSON_CreateString(SUPERNET.globalendpoint)); jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); printf("%s\n",jsonstr); if ( SUPERNET.peersjson != 0 ) free_json(SUPERNET.peersjson); SUPERNET.peersjson = json; } SUPERNET.noncing = 0; SUPERNET.numnonces = 0; } else { SUPERNET.responses = realloc(SUPERNET.responses,(sizeof(*SUPERNET.responses) * (SUPERNET.numnonces + 1))); SUPERNET.responses[SUPERNET.numnonces++] = *ptr; fprintf(stderr,"%d: got nonce.%u from %llu %s/%s/%s\n",SUPERNET.numnonces,ptr->nonce,(long long)ptr->senderbits,ptr->lbendpoint,ptr->relayendpoint,ptr->globalendpoint); } }
void idle() { char *jsonstr,*str; cJSON *json; int32_t n = 0; uint32_t nonce; while ( INSTANTDEX.readyflag == 0 ) sleep(1); while ( 1 ) { if ( n == 0 ) msleep(1000); n = 0; if ( (jsonstr= queue_dequeue(&InstantDEXQ,1)) != 0 ) { if ( (json= cJSON_Parse(jsonstr)) != 0 ) { //printf("Dequeued InstantDEX.(%s)\n",jsonstr); //fprintf(stderr,"dequeued\n"); if ( (str= busdata_sync(&nonce,jsonstr,"allnodes",0)) != 0 ) { //fprintf(stderr,"busdata.(%s)\n",str); free(str); } free_json(json); n++; } else printf("error parsing (%s) from InstantDEXQ\n",jsonstr); free_queueitem(jsonstr); } } }
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],buf[1024],url[1024],digest[512],pairstr[512],pricestr[64],*extra,*typestr; cJSON *json; uint64_t txid = 0; if ( (extra= *retstrp) != 0 ) *retstrp = 0; if ( (dir= flipstr_for_exchange(exchange,pairstr,"%s_%s",dir,&price,&volume,base,rel)) == 0 ) { printf("cant find baserel (%s/%s)\n",base,rel); return(0); } if ( extra != 0 && strcmp(extra,"market") == 0 ) typestr = (dir > 0) ? "buy_market" : "sell_market", sprintf(pricestr,"&price=%.2f",price); // docs say market orders put volume in price else typestr = (dir > 0) ? "buy" : "sell"; sprintf(pricestr,"&price=%.2f",price); sprintf(buf,"amount=%.4f&api_key=%s%ssymbol=%s&type=%s&secret_key=%s",volume,exchange->apikey,pricestr,pairstr,typestr,exchange->apisecret); calc_md5(digest,buf,(int32_t)strlen(buf)); touppercase(digest); sprintf(payload,"amount=%.4f&api_key=%s%s&symbol=%s&type=%s&sign=%s",volume,exchange->apikey,pricestr,pairstr,typestr,digest); sprintf(url,"%s/%s",EXCHANGE_AUTHURL,"trade.do"); if ( CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume) == 0 && (json= SIGNPOST(cHandlep,dotrade,retstrp,exchange,url,payload)) != 0 ) { txid = j64bits(json,"order_id"); free_json(json); } return(txid); }
char *NXTprotocol_json_handler(struct NXT_protocol *p,char *jsonstr) { long len; cJSON *json; char *retjsontxt = 0; struct NXT_protocol_parms PARMS; //printf("NXTprotocol_json_handler.(%s)\n",jsonstr); if ( jsonstr != 0 ) { json = cJSON_Parse(jsonstr); memset(&PARMS,0,sizeof(PARMS)); PARMS.mode = NXTPROTOCOL_WEBJSON; PARMS.argjson = json; if ( strcmp(p->name,"NXTprotocol") == 0 ) retjsontxt = NXTprotocol_json(json); else retjsontxt = (*p->NXT_handler)(Global_mp,&PARMS,p->handlerdata); //printf("retjsontxt.%p\n",retjsontxt); if ( json != 0 ) free_json(json); } else if ( strcmp(p->name,"NXTprotocol") == 0 ) retjsontxt = NXTprotocol_json(0); if ( retjsontxt != 0 ) { //printf("got.(%s)\n",retjsontxt); len = strlen(retjsontxt); if ( len > p->retjsonsize ) p->retjsontxt = realloc(p->retjsontxt,len+1); strcpy(p->retjsontxt,retjsontxt); free(retjsontxt); retjsontxt = p->retjsontxt; } else return("{\"result\":null}"); return(retjsontxt); }
int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr) { int32_t haveutxo,completed,minutxo,n; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; if ( strcmp("BTC",coin->symbol) == 0 ) { minutxo = 199; n = 10; } else { minutxo = 49; n = 10; } if ( (haveutxo= dpow_haveutxo(myinfo,coin,txidp,voutp,coinaddr)) <= minutxo && time(NULL) > dp->lastsplit+bp->duration && (bp->myind != 0 || dp->ratifying == 0) ) { addresses = cJSON_CreateArray(); jaddistr(addresses,coinaddr); if ( (rawtx= iguana_utxoduplicates(myinfo,coin,dp->minerkey33,DPOW_UTXOSIZE,n,&completed,&signedtxid,0,addresses)) != 0 ) { if ( (sendtx= dpow_sendrawtransaction(myinfo,coin,rawtx)) != 0 ) { printf("sendrawtransaction.(%s)\n",sendtx); free(sendtx); } free(rawtx); } free_json(addresses); dp->lastsplit = (uint32_t)time(NULL); } if ( bits256_nonz(*txidp) == 0 ) return(-1); return(haveutxo); }
char *WITHDRAW(struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*method,*base,*destaddr,*type,*retstr = 0; cJSON *json; double amount; amount = jdouble(argjson,"amount"); if ( (destaddr= jstr(argjson,"destaddr")) == 0 || amount < SMALLVAL ) return(clonestr("{\"error\":\"no destaddr specified or amount too small\"}")); if ( (base= jstr(argjson,"base")) == 0 ) base = "bitcoin"; else if ( strcmp(base,"BTC") == 0 ) base = "bitcoin"; else if ( strcmp(base,"LTC") == 0 ) base = "litecoin"; else if ( strcmp(base,"DRK") == 0 ) base = "darkcoin"; else return(clonestr("{\"error\":\"invalid base specified\"}")); if ( (type= jstr(argjson,"extra")) == 0 ) type = "exchange"; else if ( strcmp(type,"exchange") != 0 && strcmp(type,"trading") != 0 && strcmp(type,"deposit") != 0 ) return(clonestr("{\"error\":\"invalid wallet type specified\"}")); method = "withdraw"; sprintf(payload,"{\"request\":\"/v1/%s\",\"nonce\":\"%llu\",\"amount\":\"%.6f\",\"withdraw_type\":\"%s\",\"walletselected\":\"%s\",\"address\":\"%s\"}",method,(long long)exchange_nonce(exchange),amount,base,type,destaddr); if ( (json= SIGNPOST(&retstr,exchange,payload,method)) != 0 ) { free_json(json); } return(retstr); // return standardized withdraw }
uint64_t TRADE(char **retstrp,struct exchange_info *exchange,char *base,char *rel,int32_t dir,double price,double volume) { char payload[1024],pairstr[512],*typestr,*method,*extra; cJSON *json; uint64_t txid = 0; if ( (extra= *retstrp) != 0 ) *retstrp = 0; if ( (dir= flipstr_for_exchange(exchange,pairstr,"%s%s",dir,&price,&volume,base,rel)) == 0 ) { printf("cant find baserel (%s/%s)\n",base,rel); return(0); } method = "order/new"; //Either "market" / "limit" / "stop" / "trailing-stop" / "fill-or-kill" / "exchange market" / "exchange limit" / "exchange stop" / "exchange trailing-stop" / "exchange fill-or-kill". (type starting by "exchange " are exchange orders, others are margin trading orders) if ( (typestr= extra) == 0 ) typestr = "exchange limit"; sprintf(payload,"{\"request\":\"/v1/%s\",\"nonce\":\"%llu\",\"exchange\":\"bitfinex\",\"side\":\"%s\",\"type\":\"%s\",\"price\":\"%.8f\",\"amount\":\"%.8f\",\"symbol\":\"%s\"}",method,(long long)exchange_nonce(exchange),dir>0?"buy":"sell",typestr,price,volume,pairstr); if ( (json= SIGNPOST(retstrp,exchange,payload,method)) != 0 ) { if ( (txid= j64bits(json,"order_id")) == 0 ) { if ( dir != 0 ) printf("bitfinex: no txid error\n"); } free_json(json); } return(txid); }
double PAX_yahoo(char *metal) { // http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XAU=X/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XAG=X/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XPT=X/quote?format=json // http://finance.yahoo.com/webservice/v1/symbols/XPD=X/quote?format=json char url[1024],*jsonstr; cJSON *json,*obj,*robj,*item,*field; double price = 0.; sprintf(url,"http://finance.yahoo.com/webservice/v1/symbols/%s=X/quote?format=json",metal); if ( (jsonstr= issue_curl(url)) != 0 ) { //printf("(%s)\n",jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { if ( (obj= jobj(json,"list")) != 0 && (robj= jobj(obj,"resources")) != 0 && (item= jitem(robj,0)) != 0 ) { if ( (robj= jobj(item,"resource")) != 0 && (field= jobj(robj,"fields")) != 0 && (price= jdouble(field,"price")) != 0 ) price = 1. / price; } free_json(json); } free(jsonstr); } if ( Debuglevel > 2 ) printf("(%s %f) ",metal,price); return(price); }
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); } }
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); }
void serverloop(void *_args) { int32_t n; #ifdef INSIDE_MGW int32_t make_MGWbus(uint16_t port,char *bindaddr,char serverips[MAX_MGWSERVERS][64],int32_t n); int32_t mgw_processbus(char *retbuf,char *jsonstr,cJSON *json); int32_t len; char retbuf[8192],*jsonstr; cJSON *json; if ( SUPERNET.gatewayid >= 0 ) MGW.all.socks.both.bus = make_MGWbus(MGW.port,SUPERNET.myipaddr,MGW.serverips,SUPERNET.numgateways+1*0); #endif sleep(3); printf("start serverloop\n"); while ( OS_getppid() == SUPERNET.ppid ) { #ifdef INSIDE_MGW if ( SUPERNET.gatewayid >= 0 && (len= nn_recv(MGW.all.socks.both.bus,&jsonstr,NN_MSG,0)) > 0 ) { if ( (json= cJSON_Parse(jsonstr)) != 0 ) { mgw_processbus(retbuf,jsonstr,json); free_json(json); } //printf("MGW bus recv.%d json.%p\n",len,json); nn_freemsg(jsonstr); } #endif n = busdata_poll(); if ( n == 0 && SUPERNET.APISLEEP > 0 ) msleep(SUPERNET.APISLEEP); } printf("finished serverloop\n"); }
int32_t ramchain_ledgerhash(char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson) { struct coin777_hashes H[32]; int32_t i,n; char ledgerhash[65],*jsonstr; cJSON *item,*array,*json; if ( coin == 0 ) { sprintf(retbuf,"{\"error\":\"null coin ptr\",\"coin\":\"%s\"}",coin->name); return(-1); } json = cJSON_CreateObject(); if ( (n= coin777_syncblocks(H,(int32_t)(sizeof(H)/sizeof(*H)),coin)) > 0 ) { array = cJSON_CreateArray(); for (i=0; i<n; i++) { if ( coin777_ledgerhash(ledgerhash,&H[i]) == 0 ) { item = cJSON_CreateArray(); cJSON_AddItemToArray(item,cJSON_CreateNumber(H[i].blocknum)); cJSON_AddItemToArray(item,cJSON_CreateString(ledgerhash)); cJSON_AddItemToArray(array,item); } } cJSON_AddItemToObject(json,"result",cJSON_CreateString("success")); cJSON_AddItemToObject(json,"coin",cJSON_CreateString(coin->name)); cJSON_AddItemToObject(json,"latest",cJSON_CreateNumber(ramchain->blocknum)); cJSON_AddItemToObject(json,"ledgerhashes",array); jsonstr = cJSON_Print(json), free_json(json); _stripwhite(jsonstr,' '); strncpy(retbuf,jsonstr,maxlen-1), retbuf[maxlen-1] = 0; free(jsonstr); return(0); } sprintf(retbuf,"{\"error\":\"no sync data\",\"coin\":\"%s\"}",coin->name); return(-1); }
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],pairstr[64],*extra,*path; cJSON *json; uint64_t txid = 0; if ( (extra= *retstrp) != 0 ) *retstrp = 0; if ( (dir= flipstr_for_exchange(exchange,pairstr,"%s_%s",dir,&price,&volume,base,rel)) == 0 ) { printf("cant find baserel (%s/%s)\n",base,rel); return(0); } path = (dir > 0) ? "buy" : "sell"; //key - API key //signature - signature //nonce - nonce //amount - amount of major currency //price - price to buy at //book - optional, if not specified, will default to btc_cad sprintf(payload,"\"amount\":%.6f,\"price\":%.3f,\"book\":\"%s_%s\",",volume,price,base,rel); if ( CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume) == 0 && (json= SIGNPOST(cHandlep,dotrade,retstrp,exchange,payload,path)) != 0 ) { // parse json and set txid free_json(json); } return(txid); }
int32_t PAX_ecbparse(char *date,double *prices,char *url,int32_t basenum) { char *jsonstr,*relstr,*basestr; int32_t count=0,i,relnum; cJSON *json,*ratesobj,*item; struct destbuf tmp; if ( (jsonstr= issue_curl(url)) != 0 ) { if ( Debuglevel > 2 ) printf("(%s)\n",jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { copy_cJSON(&tmp,jobj(json,"date")), safecopy(date,tmp.buf,64); if ( (basestr= jstr(json,"base")) != 0 && strcmp(basestr,CURRENCIES[basenum]) == 0 && (ratesobj= jobj(json,"rates")) != 0 && (item= ratesobj->child) != 0 ) { while ( item != 0 ) { if ( (relstr= get_cJSON_fieldname(item)) != 0 && (relnum= PAX_basenum(relstr)) >= 0 ) { i = basenum*MAX_CURRENCIES + relnum; prices[i] = item->valuedouble; //if ( basenum == JPYNUM ) // prices[i] *= 100.; // else if ( relnum == JPYNUM ) // prices[i] /= 100.; count++; if ( Debuglevel > 2 ) printf("(%02d:%02d %f) ",basenum,relnum,prices[i]); } else printf("cant find.(%s)\n",relstr);//, getchar(); item = item->next; } } free_json(json); } free(jsonstr); } return(count); }
uint64_t TRADE(char **retstrp,struct exchange_info *exchange,char *base,char *rel,int32_t dir,double price,double volume) { char payload[1024],pairstr[64],pricestr[64],*extra,*method; cJSON *json; int32_t type; uint64_t txid = 0; if ( (extra= *retstrp) != 0 ) *retstrp = 0; if ( (dir= flipstr_for_exchange(exchange,pairstr,"%s%s",dir,&price,&volume,base,rel)) == 0 ) { printf("cant find baserel (%s/%s)\n",base,rel); return(0); } if ( extra != 0 && strcmp(extra,"market") == 0 ) method = (dir > 0) ? "buy_market" : "sell_market"; else method = (dir > 0) ? "buy" : "sell", sprintf(pricestr,"&price=%.2f",price); if ( strcmp(pairstr,"btccny") == 0 ) type = 1; else if ( strcmp(pairstr,"ltccny") == 0 ) type = 2; else { printf("cant find baserel (%s/%s)\n",base,rel); return(0); } sprintf(payload,"&amount=%.4f&coin_type=%d%s",volume,type,pricestr); if ( (json= huobi_issue_auth(exchange,method,payload)) != 0 ) { txid = j64bits(json,"order_id"); free_json(json); } return(txid); }
static int32_t process_json(char *retbuf,int32_t max,struct plugin_info *plugin,char *jsonargs,int32_t initflag) { void *loadfile(uint64_t *allocsizep,char *fname); struct destbuf tokenstr,filename; char *myipaddr,*jsonstr = 0; cJSON *obj=0,*tmp,*json = 0; uint64_t allocsize,nxt64bits,tag = 0; int32_t retval = 0; //printf("call process_json.(%s)\n",jsonargs); if ( jsonargs != 0 && (json= cJSON_Parse(jsonargs)) != 0 ) { if ( is_cJSON_Array(json) != 0 && cJSON_GetArraySize(json) == 2 ) { obj = cJSON_GetArrayItem(json,0); copy_cJSON(&tokenstr,cJSON_GetArrayItem(json,1)); } else obj = json, tokenstr.buf[0] = 0; copy_cJSON(&filename,cJSON_GetObjectItem(obj,"filename")); if ( filename.buf[0] != 0 && (jsonstr= loadfile(&allocsize,filename.buf)) != 0 ) { if ( (tmp= cJSON_Parse(jsonstr)) != 0 ) obj = tmp; else free(jsonstr), jsonstr = 0; } if ( jsonstr == 0 ) jsonstr = cJSON_Print(obj); stripwhite2(jsonstr,' '); } if ( obj != 0 ) { //printf("jsonargs.(%s)\n",jsonargs); tag = get_API_nxt64bits(cJSON_GetObjectItem(obj,"tag")); if ( initflag > 0 ) { if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"NXT"))) != 0 ) { plugin->nxt64bits = nxt64bits; expand_nxt64bits(plugin->NXTADDR,plugin->nxt64bits); } if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"serviceNXT"))) != 0 ) expand_nxt64bits(plugin->SERVICENXT,nxt64bits); myipaddr = cJSON_str(cJSON_GetObjectItem(obj,"ipaddr")); if ( is_ipaddr(myipaddr) != 0 ) strcpy(plugin->ipaddr,myipaddr); plugin->port = get_API_int(cJSON_GetObjectItem(obj,"port"),0); } } //fprintf(stderr,"tag.%llu initflag.%d got jsonargs.(%s) [%s] %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 && obj != 0 ) retval = PLUGNAME(_process_json)(0,0,1,plugin,tag,retbuf,max,jsonstr,obj,initflag,tokenstr.buf); else printf("error with JSON.(%s)\n",jsonstr);//, getchar(); //fprintf(stderr,"done tag.%llu initflag.%d got jsonargs.(%p) %p %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 ) free(jsonstr); if ( json != 0 ) free_json(json); printf("%s\n",retbuf), fflush(stdout); return(retval); }
char *InstantDEX_hexmsg(struct supernet_info *myinfo,void *ptr,int32_t len,char *remoteaddr) { struct instantdex_msghdr *msg = ptr; cJSON *argjson; int32_t n,datalen,newlen,flag = 0; uint64_t signerbits; uint8_t *data; uint8_t tmp[sizeof(msg->sig)]; char *retstr = 0; acct777_rwsig(0,(void *)&msg->sig,(void *)tmp); memcpy(&msg->sig,tmp,sizeof(msg->sig)); datalen = len - (int32_t)sizeof(msg->sig); data = (void *)((long)msg + sizeof(msg->sig)); if ( remoteaddr != 0 && remoteaddr[0] == 0 && strcmp("127.0.0.1",remoteaddr) == 0 && ((uint8_t *)msg)[len-1] == 0 && (argjson= cJSON_Parse((char *)msg)) != 0 ) { printf("instantdex_hexmsg RESULT.(%s)\n",jprint(argjson,0)); retstr = instantdex_parse(myinfo,msg,argjson,0,myinfo->myaddr.nxt64bits,0,0); free_json(argjson); return(retstr); } //printf("msg.%p len.%d data.%p datalen.%d crc.%u %s\n",msg,len,data,datalen,calc_crc32(0,(void *)msg,len),bits256_str(str,msg->sig.pubkey)); //return(0); else if ( (signerbits= acct777_validate(&msg->sig,acct777_msgprivkey(data,datalen),msg->sig.pubkey)) != 0 ) { flag++; printf("<<<<<<<<<<<<< sigsize.%ld VALIDATED [%ld] len.%d t%u allocsize.%d (%s) [%d]\n",sizeof(msg->sig),(long)data-(long)msg,datalen,msg->sig.timestamp,msg->sig.allocsize,(char *)msg->serialized,data[datalen-1]); if ( data[datalen-1] == 0 && (argjson= cJSON_Parse((char *)msg->serialized)) != 0 ) retstr = instantdex_parse(myinfo,msg,argjson,remoteaddr,signerbits,data,datalen); else { newlen = (int32_t)(msg->sig.allocsize - sizeof(*msg)); data = msg->serialized; if ( msg->serialized[len - 1] == 0 ) { if ( (argjson= cJSON_Parse((char *)msg->serialized)) != 0 ) { n = (int32_t)(strlen((char *)msg->serialized) + 1); newlen -= n; if ( n >= 0 ) data = &msg->serialized[n]; else data = 0; } } if ( data != 0 ) retstr = instantdex_parse(myinfo,msg,argjson,remoteaddr,signerbits,data,newlen); } } if ( argjson != 0 ) free_json(argjson); return(retstr); }
char *call_SuperNET_JSON(char *JSONstr) { cJSON *json,*array; int32_t valid; char NXTaddr[64],_tokbuf[2*MAX_JSON_FIELD],encoded[NXT_TOKEN_LEN+1],*cmdstr,*retstr = 0; struct coin_info *cp = get_coin_info("BTCD"); if ( Finished_init == 0 ) { printf("Finished_init still 0\n"); return(clonestr("{\"result\":null}")); } //printf("got call_SuperNET_JSON.(%s)\n",JSONstr); if ( cp != 0 && (json= cJSON_Parse(JSONstr)) != 0 ) { expand_nxt64bits(NXTaddr,cp->srvpubnxtbits); cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(NXTaddr)); cJSON_AddItemToObject(json,"pubkey",cJSON_CreateString(Global_mp->pubkeystr)); cmdstr = cJSON_Print(json); if ( cmdstr != 0 ) { stripwhite_ns(cmdstr,strlen(cmdstr)); issue_generateToken(0,encoded,cmdstr,cp->srvNXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",cmdstr,encoded); free(cmdstr); //printf("made tokbuf.(%s)\n",_tokbuf); array = cJSON_Parse(_tokbuf); if ( array != 0 ) { cmdstr = verify_tokenized_json(0,NXTaddr,&valid,array); //printf("cmdstr.%s valid.%d\n",cmdstr,valid); retstr = SuperNET_json_commands(Global_mp,0,array,NXTaddr,valid,_tokbuf); //printf("json command return.(%s)\n",retstr); if ( cmdstr != 0 ) free(cmdstr); free_json(array); } else printf("couldnt parse tokbuf.(%s)\n",_tokbuf); } free_json(json); } else printf("couldnt parse (%s)\n",JSONstr); if ( retstr == 0 ) retstr = clonestr("{\"result\":null}"); return(retstr); }
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 *CANCELORDER(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char payload[1024],*retstr = 0; cJSON *json; sprintf(payload,"command=cancelOrder&nonce=%llu&orderNumber=%llu",(long long)exchange_nonce(exchange),(long long)quoteid); if ( (json= SIGNPOST(cHandlep,1,&retstr,exchange,EXCHANGE_AUTHURL,payload)) != 0 ) { free_json(json); } return(retstr); // return standardized cancelorder }
char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char *params) { long i,j,len; char *retstr = 0; cJSON *json,*result,*error; #ifdef FROM_MARKETMAKER //usleep(500); #endif //printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,rpcstr); if ( command == 0 || rpcstr == 0 || rpcstr[0] == 0 ) { if ( strcmp(command,"signrawtransaction") != 0 && strcmp(command,"getrawtransaction") != 0 ) printf("<<<<<<<<<<< A bitcoind_RPC: %s post_process_bitcoind_RPC.%s.[%s]\n",debugstr,command,params); return(rpcstr); } json = cJSON_Parse(rpcstr); if ( json == 0 ) { printf("<<<<<<<<<<< B bitcoind_RPC: %s post_process_bitcoind_RPC.%s can't parse.(%s) params.(%s)\n",debugstr,command,rpcstr,params); free(rpcstr); return(0); } result = cJSON_GetObjectItem(json,"result"); error = cJSON_GetObjectItem(json,"error"); if ( error != 0 && result != 0 ) { if ( (error->type&0xff) == cJSON_NULL && (result->type&0xff) != cJSON_NULL ) { retstr = jprint(result,0); //printf("%s %s rpc retstr.%p\n",command,params,retstr); len = strlen(retstr); if ( retstr[0] == '"' && retstr[len-1] == '"' ) { for (i=1,j=0; i<len-1; i++,j++) retstr[j] = retstr[i]; retstr[j] = 0; } } else if ( (error->type&0xff) != cJSON_NULL || (result->type&0xff) != cJSON_NULL ) { if ( strcmp(command,"getrawtransaction") != 0 && strcmp(command,"signrawtransaction") != 0 && strcmp(command,"sendrawtransaction") != 0 ) printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC (%s) error.%s\n",debugstr,command,rpcstr); retstr = rpcstr; rpcstr = 0; } if ( rpcstr != 0 ) { //printf("free rpcstr.%p\n",rpcstr); free(rpcstr); } } else retstr = rpcstr; free_json(json); //fprintf(stderr,"<<<<<<<<<<< bitcoind_RPC: postprocess returns.(%s)\n",retstr); return(retstr); }
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight) { int32_t hops = 3; cJSON *argjson; char *retstr; if ( remoteaddr == 0 ) { argjson = InstantDEX_argjson(reference,message,basetxid,reltxid,3,baseheight,relheight); retstr = instantdex_sendcmd(myinfo,argjson,"confirm",myinfo->ipaddr,hops); free_json(argjson); return(retstr); } else return(clonestr("{\"error\":\"InstantDEX API confirm only local usage!\"}")); }
char *OPENORDERS(struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*method,*retstr = 0; cJSON *json; method = "orders"; sprintf(payload,"{\"request\":\"/v1/%s\",\"nonce\":\"%llu\"}",method,(long long)exchange_nonce(exchange)); if ( (json= SIGNPOST(&retstr,exchange,payload,method)) != 0 ) { free_json(json); } return(retstr); // return standardized open orders }
static int32_t registerAPI(char *retbuf,int32_t max,struct plugin_info *plugin,cJSON *argjson) { cJSON *json,*array; char *jsonstr; int32_t i; uint64_t disableflags = 0; json = cJSON_CreateObject(); retbuf[0] = 0; disableflags = PLUGNAME(_register)(plugin,(void *)plugin->pluginspace,argjson); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_methods))/sizeof(*PLUGNAME(_methods))); i++) { if ( PLUGNAME(_methods)[i] == 0 || PLUGNAME(_methods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_methods)[i])); } cJSON_AddItemToObject(json,"methods",array); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_pubmethods))/sizeof(*PLUGNAME(_pubmethods))); i++) { if ( PLUGNAME(_pubmethods)[i] == 0 || PLUGNAME(_pubmethods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_pubmethods)[i])); } cJSON_AddItemToObject(json,"pubmethods",array); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_authmethods))/sizeof(*PLUGNAME(_authmethods))); i++) { if ( PLUGNAME(_authmethods)[i] == 0 || PLUGNAME(_authmethods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_authmethods)[i])); } cJSON_AddItemToObject(json,"authmethods",array); cJSON_AddItemToObject(json,"pluginrequest",cJSON_CreateString("SuperNET")); cJSON_AddItemToObject(json,"requestType",cJSON_CreateString("register")); if ( plugin->sleepmillis == 0 ) plugin->sleepmillis = get_API_int(cJSON_GetObjectItem(json,"sleepmillis"),25);//SUPERNET.APISLEEP); cJSON_AddItemToObject(json,"sleepmillis",cJSON_CreateNumber(plugin->sleepmillis)); if ( cJSON_GetObjectItem(json,"NXT") == 0 ) cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(plugin->NXTADDR)); else cJSON_ReplaceItemInObject(json,"NXT",cJSON_CreateString(plugin->NXTADDR)); if ( cJSON_GetObjectItem(json,"serviceNXT") == 0 ) cJSON_AddItemToObject(json,"serviceNXT",cJSON_CreateString(plugin->SERVICENXT)); else cJSON_ReplaceItemInObject(json,"serviceNXT",cJSON_CreateString(plugin->SERVICENXT)); jsonstr = cJSON_Print(json), free_json(json); stripwhite2(jsonstr,' '); strcpy(retbuf,jsonstr), free(jsonstr); append_stdfields(retbuf,max,plugin,0,1); //printf(">>>>>>>>>>> register return.(%s)\n",retbuf); return((int32_t)strlen(retbuf) + (retbuf[0] != 0)); }
char *CANCELORDER(struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char payload[1024],*method,*retstr = 0; cJSON *json; method = "order/cancel"; sprintf(payload,"{\"request\":\"/v1/%s\",\"nonce\":\"%llu\",\"order_id\":%llu}",method,(long long)exchange_nonce(exchange),(long long)quoteid); if ( (json= SIGNPOST(&retstr,exchange,payload,method)) != 0 ) { free_json(json); } return(retstr); // return standardized cancelorder }