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