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); }
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 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);
void poloniex_setpair(char *pair,cJSON *argjson) { char *base,*rel; base = jstr(argjson,"base"); rel = jstr(argjson,"rel"); if ( base == 0 || rel == 0 ) strcpy(pair,"all"); else sprintf(pair,"%s_%s",rel,base); }
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; }
char *PARSEBALANCE(struct exchange_info *exchange,double *balancep,char *coinstr) { //[[{"type":"deposit","currency":"btc","amount":"0.0","available":"0.0"},{"type":"deposit","currency":"usd","amount":"0.0","available":"0.0"},{"type":"exchange","currency":"btc","amount":"0.01065851","available":"0.01065851"},{"type":"exchange","currency":"usd","amount":"23386.37278962","available":"0.00378962"},{"type":"trading","currency":"btc","amount":"0.0","available":"0.0"},{"type":"trading","currency":"usd","amount":"0.0","available":"0.0"}]] int32_t i,n,ind; char field[64],*str,*typestr,*itemstr = 0; cJSON *item,*obj,*array; double amounts[3],avail[3],val0,val1; *balancep = 0.; strcpy(field,coinstr), tolowercase(field); memset(amounts,0,sizeof(amounts)); memset(avail,0,sizeof(avail)); if ( exchange->balancejson != 0 && is_cJSON_Array(exchange->balancejson) != 0 && (n= cJSON_GetArraySize(exchange->balancejson)) > 0 ) { for (i=0; i<n; i++) { if ( (item= jitem(exchange->balancejson,i)) != 0 ) { if ( (str= jstr(item,"currency")) != 0 && strcmp(field,str) == 0 ) { val0 = jdouble(item,"amount"); val1 = jdouble(item,"available"); if ( (typestr= jstr(item,"type")) != 0 ) { if ( strcmp(typestr,"deposit") == 0 ) ind = 0; else if ( strcmp(typestr,"exchange") == 0 ) ind = 1; else if ( strcmp(typestr,"trading") == 0 ) ind = 2; else ind = -1; if ( ind >= 0 ) { amounts[ind] = val0; avail[ind] = val1; } } } } } if ( (obj= cJSON_CreateObject()) != 0 ) { touppercase(field); *balancep = avail[0] + avail[1] + avail[2]; jaddstr(obj,"base",field); jaddnum(obj,"balance",*balancep); jaddnum(obj,"total",amounts[0]+amounts[1]+amounts[2]); array = cJSON_CreateArray(), jaddinum(array,avail[0]), jaddinum(array,amounts[0]), jadd(obj,"deposit",array); array = cJSON_CreateArray(), jaddinum(array,avail[1]), jaddinum(array,amounts[1]), jadd(obj,"exchange",array); array = cJSON_CreateArray(), jaddinum(array,avail[2]), jaddinum(array,amounts[2]), jadd(obj,"trading",array); itemstr = jprint(obj,1); } } if ( itemstr == 0 ) return(clonestr("{\"error\":\"cant find coin balance\"}")); return(itemstr); }
void marketmaker_pendinginit(char *exchange,char *base,char *rel) { char *retstr,*orderid; cJSON *retjson,*array,*item; int32_t i,j,n,dir; struct mmpending_order *ptr; if ( (retstr= DEX_openorders(exchange)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { //printf("%s\n",jprint(retjson,0)); if ( is_cJSON_True(jobj(retjson,"success")) != 0 && (array= jarray(&n,retjson,"result")) != 0 ) { for (i=0; i<n; i++) { item = jitem(array,i); //printf("(%s)\n",jprint(item,0)); //{"success":true,"message":"","result":[{"Uuid":null,"OrderUuid":"81ad3e37-65d4-4fee-9c29-03b050f5192b","Exchange":"BTC-KMD","OrderType":"LIMIT_BUY","Quantity":885.19934578,"QuantityRemaining":885.19934578,"Limit":0.00011184,"CommissionPaid":0,"Price":0,"PricePerUnit":null,"Opened":"2017-02-19T19:14:02.94","Closed":null,"CancelInitiated":false,"ImmediateOrCancel":false,"IsConditional":false,"Condition":"NONE","ConditionTarget":null}],"tag":"10056789044100011414"} if ( (orderid= jstr(item,"OrderUuid")) != 0 && is_cJSON_Null(jobj(item,"Closed")) != 0 && is_cJSON_False(jobj(item,"CancelInitiated")) != 0 ) { for (j=0; j<Num_Pending; j++) { ptr = &Pending_orders[j]; if ( strcmp(exchange,ptr->exchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) continue; if ( strcmp(ptr->orderid,orderid) == 0 ) { ptr->pending = (uint32_t)time(NULL); ptr->completed = 0; printf("%s pending\n",orderid); break; } } if ( j == Num_Pending ) { if ( jstr(item,"OrderType") != 0 ) { if ( strcmp(jstr(item,"OrderType"),"LIMIT_BUY") == 0 ) dir = 1; else if ( strcmp(jstr(item,"OrderType"),"LIMIT_SELL") == 0 ) dir = -1; else dir = 0; if ( dir != 0 ) marketmaker_queue(exchange,base,rel,dir,jdouble(item,"Limit"),jdouble(item,"QuantityRemaining"),item); else printf("no dir (%s) (%s)\n",jprint(item,0),jstr(item,"OrderType")); } } } } } free_json(retjson); } free(retstr); } }
char *WITHDRAW(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { char buf[1024],*base,*destaddr; double amount; if ( (base= jstr(argjson,"base")) == 0 || strcmp(base,"BTC") != 0 ) return(clonestr("{\"error\":\"base not specified or base != BTC\"}")); if ( (destaddr= jstr(argjson,"destaddr")) == 0 ) return(clonestr("{\"error\":\"destaddr not specified\"}")); if ( (amount= jdouble(argjson,"amount")) < SMALLVAL ) return(clonestr("{\"error\":\"amount not specified\"}")); sprintf(buf,"\"amount\":%.4f,\"address\":\"%s\",",amount,destaddr); printf("submit.(%s)\n",buf); return(jprint(SIGNPOST(cHandlep,1,0,exchange,"","bitcoin_withdrawal"),1)); }
char *WITHDRAW(struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*base,*destaddr,*method; double amount; if ( (base= jstr(argjson,"base")) == 0 || strcmp(base,"BTC") != 0 ) return(clonestr("{\"error\":\"base not specified or base != BTC\"}")); if ( (destaddr= jstr(argjson,"destaddr")) == 0 ) return(clonestr("{\"error\":\"destaddr not specified\"}")); if ( (amount= jdouble(argjson,"amount")) < SMALLVAL ) return(clonestr("{\"error\":\"amount not specified\"}")); method = "withdraw_coin"; sprintf(payload,"&coin_type=1&withdraw_address=%s&withdraw_amount=%.4f",destaddr,amount); return(jprint(huobi_issue_auth(exchange,method,payload),1)); }
uint16_t SuperNET_API2num(char *agent,char *method) { int32_t i,n = 0; cJSON *item; if ( agent != 0 && method != 0 && API_json != 0 && (n= cJSON_GetArraySize(API_json)) > 0 ) { for (i=0; i<n; i++) { item = jitem(API_json,i); if ( strcmp(agent,jstr(item,"agent")) == 0 && strcmp(method,jstr(item,"method")) == 0 ) return((i << 5) | (SUPERNET_APIVERSION & 0x1f)); } } return(-1); }
char *OPENORDERS(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*base,*rel,*retstr = 0; cJSON *json; if ( (rel= jstr(argjson,"rel")) == 0 ) rel = "cny"; sprintf(payload,"&mk_type=%s",rel); if ( (base= jstr(argjson,"base")) != 0 ) sprintf(payload + strlen(payload),"&coinname=%s",base); if ( (json= SIGNPOST(cHandlep,1,&retstr,exchange,payload,"getOrderList.php")) != 0 ) { free_json(json); } return(retstr); // return standardized open orders }
char *WITHDRAW(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*base,*destaddr,*method,*tradepassword; double amount; if ( (base= jstr(argjson,"base")) == 0 || strcmp(base,"BTC") != 0 ) return(clonestr("{\"error\":\"base not specified or base != BTC\"}")); if ( (destaddr= jstr(argjson,"destaddr")) == 0 ) return(clonestr("{\"error\":\"destaddr not specified\"}")); if ( (amount= jdouble(argjson,"amount")) < SMALLVAL ) return(clonestr("{\"error\":\"amount not specified\"}")); if ( (tradepassword= jstr(argjson,"tradepassword")) == 0 ) return(clonestr("{\"error\":\"tradepassword not specified\"}")); method = "withdraw_coin"; sprintf(payload,"&symbol=btc_usd&chargefee=0.0001&withdraw_address=%s&withdraw_amount=%.4f&trade_pwd=%s",destaddr,amount,tradepassword); return(jprint(okcoin_issue_auth(cHandlep,exchange,method,payload),1)); }
char *SuperNET_jsonstr(struct supernet_info *myinfo,char *jsonstr,char *remoteaddr) { cJSON *json; char *agent,*method; //char str[65]; printf("SuperNET_jsonstr %p %s\n",&myinfo->privkey,bits256_str(str,myinfo->privkey)); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { method = jstr(json,"method"); if ( (agent= jstr(json,"agent")) != 0 && method != 0 ) return(SuperNET_parser(myinfo,agent,method,json,remoteaddr)); else if ( method != 0 && is_bitcoinrpc(method,remoteaddr) ) return(iguana_bitcoinRPC(myinfo,method,json,remoteaddr)); return(clonestr("{\"error\":\"need both agent and method\"}")); } return(clonestr("{\"error\":\"couldnt parse SuperNET_JSON\"}")); }
char *PARSEBALANCE(struct exchange_info *exchange,double *balancep,char *coinstr) { //[{"btc_available":"0.00000000","btc_reserved":"0.00000000","btc_balance":"0.00000000","cad_available":"0.00","cad_reserved":"0.00","cad_balance":"0.00","usd_available":"0.00","usd_reserved":"0.00","usd_balance":"0.00","xau_available":"0.000000","xau_reserved":"0.000000","xau_balance":"0.000000","fee":"0.5000"}] char field[128],*str,*itemstr = 0; cJSON *obj; double reserv,total; *balancep = 0.; strcpy(field,coinstr); tolowercase(field); strcat(field,"_available"); if ( exchange->balancejson != 0 && (str= jstr(exchange->balancejson,field)) != 0 ) { *balancep = jdouble(exchange->balancejson,field); strcpy(field,coinstr), tolowercase(field), strcat(field,"_reserved"); reserv = jdouble(exchange->balancejson,field); strcpy(field,coinstr), tolowercase(field), strcat(field,"_balance"); total = jdouble(exchange->balancejson,field); obj = cJSON_CreateObject(); jaddnum(obj,"balance",*balancep); jaddnum(obj,"locked_balance",reserv); jaddnum(obj,"total",total); itemstr = jprint(obj,1); } if ( itemstr == 0 ) return(clonestr("{\"error\":\"cant find coin balance\"}")); return(itemstr); }
char *PARSEBALANCE(struct exchange_info *exchange,double *balancep,char *coinstr) { char field[128],*str,*itemstr = 0; cJSON *obj; double lockbalance,imma; *balancep = 0.; strcpy(field,coinstr); tolowercase(field); strcat(field,"_balance"); if ( exchange->balancejson != 0 && (str= jstr(exchange->balancejson,field)) != 0 ) { *balancep = jdouble(exchange->balancejson,field); strcpy(field,coinstr), tolowercase(field), strcat(field,"_balance_lock"); lockbalance = jdouble(exchange->balancejson,field); strcpy(field,coinstr), tolowercase(field), strcat(field,"_balance_imma"); imma = jdouble(exchange->balancejson,field); obj = cJSON_CreateObject(); jaddnum(obj,"balance",*balancep); jaddnum(obj,"locked_balance",lockbalance); jaddnum(obj,"imma_balance",imma); itemstr = jprint(obj,1); } if ( itemstr == 0 ) return(clonestr("{\"error\":\"cant find coin balance\"}")); return(itemstr); }
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); }
char *instantdex_request(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen) { char *base,*rel,*request; double volume,aveprice,totalvol; int32_t num,depth; struct exchange_quote sortbuf[1000]; if ( argjson != 0 ) { num = 0; depth = 30; request = jstr(argjson,"request"); base = jstr(argjson,"base"); rel = jstr(argjson,"rel"); volume = jdouble(argjson,"volume"); aveprice = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&totalvol,base,rel,volume,argjson); return(clonestr("{\"result\":\"request calculated aveprice\"}")); return(clonestr("{\"error\":\"request missing parameter\"}")); } else return(clonestr("{\"error\":\"request needs argjson\"}")); }
STRING_ARG(iguana,addcoin,newcoin) { char *symbol,*seedip; int32_t retval; if ( (symbol= newcoin) == 0 && coin != 0 ) symbol = coin->symbol; if ( symbol != 0 ) { if ( (seedip= jstr(json,"seedipaddr")) != 0 ) safecopy(myinfo->seedipaddr,seedip,sizeof(myinfo->seedipaddr)); printf(">> addcoin.%s seedipaddr.%s\n",symbol,myinfo->seedipaddr); #ifdef __PNACL__ // if ( strcmp(symbol,"BTC") == 0 ) // return(clonestr("{\"result\":\"BTC for chrome app is not yet\"}")); #endif if ( (retval= iguana_launchcoin(myinfo,symbol,json,0)) > 0 ) { if ( myinfo->rpcsymbol[0] == 0 ) safecopy(myinfo->rpcsymbol,symbol,sizeof(myinfo->rpcsymbol)); return(clonestr("{\"result\":\"coin added\"}")); } else if ( retval == 0 ) return(clonestr("{\"result\":\"coin already there\"}")); else return(clonestr("{\"error\":\"error adding coin\"}")); } else return(clonestr("{\"error\":\"addcoin needs newcoin\"}")); }
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 *basilisk_respond_geckoheaders(struct supernet_info *myinfo,char *CMD,void *addr,char *remoteaddr,uint32_t basilisktag,cJSON *valsobj,uint8_t *data,int32_t datalen,bits256 hash2,int32_t from_basilisk) { char *symbol; struct iguana_info *virt; printf("respond to incoming headers datalen.%d\n",datalen); if ( (symbol= jstr(valsobj,"symbol")) != 0 && (virt= iguana_coinfind(symbol)) != 0 ) return(gecko_headersarrived(myinfo,virt,addr,data,datalen,hash2)); else return(clonestr("{\"error\":\"couldt find gecko chain\"}")); }
int32_t SuperNET_num2API(char *agent,char *method,uint16_t num) { int32_t n,apiversion; cJSON *item; if ( (apiversion= (num & 0x1f)) != SUPERNET_APIVERSION ) { printf("need to make sure all released api help returns are indexed here!\n"); return(-1); } num >>= 5; if ( API_json != 0 && (n= cJSON_GetArraySize(API_json)) > 0 && num < n ) { item = jitem(API_json,num); strcpy(agent,jstr(item,"agent")); strcpy(method,jstr(item,"method")); return(num); } return(-1); }
char *WITHDRAW(void **cHandlep,struct exchange_info *exchange,cJSON *argjson) { char payload[1024],*destaddr,*paymentid,*base,*retstr = 0; cJSON *json; double amount; if ( (base= jstr(argjson,"base")) == 0 ) return(clonestr("{\"error\":\"base not specified\"}")); if ( (destaddr= jstr(argjson,"destaddr")) == 0 ) return(clonestr("{\"error\":\"destaddr not specified\"}")); if ( (amount= jdouble(argjson,"amount")) < SMALLVAL ) return(clonestr("{\"error\":\"amount not specified\"}")); paymentid = jstr(argjson,"paymentid"); sprintf(payload,"command=withdraw&nonce=%llu¤cy=%s&amount=%.6f&address=%s",(long long)exchange_nonce(exchange),base,amount,destaddr); if ( paymentid != 0 ) sprintf(payload + strlen(payload),"&paymentId=%s",paymentid); if ( (json= SIGNPOST(cHandlep,1,&retstr,exchange,EXCHANGE_AUTHURL,payload)) != 0 ) { free_json(json); } return(retstr); // return standardized withdraw }
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 *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); }
char *CANCELORDER(void **cHandlep,struct exchange_info *exchange,cJSON *argjson,uint64_t quoteid) { char payload[1024],*rel,*retstr = 0; cJSON *json; if ( (rel= jstr(argjson,"rel")) == 0 ) rel = "cny"; sprintf(payload,"&mk_type=%s&order_id=%llu",rel,(long long)quoteid); if ( (json= SIGNPOST(cHandlep,1,&retstr,exchange,payload,"cancelOrder.php")) != 0 ) { free_json(json); } return(retstr); // return standardized cancelorder }
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,*depositaddr,*retstr = 0; int32_t i; double pingmillis = 60000; retbuf[0] = 0; printf("<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s)\n",plugin->name,jsonstr); if ( initflag > 0 ) { RPS.readyflag = 1; plugin->allowremote = 1; copy_cJSON(RPS.name,jobj(json,"name")); txnet777_init(&RPS.TXNET,json,"rps","RPS",RPS.name,pingmillis); strcpy(plugin->NXTADDR,RPS.TXNET.ACCT.NXTADDR); if ( (depositaddr= jstr(json,"depositaddr")) == 0 ) depositaddr = GATEWAY_ADDRESS; printf("fixed.%ld malleable.%ld tx.%ld\n",sizeof(struct txnet777_input),sizeof(struct txnet777_output),sizeof(struct txnet777)); sprintf(retbuf,"{\"result\":\"initialized RPS\",\"pluginNXT\":\"%s\",\"serviceNXT\":\"%s\",\"depositaddr\":\"%s\"}",plugin->NXTADDR,plugin->SERVICENXT,depositaddr); } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); methodstr = jstr(json,"method"); resultstr = jstr(json,"result"); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } else if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } for (i=0; i<sizeof(PLUGNAME(_methods))/sizeof(*PLUGNAME(_methods)); i++) if ( strcmp(PLUGNAME(_methods)[i],methodstr) == 0 ) retstr = (*PLUGNAME(_functions)[i])(retbuf,maxlen,&RPS.TXNET,json,jsonstr,tokenstr,forwarder,sender,valid); } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
inline error_code unmarshall_json(const char* json_str, const char* key, std::string& val) { std::string jstr(json_str); std::replace(jstr.begin(), jstr.end(), '\'', '\"'); rapidjson::Document doc; TEST_PARAM(!doc.Parse<0>(jstr.c_str()).HasParseError()) TEST_PARAM(doc.IsObject()) TEST_PARAM(doc.HasMember(key)) TEST_PARAM(!unmarshall_json(doc[key], val)) return ERR_OK; };
int32_t basilisk_message_returned(uint8_t *data,int32_t maxlen,cJSON *item) { char *hexstr=0; cJSON *msgobj; int32_t datalen=0,retval = -1; if ( (msgobj= jobj(item,"message")) != 0 ) { if ( (hexstr= jstr(msgobj,"data")) != 0 && (datalen= is_hexstr(hexstr,0)) > 0 ) { datalen >>= 1; if ( datalen < maxlen ) { decode_hex(data,datalen,hexstr); printf("decoded hexstr.[%d]\n",datalen); retval = datalen; } else printf("datalen.%d < maxlen.%d\n",datalen,maxlen); } else printf("no hexstr.%p or datalen.%d\n",hexstr,datalen);
char *WITHDRAW(struct exchange_info *exchange,char *base,double amount,char *destaddr,cJSON *argjson) { char payload[1024],*method,*tradepassword; if ( base == 0 || base[0] == 0 ) return(clonestr("{\"error\":\"base not specified\"}")); if ( destaddr == 0 || destaddr[0] == 0 ) return(clonestr("{\"error\":\"destaddr not specified\"}")); if ( amount < SMALLVAL ) return(clonestr("{\"error\":\"amount not specified\"}")); if ( (tradepassword= jstr(argjson,"tradepassword")) == 0 ) tradepassword = exchange->tradepassword; if ( tradepassword == 0 || tradepassword[0] == 0 ) return(clonestr("{\"error\":\"tradepassword not specified\"}")); method = "withdraw_coin"; sprintf(payload,"&symbol=btc_usd&chargefee=0.0001&withdraw_address=%s&withdraw_amount=%.4f&trade_pwd=%s",destaddr,amount,tradepassword); return(jprint(okcoin_issue_auth(&exchange->cHandle,exchange,method,payload),1)); }