Remove unused code
This commit is contained in:
@@ -79,102 +79,15 @@ struct pax_transaction *hush_paxmark(int32_t height,uint256 txid,uint16_t vout,u
|
||||
|
||||
void hush_paxdelete(struct pax_transaction *pax)
|
||||
{
|
||||
return; // breaks when out of order
|
||||
pthread_mutex_lock(&hush_mutex);
|
||||
HASH_DELETE(hh,PAX,pax);
|
||||
pthread_mutex_unlock(&hush_mutex);
|
||||
}
|
||||
|
||||
void hush_gateway_deposit(char *coinaddr,uint64_t value,char *symbol,uint64_t fiatoshis,uint8_t *rmd160,uint256 txid,uint16_t vout,uint8_t type,int32_t height,int32_t otherheight,char *source,int32_t approved) // assetchain context
|
||||
{
|
||||
struct pax_transaction *pax; uint8_t buf[35]; int32_t addflag = 0; struct hush_state *sp; char str[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN],*s;
|
||||
//if ( HUSH_PAX == 0 )
|
||||
// return;
|
||||
//if ( strcmp(symbol,SMART_CHAIN_SYMBOL) != 0 )
|
||||
// return;
|
||||
sp = hush_stateptr(str,dest);
|
||||
pthread_mutex_lock(&hush_mutex);
|
||||
pax_keyset(buf,txid,vout,type);
|
||||
HASH_FIND(hh,PAX,buf,sizeof(buf),pax);
|
||||
if ( pax == 0 )
|
||||
{
|
||||
pax = (struct pax_transaction *)calloc(1,sizeof(*pax));
|
||||
pax->txid = txid;
|
||||
pax->vout = vout;
|
||||
pax->type = type;
|
||||
memcpy(pax->buf,buf,sizeof(pax->buf));
|
||||
HASH_ADD_KEYPTR(hh,PAX,pax->buf,sizeof(pax->buf),pax);
|
||||
addflag = 1;
|
||||
if ( 0 && SMART_CHAIN_SYMBOL[0] == 0 )
|
||||
{
|
||||
int32_t i; for (i=0; i<32; i++)
|
||||
printf("%02x",((uint8_t *)&txid)[i]);
|
||||
printf(" v.%d [%s] kht.%d ht.%d create pax.%p symbol.%s source.%s\n",vout,SMART_CHAIN_SYMBOL,height,otherheight,pax,symbol,source);
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&hush_mutex);
|
||||
if ( coinaddr != 0 )
|
||||
{
|
||||
strcpy(pax->coinaddr,coinaddr);
|
||||
if ( value != 0 )
|
||||
pax->puposhis = value;
|
||||
if ( symbol != 0 )
|
||||
strcpy(pax->symbol,symbol);
|
||||
if ( source != 0 )
|
||||
strcpy(pax->source,source);
|
||||
if ( fiatoshis != 0 )
|
||||
pax->fiatoshis = fiatoshis;
|
||||
if ( rmd160 != 0 )
|
||||
memcpy(pax->rmd160,rmd160,20);
|
||||
if ( height != 0 )
|
||||
pax->height = height;
|
||||
if ( otherheight != 0 )
|
||||
pax->otherheight = otherheight;
|
||||
}
|
||||
else
|
||||
{
|
||||
pax->marked = height;
|
||||
//printf("pax.%p MARK DEPOSIT ht.%d other.%d\n",pax,height,otherheight);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t hush_rwapproval(int32_t rwflag,uint8_t *opretbuf,struct pax_transaction *pax)
|
||||
{
|
||||
int32_t i,len = 0;
|
||||
if ( rwflag == 1 )
|
||||
{
|
||||
for (i=0; i<32; i++)
|
||||
opretbuf[len++] = ((uint8_t *)&pax->txid)[i];
|
||||
opretbuf[len++] = pax->vout & 0xff;
|
||||
opretbuf[len++] = (pax->vout >> 8) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0; i<32; i++)
|
||||
((uint8_t *)&pax->txid)[i] = opretbuf[len++];
|
||||
//for (i=0; i<32; i++)
|
||||
// printf("%02x",((uint8_t *)&pax->txid)[31-i]);
|
||||
pax->vout = opretbuf[len++];
|
||||
pax->vout += ((uint32_t)opretbuf[len++] << 8);
|
||||
//printf(" txid v.%d\n",pax->vout);
|
||||
}
|
||||
len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->puposhis),&pax->puposhis);
|
||||
len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->fiatoshis),&pax->fiatoshis);
|
||||
len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->height),&pax->height);
|
||||
len += dragon_rwnum(rwflag,&opretbuf[len],sizeof(pax->otherheight),&pax->otherheight);
|
||||
if ( rwflag != 0 )
|
||||
{
|
||||
memcpy(&opretbuf[len],pax->rmd160,20), len += 20;
|
||||
for (i=0; i<4; i++)
|
||||
opretbuf[len++] = pax->source[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(pax->rmd160,&opretbuf[len],20), len += 20;
|
||||
for (i=0; i<4; i++)
|
||||
pax->source[i] = opretbuf[len++];
|
||||
}
|
||||
return(len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t hush_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *hushheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
|
||||
@@ -184,135 +97,12 @@ int32_t hush_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *
|
||||
|
||||
int32_t hush_paxcmp(char *symbol,int32_t hushheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
|
||||
{
|
||||
int32_t ratio;
|
||||
if ( seed == 0 && checkvalue != 0 )
|
||||
{
|
||||
ratio = ((value << 6) / checkvalue);
|
||||
if ( ratio >= 60 && ratio <= 67 )
|
||||
return(0);
|
||||
else
|
||||
{
|
||||
if ( SMART_CHAIN_SYMBOL[0] != 0 )
|
||||
printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",hushheight,symbol,(long long)value,(long long)checkvalue,ratio);
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
else if ( checkvalue != 0 )
|
||||
{
|
||||
ratio = ((value << 10) / checkvalue);
|
||||
if ( ratio >= 1023 && ratio <= 1025 )
|
||||
return(0);
|
||||
}
|
||||
return(value != checkvalue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t hush_paxtotal()
|
||||
{
|
||||
struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct hush_state *basesp;
|
||||
if ( HUSH_PASSPORT_INITDONE == 0 ) //HUSH_PAX == 0 ||
|
||||
return(0);
|
||||
if ( hush_isrealtime(&ht) == 0 )
|
||||
return(0);
|
||||
else
|
||||
{
|
||||
HASH_ITER(hh,PAX,pax,tmp)
|
||||
{
|
||||
if ( pax->marked != 0 )
|
||||
continue;
|
||||
if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
|
||||
str = pax->symbol;
|
||||
else str = pax->source;
|
||||
basesp = hush_stateptrget(str);
|
||||
if ( basesp != 0 && pax->didstats == 0 )
|
||||
{
|
||||
if ( pax->type == 'I' && (pax2= hush_paxfind(pax->txid,pax->vout,'D')) != 0 )
|
||||
{
|
||||
if ( pax2->fiatoshis != 0 )
|
||||
{
|
||||
pax->puposhis = pax2->puposhis;
|
||||
pax->fiatoshis = pax2->fiatoshis;
|
||||
basesp->issued += pax->fiatoshis;
|
||||
pax->didstats = 1;
|
||||
if ( strcmp(str,SMART_CHAIN_SYMBOL) == 0 )
|
||||
printf("########### %p issued %s += %.8f hushheight.%d %.8f other.%d\n",basesp,str,dstr(pax->fiatoshis),pax->height,dstr(pax->puposhis),pax->otherheight);
|
||||
pax2->marked = pax->height;
|
||||
pax->marked = pax->height;
|
||||
}
|
||||
}
|
||||
else if ( pax->type == 'W' )
|
||||
{
|
||||
//bitcoin_address(coinaddr,addrtype,rmd160,20);
|
||||
if ( (checktoshis= hush_paxprice(&seed,pax->height,pax->source,(char *)"HUSH3",(uint64_t)pax->fiatoshis)) != 0 )
|
||||
{
|
||||
if ( hush_paxcmp(pax->source,pax->height,pax->puposhis,checktoshis,seed) != 0 )
|
||||
{
|
||||
pax->marked = pax->height;
|
||||
//printf("WITHDRAW.%s mark <- %d %.8f != %.8f\n",pax->source,pax->height,dstr(checktoshis),dstr(pax->puposhis));
|
||||
}
|
||||
else if ( pax->validated == 0 )
|
||||
{
|
||||
pax->validated = pax->puposhis = checktoshis;
|
||||
//int32_t j; for (j=0; j<32; j++)
|
||||
// printf("%02x",((uint8_t *)&pax->txid)[j]);
|
||||
//if ( strcmp(str,SMART_CHAIN_SYMBOL) == 0 )
|
||||
// printf(" v%d %p got WITHDRAW.%s HUSH3.%d ht.%d %.8f -> %.8f/%.8f\n",pax->vout,pax,pax->source,pax->height,pax->otherheight,dstr(pax->fiatoshis),dstr(pax->puposhis),dstr(checktoshis));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
hush_stateptr(symbol,dest);
|
||||
HASH_ITER(hh,PAX,pax,tmp)
|
||||
{
|
||||
pax->ready = 0;
|
||||
if ( 0 && pax->type == 'A' )
|
||||
printf("%p pax.%s <- %s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->symbol,pax->source,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
|
||||
if ( pax->marked != 0 )
|
||||
continue;
|
||||
if ( strcmp(symbol,pax->symbol) == 0 || pax->type == 'A' )
|
||||
{
|
||||
if ( pax->marked == 0 )
|
||||
{
|
||||
if ( hush_is_issuer() != 0 )
|
||||
{
|
||||
if ( pax->validated != 0 && pax->type == 'D' )
|
||||
{
|
||||
total += pax->fiatoshis;
|
||||
pax->ready = 1;
|
||||
}
|
||||
}
|
||||
else if ( pax->approved != 0 && pax->type == 'A' )
|
||||
{
|
||||
if ( pax->validated != 0 )
|
||||
{
|
||||
total += pax->puposhis;
|
||||
pax->ready = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
seed = 0;
|
||||
checktoshis = hush_paxprice(&seed,pax->height,pax->source,(char *)"HUSH3",(uint64_t)pax->fiatoshis);
|
||||
//printf("paxtotal PAX_fiatdest ht.%d price %s %.8f -> HUSH %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->puposhis/COIN,(double)checktoshis/COIN);
|
||||
//printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->puposhis),pax->height,pax->otherheight);
|
||||
if ( seed != 0 && checktoshis != 0 )
|
||||
{
|
||||
if ( checktoshis == pax->puposhis )
|
||||
{
|
||||
total += pax->puposhis;
|
||||
pax->validated = pax->puposhis;
|
||||
pax->ready = 1;
|
||||
} else pax->marked = pax->height;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( 0 && pax->ready != 0 )
|
||||
printf("%p (%c) pax.%s marked.%d %.8f -> %.8f validated.%d approved.%d ready.%d ht.%d\n",pax,pax->type,pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0,pax->ready,pax->height);
|
||||
}
|
||||
}
|
||||
}
|
||||
//printf("paxtotal %.8f\n",dstr(total));
|
||||
return(total);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int _paxorder(const void *a,const void *b)
|
||||
@@ -382,150 +172,6 @@ int32_t hush_pending_withdraws(char *opretstr) // todo: enforce deterministic or
|
||||
|
||||
int32_t hush_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
|
||||
{
|
||||
struct pax_transaction *pax,*tmp; char symbol[HUSH_SMART_CHAIN_MAXLEN],dest[HUSH_SMART_CHAIN_MAXLEN]; uint8_t *script,opcode,opret[16384*4],data[16384*4]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct hush_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask,sum = 0;
|
||||
if ( HUSH_PASSPORT_INITDONE == 0 )//HUSH_PAX == 0 ||
|
||||
return(0);
|
||||
struct hush_state *hushsp = hush_stateptrget((char *)"HUSH3");
|
||||
sp = hush_stateptr(symbol,dest);
|
||||
strcpy(symbol,base);
|
||||
if ( SMART_CHAIN_SYMBOL[0] != 0 && hush_baseid(SMART_CHAIN_SYMBOL) < 0 )
|
||||
return(0);
|
||||
PENDING_HUSH_TX = 0;
|
||||
for (i=0; i<3; i++)
|
||||
{
|
||||
if ( hush_isrealtime(&ht) != 0 )
|
||||
break;
|
||||
sleep(1);
|
||||
}
|
||||
if ( i == 3 )
|
||||
{
|
||||
if ( tokomodo == 0 )
|
||||
printf("%s not realtime ht.%d\n",SMART_CHAIN_SYMBOL,ht);
|
||||
return(0);
|
||||
}
|
||||
if ( tokomodo == 0 )
|
||||
{
|
||||
opcode = 'I';
|
||||
}
|
||||
else
|
||||
{
|
||||
opcode = 'X';
|
||||
if ( 1 || hush_paxtotal() == 0 )
|
||||
return(0);
|
||||
}
|
||||
HASH_ITER(hh,PAX,pax,tmp)
|
||||
{
|
||||
if ( pax->type != 'D' && pax->type != 'A' )
|
||||
continue;
|
||||
{
|
||||
#ifdef HUSH_SMART_CHAINS_WAITNOTARIZE
|
||||
if ( pax->height > 236000 )
|
||||
{
|
||||
if ( hushsp != 0 && hushsp->NOTARIZED_HEIGHT >= pax->height )
|
||||
pax->validated = pax->puposhis;
|
||||
else if ( hushsp->CURRENT_HEIGHT > pax->height+30 )
|
||||
pax->validated = pax->ready = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( hushsp != 0 && (hushsp->NOTARIZED_HEIGHT >= pax->height || hushsp->CURRENT_HEIGHT > pax->height+30) ) // assumes same chain as notarize
|
||||
pax->validated = pax->puposhis;
|
||||
else pax->validated = pax->ready = 0;
|
||||
}
|
||||
#else
|
||||
pax->validated = pax->puposhis;
|
||||
#endif
|
||||
}
|
||||
if ( SMART_CHAIN_SYMBOL[0] != 0 && (pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis) )
|
||||
{
|
||||
//if ( pax->height > 214700 || strcmp(SMART_CHAIN_SYMBOL,symbol) == 0 )
|
||||
// printf("miner.[%s]: skip %s %.8f when avail %.8f deposited %.8f, issued %.8f withdrawn %.8f approved %.8f redeemed %.8f\n",SMART_CHAIN_SYMBOL,symbol,dstr(pax->fiatoshis),dstr(available),dstr(deposited),dstr(issued),dstr(withdrawn),dstr(approved),dstr(redeemed));
|
||||
continue;
|
||||
}
|
||||
/*printf("pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d\n",pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0);
|
||||
if ( pax->marked != 0 || (pax->type != 'D' && pax->type != 'A') || pax->ready == 0 )
|
||||
{
|
||||
printf("reject 2\n");
|
||||
continue;
|
||||
}*/
|
||||
if ( SMART_CHAIN_SYMBOL[0] != 0 && (strcmp(pax->symbol,symbol) != 0 || pax->validated == 0 || pax->ready == 0) )
|
||||
{
|
||||
if ( strcmp(pax->symbol,SMART_CHAIN_SYMBOL) == 0 )
|
||||
printf("pax->symbol.%s != %s or null pax->validated %.8f ready.%d ht.(%d %d)\n",pax->symbol,symbol,dstr(pax->validated),pax->ready,hushsp->CURRENT_HEIGHT,pax->height);
|
||||
pax->marked = pax->height;
|
||||
continue;
|
||||
}
|
||||
if ( pax->ready == 0 )
|
||||
continue;
|
||||
if ( pax->type == 'A' && SMART_CHAIN_SYMBOL[0] == 0 )
|
||||
{
|
||||
if ( hushsp != 0 )
|
||||
{
|
||||
if ( (baseid= hush_baseid(pax->symbol)) < 0 || ((1LL << baseid) & sp->RTmask) == 0 )
|
||||
{
|
||||
printf("not RT for (%s) %llx baseid.%d %llx\n",pax->symbol,(long long)sp->RTmask,baseid,(long long)(1LL<<baseid));
|
||||
continue;
|
||||
}
|
||||
} else continue;
|
||||
}
|
||||
|
||||
//printf("redeem.%d? (%c) %p pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d approved.%d\n",tokomodo,pax->type,pax,pax->symbol,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0,pax->approved!=0);
|
||||
if ( 0 && SMART_CHAIN_SYMBOL[0] != 0 )
|
||||
printf("pax.%s marked.%d %.8f -> %.8f\n",SMART_CHAIN_SYMBOL,pax->marked,dstr(pax->puposhis),dstr(pax->fiatoshis));
|
||||
if ( opcode == 'I' )
|
||||
{
|
||||
sum += pax->fiatoshis;
|
||||
if ( sum > available )
|
||||
break;
|
||||
}
|
||||
txNew->vout.resize(numvouts+1);
|
||||
txNew->vout[numvouts].nValue = (opcode == 'I') ? pax->fiatoshis : pax->puposhis;
|
||||
txNew->vout[numvouts].scriptPubKey.resize(25);
|
||||
script = (uint8_t *)&txNew->vout[numvouts].scriptPubKey[0];
|
||||
*script++ = 0x76;
|
||||
*script++ = 0xa9;
|
||||
*script++ = 20;
|
||||
memcpy(script,pax->rmd160,20), script += 20;
|
||||
*script++ = 0x88;
|
||||
*script++ = 0xac;
|
||||
if ( tokomodo == 0 )
|
||||
{
|
||||
for (i=0; i<32; i++)
|
||||
data[len++] = ((uint8_t *)&pax->txid)[i];
|
||||
data[len++] = pax->vout & 0xff;
|
||||
data[len++] = (pax->vout >> 8) & 0xff;
|
||||
PENDING_HUSH_TX += pax->fiatoshis;
|
||||
}
|
||||
else
|
||||
{
|
||||
len += hush_rwapproval(1,&data[len],pax);
|
||||
PENDING_HUSH_TX += pax->puposhis;
|
||||
printf(" len.%d vout.%u DEPOSIT %.8f <- pax.%s pending ht %d %d %.8f | ",len,pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,pax->height,pax->otherheight,dstr(PENDING_HUSH_TX));
|
||||
}
|
||||
if ( numvouts++ >= 64 || sum > COIN )
|
||||
break;
|
||||
}
|
||||
if ( numvouts > 1 )
|
||||
{
|
||||
if ( tokomodo != 0 )
|
||||
strcpy(symbol,(char *)"HUSH3");
|
||||
for (i=0; symbol[i]!=0; i++)
|
||||
data[len++] = symbol[i];
|
||||
data[len++] = 0;
|
||||
for (i=0; i<len; i++)
|
||||
printf("%02x",data[i]);
|
||||
printf(" <- data[%d]\n",len);
|
||||
opretlen = hush_opreturnscript(opret,opcode,data,len);
|
||||
txNew->vout.resize(numvouts+1);
|
||||
txNew->vout[numvouts].nValue = 0;
|
||||
txNew->vout[numvouts].scriptPubKey.resize(opretlen);
|
||||
script = (uint8_t *)&txNew->vout[numvouts].scriptPubKey[0];
|
||||
memcpy(script,opret,opretlen);
|
||||
for (i=0; i<8; i++)
|
||||
printf("%02x",opret[i]);
|
||||
printf(" <- opret, MINER deposits.%d (%s) vouts.%d %.8f opretlen.%d\n",tokomodo,SMART_CHAIN_SYMBOL,numvouts,dstr(PENDING_HUSH_TX),opretlen);
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -2142,101 +1788,6 @@ int32_t hush_priceind(const char *symbol)
|
||||
// returns price value which is in a 10% interval for more than 50% points for the preceding 24 hours
|
||||
int64_t hush_pricecorrelated(uint64_t seed,int32_t ind,uint32_t *rawprices,int32_t rawskip,uint32_t *nonzprices,int32_t smoothwidth)
|
||||
{
|
||||
int32_t i,j,k,n,iter,correlation,maxcorrelation=0; int64_t firstprice,price,sum,den,mult,refprice,lowprice,highprice;
|
||||
if ( PRICES_DAYWINDOW < 2 || ind >= HUSH_MAXPRICES )
|
||||
return(-1);
|
||||
mult = hush_pricemult(ind);
|
||||
if ( nonzprices != 0 )
|
||||
memset(nonzprices,0,sizeof(*nonzprices)*PRICES_DAYWINDOW);
|
||||
//for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
// fprintf(stderr,"%u ",rawprices[i*rawskip]);
|
||||
//fprintf(stderr,"ind.%d\n",ind);
|
||||
for (iter=0; iter<PRICES_DAYWINDOW; iter++)
|
||||
{
|
||||
correlation = 0;
|
||||
i = (iter + seed) % PRICES_DAYWINDOW;
|
||||
refprice = rawprices[i*rawskip];
|
||||
highprice = (refprice * (COIN + PRICES_ERRORRATE*5)) / COIN;
|
||||
lowprice = (refprice * (COIN - PRICES_ERRORRATE*5)) / COIN;
|
||||
if ( highprice == refprice )
|
||||
highprice++;
|
||||
if ( lowprice == refprice )
|
||||
lowprice--;
|
||||
sum = 0;
|
||||
//fprintf(stderr,"firsti.%d: ",i);
|
||||
for (j=0; j<PRICES_DAYWINDOW; j++,i++)
|
||||
{
|
||||
if ( i >= PRICES_DAYWINDOW )
|
||||
i = 0;
|
||||
if ( (price= rawprices[i*rawskip]) == 0 )
|
||||
{
|
||||
fprintf(stderr,"null rawprice.[%d]\n",i);
|
||||
return(-1);
|
||||
}
|
||||
if ( price >= lowprice && price <= highprice )
|
||||
{
|
||||
//fprintf(stderr,"%.1f ",(double)price/10000);
|
||||
sum += price;
|
||||
correlation++;
|
||||
if ( correlation > (PRICES_DAYWINDOW>>1) )
|
||||
{
|
||||
if ( nonzprices == 0 )
|
||||
return(refprice * mult);
|
||||
//fprintf(stderr,"-> %.4f\n",(double)sum*mult/correlation);
|
||||
//return(sum*mult/correlation);
|
||||
n = 0;
|
||||
i = (iter + seed) % PRICES_DAYWINDOW;
|
||||
for (k=0; k<PRICES_DAYWINDOW; k++,i++)
|
||||
{
|
||||
if ( i >= PRICES_DAYWINDOW )
|
||||
i = 0;
|
||||
if ( n > (PRICES_DAYWINDOW>>1) )
|
||||
nonzprices[i] = 0;
|
||||
else
|
||||
{
|
||||
price = rawprices[i*rawskip];
|
||||
if ( price < lowprice || price > highprice )
|
||||
nonzprices[i] = 0;
|
||||
else
|
||||
{
|
||||
nonzprices[i] = price;
|
||||
//fprintf(stderr,"(%d %u) ",i,rawprices[i*rawskip]);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
//fprintf(stderr,"ind.%d iter.%d j.%d i.%d n.%d correlation.%d ref %llu -> %llu\n",ind,iter,j,i,n,correlation,(long long)refprice,(long long)sum/correlation);
|
||||
if ( n != correlation )
|
||||
return(-1);
|
||||
sum = den = n = 0;
|
||||
for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
if ( nonzprices[i] != 0 )
|
||||
break;
|
||||
firstprice = nonzprices[i];
|
||||
//fprintf(stderr,"firsti.%d: ",i);
|
||||
for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
{
|
||||
if ( (price= nonzprices[i]) != 0 )
|
||||
{
|
||||
den += (PRICES_DAYWINDOW - i);
|
||||
sum += ((PRICES_DAYWINDOW - i) * (price + firstprice*4)) / 5;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
if ( n != correlation || sum == 0 || den == 0 )
|
||||
{
|
||||
fprintf(stderr,"seed.%llu n.%d vs correlation.%d sum %llu, den %llu\n",(long long)seed,n,correlation,(long long)sum,(long long)den);
|
||||
return(-1);
|
||||
}
|
||||
//fprintf(stderr,"firstprice.%llu weighted -> %.8f\n",(long long)firstprice,((double)(sum*mult) / den) / COIN);
|
||||
return((sum * mult) / den);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( correlation > maxcorrelation )
|
||||
maxcorrelation = correlation;
|
||||
}
|
||||
fprintf(stderr,"ind.%d iter.%d maxcorrelation.%d ref.%llu high.%llu low.%llu\n",ind,iter,maxcorrelation,(long long)refprice,(long long)highprice,(long long)lowprice);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -2343,189 +1894,19 @@ static void revsort64(int64_t *l, int32_t llen)
|
||||
|
||||
int64_t hush_priceave(int64_t *buf,int64_t *correlated,int32_t cskip)
|
||||
{
|
||||
int32_t i,dir=0; int64_t sum=0,nonzprice,price,halfave,thirdave,fourthave,decayprice;
|
||||
if ( PRICES_DAYWINDOW < 2 )
|
||||
return(0);
|
||||
for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
{
|
||||
if ( (nonzprice= correlated[i*cskip]) != 0 )
|
||||
break;
|
||||
}
|
||||
if ( nonzprice == 0 )
|
||||
return(-1);
|
||||
for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
{
|
||||
if ( (price= correlated[i*cskip]) != 0 )
|
||||
nonzprice = price;
|
||||
buf[PRICES_DAYWINDOW+i] = nonzprice;
|
||||
sum += nonzprice;
|
||||
if ( i == PRICES_DAYWINDOW/2 )
|
||||
halfave = (sum / (PRICES_DAYWINDOW/2));
|
||||
else if ( i == PRICES_DAYWINDOW/3 )
|
||||
thirdave = (sum / (PRICES_DAYWINDOW/3));
|
||||
else if ( i == PRICES_DAYWINDOW/4 )
|
||||
fourthave = (sum / (PRICES_DAYWINDOW/4));
|
||||
}
|
||||
memcpy(buf,&buf[PRICES_DAYWINDOW],PRICES_DAYWINDOW*sizeof(*buf));
|
||||
price = sum / PRICES_DAYWINDOW;
|
||||
return(price);
|
||||
if ( halfave == price )
|
||||
return(price);
|
||||
else if ( halfave > price ) // rising prices
|
||||
sort64(buf,PRICES_DAYWINDOW);
|
||||
else revsort64(buf,PRICES_DAYWINDOW);
|
||||
decayprice = buf[0];
|
||||
for (i=0; i<PRICES_DAYWINDOW; i++)
|
||||
{
|
||||
decayprice = ((decayprice * 97) + (buf[i] * 3)) / 100;
|
||||
//fprintf(stderr,"%.4f ",(double)buf[i]/COIN);
|
||||
}
|
||||
fprintf(stderr,"%ssort half %.8f %.8f %.8f %.8f %.8f %.8f -> %.8f\n",halfave<price?"rev":"",(double)price/COIN,(double)halfave/COIN,(double)thirdave/COIN,(double)fourthave/COIN,(double)decayprice/COIN,(double)buf[PRICES_DAYWINDOW-1]/COIN,(double)(price*7 + halfave*5 + thirdave*3 + fourthave*2 + decayprice + buf[PRICES_DAYWINDOW-1])/(19*COIN));
|
||||
return((price*7 + halfave*5 + thirdave*3 + fourthave*2 + decayprice + buf[PRICES_DAYWINDOW-1]) / 19);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t hush_pricesinit()
|
||||
{
|
||||
static int32_t didinit;
|
||||
int32_t i,num=0,createflag = 0;
|
||||
if ( didinit != 0 )
|
||||
return(-1);
|
||||
didinit = 1;
|
||||
boost::filesystem::path pricefname,pricesdir = GetDataDir() / "prices";
|
||||
fprintf(stderr,"pricesinit (%s)\n",pricesdir.string().c_str());
|
||||
if (!boost::filesystem::exists(pricesdir))
|
||||
boost::filesystem::create_directories(pricesdir), createflag = 1;
|
||||
for (i=0; i<HUSH_MAXPRICES; i++)
|
||||
{
|
||||
if ( hush_pricename(PRICES[i].symbol,i) == 0 )
|
||||
break;
|
||||
//fprintf(stderr,"%s.%d ",PRICES[i].symbol,i);
|
||||
if ( i == 0 )
|
||||
strcpy(PRICES[i].symbol,"rawprices");
|
||||
pricefname = pricesdir / PRICES[i].symbol;
|
||||
if ( createflag != 0 )
|
||||
PRICES[i].fp = fopen(pricefname.string().c_str(),"wb+");
|
||||
else if ( (PRICES[i].fp= fopen(pricefname.string().c_str(),"rb+")) == 0 )
|
||||
PRICES[i].fp = fopen(pricefname.string().c_str(),"wb+");
|
||||
if ( PRICES[i].fp != 0 )
|
||||
{
|
||||
num++;
|
||||
if ( createflag != 0 )
|
||||
{
|
||||
fseek(PRICES[i].fp,(2*PRICES_DAYWINDOW+PRICES_SMOOTHWIDTH) * sizeof(int64_t) * PRICES_MAXDATAPOINTS,SEEK_SET);
|
||||
fputc(0,PRICES[i].fp);
|
||||
fflush(PRICES[i].fp);
|
||||
}
|
||||
} else fprintf(stderr,"error opening %s createflag.%d\n",pricefname.string().c_str(), createflag);
|
||||
}
|
||||
if ( i > 0 && PRICES[0].fp != 0 && createflag != 0 )
|
||||
{
|
||||
fseek(PRICES[0].fp,(2*PRICES_DAYWINDOW+PRICES_SMOOTHWIDTH) * sizeof(uint32_t) * i,SEEK_SET);
|
||||
fputc(0,PRICES[0].fp);
|
||||
fflush(PRICES[0].fp);
|
||||
}
|
||||
fprintf(stderr,"pricesinit done i.%d num.%d numprices.%d\n",i,num,(int32_t)(hush_cbopretsize(ASSETCHAINS_CBOPRET)/sizeof(uint32_t)));
|
||||
if ( i != num || i != hush_cbopretsize(ASSETCHAINS_CBOPRET)/sizeof(uint32_t) )
|
||||
{
|
||||
fprintf(stderr,"fatal error opening prices files, start shutdown\n");
|
||||
StartShutdown();
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
pthread_mutex_t pricemutex;
|
||||
|
||||
// PRICES file layouts
|
||||
// [0] rawprice32 / timestamp
|
||||
// [1] correlated
|
||||
// [2] 24hr ave
|
||||
// [3] to [7] reserved
|
||||
|
||||
void hush_pricesupdate(int32_t height,CBlock *pblock)
|
||||
{
|
||||
static int numprices; static uint32_t *ptr32; static int64_t *ptr64,*tmpbuf;
|
||||
int32_t ind,offset,width; int64_t correlated,smoothed; uint64_t seed,rngval; uint32_t rawprices[HUSH_MAXPRICES],buf[PRICES_MAXDATAPOINTS*2];
|
||||
width = PRICES_DAYWINDOW;//(2*PRICES_DAYWINDOW + PRICES_SMOOTHWIDTH);
|
||||
if ( numprices == 0 )
|
||||
{
|
||||
pthread_mutex_init(&pricemutex,0);
|
||||
numprices = (int32_t)(hush_cbopretsize(ASSETCHAINS_CBOPRET) / sizeof(uint32_t));
|
||||
ptr32 = (uint32_t *)calloc(sizeof(uint32_t),numprices * width);
|
||||
ptr64 = (int64_t *)calloc(sizeof(int64_t),PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS);
|
||||
tmpbuf = (int64_t *)calloc(sizeof(int64_t),2*PRICES_DAYWINDOW);
|
||||
fprintf(stderr,"prices update: numprices.%d %p %p\n",numprices,ptr32,ptr64);
|
||||
}
|
||||
if ( _hush_heightpricebits(&seed,rawprices,pblock) == numprices )
|
||||
{
|
||||
//for (ind=0; ind<numprices; ind++)
|
||||
// fprintf(stderr,"%u ",rawprices[ind]);
|
||||
//fprintf(stderr,"numprices.%d\n",numprices);
|
||||
if ( PRICES[0].fp != 0 )
|
||||
{
|
||||
pthread_mutex_lock(&pricemutex);
|
||||
fseek(PRICES[0].fp,height * numprices * sizeof(uint32_t),SEEK_SET);
|
||||
if ( fwrite(rawprices,sizeof(uint32_t),numprices,PRICES[0].fp) != numprices )
|
||||
fprintf(stderr,"error writing rawprices for ht.%d\n",height);
|
||||
else fflush(PRICES[0].fp);
|
||||
if ( height > PRICES_DAYWINDOW )
|
||||
{
|
||||
fseek(PRICES[0].fp,(height-width+1) * numprices * sizeof(uint32_t),SEEK_SET);
|
||||
if ( fread(ptr32,sizeof(uint32_t),width*numprices,PRICES[0].fp) == width*numprices )
|
||||
{
|
||||
rngval = seed;
|
||||
for (ind=1; ind<numprices; ind++)
|
||||
{
|
||||
if ( PRICES[ind].fp == 0 )
|
||||
{
|
||||
fprintf(stderr,"PRICES[%d].fp is null\n",ind);
|
||||
continue;
|
||||
}
|
||||
offset = (width-1)*numprices + ind;
|
||||
rngval = (rngval*11109 + 13849);
|
||||
if ( (correlated= hush_pricecorrelated(rngval,ind,&ptr32[offset],-numprices,0,PRICES_SMOOTHWIDTH)) > 0 )
|
||||
{
|
||||
fseek(PRICES[ind].fp,height * sizeof(int64_t) * PRICES_MAXDATAPOINTS,SEEK_SET);
|
||||
memset(buf,0,sizeof(buf));
|
||||
buf[0] = rawprices[ind];
|
||||
buf[1] = rawprices[0]; // timestamp
|
||||
memcpy(&buf[2],&correlated,sizeof(correlated));
|
||||
if ( fwrite(buf,1,sizeof(buf),PRICES[ind].fp) != sizeof(buf) )
|
||||
fprintf(stderr,"error fwrite buf for ht.%d ind.%d\n",height,ind);
|
||||
else if ( height > PRICES_DAYWINDOW*2 )
|
||||
{
|
||||
fseek(PRICES[ind].fp,(height-PRICES_DAYWINDOW+1) * PRICES_MAXDATAPOINTS * sizeof(int64_t),SEEK_SET);
|
||||
if ( fread(ptr64,sizeof(int64_t),PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS,PRICES[ind].fp) == PRICES_DAYWINDOW*PRICES_MAXDATAPOINTS )
|
||||
{
|
||||
if ( (smoothed= hush_priceave(tmpbuf,&ptr64[(PRICES_DAYWINDOW-1)*PRICES_MAXDATAPOINTS+1],-PRICES_MAXDATAPOINTS)) > 0 )
|
||||
{
|
||||
fseek(PRICES[ind].fp,(height * PRICES_MAXDATAPOINTS + 2) * sizeof(int64_t),SEEK_SET);
|
||||
if ( fwrite(&smoothed,1,sizeof(smoothed),PRICES[ind].fp) != sizeof(smoothed) )
|
||||
fprintf(stderr,"error fwrite smoothed for ht.%d ind.%d\n",height,ind);
|
||||
else fflush(PRICES[ind].fp);
|
||||
} else fprintf(stderr,"error price_smoothed ht.%d ind.%d\n",height,ind);
|
||||
} else fprintf(stderr,"error fread ptr64 for ht.%d ind.%d\n",height,ind);
|
||||
}
|
||||
} else fprintf(stderr,"error hush_pricecorrelated for ht.%d ind.%d\n",height,ind);
|
||||
}
|
||||
fprintf(stderr,"height.%d\n",height);
|
||||
} else fprintf(stderr,"error reading rawprices for ht.%d\n",height);
|
||||
} else fprintf(stderr,"height.%d <= width.%d\n",height,width);
|
||||
pthread_mutex_unlock(&pricemutex);
|
||||
} else fprintf(stderr,"null PRICES[0].fp\n");
|
||||
} else fprintf(stderr,"numprices mismatch, height.%d\n",height);
|
||||
}
|
||||
|
||||
int32_t hush_priceget(int64_t *buf64,int32_t ind,int32_t height,int32_t numblocks)
|
||||
{
|
||||
FILE *fp; int32_t retval = PRICES_MAXDATAPOINTS;
|
||||
pthread_mutex_lock(&pricemutex);
|
||||
if ( ind < HUSH_MAXPRICES && (fp= PRICES[ind].fp) != 0 )
|
||||
{
|
||||
fseek(fp,height * PRICES_MAXDATAPOINTS * sizeof(int64_t),SEEK_SET);
|
||||
if ( fread(buf64,sizeof(int64_t),numblocks*PRICES_MAXDATAPOINTS,fp) != numblocks*PRICES_MAXDATAPOINTS )
|
||||
retval = -1;
|
||||
}
|
||||
pthread_mutex_unlock(&pricemutex);
|
||||
return(retval);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user