]> Git Repo - VerusCoin.git/blame - src/komodo_pax.h
test
[VerusCoin.git] / src / komodo_pax.h
CommitLineData
d019c447 1/******************************************************************************
2 * Copyright © 2014-2016 The SuperNET Developers. *
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
ab6984e9 97uint64_t komodo_paxvol(uint64_t volume,uint64_t price)
98{
99 if ( volume < 10000000000 )
100 return((volume * price) / 1000000000);
101 else if ( volume < (uint64_t)10 * 10000000000 )
102 return((volume * (price / 10)) / 100000000);
103 else if ( volume < (uint64_t)100 * 10000000000 )
104 return(((volume / 10) * (price / 10)) / 10000000);
105 else if ( volume < (uint64_t)1000 * 10000000000 )
106 return(((volume / 10) * (price / 100)) / 1000000);
107 else if ( volume < (uint64_t)10000 * 10000000000 )
108 return(((volume / 100) * (price / 100)) / 100000);
109 else if ( volume < (uint64_t)100000 * 10000000000 )
110 return(((volume / 100) * (price / 1000)) / 10000);
111 else if ( volume < (uint64_t)1000000 * 10000000000 )
112 return(((volume / 1000) * (price / 1000)) / 1000);
113 else if ( volume < (uint64_t)10000000 * 10000000000 )
114 return(((volume / 1000) * (price / 10000)) / 100);
115 else return(((volume / 10000) * (price / 10000)) / 10);
116}
117
a4ebaad7 118void pax_rank(uint64_t *ranked,uint32_t *pvals)
119{
120 int32_t i; uint64_t vals[32],sum = 0;
121 for (i=0; i<32; i++)
122 {
123 vals[i] = komodo_paxvol(M1SUPPLY[i] / MINDENOMS[i],pvals[i]);
124 sum += vals[i];
125 }
126 for (i=0; i<32; i++)
127 {
128 ranked[i] = (vals[i] * 1000000000) / sum;
56d91e9c 129 //printf("%.6f ",(double)ranked[i]/1000000000.);
a4ebaad7 130 }
56d91e9c 131 //printf("sum %llu\n",(long long)sum);
a4ebaad7 132};
133
1e81ccb7 134int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,double *BTCUSDp,double *CNYUSDp,uint32_t *pvals)
135{
1bf82154 136 uint32_t kmdbtc,btcusd,cnyusd; int32_t i,n,nonz,len = 0;
0201d1a6 137 if ( data[0] == 'P' && data[5] == 35 )
138 data++;
1e81ccb7 139 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)timestampp);
140 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&n);
7eca18ee 141 if ( n != 35 )
7d59e5c9 142 {
143 printf("dpow_readprices illegal n.%d\n",n);
144 return(-1);
145 }
1e81ccb7 146 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&kmdbtc); // /= 1000
147 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&btcusd); // *= 1000
148 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&cnyusd);
149 *KMDBTCp = ((double)kmdbtc / (1000000000. * 1000.));
150 *BTCUSDp = ((double)btcusd / (1000000000. / 1000.));
151 *CNYUSDp = ((double)cnyusd / 1000000000.);
1bf82154 152 for (i=nonz=0; i<n-3; i++)
1e81ccb7 153 {
1bf82154 154 if ( pvals[i] != 0 )
155 nonz++;
49df008c 156 //else if ( nonz != 0 )
157 // printf("pvals[%d] is zero\n",i);
1e81ccb7 158 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&pvals[i]);
159 //printf("%u ",pvals[i]);
160 }
32f7d394 161 /*if ( nonz < n-3 )
ef7b1ba6 162 {
49df008c 163 //printf("nonz.%d n.%d retval -1\n",nonz,n);
1bf82154 164 return(-1);
32f7d394 165 }*/
1e81ccb7 166 pvals[i++] = kmdbtc;
167 pvals[i++] = btcusd;
168 pvals[i++] = cnyusd;
169 //printf("OP_RETURN prices\n");
170 return(n);
171}
172
d019c447 173int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
174{
175 static uint32_t lastcrc;
d351e231 176 FILE *fp; char fname[512]; uint32_t crc32,check,timestamp; int32_t i,n=0,retval,fsize,len=0; uint8_t data[8192];
d019c447 177#ifdef WIN32
178 sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
179#else
180 sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
181#endif
182 if ( (fp= fopen(fname,"rb")) != 0 )
183 {
184 fseek(fp,0,SEEK_END);
185 fsize = (int32_t)ftell(fp);
186 rewind(fp);
187 if ( fsize <= maxsize-4 && fsize <= sizeof(data) && fsize > sizeof(crc32) )
188 {
189 if ( (retval= (int32_t)fread(data,1,fsize,fp)) == fsize )
190 {
191 len = iguana_rwnum(0,data,sizeof(crc32),(void *)&crc32);
192 check = calc_crc32(0,data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
193 if ( check == crc32 )
194 {
195 double KMDBTC,BTCUSD,CNYUSD; uint32_t pvals[128];
1bf82154 196 if ( dpow_readprices(&data[len],&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
d019c447 197 {
d019c447 198 if ( 0 && lastcrc != crc32 )
199 {
1bf82154 200 for (i=0; i<32; i++)
201 printf("%u ",pvals[i]);
202 printf("t%u n.%d KMD %f BTC %f CNY %f (%f)\n",timestamp,n,KMDBTC,BTCUSD,CNYUSD,CNYUSD!=0?1./CNYUSD:0);
d019c447 203 }
1bf82154 204 if ( timestamp > time(NULL)-600 )
205 {
206 n = komodo_opreturnscript(opret,'P',data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
207 if ( 0 && lastcrc != crc32 )
208 {
209 for (i=0; i<n; i++)
210 printf("%02x",opret[i]);
211 printf(" coinbase opret[%d] crc32.%u:%u\n",n,crc32,check);
212 }
213 } //else printf("t%u too old for %u\n",timestamp,(uint32_t)time(NULL));
214 lastcrc = crc32;
215 }
d019c447 216 } else printf("crc32 %u mismatch %u\n",crc32,check);
217 } else printf("fread.%d error != fsize.%d\n",retval,fsize);
218 } else printf("fsize.%d > maxsize.%d or data[%d]\n",fsize,maxsize,(int32_t)sizeof(data));
219 fclose(fp);
220 }
221 return(n);
222}
223
1e81ccb7 224/*uint32_t PAX_val32(double val)
225 {
226 uint32_t val32 = 0; struct price_resolution price;
227 if ( (price.Pval= val*1000000000) != 0 )
228 {
229 if ( price.Pval > 0xffffffff )
230 printf("Pval overflow error %lld\n",(long long)price.Pval);
231 else val32 = (uint32_t)price.Pval;
232 }
233 return(val32);
234 }*/
235
57abdbaf 236int32_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 237{
57abdbaf 238 if ( rwflag != 0 )
239 {
240 memset(pubkey33,0,33);
241 pubkey33[0] = 0x02 | (*shortflagp != 0);
242 memcpy(&pubkey33[1],fiat,3);
243 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
244 pubkey33[12] = *addrtypep;
245 memcpy(&pubkey33[13],rmd160,20);
246 }
247 else
248 {
249 *shortflagp = (pubkey33[0] == 0x03);
4d272ae4 250 memcpy(fiat,&pubkey33[1],3);
4d272ae4 251 fiat[3] = 0;
57abdbaf 252 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
253 if ( *shortflagp != 0 )
254 *fiatoshisp = -(*fiatoshisp);
255 *addrtypep = pubkey33[12];
256 memcpy(rmd160,&pubkey33[13],20);
257 }
d351e231 258 return(33);
d019c447 259}
260
1e81ccb7 261double PAX_val(uint32_t pval,int32_t baseid)
262{
263 //printf("PAX_val baseid.%d pval.%u\n",baseid,pval);
264 if ( baseid >= 0 && baseid < MAX_CURRENCIES )
265 return(((double)pval / 1000000000.) / MINDENOMS[baseid]);
266 return(0.);
267}
268
269void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals)
270{
5c481612 271 int32_t i,nonz; uint32_t kmdbtc,btcusd,cnyusd; double KMDBTC,BTCUSD,CNYUSD;
1e81ccb7 272 if ( numpvals >= 35 )
273 {
274 for (nonz=i=0; i<32; i++)
275 {
276 if ( pvals[i] != 0 )
277 nonz++;
278 //printf("%u ",pvals[i]);
279 }
280 if ( nonz == 32 )
281 {
282 kmdbtc = pvals[i++];
283 btcusd = pvals[i++];
284 cnyusd = pvals[i++];
5c481612 285 KMDBTC = ((double)kmdbtc / (1000000000. * 1000.));
286 BTCUSD = ((double)btcusd / (1000000000. / 1000.));
287 CNYUSD = ((double)cnyusd / 1000000000.);
f42f9288 288 portable_mutex_lock(&komodo_mutex);
1e81ccb7 289 PVALS = (uint32_t *)realloc(PVALS,(NUM_PRICES+1) * sizeof(*PVALS) * 36);
290 PVALS[36 * NUM_PRICES] = height;
291 memcpy(&PVALS[36 * NUM_PRICES + 1],pvals,sizeof(*pvals) * 35);
292 NUM_PRICES++;
f42f9288 293 portable_mutex_unlock(&komodo_mutex);
5c481612 294 if ( 0 )
295 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 296 }
297 }
298}
299
d019c447 300uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume)
a4ebaad7 301{
1a6bc62c 302 uint32_t pvalb,pvalr,kmdbtc,btcusd; uint64_t usdvol,baseusd,usdkmd,baserel,ranked[32];
fde4e779 303 if ( basevolume > 10000*COIN )
97865d36 304 {
305 printf("paxcalc overflow %.8f\n",dstr(basevolume));
2e4514ce 306 return(0);
97865d36 307 }
a4ebaad7 308 if ( (pvalb= pvals[baseid]) != 0 )
309 {
310 if ( relid == MAX_CURRENCIES )
311 {
312 kmdbtc = pvals[MAX_CURRENCIES];
313 btcusd = pvals[MAX_CURRENCIES + 1];
314 if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 )
315 {
316 baseusd = ((uint64_t)pvalb * 1000000000) / pvals[USD];
74fcb540 317 usdvol = komodo_paxvol(basevolume,baseusd) / MINDENOMS[baseid];
048ae852 318 usdkmd = ((uint64_t)btcusd * 1000000000) / kmdbtc;
a4ebaad7 319 //printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd);
9ef47e29 320 //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)));
74fcb540 321 return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd));
ee0744d2 322 } //else printf("zero val in KMD conv %llu %llu %llu\n",(long long)pvals[USD],(long long)kmdbtc,(long long)btcusd);
a4ebaad7 323 }
324 else if ( baseid == relid )
325 {
56d91e9c 326 if ( baseid != MAX_CURRENCIES )
327 {
328 pax_rank(ranked,pvals);
9ef47e29 329 //printf("%s M1 percentage %.8f\n",CURRENCIES[baseid],dstr(10 * ranked[baseid]));
5d299045 330 return(10 * ranked[baseid]); // scaled percentage of M1 total
97865d36 331 } else return(basevolume);
a4ebaad7 332 }
333 else if ( (pvalr= pvals[relid]) != 0 )
334 {
335 baserel = ((uint64_t)pvalb * 1000000000) / pvalr;
638d7b2b 336 //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 337 if ( MINDENOMS[baseid] > MINDENOMS[relid] )
fde4e779 338 basevolume /= (MINDENOMS[baseid] / MINDENOMS[relid]);
b6f95ae6 339 else if ( MINDENOMS[baseid] < MINDENOMS[relid] )
fde4e779 340 basevolume *= (MINDENOMS[relid] / MINDENOMS[baseid]);
1a6bc62c 341 return(komodo_paxvol(basevolume,baserel));
a4ebaad7 342 }
97865d36 343 else printf("null pval for %s\n",CURRENCIES[relid]);
344 } else printf("null pval for %s\n",CURRENCIES[baseid]);
08ef004d 345 return(0);
a4ebaad7 346}
347
2e9292fe 348uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume)
1e81ccb7 349{
c149d44c 350 int32_t baseid=-1,relid=-1,i; uint32_t *ptr;
1e81ccb7 351 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
352 {
353 for (i=NUM_PRICES-1; i>=0; i--)
354 {
355 ptr = &PVALS[36 * i];
356 if ( *ptr < height )
d019c447 357 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume));
1e81ccb7 358 }
359 } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
360 return(0);
361}
362
0bda6249 363uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
2e9292fe 364{
9fd7459c 365 int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539];
77af0879 366 if ( basevolume > 10000*COIN )
367 {
368 printf("komodo_paxprice overflow %.8f\n",dstr(basevolume));
369 return(0);
370 }
2e9292fe 371 numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
372 memset(votes,0,sizeof(votes));
9fd7459c 373 for (sum=i=zeroes=nonz=0; i<numvotes; i++)
68f2120f 374 {
c8b0fcfe 375 if ( (votes[numvotes-1-i]= _komodo_paxprice(height-i,base,rel,100000)) == 0 )
68f2120f 376 {
9fd7459c 377 zeroes++;
378 //printf("null price height.%d\n",height-i);
379 //return(0);
380 } else sum += votes[i], nonz++;
ecc2479a 381 //printf("%.8f, ",dstr(votes[i]));
68f2120f 382 }
9fd7459c 383 if ( nonz <= (numvotes >> 1) )
384 return(0);
385 sum /= nonz;
386 lastprice = sum;
387 for (i=0; i<numvotes; i++)
388 {
389 if ( votes[i] == 0 )
390 votes[i] = lastprice;
391 else lastprice = votes[i];
392 }
ecc2479a 393 //printf("\n}; // numvotes.%d\n\n",numvotes);
0bda6249 394 *seedp = seed = komodo_seed(height);
9fd7459c 395 tolerance = sum / 50;
2e9292fe 396 for (k=0; k<numvotes; k++)
397 {
c26adb35 398 ind = Peggy_inds[(k + seed) % numvotes];
2e9292fe 399 i = (int32_t)(ind % numvotes);
400 wt = 0;
401 if ( votes[i] != 0 )
402 {
403 for (j=0; j<numvotes; j++)
404 {
405 if ( votes[j] != 0 )
406 {
407 if ( (delta= (votes[i] - votes[j])) < 0 )
408 delta = -delta;
409 if ( delta <= tolerance )
410 {
411 wt++;
412 if ( wt > (numvotes >> 1) )
413 break;
414 }
415 }
416 }
417 }
418 if ( wt > (numvotes >> 1) )
419 {
420 ind = i;
421 for (densum=sum=j=0; j<numvotes; j++)
422 {
423 den = peggy_smooth_coeffs[j];
424 densum += den;
425 sum += (den * votes[(ind + j) % numvotes]);
426 }
427 sum /= densum;
c8b0fcfe 428 sum = (sum * basevolume) / 100000;
31eef660 429 printf("paxprice seed.%llx sum %.8f densum %.8f basevol %.8f height.%d\n",(long long)seed,dstr(sum),dstr(densum),dstr(basevolume),height);
2e9292fe 430 break;
431 }
432 }
433 return(sum);
434}
435
d836ec3f 436int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel)
a4ebaad7 437{
b20a5d7f 438 int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr;
a4ebaad7 439 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
440 {
441 for (i=NUM_PRICES-1; i>=0; i--)
442 {
443 ptr = &PVALS[36 * i];
56d91e9c 444 heights[num] = *ptr;
445 prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN);
446 num++;
447 if ( num >= max )
448 return(num);
a4ebaad7 449 }
450 }
56d91e9c 451 return(num);
a4ebaad7 452}
453
cd1fcb48 454void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen)
47e5cbc1 455{
456 double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero;
457 numpvals = dpow_readprices(pricefeed,&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
458 memset(&zero,0,sizeof(zero));
e155dbe9 459 komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0,0);
0765bc71 460 //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen);
47e5cbc1 461}
462
0bda6249 463uint64_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 464{
fe965b1c 465 uint8_t shortflag = 0; char base[4]; int32_t i,baseid; uint8_t addrtype,rmd160[20]; int64_t komodoshis = 0;
7c6f8298 466 if ( (baseid= komodo_baseid(origbase)) < 0 || baseid == MAX_CURRENCIES )
d019c447 467 return(0);
3ba8f923 468 for (i=0; i<3; i++)
469 base[i] = toupper(origbase[i]);
470 base[i] = 0;
30e79ca6 471 if ( fiatoshis < 0 )
472 shortflag = 1, fiatoshis = -fiatoshis;
0bda6249 473 komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
c3d94aec 474 printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN);
d019c447 475 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
1e81ccb7 476 {
7c6f8298 477 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
d019c447 478 bitcoin_address(destaddr,KOMODO_PUBTYPE,pubkey33,33);
1e81ccb7 479 }
d019c447 480 return(komodoshis);
1e81ccb7 481}
This page took 0.189222 seconds and 4 git commands to generate.