]> Git Repo - VerusCoin.git/blame - src/komodo_pax.h
mining fix, interests alloc fix, paxwithdraw mining
[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
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 {
432 for (i=NUM_PRICES-1; i>=0; i--)
433 {
434 ptr = &PVALS[36 * i];
435 if ( *ptr < height )
295e677f 436 {
9e838b49 437 if ( kmdbtcp != 0 && btcusdp != 0 )
438 {
717b0c4e 439 *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
440 *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
9e838b49 441 }
295e677f 442 if ( kmdbtc != 0 && btcusd != 0 )
443 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
444 else return(0);
445 }
1e81ccb7 446 }
447 } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
448 return(0);
449}
450
0bda6249 451uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
2e9292fe 452{
c72ee808 453 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;
454 *seedp = komodo_seed(height);
ac606ad4 455 if ( basevolume > KOMODO_PAXMAX )
77af0879 456 {
457 printf("komodo_paxprice overflow %.8f\n",dstr(basevolume));
458 return(0);
459 }
b0c7fb04 460 if ( strcmp(base,"KMD") == 0 || strcmp(base,"kmd") == 0 )
461 {
462 printf("kmd cannot be base currency\n");
463 return(0);
464 }
2e9292fe 465 numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
466 memset(votes,0,sizeof(votes));
295e677f 467 memset(btcusds,0,sizeof(btcusds));
468 memset(kmdbtcs,0,sizeof(kmdbtcs));
469 for (i=0; i<numvotes; i++)
a6cd9b28 470 {
295e677f 471 _komodo_paxprice(&kmdbtcs[numvotes-1-i],&btcusds[numvotes-1-i],height-i,base,rel,100000,0,0);
48dbd80f 472 //printf("(%llu %llu) ",(long long)kmdbtcs[numvotes-1-i],(long long)btcusds[numvotes-1-i]);
a6cd9b28 473 }
c72ee808 474 kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,*seedp) * 539;
475 btcusd = komodo_paxcorrelation(btcusds,numvotes,*seedp) * 539;
295e677f 476 for (i=nonz=0; i<numvotes; i++)
68f2120f 477 {
64b0130f 478 if ( (votes[numvotes-1-i]= _komodo_paxprice(0,0,height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
9fd7459c 479 zeroes++;
295e677f 480 else nonz++;
68f2120f 481 }
9fd7459c 482 if ( nonz <= (numvotes >> 1) )
b75c9445 483 {
ba01ff1f 484 printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
b75c9445 485 printf("komodo_paxprice nonz.%d of numvotes.%d\n",nonz,numvotes);
9fd7459c 486 return(0);
b75c9445 487 }
c72ee808 488 return(komodo_paxcorrelation(votes,numvotes,*seedp) * basevolume / 100000);
2e9292fe 489}
490
d836ec3f 491int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel)
a4ebaad7 492{
b20a5d7f 493 int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr;
a4ebaad7 494 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
495 {
496 for (i=NUM_PRICES-1; i>=0; i--)
497 {
498 ptr = &PVALS[36 * i];
56d91e9c 499 heights[num] = *ptr;
295e677f 500 prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN,0,0);
56d91e9c 501 num++;
502 if ( num >= max )
503 return(num);
a4ebaad7 504 }
505 }
56d91e9c 506 return(num);
a4ebaad7 507}
508
cd1fcb48 509void komodo_paxpricefeed(int32_t height,uint8_t *pricefeed,int32_t opretlen)
47e5cbc1 510{
511 double KMDBTC,BTCUSD,CNYUSD; uint32_t numpvals,timestamp,pvals[128]; uint256 zero;
512 numpvals = dpow_readprices(pricefeed,&timestamp,&KMDBTC,&BTCUSD,&CNYUSD,pvals);
513 memset(&zero,0,sizeof(zero));
e155dbe9 514 komodo_stateupdate(height,0,0,0,zero,0,0,pvals,numpvals,0,0,0,0,0,0);
0765bc71 515 //printf("komodo_paxpricefeed vout OP_RETURN.%d prices numpvals.%d opretlen.%d\n",height,numpvals,opretlen);
47e5cbc1 516}
517
0bda6249 518uint64_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 519{
fe965b1c 520 uint8_t shortflag = 0; char base[4]; int32_t i,baseid; uint8_t addrtype,rmd160[20]; int64_t komodoshis = 0;
c3fa7fad 521 *seedp = 0;
7c6f8298 522 if ( (baseid= komodo_baseid(origbase)) < 0 || baseid == MAX_CURRENCIES )
c3fa7fad 523 {
524 printf("PAX_fiatdest illegal base.(%s)\n",origbase);
d019c447 525 return(0);
c3fa7fad 526 }
3ba8f923 527 for (i=0; i<3; i++)
528 base[i] = toupper(origbase[i]);
529 base[i] = 0;
30e79ca6 530 if ( fiatoshis < 0 )
531 shortflag = 1, fiatoshis = -fiatoshis;
0bda6249 532 komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
d34d6ce4 533 if ( strcmp(base,"RUB") == 0 )
534 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 535 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
1e81ccb7 536 {
7c6f8298 537 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
d019c447 538 bitcoin_address(destaddr,KOMODO_PUBTYPE,pubkey33,33);
1e81ccb7 539 }
d019c447 540 return(komodoshis);
1e81ccb7 541}
This page took 0.243656 seconds and 4 git commands to generate.