char *CANCELORDER(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char buf[64]; sprintf(buf,"&symbol=btc_usd&order_id=%llu",(long long)quoteid); return(jprint(okcoin_issue_auth(cHandlep,exchange,"cancel_order.do",buf),1)); }
char *OPENORDERS(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { return(jprint(SIGNPOST(cHandlep,1,0,exchange,"open_orders",""),1)); }
char *OPENORDERS(struct exchange_info *exchange,cJSON *argjson) { return(jprint(SIGNPOST(0,exchange,"","open_orders"),1)); }
char *OPENORDERS(struct exchange_info *exchange,cJSON *argjson) { return(jprint(huobi_issue_auth(exchange,"get_orders","&coin_type=1"),1)); }
char *ORDERSTATUS(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char jsonbuf[128]; sprintf(jsonbuf,"&id=%llu",(long long)quoteid); return(jprint(SIGNPOST(cHandlep,1,0,exchange,"order_status",jsonbuf),1)); }
int main(int argc, char **argv) { void portable_OS_init(); CGI_varlist *varlist; const char *name; char namebuf[512],postbuf[65536],*remoteaddr,*str=0,*retstr,*delim,*url = 0; int i,j,iter,localaccess=0,doneflag=0,portflag = 0; cJSON *json; long offset; CGI_value *value; struct destbuf urlbuf; portable_OS_init(); setenv("CONTENT_TYPE", "application/x-www-form-urlencoded", 1); json = cJSON_CreateObject(); if ( (remoteaddr= getenv("REMOTE_ADDR")) == 0 || strncmp("127.0.0.1",remoteaddr,strlen("127.0.0.1")) == 0 ) remoteaddr = 0,localaccess = 1; else cJSON_AddItemToObject(json,"remoteaddr",cJSON_CreateString(remoteaddr)); for (i=j=0; argv[0][i]!=0; i++) if ( argv[0][i] == '/' || argv[0][i] == '\\' ) j = i+1; strcpy(namebuf,&argv[0][j]); offset = strlen(namebuf) - 4; if ( offset > 0 && strcmp(".exe",namebuf + offset) == 0 ) namebuf[offset] = 0; if ( offset > 0 && strcmp(".cgi",namebuf + offset) == 0 ) namebuf[offset] = 0; if ( strcmp(namebuf,"init") == 0 || strcmp(namebuf,"") == 0 || strcmp(namebuf,"index.cgi") == 0 ) { // "http://178.63.60.131/init/?requestType=status&coin=VRC" //"http://78.47.115.250:7777/public?plugin=relay&method=busdata&servicename=MGW&serviceNXT=8119557380101451968&destplugin=MGW&submethod=status&coin=BTC" if ( strcmp(namebuf,"api") != 0 ) cJSON_AddItemToObject(json,"agent",cJSON_CreateString(namebuf)); cJSON_AddItemToObject(json,"plugin",cJSON_CreateString("relay")); cJSON_AddItemToObject(json,"method",cJSON_CreateString("busdata")); cJSON_AddItemToObject(json,"servicename",cJSON_CreateString("MGW")); cJSON_AddItemToObject(json,"serviceNXT",cJSON_CreateString("8119557380101451968")); cJSON_AddItemToObject(json,"destplugin",cJSON_CreateString("MGW")); if ( jstr(json,"requestType") != 0 ) cJSON_AddItemToObject(json,"submethod",cJSON_CreateString(jstr(json,"requestType"))); } if ( strcmp("nxt",namebuf) == 0 ) { if ( setnxturl(&urlbuf) != 0 ) url = urlbuf.buf; else url = "http://127.0.0.1:7876/nxt"; } else if ( strcmp("nxts",namebuf) == 0 ) url = "https://127.0.0.1:7876/nxt"; else if ( strcmp("port",namebuf) == 0 ) url = "http://127.0.0.1", portflag = 1; else if ( strcmp("ports",namebuf) == 0 ) url = "https://127.0.0.1", portflag = 1; fprintf(stderr,"namebuf.(%s)\n",namebuf); if ( url != 0 ) postbuf[0] = 0, delim = ""; for (iter=0; iter<3; iter++) { if ( (varlist= ((iter==0) ? CGI_get_post(0,0) : ((iter==1) ? CGI_get_query(0) : CGI_get_cookie(0)))) != 0 ) { for (name=CGI_first_name(varlist); name!=0&&doneflag==0; name=CGI_next_name(varlist)) { value = CGI_lookup_all(varlist,0); for (i=0; value[i]!=0; i++) { fprintf(stderr,"iter.%d %s [%d] = %s\r\n",iter,name,i,value[i]); if ( i == 0 ) { if ( url == 0 ) { if ( strcmp(name,"stringified") == 0 || strcmp(namebuf,"stringified") == 0 ) { char *unstringify(char *str); cJSON *obj; if ( (obj= cJSON_Parse(name)) == 0 ) { str = malloc(strlen(value[i])+1); strcpy(str,value[i]); unstringify(str); printf("unstringify (%s) -> (%s)\n",value[i],str); obj= cJSON_Parse(str); } if ( obj != 0 ) { //unstringified ((null)) -> ({"stringified":{"method":"orderbook","baseid":"12071612744977229797","relid":"5527630","maxdepth":"1"},"agent":"InstantDEX"}) free_json(json); if ( jobj(obj,"stringified") != 0 ) json = cJSON_Duplicate(jobj(obj,"stringified"),1), free_json(obj); else json = obj; cJSON_AddItemToObject(json,"agent",cJSON_CreateString("InstantDEX")); if ( remoteaddr != 0 && remoteaddr[0] != 0 ) cJSON_AddItemToObject(json,"remoteaddr",cJSON_CreateString(remoteaddr)); fprintf(stderr,"unstringified (%s) -> (%s)\n",str!=0?str:"",jprint(json,0)); if ( str != 0 ) free(str); doneflag = 1; break; } } cJSON_AddItemToObject(json,name,cJSON_CreateString(value[i])); } else { if ( portflag != 0 && strncmp(name,"port",strlen("port")) == 0 ) sprintf(urlbuf.buf,"%s:%s",url,value[i]), url = urlbuf.buf, portflag = 0; else sprintf(postbuf + strlen(postbuf),"%s%s=%s",delim,name,value[i]), delim = "&"; } } } } } CGI_free_varlist(varlist); } if ( localaccess == 0 ) fputs("Access-Control-Allow-Origin: *\r\n",stdout); else fputs("Access-Control-Allow-Origin: null\r\n",stdout); fputs("Access-Control-Allow-Credentials: true\r\n",stdout); fputs("Access-Control-Allow-Headers: Authorization, Content-Type\r\n",stdout); fputs("Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n",stdout); fputs("Cache-Control: no-cache, no-store, must-revalidate\r\n",stdout); fputs("Content-type: text/plain\r\n",stdout); if ( url != 0 ) { fprintf(stderr,"url.(%s) (%s)\n",url,postbuf); if ( (retstr= issue_POST(url,postbuf)) != 0 ) { //fprintf(stderr,"%s",retstr); printf("Content-Length: %ld\r\n\r\n",strlen(retstr)+2); printf("%s\r\n",retstr); free(retstr); } else printf("{\"error\":\"null return from issue_NXTPOST\"}\r\n"); } else { if ( jobj(json,"agent") == 0 && strcmp(namebuf,"api") != 0 ) cJSON_AddItemToObject(json,"agent",cJSON_CreateString(namebuf)); fprintf(stderr,"PROCESS.(%s)\n",jprint(json,0)); process_json(json,remoteaddr,localaccess); } free_json(json); return 0; }
void dpow_statemachinestart(void *ptr) { void **ptrs = ptr; struct supernet_info *myinfo; struct dpow_info *dp; struct dpow_checkpoint checkpoint; int32_t i,j,ht,extralen,destprevvout0,srcprevvout0,numratified=0,kmdheight,myind = -1; uint8_t extras[10000],pubkeys[64][33]; cJSON *ratified=0,*item; struct iguana_info *src,*dest; char *jsonstr,*handle,*hexstr,str[65],str2[65],srcaddr[64],destaddr[64]; bits256 zero,srchash,destprevtxid0,srcprevtxid0; struct dpow_block *bp; struct dpow_entry *ep = 0; uint32_t duration,minsigs,starttime,srctime; memset(&zero,0,sizeof(zero)); srcprevtxid0 = destprevtxid0 = zero; srcprevvout0 = destprevvout0 = -1; myinfo = ptrs[0]; dp = ptrs[1]; minsigs = (uint32_t)(long)ptrs[2]; duration = (uint32_t)(long)ptrs[3]; jsonstr = ptrs[4]; kmdheight = -1; memcpy(&checkpoint,&ptrs[5],sizeof(checkpoint)); src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); dpow_getchaintip(myinfo,&srchash,&srctime,dp->srctx,&dp->numsrctx,src); dpow_getchaintip(myinfo,&srchash,&srctime,dp->desttx,&dp->numdesttx,dest); if ( src == 0 || dest == 0 ) { printf("null coin ptr? (%s %p or %s %p)\n",dp->symbol,src,dp->dest,dest); return; } if ( strcmp(src->symbol,"KMD") == 0 ) kmdheight = checkpoint.blockhash.height; else if ( strcmp(dest->symbol,"KMD") == 0 ) kmdheight = dest->longestchain; if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) { bp = calloc(1,sizeof(*bp)); bp->minsigs = minsigs; bp->duration = duration; bp->srccoin = src; bp->destcoin = dest; bp->myind = -1; bp->opret_symbol = dp->symbol; if ( jsonstr != 0 && (ratified= cJSON_Parse(jsonstr)) != 0 ) { bp->isratify = 1; if ( (numratified= cJSON_GetArraySize(ratified)) > 0 ) { if ( numratified > 64 ) { fprintf(stderr,"cant ratify more than 64 notaries ratified has %d\n",numratified); return; } for (i=0; i<numratified; i++) { item = jitem(ratified,i); hexstr = handle = 0; if ( (hexstr= jstr(item,"pubkey")) != 0 && is_hexstr(hexstr,0) == 66 ) { decode_hex(bp->ratified_pubkeys[i],33,hexstr); for (j=0; j<i; j++) if ( memcmp(bp->ratified_pubkeys[j],bp->ratified_pubkeys[i],33) == 0 ) { printf("ratification.%d is the same as %d, reject this donkey\n",j,i); exit(-1); } if ( (handle= jstr(item,"handle")) != 0 ) safecopy(bp->handles[i],handle,sizeof(bp->handles[i])); if ( i == 0 ) { destprevtxid0 = jbits256(item,"destprevtxid0"); destprevvout0 = jint(item,"destprevvout0"); srcprevtxid0 = jbits256(item,"srcprevtxid0"); srcprevvout0 = jint(item,"srcprevvout0"); if ( bits256_nonz(destprevtxid0) != 0 && bits256_nonz(srcprevtxid0) != 0 ) bp->require0 = 1; } } else { printf("break loop hexstr.%p handle.%p\n",hexstr,handle); break; } } if ( i == numratified ) { bp->numratified = numratified; bp->ratified = ratified; printf("numratified.%d %s\n",numratified,jprint(ratified,0)); } else { printf("i.%d numratified.%d\n",i,numratified); free_json(ratified); } } } bp->bestk = -1; dp->blocks[checkpoint.blockhash.height] = bp; bp->beacon = rand256(0); vcalc_sha256(0,bp->commit.bytes,bp->beacon.bytes,sizeof(bp->beacon)); /*if ( checkpoint.blockhash.height >= DPOW_FIRSTRATIFY && dp->blocks[checkpoint.blockhash.height - DPOW_FIRSTRATIFY] != 0 ) { printf("purge %s.%d\n",dp->dest,checkpoint.blockhash.height - DPOW_FIRSTRATIFY); free(dp->blocks[checkpoint.blockhash.height - DPOW_FIRSTRATIFY]); dp->blocks[checkpoint.blockhash.height - DPOW_FIRSTRATIFY] = 0; }*/ } if ( bp->isratify != 0 && dp->ratifying != 0 ) { printf("new ratification starting dp->ratifying.%d\n",dp->ratifying); dp->ratifying++; while ( dp->ratifying > 1 ) sleep(3); printf("other ratifications stopped\n"); } if ( dp->ratifying != 0 && bp->isratify == 0 ) { printf("skip notarization ht.%d when ratifying\n",bp->height); free(ptr); return; } dp->ratifying += bp->isratify; bitcoin_address(srcaddr,src->chain->pubtype,dp->minerkey33,33); bitcoin_address(destaddr,dest->chain->pubtype,dp->minerkey33,33); if ( kmdheight >= 0 ) { ht = kmdheight;///strcmp("KMD",src->symbol) == 0 ? kmdheight : bp->height; if ( strcmp("KMD",dest->symbol) == 0 ) { bp->numnotaries = komodo_notaries(dest->symbol,pubkeys,ht); } else { if ( ht == 0 ) ht = strcmp("KMD",src->symbol) == 0 ? src->longestchain : dest->longestchain; bp->numnotaries = komodo_notaries(src->symbol,pubkeys,ht); } for (i=0; i<bp->numnotaries; i++) { //int32_t j; for (j=0; j<33; j++) // printf("%02x",pubkeys[i][j]); //printf(" <= pubkey[%d]\n",i); memcpy(bp->notaries[i].pubkey,pubkeys[i],33); if ( strcmp("KMD",src->symbol) == 0 ) memcpy(myinfo->notaries[i],pubkeys[i],33); if ( memcmp(bp->notaries[i].pubkey,dp->minerkey33,33) == 0 ) { myind = i; ep = &bp->notaries[myind]; for (j=0; j<33; j++) printf("%02x",dp->minerkey33[j]); printf(" MYIND.%d <<<<<<<<<<<<<<<<<<<<<<\n",myind); } } if ( strcmp("KMD",src->symbol) == 0 ) myinfo->numnotaries = bp->numnotaries; if ( myind < 0 || ep == 0 ) { printf("minerkey33-> "); for (i=0; i<33; i++) printf("%02x",dp->minerkey33[i]); printf(" statemachinestart this node %s %s is not official notary numnotaries.%d kmdht.%d bpht.%d\n",srcaddr,destaddr,bp->numnotaries,kmdheight,bp->height); free(ptr); dp->ratifying -= bp->isratify; return; } printf("myind.%d\n",myind); } else { printf("statemachinestart no kmdheight.%d\n",kmdheight); free(ptr); dp->ratifying -= bp->isratify; return; } bp->myind = myind; printf("[%d] notarize %s->%s %s ht.%d minsigs.%d duration.%d start.%u\n",bp->myind,dp->symbol,dp->dest,bits256_str(str,checkpoint.blockhash.hash),checkpoint.blockhash.height,minsigs,duration,checkpoint.timestamp); if ( bp->isratify != 0 && memcmp(bp->notaries[0].pubkey,bp->ratified_pubkeys[0],33) != 0 ) { for (i=0; i<33; i++) printf("%02x",bp->notaries[0].pubkey[i]); printf(" current vs "); for (i=0; i<33; i++) printf("%02x",bp->ratified_pubkeys[0][i]); printf(" new, cant change notary0\n"); dp->ratifying -= bp->isratify; return; } //printf(" myind.%d myaddr.(%s %s)\n",myind,srcaddr,destaddr); if ( myind == 0 && bits256_nonz(destprevtxid0) != 0 && bits256_nonz(srcprevtxid0) != 0 && destprevvout0 >= 0 && srcprevvout0 >= 0 ) { ep->dest.prev_hash = destprevtxid0; ep->dest.prev_vout = destprevvout0; ep->src.prev_hash = srcprevtxid0; ep->src.prev_vout = srcprevvout0; bp->notaries[myind].ratifysrcutxo = srcprevtxid0; bp->notaries[myind].ratifysrcvout = srcprevvout0; bp->notaries[myind].ratifydestutxo = destprevtxid0; bp->notaries[myind].ratifydestvout = destprevvout0; printf("Use override utxo %s/v%d %s/v%d\n",bits256_str(str,destprevtxid0),destprevvout0,bits256_str(str2,srcprevtxid0),srcprevvout0); } else { if ( dpow_checkutxo(myinfo,dp,bp,bp->destcoin,&ep->dest.prev_hash,&ep->dest.prev_vout,destaddr) < 0 ) { printf("dont have %s %s utxo, please send funds\n",dp->dest,destaddr); free(ptr); dp->ratifying -= bp->isratify; return; } if ( dpow_checkutxo(myinfo,dp,bp,bp->srccoin,&ep->src.prev_hash,&ep->src.prev_vout,srcaddr) < 0 ) { printf("dont have %s %s utxo, please send funds\n",dp->symbol,srcaddr); free(ptr); dp->ratifying -= bp->isratify; return; } if ( bp->isratify != 0 ) { bp->notaries[myind].ratifysrcutxo = ep->src.prev_hash; bp->notaries[myind].ratifysrcvout = ep->src.prev_vout; bp->notaries[myind].ratifydestutxo = ep->dest.prev_hash; bp->notaries[myind].ratifydestvout = ep->dest.prev_vout; } } bp->recvmask |= (1LL << myind); bp->notaries[myind].othermask |= (1LL << myind); dp->checkpoint = checkpoint; bp->height = checkpoint.blockhash.height; bp->timestamp = checkpoint.timestamp; bp->hashmsg = checkpoint.blockhash.hash; bp->myind = myind; while ( bp->isratify == 0 && dp->destupdated == 0 ) { if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { printf("abort %s ht.%d due to new checkpoint.%d\n",dp->symbol,checkpoint.blockhash.height,dp->checkpoint.blockhash.height); dp->ratifying -= bp->isratify; return; } sleep(1); } starttime = (uint32_t)time(NULL); if ( bp->isratify == 0 ) { //if ( (starttime= checkpoint.timestamp) == 0 ) bp->starttime = starttime; extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } printf("PAXWDCRC.%x myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u+dur.%d vs %ld\n",bp->paxwdcrc,bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),starttime,bp->duration,time(NULL)); for (i=0; i<sizeof(srchash); i++) srchash.bytes[i] = dp->minerkey33[i+1]; //printf("start utxosync start.%u %u\n",starttime,(uint32_t)time(NULL)); //dpow_utxosync(myinfo,dp,bp,0,myind,srchash); //printf("done utxosync start.%u %u\n",starttime,(uint32_t)time(NULL)); while ( time(NULL) < starttime+bp->duration && src != 0 && dest != 0 && bp->state != 0xffffffff ) { if ( bp->isratify == 0 ) { if ( myinfo->DPOWS[0].ratifying != 0 ) { printf("break due to already ratifying\n"); break; } extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } sleep(13); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { if ( bp->isratify == 0 ) { printf("abort %s ht.%d due to new checkpoint.%d\n",dp->symbol,checkpoint.blockhash.height,dp->checkpoint.blockhash.height); break; } } if ( dp->ratifying > 1 ) { printf("new ratification started. abort ht.%d\n",bp->height); break; } if ( bp->isratify == 0 ) { bits256 checkhash; checkhash = dpow_getblockhash(myinfo,bp->srccoin,bp->height); if ( bits256_cmp(checkhash,bp->hashmsg) != 0 ) { printf("%s ht.%d %s got reorged to %s, abort notarization\n",bp->srccoin->symbol,bp->height,bits256_str(str,bp->hashmsg),bits256_str(str2,checkhash)); bp->state = 0xffffffff; } } if ( bp->state != 0xffffffff ) { dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); dpow_nanomsg_update(myinfo); } else { dp->lastnotarized = checkpoint.blockhash.hash; printf("notarized %s %s\n",dp->symbol,bits256_str(str,checkpoint.blockhash.hash)); } if ( 0 && dp->cancelratify != 0 && bp->isratify != 0 ) { printf("abort pending ratify\n"); break; } } printf("END isratify.%d:%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,dp->ratifying,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); bp->state = 0xffffffff; dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; dp->blocks[bp->height] = 0; free(ptr); }
void marketmaker_cancel(struct mmpending_order *ptr) { char *retstr; cJSON *retjson; if ( ptr->pending != 0 && ptr->cancelstarted == 0 ) { ptr->cancelstarted = (uint32_t)time(NULL); if ( (retstr= DEX_cancelorder(ptr->exchange,ptr->orderid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { printf("cancel %s (%s/%s) %.8f vol %.8f dir.%d -> (%s)\n",ptr->exchange,ptr->base,ptr->rel,ptr->price,ptr->volume,ptr->dir,jprint(retjson,0)); free_json(retjson); ptr->pending = 0; ptr->canceled = (uint32_t)time(NULL); } free(retstr); } } }
void marketmaker_queue(char *exchange,char *base,char *rel,int32_t dir,double price,double volume,cJSON *retjson) { struct mmpending_order *ptr; char *orderid; //DEX_trade.({"success":true,"message":"","result":{"uuid":"d5faa9e4-660d-436f-a257-2c6a40442d8c"},"tag":"11271578410079391025"} if ( is_cJSON_True(jobj(retjson,"success")) != 0 && jobj(retjson,"result") != 0 ) retjson = jobj(retjson,"result"); printf("QUEUE.%s %s/%s dir.%d %.8f %.6f (%s)\n",exchange,base,rel,dir,price,volume,jprint(retjson,0)); Pending_orders = realloc(Pending_orders,(1 + Num_Pending) * sizeof(*Pending_orders)); ptr = &Pending_orders[Num_Pending++]; memset(ptr,0,sizeof(*ptr)); ptr->price = price; ptr->volume = volume; ptr->dir = dir; ptr->pending = (uint32_t)time(NULL); strcpy(ptr->exchange,exchange); strcpy(ptr->base,base); strcpy(ptr->rel,rel); if ( (orderid= jstr(retjson,"OrderUuid")) != 0 || (orderid= jstr(retjson,"uuid")) != 0 ) strcpy(ptr->orderid,orderid); else strcpy(ptr->orderid,"0"); }
char *ORDERSTATUS(struct exchange_info *exchange,uint64_t quoteid,cJSON *argjson) { char buf[64]; sprintf(buf,"&symbol=btc_usd&order_id=%llu",(long long)quoteid); return(jprint(okcoin_issue_auth(&exchange->cHandle,exchange,"order_info.do",buf),1)); }
char *CANCELORDER(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char buf[64]; sprintf(buf,"\"id\":%llu,",(long long)quoteid); return(jprint(SIGNPOST(cHandlep,1,0,exchange,buf,"cancel_order"),1)); }
int32_t PLUGNAME(_process_json)(char *forwarder,char *sender,int32_t valid,struct plugin_info *plugin,uint64_t tag,char *retbuf,int32_t maxlen,char *jsonstr,cJSON *json,int32_t initflag,char *tokenstr) { char *resultstr,*methodstr,*addr,*retstr = 0; struct destbuf echostr; retbuf[0] = 0; plugin->allowremote = 1; //fprintf(stderr,"<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s)\n",plugin->name,jsonstr); if ( initflag > 0 ) { // configure settings strcpy(retbuf,"{\"result\":\"echodemo init\"}"); } else { resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); copy_cJSON(&echostr,cJSON_GetObjectItem(json,"echostr")); retbuf[0] = 0; if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); return((int32_t)strlen(retbuf)); } if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } else if ( strcmp(methodstr,"echo") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\"}",echostr.buf); } else if ( strcmp(methodstr,"passthru") == 0 ) { if ( jstr(json,"destplugin") != 0 ) { cJSON_DeleteItemFromObject(json,"plugin"); jaddstr(json,"plugin",jstr(json,"destplugin")); cJSON_DeleteItemFromObject(json,"destplugin"); } if ( jstr(json,"destmethod") != 0 ) { cJSON_DeleteItemFromObject(json,"method"); jaddstr(json,"method",jstr(json,"destmethod")); cJSON_DeleteItemFromObject(json,"destmethod"); } jaddstr(json,"pluginrequest","SuperNET"); retstr = jprint(json,0); //printf("passhru.(%s)\n",retstr); } else if ( strcmp(methodstr,"RS") == 0 ) { int32_t is_decimalstr(char *str); uint64_t RS_decode(char *rs); int32_t RS_encode(char *,uint64_t id); char rsaddr[64]; uint64_t nxt64bits = 0; if ( (addr= cJSON_str(cJSON_GetObjectItem(json,"addr"))) != 0 ) { rsaddr[0] = 0; if ( strlen(addr) > 4 ) { if ( strncmp(addr,"NXT-",4) == 0 ) { nxt64bits = RS_decode(addr); sprintf(retbuf,"{\"result\":\"success\",\"accountRS\":\"%s\",\"account\":\"%llu\"}",addr,(long long)nxt64bits); } else if ( is_decimalstr(addr) != 0 ) { nxt64bits = calc_nxt64bits(addr), RS_encode(rsaddr,nxt64bits); sprintf(retbuf,"{\"result\":\"success\",\"account\":\"%llu\",\"accountRS\":\"%s\"}",(long long)nxt64bits,rsaddr); } } else sprintf(retbuf,"{\"error\":\"illegal addr field\",\"addr\":\"%s\"}",addr); } else sprintf(retbuf,"{\"error\":\"no addr field\"}"); } } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
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); }
char *TRADEHISTORY(struct exchange_info *exchange,cJSON *argjson) { return(jprint(SIGNPOST(0,exchange,"","user_transactions"),1)); }
char *OPENORDERS(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { return(jprint(okcoin_issue_auth(cHandlep,exchange,"orders_info.do",""),1)); }
int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double bidvol,double ask,double askvol,double separation) { int32_t nearflags[2],i,n = 0; struct mmpending_order *ptr; cJSON *retjson,*vals; char *retstr,postdata[1024],url[128]; double vol,spread_ratio; memset(nearflags,0,sizeof(nearflags)); if ( strcmp("DEX",exchange) != 0 ) { 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->pending != 0 && ptr->cancelstarted == 0 ) { if ( bid > SMALLVAL && bidvol > SMALLVAL && ptr->dir > 0 && fabs(bid - ptr->price) < separation ) nearflags[0]++; if ( ask > SMALLVAL && askvol > SMALLVAL && ptr->dir < 0 && fabs(ask - ptr->price) < separation ) nearflags[1]++; } } } //printf("spread.%s (%.8f %.6f) (%.8f %.6f)\n",exchange,bid,bidvol,ask,askvol); if ( bid > SMALLVAL && bidvol > SMALLVAL && nearflags[0] == 0 ) { if ( strcmp("DEX",exchange) == 0 && strcmp(base,"KMD") == 0 && strcmp(rel,"BTC") == 0 ) { if ( ask > SMALLVAL && askvol > SMALLVAL ) { /*li.profit = jdouble(vals,"profit"); li.refprice = jdouble(vals,"refprice"); li.bid = jdouble(vals,"bid"); li.ask = jdouble(vals,"ask"); if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) li.maxvol = li.minvol;*/ //curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MVP\",\"vals\":{\"rel\":\"USD\",\"bid\":0.09,\"ask\":0.11,\"maxvol\":100}}" vals = cJSON_CreateObject(); jaddstr(vals,"rel","BTC"); jaddnum(vals,"bid",bid); jaddnum(vals,"ask",ask); vol = bidvol > askvol ? askvol : bidvol; jaddnum(vals,"maxvol",vol); jaddnum(vals,"minvol",vol*0.1 > 100 ? 100 : vol * 0.1); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); printf("(%s)\n",postdata); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } spread_ratio = .5 * ((ask - bid) / (bid + ask)); for (i=0; i<sizeof(CURRENCIES)/sizeof(*CURRENCIES); i++) { if ( PAXPRICES[i] > SMALLVAL ) { vals = cJSON_CreateObject(); jaddstr(vals,"rel",CURRENCIES[i]); jaddnum(vals,"bid",PAXPRICES[i] * (1. - spread_ratio)); jaddnum(vals,"ask",PAXPRICES[i] * (1. + spread_ratio)); jaddnum(vals,"maxvol",vol * PAXPRICES[i]); jaddnum(vals,"minvol",MAX(1,(int32_t)(vol * 0.01 * PAXPRICES[i]))); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } } break; } } else printf("unsupported ask only for DEX %s/%s\n",base,rel); } else if ( (retstr= DEX_trade(exchange,base,rel,1,bid,bidvol)) != 0 ) { //printf("DEX_trade.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { marketmaker_queue(exchange,base,rel,1,bid,bidvol,retjson); free_json(retjson); } free(retstr); } } if ( ask > SMALLVAL && askvol > SMALLVAL && nearflags[1] == 0 && strcmp("DEX",exchange) != 0 ) { if ( (retstr= DEX_trade(exchange,base,rel,-1,ask,askvol)) != 0 ) { //printf("DEX_trade.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { marketmaker_queue(exchange,base,rel,-1,ask,askvol,retjson); free_json(retjson); } free(retstr); } } return(n); }
char *TRADEHISTORY(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { return(jprint(okcoin_issue_auth(cHandlep,exchange,"orders_history.do","&status=1&symbol=btc_usd¤t_page=0&page_length=200"),1)); }
cJSON *LP_NXT_redeems() { char url[1024],*retstr,*recv,*method,*msgstr,assetname[128]; uint64_t totals[2][sizeof(assetids)/sizeof(*assetids)],mult,txnum,assetid,qty; int32_t i,ind,numtx=0,past_marker=0; cJSON *item,*attach,*decjson,*array,*msgjson,*encjson,*retjson=0; //sleep 1; fiat/supernet sendtoaddress RNZZuQYu8xJLZHuekhd96hYfoQuiCMz99T 1001.44150000 # txnum.8537615468620726612 //sleep 1; fiat/pangea sendtoaddress RWMdRaUmMZqKkEibwEhY6XS3RLCXJDWHTi 22.10910000 # txnum.2649622877615958504 uint64_t txnum_marker = calc_nxt64bits("8537615468620726612"); // 2649622877615958504"); // set to most recent processed uint64_t txnum_marker2 = calc_nxt64bits("7256847492742571143"); // dont change, end marker char *passphrase = ""; char *account = "NXT-MRBN-8DFH-PFMK-A4DBM"; memset(totals,0,sizeof(totals)); sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getBlockchainTransactions&account=%s",account); //printf("calling (%s)\n",url); if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) { //printf("got.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (array= jarray(&numtx,retjson,"transactions")) != 0 ) { for (i=0; i<numtx; i++) { msgjson = encjson = decjson = 0; txnum = assetid = qty = 0; item = jitem(array,i); msgstr = jstr(item,"message"); txnum = j64bits(item,"transaction"); if ( txnum == txnum_marker ) past_marker = 1; //printf("%d: %s\n",i,jprint(item,0)); if ( (recv= jstr(item,"recipientRS")) != 0 && strcmp(recv,"NXT-MRBN-8DFH-PFMK-A4DBM") == 0 ) { if ( (attach= jobj(item,"attachment")) != 0 && jint(attach,"version.AssetTransfer") == 1 ) { assetid = j64bits(attach,"asset"); qty = j64bits(attach,"quantityQNT"); //printf("txnum.%llu (%s)\n",(long long)txnum,jprint(attach,0)); if ( (msgstr == 0 || msgstr[0] == 0) && jint(attach,"version.PrunablePlainMessage") == 1 ) { method = "getPrunableMessage"; if ( (msgjson= LP_NXT_message(method,txnum,"test")) != 0 ) { msgstr = jstr(msgjson,"message"); //printf("%d method.(%s) (%s)\n",i,method,msgstr); } } if ( msgstr == 0 || msgstr[0] == 0 ) msgstr = jstr(attach,"message"); if ( msgstr == 0 || msgstr[0] == 0 ) { if ( (encjson= jobj(attach,"encryptedMessage")) != 0 ) { msgstr = "encryptedMessage";//jstr(encjson,"data"); if ( (decjson= LP_NXT_decrypt(txnum,account,jstr(encjson,"data"),jstr(encjson,"nonce"),passphrase)) != 0 ) { //printf("%s\n",jprint(decjson,0)); if ( jstr(decjson,"decryptedMessage") != 0 ) msgstr = jstr(decjson,"decryptedMessage"); } } } } mult = LP_assetid_mult(&ind,assetname,assetid); if ( ind >= 0 ) totals[past_marker][ind] += qty * mult; if ( msgstr != 0 && assetname[0] != 0 && qty != 0 ) { char validaddress[64]; int32_t z,n; n = (int32_t)strlen(msgstr); for (z=0; z<n; z++) { if ( msgstr[z] == 'R' ) break; } memset(validaddress,0,sizeof(validaddress)); if ( n-z >= 34 ) strncpy(validaddress,&msgstr[z],34); if ( txnum == calc_nxt64bits("4545341872872347590") ) strcpy(validaddress,"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni"); if ( past_marker == 0 ) { if ( strlen(validaddress) == 34 || strlen(validaddress) == 33 ) { //printf("%-4d: (%34s) <- %13.5f %10s tx.%llu past_marker.%d\n",i,validaddress,dstr(qty * mult),assetname,(long long)txnum,past_marker); LP_sendtoaddress_line(validaddress,assetname,(qty * mult),txnum); } else printf("%-4d: (%34s) <- %13.5f %10s tx.%llu\n",i,msgstr!=0?msgstr:jprint(item,0),dstr(qty * mult),assetname,(long long)txnum); } } if ( msgjson != 0 ) free_json(msgjson); if ( decjson != 0 ) free_json(decjson); } if ( txnum == txnum_marker2 ) break; } } //free_json(retjson); } free(retstr); } else printf("null return from NXT api call\n"); printf("\nTotal redeemed.%d\n",numtx); for (past_marker=0; past_marker<2; past_marker++) { for (i=0; i<sizeof(totals[0])/sizeof(*totals[0]); i++) { if ( totals[past_marker][i] != 0 ) printf("%-10s %13.5f past_marker.%d\n",assetids[i][1],dstr(totals[past_marker][i]),past_marker); } printf("\n>>>>>>>>>> already processed:\n"); } return(retjson); }
char *ORDERSTATUS(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char payload[1024]; sprintf(payload,"&id=%llu&coin_type=1",(long long)quoteid); return(jprint(huobi_issue_auth(cHandlep,exchange,"order_info",payload),1)); }
ZERO_ARGS(bitcoinrpc,getbestblockhash) { cJSON *retjson = cJSON_CreateObject(); char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); return(jprint(retjson,1)); }
char *CANCELORDER(struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char payload[1024]; sprintf(payload,"&id=%llu&coin_type=1",(long long)quoteid); return(jprint(huobi_issue_auth(exchange,"cancel_order",payload),1)); }
ZERO_ARGS(bitcoinrpc,gettxoutsetinfo) { cJSON *retjson = cJSON_CreateObject(); jaddstr(retjson,"error","low priority RPC not implemented"); return(jprint(retjson,1)); }
INT_ARG(ramchain,getblockhash,height) { cJSON *retjson = cJSON_CreateObject(); jaddbits256(retjson,"result",iguana_blockhash(coin,height)); return(jprint(retjson,1)); }
static void genjstd_primattribute(Symbol* asym, Bytebuffer* code, unsigned long len) { Symbol* basetype = asym->typ.basetype; nc_type typecode = basetype->typ.typecode; /* Handle NC_CHAR specially */ if(typecode == NC_CHAR) { /* revise the length count */ len = bbLength(code); if(len == 0) {bbAppend(code,'\0'); len++;} jquotestring(code,'"'); } else { /* Convert to constant */ char* code2 = bbDup(code); bbClear(code); nprintf(stmt,sizeof(stmt),"new %s[]", jarraytype(typecode)); bbCat(code,stmt); bbCat(code,"{"); bbCat(code,code2); bbCat(code,"}"); efree(code2); } switch (typecode) { case NC_BYTE: case NC_SHORT: case NC_INT: case NC_FLOAT: case NC_DOUBLE: jlined(1,"{"); nprintf(stmt,sizeof(stmt),"%sArray data = Array.factory(%s.class, new int[]{%lu}, ", indented(1), jtype(basetype->typ.typecode), len); jpartial(stmt); jprint(code); jline(");"); if(asym->att.var == NULL) { nprintf(stmt,sizeof(stmt),"ncfile.addGlobalAttribute(\"%s\",data);", jescapifyname(asym->name)); } else { nprintf(stmt,sizeof(stmt),"ncfile.addVariableAttribute(\"%s\",\"%s\",data);", jescapifyname(asym->att.var->name), jescapifyname(asym->name)); } jlined(1,stmt); jlined(1,"}"); jflush(); break; case NC_CHAR: if(asym->att.var == NULL) { nprintf(stmt,sizeof(stmt),"ncfile.addGlobalAttribute(\"%s\",%s);", jescapifyname(asym->name), bbContents(code)); } else { nprintf(stmt,sizeof(stmt),"ncfile.addVariableAttribute(\"%s\",\"%s\",%s);", jescapifyname(asym->att.var->name), jescapifyname(asym->name), bbContents(code)); } jlined(1,stmt); jflush(); break; default: break; } }
char *CANCELORDER(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char jsonbuf[128]; sprintf(jsonbuf,"&id=%llu",(long long)quoteid); return(jprint(SIGNPOST(cHandlep,1,0,exchange,"cancel_order",jsonbuf),1)); }
static void genjstd_definevardata(Symbol* vsym) { Dimset* dimset = &vsym->typ.dimset; Symbol* basetype = vsym->typ.basetype; int rank = dimset->ndims; int isscalar = (dimset->ndims == 0); Bytebuffer* code; nc_type typecode = basetype->typ.typecode; if(vsym->data == NULL) return; code = bbNew(); jlined(1,"{"); /* Handle special cases first*/ if(isscalar) { /* Construct the data Array */ nprintf(stmt,sizeof(stmt),"Array%s.D0 data = new Array%s.D0();", jtypecap(typecode), jtypecap(typecode)); jlined(1,stmt); /* Fill it */ genjstd_scalardata(vsym,code); if(typecode == NC_CHAR) { nprintf(stmt,sizeof(stmt),"data.set(%s.charAt(0));", bbContents(code)); } else { nprintf(stmt,sizeof(stmt),"data.set((%s)%s);", jtype(typecode),bbContents(code)); } jlined(1,stmt); } else { /* Non-scalar*/ int i; Bytebuffer* dimbuf = bbNew(); /* Store the data */ genjstd_arraydata(vsym,NULL,code); /* Construct the dimension set*/ bbCat(dimbuf,"new int[]{"); for(i=0;i<rank;i++) { Symbol* dsym = dimset->dimsyms[i]; char tmp[32]; if(i==0 && dsym->dim.size == NC_UNLIMITED) nprintf(tmp,sizeof(tmp),"%lu",dsym->dim.unlimitedsize); else nprintf(tmp,sizeof(tmp),"%lu",dsym->dim.size); if(i>0) {bbCat(dimbuf,", ");} bbCat(dimbuf,tmp); } bbCat(dimbuf,"}"); /* Construct the data array and capture its index */ if(typecode == NC_CHAR) nprintf(stmt,sizeof(stmt),"%sString contents = ", indented(1)); else nprintf(stmt,sizeof(stmt),"%s%s[] contents = new %s[] {", indented(1),jtype(typecode),jtype(typecode)); jpartial(stmt); commify(code); jprint(code); if(typecode != NC_CHAR) jpartial("}"); jline(";"); nprintf(stmt,sizeof(stmt),"Array%s data = new Array%s(%s);", jtypecap(typecode), jtypecap(typecode), bbContents(dimbuf)); jlined(1,stmt); jlined(1,"IndexIterator iter = data.getIndexIterator();"); jlined(1,"int count = 0;"); jlined(1,"while(iter.hasNext())"); if(typecode == NC_CHAR) nprintf(stmt,sizeof(stmt), "iter.setCharNext(contents.charAt(count++));"); else nprintf(stmt,sizeof(stmt),"iter.set%sNext(contents[count++]);", jtypecap(typecode)); jlined(2,stmt); bbFree(dimbuf); } /* do the actual write */ nprintf(stmt,sizeof(stmt),"ncfile.write(\"%s\",data);", jescapifyname(vsym->name)); jlined(1,stmt); bbFree(code); jlined(1,"}"); jflush(); }
char *TRADEHISTORY(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { return(jprint(SIGNPOST(cHandlep,1,0,exchange,"user_transactions",""),1)); }
char *ORDERSTATUS(struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char buf[64]; sprintf(buf,"\"id\":%llu,",(long long)quoteid); return(jprint(SIGNPOST(0,exchange,buf,"lookup_order"),1)); }