test
[VerusCoin.git] / src / komodo_utils.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 ******************************************************************************/
3eea72f2 15
453e1052 16#define SATOSHIDEN ((uint64_t)100000000L)
32b1b443 17#define dstr(x) ((double)(x) / SATOSHIDEN)
b67b154f 18#define portable_mutex_t pthread_mutex_t
19#define portable_mutex_init(ptr) pthread_mutex_init(ptr,NULL)
20#define portable_mutex_lock pthread_mutex_lock
21#define portable_mutex_unlock pthread_mutex_unlock
32b1b443 22
2552dbb4 23struct allocitem { uint32_t allocsize,type; };
0a912c89 24struct queueitem { struct queueitem *next,*prev; uint32_t allocsize,type; };
25
a18fbdc5 26typedef struct queue
27{
28 struct queueitem *list;
0a912c89 29 pthread_mutex_t mutex;
a18fbdc5 30 char name[64],initflag;
31} queue_t;
32
48fa27d9 33union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
34typedef union _bits256 bits256;
35
d019c447 36#include "mini-gmp.c"
37#include "uthash.h"
429dabb5 38#include "utlist.h"
3eea72f2 39
40#define CRYPTO777_PUBSECPSTR "020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9"
b62d7030 41#define CRYPTO777_KMDADDR "RXL3YXG2ceaB6C5hfJcN4fvmLH2C34knhA"
878412df 42#define CRYPTO777_RMD160STR "f1dce4182fce875748c4986b240ff7d7bc3fffb0"
b62d7030 43
d019c447 44#define KOMODO_PUBTYPE 60
45
d019c447 46struct sha256_vstate { uint64_t length; uint32_t state[8],curlen; uint8_t buf[64]; };
47struct rmd160_vstate { uint64_t length; uint8_t buf[64]; uint32_t curlen, state[5]; };
48
49// following is ported from libtom
50
51#define STORE32L(x, y) \
52{ (y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \
53(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); }
54
55#define LOAD32L(x, y) \
56{ x = (uint32_t)(((uint64_t)((y)[3] & 255)<<24) | \
57((uint32_t)((y)[2] & 255)<<16) | \
58((uint32_t)((y)[1] & 255)<<8) | \
59((uint32_t)((y)[0] & 255))); }
60
61#define STORE64L(x, y) \
62{ (y)[7] = (uint8_t)(((x)>>56)&255); (y)[6] = (uint8_t)(((x)>>48)&255); \
63(y)[5] = (uint8_t)(((x)>>40)&255); (y)[4] = (uint8_t)(((x)>>32)&255); \
64(y)[3] = (uint8_t)(((x)>>24)&255); (y)[2] = (uint8_t)(((x)>>16)&255); \
65(y)[1] = (uint8_t)(((x)>>8)&255); (y)[0] = (uint8_t)((x)&255); }
66
67#define LOAD64L(x, y) \
68{ x = (((uint64_t)((y)[7] & 255))<<56)|(((uint64_t)((y)[6] & 255))<<48)| \
69(((uint64_t)((y)[5] & 255))<<40)|(((uint64_t)((y)[4] & 255))<<32)| \
70(((uint64_t)((y)[3] & 255))<<24)|(((uint64_t)((y)[2] & 255))<<16)| \
71(((uint64_t)((y)[1] & 255))<<8)|(((uint64_t)((y)[0] & 255))); }
72
73#define STORE32H(x, y) \
74{ (y)[0] = (uint8_t)(((x)>>24)&255); (y)[1] = (uint8_t)(((x)>>16)&255); \
75(y)[2] = (uint8_t)(((x)>>8)&255); (y)[3] = (uint8_t)((x)&255); }
76
77#define LOAD32H(x, y) \
78{ x = (uint32_t)(((uint64_t)((y)[0] & 255)<<24) | \
79((uint32_t)((y)[1] & 255)<<16) | \
80((uint32_t)((y)[2] & 255)<<8) | \
81((uint32_t)((y)[3] & 255))); }
82
83#define STORE64H(x, y) \
84{ (y)[0] = (uint8_t)(((x)>>56)&255); (y)[1] = (uint8_t)(((x)>>48)&255); \
85(y)[2] = (uint8_t)(((x)>>40)&255); (y)[3] = (uint8_t)(((x)>>32)&255); \
86(y)[4] = (uint8_t)(((x)>>24)&255); (y)[5] = (uint8_t)(((x)>>16)&255); \
87(y)[6] = (uint8_t)(((x)>>8)&255); (y)[7] = (uint8_t)((x)&255); }
88
89#define LOAD64H(x, y) \
90{ x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \
91(((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \
92(((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \
93(((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); }
94
95// Various logical functions
96#define RORc(x, y) ( ((((uint32_t)(x)&0xFFFFFFFFUL)>>(uint32_t)((y)&31)) | ((uint32_t)(x)<<(uint32_t)(32-((y)&31)))) & 0xFFFFFFFFUL)
97#define Ch(x,y,z) (z ^ (x & (y ^ z)))
98#define Maj(x,y,z) (((x | y) & z) | (x & y))
99#define S(x, n) RORc((x),(n))
100#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
101#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
102#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
103#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
104#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
105#define MIN(x, y) ( ((x)<(y))?(x):(y) )
106
107static inline int32_t sha256_vcompress(struct sha256_vstate * md,uint8_t *buf)
108{
109 uint32_t S[8],W[64],t0,t1,i;
110 for (i=0; i<8; i++) // copy state into S
111 S[i] = md->state[i];
112 for (i=0; i<16; i++) // copy the state into 512-bits into W[0..15]
113 LOAD32H(W[i],buf + (4*i));
114 for (i=16; i<64; i++) // fill W[16..63]
115 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
116
117#define RND(a,b,c,d,e,f,g,h,i,ki) \
118t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \
119t1 = Sigma0(a) + Maj(a, b, c); \
120d += t0; \
121h = t0 + t1;
122
123 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
124 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
125 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
126 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);
127 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);
128 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);
129 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);
130 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);
131 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);
132 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);
133 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);
134 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);
135 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);
136 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);
137 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);
138 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);
139 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);
140 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);
141 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);
142 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);
143 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);
144 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);
145 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);
146 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);
147 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);
148 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);
149 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);
150 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);
151 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);
152 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);
153 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);
154 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);
155 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);
156 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);
157 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);
158 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);
159 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);
160 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);
161 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);
162 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);
163 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);
164 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);
165 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);
166 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);
167 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);
168 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);
169 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);
170 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);
171 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);
172 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);
173 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);
174 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);
175 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);
176 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);
177 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);
178 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);
179 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);
180 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);
181 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);
182 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);
183 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);
184 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);
185 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);
186 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);
187#undef RND
188 for (i=0; i<8; i++) // feedback
189 md->state[i] = md->state[i] + S[i];
190 return(0);
191}
192
193#undef RORc
194#undef Ch
195#undef Maj
196#undef S
197#undef R
198#undef Sigma0
199#undef Sigma1
200#undef Gamma0
201#undef Gamma1
202
203static inline void sha256_vinit(struct sha256_vstate * md)
204{
205 md->curlen = 0;
206 md->length = 0;
207 md->state[0] = 0x6A09E667UL;
208 md->state[1] = 0xBB67AE85UL;
209 md->state[2] = 0x3C6EF372UL;
210 md->state[3] = 0xA54FF53AUL;
211 md->state[4] = 0x510E527FUL;
212 md->state[5] = 0x9B05688CUL;
213 md->state[6] = 0x1F83D9ABUL;
214 md->state[7] = 0x5BE0CD19UL;
215}
216
217static inline int32_t sha256_vprocess(struct sha256_vstate *md,const uint8_t *in,uint64_t inlen)
218{
219 uint64_t n; int32_t err;
220 if ( md->curlen > sizeof(md->buf) )
221 return(-1);
222 while ( inlen > 0 )
223 {
224 if ( md->curlen == 0 && inlen >= 64 )
225 {
226 if ( (err= sha256_vcompress(md,(uint8_t *)in)) != 0 )
227 return(err);
228 md->length += 64 * 8, in += 64, inlen -= 64;
229 }
230 else
231 {
232 n = MIN(inlen,64 - md->curlen);
233 memcpy(md->buf + md->curlen,in,(size_t)n);
234 md->curlen += n, in += n, inlen -= n;
235 if ( md->curlen == 64 )
236 {
237 if ( (err= sha256_vcompress(md,md->buf)) != 0 )
238 return(err);
239 md->length += 8*64;
240 md->curlen = 0;
241 }
242 }
243 }
244 return(0);
245}
246
247static inline int32_t sha256_vdone(struct sha256_vstate *md,uint8_t *out)
248{
249 int32_t i;
250 if ( md->curlen >= sizeof(md->buf) )
251 return(-1);
252 md->length += md->curlen * 8; // increase the length of the message
253 md->buf[md->curlen++] = (uint8_t)0x80; // append the '1' bit
254 // if len > 56 bytes we append zeros then compress. Then we can fall back to padding zeros and length encoding like normal.
255 if ( md->curlen > 56 )
256 {
257 while ( md->curlen < 64 )
258 md->buf[md->curlen++] = (uint8_t)0;
259 sha256_vcompress(md,md->buf);
260 md->curlen = 0;
261 }
262 while ( md->curlen < 56 ) // pad upto 56 bytes of zeroes
263 md->buf[md->curlen++] = (uint8_t)0;
264 STORE64H(md->length,md->buf+56); // store length
265 sha256_vcompress(md,md->buf);
266 for (i=0; i<8; i++) // copy output
267 STORE32H(md->state[i],out+(4*i));
268 return(0);
269}
270
271void vcalc_sha256(char deprecated[(256 >> 3) * 2 + 1],uint8_t hash[256 >> 3],uint8_t *src,int32_t len)
272{
273 struct sha256_vstate md;
274 sha256_vinit(&md);
275 sha256_vprocess(&md,src,len);
276 sha256_vdone(&md,hash);
277}
278
279bits256 bits256_doublesha256(char *deprecated,uint8_t *data,int32_t datalen)
280{
281 bits256 hash,hash2; int32_t i;
282 vcalc_sha256(0,hash.bytes,data,datalen);
283 vcalc_sha256(0,hash2.bytes,hash.bytes,sizeof(hash));
284 for (i=0; i<sizeof(hash); i++)
285 hash.bytes[i] = hash2.bytes[sizeof(hash) - 1 - i];
286 return(hash);
287}
288
289// rmd160: the five basic functions F(), G() and H()
290#define F(x, y, z) ((x) ^ (y) ^ (z))
291#define G(x, y, z) (((x) & (y)) | (~(x) & (z)))
292#define H(x, y, z) (((x) | ~(y)) ^ (z))
293#define I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
294#define J(x, y, z) ((x) ^ ((y) | ~(z)))
295#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
296
297/* the ten basic operations FF() through III() */
298#define FF(a, b, c, d, e, x, s) \
299(a) += F((b), (c), (d)) + (x);\
300(a) = ROLc((a), (s)) + (e);\
301(c) = ROLc((c), 10);
302
303#define GG(a, b, c, d, e, x, s) \
304(a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
305(a) = ROLc((a), (s)) + (e);\
306(c) = ROLc((c), 10);
307
308#define HH(a, b, c, d, e, x, s) \
309(a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
310(a) = ROLc((a), (s)) + (e);\
311(c) = ROLc((c), 10);
312
313#define II(a, b, c, d, e, x, s) \
314(a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
315(a) = ROLc((a), (s)) + (e);\
316(c) = ROLc((c), 10);
317
318#define JJ(a, b, c, d, e, x, s) \
319(a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
320(a) = ROLc((a), (s)) + (e);\
321(c) = ROLc((c), 10);
322
323#define FFF(a, b, c, d, e, x, s) \
324(a) += F((b), (c), (d)) + (x);\
325(a) = ROLc((a), (s)) + (e);\
326(c) = ROLc((c), 10);
327
328#define GGG(a, b, c, d, e, x, s) \
329(a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
330(a) = ROLc((a), (s)) + (e);\
331(c) = ROLc((c), 10);
332
333#define HHH(a, b, c, d, e, x, s) \
334(a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
335(a) = ROLc((a), (s)) + (e);\
336(c) = ROLc((c), 10);
337
338#define III(a, b, c, d, e, x, s) \
339(a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
340(a) = ROLc((a), (s)) + (e);\
341(c) = ROLc((c), 10);
342
343#define JJJ(a, b, c, d, e, x, s) \
344(a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
345(a) = ROLc((a), (s)) + (e);\
346(c) = ROLc((c), 10);
347
348static int32_t rmd160_vcompress(struct rmd160_vstate *md,uint8_t *buf)
349{
350 uint32_t aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
351 int i;
352
353 /* load words X */
354 for (i = 0; i < 16; i++){
355 LOAD32L(X[i], buf + (4 * i));
356 }
357
358 /* load state */
359 aa = aaa = md->state[0];
360 bb = bbb = md->state[1];
361 cc = ccc = md->state[2];
362 dd = ddd = md->state[3];
363 ee = eee = md->state[4];
364
365 /* round 1 */
366 FF(aa, bb, cc, dd, ee, X[ 0], 11);
367 FF(ee, aa, bb, cc, dd, X[ 1], 14);
368 FF(dd, ee, aa, bb, cc, X[ 2], 15);
369 FF(cc, dd, ee, aa, bb, X[ 3], 12);
370 FF(bb, cc, dd, ee, aa, X[ 4], 5);
371 FF(aa, bb, cc, dd, ee, X[ 5], 8);
372 FF(ee, aa, bb, cc, dd, X[ 6], 7);
373 FF(dd, ee, aa, bb, cc, X[ 7], 9);
374 FF(cc, dd, ee, aa, bb, X[ 8], 11);
375 FF(bb, cc, dd, ee, aa, X[ 9], 13);
376 FF(aa, bb, cc, dd, ee, X[10], 14);
377 FF(ee, aa, bb, cc, dd, X[11], 15);
378 FF(dd, ee, aa, bb, cc, X[12], 6);
379 FF(cc, dd, ee, aa, bb, X[13], 7);
380 FF(bb, cc, dd, ee, aa, X[14], 9);
381 FF(aa, bb, cc, dd, ee, X[15], 8);
382
383 /* round 2 */
384 GG(ee, aa, bb, cc, dd, X[ 7], 7);
385 GG(dd, ee, aa, bb, cc, X[ 4], 6);
386 GG(cc, dd, ee, aa, bb, X[13], 8);
387 GG(bb, cc, dd, ee, aa, X[ 1], 13);
388 GG(aa, bb, cc, dd, ee, X[10], 11);
389 GG(ee, aa, bb, cc, dd, X[ 6], 9);
390 GG(dd, ee, aa, bb, cc, X[15], 7);
391 GG(cc, dd, ee, aa, bb, X[ 3], 15);
392 GG(bb, cc, dd, ee, aa, X[12], 7);
393 GG(aa, bb, cc, dd, ee, X[ 0], 12);
394 GG(ee, aa, bb, cc, dd, X[ 9], 15);
395 GG(dd, ee, aa, bb, cc, X[ 5], 9);
396 GG(cc, dd, ee, aa, bb, X[ 2], 11);
397 GG(bb, cc, dd, ee, aa, X[14], 7);
398 GG(aa, bb, cc, dd, ee, X[11], 13);
399 GG(ee, aa, bb, cc, dd, X[ 8], 12);
400
401 /* round 3 */
402 HH(dd, ee, aa, bb, cc, X[ 3], 11);
403 HH(cc, dd, ee, aa, bb, X[10], 13);
404 HH(bb, cc, dd, ee, aa, X[14], 6);
405 HH(aa, bb, cc, dd, ee, X[ 4], 7);
406 HH(ee, aa, bb, cc, dd, X[ 9], 14);
407 HH(dd, ee, aa, bb, cc, X[15], 9);
408 HH(cc, dd, ee, aa, bb, X[ 8], 13);
409 HH(bb, cc, dd, ee, aa, X[ 1], 15);
410 HH(aa, bb, cc, dd, ee, X[ 2], 14);
411 HH(ee, aa, bb, cc, dd, X[ 7], 8);
412 HH(dd, ee, aa, bb, cc, X[ 0], 13);
413 HH(cc, dd, ee, aa, bb, X[ 6], 6);
414 HH(bb, cc, dd, ee, aa, X[13], 5);
415 HH(aa, bb, cc, dd, ee, X[11], 12);
416 HH(ee, aa, bb, cc, dd, X[ 5], 7);
417 HH(dd, ee, aa, bb, cc, X[12], 5);
418
419 /* round 4 */
420 II(cc, dd, ee, aa, bb, X[ 1], 11);
421 II(bb, cc, dd, ee, aa, X[ 9], 12);
422 II(aa, bb, cc, dd, ee, X[11], 14);
423 II(ee, aa, bb, cc, dd, X[10], 15);
424 II(dd, ee, aa, bb, cc, X[ 0], 14);
425 II(cc, dd, ee, aa, bb, X[ 8], 15);
426 II(bb, cc, dd, ee, aa, X[12], 9);
427 II(aa, bb, cc, dd, ee, X[ 4], 8);
428 II(ee, aa, bb, cc, dd, X[13], 9);
429 II(dd, ee, aa, bb, cc, X[ 3], 14);
430 II(cc, dd, ee, aa, bb, X[ 7], 5);
431 II(bb, cc, dd, ee, aa, X[15], 6);
432 II(aa, bb, cc, dd, ee, X[14], 8);
433 II(ee, aa, bb, cc, dd, X[ 5], 6);
434 II(dd, ee, aa, bb, cc, X[ 6], 5);
435 II(cc, dd, ee, aa, bb, X[ 2], 12);
436
437 /* round 5 */
438 JJ(bb, cc, dd, ee, aa, X[ 4], 9);
439 JJ(aa, bb, cc, dd, ee, X[ 0], 15);
440 JJ(ee, aa, bb, cc, dd, X[ 5], 5);
441 JJ(dd, ee, aa, bb, cc, X[ 9], 11);
442 JJ(cc, dd, ee, aa, bb, X[ 7], 6);
443 JJ(bb, cc, dd, ee, aa, X[12], 8);
444 JJ(aa, bb, cc, dd, ee, X[ 2], 13);
445 JJ(ee, aa, bb, cc, dd, X[10], 12);
446 JJ(dd, ee, aa, bb, cc, X[14], 5);
447 JJ(cc, dd, ee, aa, bb, X[ 1], 12);
448 JJ(bb, cc, dd, ee, aa, X[ 3], 13);
449 JJ(aa, bb, cc, dd, ee, X[ 8], 14);
450 JJ(ee, aa, bb, cc, dd, X[11], 11);
451 JJ(dd, ee, aa, bb, cc, X[ 6], 8);
452 JJ(cc, dd, ee, aa, bb, X[15], 5);
453 JJ(bb, cc, dd, ee, aa, X[13], 6);
454
455 /* parallel round 1 */
456 JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
457 JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
458 JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
459 JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
460 JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
461 JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
462 JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
463 JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
464 JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
465 JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
466 JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
467 JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
468 JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
469 JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
470 JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
471 JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
472
473 /* parallel round 2 */
474 III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
475 III(ddd, eee, aaa, bbb, ccc, X[11], 13);
476 III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
477 III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
478 III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
479 III(eee, aaa, bbb, ccc, ddd, X[13], 8);
480 III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
481 III(ccc, ddd, eee, aaa, bbb, X[10], 11);
482 III(bbb, ccc, ddd, eee, aaa, X[14], 7);
483 III(aaa, bbb, ccc, ddd, eee, X[15], 7);
484 III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
485 III(ddd, eee, aaa, bbb, ccc, X[12], 7);
486 III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
487 III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
488 III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
489 III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
490
491 /* parallel round 3 */
492 HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
493 HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
494 HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
495 HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
496 HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
497 HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
498 HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
499 HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
500 HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
501 HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
502 HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
503 HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
504 HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
505 HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
506 HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
507 HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
508
509 /* parallel round 4 */
510 GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
511 GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
512 GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
513 GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
514 GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
515 GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
516 GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
517 GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
518 GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
519 GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
520 GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
521 GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
522 GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
523 GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
524 GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
525 GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
526
527 /* parallel round 5 */
528 FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
529 FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
530 FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
531 FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
532 FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
533 FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
534 FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
535 FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
536 FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
537 FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
538 FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
539 FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
540 FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
541 FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
542 FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
543 FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
544
545 /* combine results */
546 ddd += cc + md->state[1]; /* final result for md->state[0] */
547 md->state[1] = md->state[2] + dd + eee;
548 md->state[2] = md->state[3] + ee + aaa;
549 md->state[3] = md->state[4] + aa + bbb;
550 md->state[4] = md->state[0] + bb + ccc;
551 md->state[0] = ddd;
552
553 return 0;
554}
555
556/**
557 Initialize the hash state
558 @param md The hash state you wish to initialize
559 @return 0 if successful
560 */
561int rmd160_vinit(struct rmd160_vstate * md)
562{
563 md->state[0] = 0x67452301UL;
564 md->state[1] = 0xefcdab89UL;
565 md->state[2] = 0x98badcfeUL;
566 md->state[3] = 0x10325476UL;
567 md->state[4] = 0xc3d2e1f0UL;
568 md->curlen = 0;
569 md->length = 0;
570 return 0;
571}
572#define HASH_PROCESS(func_name, compress_name, state_var, block_size) \
573int func_name (struct rmd160_vstate * md, const unsigned char *in, unsigned long inlen) \
574{ \
575unsigned long n; \
576int err; \
577if (md->curlen > sizeof(md->buf)) { \
578return -1; \
579} \
580while (inlen > 0) { \
581if (md->curlen == 0 && inlen >= block_size) { \
582if ((err = compress_name (md, (unsigned char *)in)) != 0) { \
583return err; \
584} \
585md->length += block_size * 8; \
586in += block_size; \
587inlen -= block_size; \
588} else { \
589n = MIN(inlen, (block_size - md->curlen)); \
590memcpy(md->buf + md->curlen, in, (size_t)n); \
591md->curlen += n; \
592in += n; \
593inlen -= n; \
594if (md->curlen == block_size) { \
595if ((err = compress_name (md, md->buf)) != 0) { \
596return err; \
597} \
598md->length += 8*block_size; \
599md->curlen = 0; \
600} \
601} \
602} \
603return 0; \
604}
605
606/**
607 Process a block of memory though the hash
608 @param md The hash state
609 @param in The data to hash
610 @param inlen The length of the data (octets)
611 @return 0 if successful
612 */
613HASH_PROCESS(rmd160_vprocess, rmd160_vcompress, rmd160, 64)
614
615/**
616 Terminate the hash to get the digest
617 @param md The hash state
618 @param out [out] The destination of the hash (20 bytes)
619 @return 0 if successful
620 */
621int rmd160_vdone(struct rmd160_vstate * md, unsigned char *out)
622{
623 int i;
624 if (md->curlen >= sizeof(md->buf)) {
625 return -1;
626 }
627 /* increase the length of the message */
628 md->length += md->curlen * 8;
629
630 /* append the '1' bit */
631 md->buf[md->curlen++] = (unsigned char)0x80;
632
633 /* if the length is currently above 56 bytes we append zeros
634 * then compress. Then we can fall back to padding zeros and length
635 * encoding like normal.
636 */
637 if (md->curlen > 56) {
638 while (md->curlen < 64) {
639 md->buf[md->curlen++] = (unsigned char)0;
640 }
641 rmd160_vcompress(md, md->buf);
642 md->curlen = 0;
643 }
644 /* pad upto 56 bytes of zeroes */
645 while (md->curlen < 56) {
646 md->buf[md->curlen++] = (unsigned char)0;
647 }
648 /* store length */
649 STORE64L(md->length, md->buf+56);
650 rmd160_vcompress(md, md->buf);
651 /* copy output */
652 for (i = 0; i < 5; i++) {
653 STORE32L(md->state[i], out+(4*i));
654 }
655 return 0;
656}
657
658void calc_rmd160(char deprecated[41],uint8_t buf[20],uint8_t *msg,int32_t len)
659{
660 struct rmd160_vstate md;
661 rmd160_vinit(&md);
662 rmd160_vprocess(&md,msg,len);
663 rmd160_vdone(&md, buf);
664}
3eea72f2 665
1e81ccb7 666static const uint32_t crc32_tab[] = {
667 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
668 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
669 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
670 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
671 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
672 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
673 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
674 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
675 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
676 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
677 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
678 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
679 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
680 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
681 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
682 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
683 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
684 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
685 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
686 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
687 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
688 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
689 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
690 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
691 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
692 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
693 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
694 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
695 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
696 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
697 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
698 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
699 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
700 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
701 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
702 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
703 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
704 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
705 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
706 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
707 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
708 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
709 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
710};
711
712uint32_t calc_crc32(uint32_t crc,const void *buf,size_t size)
713{
714 const uint8_t *p;
715
716 p = (const uint8_t *)buf;
717 crc = crc ^ ~0U;
718
719 while (size--)
720 crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
721
722 return crc ^ ~0U;
723}
724
d019c447 725void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen)
726{
727 bits256 hash;
728 vcalc_sha256(0,hash.bytes,data,datalen);
729 calc_rmd160(0,rmd160,hash.bytes,sizeof(hash));
730}
731
732int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr)
733{
734 bits256 hash; uint8_t *buf,_buf[25]; int32_t len;
735 memset(rmd160,0,20);
736 *addrtypep = 0;
737 buf = _buf;
738 if ( (len= bitcoin_base58decode(buf,coinaddr)) >= 4 )
739 {
740 // validate with trailing hash, then remove hash
741 hash = bits256_doublesha256(0,buf,21);
742 *addrtypep = *buf;
743 memcpy(rmd160,buf+1,20);
744 if ( (buf[21]&0xff) == hash.bytes[31] && (buf[22]&0xff) == hash.bytes[30] &&(buf[23]&0xff) == hash.bytes[29] && (buf[24]&0xff) == hash.bytes[28] )
745 {
746 //printf("coinaddr.(%s) valid checksum addrtype.%02x\n",coinaddr,*addrtypep);
747 return(20);
748 }
749 else
750 {
751 int32_t i;
752 if ( len > 20 )
753 {
754 hash = bits256_doublesha256(0,buf,len);
755 }
756 for (i=0; i<len; i++)
757 printf("%02x ",buf[i]);
7637aa7f 758 printf("\nhex checkhash.(%s) len.%d mismatch %02x %02x %02x %02x vs %02x %02x %02x %02x\n",coinaddr,len,buf[len-1]&0xff,buf[len-2]&0xff,buf[len-3]&0xff,buf[len-4]&0xff,hash.bytes[31],hash.bytes[30],hash.bytes[29],hash.bytes[28]);
d019c447 759 }
760 }
761 return(0);
762}
763
764char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len)
765{
766 int32_t i; uint8_t data[25]; bits256 hash;// char checkaddr[65];
767 if ( len != 20 )
768 calc_rmd160_sha256(data+1,pubkey_or_rmd160,len);
769 else memcpy(data+1,pubkey_or_rmd160,20);
770 //btc_convrmd160(checkaddr,addrtype,data+1);
771 data[0] = addrtype;
772 hash = bits256_doublesha256(0,data,21);
773 for (i=0; i<4; i++)
774 data[21+i] = hash.bytes[31-i];
775 if ( (coinaddr= bitcoin_base58encode(coinaddr,data,25)) != 0 )
776 {
777 //uint8_t checktype,rmd160[20];
778 //bitcoin_addr2rmd160(&checktype,rmd160,coinaddr);
779 //if ( strcmp(checkaddr,coinaddr) != 0 )
780 // printf("checkaddr.(%s) vs coinaddr.(%s) %02x vs [%02x] memcmp.%d\n",checkaddr,coinaddr,addrtype,checktype,memcmp(rmd160,data+1,20));
781 }
782 return(coinaddr);
783}
784
dfa036b6 785#define MAX_CURRENCIES 32
18d9697a 786char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
787 "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
788 "KMD" };
789
790int32_t komodo_baseid(char *origbase)
791{
792 int32_t i; char base[64];
793 for (i=0; origbase[i]!=0&&i<sizeof(base); i++)
794 base[i] = toupper((int32_t)(origbase[i] & 0xff));
795 base[i] = 0;
796 for (i=0; i<=MAX_CURRENCIES; i++)
797 if ( strcmp(CURRENCIES[i],base) == 0 )
798 return(i);
dd051793 799 //printf("illegal base.(%s) %s\n",origbase,base);
18d9697a 800 return(-1);
801}
802
8e3430ee 803int32_t komodo_is_issuer()
804{
654dfaaf 805 if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 )
8e3430ee 806 return(1);
807 else return(0);
808}
809
1e81ccb7 810int32_t _unhex(char c)
811{
812 if ( c >= '0' && c <= '9' )
813 return(c - '0');
814 else if ( c >= 'a' && c <= 'f' )
815 return(c - 'a' + 10);
816 else if ( c >= 'A' && c <= 'F' )
817 return(c - 'A' + 10);
818 return(-1);
819}
820
821int32_t is_hexstr(char *str,int32_t n)
822{
823 int32_t i;
824 if ( str == 0 || str[0] == 0 )
825 return(0);
826 for (i=0; str[i]!=0; i++)
827 {
828 if ( n > 0 && i >= n )
829 break;
830 if ( _unhex(str[i]) < 0 )
831 break;
832 }
833 if ( n == 0 )
834 return(i);
835 return(i == n);
836}
837
838int32_t unhex(char c)
839{
840 int32_t hex;
841 if ( (hex= _unhex(c)) < 0 )
842 {
843 //printf("unhex: illegal hexchar.(%c)\n",c);
844 }
845 return(hex);
846}
847
848unsigned char _decode_hex(char *hex) { return((unhex(hex[0])<<4) | unhex(hex[1])); }
849
850int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex)
851{
852 int32_t adjust,i = 0;
853 //printf("decode.(%s)\n",hex);
4f569c79 854 if ( is_hexstr(hex,n) <= 0 )
1e81ccb7 855 {
856 memset(bytes,0,n);
857 return(n);
858 }
e37f280f 859 if ( hex[n-1] == '\n' || hex[n-1] == '\r' )
4f569c79 860 hex[--n] = 0;
1e81ccb7 861 if ( n == 0 || (hex[n*2+1] == 0 && hex[n*2] != 0) )
862 {
863 if ( n > 0 )
864 {
865 bytes[0] = unhex(hex[0]);
866 printf("decode_hex n.%d hex[0] (%c) -> %d hex.(%s) [n*2+1: %d] [n*2: %d %c] len.%ld\n",n,hex[0],bytes[0],hex,hex[n*2+1],hex[n*2],hex[n*2],(long)strlen(hex));
867 }
868 bytes++;
869 hex++;
870 adjust = 1;
871 } else adjust = 0;
872 if ( n > 0 )
873 {
874 for (i=0; i<n; i++)
875 bytes[i] = _decode_hex(&hex[i*2]);
876 }
877 //bytes[i] = 0;
878 return(n + adjust);
879}
880
32b1b443 881char hexbyte(int32_t c)
882{
883 c &= 0xf;
884 if ( c < 10 )
885 return('0'+c);
886 else if ( c < 16 )
887 return('a'+c-10);
888 else return(0);
889}
890
891int32_t init_hexbytes_noT(char *hexbytes,unsigned char *message,long len)
892{
893 int32_t i;
894 if ( len <= 0 )
895 {
896 hexbytes[0] = 0;
897 return(1);
898 }
899 for (i=0; i<len; i++)
900 {
901 hexbytes[i*2] = hexbyte((message[i]>>4) & 0xf);
902 hexbytes[i*2 + 1] = hexbyte(message[i] & 0xf);
903 //printf("i.%d (%02x) [%c%c]\n",i,message[i],hexbytes[i*2],hexbytes[i*2+1]);
904 }
905 hexbytes[len*2] = 0;
906 //printf("len.%ld\n",len*2+1);
907 return((int32_t)len*2+1);
908}
909
910char *bits256_str(char hexstr[65],bits256 x)
911{
912 init_hexbytes_noT(hexstr,x.bytes,sizeof(x));
913 return(hexstr);
914}
915
1e81ccb7 916int32_t iguana_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp)
917{
918 int32_t i; uint64_t x;
919 if ( rwflag == 0 )
920 {
921 x = 0;
922 for (i=len-1; i>=0; i--)
923 {
924 x <<= 8;
925 x |= serialized[i];
926 }
927 switch ( len )
928 {
929 case 1: *(uint8_t *)endianedp = (uint8_t)x; break;
930 case 2: *(uint16_t *)endianedp = (uint16_t)x; break;
931 case 4: *(uint32_t *)endianedp = (uint32_t)x; break;
932 case 8: *(uint64_t *)endianedp = (uint64_t)x; break;
933 }
934 }
935 else
936 {
937 x = 0;
938 switch ( len )
939 {
940 case 1: x = *(uint8_t *)endianedp; break;
941 case 2: x = *(uint16_t *)endianedp; break;
942 case 4: x = *(uint32_t *)endianedp; break;
943 case 8: x = *(uint64_t *)endianedp; break;
944 }
945 for (i=0; i<len; i++,x >>= 8)
946 serialized[i] = (uint8_t)(x & 0xff);
947 }
948 return(len);
949}
950
951int32_t iguana_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp)
952{
953 int32_t i;
954 if ( rwflag == 0 )
955 {
956 for (i=0; i<len; i++)
957 endianedp[i] = serialized[i];
958 }
959 else
960 {
961 for (i=0; i<len; i++)
962 serialized[i] = endianedp[i];
963 }
964 return(len);
965}
966
64bb0834 967int32_t komodo_scriptitemlen(int32_t *opretlenp,uint8_t *script)
968{
969 int32_t opretlen,len = 0;
970 if ( (opretlen= script[len++]) >= 0x4c )
971 {
972 if ( opretlen == 0x4c )
973 opretlen = script[len++];
974 else if ( opretlen == 0x4d )
975 {
976 opretlen = script[len++];
977 opretlen = (opretlen << 8) | script[len++];
978 }
979 }
980 *opretlenp = opretlen;
981 return(len);
982}
983
1e81ccb7 984int32_t komodo_opreturnscript(uint8_t *script,uint8_t type,uint8_t *opret,int32_t opretlen)
985{
986 int32_t offset = 0;
987 script[offset++] = 0x6a;
988 opretlen++;
989 if ( opretlen >= 0x4c )
990 {
991 if ( opretlen > 0xff )
992 {
993 script[offset++] = 0x4d;
994 script[offset++] = opretlen & 0xff;
995 script[offset++] = (opretlen >> 8) & 0xff;
996 }
997 else
998 {
999 script[offset++] = 0x4c;
1000 script[offset++] = opretlen;
1001 }
1002 } else script[offset++] = opretlen;
795751ec 1003 script[offset++] = type; // covered by opretlen
1004 memcpy(&script[offset],opret,opretlen-1);
1005 return(offset + opretlen - 1);
1e81ccb7 1006}
438d3f35 1007
fd1799a6 1008long _stripwhite(char *buf,int accept)
1009{
1010 int32_t i,j,c;
1011 if ( buf == 0 || buf[0] == 0 )
1012 return(0);
1013 for (i=j=0; buf[i]!=0; i++)
1014 {
1015 buf[j] = c = buf[i];
1016 if ( c == accept || (c != ' ' && c != '\n' && c != '\r' && c != '\t' && c != '\b') )
1017 j++;
1018 }
1019 buf[j] = 0;
1020 return(j);
1021}
1022
2c36c760 1023char *clonestr(char *str)
1024{
1025 char *clone;
1026 if ( str == 0 || str[0] == 0 )
1027 {
1028 printf("warning cloning nullstr.%p\n",str);
1029#ifdef __APPLE__
1030 while ( 1 ) sleep(1);
1031#endif
1032 str = (char *)"<nullstr>";
1033 }
1034 clone = (char *)malloc(strlen(str)+16);
1035 strcpy(clone,str);
1036 return(clone);
1037}
1038
f3d5295c 1039int32_t safecopy(char *dest,char *src,long len)
1040{
1041 int32_t i = -1;
1042 if ( src != 0 && dest != 0 && src != dest )
1043 {
1044 if ( dest != 0 )
1045 memset(dest,0,len);
1046 for (i=0; i<len&&src[i]!=0; i++)
1047 dest[i] = src[i];
1048 if ( i == len )
1049 {
1050 printf("safecopy: %s too long %ld\n",src,len);
1051#ifdef __APPLE__
1052 //getchar();
1053#endif
1054 return(-1);
1055 }
1056 dest[i] = 0;
1057 }
1058 return(i);
1059}
1060
fd1799a6 1061char *parse_conf_line(char *line,char *field)
1062{
1063 line += strlen(field);
1064 for (; *line!='='&&*line!=0; line++)
1065 break;
1066 if ( *line == 0 )
1067 return(0);
1068 if ( *line == '=' )
1069 line++;
83c2d095 1070 while ( line[strlen(line)-1] == '\r' || line[strlen(line)-1] == '\n' || line[strlen(line)-1] == ' ' )
5ae7efc1 1071 line[strlen(line)-1] = 0;
e78fb5d3 1072 //printf("LINE.(%s)\n",line);
fd1799a6 1073 _stripwhite(line,0);
1074 return(clonestr(line));
1075}
1076
38550ae9 1077double OS_milliseconds()
1078{
1079 struct timeval tv; double millis;
1080 gettimeofday(&tv,NULL);
1081 millis = ((double)tv.tv_sec * 1000. + (double)tv.tv_usec / 1000.);
1082 //printf("tv_sec.%ld usec.%d %f\n",tv.tv_sec,tv.tv_usec,millis);
1083 return(millis);
1084}
1085
f9557624 1086void OS_randombytes(unsigned char *x,long xlen)
5e39a3aa 1087{
1088 static int fd = -1;
1089 int32_t i;
1090 if (fd == -1) {
1091 for (;;) {
1092 fd = open("/dev/urandom",O_RDONLY);
1093 if (fd != -1) break;
1094 sleep(1);
1095 }
1096 }
1097 while (xlen > 0) {
1098 if (xlen < 1048576) i = (int32_t)xlen; else i = 1048576;
1099 i = (int32_t)read(fd,x,i);
1100 if (i < 1) {
1101 sleep(1);
1102 continue;
1103 }
1104 if ( 0 )
1105 {
1106 int32_t j;
1107 for (j=0; j<i; j++)
1108 printf("%02x ",x[j]);
1109 printf("-> %p\n",x);
1110 }
1111 x += i;
1112 xlen -= i;
1113 }
1114}
1115
429dabb5 1116void lock_queue(queue_t *queue)
1117{
1118 if ( queue->initflag == 0 )
1119 {
1120 portable_mutex_init(&queue->mutex);
1121 queue->initflag = 1;
1122 }
1123 portable_mutex_lock(&queue->mutex);
1124}
1125
5fa92ab2 1126void queue_enqueue(char *name,queue_t *queue,struct queueitem *item)
429dabb5 1127{
429dabb5 1128 if ( queue->name[0] == 0 && name != 0 && name[0] != 0 )
5fa92ab2 1129 strcpy(queue->name,name);
1130 if ( item == 0 )
429dabb5 1131 {
5fa92ab2 1132 printf("FATAL type error: queueing empty value\n");
429dabb5 1133 return;
1134 }
429dabb5 1135 lock_queue(queue);
429dabb5 1136 DL_APPEND(queue->list,item);
1137 portable_mutex_unlock(&queue->mutex);
429dabb5 1138}
1139
5fa92ab2 1140struct queueitem *queue_dequeue(queue_t *queue)
429dabb5 1141{
1142 struct queueitem *item = 0;
1143 lock_queue(queue);
1144 if ( queue->list != 0 )
1145 {
1146 item = queue->list;
429dabb5 1147 DL_DELETE(queue->list,item);
1148 }
1149 portable_mutex_unlock(&queue->mutex);
5fa92ab2 1150 return(item);
429dabb5 1151}
1152
405e2bdd 1153void *queue_delete(queue_t *queue,struct queueitem *copy,int32_t copysize)
429dabb5 1154{
429dabb5 1155 struct queueitem *item = 0;
1156 lock_queue(queue);
1157 if ( queue->list != 0 )
1158 {
1159 DL_FOREACH(queue->list,item)
1160 {
5fa92ab2 1161 if ( item == copy || (item->allocsize == copysize && memcmp((void *)((long)item + sizeof(struct queueitem)),(void *)((long)copy + sizeof(struct queueitem)),copysize) == 0) )
429dabb5 1162 {
1163 DL_DELETE(queue->list,item);
1164 portable_mutex_unlock(&queue->mutex);
5fa92ab2 1165 printf("name.(%s) deleted item.%p list.%p\n",queue->name,item,queue->list);
429dabb5 1166 return(item);
1167 }
1168 }
1169 }
1170 portable_mutex_unlock(&queue->mutex);
1171 return(0);
1172}
1173
1174void *queue_free(queue_t *queue)
1175{
1176 struct queueitem *item = 0;
1177 lock_queue(queue);
1178 if ( queue->list != 0 )
1179 {
1180 DL_FOREACH(queue->list,item)
1181 {
1182 DL_DELETE(queue->list,item);
5fa92ab2 1183 free(item);
429dabb5 1184 }
1185 //printf("name.(%s) dequeue.%p list.%p\n",queue->name,item,queue->list);
1186 }
1187 portable_mutex_unlock(&queue->mutex);
1188 return(0);
1189}
1190
1191void *queue_clone(queue_t *clone,queue_t *queue,int32_t size)
1192{
1193 struct queueitem *ptr,*item = 0;
1194 lock_queue(queue);
1195 if ( queue->list != 0 )
1196 {
1197 DL_FOREACH(queue->list,item)
1198 {
5fa92ab2 1199 ptr = (struct queueitem *)calloc(1,sizeof(*ptr));
429dabb5 1200 memcpy(ptr,item,size);
a856c56a 1201 queue_enqueue(queue->name,clone,ptr);
429dabb5 1202 }
1203 //printf("name.(%s) dequeue.%p list.%p\n",queue->name,item,queue->list);
1204 }
1205 portable_mutex_unlock(&queue->mutex);
1206 return(0);
1207}
1208
1209int32_t queue_size(queue_t *queue)
1210{
1211 int32_t count = 0;
1212 struct queueitem *tmp;
1213 lock_queue(queue);
1214 DL_COUNT(queue->list,tmp,count);
1215 portable_mutex_unlock(&queue->mutex);
1216 return count;
1217}
a18fbdc5 1218
1219void iguana_initQ(queue_t *Q,char *name)
1220{
25314868 1221 struct queueitem *item,*I;
a18fbdc5 1222 memset(Q,0,sizeof(*Q));
96d1da77 1223 I = (struct queueitem *)calloc(1,sizeof(*I));
a18fbdc5 1224 strcpy(Q->name,name);
25314868 1225 queue_enqueue(name,Q,I);
5fa92ab2 1226 if ( (item= queue_dequeue(Q)) != 0 )
1227 free(item);
a18fbdc5 1228}
561ff778 1229
1230void komodo_userpass(char *username,char *password,FILE *fp)
1231{
1232 char *rpcuser,*rpcpassword,*str,line[8192];
1233 rpcuser = rpcpassword = 0;
1234 username[0] = password[0] = 0;
1235 while ( fgets(line,sizeof(line),fp) != 0 )
1236 {
1237 if ( line[0] == '#' )
1238 continue;
1239 //printf("line.(%s) %p %p\n",line,strstr(line,(char *)"rpcuser"),strstr(line,(char *)"rpcpassword"));
1240 if ( (str= strstr(line,(char *)"rpcuser")) != 0 )
1241 rpcuser = parse_conf_line(str,(char *)"rpcuser");
1242 else if ( (str= strstr(line,(char *)"rpcpassword")) != 0 )
1243 rpcpassword = parse_conf_line(str,(char *)"rpcpassword");
1244 }
1245 if ( rpcuser != 0 && rpcpassword != 0 )
1246 {
1247 strcpy(username,rpcuser);
1248 strcpy(password,rpcpassword);
1249 }
1250 //printf("rpcuser.(%s) rpcpassword.(%s) KMDUSERPASS.(%s) %u\n",rpcuser,rpcpassword,KMDUSERPASS,port);
1251 if ( rpcuser != 0 )
1252 free(rpcuser);
1253 if ( rpcpassword != 0 )
1254 free(rpcpassword);
1255}
1256
1257void komodo_configfile(char *symbol,uint16_t port)
1258{
1259 static char myusername[512],mypassword[8192];
7a4c01c9 1260 FILE *fp; uint8_t buf2[33]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i;
561ff778 1261 r = (uint32_t)time(NULL);
1262 r2 = OS_milliseconds();
1263 memcpy(buf,&r,sizeof(r));
1264 memcpy(&buf[sizeof(r)],&r2,sizeof(r2));
1265 memcpy(&buf[sizeof(r)+sizeof(r2)],symbol,strlen(symbol));
1266 crc = calc_crc32(0,(uint8_t *)buf,(int32_t)(sizeof(r)+sizeof(r2)+strlen(symbol)));
1267 OS_randombytes(buf2,sizeof(buf2));
1268 for (i=0; i<sizeof(buf2); i++)
1269 sprintf(&password[i*2],"%02x",buf2[i]);
1270 password[i*2] = 0;
1271 sprintf(buf,"%s.conf",symbol);
1272 BITCOIND_PORT = port;
1273#ifdef WIN32
1274 sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),buf);
1275#else
1276 sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),buf);
1277#endif
1278 if ( (fp= fopen(fname,"rb")) == 0 )
1279 {
1280 if ( (fp= fopen(fname,"wb")) != 0 )
1281 {
eda3ca93 1282 fprintf(fp,"rpcuser=user%u\nrpcpassword=pass%s\nrpcport=%u\nserver=1\ntxindex=1\n\n",crc,password,port);
561ff778 1283 fclose(fp);
1284 printf("Created (%s)\n",fname);
1285 } else printf("Couldnt create (%s)\n",fname);
1286 }
1287 else
1288 {
1289 komodo_userpass(myusername,mypassword,fp);
1290 mapArgs["-rpcpassword"] = mypassword;
1291 mapArgs["-rpcusername"] = myusername;
935fc055 1292 //fprintf(stderr,"myusername.(%s)\n",myusername);
561ff778 1293 fclose(fp);
1294 }
cad9f4c8 1295 strcpy(fname,GetDataDir().string().c_str());
561ff778 1296#ifdef WIN32
1297 while ( fname[strlen(fname)-1] != '\\' )
1298 fname[strlen(fname)-1] = 0;
323832c3 1299 strcat(fname,"komodo.conf");
561ff778 1300#else
1301 while ( fname[strlen(fname)-1] != '/' )
1302 fname[strlen(fname)-1] = 0;
323832c3 1303 strcat(fname,"komodo.conf");
561ff778 1304#endif
935fc055 1305 //printf("KOMODO.(%s)\n",fname);
561ff778 1306 if ( (fp= fopen(fname,"rb")) != 0 )
1307 {
1308 komodo_userpass(username,password,fp);
1309 sprintf(KMDUSERPASS,"%s:%s",username,password);
1310 fclose(fp);
1311 } else printf("couldnt open.(%s)\n",fname);
1312}
1313
3aca2705 1314uint32_t komodo_assetmagic(char *symbol,uint64_t supply)
1315{
1316 uint8_t buf[512]; int32_t len = 0;
1317 len = iguana_rwnum(1,&buf[len],sizeof(supply),(void *)&supply);
1318 strcpy((char *)&buf[len],symbol);
1319 len += strlen(symbol);
1320 return(calc_crc32(0,buf,len));
1321}
1322
1323int32_t komodo_shortflag(char *symbol)
1324{
1325 int32_t i,shortflag = 0;
1326 if ( symbol[0] == '-' )
1327 {
1328 shortflag = 1;
1329 for (i=0; symbol[i+1]!=0; i++)
1330 symbol[i] = symbol[i+1];
1331 symbol[i] = 0;
1332 }
1333 return(shortflag);
1334}
1335
1336uint16_t komodo_assetport(uint32_t magic,int32_t shortflag)
1337{
1338 return(8000 + shortflag*7777 + (magic % 7777));
1339}
1340
1341uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp,int32_t *shortflagp)
1342{
1343 *magicp = komodo_assetmagic(symbol,supply);
1344 *shortflagp = komodo_shortflag(symbol);
1345 return(komodo_assetport(*magicp,*shortflagp));
1346}
1347
1348void komodo_ports(uint16_t ports[MAX_CURRENCIES])
1349{
1350 int32_t i,shortflag; uint32_t magic;
1351 for (i=0; i<MAX_CURRENCIES; i++)
1352 {
1353 ports[i] = komodo_port(CURRENCIES[i],10,&magic,&shortflag);
1354 printf("%u ",ports[i]);
1355 }
1356 printf("ports\n");
1357}
1358
ea0eb58f 1359char *iguanafmtstr = (char *)"curl --url \"http://127.0.0.1:7778\" --data \"{\\\"unitval\\\":\\\"20\\\",\\\"zcash\\\":1,\\\"RELAY\\\":1,\\\"VALIDATE\\\":1,\\\"prefetchlag\\\":-1,\\\"poll\\\":100,\\\"active\\\":1,\\\"agent\\\":\\\"iguana\\\",\\\"method\\\":\\\"addcoin\\\",\\\"startpend\\\":4,\\\"endpend\\\":4,\\\"services\\\":129,\\\"maxpeers\\\":8,\\\"newcoin\\\":\\\"%s\\\",\\\"name\\\":\\\"%s\\\",\\\"hasheaders\\\":1,\\\"useaddmultisig\\\":0,\\\"netmagic\\\":\\\"%s\\\",\\\"p2p\\\":%u,\\\"rpc\\\":%u,\\\"pubval\\\":60,\\\"p2shval\\\":85,\\\"wifval\\\":188,\\\"txfee_satoshis\\\":\\\"10000\\\",\\\"isPoS\\\":0,\\\"minoutput\\\":10000,\\\"minconfirms\\\":2,\\\"genesishash\\\":\\\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\\\",\\\"protover\\\":170002,\\\"genesisblock\\\":\\\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\\\",\\\"debug\\\":0,\\\"seedipaddr\\\":\\\"%s\\\"}\"";
7b7049d3 1360
ab8ef450 1361
561ff778 1362void komodo_args()
1363{
b6a7cb2c 1364 std::string name,addn; char *dirname,fname[512],magicstr[9]; uint8_t magic[4]; FILE *fp; int32_t i,len;
0e1af8a8 1365 IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
1366 NOTARY_PUBKEY = GetArg("-pubkey", "");
1367 if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
1368 USE_EXTERNAL_PUBKEY = 1;
0e1af8a8 1369 name = GetArg("-ac_name","");
1370 if ( name.c_str()[0] != 0 )
561ff778 1371 {
0e1af8a8 1372 ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10);
6ed911ff 1373 addn = GetArg("-seednode","");
1374 if ( strlen(addn.c_str()) > 0 )
b6a7cb2c 1375 ASSETCHAINS_SEED = 1;
0e1af8a8 1376 strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1);
3aca2705 1377 ASSETCHAINS_PORT = komodo_port(ASSETCHAINS_SYMBOL,ASSETCHAINS_SUPPLY,&ASSETCHAINS_MAGIC,&ASSETCHAINS_SHORTFLAG);
935fc055 1378 //fprintf(stderr,"after args: %c%s port.%u magic.%08x supply.%u\n",ASSETCHAINS_SHORTFLAG!=0?'-':'+',ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_MAGIC,(int32_t)ASSETCHAINS_SUPPLY);
0e1af8a8 1379 while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 )
1380 {
1381 fprintf(stderr,"waiting for datadir\n");
1382 sleep(3);
1383 }
935fc055 1384 //fprintf(stderr,"Got datadir.(%s)\n",dirname);
0e1af8a8 1385 if ( ASSETCHAINS_SYMBOL[0] != 0 )
eda3ca93 1386 {
6051a4bc 1387 int32_t komodo_baseid(char *origbase);
eda3ca93 1388 extern int COINBASE_MATURITY;
0e1af8a8 1389 komodo_configfile(ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT + 1);
dc5bef26 1390 //if ( komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 )
4f0c9cec 1391 COINBASE_MATURITY = 1;
eda3ca93 1392 }
f9d9dc4b 1393 ASSETCHAINS_NOTARIES = GetArg("-ac_notaries","");
1394 komodo_assetchain_pubkeys((char *)ASSETCHAINS_NOTARIES.c_str());
6e575e43 1395 iguana_rwnum(1,magic,sizeof(ASSETCHAINS_MAGIC),(void *)&ASSETCHAINS_MAGIC);
1396 for (i=0; i<4; i++)
1397 sprintf(&magicstr[i<<1],"%02x",magic[i]);
1398 magicstr[8] = 0;
1399 sprintf(fname,"gen%s",ASSETCHAINS_SYMBOL);
1400 if ( (fp= fopen(fname,"wb")) != 0 )
1401 {
1402 fprintf(fp,iguanafmtstr,name.c_str(),name.c_str(),magicstr,ASSETCHAINS_PORT,ASSETCHAINS_PORT+1,"78.47.196.146");
1403 fclose(fp);
b6a7cb2c 1404 //printf("created (%s)\n",fname);
6e575e43 1405 } else printf("error creating (%s)\n",fname);
935fc055 1406 }
1407 else
1408 {
1409 ASSETCHAINS_PORT = 8777;
4cea9147 1410 //fprintf(stderr,"IS_KOMODO_NOTARY %d %s\n",IS_KOMODO_NOTARY,NOTARY_PUBKEY.c_str());
935fc055 1411 }
1412 //fprintf(stderr,"%s chain params initialized\n",ASSETCHAINS_SYMBOL);
561ff778 1413}
This page took 0.262146 seconds and 4 git commands to generate.