]> Git Repo - VerusCoin.git/blobdiff - src/komodo_pax.h
KOMODO_DEFS_H
[VerusCoin.git] / src / komodo_pax.h
index 45b7035fa7622c98e66413ec4af1e8736b7e235c..bcf6fa5d7e206fbbb3a4777d1973d4a91dcfd0f0 100644 (file)
  *                                                                            *
  ******************************************************************************/
 
+#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];
@@ -142,7 +178,21 @@ void pax_rank(uint64_t *ranked,uint32_t *pvals)
     //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 )
@@ -158,7 +208,7 @@ int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,doubl
     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++)
     {
@@ -181,11 +231,11 @@ int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,doubl
     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");
@@ -204,7 +254,7 @@ int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
                 if ( check == crc32 )
                 {
                     double KMDBTC,BTCUSD,CNYUSD; uint32_t pvals[128];
-                    if ( dpow_readprices(&data[len],&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
+                    if ( dpow_readprices(height,&data[len],&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
                     {
                         if ( 0 && lastcrc != crc32 )
                         {
@@ -228,7 +278,7 @@ int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
             } 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);
 }
 
@@ -294,7 +344,7 @@ void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals)
             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);
@@ -372,7 +422,7 @@ uint64_t komodo_paxcorrelation(uint64_t *votes,int32_t numvotes,uint64_t seed)
 
 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));
@@ -405,10 +455,15 @@ uint64_t komodo_paxcalc(int32_t height,uint32_t *pvals,int32_t baseid,int32_t re
                 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));
@@ -441,7 +496,7 @@ uint64_t komodo_paxcalc(int32_t height,uint32_t *pvals,int32_t baseid,int32_t re
 
 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 )
@@ -452,14 +507,15 @@ uint64_t _komodo_paxprice(uint64_t *kmdbtcp,uint64_t *btcusdp,int32_t height,cha
             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);
             }
         }
@@ -497,7 +553,7 @@ int32_t komodo_kmdbtcusd(int32_t rwflag,uint64_t *kmdbtcp,uint64_t *btcusdp,int3
     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 )
@@ -546,13 +602,49 @@ uint64_t komodo_paxpriceB(uint64_t seed,int32_t height,char *base,char *rel,uint
     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);
@@ -615,10 +707,16 @@ int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *bas
 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,&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
+    numpvals = dpow_readprices(height,pricefeed,&timestamp,&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)
This page took 0.031387 seconds and 4 git commands to generate.