upgrade cJSON and move customizations to komodo_cJSON
[VerusCoin.git] / src / komodo_jumblr.h
CommitLineData
eeaaf554 1/******************************************************************************
2 * Copyright © 2014-2017 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 ******************************************************************************/
15
16/*
17 z_exportkey "zaddr"
18 z_exportwallet "filename"
19 z_getoperationstatus (["operationid", ... ])
20 z_gettotalbalance ( minconf )
21 z_importkey "zkey" ( rescan )
22 z_importwallet "filename"
23 z_listaddresses
24 z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":"<hex>"},...] ( minconf ) ( fee )
25 */
26
9d365796 27#ifdef _WIN32
28#include <wincrypt.h>
29#endif
30
eeaaf554 31#define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t"
32#define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6"
33#define JUMBLR_MAXSECRETADDRS 777
3db947b8 34#define JUMBLR_SYNCHRONIZED_BLOCKS 10
c89c562b 35#define JUMBLR_INCR 9.965
eeaaf554 36#define JUMBLR_FEE 0.001
37#define JUMBLR_TXFEE 0.01
9bbeff91 38#define SMALLVAL 0.000000000000001
eeaaf554 39
3f318aa4 40#define JUMBLR_ERROR_DUPLICATEDEPOSIT -1
41#define JUMBLR_ERROR_SECRETCANTBEDEPOSIT -2
42#define JUMBLR_ERROR_TOOMANYSECRETS -3
44165ded 43#define JUMBLR_ERROR_NOTINWALLET -4
3f318aa4 44
eeaaf554 45struct jumblr_item
46{
47 UT_hash_handle hh;
f3f124e1 48 int64_t amount,fee,txfee; // fee and txfee not really used (yet)
eeaaf554 49 uint32_t spent,pad;
f3f124e1 50 char opid[66],src[128],dest[128],status;
eeaaf554 51} *Jumblrs;
52
53char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64];
54int32_t Jumblr_numsecretaddrs; // if 0 -> run silent mode
55
a8ec5e86 56char *jumblr_issuemethod(char *userpass,char *method,char *params,uint16_t port)
b487a8fe 57{
58 cJSON *retjson,*resjson = 0; char *retstr;
59 if ( (retstr= komodo_issuemethod(userpass,method,params,port)) != 0 )
60 {
61 if ( (retjson= cJSON_Parse(retstr)) != 0 )
62 {
eb416c9c 63 if ( jobj(retjson,(char *)"result") != 0 )
64 resjson = jduplicate(jobj(retjson,(char *)"result"));
65 else if ( jobj(retjson,(char *)"error") != 0 )
66 resjson = jduplicate(jobj(retjson,(char *)"error"));
b487a8fe 67 else
68 {
69 resjson = cJSON_CreateObject();
eb416c9c 70 jaddstr(resjson,(char *)"error",(char *)"cant parse return");
b487a8fe 71 }
72 free_json(retjson);
73 }
74 free(retstr);
75 }
76 if ( resjson != 0 )
77 return(jprint(resjson,1));
eb416c9c 78 else return(clonestr((char *)"{\"error\":\"unknown error\"}"));
b487a8fe 79}
80
19acd959 81char *jumblr_importaddress(char *address)
eeaaf554 82{
83 char params[1024];
84 sprintf(params,"[\"%s\", \"%s\", false]",address,address);
34017212 85 return(jumblr_issuemethod(KMDUSERPASS,(char *)"importaddress",params,BITCOIND_PORT));
eeaaf554 86}
87
44165ded 88char *jumblr_validateaddress(char *addr)
89{
90 char params[1024];
db53f4bf 91 sprintf(params,"[\"%s\"]",addr);
6ba30dbb 92 printf("validateaddress.%s\n",params);
34017212 93 return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,BITCOIND_PORT));
44165ded 94}
95
eeaaf554 96int32_t Jumblr_secretaddrfind(char *searchaddr)
97{
98 int32_t i;
99 for (i=0; i<Jumblr_numsecretaddrs; i++)
100 {
101 if ( strcmp(searchaddr,Jumblr_secretaddrs[i]) == 0 )
102 return(i);
103 }
104 return(-1);
105}
106
107int32_t Jumblr_secretaddradd(char *secretaddr) // external
108{
109 int32_t ind;
3f318aa4 110 if ( secretaddr != 0 && secretaddr[0] != 0 )
eeaaf554 111 {
3f318aa4 112 if ( Jumblr_numsecretaddrs < JUMBLR_MAXSECRETADDRS )
eeaaf554 113 {
3f318aa4 114 if ( strcmp(Jumblr_deposit,secretaddr) != 0 )
115 {
116 if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 )
117 {
c89c562b 118 ind = Jumblr_numsecretaddrs++;
119 safecopy(Jumblr_secretaddrs[ind],secretaddr,64);
120 }
121 return(ind);
3f318aa4 122 } else return(JUMBLR_ERROR_SECRETCANTBEDEPOSIT);
123 } else return(JUMBLR_ERROR_TOOMANYSECRETS);
124 }
125 else
126 {
127 memset(Jumblr_secretaddrs,0,sizeof(Jumblr_secretaddrs));
128 Jumblr_numsecretaddrs = 0;
eeaaf554 129 }
130 return(Jumblr_numsecretaddrs);
131}
132
b487a8fe 133int32_t Jumblr_depositaddradd(char *depositaddr) // external
eeaaf554 134{
44165ded 135 int32_t ind,retval = JUMBLR_ERROR_DUPLICATEDEPOSIT; char *retstr; cJSON *retjson,*ismine;
eeaaf554 136 if ( depositaddr == 0 )
19acd959 137 depositaddr = (char *)"";
9bbeff91 138 if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 )
eeaaf554 139 {
44165ded 140 if ( (retstr= jumblr_validateaddress(depositaddr)) != 0 )
b487a8fe 141 {
142 if ( (retjson= cJSON_Parse(retstr)) != 0 )
143 {
d430a5e8 144 if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && cJSON_IsTrue(ismine) != 0 )
6ba30dbb 145 {
a8ec5e86 146 retval = 0;
6ba30dbb 147 safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit));
148 }
08952acd 149 else
150 {
151 retval = JUMBLR_ERROR_NOTINWALLET;
d430a5e8 152 printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,cJSON_IsTrue(ismine),jprint(retjson,0));
08952acd 153 }
b487a8fe 154 free_json(retjson);
155 }
156 free(retstr);
157 }
158 }
159 return(retval);
eeaaf554 160}
161
9d365796 162#ifdef _WIN32
163void OS_randombytes(unsigned char *x,long xlen)
164{
165 HCRYPTPROV prov = 0;
166 CryptAcquireContextW(&prov, NULL, NULL,PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
167 CryptGenRandom(prov, xlen, x);
168 CryptReleaseContext(prov, 0);
169}
170#endif
171
eeaaf554 172int32_t Jumblr_secretaddr(char *secretaddr)
173{
174 uint32_t r;
175 if ( Jumblr_numsecretaddrs > 0 )
176 {
19acd959 177 OS_randombytes((uint8_t *)&r,sizeof(r));
eeaaf554 178 r %= Jumblr_numsecretaddrs;
179 safecopy(secretaddr,Jumblr_secretaddrs[r],64);
180 }
181 return(r);
182}
183
184int32_t jumblr_addresstype(char *addr)
185{
aa3be97e 186 if ( addr[0] == '"' && addr[strlen(addr)-1] == '"' )
c8e62868 187 {
aa3be97e 188 addr[strlen(addr)-1] = 0;
189 addr++;
c8e62868 190 }
aa3be97e 191 if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 )
192 return('z');
eeaaf554 193 else if ( strlen(addr) < 40 )
194 return('t');
c8e62868 195 printf("strange.(%s)\n",addr);
196 return(-1);
eeaaf554 197}
198
199struct jumblr_item *jumblr_opidfind(char *opid)
200{
201 struct jumblr_item *ptr;
202 HASH_FIND(hh,Jumblrs,opid,(int32_t)strlen(opid),ptr);
203 return(ptr);
204}
205
206struct jumblr_item *jumblr_opidadd(char *opid)
207{
8ac54273 208 struct jumblr_item *ptr = 0;
209 if ( opid != 0 && (ptr= jumblr_opidfind(opid)) == 0 )
eeaaf554 210 {
19acd959 211 ptr = (struct jumblr_item *)calloc(1,sizeof(*ptr));
eeaaf554 212 safecopy(ptr->opid,opid,sizeof(ptr->opid));
213 HASH_ADD_KEYPTR(hh,Jumblrs,ptr->opid,(int32_t)strlen(ptr->opid),ptr);
214 if ( ptr != jumblr_opidfind(opid) )
215 printf("jumblr_opidadd.(%s) ERROR, couldnt find after add\n",opid);
216 }
217 return(ptr);
218}
219
eeaaf554 220char *jumblr_zgetnewaddress()
221{
222 char params[1024];
19acd959 223 sprintf(params,"[]");
34017212 224 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,BITCOIND_PORT));
eeaaf554 225}
226
227char *jumblr_zlistoperationids()
228{
229 char params[1024];
19acd959 230 sprintf(params,"[]");
34017212 231 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,BITCOIND_PORT));
eeaaf554 232}
233
234char *jumblr_zgetoperationresult(char *opid)
235{
236 char params[1024];
237 sprintf(params,"[[\"%s\"]]",opid);
34017212 238 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,BITCOIND_PORT));
eeaaf554 239}
240
241char *jumblr_zgetoperationstatus(char *opid)
242{
243 char params[1024];
244 sprintf(params,"[[\"%s\"]]",opid);
34017212 245 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,BITCOIND_PORT));
eeaaf554 246}
247
248char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount)
249{
c89c562b 250 char params[1024]; double fee = ((amount-3*JUMBLR_TXFEE) * JUMBLR_FEE) * 1.5;
eeaaf554 251 if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' )
19acd959 252 return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}"));
eeaaf554 253 sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
61a0f96b 254 printf("t -> z: %s\n",params);
34017212 255 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT));
eeaaf554 256}
257
258char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount)
259{
260 char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE;
261 if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' )
19acd959 262 return(clonestr((char *)"{\"error\":\"illegal address in z to z\"}"));
c89c562b 263 //sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
264 sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_TXFEE);
61a0f96b 265 printf("z -> z: %s\n",params);
34017212 266 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT));
eeaaf554 267}
268
269char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount)
270{
c89c562b 271 char params[1024]; double fee = ((amount-JUMBLR_TXFEE) * JUMBLR_FEE) * 1.5;
eeaaf554 272 if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' )
19acd959 273 return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}"));
eeaaf554 274 sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE);
61a0f96b 275 printf("z -> t: %s\n",params);
34017212 276 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,BITCOIND_PORT));
eeaaf554 277}
278
007d1a86 279char *jumblr_zlistaddresses()
421d71a2 280{
281 char params[1024];
007d1a86 282 sprintf(params,"[]");
34017212 283 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listaddresses",params,BITCOIND_PORT));
421d71a2 284}
285
eeaaf554 286char *jumblr_zlistreceivedbyaddress(char *addr)
287{
288 char params[1024];
289 sprintf(params,"[\"%s\", 1]",addr);
34017212 290 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,BITCOIND_PORT));
eeaaf554 291}
292
293char *jumblr_getreceivedbyaddress(char *addr)
294{
295 char params[1024];
296 sprintf(params,"[\"%s\", 1]",addr);
34017212 297 return(jumblr_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,BITCOIND_PORT));
eeaaf554 298}
299
300char *jumblr_importprivkey(char *wifstr)
301{
302 char params[1024];
303 sprintf(params,"[\"%s\", \"\", false]",wifstr);
34017212 304 return(jumblr_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,BITCOIND_PORT));
eeaaf554 305}
306
307char *jumblr_zgetbalance(char *addr)
308{
309 char params[1024];
310 sprintf(params,"[\"%s\", 1]",addr);
34017212 311 return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,BITCOIND_PORT));
eeaaf554 312}
313
314char *jumblr_listunspent(char *coinaddr)
315{
316 char params[1024];
317 sprintf(params,"[1, 99999999, [\"%s\"]]",coinaddr);
34017212 318 return(jumblr_issuemethod(KMDUSERPASS,(char *)"listunspent",params,BITCOIND_PORT));
eeaaf554 319}
320
bbd64789 321char *jumblr_gettransaction(char *txidstr)
322{
323 char params[1024];
324 sprintf(params,"[\"%s\", 1]",txidstr);
34017212 325 return(jumblr_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,BITCOIND_PORT));
bbd64789 326}
327
328int32_t jumblr_numvins(bits256 txid)
329{
d506468b 330 char txidstr[65],params[1024],*retstr; cJSON *retjson,*vins; int32_t n,numvins = -1;
bbd64789 331 bits256_str(txidstr,txid);
332 if ( (retstr= jumblr_gettransaction(txidstr)) != 0 )
333 {
334 if ( (retjson= cJSON_Parse(retstr)) != 0 )
335 {
c4818fd4 336 if ( jobj(retjson,(char *)"vin") != 0 && ((vins= jarray(&n,retjson,(char *)"vin")) == 0 || n == 0) )
ad74c1a3 337 {
bbd64789 338 numvins = n;
c4818fd4 339 //printf("numvins.%d\n",n);
340 } //else printf("no vin.(%s)\n",retstr);
bbd64789 341 free_json(retjson);
342 }
343 free(retstr);
344 }
345 return(numvins);
346}
347
eeaaf554 348int64_t jumblr_receivedby(char *addr)
349{
350 char *retstr; int64_t total = 0;
351 if ( (retstr= jumblr_getreceivedbyaddress(addr)) != 0 )
352 {
353 total = atof(retstr) * SATOSHIDEN;
354 free(retstr);
355 }
356 return(total);
357}
358
359int64_t jumblr_balance(char *addr)
360{
78408e6b 361 char *retstr; double val; int64_t balance = 0; //cJSON *retjson; int32_t i,n;
90da8c91 362 /*if ( jumblr_addresstype(addr) == 't' )
eeaaf554 363 {
364 if ( (retstr= jumblr_listunspent(addr)) != 0 )
365 {
61a0f96b 366 //printf("jumblr.[%s].(%s)\n","KMD",retstr);
eeaaf554 367 if ( (retjson= cJSON_Parse(retstr)) != 0 )
368 {
d430a5e8 369 if ( (n= cJSON_GetArraySize(retjson)) > 0 && cJSON_IsArray(retjson) != 0 )
eeaaf554 370 for (i=0; i<n; i++)
19acd959 371 balance += SATOSHIDEN * jdouble(jitem(retjson,i),(char *)"amount");
eeaaf554 372 free_json(retjson);
373 }
374 free(retstr);
375 }
376 }
90da8c91 377 else*/ if ( (retstr= jumblr_zgetbalance(addr)) != 0 )
eeaaf554 378 {
379 if ( (val= atof(retstr)) > SMALLVAL )
380 balance = val * SATOSHIDEN;
381 free(retstr);
382 }
383 return(balance);
384}
385
386int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status)
387{
388 cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount;
389 /*"params" : {
390 "fromaddress" : "RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5",
391 "amounts" : [
392 {
393 "address" : "zc9s3UdkDFTnnwHrMCr1vYy2WmkjhmTxXNiqC42s7BjeKBVUwk766TTSsrRPKfnX31Bbu8wbrTqnjDqskYGwx48FZMPHvft",
394 "amount" : 3.00000000
395 }
396 ],
397 "minconf" : 1,
398 "fee" : 0.00010000
399 }*/
19acd959 400 if ( (params= jobj(item,(char *)"params")) != 0 )
eeaaf554 401 {
402 //printf("params.(%s)\n",jprint(params,0));
19acd959 403 if ( (from= jstr(params,(char *)"fromaddress")) != 0 )
eeaaf554 404 {
405 safecopy(ptr->src,from,sizeof(ptr->src));
406 }
19acd959 407 if ( (amounts= jarray(&n,params,(char *)"amounts")) != 0 )
eeaaf554 408 {
409 for (i=0; i<n; i++)
410 {
411 dest = jitem(amounts,i);
412 //printf("%s ",jprint(dest,0));
19acd959 413 if ( (addr= jstr(dest,(char *)"address")) != 0 && (amount= jdouble(dest,(char *)"amount")*SATOSHIDEN) > 0 )
eeaaf554 414 {
415 if ( strcmp(addr,JUMBLR_ADDR) == 0 )
416 ptr->fee = amount;
417 else
418 {
419 ptr->amount = amount;
420 safecopy(ptr->dest,addr,sizeof(ptr->dest));
421 }
422 }
423 }
424 }
19acd959 425 ptr->txfee = jdouble(params,(char *)"fee") * SATOSHIDEN;
eeaaf554 426 }
427 return(1);
428}
429
430void jumblr_opidupdate(struct jumblr_item *ptr)
431{
432 char *retstr,*status; cJSON *retjson,*item;
433 if ( ptr->status == 0 )
434 {
435 if ( (retstr= jumblr_zgetoperationstatus(ptr->opid)) != 0 )
436 {
437 if ( (retjson= cJSON_Parse(retstr)) != 0 )
438 {
d430a5e8 439 if ( cJSON_GetArraySize(retjson) == 1 && cJSON_IsArray(retjson) != 0 )
eeaaf554 440 {
441 item = jitem(retjson,0);
442 //printf("%s\n",jprint(item,0));
19acd959 443 if ( (status= jstr(item,(char *)"status")) != 0 )
eeaaf554 444 {
19acd959 445 if ( strcmp(status,(char *)"success") == 0 )
eeaaf554 446 {
447 ptr->status = jumblr_itemset(ptr,item,status);
448 if ( (jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->src) == 'z' && strcmp(ptr->src,Jumblr_deposit) != 0) || (jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->src) == 't' && Jumblr_secretaddrfind(ptr->dest) < 0) )
449 {
450 printf("a non-jumblr t->z pruned\n");
451 free(jumblr_zgetoperationresult(ptr->opid));
452 ptr->status = -1;
453 }
454
455 }
19acd959 456 else if ( strcmp(status,(char *)"failed") == 0 )
eeaaf554 457 {
458 printf("jumblr_opidupdate %s failed\n",ptr->opid);
459 free(jumblr_zgetoperationresult(ptr->opid));
460 ptr->status = -1;
461 }
462 }
463 }
464 free_json(retjson);
465 }
466 free(retstr);
467 }
468 }
469}
470
471void jumblr_prune(struct jumblr_item *ptr)
472{
473 struct jumblr_item *tmp; char oldsrc[128]; int32_t flag = 1;
eb23a642 474 if ( is_hexstr(ptr->opid,0) == 64 )
475 return;
eeaaf554 476 printf("jumblr_prune %s\n",ptr->opid);
477 strcpy(oldsrc,ptr->src);
478 free(jumblr_zgetoperationresult(ptr->opid));
479 while ( flag != 0 )
480 {
481 flag = 0;
482 HASH_ITER(hh,Jumblrs,ptr,tmp)
483 {
484 if ( strcmp(oldsrc,ptr->dest) == 0 )
485 {
eb23a642 486 if ( is_hexstr(ptr->opid,0) != 64 )
487 {
488 printf("jumblr_prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest);
489 free(jumblr_zgetoperationresult(ptr->opid));
490 strcpy(oldsrc,ptr->src);
491 flag = 1;
492 break;
493 }
eeaaf554 494 }
495 }
496 }
497}
498
d430a5e8
SS
499
500bits256 jbits256(cJSON *json,char *field);
501
502
421d71a2 503void jumblr_zaddrinit(char *zaddr)
504{
bbd64789 505 struct jumblr_item *ptr; char *retstr,*totalstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z;
f3f124e1 506 if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 )
421d71a2 507 {
e5dfb297 508 if ( (total= atof(totalstr)) > SMALLVAL )
421d71a2 509 {
f3f124e1 510 if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 )
511 {
512 if ( (array= cJSON_Parse(retstr)) != 0 )
513 {
afae290a 514 t_z = z_z = 0;
d430a5e8 515 if ( cJSON_GetArraySize(array) == 1 && cJSON_IsArray(array) != 0 )
f3f124e1 516 {
517 item = jitem(array,0);
b8623323 518 if ( (uint64_t)((total+0.0000000049) * SATOSHIDEN) == (uint64_t)((jdouble(item,(char *)"amount")+0.0000000049) * SATOSHIDEN) )
f3f124e1 519 {
bbd64789 520 txid = jbits256(item,(char *)"txid");
f3f124e1 521 bits256_str(txidstr,txid);
522 if ( (ptr= jumblr_opidadd(txidstr)) != 0 )
523 {
524 ptr->amount = (total * SATOSHIDEN);
525 ptr->status = 1;
526 strcpy(ptr->dest,zaddr);
231bcedc 527 if ( jumblr_addresstype(ptr->dest) != 'z' )
528 printf("error setting dest type to Z: %s\n",jprint(item,0));
f3f124e1 529 if ( jumblr_numvins(txid) == 0 )
530 {
531 z_z = 1;
231bcedc 532 strcpy(ptr->src,zaddr);
eb23a642 533 ptr->src[3] = '0';
534 ptr->src[4] = '0';
535 ptr->src[5] = '0';
f3f124e1 536 if ( jumblr_addresstype(ptr->src) != 'z' )
537 printf("error setting address type to Z: %s\n",jprint(item,0));
538 }
539 else
540 {
541 t_z = 1;
542 strcpy(ptr->src,"taddr");
543 if ( jumblr_addresstype(ptr->src) != 't' )
544 printf("error setting address type to T: %s\n",jprint(item,0));
545 }
546 printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend
547 }
255e8e69 548 } else printf("mismatched %s %s total %.8f vs %.8f -> %lld\n",zaddr,totalstr,dstr(SATOSHIDEN * total),dstr(SATOSHIDEN * jdouble(item,(char *)"amount")),(long long)((uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN)));
f3f124e1 549 }
550 free_json(array);
551 }
552 free(retstr);
553 }
421d71a2 554 }
f3f124e1 555 free(totalstr);
421d71a2 556 }
557}
558
eeaaf554 559void jumblr_opidsupdate()
560{
561 char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr;
562 if ( (retstr= jumblr_zlistoperationids()) != 0 )
563 {
564 if ( (array= cJSON_Parse(retstr)) != 0 )
565 {
d430a5e8 566 if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 )
eeaaf554 567 {
c89c562b 568 //printf("%s -> n%d\n",retstr,n);
eeaaf554 569 for (i=0; i<n; i++)
570 {
571 if ( (ptr= jumblr_opidadd(jstri(array,i))) != 0 )
572 {
573 if ( ptr->status == 0 )
574 jumblr_opidupdate(ptr);
575 //printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount));
576 if ( jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 't' )
577 jumblr_prune(ptr);
578 }
579 }
580 }
581 free_json(array);
582 }
583 free(retstr);
584 }
585}
586
ae85ad79 587uint64_t jumblr_increment(uint8_t r,int32_t height,uint64_t total,uint64_t biggest,uint64_t medium, uint64_t smallest)
588{
589 int32_t i,n; uint64_t incrs[1000],remains = total;
590 height /= JUMBLR_SYNCHRONIZED_BLOCKS;
591 if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) == 0 || total >= 100*biggest )
592 {
593 if ( total >= biggest )
594 return(biggest);
595 else if ( total >= medium )
596 return(medium);
597 else if ( total >= smallest )
598 return(smallest);
599 else return(0);
600 }
601 else
602 {
603 n = 0;
604 while ( remains > smallest && n < sizeof(incrs)/sizeof(*incrs) )
605 {
606 if ( remains >= biggest )
607 incrs[n] = biggest;
608 else if ( remains >= medium )
609 incrs[n] = medium;
610 else if ( remains >= smallest )
611 incrs[n] = smallest;
612 else break;
613 remains -= incrs[n];
614 n++;
615 }
616 if ( n > 0 )
617 {
618 r %= n;
619 for (i=0; i<n; i++)
620 printf("%.8f ",dstr(incrs[i]));
88de65be 621 printf("n.%d incrs r.%d -> %.8f\n",n,r,dstr(incrs[r]));
ae85ad79 622 return(incrs[r]);
623 }
624 }
625 return(0);
626}
627
eeaaf554 628void jumblr_iteration()
629{
dca9da68 630 static int32_t lastheight; static uint32_t lasttime;
ae85ad79 631 char *zaddr,*addr,*retstr,secretaddr[64]; cJSON *array; int32_t i,iter,height,counter,chosen_one,n; uint64_t smallest,medium,biggest,amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint16_t r,s;
421d71a2 632 if ( lasttime == 0 )
633 {
634 if ( (retstr= jumblr_zlistaddresses()) != 0 )
635 {
636 if ( (array= cJSON_Parse(retstr)) != 0 )
637 {
d430a5e8 638 if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 )
421d71a2 639 {
640 for (i=0; i<n; i++)
641 jumblr_zaddrinit(jstri(array,i));
642 }
643 free_json(array);
644 }
645 free(retstr);
646 }
647 }
eeaaf554 648 height = (int32_t)chainActive.Tip()->nHeight;
a039c62d 649 if ( time(NULL) < lasttime+40 )
dca9da68 650 return;
651 lasttime = (uint32_t)time(NULL);
421d71a2 652 if ( lastheight == height )
653 return;
6a1b2452 654 lastheight = height;
a039c62d 655 if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-3 )
eeaaf554 656 return;
657 fee = JUMBLR_INCR * JUMBLR_FEE;
ae85ad79 658 smallest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE);
659 medium = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE);
660 biggest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*777 + 3*JUMBLR_TXFEE);
fd9256e8 661 OS_randombytes((uint8_t *)&r,sizeof(r));
ae85ad79 662 s = (r % 3);
0a92b261 663 //printf("jumblr_iteration r.%u s.%u\n",r,s);
eeaaf554 664 switch ( s )
665 {
eb23a642 666 case 0: // t -> z
ae85ad79 667 default:
668 if ( Jumblr_deposit[0] != 0 && (total= jumblr_balance(Jumblr_deposit)) >= smallest )
eeaaf554 669 {
670 if ( (zaddr= jumblr_zgetnewaddress()) != 0 )
671 {
20082066 672 if ( zaddr[0] == '"' && zaddr[strlen(zaddr)-1] == '"' )
673 {
674 zaddr[strlen(zaddr)-1] = 0;
675 addr = zaddr+1;
676 } else addr = zaddr;
ae85ad79 677 amount = jumblr_increment(r/3,height,total,biggest,medium,smallest);
9d365796 678 /*
eeaaf554 679 amount = 0;
680 if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) )
ae85ad79 681 amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE);
eeaaf554 682 else if ( (r & 3) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) )
683 amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE);
ae85ad79 684 else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE);*/
20082066 685 if ( amount > 0 && (retstr= jumblr_sendt_to_z(Jumblr_deposit,addr,dstr(amount))) != 0 )
eeaaf554 686 {
687 printf("sendt_to_z.(%s)\n",retstr);
688 free(retstr);
689 }
690 free(zaddr);
691 } else printf("no zaddr from jumblr_zgetnewaddress\n");
692 }
693 else if ( Jumblr_deposit[0] != 0 )
694 printf("%s total %.8f vs %.8f\n",Jumblr_deposit,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE)));
695 break;
696 case 1: // z -> z
697 jumblr_opidsupdate();
698 chosen_one = -1;
699 for (iter=counter=0; iter<2; iter++)
700 {
701 counter = n = 0;
702 HASH_ITER(hh,Jumblrs,ptr,tmp)
703 {
1cacba6a 704 if ( ptr->spent == 0 && ptr->status > 0 && jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' )
eeaaf554 705 {
1cacba6a 706 if ( (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN )
eeaaf554 707 {
708 if ( iter == 1 && counter == chosen_one )
709 {
710 if ( (zaddr= jumblr_zgetnewaddress()) != 0 )
711 {
dca9da68 712 if ( zaddr[0] == '"' && zaddr[strlen(zaddr)-1] == '"' )
713 {
714 zaddr[strlen(zaddr)-1] = 0;
715 addr = zaddr+1;
716 } else addr = zaddr;
717 if ( (retstr= jumblr_sendz_to_z(ptr->dest,addr,dstr(total))) != 0 )
eeaaf554 718 {
eb23a642 719 printf("n.%d counter.%d chosen_one.%d send z_to_z.(%s)\n",n,counter,chosen_one,retstr);
eeaaf554 720 free(retstr);
721 }
722 ptr->spent = (uint32_t)time(NULL);
723 free(zaddr);
724 break;
725 }
726 }
727 counter++;
728 }
729 }
730 n++;
731 }
732 if ( counter == 0 )
733 break;
734 if ( iter == 0 )
735 {
736 OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one));
737 if ( chosen_one < 0 )
738 chosen_one = -chosen_one;
739 chosen_one %= counter;
740 printf("jumblr z->z chosen_one.%d of %d, from %d\n",chosen_one,counter,n);
741 }
742 }
743 break;
eb23a642 744 case 2: // z -> t
eeaaf554 745 if ( Jumblr_numsecretaddrs > 0 )
746 {
747 jumblr_opidsupdate();
748 chosen_one = -1;
749 for (iter=0; iter<2; iter++)
750 {
751 counter = n = 0;
752 HASH_ITER(hh,Jumblrs,ptr,tmp)
753 {
eb23a642 754 //printf("status.%d %c %c %.8f\n",ptr->status,jumblr_addresstype(ptr->src),jumblr_addresstype(ptr->dest),dstr(ptr->amount));
1cacba6a 755 if ( ptr->spent == 0 && ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' )
eeaaf554 756 {
1cacba6a 757 if ( (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN )
eeaaf554 758 {
3db947b8 759 if ( iter == 1 && counter == chosen_one )
eeaaf554 760 {
761 Jumblr_secretaddr(secretaddr);
762 if ( (retstr= jumblr_sendz_to_t(ptr->dest,secretaddr,dstr(total))) != 0 )
763 {
eb23a642 764 printf("%s send z_to_t.(%s)\n",secretaddr,retstr);
eeaaf554 765 free(retstr);
c89c562b 766 } else printf("null return from jumblr_sendz_to_t\n");
eeaaf554 767 ptr->spent = (uint32_t)time(NULL);
768 break;
769 }
770 counter++;
3db947b8 771 } //else printf("z->t spent.%u total %.8f error\n",ptr->spent,dstr(total));
eeaaf554 772 }
773 n++;
774 }
775 if ( counter == 0 )
776 break;
777 if ( iter == 0 )
778 {
779 OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one));
780 if ( chosen_one < 0 )
781 chosen_one = -chosen_one;
782 chosen_one %= counter;
783 printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n);
3db947b8 784 } //else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen_one);
eeaaf554 785 }
786 }
787 break;
788 }
789}
This page took 0.139818 seconds and 4 git commands to generate.