]> Git Repo - VerusCoin.git/blame - src/komodo_pax.h
test
[VerusCoin.git] / src / komodo_pax.h
CommitLineData
d019c447 1/******************************************************************************
37fed603 2 * Copyright © 2014-2017 The SuperNET Developers. *
d019c447 3 * *
4 * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
5 * the top-level directory of this distribution for the individual copyright *
6 * holder information and the developer policies on copyright and licensing. *
7 * *
8 * Unless otherwise agreed in a custom licensing agreement, no part of the *
9 * SuperNET software, including this file may be copied, modified, propagated *
10 * or distributed except according to the terms contained in the LICENSE file *
11 * *
12 * Removal or modification of this copyright notice is prohibited. *
13 * *
14 ******************************************************************************/
1e81ccb7 15
41a4a4db 16#define USD 0
17
1e81ccb7 18#define MAX_CURRENCIES 32
18d9697a 19extern char CURRENCIES[][8];
1e81ccb7 20
a4ebaad7 21uint64_t M1SUPPLY[] = { 3317900000000, 6991604000000, 667780000000000, 1616854000000, 331000000000, 861909000000, 584629000000, 46530000000, // major currencies
05dfe053 22 45434000000000, 16827000000000, 3473357229000, 306435000000, 27139000000000, 2150641000000, 347724099000, 1469583000000, 749543000000, 1826110000000, 2400434000000, 1123925000000, 3125276000000, 13975000000000, 317657000000, 759706000000000, 354902000000, 2797061000000, 162189000000, 163745000000, 1712000000000, 39093000000, 1135490000000000, 80317000000,
a4ebaad7 23 100000000 };
24
25#define MIND 1000
26uint32_t MINDENOMS[] = { MIND, MIND, 100*MIND, MIND, MIND, MIND, MIND, MIND, // major currencies
27 10*MIND, 100*MIND, 10*MIND, MIND, 100*MIND, 10*MIND, MIND, 10*MIND, MIND, 10*MIND, 10*MIND, 10*MIND, 10*MIND, 100*MIND, MIND, 1000*MIND, MIND, 10*MIND, MIND, MIND, 10*MIND, MIND, 10000*MIND, 10*MIND, // end of currencies
2810*MIND,
1e81ccb7 29};
30
2e9292fe 31int32_t Peggy_inds[539] = {289, 404, 50, 490, 59, 208, 87, 508, 366, 288, 13, 38, 159, 440, 120, 480, 361, 104, 534, 195, 300, 362, 489, 108, 143, 220, 131, 244, 133, 473, 315, 439, 210, 456, 219, 352, 153, 444, 397, 491, 286, 479, 519, 384, 126, 369, 155, 427, 373, 360, 135, 297, 256, 506, 322, 425, 501, 251, 75, 18, 420, 537, 443, 438, 407, 145, 173, 78, 340, 240, 422, 160, 329, 32, 127, 128, 415, 495, 372, 522, 60, 238, 129, 364, 471, 140, 171, 215, 378, 292, 432, 526, 252, 389, 459, 350, 233, 408, 433, 51, 423, 19, 62, 115, 211, 22, 247, 197, 530, 7, 492, 5, 53, 318, 313, 283, 169, 464, 224, 282, 514, 385, 228, 175, 494, 237, 446, 105, 150, 338, 346, 510, 6, 348, 89, 63, 536, 442, 414, 209, 216, 227, 380, 72, 319, 259, 305, 334, 236, 103, 400, 176, 267, 355, 429, 134, 257, 527, 111, 287, 386, 15, 392, 535, 405, 23, 447, 399, 291, 112, 74, 36, 435, 434, 330, 520, 335, 201, 478, 17, 162, 483, 33, 130, 436, 395, 93, 298, 498, 511, 66, 487, 218, 65, 309, 419, 48, 214, 377, 409, 462, 139, 349, 4, 513, 497, 394, 170, 307, 241, 185, 454, 29, 367, 465, 194, 398, 301, 229, 212, 477, 303, 39, 524, 451, 116, 532, 30, 344, 85, 186, 202, 517, 531, 515, 230, 331, 466, 147, 426, 234, 304, 64, 100, 416, 336, 199, 383, 200, 166, 258, 95, 188, 246, 136, 90, 68, 45, 312, 354, 184, 314, 518, 326, 401, 269, 217, 512, 81, 88, 272, 14, 413, 328, 393, 198, 226, 381, 161, 474, 353, 337, 294, 295, 302, 505, 137, 207, 249, 46, 98, 27, 458, 482, 262, 253, 71, 25, 0, 40, 525, 122, 341, 107, 80, 165, 243, 168, 250, 375, 151, 503, 124, 52, 343, 371, 206, 178, 528, 232, 424, 163, 273, 191, 149, 493, 177, 144, 193, 388, 1, 412, 265, 457, 255, 475, 223, 41, 430, 76, 102, 132, 96, 97, 316, 472, 213, 263, 3, 317, 324, 274, 396, 486, 254, 205, 285, 101, 21, 279, 58, 467, 271, 92, 538, 516, 235, 332, 117, 500, 529, 113, 445, 390, 358, 79, 34, 488, 245, 83, 509, 203, 476, 496, 347, 280, 12, 84, 485, 323, 452, 10, 146, 391, 293, 86, 94, 523, 299, 91, 164, 363, 402, 110, 321, 181, 138, 192, 469, 351, 276, 308, 277, 428, 182, 260, 55, 152, 157, 382, 121, 507, 225, 61, 431, 31, 106, 327, 154, 16, 49, 499, 73, 70, 449, 460, 187, 24, 248, 311, 275, 158, 387, 125, 67, 284, 35, 463, 190, 179, 266, 376, 221, 42, 26, 290, 357, 268, 43, 167, 99, 374, 242, 156, 239, 403, 339, 183, 320, 180, 306, 379, 441, 20, 481, 141, 77, 484, 69, 410, 502, 172, 417, 118, 461, 261, 47, 333, 450, 296, 453, 368, 359, 437, 421, 264, 504, 281, 270, 114, 278, 56, 406, 448, 411, 521, 418, 470, 123, 455, 148, 356, 468, 109, 204, 533, 365, 8, 345, 174, 370, 28, 57, 11, 2, 231, 310, 196, 119, 82, 325, 44, 342, 37, 189, 142, 222, 9, 54, };
32
33uint64_t peggy_smooth_coeffs[sizeof(Peggy_inds)/sizeof(*Peggy_inds)] = // numprimes.13
34{
35 962714545, 962506087, 962158759, 961672710, 961048151, 960285354, 959384649, 958346426, 957171134, // x.8
36 955859283, 954411438, 952828225, 951110328, 949258485, 947273493, 945156207, 942907532, 940528434, // x.17
37 938019929, 935383089, 932619036, 929728945, 926714044, 923575608, 920314964, 916933485, 913432593, // x.26
38 909813756, 906078486, 902228342, 898264923, 894189872, 890004874, 885711650, 881311964, 876807614, // x.35
39 872200436, 867492300, 862685110, 857780804, 852781347, 847688737, 842505000, 837232189, 831872382, // x.44
40 826427681, 820900212, 815292123, 809605581, 803842772, 798005901, 792097186, 786118864, 780073180, // x.53
41 773962395, 767788778, 761554609, 755262175, 748913768, 742511686, 736058231, 729555707, 723006417, // x.62
42 716412665, 709776755, 703100984, 696387648, 689639036, 682857428, 676045100, 669204315, 662337327, // x.71
43 655446378, 648533696, 641601496, 634651978, 627687325, 620709702, 613721256, 606724115, 599720386, // x.80
44 592712154, 585701482, 578690411, 571680955, 564675105, 557674825, 550682053, 543698699, 536726645, // x.89
45 529767743, 522823816, 515896658, 508988029, 502099660, 495233249, 488390461, 481572928, 474782249, // x.98
46 468019988, 461287675, 454586804, 447918836, 441285195, 434687268, 428126409, 421603932, 415121117, // x.107
47 408679208, 402279408, 395922888, 389610779, 383344175, 377124134, 370951677, 364827785, 358753406, // x.116
48 352729449, 346756785, 340836251, 334968645, 329154729, 323395230, 317690838, 312042206, 306449955, // x.125
49 300914667, 295436891, 290017141, 284655897, 279353604, 274110676, 268927490, 263804394, 258741701, // x.134
50 253739694, 248798623, 243918709, 239100140, 234343077, 229647649, 225013957, 220442073, 215932043, // x.143
51 211483883, 207097585, 202773112, 198510404, 194309373, 190169909, 186091877, 182075118, 178119452, // x.152
52 174224676, 170390565, 166616873, 162903335, 159249664, 155655556, 152120688, 148644718, 145227287, // x.161
53 141868021, 138566528, 135322401, 132135218, 129004542, 125929924, 122910901, 119946997, 117037723, // x.170
54 114182582, 111381062, 108632643, 105936795, 103292978, 100700645, 98159238, 95668194, 93226942, // x.179
55 90834903, 88491495, 86196126, 83948203, 81747126, 79592292, 77483092, 75418916, 73399150, // x.188
56 71423178, 69490383, 67600142, 65751837, 63944844, 62178541, 60452305, 58765515, 57117547, // x.197
57 55507781, 53935597, 52400377, 50901505, 49438366, 48010349, 46616844, 45257246, 43930951, // x.206
58 42637360, 41375878, 40145912, 38946876, 37778185, 36639262, 35529533, 34448428, 33395384, // x.215
59 32369842, 31371249, 30399057, 29452725, 28531717, 27635503, 26763558, 25915365, 25090413, // x.224
60 24288196, 23508216, 22749980, 22013003, 21296806, 20600917, 19924870, 19268206, 18630475, // x.233
61 18011231, 17410035, 16826458, 16260073, 15710466, 15177224, 14659944, 14158231, 13671694, // x.242
62 13199950, 12742625, 12299348, 11869759, 11453500, 11050225, 10659590, 10281262, 9914910, // x.251
63 9560213, 9216856, 8884529, 8562931, 8251764, 7950739, 7659571, 7377984, 7105706, // x.260
64 6842471, 6588020, 6342099, 6104460, 5874861, 5653066, 5438844, 5231969, 5032221, // x.269
65 4839386, 4653254, 4473620, 4300287, 4133059, 3971747, 3816167, 3666139, 3521488, // x.278
66 3382043, 3247640, 3118115, 2993313, 2873079, 2757266, 2645728, 2538325, 2434919, // x.287
67 2335380, 2239575, 2147382, 2058677, 1973342, 1891262, 1812325, 1736424, 1663453, // x.296
68 1593311, 1525898, 1461118, 1398879, 1339091, 1281666, 1226519, 1173569, 1122736, // x.305
69 1073944, 1027117, 982185, 939076, 897725, 858065, 820033, 783568, 748612, // x.314
70 715108, 682999, 652233, 622759, 594527, 567488, 541597, 516808, 493079, // x.323
71 470368, 448635, 427841, 407948, 388921, 370725, 353326, 336692, 320792, // x.332
72 305596, 291075, 277202, 263950, 251292, 239204, 227663, 216646, 206130, // x.341
73 196094, 186517, 177381, 168667, 160356, 152430, 144874, 137671, 130806, // x.350
74 124264, 118031, 112093, 106437, 101050, 95921, 91039, 86391, 81968, // x.359
75 77759, 73755, 69945, 66322, 62877, 59602, 56488, 53528, 50716, // x.368
76 48043, 45505, 43093, 40803, 38629, 36564, 34604, 32745, 30980, // x.377
77 29305, 27717, 26211, 24782, 23428, 22144, 20927, 19774, 18681, // x.386
78 17646, 16665, 15737, 14857, 14025, 13237, 12491, 11786, 11118, // x.395
79 10487, 9890, 9325, 8791, 8287, 7810, 7359, 6933, 6531, // x.404
80 6151, 5792, 5453, 5133, 4831, 4547, 4278, 4024, 3785, // x.413
81 3560, 3347, 3147, 2958, 2779, 2612, 2454, 2305, 2164, // x.422
82 2032, 1908, 1791, 1681, 1577, 1480, 1388, 1302, 1221, // x.431
83 1145, 1073, 1006, 942, 883, 827, 775, 725, 679, // x.440
84 636, 595, 557, 521, 487, 456, 426, 399, 373, // x.449
85 348, 325, 304, 284, 265, 248, 231, 216, 202, // x.458
86 188, 175, 164, 153, 142, 133, 124, 115, 107, // x.467
87 100, 93, 87, 81, 75, 70, 65, 61, 56, // x.476
88 53, 49, 45, 42, 39, 36, 34, 31, 29, // x.485
89 27, 25, 23, 22, 20, 19, 17, 16, 15, // x.494
90 14, 13, 12, 11, 10, 9, 9, 8, 7, // x.503
91 7, 6, 6, 5, 5, 5, 4, 4, 4, // x.512
92 3, 3, 3, 3, 2, 2, 2, 2, 2, // x.521
93 2, 2, 1, 1, 1, 1, 1, 1, 1, // x.530
94 1, 1, 1, 1, 1, 1, 0, 0, // isum 100000000000
95};
96
5334d5ad 97uint64_t komodo_maxallowed(int32_t baseid)
98{
dff4ef45 99 uint64_t mult,val = COIN * (uint64_t)10000;
5334d5ad 100 if ( baseid < 0 || baseid >= 32 )
101 return(0);
102 if ( baseid < 10 )
dff4ef45 103 val *= 4;
5334d5ad 104 mult = MINDENOMS[baseid] / MIND;
105 return(mult * val);
106}
107
ab6984e9 108uint64_t komodo_paxvol(uint64_t volume,uint64_t price)
109{
110 if ( volume < 10000000000 )
111 return((volume * price) / 1000000000);
112 else if ( volume < (uint64_t)10 * 10000000000 )
113 return((volume * (price / 10)) / 100000000);
114 else if ( volume < (uint64_t)100 * 10000000000 )
115 return(((volume / 10) * (price / 10)) / 10000000);
116 else if ( volume < (uint64_t)1000 * 10000000000 )
117 return(((volume / 10) * (price / 100)) / 1000000);
118 else if ( volume < (uint64_t)10000 * 10000000000 )
119 return(((volume / 100) * (price / 100)) / 100000);
120 else if ( volume < (uint64_t)100000 * 10000000000 )
121 return(((volume / 100) * (price / 1000)) / 10000);
122 else if ( volume < (uint64_t)1000000 * 10000000000 )
123 return(((volume / 1000) * (price / 1000)) / 1000);
124 else if ( volume < (uint64_t)10000000 * 10000000000 )
125 return(((volume / 1000) * (price / 10000)) / 100);
126 else return(((volume / 10000) * (price / 10000)) / 10);
127}
128
a4ebaad7 129void pax_rank(uint64_t *ranked,uint32_t *pvals)
130{
131 int32_t i; uint64_t vals[32],sum = 0;
132 for (i=0; i<32; i++)
133 {
134 vals[i] = komodo_paxvol(M1SUPPLY[i] / MINDENOMS[i],pvals[i]);
135 sum += vals[i];
136 }
137 for (i=0; i<32; i++)
138 {
139 ranked[i] = (vals[i] * 1000000000) / sum;
56d91e9c 140 //printf("%.6f ",(double)ranked[i]/1000000000.);
a4ebaad7 141 }
56d91e9c 142 //printf("sum %llu\n",(long long)sum);
a4ebaad7 143};
144
1e81ccb7 145int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,double *BTCUSDp,double *CNYUSDp,uint32_t *pvals)
146{
1bf82154 147 uint32_t kmdbtc,btcusd,cnyusd; int32_t i,n,nonz,len = 0;
0201d1a6 148 if ( data[0] == 'P' && data[5] == 35 )
149 data++;
1e81ccb7 150 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)timestampp);
151 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&n);
7eca18ee 152 if ( n != 35 )
7d59e5c9 153 {
154 printf("dpow_readprices illegal n.%d\n",n);
155 return(-1);
156 }
1e81ccb7 157 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&kmdbtc); // /= 1000
158 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&btcusd); // *= 1000
159 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&cnyusd);
160 *KMDBTCp = ((double)kmdbtc / (1000000000. * 1000.));
161 *BTCUSDp = ((double)btcusd / (1000000000. / 1000.));
162 *CNYUSDp = ((double)cnyusd / 1000000000.);
1bf82154 163 for (i=nonz=0; i<n-3; i++)
1e81ccb7 164 {
1bf82154 165 if ( pvals[i] != 0 )
166 nonz++;
49df008c 167 //else if ( nonz != 0 )
168 // printf("pvals[%d] is zero\n",i);
1e81ccb7 169 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&pvals[i]);
170 //printf("%u ",pvals[i]);
171 }
32f7d394 172 /*if ( nonz < n-3 )
ef7b1ba6 173 {
49df008c 174 //printf("nonz.%d n.%d retval -1\n",nonz,n);
1bf82154 175 return(-1);
32f7d394 176 }*/
1e81ccb7 177 pvals[i++] = kmdbtc;
178 pvals[i++] = btcusd;
179 pvals[i++] = cnyusd;
180 //printf("OP_RETURN prices\n");
181 return(n);
182}
183
d019c447 184int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
185{
186 static uint32_t lastcrc;
d351e231 187 FILE *fp; char fname[512]; uint32_t crc32,check,timestamp; int32_t i,n=0,retval,fsize,len=0; uint8_t data[8192];
d019c447 188#ifdef WIN32
189 sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
190#else
191 sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
192#endif
193 if ( (fp= fopen(fname,"rb")) != 0 )
194 {
195 fseek(fp,0,SEEK_END);
196 fsize = (int32_t)ftell(fp);
197 rewind(fp);
198 if ( fsize <= maxsize-4 && fsize <= sizeof(data) && fsize > sizeof(crc32) )
199 {
200 if ( (retval= (int32_t)fread(data,1,fsize,fp)) == fsize )
201 {
202 len = iguana_rwnum(0,data,sizeof(crc32),(void *)&crc32);
203 check = calc_crc32(0,data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
204 if ( check == crc32 )
205 {
206 double KMDBTC,BTCUSD,CNYUSD; uint32_t pvals[128];
1bf82154 207 if ( dpow_readprices(&data[len],&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
d019c447 208 {
d019c447 209 if ( 0 && lastcrc != crc32 )
210 {
1bf82154 211 for (i=0; i<32; i++)
212 printf("%u ",pvals[i]);
213 printf("t%u n.%d KMD %f BTC %f CNY %f (%f)\n",timestamp,n,KMDBTC,BTCUSD,CNYUSD,CNYUSD!=0?1./CNYUSD:0);
d019c447 214 }
1bf82154 215 if ( timestamp > time(NULL)-600 )
216 {
217 n = komodo_opreturnscript(opret,'P',data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
218 if ( 0 && lastcrc != crc32 )
219 {
220 for (i=0; i<n; i++)
221 printf("%02x",opret[i]);
222 printf(" coinbase opret[%d] crc32.%u:%u\n",n,crc32,check);
223 }
224 } //else printf("t%u too old for %u\n",timestamp,(uint32_t)time(NULL));
225 lastcrc = crc32;
226 }
d019c447 227 } else printf("crc32 %u mismatch %u\n",crc32,check);
228 } else printf("fread.%d error != fsize.%d\n",retval,fsize);
229 } else printf("fsize.%d > maxsize.%d or data[%d]\n",fsize,maxsize,(int32_t)sizeof(data));
230 fclose(fp);
231 }
232 return(n);
233}
234
1e81ccb7 235/*uint32_t PAX_val32(double val)
236 {
237 uint32_t val32 = 0; struct price_resolution price;
238 if ( (price.Pval= val*1000000000) != 0 )
239 {
240 if ( price.Pval > 0xffffffff )
241 printf("Pval overflow error %lld\n",(long long)price.Pval);
242 else val32 = (uint32_t)price.Pval;
243 }
244 return(val32);
245 }*/
246
57abdbaf 247int32_t PAX_pubkey(int32_t rwflag,uint8_t *pubkey33,uint8_t *addrtypep,uint8_t rmd160[20],char fiat[4],uint8_t *shortflagp,int64_t *fiatoshisp)
d019c447 248{
57abdbaf 249 if ( rwflag != 0 )
250 {
251 memset(pubkey33,0,33);
252 pubkey33[0] = 0x02 | (*shortflagp != 0);
253 memcpy(&pubkey33[1],fiat,3);
254 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
255 pubkey33[12] = *addrtypep;
256 memcpy(&pubkey33[13],rmd160,20);
257 }
258 else
259 {
260 *shortflagp = (pubkey33[0] == 0x03);
4d272ae4 261 memcpy(fiat,&pubkey33[1],3);
4d272ae4 262 fiat[3] = 0;
57abdbaf 263 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
264 if ( *shortflagp != 0 )
265 *fiatoshisp = -(*fiatoshisp);
266 *addrtypep = pubkey33[12];
267 memcpy(rmd160,&pubkey33[13],20);
268 }
d351e231 269 return(33);
d019c447 270}
271
1e81ccb7 272double PAX_val(uint32_t pval,int32_t baseid)
273{
274 //printf("PAX_val baseid.%d pval.%u\n",baseid,pval);
275 if ( baseid >= 0 && baseid < MAX_CURRENCIES )
276 return(((double)pval / 1000000000.) / MINDENOMS[baseid]);
277 return(0.);
278}
279
280void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals)
281{
5c481612 282 int32_t i,nonz; uint32_t kmdbtc,btcusd,cnyusd; double KMDBTC,BTCUSD,CNYUSD;
1e81ccb7 283 if ( numpvals >= 35 )
284 {
285 for (nonz=i=0; i<32; i++)
286 {
287 if ( pvals[i] != 0 )
288 nonz++;
289 //printf("%u ",pvals[i]);
290 }
291 if ( nonz == 32 )
292 {
293 kmdbtc = pvals[i++];
294 btcusd = pvals[i++];
295 cnyusd = pvals[i++];
5c481612 296 KMDBTC = ((double)kmdbtc / (1000000000. * 1000.));
297 BTCUSD = ((double)btcusd / (1000000000. / 1000.));
298 CNYUSD = ((double)cnyusd / 1000000000.);
f42f9288 299 portable_mutex_lock(&komodo_mutex);
1e81ccb7 300 PVALS = (uint32_t *)realloc(PVALS,(NUM_PRICES+1) * sizeof(*PVALS) * 36);
301 PVALS[36 * NUM_PRICES] = height;
302 memcpy(&PVALS[36 * NUM_PRICES + 1],pvals,sizeof(*pvals) * 35);
303 NUM_PRICES++;
f42f9288 304 portable_mutex_unlock(&komodo_mutex);
5c481612 305 if ( 0 )
306 printf("OP_RETURN.%d KMD %.8f BTC %.6f CNY %.6f NUM_PRICES.%d (%llu %llu %llu)\n",height,KMDBTC,BTCUSD,CNYUSD,NUM_PRICES,(long long)kmdbtc,(long long)btcusd,(long long)cnyusd);
1e81ccb7 307 }
308 }
309}
310
a6cd9b28 311uint64_t komodo_paxcorrelation(uint64_t *votes,int32_t numvotes,uint64_t seed)
a4ebaad7 312{
295e677f 313 int32_t i,j,k,ind,zeroes,wt,nonz; int64_t delta; uint64_t lastprice,tolerance,den,densum,sum=0;
314 for (sum=i=zeroes=nonz=0; i<numvotes; i++)
315 {
316 if ( votes[i] == 0 )
317 zeroes++;
318 else sum += votes[i], nonz++;
319 }
8ea67f05 320 if ( nonz < (numvotes >> 2) )
7851554d 321 return(0);
295e677f 322 sum /= nonz;
323 lastprice = sum;
324 for (i=0; i<numvotes; i++)
325 {
326 if ( votes[i] == 0 )
327 votes[i] = lastprice;
328 else lastprice = votes[i];
329 }
330 tolerance = sum / 50;
331 for (k=0; k<numvotes; k++)
332 {
333 ind = Peggy_inds[(k + seed) % numvotes];
334 i = (int32_t)(ind % numvotes);
335 wt = 0;
336 if ( votes[i] != 0 )
337 {
338 for (j=0; j<numvotes; j++)
339 {
340 if ( votes[j] != 0 )
341 {
342 if ( (delta= (votes[i] - votes[j])) < 0 )
343 delta = -delta;
344 if ( delta <= tolerance )
345 {
346 wt++;
347 if ( wt > (numvotes >> 1) )
348 break;
349 }
350 }
351 }
352 }
353 if ( wt > (numvotes >> 1) )
354 {
355 ind = i;
356 for (densum=sum=j=0; j<numvotes; j++)
357 {
358 den = peggy_smooth_coeffs[j];
359 densum += den;
360 sum += (den * votes[(ind + j) % numvotes]);
2e16695c 361 //printf("(%llu/%llu %.8f) ",(long long)sum,(long long)densum,(double)sum/densum);
295e677f 362 }
8ea67f05 363 if ( densum != 0 )
364 sum /= densum;
a6cd9b28 365 //sum = (sum * basevolume);
a5fcacd7 366 //printf("paxprice seed.%llx sum %.8f densum %.8f\n",(long long)seed,dstr(sum),dstr(densum));
295e677f 367 break;
368 }
369 }
370 return(sum);
371}
372
373uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume,uint64_t kmdbtc,uint64_t btcusd)
374{
375 uint32_t pvalb,pvalr; uint64_t usdvol,baseusd,usdkmd,baserel,ranked[32];
ac606ad4 376 if ( basevolume > KOMODO_PAXMAX )
97865d36 377 {
378 printf("paxcalc overflow %.8f\n",dstr(basevolume));
2e4514ce 379 return(0);
97865d36 380 }
a4ebaad7 381 if ( (pvalb= pvals[baseid]) != 0 )
382 {
383 if ( relid == MAX_CURRENCIES )
384 {
295e677f 385 if ( kmdbtc == 0 )
386 kmdbtc = pvals[MAX_CURRENCIES];
387 if ( btcusd == 0 )
388 btcusd = pvals[MAX_CURRENCIES + 1];
5fe8a65f 389 if ( kmdbtc < 25000000 )
390 kmdbtc = 25000000;
a4ebaad7 391 if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 )
392 {
b0c7fb04 393 baseusd = (((uint64_t)pvalb * 1000000000) / pvals[USD]);
445e9606 394 usdvol = komodo_paxvol(basevolume,baseusd);
ca6d4ab7 395 usdkmd = ((uint64_t)kmdbtc * 1000000000) / btcusd;
4077bfb0 396 //printf("kmdbtc.%llu btcusd.%llu base -> USD %llu, usdkmd %llu usdvol %llu -> %llu\n",(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)));
48dbd80f 397 //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)));
b0c7fb04 398 return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd) / (MINDENOMS[baseid]/100));
ee0744d2 399 } //else printf("zero val in KMD conv %llu %llu %llu\n",(long long)pvals[USD],(long long)kmdbtc,(long long)btcusd);
a4ebaad7 400 }
401 else if ( baseid == relid )
402 {
56d91e9c 403 if ( baseid != MAX_CURRENCIES )
404 {
405 pax_rank(ranked,pvals);
9ef47e29 406 //printf("%s M1 percentage %.8f\n",CURRENCIES[baseid],dstr(10 * ranked[baseid]));
5d299045 407 return(10 * ranked[baseid]); // scaled percentage of M1 total
97865d36 408 } else return(basevolume);
a4ebaad7 409 }
410 else if ( (pvalr= pvals[relid]) != 0 )
411 {
412 baserel = ((uint64_t)pvalb * 1000000000) / pvalr;
4077bfb0 413 //printf("baserel.%lld %lld %lld %.8f %.8f\n",(long long)baserel,(long long)MINDENOMS[baseid],(long long)MINDENOMS[relid],dstr(MINDENOMS[baseid]/MINDENOMS[relid]),dstr(MINDENOMS[relid]/MINDENOMS[baseid]));
b6f95ae6 414 if ( MINDENOMS[baseid] > MINDENOMS[relid] )
fde4e779 415 basevolume /= (MINDENOMS[baseid] / MINDENOMS[relid]);
b6f95ae6 416 else if ( MINDENOMS[baseid] < MINDENOMS[relid] )
fde4e779 417 basevolume *= (MINDENOMS[relid] / MINDENOMS[baseid]);
1a6bc62c 418 return(komodo_paxvol(basevolume,baserel));
a4ebaad7 419 }
97865d36 420 else printf("null pval for %s\n",CURRENCIES[relid]);
421 } else printf("null pval for %s\n",CURRENCIES[baseid]);
08ef004d 422 return(0);
a4ebaad7 423}
424
295e677f 425uint64_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)
1e81ccb7 426{
c149d44c 427 int32_t baseid=-1,relid=-1,i; uint32_t *ptr;
4307bd89 428 if ( height > 10 )
429 height -= 10;
1e81ccb7 430 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
431 {
bba30a43 432 //portable_mutex_lock(&komodo_mutex);
1e81ccb7 433 for (i=NUM_PRICES-1; i>=0; i--)
434 {
435 ptr = &PVALS[36 * i];
436 if ( *ptr < height )
295e677f 437 {
9e838b49 438 if ( kmdbtcp != 0 && btcusdp != 0 )
439 {
717b0c4e 440 *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
441 *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
9e838b49 442 }
bba30a43 443 //portable_mutex_unlock(&komodo_mutex);
295e677f 444 if ( kmdbtc != 0 && btcusd != 0 )
445 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
446 else return(0);
447 }
1e81ccb7 448 }
bba30a43 449 //portable_mutex_unlock(&komodo_mutex);
72da1eea 450 } //else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
1e81ccb7 451 return(0);
452}
453
e08169c4 454int32_t komodo_kmdbtcusd(int32_t rwflag,uint64_t *kmdbtcp,uint64_t *btcusdp,int32_t height)
455{
703cc8c9 456 static uint64_t *KMDBTCS,*BTCUSDS; static int32_t maxheight = 0; int32_t incr = 10000;
e08169c4 457 if ( height >= maxheight )
458 {
d854fae2 459 //printf("height.%d maxheight.%d incr.%d\n",height,maxheight,incr);
bfadcf9c 460 if ( height >= maxheight+incr )
461 incr = (height - (maxheight+incr) + 1000);
c9da2420 462 KMDBTCS = (uint64_t *)realloc(KMDBTCS,((incr + maxheight) * sizeof(*KMDBTCS)));
e08169c4 463 memset(&KMDBTCS[maxheight],0,(incr * sizeof(*KMDBTCS)));
c9da2420 464 BTCUSDS = (uint64_t *)realloc(BTCUSDS,((incr + maxheight) * sizeof(*BTCUSDS)));
e08169c4 465 memset(&BTCUSDS[maxheight],0,(incr * sizeof(*BTCUSDS)));
466 maxheight += incr;
467 }
468 if ( rwflag == 0 )
469 {
470 *kmdbtcp = KMDBTCS[height];
471 *btcusdp = BTCUSDS[height];
472 }
473 else
474 {
475 KMDBTCS[height] = *kmdbtcp;
476 BTCUSDS[height] = *btcusdp;
477 }
478 if ( *kmdbtcp != 0 && *btcusdp != 0 )
479 return(0);
480 else return(-1);
481}
482
d5a61fca 483uint64_t komodo_paxpriceB(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
2e9292fe 484{
c72ee808 485 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;
486 *seedp = komodo_seed(height);
ac606ad4 487 if ( basevolume > KOMODO_PAXMAX )
77af0879 488 {
489 printf("komodo_paxprice overflow %.8f\n",dstr(basevolume));
490 return(0);
491 }
b0c7fb04 492 if ( strcmp(base,"KMD") == 0 || strcmp(base,"kmd") == 0 )
493 {
494 printf("kmd cannot be base currency\n");
495 return(0);
496 }
2e9292fe 497 numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
498 memset(votes,0,sizeof(votes));
fa7d97db 499 //if ( komodo_kmdbtcusd(0,&kmdbtc,&btcusd,height) < 0 ) crashes when via passthru GUI use
a6cd9b28 500 {
e08169c4 501 memset(btcusds,0,sizeof(btcusds));
502 memset(kmdbtcs,0,sizeof(kmdbtcs));
503 for (i=0; i<numvotes; i++)
504 {
505 _komodo_paxprice(&kmdbtcs[numvotes-1-i],&btcusds[numvotes-1-i],height-i,base,rel,100000,0,0);
506 //printf("(%llu %llu) ",(long long)kmdbtcs[numvotes-1-i],(long long)btcusds[numvotes-1-i]);
507 }
508 kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,*seedp) * 539;
509 btcusd = komodo_paxcorrelation(btcusds,numvotes,*seedp) * 539;
9f9d5114 510 //komodo_kmdbtcusd(1,&kmdbtc,&btcusd,height);
a6cd9b28 511 }
295e677f 512 for (i=nonz=0; i<numvotes; i++)
68f2120f 513 {
64b0130f 514 if ( (votes[numvotes-1-i]= _komodo_paxprice(0,0,height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
9fd7459c 515 zeroes++;
295e677f 516 else nonz++;
68f2120f 517 }
9fd7459c 518 if ( nonz <= (numvotes >> 1) )
b75c9445 519 {
7656db1c 520 printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
521 printf("komodo_paxprice nonz.%d of numvotes.%d seed.%llu\n",nonz,numvotes,(long long)*seedp);
9fd7459c 522 return(0);
b75c9445 523 }
c72ee808 524 return(komodo_paxcorrelation(votes,numvotes,*seedp) * basevolume / 100000);
2e9292fe 525}
526
eea23236 527uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
528{
acd6ccf4 529 int32_t i,nonz=0; int64_t diff; uint64_t price,seed,sum = 0;
1f2ae075 530 if ( chainActive.Tip() != 0 && height > chainActive.Tip()->nHeight )
10854282 531 return(0);
bba30a43 532 portable_mutex_lock(&komodo_mutex);
93139074 533 for (i=0; i<17; i++)
eea23236 534 {
d5a61fca 535 if ( (price= komodo_paxpriceB(&seed,height-i,base,rel,basevolume)) != 0 )
eea23236 536 {
537 sum += price;
538 nonz++;
fd801c67 539 if ( 0 && i == 1 && nonz == 2 )
e8bd824b 540 {
395fae6b 541 diff = (((int64_t)price - (sum >> 1)) * 10000);
e8bd824b 542 if ( diff < 0 )
543 diff = -diff;
395fae6b 544 diff /= price;
6b9b9aca 545 printf("(%llu %llu %lld).%lld ",(long long)price,(long long)(sum>>1),(long long)(((int64_t)price - (sum >> 1)) * 10000),(long long)diff);
546 if ( diff < 33 )
e8bd824b 547 break;
e8bd824b 548 }
93139074 549 else if ( 0 && i == 3 && nonz == 4 )
e8bd824b 550 {
395fae6b 551 diff = (((int64_t)price - (sum >> 2)) * 10000);
e8bd824b 552 if ( diff < 0 )
553 diff = -diff;
395fae6b 554 diff /= price;
6b9b9aca 555 printf("(%llu %llu %lld).%lld ",(long long)price,(long long)(sum>>2),(long long) (((int64_t)price - (sum >> 2)) * 10000),(long long)diff);
556 if ( diff < 20 )
e8bd824b 557 break;
e8bd824b 558 }
eea23236 559 }
fa7d97db 560 if ( height < 165000 )
561 break;
eea23236 562 }
bba30a43 563 portable_mutex_unlock(&komodo_mutex);
eea23236 564 if ( nonz != 0 )
565 sum /= nonz;
93139074 566 //printf("-> %lld %s/%s i.%d ht.%d\n",(long long)sum,base,rel,i,height);
eea23236 567 return(sum);
568}
569
d836ec3f 570int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel)
a4ebaad7 571{
b20a5d7f 572 int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr;
a4ebaad7 573 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
574 {
575 for (i=NUM_PRICES-1; i>=0; i--)
576 {
577 ptr = &PVALS[36 * i];
56d91e9c 578 heights[num] = *ptr;
295e677f 579 prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN,0,0);
56d91e9c 580 num++;
581 if ( num >= max )
582 return(num);
a4ebaad7 583 }
584 }
56d91e9c 585 return(num);
a4ebaad7 586}
587
cd1fcb48 588void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen)
47e5cbc1 589{
590 double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero;
591 numpvals = dpow_readprices(pricefeed,&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
592 memset(&zero,0,sizeof(zero));
e155dbe9 593 komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0,0);
0765bc71 594 //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen);
47e5cbc1 595}
596
0bda6249 597uint64_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)
1e81ccb7 598{
fe965b1c 599 uint8_t shortflag = 0; char base[4]; int32_t i,baseid; uint8_t addrtype,rmd160[20]; int64_t komodoshis = 0;
c3fa7fad 600 *seedp = 0;
7c6f8298 601 if ( (baseid= komodo_baseid(origbase)) < 0 || baseid == MAX_CURRENCIES )
c3fa7fad 602 {
e4bef239 603 if ( origbase[0] != 0 )
604 printf("[%s] PAX_fiatdest illegal base.(%s)\n",ASSETCHAINS_SYMBOL,origbase);
d019c447 605 return(0);
c3fa7fad 606 }
3ba8f923 607 for (i=0; i<3; i++)
608 base[i] = toupper(origbase[i]);
609 base[i] = 0;
30e79ca6 610 if ( fiatoshis < 0 )
611 shortflag = 1, fiatoshis = -fiatoshis;
0bda6249 612 komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
8b4d7f27 613 //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
d019c447 614 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
1e81ccb7 615 {
7c6f8298 616 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
d019c447 617 bitcoin_address(destaddr,KOMODO_PUBTYPE,pubkey33,33);
1e81ccb7 618 }
d019c447 619 return(komodoshis);
1e81ccb7 620}
This page took 0.247209 seconds and 4 git commands to generate.