]> 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
16int32_t NUM_PRICES; uint32_t *PVALS;
17
41a4a4db 18#define USD 0
19
1e81ccb7 20#define MAX_CURRENCIES 32
18d9697a 21extern char CURRENCIES[][8];
1e81ccb7 22
a4ebaad7 23uint64_t M1SUPPLY[] = { 3317900000000, 6991604000000, 667780000000000, 1616854000000, 331000000000, 861909000000, 584629000000, 46530000000, // major currencies
05dfe053 24 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 25 100000000 };
26
27#define MIND 1000
28uint32_t MINDENOMS[] = { MIND, MIND, 100*MIND, MIND, MIND, MIND, MIND, MIND, // major currencies
29 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
3010*MIND,
1e81ccb7 31};
32
2e9292fe 33int32_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, };
34
35uint64_t peggy_smooth_coeffs[sizeof(Peggy_inds)/sizeof(*Peggy_inds)] = // numprimes.13
36{
37 962714545, 962506087, 962158759, 961672710, 961048151, 960285354, 959384649, 958346426, 957171134, // x.8
38 955859283, 954411438, 952828225, 951110328, 949258485, 947273493, 945156207, 942907532, 940528434, // x.17
39 938019929, 935383089, 932619036, 929728945, 926714044, 923575608, 920314964, 916933485, 913432593, // x.26
40 909813756, 906078486, 902228342, 898264923, 894189872, 890004874, 885711650, 881311964, 876807614, // x.35
41 872200436, 867492300, 862685110, 857780804, 852781347, 847688737, 842505000, 837232189, 831872382, // x.44
42 826427681, 820900212, 815292123, 809605581, 803842772, 798005901, 792097186, 786118864, 780073180, // x.53
43 773962395, 767788778, 761554609, 755262175, 748913768, 742511686, 736058231, 729555707, 723006417, // x.62
44 716412665, 709776755, 703100984, 696387648, 689639036, 682857428, 676045100, 669204315, 662337327, // x.71
45 655446378, 648533696, 641601496, 634651978, 627687325, 620709702, 613721256, 606724115, 599720386, // x.80
46 592712154, 585701482, 578690411, 571680955, 564675105, 557674825, 550682053, 543698699, 536726645, // x.89
47 529767743, 522823816, 515896658, 508988029, 502099660, 495233249, 488390461, 481572928, 474782249, // x.98
48 468019988, 461287675, 454586804, 447918836, 441285195, 434687268, 428126409, 421603932, 415121117, // x.107
49 408679208, 402279408, 395922888, 389610779, 383344175, 377124134, 370951677, 364827785, 358753406, // x.116
50 352729449, 346756785, 340836251, 334968645, 329154729, 323395230, 317690838, 312042206, 306449955, // x.125
51 300914667, 295436891, 290017141, 284655897, 279353604, 274110676, 268927490, 263804394, 258741701, // x.134
52 253739694, 248798623, 243918709, 239100140, 234343077, 229647649, 225013957, 220442073, 215932043, // x.143
53 211483883, 207097585, 202773112, 198510404, 194309373, 190169909, 186091877, 182075118, 178119452, // x.152
54 174224676, 170390565, 166616873, 162903335, 159249664, 155655556, 152120688, 148644718, 145227287, // x.161
55 141868021, 138566528, 135322401, 132135218, 129004542, 125929924, 122910901, 119946997, 117037723, // x.170
56 114182582, 111381062, 108632643, 105936795, 103292978, 100700645, 98159238, 95668194, 93226942, // x.179
57 90834903, 88491495, 86196126, 83948203, 81747126, 79592292, 77483092, 75418916, 73399150, // x.188
58 71423178, 69490383, 67600142, 65751837, 63944844, 62178541, 60452305, 58765515, 57117547, // x.197
59 55507781, 53935597, 52400377, 50901505, 49438366, 48010349, 46616844, 45257246, 43930951, // x.206
60 42637360, 41375878, 40145912, 38946876, 37778185, 36639262, 35529533, 34448428, 33395384, // x.215
61 32369842, 31371249, 30399057, 29452725, 28531717, 27635503, 26763558, 25915365, 25090413, // x.224
62 24288196, 23508216, 22749980, 22013003, 21296806, 20600917, 19924870, 19268206, 18630475, // x.233
63 18011231, 17410035, 16826458, 16260073, 15710466, 15177224, 14659944, 14158231, 13671694, // x.242
64 13199950, 12742625, 12299348, 11869759, 11453500, 11050225, 10659590, 10281262, 9914910, // x.251
65 9560213, 9216856, 8884529, 8562931, 8251764, 7950739, 7659571, 7377984, 7105706, // x.260
66 6842471, 6588020, 6342099, 6104460, 5874861, 5653066, 5438844, 5231969, 5032221, // x.269
67 4839386, 4653254, 4473620, 4300287, 4133059, 3971747, 3816167, 3666139, 3521488, // x.278
68 3382043, 3247640, 3118115, 2993313, 2873079, 2757266, 2645728, 2538325, 2434919, // x.287
69 2335380, 2239575, 2147382, 2058677, 1973342, 1891262, 1812325, 1736424, 1663453, // x.296
70 1593311, 1525898, 1461118, 1398879, 1339091, 1281666, 1226519, 1173569, 1122736, // x.305
71 1073944, 1027117, 982185, 939076, 897725, 858065, 820033, 783568, 748612, // x.314
72 715108, 682999, 652233, 622759, 594527, 567488, 541597, 516808, 493079, // x.323
73 470368, 448635, 427841, 407948, 388921, 370725, 353326, 336692, 320792, // x.332
74 305596, 291075, 277202, 263950, 251292, 239204, 227663, 216646, 206130, // x.341
75 196094, 186517, 177381, 168667, 160356, 152430, 144874, 137671, 130806, // x.350
76 124264, 118031, 112093, 106437, 101050, 95921, 91039, 86391, 81968, // x.359
77 77759, 73755, 69945, 66322, 62877, 59602, 56488, 53528, 50716, // x.368
78 48043, 45505, 43093, 40803, 38629, 36564, 34604, 32745, 30980, // x.377
79 29305, 27717, 26211, 24782, 23428, 22144, 20927, 19774, 18681, // x.386
80 17646, 16665, 15737, 14857, 14025, 13237, 12491, 11786, 11118, // x.395
81 10487, 9890, 9325, 8791, 8287, 7810, 7359, 6933, 6531, // x.404
82 6151, 5792, 5453, 5133, 4831, 4547, 4278, 4024, 3785, // x.413
83 3560, 3347, 3147, 2958, 2779, 2612, 2454, 2305, 2164, // x.422
84 2032, 1908, 1791, 1681, 1577, 1480, 1388, 1302, 1221, // x.431
85 1145, 1073, 1006, 942, 883, 827, 775, 725, 679, // x.440
86 636, 595, 557, 521, 487, 456, 426, 399, 373, // x.449
87 348, 325, 304, 284, 265, 248, 231, 216, 202, // x.458
88 188, 175, 164, 153, 142, 133, 124, 115, 107, // x.467
89 100, 93, 87, 81, 75, 70, 65, 61, 56, // x.476
90 53, 49, 45, 42, 39, 36, 34, 31, 29, // x.485
91 27, 25, 23, 22, 20, 19, 17, 16, 15, // x.494
92 14, 13, 12, 11, 10, 9, 9, 8, 7, // x.503
93 7, 6, 6, 5, 5, 5, 4, 4, 4, // x.512
94 3, 3, 3, 3, 2, 2, 2, 2, 2, // x.521
95 2, 2, 1, 1, 1, 1, 1, 1, 1, // x.530
96 1, 1, 1, 1, 1, 1, 0, 0, // isum 100000000000
97};
98
ab6984e9 99uint64_t komodo_paxvol(uint64_t volume,uint64_t price)
100{
101 if ( volume < 10000000000 )
102 return((volume * price) / 1000000000);
103 else if ( volume < (uint64_t)10 * 10000000000 )
104 return((volume * (price / 10)) / 100000000);
105 else if ( volume < (uint64_t)100 * 10000000000 )
106 return(((volume / 10) * (price / 10)) / 10000000);
107 else if ( volume < (uint64_t)1000 * 10000000000 )
108 return(((volume / 10) * (price / 100)) / 1000000);
109 else if ( volume < (uint64_t)10000 * 10000000000 )
110 return(((volume / 100) * (price / 100)) / 100000);
111 else if ( volume < (uint64_t)100000 * 10000000000 )
112 return(((volume / 100) * (price / 1000)) / 10000);
113 else if ( volume < (uint64_t)1000000 * 10000000000 )
114 return(((volume / 1000) * (price / 1000)) / 1000);
115 else if ( volume < (uint64_t)10000000 * 10000000000 )
116 return(((volume / 1000) * (price / 10000)) / 100);
117 else return(((volume / 10000) * (price / 10000)) / 10);
118}
119
a4ebaad7 120void pax_rank(uint64_t *ranked,uint32_t *pvals)
121{
122 int32_t i; uint64_t vals[32],sum = 0;
123 for (i=0; i<32; i++)
124 {
125 vals[i] = komodo_paxvol(M1SUPPLY[i] / MINDENOMS[i],pvals[i]);
126 sum += vals[i];
127 }
128 for (i=0; i<32; i++)
129 {
130 ranked[i] = (vals[i] * 1000000000) / sum;
56d91e9c 131 //printf("%.6f ",(double)ranked[i]/1000000000.);
a4ebaad7 132 }
56d91e9c 133 //printf("sum %llu\n",(long long)sum);
a4ebaad7 134};
135
1e81ccb7 136int32_t dpow_readprices(uint8_t *data,uint32_t *timestampp,double *KMDBTCp,double *BTCUSDp,double *CNYUSDp,uint32_t *pvals)
137{
1bf82154 138 uint32_t kmdbtc,btcusd,cnyusd; int32_t i,n,nonz,len = 0;
0201d1a6 139 if ( data[0] == 'P' && data[5] == 35 )
140 data++;
1e81ccb7 141 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)timestampp);
142 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&n);
7eca18ee 143 if ( n != 35 )
7d59e5c9 144 {
145 printf("dpow_readprices illegal n.%d\n",n);
146 return(-1);
147 }
1e81ccb7 148 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&kmdbtc); // /= 1000
149 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&btcusd); // *= 1000
150 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&cnyusd);
151 *KMDBTCp = ((double)kmdbtc / (1000000000. * 1000.));
152 *BTCUSDp = ((double)btcusd / (1000000000. / 1000.));
153 *CNYUSDp = ((double)cnyusd / 1000000000.);
1bf82154 154 for (i=nonz=0; i<n-3; i++)
1e81ccb7 155 {
1bf82154 156 if ( pvals[i] != 0 )
157 nonz++;
49df008c 158 //else if ( nonz != 0 )
159 // printf("pvals[%d] is zero\n",i);
1e81ccb7 160 len += iguana_rwnum(0,&data[len],sizeof(uint32_t),(void *)&pvals[i]);
161 //printf("%u ",pvals[i]);
162 }
32f7d394 163 /*if ( nonz < n-3 )
ef7b1ba6 164 {
49df008c 165 //printf("nonz.%d n.%d retval -1\n",nonz,n);
1bf82154 166 return(-1);
32f7d394 167 }*/
1e81ccb7 168 pvals[i++] = kmdbtc;
169 pvals[i++] = btcusd;
170 pvals[i++] = cnyusd;
171 //printf("OP_RETURN prices\n");
172 return(n);
173}
174
d019c447 175int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize)
176{
177 static uint32_t lastcrc;
d351e231 178 FILE *fp; char fname[512]; uint32_t crc32,check,timestamp; int32_t i,n=0,retval,fsize,len=0; uint8_t data[8192];
d019c447 179#ifdef WIN32
180 sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
181#else
182 sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodofeed");
183#endif
184 if ( (fp= fopen(fname,"rb")) != 0 )
185 {
186 fseek(fp,0,SEEK_END);
187 fsize = (int32_t)ftell(fp);
188 rewind(fp);
189 if ( fsize <= maxsize-4 && fsize <= sizeof(data) && fsize > sizeof(crc32) )
190 {
191 if ( (retval= (int32_t)fread(data,1,fsize,fp)) == fsize )
192 {
193 len = iguana_rwnum(0,data,sizeof(crc32),(void *)&crc32);
194 check = calc_crc32(0,data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
195 if ( check == crc32 )
196 {
197 double KMDBTC,BTCUSD,CNYUSD; uint32_t pvals[128];
1bf82154 198 if ( dpow_readprices(&data[len],&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals) > 0 )
d019c447 199 {
d019c447 200 if ( 0 && lastcrc != crc32 )
201 {
1bf82154 202 for (i=0; i<32; i++)
203 printf("%u ",pvals[i]);
204 printf("t%u n.%d KMD %f BTC %f CNY %f (%f)\n",timestamp,n,KMDBTC,BTCUSD,CNYUSD,CNYUSD!=0?1./CNYUSD:0);
d019c447 205 }
1bf82154 206 if ( timestamp > time(NULL)-600 )
207 {
208 n = komodo_opreturnscript(opret,'P',data+sizeof(crc32),(int32_t)(fsize-sizeof(crc32)));
209 if ( 0 && lastcrc != crc32 )
210 {
211 for (i=0; i<n; i++)
212 printf("%02x",opret[i]);
213 printf(" coinbase opret[%d] crc32.%u:%u\n",n,crc32,check);
214 }
215 } //else printf("t%u too old for %u\n",timestamp,(uint32_t)time(NULL));
216 lastcrc = crc32;
217 }
d019c447 218 } else printf("crc32 %u mismatch %u\n",crc32,check);
219 } else printf("fread.%d error != fsize.%d\n",retval,fsize);
220 } else printf("fsize.%d > maxsize.%d or data[%d]\n",fsize,maxsize,(int32_t)sizeof(data));
221 fclose(fp);
222 }
223 return(n);
224}
225
1e81ccb7 226/*uint32_t PAX_val32(double val)
227 {
228 uint32_t val32 = 0; struct price_resolution price;
229 if ( (price.Pval= val*1000000000) != 0 )
230 {
231 if ( price.Pval > 0xffffffff )
232 printf("Pval overflow error %lld\n",(long long)price.Pval);
233 else val32 = (uint32_t)price.Pval;
234 }
235 return(val32);
236 }*/
237
57abdbaf 238int32_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 239{
57abdbaf 240 if ( rwflag != 0 )
241 {
242 memset(pubkey33,0,33);
243 pubkey33[0] = 0x02 | (*shortflagp != 0);
244 memcpy(&pubkey33[1],fiat,3);
245 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
246 pubkey33[12] = *addrtypep;
247 memcpy(&pubkey33[13],rmd160,20);
248 }
249 else
250 {
251 *shortflagp = (pubkey33[0] == 0x03);
4d272ae4 252 memcpy(fiat,&pubkey33[1],3);
4d272ae4 253 fiat[3] = 0;
57abdbaf 254 iguana_rwnum(rwflag,&pubkey33[4],sizeof(*fiatoshisp),(void *)fiatoshisp);
255 if ( *shortflagp != 0 )
256 *fiatoshisp = -(*fiatoshisp);
257 *addrtypep = pubkey33[12];
258 memcpy(rmd160,&pubkey33[13],20);
259 }
d351e231 260 return(33);
d019c447 261}
262
1e81ccb7 263double PAX_val(uint32_t pval,int32_t baseid)
264{
265 //printf("PAX_val baseid.%d pval.%u\n",baseid,pval);
266 if ( baseid >= 0 && baseid < MAX_CURRENCIES )
267 return(((double)pval / 1000000000.) / MINDENOMS[baseid]);
268 return(0.);
269}
270
271void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals)
272{
5c481612 273 int32_t i,nonz; uint32_t kmdbtc,btcusd,cnyusd; double KMDBTC,BTCUSD,CNYUSD;
1e81ccb7 274 if ( numpvals >= 35 )
275 {
276 for (nonz=i=0; i<32; i++)
277 {
278 if ( pvals[i] != 0 )
279 nonz++;
280 //printf("%u ",pvals[i]);
281 }
282 if ( nonz == 32 )
283 {
284 kmdbtc = pvals[i++];
285 btcusd = pvals[i++];
286 cnyusd = pvals[i++];
5c481612 287 KMDBTC = ((double)kmdbtc / (1000000000. * 1000.));
288 BTCUSD = ((double)btcusd / (1000000000. / 1000.));
289 CNYUSD = ((double)cnyusd / 1000000000.);
1e81ccb7 290 PVALS = (uint32_t *)realloc(PVALS,(NUM_PRICES+1) * sizeof(*PVALS) * 36);
291 PVALS[36 * NUM_PRICES] = height;
292 memcpy(&PVALS[36 * NUM_PRICES + 1],pvals,sizeof(*pvals) * 35);
293 NUM_PRICES++;
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));
ba506bf6 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
2e9292fe 363uint64_t komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume)
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);
c26adb35 394 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;
9ef47e29 429 //printf("seed.%llx sum %.8f densum %.8f basevol %.8f\n",(long long)seed,dstr(sum),dstr(densum),dstr(basevolume));
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));
429dabb5 459 komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,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
d95bcb64 463uint64_t PAX_fiatdest(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;
3ba8f923 473 komodoshis = komodo_paxprice(height,base,(char *)"KMD",(uint64_t)fiatoshis);
d019c447 474 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
1e81ccb7 475 {
7c6f8298 476 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
d019c447 477 bitcoin_address(destaddr,KOMODO_PUBTYPE,pubkey33,33);
1e81ccb7 478 }
d019c447 479 return(komodoshis);
1e81ccb7 480}
This page took 0.121063 seconds and 4 git commands to generate.