diff --git a/src/komodo_pax.h b/src/komodo_pax.h index d50583470..eb84f0231 100644 --- a/src/komodo_pax.h +++ b/src/komodo_pax.h @@ -308,9 +308,67 @@ void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals) } } -uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume) +uint64_t komodo_paxcorrelation(uint64_t *votes,int32_t numvotes,uint64_t seed,uint64_t basevolume) { - uint32_t pvalb,pvalr,kmdbtc,btcusd; uint64_t usdvol,baseusd,usdkmd,baserel,ranked[32]; + int32_t i,j,k,ind,zeroes,wt,nonz; int64_t delta; uint64_t lastprice,tolerance,den,densum,sum=0; + for (sum=i=zeroes=nonz=0; i (numvotes >> 1) ) + break; + } + } + } + } + if ( wt > (numvotes >> 1) ) + { + ind = i; + for (densum=sum=j=0; j 10000*COIN ) { printf("paxcalc overflow %.8f\n",dstr(basevolume)); @@ -320,16 +378,19 @@ uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t ba { if ( relid == MAX_CURRENCIES ) { - if ( (kmdbtc= pvals[MAX_CURRENCIES]) < 25000 ) + if ( kmdbtc == 0 ) + kmdbtc = pvals[MAX_CURRENCIES]; + if ( btcusd == 0 ) + btcusd = pvals[MAX_CURRENCIES + 1]; + if ( kmdbtc < 25000 ) kmdbtc = 25000; - btcusd = pvals[MAX_CURRENCIES + 1]; if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 ) { baseusd = ((uint64_t)pvalb * 1000000000) / pvals[USD]; usdvol = komodo_paxvol(basevolume,baseusd) / MINDENOMS[baseid]; usdkmd = ((uint64_t)btcusd * 1000000000) / kmdbtc; - //printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd); - //printf("usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %.8f\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,dstr(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd))); + printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd); + printf("usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %.8f\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,dstr(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd))); return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd)); } //else printf("zero val in KMD conv %llu %llu %llu\n",(long long)pvals[USD],(long long)kmdbtc,(long long)btcusd); } @@ -357,7 +418,7 @@ uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t ba return(0); } -uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume) +uint64_t _komodo_paxprice(uint64_t *kmdbtcp,uint64_t *btcusdp,int32_t height,char *base,char *rel,uint64_t basevolume,uint64_t kmdbtc,uint64_t btcusd) { int32_t baseid=-1,relid=-1,i; uint32_t *ptr; if ( height > 10 ) @@ -368,7 +429,13 @@ uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolum { ptr = &PVALS[36 * i]; if ( *ptr < height ) - return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume)); + { + *kmdbtcp = pvals[MAX_CURRENCIES + 1]; + *btcusdp = pvals[MAX_CURRENCIES + 2]; + if ( kmdbtc != 0 && btcusd != 0 ) + return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd)); + else return(0); + } } } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid); return(0); @@ -376,7 +443,7 @@ uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolum uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume) { - int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539]; + int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539],btcusds[539],kmdbtcs[539],kmdbtc,btcusd; if ( basevolume > 10000*COIN ) { printf("komodo_paxprice overflow %.8f\n",dstr(basevolume)); @@ -384,67 +451,23 @@ uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uin } numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds)); memset(votes,0,sizeof(votes)); - for (sum=i=zeroes=nonz=0; i> 1) ) return(0); - sum /= nonz; - lastprice = sum; - for (i=0; i (numvotes >> 1) ) - break; - } - } - } - } - if ( wt > (numvotes >> 1) ) - { - ind = i; - for (densum=sum=j=0; j= max ) return(num);