char *nn_loadbalanced(uint8_t *data,int32_t len) { char *msg,*jsonstr = 0; int32_t sendlen,i,lbsock,recvlen = 0; if ( (lbsock= RELAYS.lbclient) < 0 ) return(clonestr("{\"error\":\"invalid load balanced socket\"}")); for (i=0; i<10; i++) if ( (nn_socket_status(lbsock,1) & NN_POLLOUT) != 0 ) break; if ( Debuglevel > 2 ) printf("sock.%d NN_LBSEND.(%s)\n",lbsock,data); //fprintf(stderr,"send to network\n"); if ( (sendlen= nn_send(lbsock,data,len,0)) == len ) { for (i=0; i<10; i++) if ( (nn_socket_status(lbsock,1) & NN_POLLIN) != 0 ) break; if ( (recvlen= nn_recv(lbsock,&msg,NN_MSG,0)) > 0 ) { if ( Debuglevel > 2 ) printf("LBRECV.(%s)\n",msg); jsonstr = clonestr((char *)msg); nn_freemsg(msg); } else { printf("nn_loadbalanced got recvlen.%d %s\n",recvlen,nn_errstr()); jsonstr = clonestr("{\"error\":\"lb recv error, probably timeout\"}"); } } else printf("got sendlen.%d instead of %d %s\n",sendlen,len,nn_errstr()), jsonstr = clonestr("{\"error\":\"lb send error\"}"); return(jsonstr); }
char *block_on_SuperNET(int32_t blockflag,char *JSONstr) { char **ptrs,*retstr,retbuf[1024]; uint64_t txid = 0; ptrs = calloc(3,sizeof(*ptrs)); ptrs[0] = clonestr(JSONstr); if ( blockflag == 0 ) { txid = calc_txid((uint8_t *)JSONstr,(int32_t)strlen(JSONstr)); ptrs[2] = (char *)txid; } if ( Debuglevel > 2 ) printf("block.%d QUEUE.(%s)\n",blockflag,JSONstr); queue_enqueue(&JSON_Q,ptrs); if ( blockflag != 0 ) { while ( (retstr= ptrs[1]) == 0 ) usleep(1000); if ( ptrs[0] != 0 ) free(ptrs[0]); free(ptrs); //printf("block.%d returned.(%s)\n",blockflag,retstr); return(retstr); } else { sprintf(retbuf,"{\"result\":\"pending SuperNET API call\",\"txid\":\"%llu\"}",(long long)txid); //printf("queue.%d returned.(%s)\n",blockflag,retbuf); return(clonestr(retbuf)); } }
char *instantdex_sendcmd(struct supernet_info *myinfo,cJSON *argjson,char *cmdstr,char *ipaddr,int32_t hops) { char *reqstr,hexstr[8192]; uint8_t _msg[4096]; uint64_t nxt64bits; int32_t datalen; bits256 instantdexhash; struct instantdex_msghdr *msg; msg = (struct instantdex_msghdr *)_msg; memset(msg,0,sizeof(*msg)); instantdexhash = calc_categoryhashes(0,"InstantDEX",0); category_subscribe(myinfo,instantdexhash,GENESIS_PUBKEY); if ( ipaddr == 0 || ipaddr[0] == 0 || strncmp(ipaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 ) return(clonestr("{\"error\":\"no ipaddr, need to send your ipaddr for now\"}")); jaddstr(argjson,"cmd",cmdstr); jaddstr(argjson,"agent","SuperNET"); jaddstr(argjson,"method","DHT"); jaddstr(argjson,"traderip",ipaddr); jaddbits256(argjson,"categoryhash",instantdexhash); jaddbits256(argjson,"traderpub",myinfo->myaddr.persistent); nxt64bits = acct777_nxt64bits(myinfo->myaddr.persistent); reqstr = jprint(argjson,1); datalen = (int32_t)(strlen(reqstr) + 1); memcpy(msg->serialized,reqstr,datalen); free(reqstr); if ( (datalen+sizeof(*msg))*2+1 < sizeof(hexstr) && instantdex_msgcreate(myinfo,msg,datalen) != 0 ) { printf("instantdex send.(%s)\n",cmdstr); init_hexbytes_noT(hexstr,(uint8_t *)msg,msg->sig.allocsize); return(SuperNET_categorymulticast(myinfo,0,instantdexhash,GENESIS_PUBKEY,hexstr,0,hops,1)); } else { printf("cant msgcreate\n"); return(clonestr("{\"error\":\"couldnt create instantdex message\"}")); } }
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 }
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 *instantdex_confirmed(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen) { if ( argjson != 0 ) { return(clonestr("{\"result\":\"proposal was confirmed\"}")); } else return(clonestr("{\"error\":\"response needs argjson\"}")); }
char *teleport_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { //static char *teleport[] = { (char *)teleport_func, "teleport", "V", "NXT", "secret", "amount", "dest", "coin", "minage", 0 }; double amount; int32_t M,N; struct coin_info *cp; char NXTACCTSECRET[512],destaddr[512],minage[512],coinstr[512],*retstr = 0; if ( Historical_done == 0 ) return(clonestr("historical processing is not done yet")); copy_cJSON(NXTACCTSECRET,objs[1]); amount = get_API_float(objs[2]); copy_cJSON(destaddr,objs[3]); copy_cJSON(coinstr,objs[4]); copy_cJSON(minage,objs[5]); M = get_API_int(objs[6],1); N = get_API_int(objs[7],1); if ( M > N || N >= 0xff || M <= 0 ) M = N = 1; printf("amount.(%.8f) minage.(%s) %d | M.%d N.%d\n",amount,minage,atoi(minage),M,N); cp = get_coin_info(coinstr); if ( cp != 0 && sender[0] != 0 && amount > 0 && valid != 0 && destaddr[0] != 0 ) retstr = teleport(sender,NXTACCTSECRET,(uint64_t)(SATOSHIDEN * amount),destaddr,cp,atoi(minage),M,N); else retstr = clonestr("{\"error\":\"invalid teleport request\"}"); return(retstr); }
char *gecko_headersarrived(struct supernet_info *myinfo,struct iguana_info *virt,char *remoteaddr,uint8_t *data,int32_t datalen,bits256 firsthash2) { bits256 hash2,prevhash2; struct iguana_block *block; int32_t height,firstheight,i,len=0,n,num; struct iguana_msgzblock zmsgB; char str[65],str2[65]; num = (int32_t)(datalen / 84); printf("headers.%s arrived.%d from %s\n",virt->symbol,num,bits256_str(str,firsthash2)); if ( (block= iguana_blockfind("geckohdrs",virt,firsthash2)) != 0 && (firstheight= block->height) >= 0 ) { gecko_blockhashupdate(virt,firsthash2,firstheight); prevhash2 = firsthash2; for (i=0; i<num; i++) { if ( (n= iguana_rwblock(myinfo,virt->symbol,virt->chain->zcash,virt->chain->auxpow,virt->chain->hashalgo,0,&hash2,&data[len],&zmsgB,datalen-len)) > 0 ) { if ( bits256_cmp(zmsgB.zH.prev_block,prevhash2) == 0 ) { height = (firstheight + i + 1); gecko_blockhashupdate(virt,hash2,height); printf("ht.%d %s\n",height,bits256_str(str,hash2)); } else printf("ht.%d non prevhash i.%d %s %s\n",height,i,bits256_str(str,prevhash2),bits256_str(str2,zmsgB.zH.prev_block)); len += n; prevhash2 = hash2; } } return(clonestr("{\"result\":\"gecko headers processed\"}")); } else return(clonestr("{\"error\":\"gecko headers couldnt find firsthash2\"}")); }
STRING_ARG(iguana,pausecoin,activecoin) { if ( coin != 0 ) { coin->active = 0; return(clonestr("{\"result\":\"coin paused\"}")); } else return(clonestr("{\"error\":\"pausecoin needs coin\"}")); }
TWO_STRINGS(iguana,oneshot,activecoin,ipaddr) { if ( coin != 0 && ipaddr != 0 ) { iguana_possible_peer(coin,ipaddr); return(clonestr("{\"result\":\"addnode submitted\"}")); } else return(clonestr("{\"error\":\"addnode needs coin and ipaddr\"}")); }
STRING_ARG(iguana,initfastfind,activecoin) { if ( (coin= iguana_coinfind(activecoin)) != 0 ) { iguana_fastfindcreate(coin); return(clonestr("{\"result\":\"fast find initialized\"}")); } else return(clonestr("{\"error\":\"no coin to initialize\"}")); }
STRING_ARG(iguana,startcoin,activecoin) { if ( coin != 0 ) { coin->active = 1; return(clonestr("{\"result\":\"coin started\"}")); } else return(clonestr("{\"error\":\"startcoin needs coin\"}")); }
char *placequote_func(int32_t dir,char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { int32_t polarity; uint64_t obookid,nxt64bits,assetA,assetB,txid; double price,volume; struct orderbook_tx tx; char buf[1024],txidstr[512],*retstr = 0; nxt64bits = calc_nxt64bits(sender); obookid = get_API_nxt64bits(objs[1]); polarity = get_API_int(objs[2],1); if ( polarity == 0 ) polarity = 1; volume = get_API_float(objs[3]); price = get_API_float(objs[4]); assetA = get_API_nxt64bits(objs[5]); assetB = get_API_nxt64bits(objs[6]); printf("PLACE QUOTE polarity.%d dir.%d\n",polarity,dir); if ( sender[0] != 0 && find_raw_orders(obookid) != 0 && valid != 0 ) { if ( price != 0. && volume != 0. && dir != 0 ) { if ( dir*polarity > 0 ) bid_orderbook_tx(&tx,0,nxt64bits,obookid,price,volume); else ask_orderbook_tx(&tx,0,nxt64bits,obookid,price,volume); txid = pNXT_submit_tx(Global_pNXT->core,Global_pNXT->wallet,(unsigned char *)&tx,sizeof(tx)); if ( txid != 0 ) { expand_nxt64bits(txidstr,txid); sprintf(buf,"{\"txid\":\"%s\"}",txidstr); retstr = clonestr(buf); } } if ( retstr == 0 ) { sprintf(buf,"{\"error submitting\":\"place%s error obookid.%llx polarity.%d volume %f price %f\"}",dir>0?"bid":"ask",(long long)obookid,polarity,volume,price); retstr = clonestr(buf); } } else if ( assetA != 0 && assetB != 0 && assetA != assetB ) { if ( (obookid= create_raw_orders(assetA,assetB)) != 0 ) { sprintf(buf,"{\"obookid\":\"%llu\"}",(long long)obookid); retstr = clonestr(buf); } else { sprintf(buf,"{\"error\":\"couldnt create orderbook for assets %llu and %llu\"}",(long long)assetA,(long long)assetB); retstr = clonestr(buf); } } else { sprintf(buf,"{\"error\":\"place%s error obookid.%llx polarity.%d volume %f price %f\"}",polarity>0?"bid":"ask",(long long)obookid,polarity,volume,price); retstr = clonestr(buf); } return(retstr); }
ZERO_ARGS(bitcoinrpc,getdifficulty) { char buf[512]; if ( coin != 0 ) { sprintf(buf,"{\"result\":\"success\",\"proof-of-work\":\"%.8f\",\"search-interval\": 0}",PoW_from_compact(coin->blocks.hwmchain.RO.bits,coin->chain->unitval)); return(clonestr(buf)); } else return(clonestr("{\"error\":\"getdifficulty needs coin\"}")); }
char *SuperNET_gotpacket(char *msg,int32_t duration,char *ip_port) { static int flood,duplicates; cJSON *json; uint16_t p2pport; struct pserver_info *pserver; uint64_t txid; struct sockaddr prevaddr; int32_t len,createdflag,valid; unsigned char packet[2*MAX_JSON_FIELD]; char ipaddr[64],txidstr[64],retjsonstr[2*MAX_JSON_FIELD],verifiedNXTaddr[64],*cmdstr,*retstr; if ( SUPERNET_PORT != _SUPERNET_PORT ) return(clonestr("{\"error\":private SuperNET}")); strcpy(retjsonstr,"{\"result\":null}"); if ( Debuglevel > 2 ) printf("gotpacket.(%s) duration.%d from (%s)\n",msg,duration,ip_port); if ( Finished_loading == 0 ) { if ( is_hexstr(msg) == 0 ) { //printf("QUEUE.(%s)\n",msg); return(block_on_SuperNET(0,msg)); } return(clonestr(retjsonstr)); } p2pport = parse_ipaddr(ipaddr,ip_port); uv_ip4_addr(ipaddr,0,(struct sockaddr_in *)&prevaddr); pserver = get_pserver(0,ipaddr,0,p2pport); len = (int32_t)strlen(msg); if ( is_hexstr(msg) != 0 ) { len >>= 1; len = decode_hex(packet,len,msg); txid = calc_txid(packet,len);//hash,sizeof(hash)); sprintf(txidstr,"%llu",(long long)txid); MTadd_hashtable(&createdflag,&Global_pNXT->msg_txids,txidstr); if ( createdflag == 0 ) { duplicates++; return(clonestr("{\"error\":\"duplicate msg\"}")); } if ( (len<<1) == 30 ) // hack against flood flood++; if ( Debuglevel > 0 ) printf("gotpacket %d | Finished_loading.%d | flood.%d duplicates.%d\n",duration,Finished_loading,flood,duplicates); if ( is_encrypted_packet(packet,len) != 0 ) process_packet(0,retjsonstr,packet,len,0,&prevaddr,ipaddr,0); /*else if ( (obookid= is_orderbook_tx(packet,len)) != 0 ) { if ( update_orderbook_tx(1,obookid,(struct orderbook_tx *)packet,txid) == 0 ) { ((struct orderbook_tx *)packet)->txid = txid; sprintf(retjsonstr,"{\"result\":\"SuperNET_gotpacket got obbokid.%llu packet txid.%llu\"}",(long long)obookid,(long long)txid); } else sprintf(retjsonstr,"{\"result\":\"SuperNET_gotpacket error updating obookid.%llu\"}",(long long)obookid); }*/ else sprintf(retjsonstr,"{\"error\":\"SuperNET_gotpacket cant find obookid\"}"); }
SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment) { cJSON *retjson; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); if ( myinfo->expiration == 0 ) return(clonestr("{\"error\":\"need to unlock wallet\"}")); retjson = cJSON_CreateObject(); return(jprint(retjson,1)); }
STRING_ARG(iguana,stopcoin,activecoin) { if ( activecoin[0] != 0 ) coin = iguana_coinfind(activecoin); if ( coin != 0 ) { coin->active = 0; //iguana_coinpurge(coin); return(clonestr("{\"result\":\"coin stopped\"}")); } else return(clonestr("{\"error\":\"stopcoin needs coin\"}")); }
STRING_ARG(iguana,getconnectioncount,activecoin) { int32_t i,num = 0; char buf[512]; if ( coin != 0 && coin->peers != 0 ) { for (i=0; i<sizeof(coin->peers->active)/sizeof(*coin->peers->active); i++) if ( coin->peers->active[i].usock >= 0 ) num++; sprintf(buf,"{\"result\":\"%d\"}",num); return(clonestr(buf)); } else return(clonestr("{\"error\":\"getconnectioncount needs coin\"}")); }
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,char *base,double amount,char *destaddr,cJSON *argjson) { char payload[1024],*method; 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\"}")); method = "withdraw_coin"; sprintf(payload,"&coin_type=1&withdraw_address=%s&withdraw_amount=%.4f",destaddr,amount); return(jprint(huobi_issue_auth(&exchange->cHandle,exchange,method,payload),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)); }
char *tradebot_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { static char *buf; static int64_t filelen,allocsize; long len; cJSON *botjson; char NXTACCTSECRET[512],code[4096],retbuf[4096],*str,*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); copy_cJSON(code,objs[2]); printf("tradebotfunc.(%s) sender.(%s) valid.%d code.(%s)\n",origargstr,sender,valid,code); if ( sender[0] != 0 && valid != 0 && code[0] != 0 ) { len = strlen(code); if ( code[0] == '(' && code[len-1] == ')' ) { code[len-1] = 0; str = load_file(code+1,&buf,&filelen,&allocsize); if ( str == 0 ) { sprintf(retbuf,"{\"error\":\"cant open (%s)\"}",code+1); return(clonestr(retbuf)); } } else { str = code; //printf("str is (%s)\n",str); } if ( str != 0 ) { //printf("before.(%s) ",str); replace_singlequotes(str); //printf("after.(%s)\n",str); if ( (botjson= cJSON_Parse(str)) != 0 ) { retstr = start_tradebot(sender,NXTACCTSECRET,botjson); free_json(botjson); } else { str[sizeof(retbuf)-128] = 0; sprintf(retbuf,"{\"error\":\"couldnt parse (%s)\"}",str); printf("%s\n",retbuf); } if ( str != code ) free(str); } } else retstr = clonestr("{\"result\":\"invalid tradebot request\"}"); return(retstr); }
char *orderbook_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { int32_t i,polarity,allflag; uint64_t obookid; cJSON *json,*bids,*asks,*item; struct orderbook *op; char obook[512],buf[512],assetA[64],assetB[64],*retstr = 0; obookid = get_API_nxt64bits(objs[1]); expand_nxt64bits(obook,obookid); polarity = get_API_int(objs[2],1); if ( polarity == 0 ) polarity = 1; allflag = get_API_int(objs[3],0); if ( obookid != 0 && (op= create_orderbook(obookid,polarity,0,0)) != 0 ) { if ( op->numbids == 0 && op->numasks == 0 ) retstr = clonestr("{\"error\":\"no bids or asks\"}"); else { json = cJSON_CreateObject(); bids = cJSON_CreateArray(); for (i=0; i<op->numbids; i++) { item = create_order_json(&op->bids[i],1,allflag); cJSON_AddItemToArray(bids,item); } asks = cJSON_CreateArray(); for (i=0; i<op->numasks; i++) { item = create_order_json(&op->asks[i],1,allflag); cJSON_AddItemToArray(asks,item); } expand_nxt64bits(assetA,op->assetA); expand_nxt64bits(assetB,op->assetB); cJSON_AddItemToObject(json,"orderbook",cJSON_CreateString(obook)); cJSON_AddItemToObject(json,"assetA",cJSON_CreateString(assetA)); cJSON_AddItemToObject(json,"assetB",cJSON_CreateString(assetB)); cJSON_AddItemToObject(json,"polarity",cJSON_CreateNumber(polarity)); cJSON_AddItemToObject(json,"bids",bids); cJSON_AddItemToObject(json,"asks",asks); retstr = cJSON_Print(json); } free_orderbook(op); } else { sprintf(buf,"{\"error\":\"no such orderbook.(%llu)\"}",(long long)obookid); retstr = clonestr(buf); } return(retstr); }
TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr) { int32_t i; struct iguana_peer *addr; if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) { for (i=0; i<coin->MAXPEERS; i++) { addr = &coin->peers->active[i]; if ( strcmp(addr->ipaddr,ipaddr) == 0 ) return(jprint(iguana_peerjson(coin,addr),1)); } return(clonestr("{\"result\":\"nodestatus couldnt find ipaddr\"}")); } else return(clonestr("{\"error\":\"nodestatus needs ipaddr\"}")); }
static void parse_option(config_ptr config, char *s1, char *s2) { if (!strcmp(s1, "showmoves")) { config->showmoves = atoi(s2); } if (!strcmp(s1, "fontsize")) { config->fontsize = atoi(s2); } if (!strcmp(s1, "font")) { config->fontname = clonestr(s2); } if (!strcmp(s1, "hiscores")) { config->hsfile = clonestr(s2); } }
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\"}")); }
TWO_STRINGS(iguana,persistent,activecoin,ipaddr) { int32_t i; if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) { for (i=0; i<IGUANA_MAXPEERS; i++) { if ( strcmp(coin->peers->active[i].ipaddr,ipaddr) == 0 ) { coin->peers->active[i].persistent_peer = juint(json,"interval")+3; return(clonestr("{\"result\":\"node marked as persistent\"}")); } } return(clonestr("{\"result\":\"node wasnt active\"}")); } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); }
char *_submit_withdraw(struct ramchain_info *ram,struct cointx_info *cointx,char *othersignedtx) { FILE *fp; char fname[512],*cointxid,*signed2transaction; if ( ram->S.gatewayid < 0 ) return(0); if ( cosigntransaction(&cointxid,&signed2transaction,ram->name,ram->serverport,ram->userpass,cointx,othersignedtx,ram->S.gatewayid,NUM_GATEWAYS) > 0 ) { if ( signed2transaction != 0 && signed2transaction[0] != 0 ) { if ( cointxid != 0 && cointxid[0] != 0 ) { sprintf(fname,"%s/%s.%s",ram->backups,cointxid,ram->name); if ( (fp= fopen(os_compatible_path(fname),"w")) != 0 ) { fprintf(fp,"%s\n",signed2transaction); fclose(fp); printf("wrote.(%s) to file.(%s)\n",signed2transaction,fname); } else printf("unexpected %s cointxid.%s already there before submit??\n",ram->name,cointxid); printf("rawtxid len.%ld submitted.%s\n",strlen(signed2transaction),cointxid); free(signed2transaction); return(clonestr(cointxid)); } else printf("error null cointxid\n"); } else printf("error submit raw.%s\n",signed2transaction); } return(0); }
char *iguana_blockingjsonstr(struct supernet_info *myinfo,char *jsonstr,uint64_t tag,int32_t maxmillis,char *remoteaddr) { struct iguana_jsonitem *ptr; char *retjsonstr = 0; int32_t len,allocsize; double expiration; expiration = OS_milliseconds() + maxmillis; //printf("blocking case.(%s)\n",jsonstr); len = (int32_t)strlen(jsonstr); allocsize = sizeof(*ptr) + len + 1; ptr = mycalloc('J',1,allocsize); ptr->allocsize = allocsize; ptr->myinfo = myinfo; ptr->retjsonstrp = &retjsonstr; safecopy(ptr->remoteaddr,remoteaddr,sizeof(ptr->remoteaddr)); memcpy(ptr->jsonstr,jsonstr,len+1); queue_enqueue("jsonQ",&jsonQ,&ptr->DL,0); while ( OS_milliseconds() < expiration ) { usleep(100); if ( retjsonstr != 0 ) { //printf("got blocking retjsonstr.(%s) delete allocsize.%d:%d\n",retjsonstr,allocsize,ptr->allocsize); queue_delete(&finishedQ,&ptr->DL,ptr->allocsize,1); return(retjsonstr); } usleep(1000); } //printf("(%s) expired\n",jsonstr); ptr->expired = (uint32_t)time(NULL); return(clonestr("{\"error\":\"iguana jsonstr expired\"}")); }