Merge pull request #490 from jl777/dev
fix assetchains notarization detection
This commit is contained in:
28
src/komodo.h
28
src/komodo.h
@@ -80,7 +80,8 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
||||
else matched = (strcmp(symbol,ASSETCHAINS_SYMBOL) == 0);
|
||||
if ( fread(&ht,1,sizeof(ht),fp) != sizeof(ht) )
|
||||
errs++;
|
||||
//printf("fpos.%ld func.(%d %c) ht.%d ",ftell(fp),func,func,ht);
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && func != 'T' )
|
||||
printf("[%s] matched.%d fpos.%ld func.(%d %c) ht.%d\n",ASSETCHAINS_SYMBOL,matched,ftell(fp),func,func,ht);
|
||||
if ( func == 'P' )
|
||||
{
|
||||
if ( (num= fgetc(fp)) <= 64 )
|
||||
@@ -103,8 +104,8 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
||||
errs++;
|
||||
if ( fread(¬arized_desttxid,1,sizeof(notarized_desttxid),fp) != sizeof(notarized_desttxid) )
|
||||
errs++;
|
||||
if ( 0 && sp != 0 )
|
||||
printf("%s load[%s.%d] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,notarized_height,notarized_hash.ToString().c_str());
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && sp != 0 )
|
||||
printf("%s load[%s.%d -> %s] NOTARIZED %d %s\n",ASSETCHAINS_SYMBOL,symbol,sp->NUM_NPOINTS,dest,notarized_height,notarized_hash.ToString().c_str());
|
||||
//if ( matched != 0 ) global independent states -> inside *sp
|
||||
komodo_eventadd_notarized(sp,symbol,ht,dest,notarized_hash,notarized_desttxid,notarized_height);
|
||||
}
|
||||
@@ -156,7 +157,7 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
||||
{
|
||||
if ( fread(opret,1,olen,fp) != olen )
|
||||
errs++;
|
||||
if ( 0 && matched != 0 )
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && matched != 0 )
|
||||
{
|
||||
int32_t i; for (i=0; i<olen; i++)
|
||||
printf("%02x",opret[i]);
|
||||
@@ -204,8 +205,10 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar
|
||||
if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
|
||||
{
|
||||
KOMODO_INITDONE = (uint32_t)time(NULL);
|
||||
printf("[%s] no komodo_stateptr\n",ASSETCHAINS_SYMBOL);
|
||||
return;
|
||||
}
|
||||
//printf("[%s] (%s) -> (%s)\n",ASSETCHAINS_SYMBOL,symbol,dest);
|
||||
if ( fp == 0 )
|
||||
{
|
||||
komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
|
||||
@@ -389,6 +392,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
|
||||
opretlen = scriptbuf[len++];
|
||||
opretlen += (scriptbuf[len++] << 8);
|
||||
}
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] notarized.%d notarizedht.%d sp.Nht %d sp.ht %d opretlen.%d (%c %c %c)\n",ASSETCHAINS_SYMBOL,notarized,*notarizedheightp,sp->NOTARIZED_HEIGHT,sp->CURRENT_HEIGHT,opretlen,scriptbuf[len+32*2+4],scriptbuf[len+32*2+4+1],scriptbuf[len+32*2+4+2]);
|
||||
if ( j == 1 && opretlen >= 32*2+4 && strcmp(ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,(char *)&scriptbuf[len+32*2+4]) == 0 )
|
||||
{
|
||||
len += iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid);
|
||||
@@ -401,8 +406,8 @@ int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scr
|
||||
sp->NOTARIZED_DESTTXID = desttxid;
|
||||
komodo_stateupdate(height,0,0,0,zero,0,0,0,0,0,0,0,0,0,0);
|
||||
len += 4;
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] == 0 )
|
||||
printf("%s ht.%d NOTARIZED.%d %s.%s %sTXID.%s (%s) lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),(char *)&scriptbuf[len],opretlen,len);
|
||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] ht.%d NOTARIZED.%d %s.%s %sTXID.%s (%s) lens.(%d %d)\n",ASSETCHAINS_SYMBOL,height,*notarizedheightp,ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,kmdtxid.ToString().c_str(),ASSETCHAINS_SYMBOL[0]==0?"BTC":"KMD",desttxid.ToString().c_str(),(char *)&scriptbuf[len],opretlen,len);
|
||||
if ( ASSETCHAINS_SYMBOL[0] == 0 )
|
||||
{
|
||||
if ( signedfp == 0 )
|
||||
@@ -545,10 +550,12 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
|
||||
} else printf("cant get scriptPubKey for ht.%d txi.%d vin.%d\n",height,i,j);
|
||||
}
|
||||
numvalid = bitweight(signedmask);
|
||||
if ( (((height < 90000 || (signedmask & 1) != 0) && numvalid >= KOMODO_MINRATIFY) || numvalid > (numnotaries/5)) )
|
||||
if ( (((height < 90000 || (signedmask & 1) != 0) && numvalid >= KOMODO_MINRATIFY) ||
|
||||
(numvalid >= KOMODO_MINRATIFY && ASSETCHAINS_SYMBOL[0] != 0) ||
|
||||
numvalid > (numnotaries/5)) )
|
||||
{
|
||||
if ( height > 500000 )
|
||||
printf("%s ht.%d txi.%d signedmask.%llx numvins.%d numvouts.%d <<<<<<<<<<< notarized\n",ASSETCHAINS_SYMBOL,height,i,(long long)signedmask,numvins,numvouts);
|
||||
if ( height > 500000 || ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] ht.%d txi.%d signedmask.%llx numvins.%d numvouts.%d <<<<<<<<<<< notarized\n",ASSETCHAINS_SYMBOL,height,i,(long long)signedmask,numvins,numvouts);
|
||||
notarized = 1;
|
||||
}
|
||||
if ( NOTARY_PUBKEY33[0] != 0 && ASSETCHAINS_SYMBOL[0] == 0 )
|
||||
@@ -590,7 +597,8 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block)
|
||||
}
|
||||
if ( NOTARY_PUBKEY33[0] != 0 && ASSETCHAINS_SYMBOL[0] == 0 )
|
||||
printf(") ");
|
||||
//printf("%s ht.%d txi.%d signedmask.%llx numvins.%d numvouts.%d notarized.%d special.%d isratification.%d\n",ASSETCHAINS_SYMBOL,height,i,(long long)signedmask,numvins,numvouts,notarized,specialtx,isratification);
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] == 0 )
|
||||
printf("[%s] ht.%d txi.%d signedmask.%llx numvins.%d numvouts.%d notarized.%d special.%d isratification.%d\n",ASSETCHAINS_SYMBOL,height,i,(long long)signedmask,numvins,numvouts,notarized,specialtx,isratification);
|
||||
if ( notarized != 0 && (notarizedheight != 0 || specialtx != 0) )
|
||||
{
|
||||
if ( isratification != 0 )
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <curl/easy.h>
|
||||
#endif
|
||||
|
||||
#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr))
|
||||
//#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr))
|
||||
|
||||
struct MemoryStruct { char *memory; size_t size; };
|
||||
struct return_string { char *ptr; size_t len; };
|
||||
@@ -339,7 +339,7 @@ char *komodo_issuemethod(char *userpass,char *method,char *params,uint16_t port)
|
||||
{
|
||||
sprintf(url,(char *)"http://127.0.0.1:%u",port);
|
||||
sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params);
|
||||
//printf("postdata.(%s) USERPASS.(%s)\n",postdata,KMDUSERPASS);
|
||||
//printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,KMDUSERPASS);
|
||||
retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params);
|
||||
//retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0);
|
||||
}
|
||||
@@ -353,7 +353,7 @@ int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heig
|
||||
*kmdnotarized_heightp = 0;
|
||||
if ( strcmp(dest,"KMD") == 0 )
|
||||
{
|
||||
port = 7771;
|
||||
port = KMD_PORT;
|
||||
userpass = KMDUSERPASS;
|
||||
}
|
||||
else if ( strcmp(dest,"BTC") == 0 )
|
||||
@@ -427,15 +427,18 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t
|
||||
sprintf(params,"[\"%s\", 1]",NOTARIZED_DESTTXID.ToString().c_str());
|
||||
if ( strcmp(symbol,ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL) != 0 )
|
||||
return(0);
|
||||
//printf("[%s] src.%s dest.%s params.[%s] ht.%d notarized.%d\n",ASSETCHAINS_SYMBOL,symbol,dest,params,height,NOTARIZED_HEIGHT);
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] src.%s dest.%s params.[%s] ht.%d notarized.%d\n",ASSETCHAINS_SYMBOL,symbol,dest,params,height,NOTARIZED_HEIGHT);
|
||||
if ( strcmp(dest,"KMD") == 0 )
|
||||
{
|
||||
if ( KMDUSERPASS[0] != 0 )
|
||||
{
|
||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771);
|
||||
}
|
||||
//else jsonstr = _dex_getrawtransaction();
|
||||
{
|
||||
jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,KMD_PORT);
|
||||
//printf("userpass.(%s) got (%s)\n",KMDUSERPASS,jsonstr);
|
||||
}
|
||||
}//else jsonstr = _dex_getrawtransaction();
|
||||
else return(0); // need universal way to issue DEX* API, since notaries mine most blocks, this ok
|
||||
}
|
||||
else if ( strcmp(dest,"BTC") == 0 )
|
||||
@@ -460,7 +463,8 @@ int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t
|
||||
if ( (txjson= jobj(json,(char *)"result")) != 0 && (vouts= jarray(&n,txjson,(char *)"vout")) > 0 )
|
||||
{
|
||||
vout = jitem(vouts,n-1);
|
||||
//printf("vout.(%s)\n",jprint(vout,0));
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("vout.(%s)\n",jprint(vout,0));
|
||||
if ( (skey= jobj(vout,(char *)"scriptPubKey")) != 0 )
|
||||
{
|
||||
if ( (hexstr= jstr(skey,(char *)"hex")) != 0 )
|
||||
|
||||
@@ -41,12 +41,13 @@ void komodo_eventadd_notarized(struct komodo_state *sp,char *symbol,int32_t heig
|
||||
struct komodo_event_notarized N;
|
||||
if ( komodo_verifynotarization(symbol,dest,height,notarizedheight,notarized_hash,notarized_desttxid) != 0 )
|
||||
{
|
||||
if ( height > 50000 )
|
||||
if ( height > 50000 || ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] error validating notarization ht.%d notarized_height.%d, if on a pruned %s node this can be ignored\n",ASSETCHAINS_SYMBOL,height,notarizedheight,dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
//fprintf(stderr,"validated %s ht.%d notarized %d\n",ASSETCHAINS_SYMBOL,height,notarizedheight);
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
fprintf(stderr,"validated [%s] ht.%d notarized %d\n",ASSETCHAINS_SYMBOL,height,notarizedheight);
|
||||
memset(&N,0,sizeof(N));
|
||||
N.blockhash = notarized_hash;
|
||||
N.desttxid = notarized_desttxid;
|
||||
|
||||
@@ -52,7 +52,7 @@ uint32_t ASSETCHAINS_MAGIC = 2387029918;
|
||||
uint64_t ASSETCHAINS_SUPPLY = 10;
|
||||
|
||||
uint32_t KOMODO_INITDONE;
|
||||
char KMDUSERPASS[4096],BTCUSERPASS[4096]; uint16_t BITCOIND_PORT = 7771;
|
||||
char KMDUSERPASS[4096],BTCUSERPASS[4096]; uint16_t KMD_PORT = 7771,BITCOIND_PORT = 7771;
|
||||
uint64_t PENDING_KOMODO_TX;
|
||||
|
||||
struct komodo_kv *KOMODO_KV;
|
||||
|
||||
@@ -170,7 +170,7 @@ int32_t komodo_ratify_threshold(int32_t height,uint64_t signedmask)
|
||||
int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height)
|
||||
{
|
||||
int32_t i,htind,n; uint64_t mask = 0; struct knotary_entry *kp,*tmp;
|
||||
if ( height >= 180000 )
|
||||
if ( height >= 180000 || ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
{
|
||||
n = (int32_t)(sizeof(Notaries_elected)/sizeof(*Notaries_elected));
|
||||
for (i=0; i<n; i++)
|
||||
@@ -289,6 +289,8 @@ void komodo_notarized_update(struct komodo_state *sp,int32_t nHeight,int32_t not
|
||||
printf("komodo_notarized_update REJECT notarized_height %d > %d nHeight\n",notarized_height,nHeight);
|
||||
return;
|
||||
}
|
||||
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
|
||||
printf("[%s] komodo_notarized_update nHeight.%d notarized_height.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height);
|
||||
portable_mutex_lock(&komodo_mutex);
|
||||
sp->NPOINTS = (struct notarized_checkpoint *)realloc(sp->NPOINTS,(sp->NUM_NPOINTS+1) * sizeof(*sp->NPOINTS));
|
||||
np = &sp->NPOINTS[sp->NUM_NPOINTS++];
|
||||
@@ -320,26 +322,48 @@ int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp)
|
||||
|
||||
int32_t komodo_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp)
|
||||
{
|
||||
struct notarized_checkpoint *np = 0; int32_t i; char symbol[16],dest[16]; struct komodo_state *sp;
|
||||
struct notarized_checkpoint *np = 0; int32_t i,flag = 0; char symbol[16],dest[16]; struct komodo_state *sp;
|
||||
if ( (sp= komodo_stateptr(symbol,dest)) != 0 )
|
||||
{
|
||||
if ( sp->NUM_NPOINTS > 0 )
|
||||
{
|
||||
for (i=0; i<sp->NUM_NPOINTS; i++)
|
||||
flag = 0;
|
||||
if ( sp->last_NPOINTSi < sp->NUM_NPOINTS && sp->last_NPOINTSi > 0 )
|
||||
{
|
||||
if ( sp->NPOINTS[i].nHeight >= nHeight )
|
||||
break;
|
||||
np = &sp->NPOINTS[i];
|
||||
np = &sp->NPOINTS[sp->last_NPOINTSi-1];
|
||||
for (i=sp->last_NPOINTSi; i<sp->NUM_NPOINTS; i++)
|
||||
{
|
||||
if ( sp->NPOINTS[i].nHeight >= nHeight )
|
||||
{
|
||||
flag = 1;
|
||||
break;
|
||||
}
|
||||
np = &sp->NPOINTS[i];
|
||||
sp->last_NPOINTSi = i;
|
||||
}
|
||||
}
|
||||
if ( flag == 0 )
|
||||
{
|
||||
np = 0;
|
||||
for (i=0; i<sp->NUM_NPOINTS; i++)
|
||||
{
|
||||
if ( sp->NPOINTS[i].nHeight >= nHeight )
|
||||
break;
|
||||
np = &sp->NPOINTS[i];
|
||||
sp->last_NPOINTSi = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( np != 0 )
|
||||
{
|
||||
//char str[65],str2[65]; printf("[%s] notarized_ht.%d\n",ASSETCHAINS_SYMBOL,np->notarized_height);
|
||||
*notarized_hashp = np->notarized_hash;
|
||||
*notarized_desttxidp = np->notarized_desttxid;
|
||||
return(np->notarized_height);
|
||||
}
|
||||
}
|
||||
memset(notarized_hashp,0,sizeof(*notarized_hashp));
|
||||
memset(notarized_desttxidp,0,sizeof(*notarized_desttxidp));
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ struct komodo_state
|
||||
int32_t SAVEDHEIGHT,CURRENT_HEIGHT,NOTARIZED_HEIGHT;
|
||||
uint32_t SAVEDTIMESTAMP;
|
||||
uint64_t deposited,issued,withdrawn,approved,redeemed,shorted;
|
||||
struct notarized_checkpoint *NPOINTS; int32_t NUM_NPOINTS;
|
||||
struct notarized_checkpoint *NPOINTS; int32_t NUM_NPOINTS,last_NPOINTSi;
|
||||
struct komodo_event **Komodo_events; int32_t Komodo_numevents;
|
||||
uint32_t RTbufs[64][3]; uint64_t RTmask;
|
||||
};
|
||||
|
||||
@@ -1261,9 +1261,9 @@ void iguana_initQ(queue_t *Q,char *name)
|
||||
free(item);
|
||||
}
|
||||
|
||||
void komodo_userpass(char *username,char *password,FILE *fp)
|
||||
uint16_t komodo_userpass(char *username,char *password,FILE *fp)
|
||||
{
|
||||
char *rpcuser,*rpcpassword,*str,line[8192];
|
||||
char *rpcuser,*rpcpassword,*str,line[8192]; uint16_t port = 0;
|
||||
rpcuser = rpcpassword = 0;
|
||||
username[0] = password[0] = 0;
|
||||
while ( fgets(line,sizeof(line),fp) != 0 )
|
||||
@@ -1275,6 +1275,11 @@ void komodo_userpass(char *username,char *password,FILE *fp)
|
||||
rpcuser = parse_conf_line(str,(char *)"rpcuser");
|
||||
else if ( (str= strstr(line,(char *)"rpcpassword")) != 0 )
|
||||
rpcpassword = parse_conf_line(str,(char *)"rpcpassword");
|
||||
else if ( (str= strstr(line,(char *)"rpcport")) != 0 )
|
||||
{
|
||||
port = atoi(parse_conf_line(str,(char *)"rpcport"));
|
||||
//printf("rpcport.%u in file\n",port);
|
||||
}
|
||||
}
|
||||
if ( rpcuser != 0 && rpcpassword != 0 )
|
||||
{
|
||||
@@ -1286,6 +1291,7 @@ void komodo_userpass(char *username,char *password,FILE *fp)
|
||||
free(rpcuser);
|
||||
if ( rpcpassword != 0 )
|
||||
free(rpcpassword);
|
||||
return(port);
|
||||
}
|
||||
|
||||
void komodo_statefname(char *fname,char *symbol,char *str)
|
||||
@@ -1328,7 +1334,7 @@ void komodo_statefname(char *fname,char *symbol,char *str)
|
||||
void komodo_configfile(char *symbol,uint16_t port)
|
||||
{
|
||||
static char myusername[512],mypassword[8192];
|
||||
FILE *fp; uint8_t buf2[33]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i;
|
||||
FILE *fp; uint16_t kmdport; uint8_t buf2[33]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i;
|
||||
if ( symbol != 0 && port != 0 )
|
||||
{
|
||||
r = (uint32_t)time(NULL);
|
||||
@@ -1386,16 +1392,17 @@ void komodo_configfile(char *symbol,uint16_t port)
|
||||
#endif
|
||||
if ( (fp= fopen(fname,"rb")) != 0 )
|
||||
{
|
||||
komodo_userpass(username,password,fp);
|
||||
if ( (kmdport= komodo_userpass(username,password,fp)) != 0 )
|
||||
KMD_PORT = kmdport;
|
||||
sprintf(KMDUSERPASS,"%s:%s",username,password);
|
||||
fclose(fp);
|
||||
//printf("KOMODO.(%s) -> userpass.(%s)\n",fname,KMDUSERPASS);
|
||||
} else printf("couldnt open.(%s)\n",fname);
|
||||
}
|
||||
|
||||
int32_t komodo_userpass(char *userpass,char *symbol)
|
||||
uint16_t komodo_userpass(char *userpass,char *symbol)
|
||||
{
|
||||
FILE *fp; char fname[512],username[512],password[512],confname[16];
|
||||
FILE *fp; uint16_t port = 0; char fname[512],username[512],password[512],confname[16];
|
||||
userpass[0] = 0;
|
||||
if ( strcmp("KMD",symbol) == 0 )
|
||||
{
|
||||
@@ -1409,12 +1416,12 @@ int32_t komodo_userpass(char *userpass,char *symbol)
|
||||
komodo_statefname(fname,symbol,confname);
|
||||
if ( (fp= fopen(fname,"rb")) != 0 )
|
||||
{
|
||||
komodo_userpass(username,password,fp);
|
||||
port = komodo_userpass(username,password,fp);
|
||||
sprintf(userpass,"%s:%s",username,password);
|
||||
fclose(fp);
|
||||
return((int32_t)strlen(userpass));
|
||||
}
|
||||
return(-1);
|
||||
return(port);
|
||||
}
|
||||
|
||||
uint32_t komodo_assetmagic(char *symbol,uint64_t supply)
|
||||
|
||||
Reference in New Issue
Block a user