struct NXT_assettxid *add_NXT_assettxid(struct NXT_asset **app,char *assetid,struct NXThandler_info *mp,cJSON *obj,char *txid) { int32_t createdflag; struct NXT_asset *ap; struct NXT_assettxid *tp; if ( obj != 0 ) { copy_cJSON(assetid,obj); // printf("add_NXT_assettxid A\n"); *app = ap = MTadd_hashtable(&createdflag,mp->NXTassets_tablep,assetid); if ( createdflag != 0 ) ap->assetbits = calc_nxt64bits(assetid); //printf("add_NXT_assettxid B\n"); tp = MTadd_hashtable(&createdflag,mp->NXTasset_txids_tablep,txid); if ( createdflag != 0 ) { tp->assetbits = calc_nxt64bits(assetid); tp->txidbits = calc_nxt64bits(txid); if ( ap->num >= ap->max ) { ap->max = ap->num + NXT_ASSETLIST_INCR; ap->txids = realloc(ap->txids,sizeof(*ap->txids) * ap->max); } ap->txids[ap->num++] = tp; return(tp); } } else *app = 0; return(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 *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); }
int64_t _get_cJSON_int(cJSON *json) { char tmp[4096]; if ( json != 0 ) { copy_cJSON(tmp,json); if ( tmp[0] != 0 ) return(calc_nxt64bits(tmp)); } return(0); }
int64_t _get_cJSON_int(cJSON *json) { struct destbuf tmp; if ( json != 0 ) { copy_cJSON(&tmp,json); if ( tmp.buf[0] != 0 ) return(calc_nxt64bits(tmp.buf)); } return(0); }
uint64_t get_API_nxt64bits(cJSON *obj) { uint64_t nxt64bits = 0; struct destbuf tmp; if ( obj != 0 ) { if ( is_cJSON_Number(obj) != 0 ) return((uint64_t)obj->valuedouble); copy_cJSON(&tmp,obj); nxt64bits = calc_nxt64bits(tmp.buf); } return(nxt64bits); }
uint64_t LP_assetid_mult(int32_t *assetindp,char *name,uint64_t assetid) { int32_t i; uint64_t mult = 0; name[0] = 0; *assetindp = -1; for (i=0; i<sizeof(assetids)/sizeof(*assetids); i++) { if ( assetid == calc_nxt64bits(assetids[i][0]) ) { *assetindp = i; mult = atoi(assetids[i][3]); strcpy(name,assetids[i][1]); break; } } return(mult); }
int32_t jnum(cJSON *obj,char *field) { char *str; int32_t polarity = 1; if ( field != 0 ) obj = jobj(obj,field); if ( obj != 0 ) { if ( is_cJSON_Number(obj) != 0 ) return(obj->valuedouble); else if ( is_cJSON_String(obj) != 0 && (str= jstr(obj,0)) != 0 ) { if ( str[0] == '-' ) polarity = -1, str++; return(polarity * (int32_t)calc_nxt64bits(str)); } } 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 *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); }
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); }
cJSON *LP_NXT_redeems() { char url[1024],*retstr,*recv,*method,*msgstr,assetname[128]; uint64_t totals[2][sizeof(assetids)/sizeof(*assetids)],mult,txnum,assetid,qty; int32_t i,ind,numtx=0,past_marker=0; cJSON *item,*attach,*decjson,*array,*msgjson,*encjson,*retjson=0; //sleep 1; fiat/supernet sendtoaddress RNZZuQYu8xJLZHuekhd96hYfoQuiCMz99T 1001.44150000 # txnum.8537615468620726612 //sleep 1; fiat/pangea sendtoaddress RWMdRaUmMZqKkEibwEhY6XS3RLCXJDWHTi 22.10910000 # txnum.2649622877615958504 uint64_t txnum_marker = calc_nxt64bits("8537615468620726612"); // 2649622877615958504"); // set to most recent processed uint64_t txnum_marker2 = calc_nxt64bits("7256847492742571143"); // dont change, end marker char *passphrase = ""; char *account = "NXT-MRBN-8DFH-PFMK-A4DBM"; memset(totals,0,sizeof(totals)); sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getBlockchainTransactions&account=%s",account); //printf("calling (%s)\n",url); if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) { //printf("got.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (array= jarray(&numtx,retjson,"transactions")) != 0 ) { for (i=0; i<numtx; i++) { msgjson = encjson = decjson = 0; txnum = assetid = qty = 0; item = jitem(array,i); msgstr = jstr(item,"message"); txnum = j64bits(item,"transaction"); if ( txnum == txnum_marker ) past_marker = 1; //printf("%d: %s\n",i,jprint(item,0)); if ( (recv= jstr(item,"recipientRS")) != 0 && strcmp(recv,"NXT-MRBN-8DFH-PFMK-A4DBM") == 0 ) { if ( (attach= jobj(item,"attachment")) != 0 && jint(attach,"version.AssetTransfer") == 1 ) { assetid = j64bits(attach,"asset"); qty = j64bits(attach,"quantityQNT"); //printf("txnum.%llu (%s)\n",(long long)txnum,jprint(attach,0)); if ( (msgstr == 0 || msgstr[0] == 0) && jint(attach,"version.PrunablePlainMessage") == 1 ) { method = "getPrunableMessage"; if ( (msgjson= LP_NXT_message(method,txnum,"test")) != 0 ) { msgstr = jstr(msgjson,"message"); //printf("%d method.(%s) (%s)\n",i,method,msgstr); } } if ( msgstr == 0 || msgstr[0] == 0 ) msgstr = jstr(attach,"message"); if ( msgstr == 0 || msgstr[0] == 0 ) { if ( (encjson= jobj(attach,"encryptedMessage")) != 0 ) { msgstr = "encryptedMessage";//jstr(encjson,"data"); if ( (decjson= LP_NXT_decrypt(txnum,account,jstr(encjson,"data"),jstr(encjson,"nonce"),passphrase)) != 0 ) { //printf("%s\n",jprint(decjson,0)); if ( jstr(decjson,"decryptedMessage") != 0 ) msgstr = jstr(decjson,"decryptedMessage"); } } } } mult = LP_assetid_mult(&ind,assetname,assetid); if ( ind >= 0 ) totals[past_marker][ind] += qty * mult; if ( msgstr != 0 && assetname[0] != 0 && qty != 0 ) { char validaddress[64]; int32_t z,n; n = (int32_t)strlen(msgstr); for (z=0; z<n; z++) { if ( msgstr[z] == 'R' ) break; } memset(validaddress,0,sizeof(validaddress)); if ( n-z >= 34 ) strncpy(validaddress,&msgstr[z],34); if ( txnum == calc_nxt64bits("4545341872872347590") ) strcpy(validaddress,"RKuwq4oi4mqQ2V4r54mPEthn3TBrEwu2Ni"); if ( past_marker == 0 ) { if ( strlen(validaddress) == 34 || strlen(validaddress) == 33 ) { //printf("%-4d: (%34s) <- %13.5f %10s tx.%llu past_marker.%d\n",i,validaddress,dstr(qty * mult),assetname,(long long)txnum,past_marker); LP_sendtoaddress_line(validaddress,assetname,(qty * mult),txnum); } else printf("%-4d: (%34s) <- %13.5f %10s tx.%llu\n",i,msgstr!=0?msgstr:jprint(item,0),dstr(qty * mult),assetname,(long long)txnum); } } if ( msgjson != 0 ) free_json(msgjson); if ( decjson != 0 ) free_json(decjson); } if ( txnum == txnum_marker2 ) break; } } //free_json(retjson); } free(retstr); } else printf("null return from NXT api call\n"); printf("\nTotal redeemed.%d\n",numtx); for (past_marker=0; past_marker<2; past_marker++) { for (i=0; i<sizeof(totals[0])/sizeof(*totals[0]); i++) { if ( totals[past_marker][i] != 0 ) printf("%-10s %13.5f past_marker.%d\n",assetids[i][1],dstr(totals[past_marker][i]),past_marker); } printf("\n>>>>>>>>>> already processed:\n"); } return(retjson); }
void NXTventure_liquidation() { /*{"quantityQNT":"607438148","unconfirmedQuantityQNT":"607438148","decimals":4,"name":"ARDR","asset":""}, {"quantityQNT":"451991779","unconfirmedQuantityQNT":"451991779","decimals":4,"name":"SuperNET","asset":"12071612744977229797"}, {"quantityQNT":"146960000","unconfirmedQuantityQNT":"146960000","decimals":4,"name":"Privatebet","asset":"17083334802666450484"}, {"quantityQNT":"79500188","unconfirmedQuantityQNT":"79500188","decimals":3,"name":"crypto777","asset":"13476425053110940554"}, {"quantityQNT":"1495473","unconfirmedQuantityQNT":"1495473","decimals":0,"name":"jl777hodl","asset":"6932037131189568014"}, {"quantityQNT":"7250","unconfirmedQuantityQNT":"7250","decimals":0,"name":"InstantDEX","asset":"15344649963748848799"},*/ char *assetids[][4] = { { "12422608354438203866", "607438148", "ARDR", "10000" }, { "12071612744977229797", "451991779", "SuperNET", "10000" }, { "17083334802666450484", "146960000", "Privatebet", "10000" }, { "13476425053110940554", "79500188", "crypto777", "1000" }, { "6932037131189568014", "1495473", "jl777hodl", "1" }, { "15344649963748848799", "7250", "InstantDEX", "1" }, }; void *cHandle=0; char *retstr,*retstr2,url[1024],*account; uint64_t txid,qty,qtyA,assetid,sum; double ratio; cJSON *array,*retjson2,*item,*retjson; int32_t i,j,decimals,numassetids=(int32_t)(sizeof(assetids)/sizeof(*assetids)),n=0; char *passphrase = ""; sprintf(url,"http://127.0.0.1:7876/nxt?requestType=getAssetAccounts&asset=16212446818542881180"); if ( (retstr= issue_curlt(url,LP_HTTP_TIMEOUT)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (array= jarray(&n,retjson,"accountAssets")) != 0 ) { for (j=0; j<numassetids; j++) { assetid = calc_nxt64bits(assetids[j][0]); qtyA = calc_nxt64bits(assetids[j][1]); decimals = (int32_t)calc_nxt64bits(assetids[j][3]); printf("distribute %llu QNT of %s assetid %llu %.8f\n",(long long)qtyA,assetids[j][2],(long long)assetid,(double)qtyA / decimals); sum = 0; for (i=0; i<n; i++) { item = jitem(array,i); qty = j64bits(item,"quantityQNT"); ratio = (double)qty / (1000000. - 13000.); if ( (account= jstr(item,"accountRS")) != 0 && qtyA*ratio >= 1 ) { if ( strcmp(account,"NXT-XRK4-5HYK-5965-9FH4Z") != 0 ) { sum += (long long)(qtyA * ratio); sprintf(url,"requestType=transferAsset&secretPhrase=%s&recipient=%s&asset=%llu&quantityQNT=%llu&feeNQT=100000000&deadline=60",passphrase,account,(long long)assetid,(long long)(qtyA * ratio)); if ( (retstr2= curl_post(&cHandle,"http://127.0.0.1:7876/nxt","",url,"","","","")) != 0 ) { if ( (retjson2= cJSON_Parse(retstr2)) != 0 ) { txid = j64bits(retjson2,"transaction"); printf("%s %.6f %8llu QNT %s -> %llu %.8f txid %llu\n",account,ratio,(long long)qtyA,assetids[j][2],(long long)(qtyA * ratio),((double)(long long)(qtyA * ratio))/decimals,(long long)txid); free_json(retjson2); } free(retstr2); } usleep(250000); } } } printf("%s distribution total %llu QNT %.8f\n",assetids[j][2],(long long)sum,(double)sum/decimals); } } free_json(retjson); } printf("NXTventure assethodlers.%d\n",n); free(retstr); } }
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)); }
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)); }
uint64_t InstantDEX_name(char *key,int32_t *keysizep,char *exchange,char *name,char *base,uint64_t *baseidp,char *rel,uint64_t *relidp) { uint64_t baseid,relid,assetbits = 0; char *s,*str; baseid = *baseidp, relid = *relidp; //printf(">>>>>> name.(%s) (%s/%s) %llu/%llu\n",name,base,rel,(long long)baseid,(long long)relid); if ( strcmp(base,"5527630") == 0 || baseid == 5527630 ) strcpy(base,"NXT"); if ( strcmp(rel,"5527630") == 0 || relid == 5527630 ) strcpy(rel,"NXT"); if ( relid == 0 && rel[0] != 0 ) { if ( is_decimalstr(rel) != 0 ) relid = calc_nxt64bits(rel); else relid = is_MGWcoin(rel); } else if ( (str= is_MGWasset(0,relid)) != 0 ) strcpy(rel,str); if ( baseid == 0 && base[0] != 0 ) { if ( is_decimalstr(base) != 0 ) baseid = calc_nxt64bits(base); else baseid = is_MGWcoin(base); } else if ( (str= is_MGWasset(0,baseid)) != 0 ) strcpy(base,str); if ( strcmp("InstantDEX",exchange) == 0 || strcmp("nxtae",exchange) == 0 || strcmp("unconf",exchange) == 0 || (baseid != 0 && relid != 0) ) { if ( strcmp(rel,"NXT") == 0 ) s = "+", relid = stringbits("NXT"), strcpy(rel,"NXT"); else if ( strcmp(base,"NXT") == 0 ) s = "-", baseid = stringbits("NXT"), strcpy(base,"NXT"); else s = ""; if ( base[0] == 0 ) { get_assetname(base,baseid); //printf("mapped %llu -> (%s)\n",(long long)baseid,base); } if ( rel[0] == 0 ) { get_assetname(rel,relid); //printf("mapped %llu -> (%s)\n",(long long)relid,rel); } if ( name[0] == 0 ) { if ( relid == NXT_ASSETID ) sprintf(name,"%llu",(long long)baseid); else if ( baseid == NXT_ASSETID ) sprintf(name,"-%llu",(long long)relid); else sprintf(name,"%llu/%llu",(long long)baseid,(long long)relid); } } else { if ( base[0] != 0 && rel[0] != 0 && baseid == 0 && relid == 0 ) { baseid = peggy_basebits(base), relid = peggy_basebits(rel); if ( name[0] == 0 && baseid != 0 && relid != 0 ) { strcpy(name,base); // need to be smarter strcat(name,"/"); strcat(name,rel); } } if ( name[0] == 0 || baseid == 0 || relid == 0 || base[0] == 0 || rel[0] == 0 ) { if ( baseid == 0 && base[0] != 0 ) baseid = stringbits(base); else if ( baseid != 0 && base[0] == 0 ) sprintf(base,"%llu",(long long)baseid); if ( relid == 0 && rel[0] != 0 ) { relid = stringbits(rel); printf("set relid.%llu <- (%s)\n",(long long)relid,rel); } else if ( relid != 0 && rel[0] == 0 ) sprintf(rel,"%llu",(long long)relid); if ( name[0] == 0 ) strcpy(name,base), strcat(name,"/"), strcat(name,rel); } } *baseidp = baseid, *relidp = relid; *keysizep = prices777_key(key,exchange,name,base,baseid,rel,relid); //printf("<<<<<<< name.(%s) (%s/%s) %llu/%llu\n",name,base,rel,(long long)baseid,(long long)relid); return(assetbits); }
int32_t main #endif (int argc,const char *argv[]) { char *retbuf,*line,*jsonargs,*transportstr,registerbuf[MAX_JSON_FIELD]; struct plugin_info *plugin; double startmilli; cJSON *argjson; int32_t max,sendflag,sleeptime=1,len = 0; #ifndef BUNDLED portable_OS_init(); #endif milliseconds2(); max = 1000000; retbuf = malloc(max+1); plugin = calloc(1,sizeof(*plugin));// + PLUGIN_EXTRASIZE); //plugin->extrasize = PLUGIN_EXTRASIZE; plugin->ppid = OS_getppid(); strcpy(plugin->name,PLUGINSTR); if ( 0 ) { int32_t i; for (i=0; i<argc; i++) printf("(%s) ",argv[i]); printf("argc.%d\n",argc); } //printf("%s (%s).argc%d parent PID.%d\n",plugin->name,argv[0],argc,plugin->ppid); plugin->timeout = 1; if ( argc <= 2 ) { jsonargs = (argc > 1) ? stringifyM((char *)argv[1]) : stringifyM("{}"); configure_plugin(retbuf,max,plugin,jsonargs,-1); free(jsonargs); //fprintf(stderr,"PLUGIN_RETURNS.[%s]\n",retbuf), fflush(stdout); return(0); } randombytes((uint8_t *)&plugin->myid,sizeof(plugin->myid)); plugin->permanentflag = atoi(argv[1]); plugin->daemonid = calc_nxt64bits(argv[2]); #ifdef BUNDLED plugin->bundledflag = 1; #endif transportstr = get_localtransport(plugin->bundledflag); sprintf(plugin->connectaddr,"%s://SuperNET.agents",transportstr); sprintf(plugin->bindaddr,"%s://%llu",transportstr,(long long)plugin->daemonid); jsonargs = (argc >= 3) ? ((char *)argv[3]) : 0; configure_plugin(retbuf,max,plugin,jsonargs,1); printf("CONFIGURED.(%s) argc.%d: %s myid.%llu daemonid.%llu NXT.%s serviceNXT.%s\n",plugin->name,argc,plugin->permanentflag != 0 ? "PERMANENT" : "WEBSOCKET",(long long)plugin->myid,(long long)plugin->daemonid,plugin->NXTADDR,plugin->SERVICENXT);//,jsonargs!=0?jsonargs:""); if ( init_pluginsocks(plugin,plugin->permanentflag,plugin->myid,plugin->daemonid,plugin->timeout) == 0 ) { argjson = cJSON_Parse(jsonargs); if ( (len= registerAPI(registerbuf,sizeof(registerbuf)-1,plugin,argjson)) > 0 ) { //fprintf(stderr,">>>>>>>>>>>>>>> plugin.(%s) sends REGISTER SEND.(%s)\n",plugin->name,registerbuf); nn_local_broadcast2(plugin->pushsock,0,0,(uint8_t *)registerbuf,(int32_t)strlen(registerbuf)+1), plugin->numsent++; } else printf("error register API\n"); if ( argjson != 0 ) free_json(argjson); } else printf("error init_pluginsocks\n"); while ( OS_getppid() == plugin->ppid ) { retbuf[0] = 0; if ( (len= nn_recv(plugin->pullsock,&line,NN_MSG,0)) > 0 ) { len = (int32_t)strlen(line); //printf("(s%d r%d) <<<<<<<<<<<<<< %s.RECEIVED (%s).%d -> bind.(%s) connect.(%s) %s\n",plugin->numsent,plugin->numrecv,plugin->name,line,len,plugin->bindaddr,plugin->connectaddr,plugin->permanentflag != 0 ? "PERMANENT" : "WEBSOCKET"), fflush(stdout); if ( (len= process_plugin_json(retbuf,max,&sendflag,plugin,plugin->permanentflag,plugin->daemonid,plugin->myid,line)) > 0 ) { if ( plugin->bundledflag == 0 ) printf("%s\n",retbuf), fflush(stdout); if ( sendflag != 0 ) { nn_local_broadcast2(plugin->pushsock,0,0,(uint8_t *)retbuf,(int32_t)strlen(retbuf)+1), plugin->numsent++; //fprintf(stderr,">>>>>>>>>>>>>> returned.(%s)\n",retbuf); } } //else printf("null return from process_plugin_json\n"); nn_freemsg(line); } else { startmilli = milliseconds2(); if ( PLUGNAME(_idle)(plugin) == 0 ) { if ( plugin->sleepmillis != 0 ) { sleeptime = plugin->sleepmillis - (milliseconds2() - startmilli); //printf("%s sleepmillis.%d sleeptime.%d\n",plugin->name,plugin->sleepmillis,sleeptime); if ( sleeptime > 0 ) msleep2(sleeptime); } } } } fprintf(stderr,"ppid.%d changed to %d\n",plugin->ppid,OS_getppid()); PLUGNAME(_shutdown)(plugin,len); // rc == 0 -> parent process died nn_shutdown(plugin->pushsock,0); if ( plugin->pushsock != plugin->pullsock ) nn_shutdown(plugin->pullsock,0); free(plugin); return(len); }
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); }