int32_t plugin_result(char *retbuf,cJSON *json,uint64_t tag) { char *error,*result; error = cJSON_str(cJSON_GetObjectItem(json,"error")); result = cJSON_str(cJSON_GetObjectItem(json,"result")); if ( error != 0 || result != 0 ) { sprintf(retbuf,"{\"result\":\"completed\",\"tag\":\"%llu\"}",(long long)tag); return(1); } return(0); }
struct coin777 *coin777_find(char *coinstr,int32_t autocreate) { int32_t i,j,n; cJSON *item,*array; char *str; if ( COINS.num > 0 ) { for (i=0; i<COINS.num; i++) { if ( strcmp(coinstr,COINS.LIST[i]->name) == 0 ) return(COINS.LIST[i]); } } if ( autocreate != 0 ) { if ( COINS.argjson != 0 && (array= cJSON_GetObjectItem(COINS.argjson,"coins")) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) { for (i=j=0; i<n; i++) { item = cJSON_GetArrayItem(array,i); str = cJSON_str(cJSON_GetObjectItem(item,"name")); if ( str != 0 && strcmp(str,coinstr) == 0 ) { printf("CALL coin777_create.(%s) (%s)\n",coinstr,cJSON_Print(item)); return(coin777_create(coinstr,item)); } } } return(coin777_create(coinstr,COINS.argjson)); } return(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 *SuperNET_install(char *plugin,char *jsonstr,cJSON *json); char *retstr,*resultstr,*methodstr,*destplugin; int32_t len; retbuf[0] = 0; //printf("<<<<<<<<<<<< INSIDE PLUGIN.(%s)! (%s) initflag.%d process %s\n",plugin->name,jsonstr,initflag,plugin->name); if ( initflag > 0 ) { SUPERNET.ppid = OS_getppid(); SUPERNET.argjson = cJSON_Duplicate(json,1); SUPERNET.readyflag = 1; if ( SUPERNET.UPNP != 0 ) { char portstr[64]; sprintf(portstr,"%d",SUPERNET.serviceport), upnpredirect(portstr,portstr,"TCP","SuperNET"); sprintf(portstr,"%d",SUPERNET.port + LB_OFFSET), upnpredirect(portstr,portstr,"TCP","SuperNET"); sprintf(portstr,"%d",SUPERNET.port + PUBGLOBALS_OFFSET), upnpredirect(portstr,portstr,"TCP","SuperNET"); sprintf(portstr,"%d",SUPERNET.port + PUBRELAYS_OFFSET), upnpredirect(portstr,portstr,"TCP","SuperNET"); } } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); if ( (destplugin= cJSON_str(cJSON_GetObjectItem(json,"name"))) == 0 ) destplugin = cJSON_str(cJSON_GetObjectItem(json,"path")); printf("SUPERNET\n"); if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; retstr = "return registered"; } else if ( methodstr != 0 && strcmp(methodstr,"install") == 0 && destplugin != 0 && destplugin[0] != 0 ) retstr = SuperNET_install(destplugin,jsonstr,json); else retstr = "return JSON result"; strcpy(retbuf,retstr); len = (int32_t)strlen(retbuf); while ( --len > 0 ) if ( retbuf[len] == '}' ) break; sprintf(retbuf + len,",\"debug\":%d,\"USESSL\":%d,\"MAINNET\":%d,\"DATADIR\":\"%s\",\"NXTAPI\":\"%s\",\"WEBSOCKETD\":\"%s\",\"SUPERNET_PORT\":%d,\"APISLEEP\":%d,\"domain\":\"%s\"}",Debuglevel,SUPERNET.usessl,SUPERNET.ismainnet,SUPERNET.DATADIR,SUPERNET.NXTAPIURL,SUPERNET.WEBSOCKETD,SUPERNET.port,SUPERNET.APISLEEP,SUPERNET.hostname); } return((int32_t)strlen(retbuf)); }
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); }
uint32_t *conv_addrjson(int32_t *nump,struct coin777 *coin,cJSON *addrjson) { uint32_t firstblocknum,*addrinds = 0; int32_t i; if ( is_cJSON_String(addrjson) != 0 ) { *nump = 1; addrinds = malloc(sizeof(*addrinds)); addrinds[0] = coin777_addrind(&firstblocknum,coin,cJSON_str(addrjson)); } else if ( is_cJSON_Array(addrjson) != 0 && (*nump= cJSON_GetArraySize(addrjson)) > 0 ) { addrinds = calloc(*nump,sizeof(*addrinds)); for (i=0; i<*nump; i++) addrinds[i] = coin777_addrind(&firstblocknum,coin,cJSON_str(cJSON_GetArrayItem(addrjson,i))); } return(addrinds); }
int32_t shuffle_encrypt(uint64_t nxt64bits,uint8_t *dest,uint8_t *src,int32_t len) { cJSON *item; char *str; int32_t n = 0; if ( (item= privatemessage_encrypt(nxt64bits,src,len)) != 0 ) { if ( (str= cJSON_str(item)) != 0 ) { n = (int32_t)strlen(str) >> 1; decode_hex(dest,n,str); } free_json(item); }
int32_t ramchain_rawind(char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson,char *field,char *indname,uint32_t (*coin_indfuncp)(uint32_t *firstblocknump,struct coin777 *coin,char *txidstr)) { char *str; uint32_t rawind,firstblocknum; if ( (str= cJSON_str(cJSON_GetObjectItem(argjson,field))) != 0 ) { if ( (rawind= (*coin_indfuncp)(&firstblocknum,coin,str)) != 0 ) { sprintf(retbuf,"{\"result\":\"success\",\"coin\":\"%s\",\"%s\":\"%s\",\"%s\":\"%u\",\"firstblocknum\":\"%u\"}",coin->name,field,str,indname,rawind,firstblocknum); } else sprintf(retbuf,"{\"error\":\"cant find %s\",\"coin\":\"%s\"}",field,coin->name); } if ( retbuf[0] == 0 ) sprintf(retbuf,"{\"error\":\"no %s\",\"coin\":\"%s\"}",field,coin->name); return(-1); }
int32_t PLUGNAME(_process_json)(struct plugin_info *plugin,uint64_t tag,char *retbuf,int32_t maxlen,char *jsonstr,cJSON *json,int32_t initflag) { char echostr[MAX_JSON_FIELD],*resultstr,*methodstr; retbuf[0] = 0; //printf("<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s)\n",plugin->name,jsonstr); if ( initflag > 0 ) { // configure settings plugin->allowremote = 1; strcpy(retbuf,"{\"result\":\"echodemo init\"}"); } 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")); copy_cJSON(echostr,cJSON_GetObjectItem(json,"echostr")); retbuf[0] = 0; if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } else if ( strcmp(methodstr,"echo") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\"}",echostr); } } return((int32_t)strlen(retbuf)); }
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,*retstr = 0; retbuf[0] = 0; if ( Debuglevel > 2 ) fprintf(stderr,"<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s)\n",plugin->name,jsonstr); if ( initflag > 0 ) { // configure settings plugin->allowremote = 1; portable_mutex_init(&plugin->mutex); init_InstantDEX(calc_nxt64bits(SUPERNET.NXTADDR),0); update_NXT_assettrades(); INSTANTDEX.readyflag = 1; strcpy(retbuf,"{\"result\":\"InstantDEX init\"}"); } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); if ( (methodstr= cJSON_str(cJSON_GetObjectItem(json,"method"))) == 0 ) methodstr = cJSON_str(cJSON_GetObjectItem(json,"requestType")); retbuf[0] = 0; if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } portable_mutex_lock(&plugin->mutex); if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } else if ( strcmp(methodstr,"msigaddr") == 0 ) { char *devMGW_command(char *jsonstr,cJSON *json); if ( SUPERNET.gatewayid >= 0 ) { if ( (retstr= devMGW_command(jsonstr,json)) != 0 ) { //should_forward(sender,retstr); } } //else retstr = nn_loadbalanced((uint8_t *)jsonstr,(int32_t)strlen(jsonstr)+1); } else if ( strcmp(methodstr,"LSUM") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\",\"amount\":%d}",(rand() & 1) ? "BUY" : "SELL",(rand() % 100) * 100000); retstr = clonestr(retbuf); } else if ( SUPERNET.iamrelay == 0 ) { retstr = InstantDEX_parser(forwarder,sender,valid,jsonstr,json); //printf("InstantDEX_parser return.(%s)\n",retstr); } else retstr = clonestr("{\"result\":\"relays only relay\"}"); if ( retstr != 0 ) { if ( strlen(retstr) >= maxlen-1 ) retstr[maxlen-1] = 0; strcpy(retbuf,retstr); free(retstr); } //else sprintf(retbuf,"{\"error\":\"method %s not found\"}",methodstr); portable_mutex_unlock(&plugin->mutex); } 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)); }
int32_t PLUGNAME(_process_json)(char *forwarder,char *sender,int32_t valid,struct plugin_info *plugin,uint64_t tag,char *retbuf,int32_t maxlen,char *jsonstr,cJSON *json,int32_t initflag,char *tokenstr) { char *resultstr,*methodstr,*addr,*retstr = 0; struct destbuf echostr; retbuf[0] = 0; plugin->allowremote = 1; //fprintf(stderr,"<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s)\n",plugin->name,jsonstr); if ( initflag > 0 ) { // configure settings strcpy(retbuf,"{\"result\":\"echodemo init\"}"); } else { resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); methodstr = cJSON_str(cJSON_GetObjectItem(json,"method")); copy_cJSON(&echostr,cJSON_GetObjectItem(json,"echostr")); retbuf[0] = 0; if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); return((int32_t)strlen(retbuf)); } if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } else if ( strcmp(methodstr,"echo") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\"}",echostr.buf); } else if ( strcmp(methodstr,"passthru") == 0 ) { if ( jstr(json,"destplugin") != 0 ) { cJSON_DeleteItemFromObject(json,"plugin"); jaddstr(json,"plugin",jstr(json,"destplugin")); cJSON_DeleteItemFromObject(json,"destplugin"); } if ( jstr(json,"destmethod") != 0 ) { cJSON_DeleteItemFromObject(json,"method"); jaddstr(json,"method",jstr(json,"destmethod")); cJSON_DeleteItemFromObject(json,"destmethod"); } jaddstr(json,"pluginrequest","SuperNET"); retstr = jprint(json,0); //printf("passhru.(%s)\n",retstr); } else if ( strcmp(methodstr,"RS") == 0 ) { int32_t is_decimalstr(char *str); uint64_t RS_decode(char *rs); int32_t RS_encode(char *,uint64_t id); char rsaddr[64]; uint64_t nxt64bits = 0; if ( (addr= cJSON_str(cJSON_GetObjectItem(json,"addr"))) != 0 ) { rsaddr[0] = 0; if ( strlen(addr) > 4 ) { if ( strncmp(addr,"NXT-",4) == 0 ) { nxt64bits = RS_decode(addr); sprintf(retbuf,"{\"result\":\"success\",\"accountRS\":\"%s\",\"account\":\"%llu\"}",addr,(long long)nxt64bits); } else if ( is_decimalstr(addr) != 0 ) { nxt64bits = calc_nxt64bits(addr), RS_encode(rsaddr,nxt64bits); sprintf(retbuf,"{\"result\":\"success\",\"account\":\"%llu\",\"accountRS\":\"%s\"}",(long long)nxt64bits,rsaddr); } } else sprintf(retbuf,"{\"error\":\"illegal addr field\",\"addr\":\"%s\"}",addr); } else sprintf(retbuf,"{\"error\":\"no addr field\"}"); } } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
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); }
char *jstri(cJSON *json,int32_t i) { return(cJSON_str(cJSON_GetArrayItem(json,i))); }
char *jstr(cJSON *json,char *field) { if ( field == 0 ) return(cJSON_str(json)); return(cJSON_str(cJSON_GetObjectItem(json,field))); }
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,*retstr = 0; retbuf[0] = 0; if ( Debuglevel > 2 ) fprintf(stderr,"<<<<<<<<<<<< INSIDE PLUGIN! process %s (%s) initflag.%d\n",plugin->name,jsonstr,initflag); if ( initflag > 0 ) { // configure settings plugin->allowremote = 1; portable_mutex_init(&plugin->mutex); init_InstantDEX(calc_nxt64bits(SUPERNET.NXTADDR),0,json); INSTANTDEX.history = txinds777_init(SUPERNET.DBPATH,"InstantDEX"); INSTANTDEX.numhist = (int32_t)INSTANTDEX.history->curitem; InstantDEX_inithistory(0,INSTANTDEX.numhist); //update_NXT_assettrades(); INSTANTDEX.readyflag = 1; strcpy(retbuf,"{\"result\":\"InstantDEX init\"}"); } else { if ( plugin_result(retbuf,json,tag) > 0 ) return((int32_t)strlen(retbuf)); resultstr = cJSON_str(cJSON_GetObjectItem(json,"result")); if ( (methodstr= cJSON_str(cJSON_GetObjectItem(json,"method"))) == 0 ) methodstr = cJSON_str(cJSON_GetObjectItem(json,"requestType")); retbuf[0] = 0; if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } #ifdef INSIDE_MGW else if ( strcmp(methodstr,"msigaddr") == 0 ) { char *devMGW_command(char *jsonstr,cJSON *json); if ( SUPERNET.gatewayid >= 0 ) { if ( (retstr= devMGW_command(jsonstr,json)) != 0 ) { //should_forward(sender,retstr); } } //else retstr = nn_loadbalanced((uint8_t *)jsonstr,(int32_t)strlen(jsonstr)+1); } #endif else if ( strcmp(methodstr,"LSUM") == 0 ) { sprintf(retbuf,"{\"result\":\"%s\",\"amount\":%d}",(rand() & 1) ? "BUY" : "SELL",(rand() % 100) * 100000); retstr = clonestr(retbuf); } else if ( SUPERNET.iamrelay <= 1 ) { if ( strcmp(methodstr,"bid") == 0 || strcmp(methodstr,"ask") == 0 ) retstr = bidask_func(0,1,sender,json,jsonstr); else if ( strcmp(methodstr,"swap") == 0 ) retstr = swap_func(0,1,sender,json,jsonstr); //else if ( strcmp(methodstr,"shuffle") == 0 ) // retstr = shuffle_func(0,1,sender,json,jsonstr); } else retstr = clonestr("{\"result\":\"relays only relay\"}"); } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
struct ledger_addrinfo *ramchain_addrinfo(char *field,char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson) { char *coinaddr=0; uint32_t addrind;//,firstblocknum; struct ledger_addrinfo *addrinfo; if ( (addrind= (uint32_t)cJSON_GetObjectItem(argjson,"addrind")) == 0 && (coinaddr= cJSON_str(cJSON_GetObjectItem(argjson,"addr"))) != 0 ) strcpy(field,coinaddr); else if ( addrind != 0 ) sprintf(field,"addrind.%u",addrind); else { sprintf(retbuf,"{\"error\":\"invalid addr or addrind\",\"coin\":\"%s\"}",coin->name); return(0); } printf("coin_addrinfo not coded yet\n"); getchar(); //if ( (addrinfo= ledger_addrinfo(&firstblocknum,ramchain->activeledger,coinaddr,addrind)) == 0 ) // sprintf(retbuf,"{\"error\":\"cant find %s\",\"coin\":\"%s\"}",field,ramchain->name); return(0);//addrinfo); }
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 *origjsonstr,cJSON *origjson,int32_t initflag,char *tokenstr) { char *resultstr,*retstr = 0,*methodstr,*jsonstr,*destplugin,*submethod; struct destbuf tagstr,endpoint; cJSON *retjson,*json,*tokenobj; uint32_t nonce; struct applicant_info apply; retbuf[0] = 0; if ( tokenstr == 0 ) tokenstr = ""; if ( is_cJSON_Array(origjson) != 0 && cJSON_GetArraySize(origjson) == 2 ) json = cJSON_GetArrayItem(origjson,0), jsonstr = cJSON_Print(json), _stripwhite(jsonstr,' '); else json = origjson, jsonstr = origjsonstr; if ( Debuglevel > 2 ) printf("<<<<<<<<<<<< INSIDE relays PLUGIN! process %s [(%s).(%s)]\n",plugin->name,jsonstr,tokenstr); if ( initflag > 0 ) { // configure settings RELAYS.readyflag = 1; plugin->allowremote = 1; strcpy(retbuf,"{\"result\":\"initflag > 0\"}"); } 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")); destplugin = cJSON_str(cJSON_GetObjectItem(json,"destplugin")); submethod = cJSON_str(cJSON_GetObjectItem(json,"submethod")); if ( methodstr == 0 || methodstr[0] == 0 ) { printf("(%s) has not method\n",jsonstr); return(0); } //fprintf(stderr,"RELAYS methodstr.(%s) (%s)\n",methodstr,jsonstr); if ( resultstr != 0 && strcmp(resultstr,"registered") == 0 ) { plugin->registered = 1; strcpy(retbuf,"{\"result\":\"activated\"}"); } #ifdef INSIDE_MGW else if ( strcmp(methodstr,"msigaddr") == 0 ) { char *devMGW_command(char *jsonstr,cJSON *json); if ( SUPERNET.gatewayid >= 0 ) retstr = devMGW_command(jsonstr,json); } #endif else { strcpy(retbuf,"{\"result\":\"relay command under construction\"}"); if ( strcmp(methodstr,"list") == 0 ) retstr = relays_jsonstr(jsonstr,json); else if ( strcmp(methodstr,"telepathy") == 0 ) { sprintf(retbuf,"%s",jsonstr); } else if ( strcmp(methodstr,"busdata") == 0 ) { retstr = busdata_sync(&nonce,jsonstr,cJSON_str(cJSON_GetObjectItem(json,"broadcast")),0); // {"plugin":"relay","method":"busdata","destplugin":"relay","submethod":"join","broadcast":"join","endpoint":""} } else if ( strcmp(methodstr,"allservices") == 0 ) { if ( (retjson= serviceprovider_json()) != 0 ) { retstr = cJSON_Print(retjson), _stripwhite(retstr,' '); free_json(retjson); //printf("got.(%s)\n",retstr); } else printf("null serviceprovider_json()\n"); } else if ( strcmp(methodstr,"protocol") == 0 || strcmp(methodstr,"allprotocols") == 0 ) { if ( strcmp(methodstr,"protocol") == 0 && valid > 0 ) protocols_register(sender,jstr(json,"protocol"),jstr(json,"endpoint"),jint(json,"disconnect")); if ( (retjson= protocols_json(jstr(json,"protocol"))) != 0 ) { retstr = cJSON_Print(retjson), _stripwhite(retstr,' '); free_json(retjson); } else printf("null protocols_json()\n"); } else if ( strcmp(methodstr,"join") == 0 ) { if ( SUPERNET.noncing == 0 ) { copy_cJSON(&tagstr,cJSON_GetObjectItem(json,"tag")); copy_cJSON(&endpoint,cJSON_GetObjectItem(json,"endpoint")); SUPERNET.noncing = 1; if ( SUPERNET.iamrelay != 0 ) { portable_thread_create((void *)calc_nonces,clonestr(endpoint.buf)); sprintf(retbuf,"{\"result\":\"noncing\",\"endpoint\":\"%s\"}",endpoint.buf); } //fprintf(stderr,"join or nonce.(%s)\n",retbuf); } } else if ( strcmp(methodstr,"nonce") == 0 ) { struct destbuf endpoint,sender,destpoint,relaypoint,globalpoint,noncestr; memset(&apply,0,sizeof(apply)); copy_cJSON(&destpoint,cJSON_GetObjectItem(json,"destpoint")); copy_cJSON(&endpoint,cJSON_GetObjectItem(json,"lbendpoint")); copy_cJSON(&relaypoint,cJSON_GetObjectItem(json,"relaypoint")); copy_cJSON(&globalpoint,cJSON_GetObjectItem(json,"globalpoint")); copy_cJSON(&sender,cJSON_GetObjectItem(json,"NXT")); if ( SUPERNET.noncing != 0 && strcmp(SUPERNET.lbendpoint,destpoint.buf) == 0 ) { if ( endpoint.buf[0] != 0 && tokenstr[0] != 0 && (tokenobj= cJSON_Parse(tokenstr)) != 0 ) { strcpy(apply.lbendpoint,endpoint.buf); strcpy(apply.relayendpoint,relaypoint.buf); strcpy(apply.globalendpoint,globalpoint.buf); apply.senderbits = calc_nxt64bits(sender.buf); copy_cJSON(&noncestr,cJSON_GetObjectItem(tokenobj,"nonce")); if ( noncestr.buf[0] != 0 ) apply.nonce = (uint32_t)calc_nxt64bits(noncestr.buf); //printf("tokenobj.(%s) -> nonce.%u\n",tokenstr,apply.nonce); free_json(tokenobj); recv_nonces(&apply); } } } } } return(plugin_copyretstr(retbuf,maxlen,retstr)); }
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); }