147
src/komodo.h
147
src/komodo.h
@@ -192,11 +192,143 @@ int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char
|
|||||||
return(func);
|
return(func);
|
||||||
} else return(-1);
|
} else return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t memread(void *dest,int32_t size,uint8_t *filedata,long *fposp,long datalen)
|
||||||
|
{
|
||||||
|
if ( *fposp+size <= datalen )
|
||||||
|
{
|
||||||
|
memcpy(dest,&filedata[*fposp],size);
|
||||||
|
(*fposp) += size;
|
||||||
|
return(size);
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long *fposp,long datalen,char *symbol,char *dest)
|
||||||
|
{
|
||||||
|
static int32_t errs;
|
||||||
|
int32_t func= -1,ht,notarized_height,num,matched=0; uint256 notarized_hash,notarized_desttxid; uint8_t pubkeys[64][33]; long fpos = *fposp;
|
||||||
|
if ( fpos < datalen )
|
||||||
|
{
|
||||||
|
func = filedata[fpos++];
|
||||||
|
if ( ASSETCHAINS_SYMBOL[0] == 0 && strcmp(symbol,"KMD") == 0 )
|
||||||
|
matched = 1;
|
||||||
|
else matched = (strcmp(symbol,ASSETCHAINS_SYMBOL) == 0);
|
||||||
|
if ( memread(&ht,sizeof(ht),filedata,&fpos,datalen) != sizeof(ht) )
|
||||||
|
errs++;
|
||||||
|
if ( func == 'P' )
|
||||||
|
{
|
||||||
|
if ( (num= filedata[fpos++]) <= 64 )
|
||||||
|
{
|
||||||
|
if ( memread(pubkeys,33*num,filedata,&fpos,datalen) != 33*num )
|
||||||
|
errs++;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//printf("updated %d pubkeys at %s ht.%d\n",num,symbol,ht);
|
||||||
|
if ( (KOMODO_EXTERNAL_NOTARIES != 0 && matched != 0) || (strcmp(symbol,"KMD") == 0 && KOMODO_EXTERNAL_NOTARIES == 0) )
|
||||||
|
komodo_eventadd_pubkeys(sp,symbol,ht,num,pubkeys);
|
||||||
|
}
|
||||||
|
} else printf("illegal num.%d\n",num);
|
||||||
|
}
|
||||||
|
else if ( func == 'N' )
|
||||||
|
{
|
||||||
|
if ( memread(¬arized_height,sizeof(notarized_height),filedata,&fpos,datalen) != sizeof(notarized_height) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(¬arized_hash,sizeof(notarized_hash),filedata,&fpos,datalen) != sizeof(notarized_hash) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(¬arized_desttxid,sizeof(notarized_desttxid),filedata,&fpos,datalen) != sizeof(notarized_desttxid) )
|
||||||
|
errs++;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else if ( func == 'U' ) // deprecated
|
||||||
|
{
|
||||||
|
uint8_t n,nid; uint256 hash; uint64_t mask;
|
||||||
|
n = filedata[fpos++];
|
||||||
|
nid = filedata[fpos++];
|
||||||
|
//printf("U %d %d\n",n,nid);
|
||||||
|
if ( memread(&mask,sizeof(mask),filedata,&fpos,datalen) != sizeof(mask) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(&hash,sizeof(hash),filedata,&fpos,datalen) != sizeof(hash) )
|
||||||
|
errs++;
|
||||||
|
}
|
||||||
|
else if ( func == 'K' )
|
||||||
|
{
|
||||||
|
int32_t kheight;
|
||||||
|
if ( memread(&kheight,sizeof(kheight),filedata,&fpos,datalen) != sizeof(kheight) )
|
||||||
|
errs++;
|
||||||
|
komodo_eventadd_kmdheight(sp,symbol,ht,kheight,0);
|
||||||
|
}
|
||||||
|
else if ( func == 'T' )
|
||||||
|
{
|
||||||
|
int32_t kheight,ktimestamp;
|
||||||
|
if ( memread(&kheight,sizeof(kheight),filedata,&fpos,datalen) != sizeof(kheight) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(&ktimestamp,sizeof(ktimestamp),filedata,&fpos,datalen) != sizeof(ktimestamp) )
|
||||||
|
errs++;
|
||||||
|
//if ( matched != 0 ) global independent states -> inside *sp
|
||||||
|
//printf("%s.%d load[%s] ht.%d t.%u\n",ASSETCHAINS_SYMBOL,ht,symbol,kheight,ktimestamp);
|
||||||
|
komodo_eventadd_kmdheight(sp,symbol,ht,kheight,ktimestamp);
|
||||||
|
}
|
||||||
|
else if ( func == 'R' )
|
||||||
|
{
|
||||||
|
uint16_t olen,v; uint64_t ovalue; uint256 txid; uint8_t opret[16384];
|
||||||
|
if ( memread(&txid,sizeof(txid),filedata,&fpos,datalen) != sizeof(txid) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(&v,sizeof(v),filedata,&fpos,datalen) != sizeof(v) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(&ovalue,sizeof(ovalue),filedata,&fpos,datalen) != sizeof(ovalue) )
|
||||||
|
errs++;
|
||||||
|
if ( memread(&olen,sizeof(olen),filedata,&fpos,datalen) != sizeof(olen) )
|
||||||
|
errs++;
|
||||||
|
if ( olen < sizeof(opret) )
|
||||||
|
{
|
||||||
|
if ( memread(opret,olen,filedata,&fpos,datalen) != olen )
|
||||||
|
errs++;
|
||||||
|
if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && matched != 0 )
|
||||||
|
{
|
||||||
|
int32_t i; for (i=0; i<olen; i++)
|
||||||
|
printf("%02x",opret[i]);
|
||||||
|
printf(" %s.%d load[%s] opret[%c] len.%d %.8f\n",ASSETCHAINS_SYMBOL,ht,symbol,opret[0],olen,(double)ovalue/COIN);
|
||||||
|
}
|
||||||
|
komodo_eventadd_opreturn(sp,symbol,ht,txid,ovalue,v,opret,olen); // global shared state -> global PAX
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
for (i=0; i<olen; i++)
|
||||||
|
filedata[fpos++];
|
||||||
|
//printf("illegal olen.%u\n",olen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( func == 'D' )
|
||||||
|
{
|
||||||
|
printf("unexpected function D[%d]\n",ht);
|
||||||
|
}
|
||||||
|
else if ( func == 'V' )
|
||||||
|
{
|
||||||
|
int32_t numpvals; uint32_t pvals[128];
|
||||||
|
numpvals = filedata[fpos++];
|
||||||
|
if ( numpvals*sizeof(uint32_t) <= sizeof(pvals) && memread(pvals,(int32_t)(sizeof(uint32_t)*numpvals),filedata,&fpos,datalen) == numpvals*sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
//if ( matched != 0 ) global shared state -> global PVALS
|
||||||
|
//printf("%s load[%s] prices %d\n",ASSETCHAINS_SYMBOL,symbol,ht);
|
||||||
|
komodo_eventadd_pricefeed(sp,symbol,ht,pvals,numpvals);
|
||||||
|
//printf("load pvals ht.%d numpvals.%d\n",ht,numpvals);
|
||||||
|
} else printf("error loading pvals[%d]\n",numpvals);
|
||||||
|
}
|
||||||
|
else printf("[%s] %s illegal func.(%d %c)\n",ASSETCHAINS_SYMBOL,symbol,func,func);
|
||||||
|
*fposp = fpos;
|
||||||
|
return(func);
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout)
|
void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout)
|
||||||
{
|
{
|
||||||
static FILE *fp; static int32_t errs,didinit;
|
static FILE *fp; static int32_t errs,didinit;
|
||||||
struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t ht,func; uint8_t num,pubkeys[64][33];
|
struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t retval,ht,func; uint8_t num,pubkeys[64][33];
|
||||||
if ( didinit == 0 )
|
if ( didinit == 0 )
|
||||||
{
|
{
|
||||||
portable_mutex_init(&KOMODO_KV_mutex);
|
portable_mutex_init(&KOMODO_KV_mutex);
|
||||||
@@ -214,10 +346,15 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar
|
|||||||
komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
|
komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
|
||||||
if ( (fp= fopen(fname,"rb+")) != 0 )
|
if ( (fp= fopen(fname,"rb+")) != 0 )
|
||||||
{
|
{
|
||||||
while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 )
|
if ( (retval= komodo_faststateinit(sp,fname,symbol,dest)) > 0 )
|
||||||
;
|
fseek(fp,0,SEEK_END);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"komodo_faststateinit retval.%d\n",retval);
|
||||||
|
while ( komodo_parsestatefile(sp,fp,symbol,dest) >= 0 )
|
||||||
|
;
|
||||||
|
}
|
||||||
} else fp = fopen(fname,"wb+");
|
} else fp = fopen(fname,"wb+");
|
||||||
printf("fname.(%s) fpos.%ld\n",fname,ftell(fp));
|
|
||||||
KOMODO_INITDONE = (uint32_t)time(NULL);
|
KOMODO_INITDONE = (uint32_t)time(NULL);
|
||||||
}
|
}
|
||||||
if ( height <= 0 )
|
if ( height <= 0 )
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t che
|
|||||||
return(0);
|
return(0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( kmdheight >= 238000 )
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
|
printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
@@ -1036,8 +1036,6 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3
|
|||||||
//printf("komodo_opreturn skip %s\n",ASSETCHAINS_SYMBOL);
|
//printf("komodo_opreturn skip %s\n",ASSETCHAINS_SYMBOL);
|
||||||
return("assetchain");
|
return("assetchain");
|
||||||
}
|
}
|
||||||
//else if ( KOMODO_PAX == 0 )
|
|
||||||
// return("nopax");
|
|
||||||
memset(baseids,0xff,sizeof(baseids));
|
memset(baseids,0xff,sizeof(baseids));
|
||||||
memset(values,0,sizeof(values));
|
memset(values,0,sizeof(values));
|
||||||
memset(srcvalues,0,sizeof(srcvalues));
|
memset(srcvalues,0,sizeof(srcvalues));
|
||||||
@@ -1048,8 +1046,11 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3
|
|||||||
if ( opretbuf[0] == 'K' && opretlen != 40 )
|
if ( opretbuf[0] == 'K' && opretlen != 40 )
|
||||||
{
|
{
|
||||||
komodo_kvupdate(opretbuf,opretlen,value);
|
komodo_kvupdate(opretbuf,opretlen,value);
|
||||||
|
return("kv");
|
||||||
}
|
}
|
||||||
else if ( opretbuf[0] == 'D' )
|
else if ( ASSETCHAINS_SYMBOL[0] == 0 && KOMODO_PAX == 0 )
|
||||||
|
return("nopax");
|
||||||
|
if ( opretbuf[0] == 'D' )
|
||||||
{
|
{
|
||||||
tokomodo = 0;
|
tokomodo = 0;
|
||||||
if ( opretlen == 38 ) // any KMD tx
|
if ( opretlen == 38 ) // any KMD tx
|
||||||
@@ -1148,7 +1149,7 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3
|
|||||||
if ( baseids[i] < 0 )
|
if ( baseids[i] < 0 )
|
||||||
{
|
{
|
||||||
static uint32_t counter;
|
static uint32_t counter;
|
||||||
if ( counter++ < 3 )
|
if ( counter++ < 0 )
|
||||||
printf("%d of %d illegal baseid.%d, this can be ignored\n",i,n,baseids[i]);
|
printf("%d of %d illegal baseid.%d, this can be ignored\n",i,n,baseids[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1351,12 +1352,281 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3
|
|||||||
return(typestr);
|
return(typestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long *fposp,long datalen,char *symbol,char *dest);
|
||||||
|
|
||||||
|
void komodo_stateind_set(struct komodo_state *sp,uint32_t *inds,int32_t n,uint8_t *filedata,long datalen,char *symbol,char *dest)
|
||||||
|
{
|
||||||
|
uint8_t func; long lastK,lastT,lastN,lastV,fpos,lastfpos; int32_t i,count,doissue,iter,numn,numv,numN,numV,numR; uint32_t tmp,prevpos100,offset;
|
||||||
|
count = numR = numN = numV = numn = numv = 0;
|
||||||
|
lastK = lastT = lastN = lastV = -1;
|
||||||
|
for (iter=0; iter<2; iter++)
|
||||||
|
{
|
||||||
|
for (lastfpos=fpos=prevpos100=i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
tmp = inds[i];
|
||||||
|
if ( (i % 100) == 0 )
|
||||||
|
prevpos100 = tmp;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
func = (tmp & 0xff);
|
||||||
|
offset = (tmp >> 8);
|
||||||
|
fpos = prevpos100 + offset;
|
||||||
|
if ( lastfpos >= datalen || (filedata[lastfpos] != func && func != 0) )
|
||||||
|
printf("i.%d/n.%d lastfpos.%ld >= datalen.%ld or [%d] != func.%d\n",i,n,lastfpos,datalen,filedata[lastfpos],func);
|
||||||
|
else if ( iter == 0 )
|
||||||
|
{
|
||||||
|
switch ( func )
|
||||||
|
{
|
||||||
|
default: case 'P': case 'U': case 'D':
|
||||||
|
inds[i] &= 0xffffff00;
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
lastK = lastfpos;
|
||||||
|
inds[i] &= 0xffffff00;
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
lastT = lastfpos;
|
||||||
|
inds[i] &= 0xffffff00;
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
lastN = lastfpos;
|
||||||
|
numN++;
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
lastV = lastfpos;
|
||||||
|
numV++;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
numR++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
doissue = 0;
|
||||||
|
if ( func == 'K' )
|
||||||
|
{
|
||||||
|
if ( lastK == lastfpos )
|
||||||
|
doissue = 1, printf("trigger lastK\n");
|
||||||
|
}
|
||||||
|
else if ( func == 'T' )
|
||||||
|
{
|
||||||
|
if ( lastT == lastfpos )
|
||||||
|
doissue = 1, printf("trigger lastT\n");
|
||||||
|
}
|
||||||
|
else if ( func == 'N' )
|
||||||
|
{
|
||||||
|
if ( numn > numN-128 )
|
||||||
|
doissue = 1;
|
||||||
|
numn++;
|
||||||
|
}
|
||||||
|
else if ( func == 'V' )
|
||||||
|
{
|
||||||
|
if ( KOMODO_PAX != 0 || numv > numV-1440 )
|
||||||
|
doissue = 1;
|
||||||
|
numv++;
|
||||||
|
}
|
||||||
|
else if ( func == 'R' )
|
||||||
|
doissue = 1;
|
||||||
|
if ( doissue != 0 )
|
||||||
|
{
|
||||||
|
//printf("issue %c total.%d lastfpos.%ld\n",func,count,lastfpos);
|
||||||
|
komodo_parsestatefiledata(sp,filedata,&lastfpos,datalen,symbol,dest);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastfpos = fpos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("numR.%d numV.%d numN.%d count.%d\n",numR,numV,numN,count);
|
||||||
|
/*else if ( func == 'K' ) // KMD height: stop after 1st
|
||||||
|
else if ( func == 'T' ) // KMD height+timestamp: stop after 1st
|
||||||
|
|
||||||
|
else if ( func == 'N' ) // notarization, scan backwards 1440+ blocks;
|
||||||
|
else if ( func == 'V' ) // price feed: can stop after 1440+
|
||||||
|
else if ( func == 'R' ) // opreturn:*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void *OS_loadfile(char *fname,uint8_t **bufp,long *lenp,long *allocsizep)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
long filesize,buflen = *allocsizep;
|
||||||
|
uint8_t *buf = *bufp;
|
||||||
|
*lenp = 0;
|
||||||
|
if ( (fp= fopen(fname,"rb")) != 0 )
|
||||||
|
{
|
||||||
|
fseek(fp,0,SEEK_END);
|
||||||
|
filesize = ftell(fp);
|
||||||
|
if ( filesize == 0 )
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
*lenp = 0;
|
||||||
|
printf("OS_loadfile null size.(%s)\n",fname);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if ( filesize > buflen )
|
||||||
|
{
|
||||||
|
*allocsizep = filesize;
|
||||||
|
*bufp = buf = (uint8_t *)realloc(buf,(long)*allocsizep+64);
|
||||||
|
}
|
||||||
|
rewind(fp);
|
||||||
|
if ( buf == 0 )
|
||||||
|
printf("Null buf ???\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( fread(buf,1,(long)filesize,fp) != (unsigned long)filesize )
|
||||||
|
printf("error reading filesize.%ld\n",(long)filesize);
|
||||||
|
buf[filesize] = 0;
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
*lenp = filesize;
|
||||||
|
//printf("loaded.(%s)\n",buf);
|
||||||
|
} //else printf("OS_loadfile couldnt load.(%s)\n",fname);
|
||||||
|
return(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *OS_fileptr(long *allocsizep,char *fname)
|
||||||
|
{
|
||||||
|
long filesize = 0; uint8_t *buf = 0; void *retptr;
|
||||||
|
*allocsizep = 0;
|
||||||
|
retptr = OS_loadfile(fname,&buf,&filesize,allocsizep);
|
||||||
|
return((uint8_t *)retptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
long komodo_stateind_validate(struct komodo_state *sp,char *indfname,uint8_t *filedata,long datalen,uint32_t *prevpos100p,uint32_t *indcounterp,char *symbol,char *dest)
|
||||||
|
{
|
||||||
|
FILE *fp; long fsize,lastfpos=0,fpos=0; uint8_t *inds,func; int32_t i,n; uint32_t offset,tmp,prevpos100 = 0;
|
||||||
|
*indcounterp = *prevpos100p = 0;
|
||||||
|
if ( (inds= OS_fileptr(&fsize,indfname)) != 0 )
|
||||||
|
{
|
||||||
|
lastfpos = 0;
|
||||||
|
fprintf(stderr,"inds.%p validate %s fsize.%ld datalen.%ld n.%ld lastfpos.%ld\n",inds,indfname,fsize,datalen,fsize / sizeof(uint32_t),lastfpos);
|
||||||
|
if ( (fsize % sizeof(uint32_t)) == 0 )
|
||||||
|
{
|
||||||
|
n = (int32_t)(fsize / sizeof(uint32_t));
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
memcpy(&tmp,&inds[i * sizeof(uint32_t)],sizeof(uint32_t));
|
||||||
|
if ( 0 && i > n-10 )
|
||||||
|
printf("%d: tmp.%08x [%c] prevpos100.%u\n",i,tmp,tmp&0xff,prevpos100);
|
||||||
|
if ( (i % 100) == 0 )
|
||||||
|
prevpos100 = tmp;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
func = (tmp & 0xff);
|
||||||
|
offset = (tmp >> 8);
|
||||||
|
fpos = prevpos100 + offset;
|
||||||
|
if ( lastfpos >= datalen || filedata[lastfpos] != func )
|
||||||
|
{
|
||||||
|
printf("validate.%d error (%u %d) prev100 %u -> fpos.%ld datalen.%ld [%d] (%c) vs (%c) lastfpos.%ld\n",i,offset,func,prevpos100,fpos,datalen,lastfpos < datalen ? filedata[lastfpos] : -1,func,filedata[lastfpos],lastfpos);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastfpos = fpos;
|
||||||
|
}
|
||||||
|
*indcounterp = n;
|
||||||
|
*prevpos100p = prevpos100;
|
||||||
|
if ( sp != 0 )
|
||||||
|
komodo_stateind_set(sp,(uint32_t *)inds,n,filedata,fpos,symbol,dest);
|
||||||
|
//printf("free inds.%p %s validated[%d] fpos.%ld datalen.%ld, offset %ld vs fsize.%ld\n",inds,indfname,i,fpos,datalen,i * sizeof(uint32_t),fsize);
|
||||||
|
free(inds);
|
||||||
|
return(fpos);
|
||||||
|
} else printf("wrong filesize %s %ld\n",indfname,fsize);
|
||||||
|
}
|
||||||
|
free(inds);
|
||||||
|
fprintf(stderr,"indvalidate return -1\n");
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
long komodo_indfile_update(FILE *indfp,uint32_t *prevpos100p,long lastfpos,long newfpos,uint8_t func,uint32_t *indcounterp)
|
||||||
|
{
|
||||||
|
uint32_t tmp;
|
||||||
|
if ( indfp != 0 )
|
||||||
|
{
|
||||||
|
tmp = ((uint32_t)(newfpos - *prevpos100p) << 8) | (func & 0xff);
|
||||||
|
if ( ftell(indfp)/sizeof(uint32_t) != *indcounterp )
|
||||||
|
printf("indfp fpos %ld -> ind.%ld vs counter.%u\n",ftell(indfp),ftell(indfp)/sizeof(uint32_t),*indcounterp);
|
||||||
|
//fprintf(stderr,"ftell.%ld indcounter.%u lastfpos.%ld newfpos.%ld func.%02x\n",ftell(indfp),*indcounterp,lastfpos,newfpos,func);
|
||||||
|
fwrite(&tmp,1,sizeof(tmp),indfp), (*indcounterp)++;
|
||||||
|
if ( (*indcounterp % 100) == 0 )
|
||||||
|
{
|
||||||
|
*prevpos100p = (uint32_t)newfpos;
|
||||||
|
fwrite(prevpos100p,1,sizeof(*prevpos100p),indfp), (*indcounterp)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(newfpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t komodo_faststateinit(struct komodo_state *sp,char *fname,char *symbol,char *dest)
|
||||||
|
{
|
||||||
|
FILE *indfp; char indfname[1024]; uint8_t *filedata; long validated=-1,datalen,fpos,lastfpos; uint32_t tmp,prevpos100,indcounter,starttime; int32_t func,finished = 0;
|
||||||
|
starttime = (uint32_t)time(NULL);
|
||||||
|
safecopy(indfname,fname,sizeof(indfname)-4);
|
||||||
|
strcat(indfname,".ind");
|
||||||
|
if ( (filedata= OS_fileptr(&datalen,fname)) != 0 )
|
||||||
|
{
|
||||||
|
if ( 1 )//datalen >= (1LL << 32) || GetArg("-genind",0) != 0 || (validated= komodo_stateind_validate(0,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest)) < 0 )
|
||||||
|
{
|
||||||
|
lastfpos = fpos = 0;
|
||||||
|
indcounter = prevpos100 = 0;
|
||||||
|
if ( (indfp= fopen(indfname,"wb")) != 0 )
|
||||||
|
fwrite(&prevpos100,1,sizeof(prevpos100),indfp), indcounter++;
|
||||||
|
fprintf(stderr,"processing %s %ldKB, validated.%ld\n",fname,datalen/1024,validated);
|
||||||
|
while ( (func= komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest)) >= 0 )
|
||||||
|
{
|
||||||
|
lastfpos = komodo_indfile_update(indfp,&prevpos100,lastfpos,fpos,func,&indcounter);
|
||||||
|
}
|
||||||
|
if ( indfp != 0 )
|
||||||
|
{
|
||||||
|
fclose(indfp);
|
||||||
|
if ( (fpos= komodo_stateind_validate(0,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest)) < 0 )
|
||||||
|
printf("unexpected komodostate.ind validate failure %s datalen.%ld\n",indfname,datalen);
|
||||||
|
else printf("%s validated fpos.%ld\n",indfname,fpos);
|
||||||
|
}
|
||||||
|
finished = 1;
|
||||||
|
fprintf(stderr,"took %d seconds to process %s %ldKB\n",(int32_t)(time(NULL)-starttime),fname,datalen/1024);
|
||||||
|
}
|
||||||
|
else if ( validated > 0 )
|
||||||
|
{
|
||||||
|
if ( (indfp= fopen(indfname,"rb+")) != 0 )
|
||||||
|
{
|
||||||
|
lastfpos = fpos = validated;
|
||||||
|
fprintf(stderr,"datalen.%ld validated %ld -> indcounter %u, prevpos100 %u offset.%ld\n",datalen,validated,indcounter,prevpos100,indcounter * sizeof(uint32_t));
|
||||||
|
if ( fpos < datalen )
|
||||||
|
{
|
||||||
|
fseek(indfp,indcounter * sizeof(uint32_t),SEEK_SET);
|
||||||
|
if ( ftell(indfp) == indcounter * sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
while ( (func= komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest)) >= 0 )
|
||||||
|
{
|
||||||
|
lastfpos = komodo_indfile_update(indfp,&prevpos100,lastfpos,fpos,func,&indcounter);
|
||||||
|
if ( lastfpos != fpos )
|
||||||
|
fprintf(stderr,"unexpected lastfpos.%ld != %ld\n",lastfpos,fpos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(indfp);
|
||||||
|
}
|
||||||
|
if ( komodo_stateind_validate(sp,indfname,filedata,datalen,&prevpos100,&indcounter,symbol,dest) < 0 )
|
||||||
|
printf("unexpected komodostate.ind validate failure %s datalen.%ld\n",indfname,datalen);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s validated updated from validated.%ld to %ld new.[%ld] -> indcounter %u, prevpos100 %u offset.%ld | elapsed %d seconds\n",indfname,validated,fpos,fpos-validated,indcounter,prevpos100,indcounter * sizeof(uint32_t),(int32_t)(time(NULL) - starttime));
|
||||||
|
finished = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else printf("komodo_faststateinit unexpected case\n");
|
||||||
|
free(filedata);
|
||||||
|
return(finished == 1);
|
||||||
|
}
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
void komodo_passport_iteration()
|
void komodo_passport_iteration()
|
||||||
{
|
{
|
||||||
static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime,callcounter;
|
static long lastpos[34]; static char userpass[33][1024]; static uint32_t lasttime,callcounter;
|
||||||
int32_t maxseconds = 10;
|
int32_t maxseconds = 10;
|
||||||
FILE *fp; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
|
FILE *fp; uint8_t *filedata; long fpos,datalen,lastfpos; int32_t baseid,limit,n,ht,isrealtime,expired,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3],starttime; cJSON *infoobj,*result; uint64_t RTmask = 0;
|
||||||
//printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
|
|
||||||
expired = 0;
|
expired = 0;
|
||||||
while ( KOMODO_INITDONE == 0 )
|
while ( KOMODO_INITDONE == 0 )
|
||||||
{
|
{
|
||||||
@@ -1388,13 +1658,7 @@ void komodo_passport_iteration()
|
|||||||
starttime = (uint32_t)time(NULL);
|
starttime = (uint32_t)time(NULL);
|
||||||
if ( callcounter++ < 1 )
|
if ( callcounter++ < 1 )
|
||||||
limit = 10000;
|
limit = 10000;
|
||||||
if ( 0 && starttime == lasttime )
|
|
||||||
{
|
|
||||||
usleep(1000);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
lasttime = starttime;
|
lasttime = starttime;
|
||||||
//printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
|
|
||||||
for (baseid=32; baseid>=0; baseid--)
|
for (baseid=32; baseid>=0; baseid--)
|
||||||
{
|
{
|
||||||
if ( time(NULL) >= starttime+maxseconds )
|
if ( time(NULL) >= starttime+maxseconds )
|
||||||
@@ -1402,18 +1666,31 @@ void komodo_passport_iteration()
|
|||||||
sp = 0;
|
sp = 0;
|
||||||
isrealtime = 0;
|
isrealtime = 0;
|
||||||
base = (char *)CURRENCIES[baseid];
|
base = (char *)CURRENCIES[baseid];
|
||||||
if ( baseid+1 != refid )
|
//printf("PASSPORT %s baseid+1 %d refid.%d\n",ASSETCHAINS_SYMBOL,baseid+1,refid);
|
||||||
|
if ( baseid+1 != refid ) // only need to import state from a different coin
|
||||||
{
|
{
|
||||||
if ( baseid == 32 || ASSETCHAINS_SYMBOL[0] == 0 )
|
if ( baseid == 32 ) // only care about KMD's state
|
||||||
{
|
{
|
||||||
refsp->RTmask &= ~(1LL << baseid);
|
refsp->RTmask &= ~(1LL << baseid);
|
||||||
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
|
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
|
||||||
komodo_nameset(symbol,dest,base);
|
komodo_nameset(symbol,dest,base);
|
||||||
sp = komodo_stateptrget(symbol);
|
sp = komodo_stateptrget(symbol);
|
||||||
n = 0;
|
n = 0;
|
||||||
if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
|
if ( lastpos[baseid] == 0 && (filedata= OS_fileptr(&datalen,fname)) != 0 )
|
||||||
|
{
|
||||||
|
fpos = 0;
|
||||||
|
fprintf(stderr,"%s processing %s %ldKB\n",ASSETCHAINS_SYMBOL,fname,datalen/1024);
|
||||||
|
while ( komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest) >= 0 )
|
||||||
|
lastfpos = fpos;
|
||||||
|
fprintf(stderr,"%s took %d seconds to process %s %ldKB\n",ASSETCHAINS_SYMBOL,(int32_t)(time(NULL)-starttime),fname,datalen/1024);
|
||||||
|
lastpos[baseid] = lastfpos;
|
||||||
|
free(filedata), filedata = 0;
|
||||||
|
datalen = 0;
|
||||||
|
}
|
||||||
|
else if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
|
||||||
{
|
{
|
||||||
fseek(fp,0,SEEK_END);
|
fseek(fp,0,SEEK_END);
|
||||||
|
//fprintf(stderr,"couldnt OS_fileptr(%s), freading %ldKB\n",fname,ftell(fp)/1024);
|
||||||
if ( ftell(fp) > lastpos[baseid] )
|
if ( ftell(fp) > lastpos[baseid] )
|
||||||
{
|
{
|
||||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
@@ -1434,11 +1711,11 @@ void komodo_passport_iteration()
|
|||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
lastpos[baseid] = ftell(fp);
|
lastpos[baseid] = ftell(fp);
|
||||||
if ( lastpos[baseid] == 0 && strcmp(symbol,"KMD") == 0 )
|
if ( 0 && lastpos[baseid] == 0 && strcmp(symbol,"KMD") == 0 )
|
||||||
printf("from.(%s) lastpos[%s] %ld isrt.%d\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid],komodo_isrealtime(&ht));
|
printf("from.(%s) lastpos[%s] %ld isrt.%d\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid],komodo_isrealtime(&ht));
|
||||||
} //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
|
} //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
} //else printf("error.(%s) %p\n",fname,sp);
|
} else fprintf(stderr,"load error.(%s) %p\n",fname,sp);
|
||||||
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
|
komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
|
||||||
if ( (fp= fopen(fname,"rb")) != 0 )
|
if ( (fp= fopen(fname,"rb")) != 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,9 +16,11 @@
|
|||||||
#define SATOSHIDEN ((uint64_t)100000000L)
|
#define SATOSHIDEN ((uint64_t)100000000L)
|
||||||
#define dstr(x) ((double)(x) / SATOSHIDEN)
|
#define dstr(x) ((double)(x) / SATOSHIDEN)
|
||||||
|
|
||||||
|
#define KOMODO_ENDOFERA 7777777
|
||||||
#define KOMODO_INTEREST ((uint64_t)(0.05 * COIN)) // 5%
|
#define KOMODO_INTEREST ((uint64_t)(0.05 * COIN)) // 5%
|
||||||
int64_t MAX_MONEY = 200000000 * 100000000LL;
|
int64_t MAX_MONEY = 200000000 * 100000000LL;
|
||||||
|
|
||||||
|
#ifdef notanymore
|
||||||
uint64_t komodo_earned_interest(int32_t height,int64_t paidinterest)
|
uint64_t komodo_earned_interest(int32_t height,int64_t paidinterest)
|
||||||
{
|
{
|
||||||
static uint64_t *interests; static int32_t maxheight;
|
static uint64_t *interests; static int32_t maxheight;
|
||||||
@@ -73,6 +75,7 @@ uint64_t komodo_moneysupply(int32_t height)
|
|||||||
return(0);
|
return(0);
|
||||||
else return(COIN * 100000000 + (height-1) * 3 + komodo_earned_interest(height,-1));
|
else return(COIN * 100000000 + (height-1) * 3 + komodo_earned_interest(height,-1));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint64_t _komodo_interestnew(uint64_t nValue,uint32_t nLockTime,uint32_t tiptime)
|
uint64_t _komodo_interestnew(uint64_t nValue,uint32_t nLockTime,uint32_t tiptime)
|
||||||
{
|
{
|
||||||
@@ -90,7 +93,7 @@ uint64_t _komodo_interestnew(uint64_t nValue,uint32_t nLockTime,uint32_t tiptime
|
|||||||
uint64_t komodo_interestnew(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime)
|
uint64_t komodo_interestnew(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime)
|
||||||
{
|
{
|
||||||
uint64_t interest = 0;
|
uint64_t interest = 0;
|
||||||
if ( txheight < 7777777 && komodo_moneysupply(txheight) < MAX_MONEY && nLockTime >= LOCKTIME_THRESHOLD && tiptime != 0 && nLockTime < tiptime && nValue >= 10*COIN )
|
if ( txheight < KOMODO_ENDOFERA && nLockTime >= LOCKTIME_THRESHOLD && tiptime != 0 && nLockTime < tiptime && nValue >= 10*COIN ) //komodo_moneysupply(txheight) < MAX_MONEY &&
|
||||||
interest = _komodo_interestnew(nValue,nLockTime,tiptime);
|
interest = _komodo_interestnew(nValue,nLockTime,tiptime);
|
||||||
return(interest);
|
return(interest);
|
||||||
}
|
}
|
||||||
@@ -101,9 +104,9 @@ uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uin
|
|||||||
activation = 1491350400; // 1491350400 5th April
|
activation = 1491350400; // 1491350400 5th April
|
||||||
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
if ( ASSETCHAINS_SYMBOL[0] != 0 )
|
||||||
return(0);
|
return(0);
|
||||||
if ( txheight >= 7777777 )
|
if ( txheight >= KOMODO_ENDOFERA )
|
||||||
return(0);
|
return(0);
|
||||||
if ( komodo_moneysupply(txheight) < MAX_MONEY && nLockTime >= LOCKTIME_THRESHOLD && tiptime != 0 && nLockTime < tiptime && nValue >= 10*COIN )
|
if ( nLockTime >= LOCKTIME_THRESHOLD && tiptime != 0 && nLockTime < tiptime && nValue >= 10*COIN ) //komodo_moneysupply(txheight) < MAX_MONEY &&
|
||||||
{
|
{
|
||||||
if ( (minutes= (tiptime - nLockTime) / 60) >= 60 )
|
if ( (minutes= (tiptime - nLockTime) / 60) >= 60 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ void komodo_kvupdate(uint8_t *opretbuf,int32_t opretlen,uint64_t value)
|
|||||||
if ( keylen+13 > opretlen )
|
if ( keylen+13 > opretlen )
|
||||||
{
|
{
|
||||||
static uint32_t counter;
|
static uint32_t counter;
|
||||||
if ( counter++ < 3 )
|
if ( ++counter < 1 )
|
||||||
printf("komodo_kvupdate: keylen.%d + 13 > opretlen.%d, this can be ignored\n",keylen,opretlen);
|
printf("komodo_kvupdate: keylen.%d + 13 > opretlen.%d, this can be ignored\n",keylen,opretlen);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1490,7 +1490,7 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t komodo_moneysupply(int32_t height);
|
//uint64_t komodo_moneysupply(int32_t height);
|
||||||
extern char ASSETCHAINS_SYMBOL[16];
|
extern char ASSETCHAINS_SYMBOL[16];
|
||||||
extern uint32_t ASSETCHAINS_MAGIC;
|
extern uint32_t ASSETCHAINS_MAGIC;
|
||||||
extern uint64_t ASSETCHAINS_SUPPLY;
|
extern uint64_t ASSETCHAINS_SUPPLY;
|
||||||
@@ -1502,7 +1502,7 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
|
|||||||
{
|
{
|
||||||
if ( nHeight == 1 )
|
if ( nHeight == 1 )
|
||||||
return(100000000 * COIN); // ICO allocation
|
return(100000000 * COIN); // ICO allocation
|
||||||
else if ( komodo_moneysupply(nHeight) < MAX_MONEY )
|
else if ( nHeight < KOMODO_ENDOFERA ) //komodo_moneysupply(nHeight) < MAX_MONEY )
|
||||||
return(3 * COIN);
|
return(3 * COIN);
|
||||||
else return(0);
|
else return(0);
|
||||||
}
|
}
|
||||||
@@ -2365,8 +2365,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|||||||
return false;
|
return false;
|
||||||
control.Add(vChecks);
|
control.Add(vChecks);
|
||||||
}
|
}
|
||||||
if ( ASSETCHAINS_SYMBOL[0] == 0 )
|
//if ( ASSETCHAINS_SYMBOL[0] == 0 )
|
||||||
komodo_earned_interest(pindex->nHeight,sum);
|
// komodo_earned_interest(pindex->nHeight,sum);
|
||||||
CTxUndo undoDummy;
|
CTxUndo undoDummy;
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
blockundo.vtxundo.push_back(CTxUndo());
|
blockundo.vtxundo.push_back(CTxUndo());
|
||||||
|
|||||||
5
src/purge
Executable file
5
src/purge
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
rm -rf ~/.komodo/$1/chainstate
|
||||||
|
rm -rf ~/.komodo/$1/database
|
||||||
|
rm -rf ~/.komodo/$1/blocks
|
||||||
|
rm -rf ~/.komodo/$1/komodostate
|
||||||
|
|
||||||
@@ -480,6 +480,7 @@ uint64_t PAX_fiatdest(uint64_t *seedp,int32_t tokomodo,char *destaddr,uint8_t pu
|
|||||||
int32_t komodo_opreturnscript(uint8_t *script,uint8_t type,uint8_t *opret,int32_t opretlen);
|
int32_t komodo_opreturnscript(uint8_t *script,uint8_t type,uint8_t *opret,int32_t opretlen);
|
||||||
#define CRYPTO777_KMDADDR "RXL3YXG2ceaB6C5hfJcN4fvmLH2C34knhA"
|
#define CRYPTO777_KMDADDR "RXL3YXG2ceaB6C5hfJcN4fvmLH2C34knhA"
|
||||||
extern char ASSETCHAINS_SYMBOL[16];
|
extern char ASSETCHAINS_SYMBOL[16];
|
||||||
|
extern int32_t KOMODO_PAX;
|
||||||
int32_t komodo_is_issuer();
|
int32_t komodo_is_issuer();
|
||||||
int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp);
|
int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp);
|
||||||
int32_t komodo_isrealtime(int32_t *kmdheightp);
|
int32_t komodo_isrealtime(int32_t *kmdheightp);
|
||||||
@@ -612,6 +613,8 @@ UniValue paxdeposit(const UniValue& params, bool fHelp)
|
|||||||
{
|
{
|
||||||
uint64_t available,deposited,issued,withdrawn,approved,redeemed,seed,komodoshis = 0; int32_t height; char destaddr[64]; uint8_t i,pubkey37[33];
|
uint64_t available,deposited,issued,withdrawn,approved,redeemed,seed,komodoshis = 0; int32_t height; char destaddr[64]; uint8_t i,pubkey37[33];
|
||||||
bool fSubtractFeeFromAmount = false;
|
bool fSubtractFeeFromAmount = false;
|
||||||
|
if ( KOMODO_PAX == 0 )
|
||||||
|
throw JSONRPCError(RPC_TYPE_ERROR, "paxdeposit disabled, since pax not enabled with komodod -pax");
|
||||||
if ( komodo_is_issuer() != 0 )
|
if ( komodo_is_issuer() != 0 )
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "paxdeposit only from KMD");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "paxdeposit only from KMD");
|
||||||
if (!EnsureWalletIsAvailable(fHelp))
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
|||||||
Reference in New Issue
Block a user