char *instantdex_sendcmd(struct supernet_info *myinfo,cJSON *argjson,char *cmdstr,char *ipaddr,int32_t hops) { char *reqstr,hexstr[8192]; uint8_t _msg[4096]; uint64_t nxt64bits; int32_t datalen; bits256 instantdexhash; struct instantdex_msghdr *msg; msg = (struct instantdex_msghdr *)_msg; memset(msg,0,sizeof(*msg)); instantdexhash = calc_categoryhashes(0,"InstantDEX",0); category_subscribe(myinfo,instantdexhash,GENESIS_PUBKEY); if ( ipaddr == 0 || ipaddr[0] == 0 || strncmp(ipaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 ) return(clonestr("{\"error\":\"no ipaddr, need to send your ipaddr for now\"}")); jaddstr(argjson,"cmd",cmdstr); jaddstr(argjson,"agent","SuperNET"); jaddstr(argjson,"method","DHT"); jaddstr(argjson,"traderip",ipaddr); jaddbits256(argjson,"categoryhash",instantdexhash); jaddbits256(argjson,"traderpub",myinfo->myaddr.persistent); nxt64bits = acct777_nxt64bits(myinfo->myaddr.persistent); reqstr = jprint(argjson,1); datalen = (int32_t)(strlen(reqstr) + 1); memcpy(msg->serialized,reqstr,datalen); free(reqstr); if ( (datalen+sizeof(*msg))*2+1 < sizeof(hexstr) && instantdex_msgcreate(myinfo,msg,datalen) != 0 ) { printf("instantdex send.(%s)\n",cmdstr); init_hexbytes_noT(hexstr,(uint8_t *)msg,msg->sig.allocsize); return(SuperNET_categorymulticast(myinfo,0,instantdexhash,GENESIS_PUBKEY,hexstr,0,hops,1)); } else { printf("cant msgcreate\n"); return(clonestr("{\"error\":\"couldnt create instantdex message\"}")); } }
cJSON *iguana_unspentjson(struct supernet_info *myinfo,struct iguana_info *coin,int32_t hdrsi,uint32_t unspentind,struct iguana_txid *T,struct iguana_unspent *up,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33) { /*{ "txid" : "d54994ece1d11b19785c7248868696250ab195605b469632b7bd68130e880c9a", "vout" : 1, "address" : "mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe", "account" : "test label", "scriptPubKey" : "76a9140dfc8bafc8419853b34d5e072ad37d1a5159f58488ac", "amount" : 0.00010000, "confirmations" : 6210, "spendable" : true },*/ //struct iguana_unspent { uint64_t value; uint32_t txidind,pkind,prevunspentind; uint16_t hdrsi:12,type:4,vout; } __attribute__((packed)); struct iguana_waccount *wacct; struct iguana_waddress *waddr; int32_t height; char scriptstr[8192],asmstr[sizeof(scriptstr)+1024]; cJSON *item; uint32_t checkind; item = cJSON_CreateObject(); jaddbits256(item,"txid",T[up->txidind].txid); jaddnum(item,"vout",up->vout); jaddstr(item,"address",coinaddr); if ( iguana_scriptget(coin,scriptstr,asmstr,sizeof(scriptstr),hdrsi,unspentind,T[up->txidind].txid,up->vout,rmd160,up->type,pubkey33) != 0 ) jaddstr(item,"scriptPubKey",scriptstr); jaddnum(item,"amount",dstr(up->value)); if ( (checkind= iguana_unspentindfind(coin,0,0,0,0,&height,T[up->txidind].txid,up->vout,coin->bundlescount-1)) != 0 ) { jaddnum(item,"confirmations",coin->blocks.hwmchain.height - height + 1); jaddnum(item,"checkind",checkind); } if ( (waddr= iguana_waddresssearch(myinfo,coin,&wacct,coinaddr)) != 0 ) { jaddstr(item,"account",wacct->account); jadd(item,"spendable",jtrue()); } else jadd(item,"spendable",jfalse()); jadd(item,"unspent",ramchain_unspentjson(up,unspentind)); return(item); }
char *pangea_dispsummary(struct supernet_info *myinfo,struct table_info *tp,int32_t verbose,uint8_t *summary,int32_t summarysize,bits256 tablehash,int32_t handid,int32_t numplayers) { int32_t i,cardi,n = 0,len = 0; uint8_t type; uint64_t valA,bits64[CARDS777_MAXPLAYERS + (CARDS777_MAXCARDS+1)*4]; bits256 card; cJSON *item,*json,*all,*cardis[52],*players[CARDS777_MAXPLAYERS],*pitem,*array = cJSON_CreateArray(); all = cJSON_CreateArray(); memset(cardis,0,sizeof(cardis)); memset(players,0,sizeof(players)); for (i=0; i<numplayers; i++) players[i] = cJSON_CreateArray(); while ( len < summarysize ) { memset(bits64,0,sizeof(bits64)); len = pangea_parsesummary(&type,&valA,bits64,&card,summary,len); if ( (item= pangea_handitem(&cardi,&pitem,type,valA,bits64,card,numplayers)) != 0 ) { if ( cardi >= 0 && cardi < 52 ) { //printf("cardis[%d] <- %p\n",cardi,item); cardis[cardi] = item; } else jaddi(array,item); item = 0; } if ( pitem != 0 ) { jaddnum(pitem,"n",n), n++; if ( (int32_t)valA >= 0 && valA < numplayers ) jaddi(players[valA],pitem); else free_json(pitem), printf("illegal player.%llu\n",(long long)valA); pitem = 0; } } for (i=0; i<numplayers; i++) jaddi(all,players[i]); if ( verbose == 0 ) { for (i=0; i<52; i++) if ( cardis[i] != 0 ) free_json(cardis[i]); free_json(array); return(jprint(all,1)); } else { json = cJSON_CreateObject(); jaddbits256(json,"tablehash",tablehash); jaddnum(json,"size",summarysize); jaddnum(json,"handid",handid); //jaddnum(json,"crc",_crc32(0,summary,summarysize)); jadd(json,"hand",array); array = cJSON_CreateArray(); for (i=0; i<52; i++) if ( cardis[i] != 0 ) jaddi(array,cardis[i]); jadd(json,"cards",array); //jadd(json,"players",all); return(jprint(json,1)); } }
cJSON *InstantDEX_argjson(char *reference,char *message,bits256 basetxid,bits256 reltxid,int32_t iter,int32_t val,int32_t val2) { cJSON *argjson = cJSON_CreateObject(); jaddstr(argjson,"ref",reference); if ( message != 0 && message[0] != 0 ) jaddstr(argjson,"message",message); jaddbits256(argjson,"basetxid",basetxid); jaddbits256(argjson,"reltxid",reltxid); if ( iter != 3 ) { jaddnum(argjson,"duration",val); jaddnum(argjson,"flags",val2); } else { if ( val > 0 ) jaddnum(argjson,"baseheight",val); if ( val2 > 0 ) jaddnum(argjson,"relheight",val2); } return(argjson); }
HASH_AND_INT(ramchain,getrawtransaction,txid,verbose) { struct iguana_txid *tx,T; char *txbytes; bits256 checktxid; int32_t len,height; cJSON *retjson; if ( (tx= iguana_txidfind(coin,&height,&T,txid)) != 0 ) { retjson = cJSON_CreateObject(); if ( (len= iguana_txbytes(coin,coin->blockspace,sizeof(coin->blockspace),&checktxid,tx,height,0,0)) > 0 ) { txbytes = mycalloc('x',1,len*2+1); init_hexbytes_noT(txbytes,coin->blockspace,len*2+1); jaddstr(retjson,"result",txbytes); myfree(txbytes,len*2+1); return(jprint(retjson,1)); } else if ( height >= 0 ) { if ( coin->APIblockstr != 0 ) jaddstr(retjson,"error","already have pending request"); else { int32_t datalen; uint8_t *data; char *blockstr; bits256 blockhash; blockhash = iguana_blockhash(coin,height); if ( (blockstr= iguana_APIrequest(coin,blockhash,txid,2)) != 0 ) { datalen = (int32_t)(strlen(blockstr) >> 1); data = malloc(datalen); decode_hex(data,datalen,blockstr); if ( (txbytes= iguana_txscan(coin,verbose != 0 ? retjson : 0,data,datalen,txid)) != 0 ) { jaddstr(retjson,"result",txbytes); jaddbits256(retjson,"blockhash",blockhash); jaddnum(retjson,"height",height); free(txbytes); } else jaddstr(retjson,"error","cant find txid in block"); free(blockstr); free(data); } else jaddstr(retjson,"error","cant find blockhash"); return(jprint(retjson,1)); }
STRING_AND_INT(iguana,bundlehashes,activecoin,height) { struct iguana_info *ptr; struct iguana_bundle *bp; int32_t i,hdrsi; cJSON *retjson,*array; struct iguana_ramchaindata *rdata; if ( (ptr= iguana_coinfind(activecoin)) != 0 ) { hdrsi = height / coin->chain->bundlesize; if ( hdrsi < coin->bundlescount && hdrsi >= 0 && (bp= coin->bundles[hdrsi]) != 0 ) { if ( (rdata= bp->ramchain.H.data) != 0 ) { array = cJSON_CreateArray(); for (i=0; i<IGUANA_NUMLHASHES; i++) jaddinum(array,rdata->lhashes[i].txid); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); jaddbits256(retjson,"sha256",rdata->sha256); jadd(retjson,"bundlehashes",array); return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"ramchain not there\"}")); } else return(clonestr("{\"error\":\"height is too big\"}")); } else return(clonestr("{\"error\":\"activecoin is not active\"}")); }
TWO_HASHES(hash,curve25519_pair,element,scalar) { cJSON *retjson = cJSON_CreateObject(); jaddbits256(retjson,"result",curve25519(element,scalar)); return(jprint(retjson,1)); }
INT_ARG(ramchain,getblockhash,height) { cJSON *retjson = cJSON_CreateObject(); jaddbits256(retjson,"result",iguana_blockhash(coin,height)); return(jprint(retjson,1)); }