* *
******************************************************************************/
+#include "komodo_defs.h"
+
#define USD 0
+#define EUR 1
+#define JPY 2
+#define GBP 3
+#define AUD 4
+#define CAD 5
+#define CHF 6
+#define NZD 7
+
+#define CNY 8
+#define RUB 9
+#define MXN 10
+#define BRL 11
+#define INR 12
+#define HKD 13
+#define TRY 14
+#define ZAR 15
+
+#define PLN 16
+#define NOK 17
+#define SEK 18
+#define DKK 19
+#define CZK 20
+#define HUF 21
+#define ILS 22
+#define KRW 23
+
+#define MYR 24
+#define PHP 25
+#define RON 26
+#define SGD 27
+#define THB 28
+#define BGN 29
+#define IDR 30
+#define HRK 31
#define MAX_CURRENCIES 32
extern char CURRENCIES[][8];
//printf("sum %llu\n",(long long)sum);
};
-int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,double *BTCUSDp,double *CNYUSDp,uint32_t *pvals)
+#define BTCFACTOR_HEIGHT 466266
+
+double PAX_BTCUSD(int32_t height,uint32_t btcusd)
+{
+ double btcfactor,BTCUSD;
+ if ( height >= BTCFACTOR_HEIGHT )
+ btcfactor = 100000.;
+ else btcfactor = 1000.;
+ BTCUSD = ((double)btcusd / (1000000000. / btcfactor));
+ if ( height >= BTCFACTOR_HEIGHT && height < 500000 && BTCUSD > 20000 && btcfactor == 100000. )
+ BTCUSD /= 100;
+ return(BTCUSD);
+}
+
+int32_t dpow_readprices(int32_t height,uint8_t *data,uint32_t *timestampp,double *KMDBTCp,double *BTCUSDp,double *CNYUSDp,uint32_t *pvals)
{
uint32_t kmdbtc,btcusd,cnyusd; int32_t i,n,nonz,len = 0;
if ( data[0] == 'P' && data[5] == 35 )
len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&btcusd); // *= 1000
len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&cnyusd);
*KMDBTCp = ((double)kmdbtc / (1000000000. * 1000.));
- *BTCUSDp = ((double)btcusd / (1000000000. / 1000.));
+ *BTCUSDp = PAX_BTCUSD(height,btcusd);
*CNYUSDp = ((double)cnyusd / 1000000000.);
for (i=nonz=0; i<n-3; i++)
{
return(n);
}
-int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
+int32_t komodo_pax_opreturn(int32_t height,uint8_t *opret,int32_t maxsize)
{
static uint32_t lastcrc;
FILE *fp; char fname[512]; uint32_t crc32,check,timestamp; int32_t i,n=0,retval,fsize,len=0; uint8_t data[8192];
-#ifdef WIN32
+#ifdef _WIN32
sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
#else
sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
if ( check == crc32 )
{
double KMDBTC,BTCUSD,CNYUSD; uint32_t pvals[128];
- if ( dpow_readprices(&data[len],×tamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
+ if ( dpow_readprices(height,&data[len],×tamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
{
if ( 0 && lastcrc != crc32 )
{
} else printf("fread.%d error != fsize.%d\n",retval,fsize);
} else printf("fsize.%d > maxsize.%d or data[%d]\n",fsize,maxsize,(int32_t)sizeof(data));
fclose(fp);
- }
+ } //else printf("couldnt open %s\n",fname);
return(n);
}
btcusd = pvals[i++];
cnyusd = pvals[i++];
KMDBTC = ((double)kmdbtc / (1000000000. * 1000.));
- BTCUSD = ((double)btcusd / (1000000000. / 1000.));
+ BTCUSD = PAX_BTCUSD(height,btcusd);
CNYUSD = ((double)cnyusd / 1000000000.);
portable_mutex_lock(&komodo_mutex);
PVALS = (uint32_t *)realloc(PVALS,(NUM_PRICES+1) * sizeof(*PVALS) * 36);
uint64_t komodo_paxcalc(int32_t height,uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume,uint64_t refkmdbtc,uint64_t refbtcusd)
{
- uint32_t pvalb,pvalr; uint64_t price,kmdbtc,btcusd,usdvol,baseusd,usdkmd,baserel,ranked[32];
+ uint32_t pvalb,pvalr; double BTCUSD; uint64_t price,kmdbtc,btcusd,usdvol,baseusd,usdkmd,baserel,ranked[32];
if ( basevolume > KOMODO_PAXMAX )
{
printf("paxcalc overflow %.8f\n",dstr(basevolume));
usdkmd = ((uint64_t)kmdbtc * 1000000000) / btcusd;
if ( height >= 236000-10 )
{
- usdkmd = ((uint64_t)kmdbtc * btcusd) / 1000000000;
- //price = ((uint64_t)10000000000 * MINDENOMS[USD] / MINDENOMS[baseid]) / komodo_paxvol(usdvol,usdkmd);
- price = (((uint64_t)10000000000) / komodo_paxvol(usdvol,usdkmd)) * (MINDENOMS[baseid] / MINDENOMS[USD]);
- //fprintf(stderr,"ht.%d kmdbtc.%llu btcusd.%llu base -> USD %llu, usdkmd %llu usdvol %llu -> %llu\n",height,(long long)kmdbtc,(long long)btcusd,(long long)baseusd,(long long)usdkmd,(long long)usdvol,(long long)(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100)));
+ BTCUSD = PAX_BTCUSD(height,btcusd);
+ if ( height < BTCFACTOR_HEIGHT || (height < 500000 && BTCUSD > 20000) )
+ usdkmd = ((uint64_t)kmdbtc * btcusd) / 1000000000;
+ else usdkmd = ((uint64_t)kmdbtc * btcusd) / 10000000;
+ ///if ( height >= BTCFACTOR_HEIGHT && BTCUSD >= 43 )
+ // usdkmd = ((uint64_t)kmdbtc * btcusd) / 10000000;
+ //else usdkmd = ((uint64_t)kmdbtc * btcusd) / 1000000000;
+ price = ((uint64_t)10000000000 * MINDENOMS[USD] / MINDENOMS[baseid]) / komodo_paxvol(usdvol,usdkmd);
+ //fprintf(stderr,"ht.%d %.3f kmdbtc.%llu btcusd.%llu base -> USD %llu, usdkmd %llu usdvol %llu -> %llu\n",height,BTCUSD,(long long)kmdbtc,(long long)btcusd,(long long)baseusd,(long long)usdkmd,(long long)usdvol,(long long)(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100)));
//fprintf(stderr,"usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %llu %llu\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,(long long)(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100)),(long long)price);
//fprintf(stderr,"usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %llu\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,(long long)(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100)));
} else price = (MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100));
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;
+ int32_t baseid=-1,relid=-1,i; uint32_t *ptr,*pvals;
if ( height > 10 )
height -= 10;
if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
ptr = &PVALS[36 * i];
if ( *ptr < height )
{
+ pvals = &ptr[1];
if ( kmdbtcp != 0 && btcusdp != 0 )
{
- *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
- *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
+ *kmdbtcp = pvals[MAX_CURRENCIES] / 539;
+ *btcusdp = pvals[MAX_CURRENCIES + 1] / 539;
}
//portable_mutex_unlock(&komodo_mutex);
if ( kmdbtc != 0 && btcusd != 0 )
- return(komodo_paxcalc(height,&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
+ return(komodo_paxcalc(height,pvals,baseid,relid,basevolume,kmdbtc,btcusd));
else return(0);
}
}
else return(-1);
}
-uint64_t komodo_paxpriceB(uint64_t seed,int32_t height,char *base,char *rel,uint64_t basevolume)
+uint64_t _komodo_paxpriceB(uint64_t seed,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,tolerance,den,densum,sum=0,votes[sizeof(Peggy_inds)/sizeof(*Peggy_inds)],btcusds[sizeof(Peggy_inds)/sizeof(*Peggy_inds)],kmdbtcs[sizeof(Peggy_inds)/sizeof(*Peggy_inds)],kmdbtc,btcusd;
if ( basevolume > KOMODO_PAXMAX )
return(komodo_paxcorrelation(votes,numvotes,seed) * basevolume / 100000);
}
+uint64_t komodo_paxpriceB(uint64_t seed,int32_t height,char *base,char *rel,uint64_t basevolume)
+{
+ uint64_t baseusd,basekmd,usdkmd; int32_t baseid = komodo_baseid(base);
+ if ( height >= 236000 && strcmp(rel,"kmd") == 0 )
+ {
+ usdkmd = _komodo_paxpriceB(seed,height,(char *)"USD",(char *)"KMD",SATOSHIDEN);
+ if ( strcmp("usd",base) == 0 )
+ return(komodo_paxvol(basevolume,usdkmd) * 10);
+ baseusd = _komodo_paxpriceB(seed,height,base,(char *)"USD",SATOSHIDEN);
+ basekmd = (komodo_paxvol(basevolume,baseusd) * usdkmd) / 10000000;
+ //if ( strcmp("KMD",base) == 0 )
+ // printf("baseusd.%llu usdkmd.%llu %llu\n",(long long)baseusd,(long long)usdkmd,(long long)basekmd);
+ return(basekmd);
+ } else return(_komodo_paxpriceB(seed,height,base,rel,basevolume));
+}
+
+/*uint64_t komodo_paxpriceB(uint64_t seed,int32_t height,char *base,char *rel,uint64_t basevolume)
+{
+ uint64_t baseusd,basekmd,usdkmd; int32_t baseid = komodo_baseid(base);
+ //if ( strcmp(rel,"KMD") != 0 || baseid < 0 || MINDENOMS[baseid] == MINDENOMS[USD] )
+ // return(_komodo_paxpriceB(seed,height,base,rel,basevolume));
+ //else
+ {
+ baseusd = _komodo_paxpriceB(seed,height,base,(char *)"USD",SATOSHIDEN);
+ usdkmd = _komodo_paxpriceB(seed,height,(char *)"USD",(char *)"KMD",SATOSHIDEN);
+ basekmd = (komodo_paxvol(basevolume,baseusd) * usdkmd) / 10000000;
+ if ( strcmp("KMD",base) == 0 )
+ printf("baseusd.%llu usdkmd.%llu %llu\n",(long long)baseusd,(long long)usdkmd,(long long)basekmd);
+ return(basekmd);
+ }
+}*/
+
uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
{
int32_t i,nonz=0; int64_t diff; uint64_t price,seed,sum = 0;
if ( ASSETCHAINS_SYMBOL[0] == 0 && chainActive.Tip() != 0 && height > chainActive.Tip()->nHeight )
{
if ( height < 100000000 )
- printf("height.%d vs tip.%d\n",height,chainActive.Tip()->nHeight);
+ {
+ static uint32_t counter;
+ if ( counter++ < 3 )
+ printf("komodo_paxprice height.%d vs tip.%d\n",height,chainActive.Tip()->nHeight);
+ }
return(0);
}
*seedp = komodo_seed(height);
void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen)
{
double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero;
- numpvals = dpow_readprices(pricefeed,×tamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
+ numpvals = dpow_readprices(height,pricefeed,×tamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
memset(&zero,0,sizeof(zero));
komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0,0);
- //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen);
+ if ( 0 )
+ {
+ int32_t i;
+ for (i=0; i<numpvals; i++)
+ printf("%u ",pvals[i]);
+ printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d kmdbtc %.8f BTCUSD %.8f CNYUSD %.8f\n",height,numpvals,opretlen,KMDBTC,BTCUSD,CNYUSD);
+ }
}
uint64_t PAX_fiatdest(uint64_t *seedp,int32_t tokomodo,char *destaddr,uint8_t pubkey33[33],char *coinaddr,int32_t height,char *origbase,int64_t fiatoshis)