|
|
@ -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);
|
|
|
|
return("assetchain"); |
|
|
|
} |
|
|
|
//else if ( KOMODO_PAX == 0 )
|
|
|
|
// return("nopax");
|
|
|
|
memset(baseids,0xff,sizeof(baseids)); |
|
|
|
memset(values,0,sizeof(values)); |
|
|
|
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 ) |
|
|
|
{ |
|
|
|
komodo_kvupdate(opretbuf,opretlen,value); |
|
|
|
return("kv"); |
|
|
|
} |
|
|
|
else if ( opretbuf[0] == 'D' ) |
|
|
|
else if ( KOMODO_PAX == 0 ) |
|
|
|
return("nopax"); |
|
|
|
if ( opretbuf[0] == 'D' ) |
|
|
|
{ |
|
|
|
tokomodo = 0; |
|
|
|
if ( opretlen == 38 ) // any KMD tx
|
|
|
@ -1355,9 +1356,123 @@ int32_t komodo_parsestatefiledata(struct komodo_state *sp,uint8_t *filedata,long |
|
|
|
|
|
|
|
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 fpos; |
|
|
|
//komodo_parsestatefiledata(sp,filedata,&fpos,datalen,symbol,dest);
|
|
|
|
// scan backwards to set all the sp-> fields to the current valid value
|
|
|
|
uint8_t func; long lastK,lastT,lastN,lastV,fpos=0,lastfpos=0; int32_t i,count,doissue,iter,numn,numv,numN,numV; uint32_t tmp,prevpos100; |
|
|
|
count = numN = numV = numn = numv = 0; |
|
|
|
lastK = lastT = lastN = lastV; |
|
|
|
for (iter=0; iter<2; iter++) |
|
|
|
{ |
|
|
|
for (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 ) |
|
|
|
printf("lastfpos.%ld >= datalen.%ld or [%d] != fund.%d\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': 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 ( 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; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
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:
|
|
|
|
{ |
|
|
|
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);
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void *OS_loadfile(char *fname,uint8_t **bufp,long *lenp,long *allocsizep) |
|
|
@ -1459,7 +1574,7 @@ long komodo_indfile_update(FILE *indfp,uint32_t *prevpos100p,long lastfpos,long |
|
|
|
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); |
|
|
|
//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 ) |
|
|
|
{ |
|
|
|