struct crypto777_block *parse_block777(struct consensus_model *model,struct crypto777_node *nn,struct crypto777_block *block,int32_t len,uint32_t peerid) { char *blockstr = (char *)block->rawblock; uint64_t metric; int32_t bestacct; cJSON *json; uint32_t timestamp,blocknum = 0; if ( (bestacct= validate_block(block)) >= 0 && peerid < nn->numpeers && (json= cJSON_Parse(blockstr)) != 0 ) { blocknum = (uint32_t)get_API_int(cJSON_GetObjectItem(json,"blocknum"),0); timestamp = (uint32_t)get_API_int(cJSON_GetObjectItem(json,"timestamp"),0); metric = get_API_nxt64bits(cJSON_GetObjectItem(json,"metric")); model->peermetrics[blocknum][peerid] = metric; model->peerblocknum[peerid] = blocknum; free_json(json); if ( block->blocknum == blocknum ) // block->gen.metric == metric && return(block); else printf("error parse.(%s) metric %.8f vs %.8f blocknum %u vs %u\n",blockstr,dstr(block->gen.metric),dstr(metric),block->blocknum,blocknum); } else { int i; for (i=0; i<len; i++) printf("%02x ",((uint8_t *)block)[i]); printf("block.%d (%s) peerid.%d numpeers.%d\n",block->blocknum,blockstr,peerid,nn->numpeers); } return(0); }
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); }
int32_t ramchain_string(char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson,char *field,char *strname,int32_t (*coin_strfuncp)(struct coin777 *coin,char *str,int32_t max,uint32_t rawind,uint32_t addrind)) { char str[8192]; uint32_t rawind; if ( (rawind= (uint32_t)get_API_int(cJSON_GetObjectItem(argjson,field),0)) != 0 ) { if ( (*coin_strfuncp)(coin,str,sizeof(str),rawind,(uint32_t)get_API_int(cJSON_GetObjectItem(argjson,field),0)) == 0 ) { sprintf(retbuf,"{\"result\":\"success\",\"coin\":\"%s\",\"%s\":\"%u\",\"%s\":\"%s\"}",coin->name,field,rawind,strname,str); } else sprintf(retbuf,"{\"error\":\"cant find %s\",\"coin\":\"%s\"}",coin->name,field); } if ( retbuf[0] == 0 ) sprintf(retbuf,"{\"error\":\"no %s\",\"coin\":\"%s\"}",field,coin->name); return(-1); }
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); }
char *respondtx_func(int32_t localaccess,int32_t valid,char *sender,cJSON **objs,int32_t numobjs,char *origargstr) { char cmdstr[MAX_JSON_FIELD],triggerhash[MAX_JSON_FIELD],utx[MAX_JSON_FIELD],offerNXT[MAX_JSON_FIELD],sig[MAX_JSON_FIELD],*retstr = 0; uint64_t quoteid,assetid,qty,priceNQT,otherassetid,otherqty; int32_t minperc; printf("got respond_tx.(%s)\n",origargstr); if ( localaccess == 0 ) return(0); copy_cJSON(cmdstr,objs[0]); assetid = get_API_nxt64bits(objs[1]); qty = get_API_nxt64bits(objs[2]); priceNQT = get_API_nxt64bits(objs[3]); copy_cJSON(triggerhash,objs[4]); quoteid = get_API_nxt64bits(objs[5]); copy_cJSON(sig,objs[6]); copy_cJSON(utx,objs[7]); minperc = (int32_t)get_API_int(objs[8],INSTANTDEX_MINVOL); //if ( localaccess != 0 ) copy_cJSON(offerNXT,objs[9]); otherassetid = get_API_nxt64bits(objs[10]); otherqty = get_API_nxt64bits(objs[11]); if ( strcmp(offerNXT,SUPERNET.NXTADDR) == 0 && valid > 0 && triggerhash[0] != 0 ) retstr = respondtx(SUPERNET.NXTADDR,SUPERNET.NXTACCTSECRET,offerNXT,cmdstr,assetid,qty,priceNQT,triggerhash,quoteid,sig,utx,minperc,otherassetid,otherqty); //else retstr = clonestr("{\"result\":\"invalid respondtx_func request\"}"); return(retstr); }
static int32_t process_json(char *retbuf,int32_t max,struct plugin_info *plugin,char *jsonargs,int32_t initflag) { void *loadfile(uint64_t *allocsizep,char *fname); struct destbuf tokenstr,filename; char *myipaddr,*jsonstr = 0; cJSON *obj=0,*tmp,*json = 0; uint64_t allocsize,nxt64bits,tag = 0; int32_t retval = 0; //printf("call process_json.(%s)\n",jsonargs); if ( jsonargs != 0 && (json= cJSON_Parse(jsonargs)) != 0 ) { if ( is_cJSON_Array(json) != 0 && cJSON_GetArraySize(json) == 2 ) { obj = cJSON_GetArrayItem(json,0); copy_cJSON(&tokenstr,cJSON_GetArrayItem(json,1)); } else obj = json, tokenstr.buf[0] = 0; copy_cJSON(&filename,cJSON_GetObjectItem(obj,"filename")); if ( filename.buf[0] != 0 && (jsonstr= loadfile(&allocsize,filename.buf)) != 0 ) { if ( (tmp= cJSON_Parse(jsonstr)) != 0 ) obj = tmp; else free(jsonstr), jsonstr = 0; } if ( jsonstr == 0 ) jsonstr = cJSON_Print(obj); stripwhite2(jsonstr,' '); } if ( obj != 0 ) { //printf("jsonargs.(%s)\n",jsonargs); tag = get_API_nxt64bits(cJSON_GetObjectItem(obj,"tag")); if ( initflag > 0 ) { if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"NXT"))) != 0 ) { plugin->nxt64bits = nxt64bits; expand_nxt64bits(plugin->NXTADDR,plugin->nxt64bits); } if ( (nxt64bits= get_API_nxt64bits(cJSON_GetObjectItem(obj,"serviceNXT"))) != 0 ) expand_nxt64bits(plugin->SERVICENXT,nxt64bits); myipaddr = cJSON_str(cJSON_GetObjectItem(obj,"ipaddr")); if ( is_ipaddr(myipaddr) != 0 ) strcpy(plugin->ipaddr,myipaddr); plugin->port = get_API_int(cJSON_GetObjectItem(obj,"port"),0); } } //fprintf(stderr,"tag.%llu initflag.%d got jsonargs.(%s) [%s] %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 && obj != 0 ) retval = PLUGNAME(_process_json)(0,0,1,plugin,tag,retbuf,max,jsonstr,obj,initflag,tokenstr.buf); else printf("error with JSON.(%s)\n",jsonstr);//, getchar(); //fprintf(stderr,"done tag.%llu initflag.%d got jsonargs.(%p) %p %p\n",(long long)tag,initflag,jsonargs,jsonstr,obj); if ( jsonstr != 0 ) free(jsonstr); if ( json != 0 ) free_json(json); printf("%s\n",retbuf), fflush(stdout); return(retval); }
char *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); }
static int32_t registerAPI(char *retbuf,int32_t max,struct plugin_info *plugin,cJSON *argjson) { cJSON *json,*array; char *jsonstr; int32_t i; uint64_t disableflags = 0; json = cJSON_CreateObject(); retbuf[0] = 0; disableflags = PLUGNAME(_register)(plugin,(void *)plugin->pluginspace,argjson); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_methods))/sizeof(*PLUGNAME(_methods))); i++) { if ( PLUGNAME(_methods)[i] == 0 || PLUGNAME(_methods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_methods)[i])); } cJSON_AddItemToObject(json,"methods",array); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_pubmethods))/sizeof(*PLUGNAME(_pubmethods))); i++) { if ( PLUGNAME(_pubmethods)[i] == 0 || PLUGNAME(_pubmethods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_pubmethods)[i])); } cJSON_AddItemToObject(json,"pubmethods",array); array = cJSON_CreateArray(); for (i=0; i<(sizeof(PLUGNAME(_authmethods))/sizeof(*PLUGNAME(_authmethods))); i++) { if ( PLUGNAME(_authmethods)[i] == 0 || PLUGNAME(_authmethods)[i][0] == 0 ) break; if ( ((1LL << i) & disableflags) == 0 ) cJSON_AddItemToArray(array,cJSON_CreateString(PLUGNAME(_authmethods)[i])); } cJSON_AddItemToObject(json,"authmethods",array); cJSON_AddItemToObject(json,"pluginrequest",cJSON_CreateString("SuperNET")); cJSON_AddItemToObject(json,"requestType",cJSON_CreateString("register")); if ( plugin->sleepmillis == 0 ) plugin->sleepmillis = get_API_int(cJSON_GetObjectItem(json,"sleepmillis"),25);//SUPERNET.APISLEEP); cJSON_AddItemToObject(json,"sleepmillis",cJSON_CreateNumber(plugin->sleepmillis)); if ( cJSON_GetObjectItem(json,"NXT") == 0 ) cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(plugin->NXTADDR)); else cJSON_ReplaceItemInObject(json,"NXT",cJSON_CreateString(plugin->NXTADDR)); if ( cJSON_GetObjectItem(json,"serviceNXT") == 0 ) cJSON_AddItemToObject(json,"serviceNXT",cJSON_CreateString(plugin->SERVICENXT)); else cJSON_ReplaceItemInObject(json,"serviceNXT",cJSON_CreateString(plugin->SERVICENXT)); jsonstr = cJSON_Print(json), free_json(json); stripwhite2(jsonstr,' '); strcpy(retbuf,jsonstr), free(jsonstr); append_stdfields(retbuf,max,plugin,0,1); //printf(">>>>>>>>>>> register return.(%s)\n",retbuf); return((int32_t)strlen(retbuf) + (retbuf[0] != 0)); }
void ram_parse_MGWstate(struct MGWstate *sp,cJSON *json,char *coinstr,char *NXTaddr) { cJSON *nxtobj,*coinobj; if ( sp == 0 || json == 0 || coinstr == 0 || coinstr[0] == 0 ) return; memset(sp,0,sizeof(*sp)); sp->nxt64bits = calc_nxt64bits(NXTaddr); sp->MGWbalance = get_API_nxt64bits(cJSON_GetObjectItem(json,"balance")); sp->sentNXT = get_API_nxt64bits(cJSON_GetObjectItem(json,"sentNXT")); sp->MGWunspent = get_API_nxt64bits(cJSON_GetObjectItem(json,"unspent")); sp->circulation = get_API_nxt64bits(cJSON_GetObjectItem(json,"circulation")); sp->MGWpendingredeems = get_API_nxt64bits(cJSON_GetObjectItem(json,"pendingredeems")); sp->MGWpendingdeposits = get_API_nxt64bits(cJSON_GetObjectItem(json,"pendingdeposits")); sp->supply = get_API_nxt64bits(cJSON_GetObjectItem(json,"supply")); sp->orphans = get_API_nxt64bits(cJSON_GetObjectItem(json,"internal")); if ( (nxtobj= cJSON_GetObjectItem(json,"RTNXT")) != 0 ) { sp->NXT_RTblocknum = (uint32_t)get_API_int(cJSON_GetObjectItem(nxtobj,"height"),0); sp->NXTblocknum = (sp->NXT_RTblocknum - (uint32_t)get_API_int(cJSON_GetObjectItem(nxtobj,"lag"),0)); sp->NXT_ECblock = get_API_nxt64bits(cJSON_GetObjectItem(nxtobj,"ECblock")); sp->NXT_ECheight = (uint32_t)get_API_int(cJSON_GetObjectItem(nxtobj,"ECheight"),0); } if ( (coinobj= cJSON_GetObjectItem(json,coinstr)) != 0 ) { sp->permblocks = (uint32_t)get_API_int(cJSON_GetObjectItem(coinobj,"permblocks"),0); sp->RTblocknum = (uint32_t)get_API_int(cJSON_GetObjectItem(coinobj,"height"),0); sp->blocknum = (sp->NXT_RTblocknum - (uint32_t)get_API_int(cJSON_GetObjectItem(coinobj,"lag"),0)); } }
char *transporter_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; struct coin_info *cp; uint8_t sharenrs[255]; uint32_t totalcrc,M,N,minage,height,i,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],coinstr[512],otherpubaddr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); copy_cJSON(coinstr,objs[2]); height = get_API_uint(objs[3],0); minage = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); totalcrc = get_API_uint(objs[6],0); if ( is_cJSON_Array(objs[7]) != 0 && (n= cJSON_GetArraySize(objs[7])) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(objs[7],i),0); } M = get_API_int(objs[8],0); N = get_API_int(objs[9],0); copy_cJSON(sharenrsbuf,objs[10]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; copy_cJSON(otherpubaddr,objs[11]); printf("transporterstatus_func M.%d N.%d [%s] otherpubaddr.(%s)\n",M,N,sharenrsbuf,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && n > 0 ) retstr = transporter_received(sender,NXTACCTSECRET,coinstr,totalcrc,height,value,minage,crcs,n,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter bundle\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
void ram_parse_MGWpingstr(struct mgw777 *mgw,char *sender,char *pingstr) { void save_MGW_status(char *NXTaddr,char *jsonstr); char name[512],coinstr[MAX_JSON_FIELD],*jsonstr = 0; struct MGWstate S; int32_t gatewayid; cJSON *json,*array; if ( (array= cJSON_Parse(pingstr)) != 0 && is_cJSON_Array(array) != 0 ) { json = cJSON_GetArrayItem(array,0); if ( mgw == 0 ) { copy_cJSON(coinstr,cJSON_GetObjectItem(json,"coin")); if ( coinstr[0] != 0 ) mgw = get_MGW_info(coinstr); } if ( Debuglevel > 2 || (mgw != 0 && mgw->remotemode != 0) ) printf("[%s] parse.(%s)\n",coinstr,pingstr); if ( mgw != 0 ) { cJSON_DeleteItemFromObject(json,"ipaddr"); if ( (gatewayid= (int32_t)get_API_int(cJSON_GetObjectItem(json,"gatewayid"),-1)) >= 0 && gatewayid < mgw->numgateways ) { if ( strcmp(mgw->special_NXTaddrs[gatewayid],sender) == 0 ) ram_parse_MGWstate(&mgw->otherS[gatewayid],json,mgw->coinstr,sender); else printf("ram_parse_MGWpingstr: got wrong address.(%s) for gatewayid.%d expected.(%s)\n",sender,gatewayid,mgw->special_NXTaddrs[gatewayid]); } else { //printf("call parse.(%s)\n",cJSON_Print(json)); ram_parse_MGWstate(&S,json,mgw->coinstr,sender); ram_update_remotesrc(mgw,&S); } jsonstr = cJSON_Print(json); if ( gatewayid >= 0 && gatewayid < 3 && strcmp(mgw->mgwstrs[gatewayid],jsonstr) != 0 ) { safecopy(mgw->mgwstrs[gatewayid],jsonstr,sizeof(mgw->mgwstrs[gatewayid])); //sprintf(name,"%s.%s",mgw->coinstr,Server_ipaddrs[gatewayid]); sprintf(name,"%s.%d",mgw->coinstr,gatewayid); //printf("name is (%s) + (%s) -> (%s)\n",mgw->coinstr,Server_ipaddrs[gatewayid],name); save_MGW_status(name,jsonstr); } } if ( jsonstr != 0 ) free(jsonstr); free_json(array); } //printf("parsed\n"); }
char *sendpNXT_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { double amount; int32_t level; char NXTACCTSECRET[512],paymentid[256],dest[256],*retstr = 0; amount = get_API_float(objs[1]); copy_cJSON(NXTACCTSECRET,objs[2]); copy_cJSON(dest,objs[3]); level = get_API_int(objs[4],0); copy_cJSON(paymentid,objs[5]); if ( sender[0] != 0 && amount > 0 && valid != 0 && dest[0] != 0 ) retstr = send_pNXT(sender,NXTACCTSECRET,amount,level,dest,paymentid); else retstr = clonestr("{\"error\":\"invalid send request\"}"); return(retstr); }
static int32_t process_plugin_json(char *retbuf,int32_t max,int32_t *sendflagp,struct plugin_info *plugin,int32_t permanentflag,uint64_t daemonid,uint64_t myid,char *jsonstr) { int32_t valid = -11,len = (int32_t)strlen(jsonstr); cJSON *json,*obj,*tokenobj; uint64_t tag = 0; struct destbuf name,destname,forwarder,tokenstr,sender; retbuf[0] = *sendflagp = 0; //printf("PLUGIN.(%s) process_plugin_json (%s)\n",plugin->name,jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { if ( is_cJSON_Array(json) != 0 ) { obj = cJSON_GetArrayItem(json,0); jsonstr = cJSON_Print(obj), stripwhite2(jsonstr,' '); tokenobj = cJSON_GetArrayItem(json,1), stripwhite2(tokenstr.buf,' '); copy_cJSON(&tokenstr,tokenobj); copy_cJSON(&forwarder,cJSON_GetObjectItem(tokenobj,"forwarder")); copy_cJSON(&sender,cJSON_GetObjectItem(tokenobj,"sender")); valid = get_API_int(cJSON_GetObjectItem(tokenobj,"valid"),valid); } else obj = json, tokenstr.buf[0] = forwarder.buf[0] = sender.buf[0] = 0; copy_cJSON(&name,cJSON_GetObjectItem(obj,"plugin")); if ( name.buf[0] == 0 ) copy_cJSON(&name,cJSON_GetObjectItem(obj,"agent")); copy_cJSON(&destname,cJSON_GetObjectItem(obj,"destplugin")); if ( destname.buf[0] == 0 ) copy_cJSON(&destname,cJSON_GetObjectItem(obj,"destagent")); tag = get_API_nxt64bits(cJSON_GetObjectItem(obj,"tag")); if ( (strcmp(name.buf,plugin->name) == 0 || strcmp(destname.buf,plugin->name) == 0) && (len= PLUGNAME(_process_json)(forwarder.buf,sender.buf,valid,plugin,tag,retbuf,max,jsonstr,obj,0,tokenstr.buf)) > 0 ) { *sendflagp = 1; if ( retbuf[0] == 0 ) sprintf(retbuf,"{\"result\":\"no response\"}"); append_stdfields(retbuf,max,plugin,tag,0); return((int32_t)strlen(retbuf)); } //else printf("(%s) -> no return.%d (%s) vs (%s):(%s) len.%d\n",jsonstr,strcmp(name,plugin->name),name,destname,plugin->name,len); } else { printf("process_plugin_json: couldnt parse.(%s)\n",jsonstr); if ( jsonstr[len-1] == '\r' || jsonstr[len-1] == '\n' || jsonstr[len-1] == '\t' || jsonstr[len-1] == ' ' ) jsonstr[--len] = 0; sprintf(retbuf,"{\"result\":\"unparseable\",\"message\":\"%s\"}",jsonstr); } if ( *sendflagp != 0 && retbuf[0] != 0 ) append_stdfields(retbuf,max,plugin,tag,0); else retbuf[0] = *sendflagp = 0; return((int32_t)strlen(retbuf)); }
char *transporterstatus_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t value; cJSON *array; struct coin_info *cp; int32_t minage; uint8_t sharenrs[255]; uint32_t totalcrc,status,i,sharei,M,N,height,ind,num,n=0,*crcs = 0; char NXTACCTSECRET[1024],sharenrsbuf[1024],otherpubaddr[512],coinstr[512],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); status = get_API_int(objs[2],0); copy_cJSON(coinstr,objs[3]); totalcrc = get_API_uint(objs[4],0); value = (SATOSHIDEN * get_API_float(objs[5])); num = get_API_int(objs[6],0); minage = get_API_int(objs[7],0); height = get_API_int(objs[8],0); array = objs[9]; if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { crcs = calloc(n,sizeof(*crcs)); for (i=0; i<n; i++) crcs[i] = get_API_uint(cJSON_GetArrayItem(array,i),0); } sharei = get_API_int(objs[9],0); M = get_API_int(objs[11],0); N = get_API_int(objs[12],0); copy_cJSON(sharenrsbuf,objs[13]); memset(sharenrs,0,sizeof(sharenrs)); if ( M <= N && N < 0xff && M > 0 ) decode_hex(sharenrs,N,sharenrsbuf); else M = N = 1; ind = get_API_int(objs[14],0); copy_cJSON(otherpubaddr,objs[15]); //printf("transporterstatus_func sharei.%d M.%d N.%d other.(%s)\n",sharei,M,N,otherpubaddr); if ( coinstr[0] != 0 && sender[0] != 0 && valid != 0 && num > 0 ) retstr = got_transporter_status(NXTACCTSECRET,sender,coinstr,status,totalcrc,value,num,crcs,ind,minage,height,sharei,M,N,sharenrs,otherpubaddr); else retstr = clonestr("{\"error\":\"invalid incoming transporter status\"}"); if ( crcs != 0 ) free(crcs); return(retstr); }
void process_json(cJSON *json) { int32_t sock,i,len,checklen,sendtimeout,recvtimeout; uint32_t apitag; uint64_t tag; char endpoint[128],*resultstr,*jsonstr; jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); //fprintf(stderr,"jsonstr.(%s)\r\n",jsonstr); len = (int32_t)strlen(jsonstr)+1; apitag = _crc32(0,jsonstr,len); sprintf(endpoint,"ipc://api.%u",apitag); free(jsonstr); recvtimeout = get_API_int(cJSON_GetObjectItem(json,"timeout"),10000); sendtimeout = 5000; randombytes(&tag,sizeof(tag)); cJSON_AddItemToObject(json,"tag",cJSON_CreateNumber(tag)); cJSON_AddItemToObject(json,"apitag",cJSON_CreateString(endpoint)); //cJSON_AddItemToObject(json,"timeout",cJSON_CreateNumber(recvtimeout)); jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); len = (int32_t)strlen(jsonstr)+1; if ( json != 0 ) { if ( (sock= nn_socket(AF_SP,NN_PAIR)) >= 0 ) { if ( sendtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_SNDTIMEO,&sendtimeout,sizeof(sendtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_connect(sock,SUPERNET_APIENDPOINT) < 0 ) printf("error connecting to apiendpoint sock.%d type.%d (%s) %s\r\n",sock,NN_PUSH,SUPERNET_APIENDPOINT,nn_errstr()); else if ( (checklen= nn_send(sock,jsonstr,len,0)) != len ) printf("checklen.%d != len.%d for nn_send to (%s)\r\n",checklen,len,SUPERNET_APIENDPOINT); else { if ( recvtimeout > 0 && nn_setsockopt(sock,NN_SOL_SOCKET,NN_RCVTIMEO,&recvtimeout,sizeof(recvtimeout)) < 0 ) fprintf(stderr,"error setting sendtimeout %s\n",nn_errstr()); if ( nn_recv(sock,&resultstr,NN_MSG,0) > 0 ) { printf("Content-Length: %ld\r\n\r\n",strlen(resultstr)+2); printf("%s\r\n",resultstr); nn_freemsg(resultstr); } else printf("error getting results %s\r\n",nn_errstr()); } nn_shutdown(sock,0); } else printf("error getting pushsock.%s\r\n",nn_errstr()); } free(jsonstr); }
char *makeoffer_func(char *sender,int32_t valid,cJSON **objs,int32_t numobjs,char *origargstr) { uint64_t assetA,assetB; double qtyA,qtyB; int32_t type; char NXTACCTSECRET[512],otherNXTaddr[256],*retstr = 0; copy_cJSON(NXTACCTSECRET,objs[1]); copy_cJSON(otherNXTaddr,objs[2]); assetA = get_API_nxt64bits(objs[3]); qtyA = get_API_float(objs[4]); assetB = get_API_nxt64bits(objs[5]); qtyB = get_API_float(objs[6]); type = get_API_int(objs[7],0); if ( sender[0] != 0 && valid != 0 && otherNXTaddr[0] != 0 )//&& assetA != 0 && qtyA != 0. && assetB != 0. && qtyB != 0. ) retstr = makeoffer(sender,NXTACCTSECRET,otherNXTaddr,assetA,qtyA,assetB,qtyB,type); else retstr = clonestr("{\"result\":\"invalid makeoffer_func request\"}"); return(retstr); }
char *parse_expandedline(char *plugin,char *method,int32_t *timeoutp,char *line,int32_t broadcastflag) { int32_t i,j; char numstr[64],*pubstr,*cmdstr = 0; cJSON *json; uint64_t tag; for (i=0; i<512&&line[i]!=' '&&line[i]!=0; i++) plugin[i] = line[i]; plugin[i] = 0; *timeoutp = 0; pubstr = line; if ( strcmp(plugin,"pub") == 0 ) strcpy(plugin,"subscriptions"), strcpy(method,"publish"), pubstr += 4; else if ( line[i+1] != 0 ) { for (++i,j=0; i<512&&line[i]!=' '&&line[i]!=0; i++,j++) method[j] = line[i]; method[j] = 0; } else method[0] = 0; if ( (json= cJSON_Parse(line+i+1)) == 0 ) json = cJSON_CreateObject(); if ( json != 0 ) { if ( strcmp("direct",method) == 0 && cJSON_GetObjectItem(json,"myipaddr") == 0 ) cJSON_AddItemToObject(json,"myipaddr",cJSON_CreateString(SUPERNET.myipaddr)); if ( cJSON_GetObjectItem(json,"tag") == 0 ) randombytes((void *)&tag,sizeof(tag)), sprintf(numstr,"%llu",(long long)tag), cJSON_AddItemToObject(json,"tag",cJSON_CreateString(numstr)); //if ( cJSON_GetObjectItem(json,"NXT") == 0 ) // cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(SUPERNET.NXTADDR)); *timeoutp = get_API_int(cJSON_GetObjectItem(json,"timeout"),0); if ( plugin[0] == 0 ) strcpy(plugin,"relay"); if ( cJSON_GetObjectItem(json,"plugin") == 0 ) cJSON_AddItemToObject(json,"plugin",cJSON_CreateString(plugin)); else copy_cJSON(plugin,cJSON_GetObjectItem(json,"plugin")); if ( method[0] == 0 ) strcpy(method,"help"); cJSON_AddItemToObject(json,"method",cJSON_CreateString(method)); if ( broadcastflag != 0 ) cJSON_AddItemToObject(json,"broadcast",cJSON_CreateString("allrelays")); cmdstr = cJSON_Print(json), _stripwhite(cmdstr,' '); return(cmdstr); } else return(clonestr(pubstr)); }
struct coin777 *coin777_create(char *coinstr,cJSON *argjson) { char *serverport,*path=0,*conf=0; struct destbuf tmp; struct coin777 *coin = calloc(1,sizeof(*coin)); if ( coinstr == 0 || coinstr[0] == 0 ) { printf("null coinstr?\n"); //getchar(); return(0); } safecopy(coin->name,coinstr,sizeof(coin->name)); coin->jvin = -1; if ( argjson == 0 || strcmp(coinstr,"NXT") == 0 ) { coin->usep2sh = 1; coin->minconfirms = (strcmp("BTC",coinstr) == 0) ? 3 : 10; coin->estblocktime = (strcmp("BTC",coinstr) == 0) ? 600 : 120; coin->mgw.use_addmultisig = (strcmp("BTC",coinstr) != 0); } else { coin->minoutput = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"minoutput")); coin->minconfirms = get_API_int(cJSON_GetObjectItem(argjson,"minconfirms"),(strcmp("BTC",coinstr) == 0) ? 3 : 10); coin->estblocktime = get_API_int(cJSON_GetObjectItem(argjson,"estblocktime"),(strcmp("BTC",coinstr) == 0) ? 600 : 120); coin->jsonstr = cJSON_Print(argjson); coin->argjson = cJSON_Duplicate(argjson,1); if ( (serverport= cJSON_str(cJSON_GetObjectItem(argjson,"rpc"))) != 0 ) safecopy(coin->serverport,serverport,sizeof(coin->serverport)); path = cJSON_str(cJSON_GetObjectItem(argjson,"path")); conf = cJSON_str(cJSON_GetObjectItem(argjson,"conf")); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"assetid")), safecopy(coin->mgw.assetidstr,tmp.buf,sizeof(coin->mgw.assetidstr)); if ( (coin->mgw.assetidbits= calc_nxt64bits(coin->mgw.assetidstr)) == 0 ) coin->mgw.assetidbits = is_MGWcoin(coinstr); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"issuer")), safecopy(coin->mgw.issuer,tmp.buf,sizeof(coin->mgw.issuer));; coin->mgw.issuerbits = conv_acctstr(coin->mgw.issuer); printf(">>>>>>>>>>>> a issuer.%s %llu assetid.%llu minoutput.%llu\n",coin->mgw.issuer,(long long)coin->mgw.issuerbits,(long long)coin->mgw.assetidbits,(long long)coin->minoutput); //uint32_t set_assetname(uint64_t *multp,char *name,uint64_t assetbits); if ( coin->mgw.assetidbits != 0 ) _set_assetname(&coin->mgw.ap_mult,coin->mgw.assetname,0,coin->mgw.assetidbits); printf("assetname.(%s) mult.%llu\n",coin->mgw.assetname,coin->mgw.ap_mult); strcpy(coin->mgw.coinstr,coinstr); if ( (coin->mgw.special= cJSON_GetObjectItem(argjson,"special")) == 0 ) coin->mgw.special = cJSON_GetObjectItem(COINS.argjson,"special"); if ( coin->mgw.special != 0 ) { coin->mgw.special = NXT_convjson(coin->mgw.special); printf("CONVERTED.(%s)\n",cJSON_Print(coin->mgw.special)); } coin->mgw.limbo = cJSON_GetObjectItem(argjson,"limbo"); coin->mgw.dust = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"dust")); coin->mgw.txfee = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"txfee_satoshis")); if ( coin->mgw.txfee == 0 ) coin->mgw.txfee = (uint64_t)(SATOSHIDEN * get_API_float(cJSON_GetObjectItem(argjson,"txfee"))); coin->mgw.NXTfee_equiv = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"NXTfee_equiv_satoshis")); if ( coin->mgw.NXTfee_equiv == 0 ) coin->mgw.NXTfee_equiv = (uint64_t)(SATOSHIDEN * get_API_float(cJSON_GetObjectItem(argjson,"NXTfee_equiv"))); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"opreturnmarker")), safecopy(coin->mgw.opreturnmarker,tmp.buf,sizeof(coin->mgw.opreturnmarker)); printf("OPRETURN.(%s)\n",coin->mgw.opreturnmarker); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"marker2")), safecopy(coin->mgw.marker2,tmp.buf,sizeof(coin->mgw.marker2)); coin->mgw.redeemheight = get_API_int(cJSON_GetObjectItem(argjson,"redeemheight"),430000); coin->mgw.use_addmultisig = get_API_int(cJSON_GetObjectItem(argjson,"useaddmultisig"),(strcmp("BTC",coinstr) != 0)); coin->mgw.do_opreturn = get_API_int(cJSON_GetObjectItem(argjson,"do_opreturn"),(strcmp("BTC",coinstr) == 0)); coin->mgw.oldtx_format = get_API_int(cJSON_GetObjectItem(argjson,"oldtx_format"),(strcmp("BTC",coinstr) == 0)); coin->mgw.firstunspentind = get_API_int(cJSON_GetObjectItem(argjson,"firstunspent"),(strcmp("BTCD",coinstr) == 0) ? 2500000 : 0); if ( (coin->mgw.NXTconvrate = get_API_float(cJSON_GetObjectItem(argjson,"NXTconvrate"))) == 0 ) { if ( coin->mgw.NXTfee_equiv != 0 && coin->mgw.txfee != 0 ) coin->mgw.NXTconvrate = ((double)coin->mgw.NXTfee_equiv / coin->mgw.txfee); } copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"marker")), safecopy(coin->mgw.marker,tmp.buf,sizeof(coin->mgw.marker)); printf("OPRETURN.(%s)\n",coin->mgw.opreturnmarker); coin->addrtype = get_API_int(jobj(argjson,"addrtype"),0); coin->p2shtype = get_API_int(jobj(argjson,"p2shtype"),0); coin->usep2sh = get_API_int(jobj(argjson,"usep2sh"),1); } if ( coin->mgw.txfee == 0 ) coin->mgw.txfee = 10000; if ( strcmp(coin->name,"BTC") == 0 ) { coin->addrtype = 0, coin->p2shtype = 5; if ( coin->donationaddress[0] == 0 ) { strcpy(coin->donationaddress,"177MRHRjAxCZc7Sr5NViqHRivDu1sNwkHZ"); sprintf(coin->donationscript,"76a91443044b8d5dc8f3758dbc83374c596e96d25ead4f88ac"); } } else if ( strcmp(coin->name,"LTC") == 0 ) coin->addrtype = 48, coin->p2shtype = 5, coin->minconfirms = 1, coin->mgw.txfee = 100000, coin->usep2sh = 0; else if ( strcmp(coin->name,"BTCD") == 0 ) coin->addrtype = 60, coin->p2shtype = 85, coin->mgw.txfee = 1000000;//, strcpy(coin->donationaddress,"RDRWMSrDdoUcfZRBWUz7KZQSxPS9bZRerM"); else if ( strcmp(coin->name,"DOGE") == 0 ) coin->addrtype = 30, coin->p2shtype = 35; else if ( strcmp(coin->name,"VRC") == 0 ) coin->addrtype = 70, coin->p2shtype = 85; else if ( strcmp(coin->name,"OPAL") == 0 ) coin->addrtype = 115, coin->p2shtype = 28; else if ( strcmp(coin->name,"BITS") == 0 ) coin->addrtype = 25, coin->p2shtype = 8; printf("coin777_create %s: (%s) %llu mult.%llu NXTconvrate %.8f minconfirms.%d issuer.(%s) %llu opreturn.%d oldformat.%d\n",coin->mgw.coinstr,coin->mgw.assetidstr,(long long)coin->mgw.assetidbits,(long long)coin->mgw.ap_mult,coin->mgw.NXTconvrate,coin->minconfirms,coin->mgw.issuer,(long long)coin->mgw.issuerbits,coin->mgw.do_opreturn,coin->mgw.oldtx_format); if ( strcmp(coin->name,"NXT") != 0 ) { extract_userpass(coin->serverport,coin->userpass,coinstr,SUPERNET.userhome,path,conf); set_atomickeys(coin); printf("COIN.%s serverport.(%s) userpass.(%s) %s/%s %s/%s\n",coin->name,coin->serverport,coin->userpass,coin->atomicrecv,coin->atomicrecvpubkey,coin->atomicsend,coin->atomicsendpubkey); } COINS.LIST = realloc(COINS.LIST,(COINS.num+1) * sizeof(*coin)); COINS.LIST[COINS.num] = coin, COINS.num++; //ensure_packedptrs(coin); return(coin); }
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 *coinstr,*resultstr,*methodstr; struct coin777 *coin = 0; uint32_t startblocknum,endblocknum; retbuf[0] = 0; // Debuglevel = 3; printf("<<<<<<<<<<<< INSIDE PLUGIN! process %s\n",plugin->name); if ( initflag > 0 ) { strcpy(retbuf,"{\"result\":\"initflag > 0\"}"); plugin->allowremote = 1; RAMCHAINS.fastmode = get_API_int(cJSON_GetObjectItem(json,"fastmode"),0); RAMCHAINS.verifyspends = get_API_int(cJSON_GetObjectItem(json,"verifyspends"),1); //RAMCHAINS.fileincr = get_API_int(cJSON_GetObjectItem(json,"fileincr"),100L * 1000 * 1); RAMCHAINS.readyflag = 1; } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); coinstr = cJSON_str(cJSON_GetObjectItem(json,"coin")); startblocknum = get_API_int(cJSON_GetObjectItem(json,"start"),0); endblocknum = get_API_int(cJSON_GetObjectItem(json,"end"),0); if ( coinstr != 0 ) coin = coin777_find(coinstr,1); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } printf("RAMCHAIN.(%s) for (%s) %p\n",methodstr,coinstr!=0?coinstr:"",coin); if ( coin != 0 && coinstr == 0 ) coinstr = coin->name; if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } else if ( coin != 0 ) { if ( strcmp(methodstr,"backup") == 0 ) { if ( coin->ramchain.DBs.ctl == 0 ) ramchain_init(retbuf,maxlen,coin,&coin->ramchain,json,coinstr,coin->serverport,coin->userpass,startblocknum,endblocknum,coin->minconfirms); if ( coin->ramchain.DBs.ctl != 0 ) { coin777_incrbackup(coin,0,0,0); strcpy(retbuf,"{\"result\":\"started backup\"}"); } else strcpy(retbuf,"{\"error\":\"cant create ramchain when coin not ready\"}"); } else if ( strcmp(methodstr,"resume") == 0 ) ramchain_init(retbuf,maxlen,coin,&coin->ramchain,json,coinstr,coin->serverport,coin->userpass,startblocknum,endblocknum,coin->minconfirms); else if ( strcmp(methodstr,"create") == 0 ) ramchain_init(retbuf,maxlen,coin,&coin->ramchain,json,coinstr,coin->serverport,coin->userpass,startblocknum,endblocknum,coin->minconfirms); else ramchain_func(retbuf,maxlen,coin,&coin->ramchain,json,methodstr); //else sprintf(retbuf,"{\"result\":\"no active ramchain\"}"); //printf("RAMCHAIN RETURNS.(%s)\n",retbuf); } } return((int32_t)strlen(retbuf) + retbuf[0] != 0); }
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,zerobuf[1],*coinstr,*str = 0; cJSON *array,*item; int32_t i,n,j = 0; struct coin777 *coin; struct destbuf tmp; retbuf[0] = 0; if ( initflag > 0 ) { if ( json != 0 ) { COINS.argjson = cJSON_Duplicate(json,1); COINS.slicei = get_API_int(cJSON_GetObjectItem(json,"slice"),0); if ( (array= cJSON_GetObjectItem(json,"coins")) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { for (i=j=0; i<n; i++) { item = cJSON_GetArrayItem(array,i); coinstr = cJSON_str(cJSON_GetObjectItem(item,"name")); if ( coinstr != 0 && coinstr[0] != 0 && (coin= coin777_find(coinstr,0)) == 0 ) { printf("CALL coin777_create.(%s) (%s)\n",coinstr,cJSON_Print(item)); coin777_create(coinstr,item); } } } } else strcpy(retbuf,"{\"result\":\"no JSON for init\"}"); COINS.readyflag = 1; plugin->allowremote = 1; //plugin->sleepmillis = 1; } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); coinstr = cJSON_str(cJSON_GetObjectItem(json,"coin")); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } //printf("COINS.(%s) for (%s) (%s)\n",methodstr,coinstr!=0?coinstr:"",jsonstr); if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } else { zerobuf[0] = 0; str = 0; //printf("INSIDE COINS.(%s) methods.%ld\n",jsonstr,sizeof(coins_methods)/sizeof(*coins_methods)); copy_cJSON(&tmp,cJSON_GetObjectItem(json,"NXT")), safecopy(sender,tmp.buf,32); if ( coinstr == 0 ) coinstr = zerobuf; else coin = coin777_find(coinstr,1); #ifdef INSIDE_MGW if ( strcmp(methodstr,"acctpubkeys") == 0 ) { if ( SUPERNET.gatewayid >= 0 ) { if ( coinstr[0] == 0 ) strcpy(retbuf,"{\"result\":\"need to specify coin\"}"); else if ( (coin= coin777_find(coinstr,1)) != 0 ) { int32_t MGW_publish_acctpubkeys(char *coinstr,char *str); char *get_msig_pubkeys(char *coinstr,char *serverport,char *userpass); if ( (str= get_msig_pubkeys(coin->name,coin->serverport,coin->userpass)) != 0 ) { MGW_publish_acctpubkeys(coin->name,str); strcpy(retbuf,"{\"result\":\"published and processed acctpubkeys\"}"); free(str), str= 0; } else sprintf(retbuf,"{\"error\":\"no get_msig_pubkeys result\",\"method\":\"%s\"}",methodstr); } else sprintf(retbuf,"{\"error\":\"no coin777\",\"method\":\"%s\"}",methodstr); } else sprintf(retbuf,"{\"error\":\"gateway only method\",\"method\":\"%s\"}",methodstr); } else if ( strcmp(methodstr,"gotmsigaddr") == 0 ) { if ( SUPERNET.gatewayid < 0 ) printf("GOTMSIG.(%s)\n",jsonstr); } else #endif sprintf(retbuf,"{\"error\":\"unsupported method\",\"method\":\"%s\"}",methodstr); } } //printf("<<<<<<<<<<<< INSIDE PLUGIN.(%s) initflag.%d process %s slice.%d\n",SUPERNET.myNXTaddr,initflag,plugin->name,COINS.slicei); return(plugin_copyretstr(retbuf,maxlen,str)); }
struct coin777 *coin777_create(char *coinstr,cJSON *argjson) { char *serverport,*path=0,*conf=0; struct destbuf tmp; struct coin777 *coin = calloc(1,sizeof(*coin)); safecopy(coin->name,coinstr,sizeof(coin->name)); if ( argjson == 0 ) { coin->minconfirms = (strcmp("BTC",coinstr) == 0) ? 3 : 10; coin->estblocktime = (strcmp("BTC",coinstr) == 0) ? 600 : 120; } else { coin->minoutput = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"minoutput")); coin->minconfirms = get_API_int(cJSON_GetObjectItem(argjson,"minconfirms"),(strcmp("BTC",coinstr) == 0) ? 3 : 10); coin->estblocktime = get_API_int(cJSON_GetObjectItem(argjson,"estblocktime"),(strcmp("BTC",coinstr) == 0) ? 600 : 120); coin->jsonstr = cJSON_Print(argjson); coin->argjson = cJSON_Duplicate(argjson,1); if ( (serverport= cJSON_str(cJSON_GetObjectItem(argjson,"rpc"))) != 0 ) safecopy(coin->serverport,serverport,sizeof(coin->serverport)); path = cJSON_str(cJSON_GetObjectItem(argjson,"path")); conf = cJSON_str(cJSON_GetObjectItem(argjson,"conf")); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"assetid")), safecopy(coin->mgw.assetidstr,tmp.buf,sizeof(coin->mgw.assetidstr)); coin->mgw.assetidbits = calc_nxt64bits(coin->mgw.assetidstr); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"issuer")), safecopy(coin->mgw.issuer,tmp.buf,sizeof(coin->mgw.issuer));; coin->mgw.issuerbits = conv_acctstr(coin->mgw.issuer); printf(">>>>>>>>>>>> a issuer.%s %llu assetid.%llu minoutput.%llu\n",coin->mgw.issuer,(long long)coin->mgw.issuerbits,(long long)coin->mgw.assetidbits,(long long)coin->minoutput); //uint32_t set_assetname(uint64_t *multp,char *name,uint64_t assetbits); _set_assetname(&coin->mgw.ap_mult,coin->mgw.assetname,0,coin->mgw.assetidbits); printf("assetname.(%s) mult.%llu\n",coin->mgw.assetname,coin->mgw.ap_mult); strcpy(coin->mgw.coinstr,coinstr); if ( (coin->mgw.special= cJSON_GetObjectItem(argjson,"special")) == 0 ) coin->mgw.special = cJSON_GetObjectItem(COINS.argjson,"special"); if ( coin->mgw.special != 0 ) coin->mgw.special = NXT_convjson(coin->mgw.special); printf("CONVERTED.(%s)\n",cJSON_Print(coin->mgw.special)); coin->mgw.limbo = cJSON_GetObjectItem(argjson,"limbo"); coin->mgw.dust = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"dust")); coin->mgw.txfee = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"txfee_satoshis")); if ( coin->mgw.txfee == 0 ) coin->mgw.txfee = (uint64_t)(SATOSHIDEN * get_API_float(cJSON_GetObjectItem(argjson,"txfee"))); if ( coin->mgw.txfee == 0 ) coin->mgw.txfee = 10000; coin->mgw.NXTfee_equiv = get_API_nxt64bits(cJSON_GetObjectItem(argjson,"NXTfee_equiv_satoshis")); if ( coin->mgw.NXTfee_equiv == 0 ) coin->mgw.NXTfee_equiv = (uint64_t)(SATOSHIDEN * get_API_float(cJSON_GetObjectItem(argjson,"NXTfee_equiv"))); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"opreturnmarker")), safecopy(coin->mgw.opreturnmarker,tmp.buf,sizeof(coin->mgw.opreturnmarker)); printf("OPRETURN.(%s)\n",coin->mgw.opreturnmarker); copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"marker2")), safecopy(coin->mgw.marker2,tmp.buf,sizeof(coin->mgw.marker2)); coin->mgw.redeemheight = get_API_int(cJSON_GetObjectItem(argjson,"redeemheight"),430000); coin->mgw.use_addmultisig = get_API_int(cJSON_GetObjectItem(argjson,"useaddmultisig"),(strcmp("BTC",coinstr) != 0)); coin->mgw.do_opreturn = get_API_int(cJSON_GetObjectItem(argjson,"do_opreturn"),(strcmp("BTC",coinstr) == 0)); coin->mgw.oldtx_format = get_API_int(cJSON_GetObjectItem(argjson,"oldtx_format"),(strcmp("BTC",coinstr) == 0)); coin->mgw.firstunspentind = get_API_int(cJSON_GetObjectItem(argjson,"firstunspent"),(strcmp("BTCD",coinstr) == 0) ? 2500000 : 0); if ( (coin->mgw.NXTconvrate = get_API_float(cJSON_GetObjectItem(argjson,"NXTconvrate"))) == 0 ) { if ( coin->mgw.NXTfee_equiv != 0 && coin->mgw.txfee != 0 ) coin->mgw.NXTconvrate = ((double)coin->mgw.NXTfee_equiv / coin->mgw.txfee); } copy_cJSON(&tmp,cJSON_GetObjectItem(argjson,"marker")), safecopy(coin->mgw.marker,tmp.buf,sizeof(coin->mgw.marker)); printf("OPRETURN.(%s)\n",coin->mgw.opreturnmarker); } printf("coin777_create %s: (%s) %llu mult.%llu NXTconvrate %.8f minconfirms.%d issuer.(%s) %llu opreturn.%d oldformat.%d\n",coin->mgw.coinstr,coin->mgw.assetidstr,(long long)coin->mgw.assetidbits,(long long)coin->mgw.ap_mult,coin->mgw.NXTconvrate,coin->minconfirms,coin->mgw.issuer,(long long)coin->mgw.issuerbits,coin->mgw.do_opreturn,coin->mgw.oldtx_format); extract_userpass(coin->serverport,coin->userpass,coinstr,SUPERNET.userhome,path,conf); printf("COIN.%s serverport.(%s) userpass.(%s)\n",coin->name,coin->serverport,coin->userpass); COINS.LIST = realloc(COINS.LIST,(COINS.num+1) * sizeof(*coin)); COINS.LIST[COINS.num] = coin, COINS.num++; //ensure_packedptrs(coin); return(coin); }
int32_t jinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_int(cJSON_GetArrayItem(json,i),0)); }
int32_t jint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_int(json,0)); return(get_API_int(cJSON_GetObjectItem(json,field),0)); }