]> 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];
3ba8f923 303 if ( basevolume > 1000000*COIN )
2e4514ce 304 return(0);
a4ebaad7 305 if ( (pvalb= pvals[baseid]) != 0 )
306 {
307 if ( relid == MAX_CURRENCIES )
308 {
309 kmdbtc = pvals[MAX_CURRENCIES];
310 btcusd = pvals[MAX_CURRENCIES + 1];
311 if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 )
312 {
313 baseusd = ((uint64_t)pvalb * 1000000000) / pvals[USD];
74fcb540 314 usdvol = komodo_paxvol(basevolume,baseusd) / MINDENOMS[baseid];
048ae852 315 usdkmd = ((uint64_t)btcusd * 1000000000) / kmdbtc;
a4ebaad7 316 //printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd);
e647aac3 317 //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 318 return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd));
a4ebaad7 319 }
320 }
321 else if ( baseid == relid )
322 {
56d91e9c 323 if ( baseid != MAX_CURRENCIES )
324 {
325 pax_rank(ranked,pvals);
5d299045 326 return(10 * ranked[baseid]); // scaled percentage of M1 total
56d91e9c 327 }
a4ebaad7 328 }
329 else if ( (pvalr= pvals[relid]) != 0 )
330 {
331 baserel = ((uint64_t)pvalb * 1000000000) / pvalr;
8bca5843 332 printf("baserel.%lld %lld %lld %.8f %.8f\n",(long long)baserel,(long long)MINDENOMS[baseid],(long long)MINDENOMS[relid],MINDENOMS[baseid]/MINDENOMS[relid],MINDENOMS[relid]/MINDENOMS[baseid]);
b6f95ae6 333 if ( MINDENOMS[baseid] > MINDENOMS[relid] )
1a6bc62c 334 baserel /= (MINDENOMS[baseid] / MINDENOMS[relid]);
b6f95ae6 335 else if ( MINDENOMS[baseid] < MINDENOMS[relid] )
1a6bc62c 336 baserel *= (MINDENOMS[relid] / MINDENOMS[baseid]);
337 return(komodo_paxvol(basevolume,baserel));
a4ebaad7 338 }
339 }
08ef004d 340 return(0);
a4ebaad7 341}
342
2e9292fe 343uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume)
1e81ccb7 344{
c149d44c 345 int32_t baseid=-1,relid=-1,i; uint32_t *ptr;
1e81ccb7 346 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
347 {
348 for (i=NUM_PRICES-1; i>=0; i--)
349 {
350 ptr = &PVALS[36 * i];
351 if ( *ptr < height )
d019c447 352 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume));
1e81ccb7 353 }
354 } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
355 return(0);
356}
357
2e9292fe 358uint64_t komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume)
359{
9fd7459c 360 int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539];
5d299045 361 return(_komodo_paxprice(height,base,rel,basevolume));
362
2e9292fe 363 numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
364 memset(votes,0,sizeof(votes));
9fd7459c 365 for (sum=i=zeroes=nonz=0; i<numvotes; i++)
68f2120f 366 {
9fd7459c 367 if ( (votes[numvotes-1-i]= _komodo_paxprice(height-i,base,rel,COIN)) == 0 )
68f2120f 368 {
9fd7459c 369 zeroes++;
370 //printf("null price height.%d\n",height-i);
371 //return(0);
372 } else sum += votes[i], nonz++;
1164fcd2 373 //printf("%.8f, ",dstr(votes[i]));
68f2120f 374 }
9fd7459c 375 if ( nonz <= (numvotes >> 1) )
376 return(0);
377 sum /= nonz;
378 lastprice = sum;
379 for (i=0; i<numvotes; i++)
380 {
381 if ( votes[i] == 0 )
382 votes[i] = lastprice;
383 else lastprice = votes[i];
384 }
1164fcd2 385 //printf("\n}; // numvotes.%d\n\n",numvotes);
c26adb35 386 seed = komodo_seed(height);
9fd7459c 387 tolerance = sum / 50;
2e9292fe 388 for (k=0; k<numvotes; k++)
389 {
c26adb35 390 ind = Peggy_inds[(k + seed) % numvotes];
2e9292fe 391 i = (int32_t)(ind % numvotes);
392 wt = 0;
393 if ( votes[i] != 0 )
394 {
395 for (j=0; j<numvotes; j++)
396 {
397 if ( votes[j] != 0 )
398 {
399 if ( (delta= (votes[i] - votes[j])) < 0 )
400 delta = -delta;
401 if ( delta <= tolerance )
402 {
403 wt++;
404 if ( wt > (numvotes >> 1) )
405 break;
406 }
407 }
408 }
409 }
410 if ( wt > (numvotes >> 1) )
411 {
412 ind = i;
413 for (densum=sum=j=0; j<numvotes; j++)
414 {
415 den = peggy_smooth_coeffs[j];
416 densum += den;
417 sum += (den * votes[(ind + j) % numvotes]);
418 }
419 sum /= densum;
c26adb35 420 sum = (sum * basevolume) / COIN;
421 //printf("seed.%llx sum %.8f densum %.8f basevol %.8f\n",(long long)seed,dstr(sum),dstr(densum),dstr(basevolume));
2e9292fe 422 break;
423 }
424 }
425 return(sum);
426}
427
d836ec3f 428int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel)
a4ebaad7 429{
b20a5d7f 430 int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr;
a4ebaad7 431 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
432 {
433 for (i=NUM_PRICES-1; i>=0; i--)
434 {
435 ptr = &PVALS[36 * i];
56d91e9c 436 heights[num] = *ptr;
437 prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN);
438 num++;
439 if ( num >= max )
440 return(num);
a4ebaad7 441 }
442 }
56d91e9c 443 return(num);
a4ebaad7 444}
445
cd1fcb48 446void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen)
47e5cbc1 447{
448 double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero;
449 numpvals = dpow_readprices(pricefeed,&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
450 memset(&zero,0,sizeof(zero));
429dabb5 451 komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0);
0765bc71 452 //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen);
47e5cbc1 453}
454
d95bcb64 455uint64_t PAX_fiatdest(int32_t tokomodo,char *destaddr,uint8_t pubkey33[33],char *coinaddr,int32_t height,char *origbase,int64_t fiatoshis)
1e81ccb7 456{
fe965b1c 457 uint8_t shortflag = 0; char base[4]; int32_t i,baseid; uint8_t addrtype,rmd160[20]; int64_t komodoshis = 0;
7c6f8298 458 if ( (baseid= komodo_baseid(origbase)) < 0 || baseid == MAX_CURRENCIES )
d019c447 459 return(0);
3ba8f923 460 for (i=0; i<3; i++)
461 base[i] = toupper(origbase[i]);
462 base[i] = 0;
30e79ca6 463 if ( fiatoshis < 0 )
464 shortflag = 1, fiatoshis = -fiatoshis;
3ba8f923 465 komodoshis = komodo_paxprice(height,base,(char *)"KMD",(uint64_t)fiatoshis);
d019c447 466 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
1e81ccb7 467 {
7c6f8298 468 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
d019c447 469 bitcoin_address(destaddr,KOMODO_PUBTYPE,pubkey33,33);
1e81ccb7 470 }
d019c447 471 return(komodoshis);
1e81ccb7 472}
This page took 0.125519 seconds and 4 git commands to generate.