From 7c3e616d6bc181a7557ef7144cf7e4fe178f533a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 26 Feb 2017 22:01:43 +0200 Subject: [PATCH 001/286] Test --- .gitignore | 2 ++ iguana/kmd_lookup.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 7a7e1c423..598019140 100755 --- a/.gitignore +++ b/.gitignore @@ -149,3 +149,5 @@ iguana/confs/cc577d22ca76351d495f147b470103392b5f2ab0948e45608623a7d9728e2c6f.ol iguana/DB/DEX.log iguana/iguana_notary.o-54f98cc3 + +iguana/basilisk.o-2ad8cb38 diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5ed99a79b..5499864f6 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -207,7 +207,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) - printf("ERROR: %p != %p for ht.%d\n",ptr,kmd_transaction(coin,tx->txid),tx->height); + printf("%s ERROR: %p != %p for ht.%d\n",coin->symbol,ptr,kmd_transaction(coin,tx->txid),tx->height); ptr->fpos = lastpos; ptr->numvins = T.numvins; ptr->numvouts = T.numvouts; @@ -219,7 +219,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) } else { - printf("error loading vout.%d ht.%d\n",i,T.height); + printf("%s error loading vout.%d ht.%d\n",coin->symbol,i,T.height); break; } } @@ -255,7 +255,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) { if ( kmd_transactionvin(coin,txid,i,spenttxid,spentvout) < 0 ) { - printf("error adding spend %s %d of %d\n",bits256_str(str,txid),i,numvins); + printf("%s error adding spend %s %d of %d\n",coin->symbol,bits256_str(str,txid),i,numvins); //break; } } else break; @@ -277,7 +277,7 @@ FILE *kmd_spendinit(struct iguana_info *coin) { if ( ptr->ptrs[(i<<1) + 1] != kmd_transaction(coin,vptr->spendtxid) ) { - printf("mismatch %s spend.%d %p %p\n",bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); + printf("%s mismatch %s spend.%d %p %p\n",coin->symbol,bits256_str(str,vptr->spendtxid),i,ptr->ptrs[(i<<1) + 1],kmd_transaction(coin,vptr->spendtxid)); } } } From aa9d2837359e77e5ce63c0bbf4506a9a8e5964b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 19:31:06 +0200 Subject: [PATCH 002/286] Even faster --- iguana/dpow/dpow_network.c | 16 ++++++++++++---- iguana/tests/loop | 5 ++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 017d35973..bdfe03bd3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -277,7 +277,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; + struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t prio,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; @@ -287,18 +287,26 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - //timeout = 5000; - //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 500; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + prio = 1; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) + { if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) { nn_close(reqsock); reqsock = -1; break; } - } + } + prio = 8; + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + } if ( reqsock >= 0 ) { if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) diff --git a/iguana/tests/loop b/iguana/tests/loop index 7f1a05445..b7e8cfa16 100755 --- a/iguana/tests/loop +++ b/iguana/tests/loop @@ -1,8 +1,7 @@ #!/bin/bash -pkill iguana while true do -../../agents/iguana -sleep 3 +./dexlistunspent +./dexgetinfo done From a61dc0df730259a4f1cc53ff8ab0a78f87a09dcd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:51:58 +0200 Subject: [PATCH 003/286] Test --- iguana/dpow/dpow_network.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index bdfe03bd3..d826f6424 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -287,13 +287,13 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 { timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 500; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); - timeout = 1000; + //timeout = 1500; + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + timeout = 3000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - prio = 1; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + //prio = 1; + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); for (i=0; idexseed_ipaddrs)/sizeof(*myinfo->dexseed_ipaddrs); i++) { if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddrs[i],REP_SOCK)) < 0 ) @@ -303,9 +303,9 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 break; } } - prio = 8; - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); - nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); + //prio = 8; + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); + //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); } if ( reqsock >= 0 ) { From 7edf59ae1903887901963c4e6c6dd8e6c6ca36fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:52:23 +0200 Subject: [PATCH 004/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d826f6424..5183ea053 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1984,7 +1984,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); From a2788be1cd6cb9792c18e14a9faebce68cf6e85f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:54:17 +0200 Subject: [PATCH 005/286] Test --- iguana/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/main.c b/iguana/main.c index c0d231e3b..dbbb18958 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -485,7 +485,10 @@ void mainloop(struct supernet_info *myinfo) usleep(30000); } if ( myinfo->DEXEXPLORER != 0 ) + { kmd_bitcoinscan(); + usleep(100000); + } //pangea_queues(SuperNET_MYINFO(0)); //if ( flag == 0 ) // usleep(100000 + isRT*100000 + (numpeers == 0)*1000000); From 06b115b836dfcf0a2f2ea317f943bd5a6a6e06dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 21:59:37 +0200 Subject: [PATCH 006/286] Test --- crypto777/bitcoind_RPC.c | 2 +- iguana/kmd_lookup.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 18ebe16cc..66886df69 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -140,7 +140,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - if ( specialcase != 0 && (0) ) + //if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params); try_again: if ( retstrp != 0 ) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 5499864f6..367b28e2a 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - //printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) @@ -748,6 +748,7 @@ void kmd_bitcoinscan() { //if ( strcmp("KMD",coin->symbol) == 0 ) _kmd_bitcoinscan(coin); + usleep(100000); } } } From a68b957d9d502c83f17ffbb8f89767c1a0f7ebfd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:01:17 +0200 Subject: [PATCH 007/286] Test --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 367b28e2a..c2d987c80 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) From 1d94105bbf8e234523a7786bacac4469139c9cf8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:09:39 +0200 Subject: [PATCH 008/286] Test --- iguana/kmd_lookup.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c2d987c80..f3b042dd3 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -203,7 +203,7 @@ FILE *kmd_txidinit(struct iguana_info *coin) { if ( (tx= kmd_transactionalloc(T.txid,T.height,T.timestamp,T.numvouts,T.numvins)) != 0 ) { - char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); + //char str[65]; printf("INIT %s.[%d] vins.[%d] ht.%d %u\n",bits256_str(str,T.txid),T.numvouts,T.numvins,T.height,T.timestamp); if ( (ptr= kmd_transactionadd(coin,tx,T.numvouts,T.numvins)) != 0 ) { if ( ptr != kmd_transaction(coin,tx->txid) ) @@ -626,8 +626,8 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height-lag ) { flag = 0; - if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d\n",loadheight);//,jprint(kmd_getbalance(coin,"*"),1)); + //if ( (loadheight % 10000) == 0 ) + printf("loading ht.%d vs height.%d - lag.%d kmdheight.%d\n",loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 09216d299f60fffded5da072b358e4ed4e40fcf2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:47:05 +0200 Subject: [PATCH 009/286] Test --- iguana/kmd_lookup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f3b042dd3..65f2a9014 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -395,6 +395,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; if ( array == 0 ) array = cJSON_CreateArray(); + printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); @@ -627,7 +628,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { flag = 0; //if ( (loadheight % 10000) == 0 ) - printf("loading ht.%d vs height.%d - lag.%d kmdheight.%d\n",loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); + printf("loading %s ht.%d vs height.%d - lag.%d kmdheight.%d\n",coin->symbol,loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { if ( (txids= jarray(&numtxids,blockjson,"tx")) != 0 ) From 17d619343528f5e93fd06192d42d9869b48f91ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 22:57:07 +0200 Subject: [PATCH 010/286] Test --- iguana/kmd_lookup.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 65f2a9014..c141bf539 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -392,10 +392,20 @@ cJSON *kmd_gettxin(struct iguana_info *coin,bits256 txid,int32_t vout) cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t mode,cJSON *array) { - struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; + struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; char *retstr; cJSON *retjson; if ( array == 0 ) array = cJSON_CreateArray(); printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); + if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) + { + printf("%s\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + free_json(retjson); + } + if ( (0) ) + return(cJSON_Parse("[{\"error\":\"illegal address\"}]")); + } /*if ( time(NULL) > coin->kmd_lasttime+30 ) { coin->kmd_lasttime = (uint32_t)time(NULL); From 2b37522c8cda2f4919ea6430c272a7881914765d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:04:02 +0200 Subject: [PATCH 011/286] Test --- iguana/kmd_lookup.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index c141bf539..2feabf1cd 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -398,13 +398,17 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) { - printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { + if ( jobj(retjson,"error") != 0 && is_cJSON_False(jobj(retjson,"error")) == 0 ) + { + printf("%s\n",retstr); + free(retstr); + return(retjson); + } free_json(retjson); } - if ( (0) ) - return(cJSON_Parse("[{\"error\":\"illegal address\"}]")); + free(retstr); } /*if ( time(NULL) > coin->kmd_lasttime+30 ) { @@ -759,7 +763,7 @@ void kmd_bitcoinscan() { //if ( strcmp("KMD",coin->symbol) == 0 ) _kmd_bitcoinscan(coin); - usleep(100000); + usleep(250000); } } } From 5f65344dd45e7e366bfb370712939a8cc1b703cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:08:01 +0200 Subject: [PATCH 012/286] Test --- crypto777/bitcoind_RPC.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 66886df69..18ebe16cc 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -140,7 +140,7 @@ char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char * else specialcase = 0; if ( url[0] == 0 ) strcpy(url,"http://127.0.0.1:7776"); - //if ( specialcase != 0 && (0) ) + if ( specialcase != 0 && (0) ) printf("<<<<<<<<<<< bitcoind_RPC: debug.(%s) url.(%s) command.(%s) params.(%s)\n",debugstr,url,command,params); try_again: if ( retstrp != 0 ) From 908fef6af48564359f8c7ae377efa76b624ea235 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 27 Feb 2017 23:09:15 +0200 Subject: [PATCH 013/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5183ea053..d826f6424 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1984,7 +1984,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); From 6ac935b5abe079bca164ac0df2cda98e3166d777 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 09:23:48 +0200 Subject: [PATCH 014/286] Test --- iguana/main.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index dbbb18958..4619501eb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -461,10 +461,24 @@ rm BTC.xz; mksquashfs DB/BTC BTC.xz -comp xz -b 1048576 -comp xz -Xdict-size 102 https://github.com/vasi/squashfuse */ +void DEX_explorerloop(void *ptr) +{ + struct supernet_info *myinfo = ptr; + while ( 1 ) + { + if ( myinfo->DEXEXPLORER != 0 ) + { + kmd_bitcoinscan(); + } + usleep(100000); + } +} + void mainloop(struct supernet_info *myinfo) { struct iguana_info *coin; int32_t counter=0,depth; double lastmilli = 0; sleep(3); + iguana_launch(0,"DEX_explorerloop",DEX_explorerloop,myinfo,IGUANA_PERMTHREAD); printf("mainloop\n"); while ( 1 ) { @@ -484,11 +498,6 @@ void mainloop(struct supernet_info *myinfo) } usleep(30000); } - if ( myinfo->DEXEXPLORER != 0 ) - { - kmd_bitcoinscan(); - usleep(100000); - } //pangea_queues(SuperNET_MYINFO(0)); //if ( flag == 0 ) // usleep(100000 + isRT*100000 + (numpeers == 0)*1000000); From b8494fbfc202e7f32a853d5765e2dc03e1bd759f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 09:27:13 +0200 Subject: [PATCH 015/286] Test --- iguana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/main.c b/iguana/main.c index 4619501eb..30758a494 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -478,7 +478,6 @@ void mainloop(struct supernet_info *myinfo) { struct iguana_info *coin; int32_t counter=0,depth; double lastmilli = 0; sleep(3); - iguana_launch(0,"DEX_explorerloop",DEX_explorerloop,myinfo,IGUANA_PERMTHREAD); printf("mainloop\n"); while ( 1 ) { @@ -761,6 +760,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) if ( COMMANDLINE_ARGFILE == 0 ) iguana_launch(0,"rpcloop",iguana_rpcloop,myinfo,IGUANA_PERMTHREAD); // limit to oneprocess printf("launch mainloop\n"); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); mainloop(myinfo); } From a9cf4c6ca4e832ad4874ff238803906338f9d637 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 1 Mar 2017 14:40:59 +0200 Subject: [PATCH 016/286] Fix print crash --- iguana/iguana_payments.c | 1 - 1 file changed, 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 82386e4b9..c0be62d4b 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -394,7 +394,6 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b interest = _iguana_interest((uint32_t)time(NULL),coin->longestchain,tx->locktime,value); } } - char str[65]; printf("interest for %s.v%d %.8f %.8f (%s)\n",bits256_str(str,txid),vout,dstr(value),dstr(interest),retjson!=0?jprint(retjson,0):""); return(interest); } From 4b7cb0c14f144f7aaef0cac844b64658a04dbac6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 07:31:57 +0200 Subject: [PATCH 017/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d826f6424..7cac5a7ea 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -277,7 +277,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t prio,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; + struct dex_nanomsghdr *dexp; cJSON *retjson; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; void *freeptr; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; From c8fd0de49bdc6947ee4bfc2b17092a9d3b83ac73 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 16:03:59 +0200 Subject: [PATCH 018/286] Fix utxorawtx --- iguana/iguana_payments.c | 9 ++++++++- iguana/tests/dexgetO | 2 +- iguana/tests/dexsendrawtransaction | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index c0be62d4b..a8b45faf2 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -560,7 +560,14 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); return(0); } - total += interests; + if ( strcmp(coin->symbol,"KMD") == 0 ) + { + if ( (interests= iguana_interests(myinfo,coin,vins)) != 0 ) + { + total += interests; + printf("boost total by interest %.8f\n",dstr(interests)); + } + } if ( (change= (total - (satoshis + txfee))) > 10000 && (changeaddr == 0 || changeaddr[0] == 0) ) { printf("no changeaddr for %.8f\n",dstr(change)); diff --git a/iguana/tests/dexgetO b/iguana/tests/dexgetO index 9c187166b..6f4290b48 100755 --- a/iguana/tests/dexgetO +++ b/iguana/tests/dexgetO @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"fa3321ed55e8e96ba7221e9cc4bc54b735616649abcc9734bb73f505ee712884\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"4a1a2026718ac10bd11ccccbdd85f29faa5f0b7c3ab95a57dcf7040c5ca0420c\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexsendrawtransaction b/iguana/tests/dexsendrawtransaction index d60706f4d..f3796ea37 100755 --- a/iguana/tests/dexsendrawtransaction +++ b/iguana/tests/dexsendrawtransaction @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"signedtx\":\"0100000001372105704c1303f4c928b788becce75b653b5e83d56fc25893f682875f9df00e010000006a47304402203c3e71c309fcf70d1b1b42207824b37cfec918930000b8d812844be9a8d06bae02202eafe0515f6cd775ba06be0fab6cea667a23508e69334310b959ebd7eade38c9012102320228e3f6f9b8db3d905bc21cefde46e72d622021b8fd40344ac2ab8346c287ffffffff02b0e20d000000000017a914077fa9d41d53cc38118b8280e97e4aee576d6e5a87c08c8a00000000001976a914838f4ea2f88f24b87247b72a1d66da225653e39788ac00000000\",\"symbol\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"signedtx\":\"01000000010c42a05c0c04f7dc575ab93a7c0b5faa9ff285ddcbcc1cd10bc18a7126201a4a010000006b483045022100814b44c4af1beeb7ab3abdd7dfd95216b48da2f47ded4137f3dca366db4a94bc0220686108f29cc1eea5c845b7571e01412a373e5077d448e021bac7e8a19ec451a20121025879c9eaa100984ee1faaeb55bcbafed5b1f565c35ed7ebaadcce0a8416e6263ffffffff0240420f00000000001976a914c5a58530ee7bec4f5ab9a8c0c63069484273276c88ac34955836020000001976a914971f98b33fb838faee190e2fab799440d8c5170288acf70ab858\",\"symbol\":\"KMD\"}" From 417e9985e9d5636bd5c6c2e0b2c8de62a017d335 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 16:10:29 +0200 Subject: [PATCH 019/286] Test --- iguana/iguana_payments.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index a8b45faf2..6aca69045 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -553,13 +553,6 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin { if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) { - if ( total < (satoshis + txfee) ) - { - free_json(vins); - free(unspents); - printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); - return(0); - } if ( strcmp(coin->symbol,"KMD") == 0 ) { if ( (interests= iguana_interests(myinfo,coin,vins)) != 0 ) @@ -568,6 +561,13 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin printf("boost total by interest %.8f\n",dstr(interests)); } } + if ( total < (satoshis + txfee) ) + { + free_json(vins); + free(unspents); + printf("insufficient total %.8f vs (%.8f + %.8f)\n",dstr(total),dstr(satoshis),dstr(txfee)); + return(0); + } if ( (change= (total - (satoshis + txfee))) > 10000 && (changeaddr == 0 || changeaddr[0] == 0) ) { printf("no changeaddr for %.8f\n",dstr(change)); From 2c06ac84781bc3d93b86a43ee2b9269cec7c5051 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 18:34:15 +0200 Subject: [PATCH 020/286] Estimatefee for BTC added to dex get info --- iguana/dpow/dpow_rpc.c | 10 ++++++++++ iguana/tests/dexlistunspent | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 4f344119c..f8ffded08 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -36,6 +36,16 @@ cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) { json = cJSON_Parse(retstr); free(retstr); + if ( strcmp(coin->symbol,"BTC") == 0 ) + { + sprintf(buf,"[%d]",2); + if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"estimatefee",buf)) != 0 ) + { + if ( atof(retstr) > SMALLVAL ) + jaddnum(json,"estimatefee",atof(retstr)); + free(retstr); + } + } } return(json); } diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 5cd82cdaa..c6ede1cca 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RDKb3QykRJNfLKWLcbbv9z7xqbtxwB54GC\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RCownUMXktAgPvzwpALnGimCA1RDJoTvx1\",\"symbol\":\"KMD\"}" From f4c6d87f518ec6ea093ace34a23c96ae2957bdaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 2 Mar 2017 19:46:34 +0200 Subject: [PATCH 021/286] Autocalc txfee for BTC if txfee == 0 --- basilisk/basilisk.c | 3 +- basilisk/basilisk_bitcoin.c | 104 +++++++++++++++++++++++++++++------- iguana/iguana_payments.c | 6 ++- iguana/tests/amlp | 2 +- iguana/tests/dexlistunspent | 2 +- iguana/tests/utxorawtx | 2 +- includes/iguana_structs.h | 1 + 7 files changed, 95 insertions(+), 25 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 3ab1ea6a3..9e717e99e 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1166,8 +1166,7 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) changeaddr = jstr(vals,"changeaddr"); if ( destaddr != 0 && changeaddr != 0 && symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) { - if ( (txfee= jdouble(vals,"txfee") * SATOSHIDEN) == 0 ) - txfee = coin->txfee; + txfee = jdouble(vals,"txfee") * SATOSHIDEN; return(iguana_utxorawtx(myinfo,coin,timelock,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); } return(clonestr("{\"error\":\"invalid coin or address specified\"}")); diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index c6bdadf34..e42ab5146 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -473,6 +473,23 @@ void *basilisk_getinfo(struct basilisk_item *Lptr,struct supernet_info *myinfo,s return(ptr); } +int64_t iguana_getestimatedfee(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *retstr; cJSON *retjson; double x; int64_t txfeeperbyte = 200; + if ( (retstr= _dex_getinfo(myinfo,coin->symbol)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (x= jdouble(retjson,"estimatefee")) > SMALLVAL ) + txfeeperbyte = 1 + (x * SATOSHIDEN) / 1024; + printf("SET txfeeperbyte %lld (%s)\n",(long long)txfeeperbyte,retstr); + free(retjson); + } + free(retstr); + } + return(txfeeperbyte); +} + int32_t basilisk_voutvin_validate(struct iguana_info *coin,char *rawtx,uint64_t inputsum,uint64_t amount,uint64_t txfee) { //static int counter; @@ -543,13 +560,32 @@ int32_t basilisk_vins_validate(struct supernet_info *myinfo,struct iguana_info * return(retval); } +int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins) +{ + int64_t txfee = 0; + if ( coin->estimatedfee == 0 ) + coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); + if ( signedtx != 0 ) + { + txfee = coin->estimatedfee * (strlen(signedtx) + numvins); + free(signedtx); + } + else if ( rawtx != 0 ) + { + txfee = coin->estimatedfee * (strlen(rawtx) + numvins * 110); + free(rawtx); + } + return(txfee); +} + char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *pubkey33,uint64_t satoshis,int32_t duplicates,int32_t *completedp,bits256 *signedtxidp,int32_t sendflag,cJSON *addresses) { - uint8_t script[35]; int32_t i,spendlen; cJSON *txobj=0,*vins=0; char *rawtx=0,*signedtx,changeaddr[64]; + uint8_t script[35]; int64_t txfee; int32_t i,spendlen; cJSON *txobj=0,*vins=0; char *rawtx=0,*signedtx=0,changeaddr[64]; *completedp = 0; if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + txfee = 10 * (coin->txfee + duplicates*coin->txfee/5); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) @@ -557,19 +593,28 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi spendlen = bitcoin_pubkeyspend(script,0,pubkey33); for (i=0; itxfee + duplicates*coin->txfee/5,addresses,0,0,0,0,"127.0.0.1",0,1); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,satoshis * duplicates,changeaddr,txfee,addresses,0,0,0,0,"127.0.0.1",0,1); + if ( cJSON_GetArraySize(vins) > duplicates/4 ) + { + free(rawtx); + rawtx = 0; + fprintf(stderr,"No point to recycle utxo when trying to create utxo duplicates, numvins.%d vs duplicates.%d\n",cJSON_GetArraySize(vins),duplicates); + free_json(vins); + return(rawtx); + } //printf("duplicatesTX.(%s)\n",rawtx); if ( signedtxidp != 0 ) { if ( (signedtx= iguana_signrawtx(myinfo,coin,0,signedtxidp,completedp,vins,rawtx,0,0)) != 0 ) { - free(rawtx); - if ( *completedp != 0 && sendflag != 0 ) + if ( *completedp != 0 ) { printf("splitfunds signedtx.(%s)\n",signedtx); - iguana_sendrawtransaction(myinfo,coin,signedtx); + if ( sendflag != 0 ) + iguana_sendrawtransaction(myinfo,coin,signedtx); + free(rawtx); + rawtx = signedtx, signedtx = 0; } - rawtx = signedtx; } else printf("error signing raw utxoduplicates tx\n"); } } @@ -615,7 +660,7 @@ int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *c char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t timelock,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) { - uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,spendlen; cJSON *retjson,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; + uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,iter,spendlen; cJSON *retjson,*txcopy,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; *completedp = 0; if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) return(clonestr("{\"error\":\"invalid coin address\"}")); @@ -625,6 +670,8 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int bitcoin_addr2rmd160(&addrtype,rmd160,destaddr); if ( addrtype != coin->chain->pubtype ) return(clonestr("{\"error\":\"invalid dest address type\"}")); + if ( txfee == 0 && strcmp(coin->symbol,"BTC") != 0 && (txfee= coin->txfee) == 0 ) + txfee = coin->chain->txfee; retjson = cJSON_CreateObject(); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { @@ -641,23 +688,42 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int printf("timelock.%d spend timelocked %u\n",timelock,timelocked); } bitcoin_txoutput(txobj,script,spendlen,satoshis); - if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) + for (iter=0; iter<2; iter++) { - jaddstr(retjson,"rawtx",rawtx); - if ( (signedtx= iguana_signrawtx(myinfo,coin,0,&txid,completedp,vins,rawtx,0,0)) != 0 ) + txcopy = jduplicate(txobj); + if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) { - if ( *completedp != 0 ) + if ( iter == 1 || txfee != 0 ) + jaddstr(retjson,"rawtx",rawtx); + if ( (signedtx= iguana_signrawtx(myinfo,coin,0,&txid,completedp,vins,rawtx,0,0)) != 0 ) { - jaddbits256(retjson,"txid",txid); - jaddstr(retjson,"signedtx",signedtx); - if ( sendflag != 0 ) + if ( (iter == 1 || txfee != 0) && *completedp != 0 ) { - //printf("send signedtx.(%s)\n",signedtx); - txid = iguana_sendrawtransaction(myinfo,coin,signedtx); - jaddbits256(retjson,"sent",txid); + jaddbits256(retjson,"txid",txid); + jaddstr(retjson,"signedtx",signedtx); + if ( sendflag != 0 ) + { + //printf("send signedtx.(%s)\n",signedtx); + txid = iguana_sendrawtransaction(myinfo,coin,signedtx); + jaddbits256(retjson,"sent",txid); + } } - } - } else printf("error signing raw utxoduplicates tx\n"); + } else printf("error signing raw utxorawtx tx\n"); + } else printf("null rawtx from calcutxorawtx\n"); + if ( txfee != 0 ) + { + free_json(txcopy); + break; + } + else // must be BTC and txfee == 0 + { + txfee = iguana_esttxfee(myinfo,coin,rawtx,signedtx,cJSON_GetArraySize(vins)); + free_json(vins); + rawtx = signedtx = 0; + vins = 0; + *completedp = 0; + txobj = txcopy; + } } } if ( timelock != 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 6aca69045..fbe9ba5b5 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -534,7 +534,11 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin for (i=0; i 16 ) + { + + } + else if ( (sobj= jobj(item,"scriptPubKey")) == 0 && (spendscriptstr= jstr(sobj,"hex")) == 0 ) { printf("no spendscript (%s)\n",jprint(item,0)); continue; diff --git a/iguana/tests/amlp b/iguana/tests/amlp index 4a771e030..76856c320 100755 --- a/iguana/tests/amlp +++ b/iguana/tests/amlp @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"blocktrail_apikey\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"e5ddfdceb58fa6c1bf9411aaeff4b6ee28cbc370\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index c6ede1cca..4e353d69b 100755 --- a/iguana/tests/dexlistunspent +++ b/iguana/tests/dexlistunspent @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"address\":\"RCownUMXktAgPvzwpALnGimCA1RDJoTvx1\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"symbol\":\"BTC\"}" diff --git a/iguana/tests/utxorawtx b/iguana/tests/utxorawtx index a157a3ee9..57d252129 100755 --- a/iguana/tests/utxorawtx +++ b/iguana/tests/utxorawtx @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"RNmvQtThVZAbc1tFEFmKAnJZrc9XqciNog\",\"destaddr\":\"RHfraY22xd9aAuuUJ6Yjb6HFUXh535z6Lg\",\"txfee\":0.00011,\"amount\":0.01,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"000000a7d7b317af7169a156f6b4b9538293da2a3707a69aa3048998a87fbf2c\",\"confirmations\":0,\"value\":0.02,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 b7128d2ee837cf03e30a2c0e3e0181f7b9669bb6 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3350674129,\"coin\":\"KMD\",\"txid\":\"9329814cc4c7a8cabf83627d4228c1a2090e776d669c585d824d912ce2e13b13\",\"vout\":1,\"amount\":0.02}]}" +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"BTC\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg\",\"destaddr\":\"1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg\",\"txfee\":0,\"amount\":0.0001,\"sendflag\":0},\"utxos\":[{\"value\":0.00100000,\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"scriptPubKey\":\"76a914b7128d2ee837cf03e30a2c0e3e0181f7b9669bb688ac\",\"confirmations\":23351,\"spendable\":true}]}" diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index ea665ef85..813bd77a7 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -531,6 +531,7 @@ struct iguana_info uint32_t utxoaddrlastcount,*utxoaddroffsets,lastunspentsupdate; uint8_t *utxoaddrtable; bits256 utxoaddrhash; FILE *utxofp; bits256 markedunspents[1024]; + uint64_t estimatedfee; char seedipaddr[64]; uint32_t lastbesthashtime; bits256 lastbesthash; int32_t lastbestheight; struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; From 34a644cfd7320822fd7736121a26e40a0aa0c792 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:50:41 +0200 Subject: [PATCH 022/286] Jumblr initial version --- .gitignore | 8 + basilisk/basilisk.c | 3 +- basilisk/jumblr.c | 369 +++ iguana/SuperNET_keys.c | 2 + iguana/autoAPI.md | 4726 +++++++++++++++++++++++++++++++++ iguana/iguana777.h | 11 +- iguana/main.c | 15 + includes/iguana_apideclares.h | 3 + includes/iguana_funcs.h | 1 + 9 files changed, 5136 insertions(+), 2 deletions(-) create mode 100755 basilisk/jumblr.c create mode 100644 iguana/autoAPI.md diff --git a/.gitignore b/.gitignore index b2923f002..ba6f0a1f2 100755 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,11 @@ iguana/iguana_notary.o-54f98cc3 iguana/basilisk.o-2ad8cb38 iguana/pangea_hand.o-02d25ec3 + +iguana/confs/4dfa301d0adf61f0ec08e4d4cb4444f4fc377f45f5d6b1da0814033920d72353 + +iguana/help.json + +iguana/index7778.html + +*.json diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 9e717e99e..e4760e040 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -492,6 +492,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_ping.c" #include "basilisk_vote.c" #include "basilisk_CMD.c" +#include "jumblr.c" void basilisk_functions(struct iguana_info *coin,int32_t protocol) { @@ -870,7 +871,7 @@ int32_t basilisk_issued_purge(struct supernet_info *myinfo,int32_t timepad) void basilisks_loop(void *arg) { static uint32_t counter; - struct iguana_info *relay; struct supernet_info *myinfo = arg; int32_t iter; double startmilli,endmilli; struct dpow_info *dp; + struct iguana_info *relay; struct supernet_info *myinfo = arg; int32_t iter; double startmilli,endmilli; struct dpow_info *dp; iter = 0; relay = iguana_coinfind("RELAY"); printf("start basilisk loop\n"); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c new file mode 100755 index 000000000..041bfe1c6 --- /dev/null +++ b/basilisk/jumblr.c @@ -0,0 +1,369 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +// included from basilisk.c +// connect DEX to jumblr-core + +/* + z_exportkey "zaddr" + z_exportwallet "filename" + z_getoperationstatus (["operationid", ... ]) + z_gettotalbalance ( minconf ) + z_importkey "zkey" ( rescan ) + z_importwallet "filename" + z_listaddresses + z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) + */ + +#define JUMBLR_INCR 99 +#define JUMBLR_TXFEE 0.01 +#define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" +#define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" +#define JUMBLR_FEE 0.001 +#define JUMBLR_DEPOSITPREFIX "deposit " + +struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) +{ + struct jumblr_item *ptr; + HASH_FIND(hh,myinfo->jumblrs,opid,(int32_t)strlen(opid),ptr); + return(ptr); +} + +struct jumblr_item *jumblr_opidadd(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + struct jumblr_item *ptr; + if ( (ptr= jumblr_opidfind(myinfo,opid)) == 0 ) + { + ptr = calloc(1,sizeof(*ptr)); + safecopy(ptr->opid,opid,sizeof(ptr->opid)); + HASH_ADD_KEYPTR(hh,myinfo->jumblrs,ptr->opid,(int32_t)strlen(ptr->opid),ptr); + if ( ptr != jumblr_opidfind(myinfo,opid) ) + printf("jumblr_opidadd.(%s) ERROR, couldnt find after add\n",opid); + } + return(ptr); +} + +char *jumblr_zgetnewaddress(struct supernet_info *myinfo,struct iguana_info *coin) +{ + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getnewaddress","")); +} + +char *jumblr_zlistoperationids(struct supernet_info *myinfo,struct iguana_info *coin) +{ + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listoperationids","")); +} + +char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + char params[1024]; + sprintf(params,"[\"%s\"]",opid); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); +} + +char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) +{ + char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}]], 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) +{ + char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) +{ + char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); +} + +char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); +} + +char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); +} + +int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; + if ( (retstr= jumblr_zlistreceivedbyaddress(myinfo,coin,addr)) != 0 ) + { + printf("z_listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + { + for (i=0; i SMALLVAL ) + balance = val * SATOSHIDEN; + free(retstr); + } + return(balance); +} + +void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) +{ + cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount; + /*"params" : { + "fromaddress" : "RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5", + "amounts" : [ + { + "address" : "zc9s3UdkDFTnnwHrMCr1vYy2WmkjhmTxXNiqC42s7BjeKBVUwk766TTSsrRPKfnX31Bbu8wbrTqnjDqskYGwx48FZMPHvft", + "amount" : 3.00000000 + } + ], + "minconf" : 1, + "fee" : 0.00010000 + }*/ + if ( (params= jobj(item,"params")) != 0 ) + { + if ( (from= jstr(params,"fromaddress")) != 0 ) + safecopy(ptr->src,from,sizeof(ptr->src)); + if ( (amounts= jarray(&n,params,"amounts")) != 0 ) + { + for (i=0; i 0 ) + { + if ( strcmp(addr,JUMBLR_ADDR) == 0 ) + ptr->fee = amount; + else + { + ptr->amount = amount; + safecopy(ptr->dest,addr,sizeof(ptr->dest)); + } + } + } + } + ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; + } +} + +void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + char *retstr,*status; cJSON *retjson; + if ( ptr->status == 0 ) + { + if ( (retstr= jumblr_zgetoperationresult(myinfo,coin,ptr->opid)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) + jumblr_itemset(ptr,retjson,status); + free_json(retjson); + } + free(retstr); + } + } +} + +void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; + if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; istatus == 0 ) + jumblr_opidupdate(myinfo,coin,ptr); + } + free_json(array); + } + free(retstr); + } +} + +bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix) +{ + bits256 privkey,pubkey; uint8_t pubkey33[33]; char passphrase[sizeof(myinfo->jumblr_passphrase) + 64]; + sprintf(passphrase,"%s%s",prefix,myinfo->jumblr_passphrase); + conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); + bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); + bitcoin_address(BTCaddr,0,pubkey33,33); + bitcoin_address(KMDaddr,60,pubkey33,33); + return(privkey); +} + +void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) +{ + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC + fee = JUMBLR_INCR * JUMBLR_FEE; + OS_randombytes(&r,sizeof(r)); + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) + { + switch ( selector ) + { + case 0: // public -> z + priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) + { + if ( (r & 7) == 0 ) + { + if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + { + if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); + else if ( total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); + else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + if ( (retstr= jumblr_sendt_to_z(myinfo,coin,KMDaddr,zaddr,dstr(amount))) != 0 ) + { + printf("sendt_to_z.(%s)\n",retstr); + free(retstr); + } + free(zaddr); + } + } + } + break; + case 1: // z -> z + jumblr_opidsupdate(myinfo,coin); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) < 40 ) + { + if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) + { + if ( (retstr= jumblr_sendz_to_z(myinfo,coin,ptr->dest,zaddr,dstr(total))) != 0 ) + { + printf("sendz_to_z.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + free(zaddr); + break; + } + } + } + } + break; + case 2: // z -> public + jumblr_opidsupdate(myinfo,coin); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) + { + printf("sendz_to_t.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + break; + } + } + } + break; + } + } +} + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + +STRING_ARG(jumblr,setpassphrase,passphrase) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; + if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) + return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + else + { + safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); + return(clonestr("{\"result\":\"success\"}")); + } +} + +ZERO_ARGS(jumblr,status) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t deposited,step_t2z,step_z2z,step_z2t,finished; + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_opidsupdate(myinfo,coin); + retjson = cJSON_CreateObject(); + step_t2z = step_z2z = step_z2t = deposited = finished = 0; + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + deposited = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + finished = jumblr_receivedby(myinfo,coin,KMDaddr); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( strlen(ptr->dest) >= 40 ) + step_z2z += ptr->amount; + else step_z2t += ptr->amount; + } + else step_t2z += ptr->amount; + } + jaddstr(retjson,"result","success"); + jaddnum(retjson,"deposited",dstr(deposited)); + jaddnum(retjson,"t_to_z",dstr(step_t2z)); + jaddnum(retjson,"z_to_z",dstr(step_z2z)); + jaddnum(retjson,"z_to_t",dstr(step_z2t)); + jaddnum(retjson,"finished",dstr(finished)); + jaddnum(retjson,"pending",dstr(deposited) - dstr(finished)); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); +} + +#include "../includes/iguana_apiundefs.h" diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 904da0c83..b44fc1b18 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -465,6 +465,8 @@ THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) free_json(argjson); return(jprint(retjson,1)); } + + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/autoAPI.md b/iguana/autoAPI.md new file mode 100644 index 000000000..59a5b17f5 --- /dev/null +++ b/iguana/autoAPI.md @@ -0,0 +1,4726 @@ + + +dpow API +=== +need to create help/dpow.md file + +## method: pending + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"pending\",\"fiat\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/pending?fiat={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fiat | string | no help info + +## method: notarychains + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"notarychains\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/notarychains +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: active + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/active?maskhex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +maskhex | string | no help info + +## method: ratify + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"ratify\",\"minsigs\":\"{int}\",\"timestamp\":\"{int}\",\"ratified\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/ratify?minsigs={int}×tamp={int}&ratified={array} +``` + +field | value type | Description +--------- | ------- | ----------- +minsigs | int | no help info +timestamp | int | no help info +ratified | array | no help info + +## method: cancelratify + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"cancelratify\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/cancelratify +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: bindaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"bindaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/bindaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: fundnotaries + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"fundnotaries\",\"symbol\":\"{string}\",\"numblocks\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dpow/fundnotaries?symbol={string}&numblocks={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +numblocks | int | no help info + +pax API +=== +need to create help/pax.md file + +## method: start + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"pax\",\"method\":\"start\"}" +``` + +```url +http://127.0.0.1:7778/api/pax/start +``` + +field | value type | Description +--------- | ------- | ----------- + +passthru API +=== +need to create help/passthru.md file + +## method: paxfiats + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/passthru/paxfiats?mask={int} +``` + +field | value type | Description +--------- | ------- | ----------- +mask | int | no help info + +zcash API +=== +need to create help/zcash.md file + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"zcash\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/zcash/passthru?function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +function | string | no help info +hex | string | no help info + +komodo API +=== +need to create help/komodo.md file + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"komodo\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/komodo/passthru?function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +function | string | no help info +hex | string | no help info + +dex API +=== +need to create help/dex.md file + +## method: kvsearch + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvsearch\",\"symbol\":\"{string}\",\"key\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/kvsearch?symbol={string}&key={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +key | string | no help info + +## method: kvupdate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"symbol\":\"{string}\",\"key\":\"{string}\",\"value\":\"{string}\",\"flags\":\"{int}\",\"unused\":\"{int}\",\"unusedb\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/kvupdate?symbol={string}&key={string}&value={string}&flags={int}&unused={int}&unusedb={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +key | string | no help info +value | string | no help info +flags | int | no help info +unused | int | no help info +unusedb | int | no help info + +## method: send + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"{string}\",\"handler\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/send?hex={string}&handler={string} +``` + +field | value type | Description +--------- | ------- | ----------- +hex | string | no help info +handler | string | no help info + +## method: gettransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"{hash}\",\"symbol\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettransaction?txid={hash}&symbol={str} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info + +## method: getinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getinfo\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getinfo?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getnotaries + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getnotaries\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getnotaries?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: alladdresses + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/alladdresses?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getbestblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbestblockhash\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getbestblockhash?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +## method: getblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getblockhash?symbol={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +height | int | no help info + +## method: getblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblock\",\"hash\":\"{hash}\",\"symbol\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getblock?hash={hash}&symbol={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +symbol | str | no help info + +## method: sendrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"symbol\":\"{string}\",\"signedtx\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/sendrawtransaction?symbol={string}&signedtx={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +signedtx | string | no help info + +## method: gettxout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettxout?txid={hash}&symbol={str}&vout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info +vout | int | no help info + +## method: importaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/importaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: validateaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"validateaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/validateaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: checkaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"checkaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/checkaddress?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listunspent?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listtransactions + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listtransactions?symbol={string}&address={string}&count={float}&skip={float} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info +count | float | no help info +skip | float | no help info + +## method: listunspent2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listunspent2?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: listtransactions2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions2\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listtransactions2?symbol={string}&address={string}&count={float}&skip={float} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info +count | float | no help info +skip | float | no help info + +## method: gettxin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxin\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/gettxin?txid={hash}&symbol={str}&vout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +symbol | str | no help info +vout | int | no help info + +## method: listspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/listspent?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: getbalance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/getbalance?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: explorer + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"explorer\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/dex/explorer?symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info + +basilisk API +=== +need to create help/basilisk.md file + +## method: genesis_opreturn + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"genesis_opreturn\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/genesis_opreturn?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: history + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"history\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/history?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: paxfiats + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/paxfiats?mask={int} +``` + +field | value type | Description +--------- | ------- | ----------- +mask | int | no help info + +## method: balances + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"balances\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/balances?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: value + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"value\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/value?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: rawtx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"rawtx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/rawtx?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: refresh + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/refresh?symbol={string}&address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +address | string | no help info + +## method: utxorawtx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"symbol\":\"{string}\",\"utxos\":\"{array}\",\"vals\":\"{object}\",\"ignore\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/utxorawtx?symbol={string}&utxos={array}&vals={object}&ignore={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +utxos | array | no help info +vals | object | no help info +ignore | string | no help info + +## method: getmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"getmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/getmessage?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: sendmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"sendmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/sendmessage?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoheaders + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoheaders\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoheaders?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoblock\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoblock?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckotx + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckotx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckotx?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: geckoget + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoget\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/geckoget?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: addrelay + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"addrelay\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/addrelay?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: dispatch + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"dispatch\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/dispatch?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: publish + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"publish\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/publish?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: subscribe + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"subscribe\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/subscribe?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: forward + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"forward\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/forward?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: mailbox + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"mailbox\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/basilisk/mailbox?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +bitcoinrpc API +=== +need to create help/bitcoinrpc.md file + +## method: getinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getinfo\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getinfo +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getblockcount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockcount\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblockcount +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getdifficulty + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getdifficulty\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getdifficulty +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getbestblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbestblockhash\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getbestblockhash +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getblockhash + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockhash\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblockhash?height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +height | int | no help info + +## method: getblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblock\",\"blockhash\":\"{hash}\",\"verbose\":\"{int}\",\"remoteonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getblock?blockhash={hash}&verbose={int}&remoteonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +blockhash | hash | no help info +verbose | int | no help info +remoteonly | int | no help info + +## method: getrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawtransaction\",\"txid\":\"{hash}\",\"verbose\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getrawtransaction?txid={hash}&verbose={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +verbose | int | no help info + +## method: gettransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettransaction\",\"txid\":\"{hash}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettransaction?txid={hash} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info + +## method: gettxout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"vout\":\"{int}\",\"mempool\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettxout?txid={hash}&vout={int}&mempool={int} +``` + +field | value type | Description +--------- | ------- | ----------- +txid | hash | no help info +vout | int | no help info +mempool | int | no help info + +## method: listunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listunspent\",\"minconf\":\"{int}\",\"maxconf\":\"{int}\",\"array\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listunspent?minconf={int}&maxconf={int}&array={array} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +maxconf | int | no help info +array | array | no help info + +## method: decodescript + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decodescript\",\"scriptstr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/decodescript?scriptstr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +scriptstr | string | no help info + +## method: decoderawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decoderawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/decoderawtransaction?rawtx={string}&suppress={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +suppress | int | no help info + +## method: validaterawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validaterawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validaterawtransaction?rawtx={string}&suppress={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +suppress | int | no help info + +## method: createrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createrawtransaction\",\"vins\":\"{array}\",\"vouts\":\"{object}\",\"locktime\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/createrawtransaction?vins={array}&vouts={object}&locktime={int} +``` + +field | value type | Description +--------- | ------- | ----------- +vins | array | no help info +vouts | object | no help info +locktime | int | no help info + +## method: validatepubkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validatepubkey\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validatepubkey?pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | string | no help info + +## method: validateaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validateaddress\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/validateaddress?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: walletlock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletlock\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletlock +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: walletpassphrase + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"timeout\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrase?password={string}&permanentfile={string}&timeout={int} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info +timeout | int | no help info + +## method: encryptwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/encryptwallet?passphrase={string}&password={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info +password | string | no help info +permanentfile | string | no help info + +## method: walletpassphrasechange + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrasechange\",\"oldpassword\":\"{string}\",\"newpassword\":\"{string}\",\"oldpermanentfile\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrasechange?oldpassword={string}&newpassword={string}&oldpermanentfile={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +oldpassword | string | no help info +newpassword | string | no help info +oldpermanentfile | string | no help info +permanentfile | string | no help info + +## method: dumpwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/dumpwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: backupwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"backupwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/backupwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: importwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importwallet\",\"filename\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importwallet?filename={string} +``` + +field | value type | Description +--------- | ------- | ----------- +filename | string | no help info + +## method: getnewaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getnewaddress\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getnewaddress?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: importprivkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importprivkey\",\"wif\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importprivkey?wif={string}&account={string}&rescan={int} +``` + +field | value type | Description +--------- | ------- | ----------- +wif | string | no help info +account | string | no help info +rescan | int | no help info + +## method: importaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importaddress\",\"address\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/importaddress?address={string}&account={string}&rescan={int} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +account | string | no help info +rescan | int | no help info + +## method: dumpprivkey + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpprivkey\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/dumpprivkey?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: listtransactions + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listtransactions\",\"account\":\"{string}\",\"count\":\"{int}\",\"skip\":\"{int}\",\"includewatchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listtransactions?account={string}&count={int}&skip={int}&includewatchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +count | int | no help info +skip | int | no help info +includewatchonly | int | no help info + +## method: listreceivedbyaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaddress\",\"minconf\":\"{int}\",\"includeempty\":\"{int}\",\"flag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaddress?minconf={int}&includeempty={int}&flag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +includeempty | int | no help info +flag | int | no help info + +## method: listreceivedbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaccount\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"watchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaccount?confirmations={int}&includeempty={int}&watchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +confirmations | int | no help info +includeempty | int | no help info +watchonly | int | no help info + +## method: listaccounts + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaccounts\",\"minconf\":\"{int}\",\"includewatchonly\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listaccounts?minconf={int}&includewatchonly={int} +``` + +field | value type | Description +--------- | ------- | ----------- +minconf | int | no help info +includewatchonly | int | no help info + +## method: listaddressgroupings + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaddressgroupings\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listaddressgroupings +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getreceivedbyaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaddress\",\"address\":\"{string}\",\"minconf\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaddress?address={string}&minconf={int} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +minconf | int | no help info + +## method: getreceivedbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaccount\",\"account\":\"{string}\",\"includeempty\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaccount?account={string}&includeempty={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +includeempty | int | no help info + +## method: getbalance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbalance\",\"account\":\"{string}\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"lastheight\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getbalance?account={string}&confirmations={int}&includeempty={int}&lastheight={int} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info +confirmations | int | no help info +includeempty | int | no help info +lastheight | int | no help info + +## method: getaddressesbyaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaddressesbyaccount\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaddressesbyaccount?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: getaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccount\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaccount?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: getaccountaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccountaddress\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getaccountaddress?account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +account | string | no help info + +## method: setaccount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"setaccount\",\"address\":\"{string}\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/setaccount?address={string}&account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +account | string | no help info + +## method: createmultisig + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createmultisig\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"ignore\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/createmultisig?M={int}&pubkeys={array}&ignore={string} +``` + +field | value type | Description +--------- | ------- | ----------- +M | int | no help info +pubkeys | array | no help info +ignore | string | no help info + +## method: addmultisigaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"addmultisigaddress\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"account\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/addmultisigaddress?M={int}&pubkeys={array}&account={string} +``` + +field | value type | Description +--------- | ------- | ----------- +M | int | no help info +pubkeys | array | no help info +account | string | no help info + +## method: settxfee + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"settxfee\",\"amount\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/settxfee?amount={float} +``` + +field | value type | Description +--------- | ------- | ----------- +amount | float | no help info + +## method: checkwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"checkwallet\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/checkwallet +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: repairwallet + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"repairwallet\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/repairwallet +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: signrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signrawtransaction\",\"rawtx\":\"{string}\",\"vins\":\"{array}\",\"privkeys\":\"{object}\",\"sighash\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/signrawtransaction?rawtx={string}&vins={array}&privkeys={object}&sighash={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +vins | array | no help info +privkeys | object | no help info +sighash | string | no help info + +## method: signmessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signmessage\",\"address\":\"{string}\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/signmessage?address={string}&message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +message | string | no help info + +## method: verifymessage + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"verifymessage\",\"address\":\"{string}\",\"sig\":\"{string}\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/verifymessage?address={string}&sig={string}&message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +sig | string | no help info +message | string | no help info + +## method: sendrawtransaction + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendrawtransaction\",\"rawtx\":\"{string}\",\"allowhighfees\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendrawtransaction?rawtx={string}&allowhighfees={int} +``` + +field | value type | Description +--------- | ------- | ----------- +rawtx | string | no help info +allowhighfees | int | no help info + +## method: sendfrom + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendfrom\",\"fromaccount\":\"{string}\",\"toaddress\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendfrom?fromaccount={string}&toaddress={string}&amount={float}&minconf={int}&comment={string}&comment2={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +toaddress | string | no help info +amount | float | no help info +minconf | int | no help info +comment | string | no help info +comment2 | string | no help info + +## method: sendmany + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendmany\",\"fromaccount\":\"{string}\",\"payments\":\"{array}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendmany?fromaccount={string}&payments={array}&minconf={int}&comment={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +payments | array | no help info +minconf | int | no help info +comment | string | no help info + +## method: sendtoaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendtoaddress\",\"address\":\"{string}\",\"amount\":\"{float}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/sendtoaddress?address={string}&amount={float}&comment={string}&comment2={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info +amount | float | no help info +comment | string | no help info +comment2 | string | no help info + +## method: lockunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"lockunspent\",\"flag\":\"{int}\",\"array\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/lockunspent?flag={int}&array={array} +``` + +field | value type | Description +--------- | ------- | ----------- +flag | int | no help info +array | array | no help info + +## method: listlockunspent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listlockunspent\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listlockunspent +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: submitblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"submitblock\",\"rawbytes\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/submitblock?rawbytes={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rawbytes | string | no help info + +## method: listsinceblock + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listsinceblock\",\"blockhash\":\"{hash}\",\"target\":\"{int}\",\"flag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/listsinceblock?blockhash={hash}&target={int}&flag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +blockhash | hash | no help info +target | int | no help info +flag | int | no help info + +## method: gettxoutsetinfo + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxoutsetinfo\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/gettxoutsetinfo +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: getrawchangeaddress + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawchangeaddress\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/getrawchangeaddress +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: move + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"move\",\"fromaccount\":\"{string}\",\"toaccount\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/bitcoinrpc/move?fromaccount={string}&toaccount={string}&amount={float}&minconf={int}&comment={string} +``` + +field | value type | Description +--------- | ------- | ----------- +fromaccount | string | no help info +toaccount | string | no help info +amount | float | no help info +minconf | int | no help info +comment | string | no help info + +iguana API +=== +need to create help/iguana.md file + +## method: splitfunds + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"splitfunds\",\"satoshis\":\"{int}\",\"duplicates\":\"{int}\",\"sendflag\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/splitfunds?satoshis={int}&duplicates={int}&sendflag={int} +``` + +field | value type | Description +--------- | ------- | ----------- +satoshis | int | no help info +duplicates | int | no help info +sendflag | int | no help info + +## method: makekeypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"makekeypair\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/makekeypair +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: rates + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rates\",\"unused\":\"{int}\",\"quotes\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/rates?unused={int}"es={array} +``` + +field | value type | Description +--------- | ------- | ----------- +unused | int | no help info +quotes | array | no help info + +## method: rate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/rate?base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +base | string | no help info +rel | string | no help info + +## method: prices + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"prices\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"period\":\"{int}\",\"start\":\"{int}\",\"end\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/prices?exchange={string}&base={string}&rel={string}&period={int}&start={int}&end={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +period | int | no help info +start | int | no help info +end | int | no help info + +## method: snapshot + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"snapshot\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/snapshot?symbol={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +height | int | no help info + +## method: dividends + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dividends\",\"height\":\"{int}\",\"vals\":\"{array}\",\"symbol\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/dividends?height={int}&vals={array}&symbol={string} +``` + +field | value type | Description +--------- | ------- | ----------- +height | int | no help info +vals | array | no help info +symbol | string | no help info + +## method: passthru + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"passthru\",\"asset\":\"{string}\",\"function\":\"{string}\",\"hex\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/passthru?asset={string}&function={string}&hex={string} +``` + +field | value type | Description +--------- | ------- | ----------- +asset | string | no help info +function | string | no help info +hex | string | no help info + +## method: initfastfind + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"initfastfind\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/initfastfind?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: dpow + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"{string}\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/dpow?symbol={string}&pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +symbol | string | no help info +pubkey | string | no help info + +## method: peers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"peers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/peers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: maxpeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"activecoin\":\"{string}\",\"max\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/maxpeers?activecoin={string}&max={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +max | int | no help info + +## method: getconnectioncount + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"getconnectioncount\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/getconnectioncount?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: addcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addcoin?newcoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +newcoin | string | no help info + +## method: validate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"validate\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/validate?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: removecoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removecoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/removecoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: startcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"startcoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/startcoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: pausecoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/pausecoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: stopcoin + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stopcoin\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/stopcoin?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: addnode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addnode?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: addnotary + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/addnotary?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: persistent + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"persistent\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/persistent?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: removenode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removenode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/removenode?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: oneshot + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"oneshot\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/oneshot?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: nodestatus + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/nodestatus?activecoin={string}&ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +ipaddr | string | no help info + +## method: balance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"balance\",\"activecoin\":\"{string}\",\"address\":\"{string}\",\"heightd\":\"{float}\",\"minconfd\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/balance?activecoin={string}&address={string}&heightd={float}&minconfd={float} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +address | string | no help info +heightd | float | no help info +minconfd | float | no help info + +## method: spendmsig + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"spendmsig\",\"activecoin\":\"{string}\",\"vintxid\":\"{hash}\",\"vinvout\":\"{int}\",\"destaddress\":\"{string}\",\"destamount\":\"{float}\",\"destaddress2\":\"{string}\",\"destamount2\":\"{float}\",\"M\":\"{int}\",\"N\":\"{int}\",\"pubA\":\"{string}\",\"wifA\":\"{string}\",\"pubB\":\"{string}\",\"wifB\":\"{string}\",\"pubC\":\"{string}\",\"wifC\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/spendmsig?activecoin={string}&vintxid={hash}&vinvout={int}&destaddress={string}&destamount={float}&destaddress2={string}&destamount2={float}&M={int}&N={int}&pubA={string}&wifA={string}&pubB={string}&wifB={string}&pubC={string}&wifC={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +vintxid | hash | no help info +vinvout | int | no help info +destaddress | string | no help info +destamount | float | no help info +destaddress2 | string | no help info +destamount2 | float | no help info +M | int | no help info +N | int | no help info +pubA | string | no help info +wifA | string | no help info +pubB | string | no help info +wifB | string | no help info +pubC | string | no help info +wifC | string | no help info + +## method: bundleaddresses + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundleaddresses\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/bundleaddresses?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: bundlehashes + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundlehashes\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/bundlehashes?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: PoSweights + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"PoSweights\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/PoSweights?activecoin={string}&height={int} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info +height | int | no help info + +## method: stakers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stakers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/iguana/stakers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +jumblr API +=== +need to create help/jumblr.md file + +## method: setpassphrase + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/jumblr/setpassphrase?passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info + +InstantDEX API +=== +need to create help/InstantDEX.md file + +## method: allcoins + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allcoins\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allcoins +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: available + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"available\",\"source\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/available?source={string} +``` + +field | value type | Description +--------- | ------- | ----------- +source | string | no help info + +## method: request + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/request?hash={hash}&vals={array}&hexstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +hexstr | str | no help info + +## method: incoming + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"incoming\",\"requestid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/incoming?requestid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info + +## method: automatched + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"automatched\",\"requestid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/automatched?requestid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info + +## method: accept + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"accept\",\"requestid\":\"{int}\",\"quoteid\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/accept?requestid={int}"eid={int} +``` + +field | value type | Description +--------- | ------- | ----------- +requestid | int | no help info +quoteid | int | no help info + +## method: buy + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"buy\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/buy?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +dotrade | float | no help info + +## method: sell + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"sell\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/sell?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +dotrade | float | no help info + +## method: withdraw + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"destaddr\":\"{string}\",\"amount\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/withdraw?exchange={string}&base={string}&destaddr={string}&amount={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +destaddr | string | no help info +amount | float | no help info + +## method: apikeypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"{string}\",\"apikey\":\"{string}\",\"apisecret\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/apikeypair?exchange={string}&apikey={string}&apisecret={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +apikey | string | no help info +apisecret | string | no help info + +## method: setuserid + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"{string}\",\"userid\":\"{string}\",\"tradepassword\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/setuserid?exchange={string}&userid={string}&tradepassword={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +userid | string | no help info +tradepassword | string | no help info + +## method: balance + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"{string}\",\"base\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/balance?exchange={string}&base={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info + +## method: orderstatus + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/orderstatus?exchange={string}&orderid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +orderid | string | no help info + +## method: cancelorder + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/cancelorder?exchange={string}&orderid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +orderid | string | no help info + +## method: openorders + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/openorders?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: tradehistory + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/tradehistory?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: orderbook + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"depth\":\"{int}\",\"allfields\":\"{int}\",\"ignore\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/orderbook?exchange={string}&base={string}&rel={string}&depth={int}&allfields={int}&ignore={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +depth | int | no help info +allfields | int | no help info +ignore | int | no help info + +## method: pollgap + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"pollgap\",\"exchange\":\"{string}\",\"pollgap\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/pollgap?exchange={string}&pollgap={int} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +pollgap | int | no help info + +## method: allexchanges + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allexchanges +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: allpairs + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allpairs\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/allpairs?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: supports + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"supports\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/InstantDEX/supports?exchange={string}&base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info + +tradebot API +=== +need to create help/tradebot.md file + +## method: liquidity + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"targetcoin\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/liquidity?hash={hash}&vals={array}&targetcoin={str} +``` + +field | value type | Description +--------- | ------- | ----------- +hash | hash | no help info +vals | array | no help info +targetcoin | str | no help info + +## method: amlp + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/amlp?blocktrail={string} +``` + +field | value type | Description +--------- | ------- | ----------- +blocktrail | string | no help info + +## method: notlp + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/notlp +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: gensvm + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/gensvm?base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +base | string | no help info +rel | string | no help info + +## method: openliquidity + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"openliquidity\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/openliquidity +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: aveprice + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"aveprice\",\"comment\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"basevolume\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/aveprice?comment={string}&base={string}&rel={string}&basevolume={float} +``` + +field | value type | Description +--------- | ------- | ----------- +comment | string | no help info +base | string | no help info +rel | string | no help info +basevolume | float | no help info + +## method: monitor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"commission\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/monitor?exchange={string}&base={string}&rel={string}&commission={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +commission | float | no help info + +## method: monitorall + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitorall\",\"exchange\":\"{string}\",\"commission\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/monitorall?exchange={string}&commission={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +commission | float | no help info + +## method: unmonitor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"unmonitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/unmonitor?exchange={string}&base={string}&rel={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info + +## method: accumulate + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"accumulate\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/accumulate?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +duration | float | no help info + +## method: divest + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"divest\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/divest?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +base | string | no help info +rel | string | no help info +price | float | no help info +volume | float | no help info +duration | float | no help info + +## method: activebots + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"activebots\",\"exchange\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/activebots?exchange={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info + +## method: status + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"status\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/status?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: pause + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"pause\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/pause?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: stop + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"stop\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/stop?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: resume + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"resume\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/resume?exchange={string}&botid={string} +``` + +field | value type | Description +--------- | ------- | ----------- +exchange | string | no help info +botid | string | no help info + +## method: allbalances + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"allbalances\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/allbalances +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: anchor + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"anchor\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/anchor +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: portfolio + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"portfolio\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/portfolio +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: goals + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"goals\",\"currencies\":\"{array}\",\"vals\":\"{object}\",\"targettime\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/tradebot/goals?currencies={array}&vals={object}&targettime={int} +``` + +field | value type | Description +--------- | ------- | ----------- +currencies | array | no help info +vals | object | no help info +targettime | int | no help info + +SuperNET API +=== +need to create help/SuperNET.md file + +## method: help + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"help\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/help +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: utime2utc + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utime2utc\",\"utime\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/utime2utc?utime={string} +``` + +field | value type | Description +--------- | ------- | ----------- +utime | string | no help info + +## method: utc2utime + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utc2utime\",\"utc\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/utc2utime?utc={int} +``` + +field | value type | Description +--------- | ------- | ----------- +utc | int | no help info + +## method: getpeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"getpeers\",\"activecoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/getpeers?activecoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +activecoin | string | no help info + +## method: mypeers + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"mypeers\",\"supernet\":\"{array}\",\"rawpeers\":\"{array}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/mypeers?supernet={array}&rawpeers={array} +``` + +field | value type | Description +--------- | ------- | ----------- +supernet | array | no help info +rawpeers | array | no help info + +## method: stop + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"stop\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/stop +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: saveconf + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"saveconf\",\"wallethash\":\"{hash}\",\"confjsonstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/saveconf?wallethash={hash}&confjsonstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +wallethash | hash | no help info +confjsonstr | str | no help info + +## method: layer + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"layer\",\"mypriv\":\"{hash}\",\"otherpubs\":\"{array}\",\"str\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/layer?mypriv={hash}&otherpubs={array}&str={str} +``` + +field | value type | Description +--------- | ------- | ----------- +mypriv | hash | no help info +otherpubs | array | no help info +str | str | no help info + +## method: bitcoinrpc + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"bitcoinrpc\",\"setcoin\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/bitcoinrpc?setcoin={string} +``` + +field | value type | Description +--------- | ------- | ----------- +setcoin | string | no help info + +## method: myipaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/myipaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: setmyipaddr + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"setmyipaddr\",\"ipaddr\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/setmyipaddr?ipaddr={string} +``` + +field | value type | Description +--------- | ------- | ----------- +ipaddr | string | no help info + +## method: login + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/login?handle={string}&password={string}&permanentfile={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +handle | string | no help info +password | string | no help info +permanentfile | string | no help info +passphrase | string | no help info + +## method: logout + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"logout\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/logout +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: activehandle + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"activehandle\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/activehandle +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: encryptjson + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"encryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"payload\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/encryptjson?password={string}&permanentfile={string}&payload={string} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info +payload | string | no help info + +## method: decryptjson + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/decryptjson?password={string}&permanentfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +password | string | no help info +permanentfile | string | no help info + +## method: html + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"html\",\"agentform\":\"{string}\",\"htmlfile\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/html?agentform={string}&htmlfile={string} +``` + +field | value type | Description +--------- | ------- | ----------- +agentform | string | no help info +htmlfile | string | no help info + +## method: rosetta + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rosetta\",\"passphrase\":\"{string}\",\"pin\":\"{string}\",\"showprivkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/rosetta?passphrase={string}&pin={string}&showprivkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info +pin | string | no help info +showprivkey | string | no help info + +## method: keypair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"keypair\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/keypair +``` + +field | value type | Description +--------- | ------- | ----------- + +## method: priv2pub + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"{hash}\",\"addrtype\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/priv2pub?privkey={hash}&addrtype={int} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +addrtype | int | no help info + +## method: wif2priv + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/wif2priv?wif={string} +``` + +field | value type | Description +--------- | ------- | ----------- +wif | string | no help info + +## method: priv2wif + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2wif\",\"priv\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/priv2wif?priv={string} +``` + +field | value type | Description +--------- | ------- | ----------- +priv | string | no help info + +## method: addr2rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"addr2rmd160\",\"address\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/addr2rmd160?address={string} +``` + +field | value type | Description +--------- | ------- | ----------- +address | string | no help info + +## method: rmd160conv + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rmd160conv\",\"rmd160\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/rmd160conv?rmd160={string} +``` + +field | value type | Description +--------- | ------- | ----------- +rmd160 | string | no help info + +## method: cipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"cipher\",\"privkey\":\"{hash}\",\"destpubkey\":\"{hash}\",\"message\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/cipher?privkey={hash}&destpubkey={hash}&message={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +destpubkey | hash | no help info +message | str | no help info + +## method: decipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decipher\",\"privkey\":\"{hash}\",\"srcpubkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/decipher?privkey={hash}&srcpubkey={hash}&cipherstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +srcpubkey | hash | no help info +cipherstr | str | no help info + +## method: broadcastcipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastcipher\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/broadcastcipher?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: broadcastdecipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastdecipher\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/broadcastdecipher?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: multicastcipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastcipher\",\"pubkey\":\"{hash}\",\"message\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/multicastcipher?pubkey={hash}&message={str} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | hash | no help info +message | str | no help info + +## method: multicastdecipher + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastdecipher\",\"privkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" +``` + +```url +http://127.0.0.1:7778/api/SuperNET/multicastdecipher?privkey={hash}&cipherstr={str} +``` + +field | value type | Description +--------- | ------- | ----------- +privkey | hash | no help info +cipherstr | str | no help info + +mouse API +=== +need to create help/mouse.md file + +## method: image + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"image\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/image?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: change + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"change\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/change?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: click + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"click\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/click?name={string}&x={int}&y={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +x | int | no help info +y | int | no help info + +## method: close + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"close\",\"name\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/close?name={string} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info + +## method: leave + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"leave\",\"name\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/mouse/leave?name={string} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info + +keyboard API +=== +need to create help/keyboard.md file + +## method: key + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"keyboard\",\"method\":\"key\",\"name\":\"{string}\",\"c\":\"{int}\"}" +``` + +```url +http://127.0.0.1:7778/api/keyboard/key?name={string}&c={int} +``` + +field | value type | Description +--------- | ------- | ----------- +name | string | no help info +c | int | no help info + +hash API +=== +need to create help/hash.md file + +## method: hex + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"hex\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/hex?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: unhex + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"unhex\",\"hexmsg\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/unhex?hexmsg={string} +``` + +field | value type | Description +--------- | ------- | ----------- +hexmsg | string | no help info + +## method: curve25519_pair + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519_pair\",\"element\":\"{hash}\",\"scalar\":\"{hash}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/curve25519_pair?element={hash}&scalar={hash} +``` + +field | value type | Description +--------- | ------- | ----------- +element | hash | no help info +scalar | hash | no help info + +## method: NXT + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"NXT\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/NXT?passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +passphrase | string | no help info + +## method: curve25519 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519\",\"pubkey\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/curve25519?pubkey={string} +``` + +field | value type | Description +--------- | ------- | ----------- +pubkey | string | no help info + +## method: crc32 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"crc32\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/crc32?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: base64_encode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_encode\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/base64_encode?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: base64_decode + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_decode\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/base64_decode?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd160_sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd160_sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha256_sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha256_sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha224 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha224\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha224?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha384 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha384\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha384?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha512 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha512\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha512?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd128 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd128\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd128?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd160?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd256\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd256?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: rmd320 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd320\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/rmd320?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: sha1 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha1\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/sha1?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md2\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md2?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md4 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md4\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md4?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: md5 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md5\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/md5?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: tiger192_3 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"tiger192_3\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/tiger192_3?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +## method: whirlpool + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"whirlpool\",\"message\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hash/whirlpool?message={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info + +hmac API +=== +need to create help/hmac.md file + +## method: sha224 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha224\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha224?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha256?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha384 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha384\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha384?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha512 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha512\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha512?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd128 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd128\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd128?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd160 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd160\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd160?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd256 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd256?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: rmd320 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd320\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/rmd320?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: sha1 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha1\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/sha1?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md2 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md2\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md2?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md4 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md4\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md4?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: md5 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md5\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/md5?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: tiger192_3 + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"tiger192_3\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/tiger192_3?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +## method: whirlpool + +put helpful info here + + +```shell +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"whirlpool\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" +``` + +```url +http://127.0.0.1:7778/api/hmac/whirlpool?message={string}&passphrase={string} +``` + +field | value type | Description +--------- | ------- | ----------- +message | string | no help info +passphrase | string | no help info + +end of help + diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 29fa7195c..a9b88c7b3 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,14 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +struct jumblr_item +{ + UT_hash_handle hh; + int64_t amount,fee,txfee; + uint32_t spent; + char opid[65],src[65],dest[65],status; +}; + struct liquidity_info { char base[16],rel[16],exchange[16]; @@ -104,7 +112,7 @@ struct supernet_info struct supernet_address myaddr; bits256 persistent_priv,privkey; uint8_t persistent_pubkey33[33]; - char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024]; + char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024],jumblr_passphrase[1024]; char *decryptstr; void (*liquidity_command)(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals); double (*liquidity_active)(struct supernet_info *myinfo,double *refpricep,char *exchange,char *base,char *rel,double volume); @@ -112,6 +120,7 @@ struct supernet_info uint32_t expiration,dirty,DEXactive,DEXpoll,totalcoins,nanoinit,lastdexrequestid,dexcrcs[1024]; uint16_t argport,rpcport; struct basilisk_info basilisks; + struct jumblr_item *jumblrs; struct exchange_info *tradingexchanges[SUPERNET_MAXEXCHANGES]; int32_t numexchanges; struct iguana_waccount *wallet; struct iguana_info *allcoins; int32_t allcoins_being_added,allcoins_numvirts; diff --git a/iguana/main.c b/iguana/main.c index 30758a494..7c6b7b98d 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -745,6 +745,20 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess else strcat(myinfo->NXTAPIURL,"6876/nxt"); } +void jumblr_loop(void *ptr) +{ + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + while ( 1 ) + { + t = (uint32_t)time(NULL); + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + { + jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + } + sleep(20); + } +} + void iguana_launchdaemons(struct supernet_info *myinfo) { int32_t i; char *helperargs,helperstr[512]; @@ -761,6 +775,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) iguana_launch(0,"rpcloop",iguana_rpcloop,myinfo,IGUANA_PERMTHREAD); // limit to oneprocess printf("launch mainloop\n"); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)jumblr_loop,(void *)myinfo); mainloop(myinfo); } diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 4a6787406..3f952e15a 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -186,6 +186,9 @@ STRING_AND_INT(iguana,bundlehashes,activecoin,height); STRING_AND_INT(iguana,PoSweights,activecoin,height); STRING_ARG(iguana,stakers,activecoin); +STRING_ARG(jumblr,setpassphrase,passphrase); +ZERO_ARGS(jumblr,status); + ZERO_ARGS(InstantDEX,allcoins); STRING_ARG(InstantDEX,available,source); HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 8e048b21f..43f997c75 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -614,6 +614,7 @@ uint64_t *iguana_PoS_weights(struct supernet_info *myinfo,struct iguana_info *co int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *refrmd160,struct iguana_pkhash *refP,uint64_t *weights,int32_t numweights,bits256 *sortbuf); bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); +void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 5e86843e6c50d97b765fff903417f6a31446225d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:56:00 +0200 Subject: [PATCH 023/286] Test --- iguana/autoAPI.md | 4726 --------------------------------------------- 1 file changed, 4726 deletions(-) delete mode 100644 iguana/autoAPI.md diff --git a/iguana/autoAPI.md b/iguana/autoAPI.md deleted file mode 100644 index 59a5b17f5..000000000 --- a/iguana/autoAPI.md +++ /dev/null @@ -1,4726 +0,0 @@ - - -dpow API -=== -need to create help/dpow.md file - -## method: pending - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"pending\",\"fiat\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/pending?fiat={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fiat | string | no help info - -## method: notarychains - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"notarychains\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/notarychains -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: active - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/active?maskhex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -maskhex | string | no help info - -## method: ratify - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"ratify\",\"minsigs\":\"{int}\",\"timestamp\":\"{int}\",\"ratified\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/ratify?minsigs={int}×tamp={int}&ratified={array} -``` - -field | value type | Description ---------- | ------- | ----------- -minsigs | int | no help info -timestamp | int | no help info -ratified | array | no help info - -## method: cancelratify - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"cancelratify\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/cancelratify -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: bindaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"bindaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/bindaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: fundnotaries - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"fundnotaries\",\"symbol\":\"{string}\",\"numblocks\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dpow/fundnotaries?symbol={string}&numblocks={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -numblocks | int | no help info - -pax API -=== -need to create help/pax.md file - -## method: start - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"pax\",\"method\":\"start\"}" -``` - -```url -http://127.0.0.1:7778/api/pax/start -``` - -field | value type | Description ---------- | ------- | ----------- - -passthru API -=== -need to create help/passthru.md file - -## method: paxfiats - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/passthru/paxfiats?mask={int} -``` - -field | value type | Description ---------- | ------- | ----------- -mask | int | no help info - -zcash API -=== -need to create help/zcash.md file - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"zcash\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/zcash/passthru?function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -function | string | no help info -hex | string | no help info - -komodo API -=== -need to create help/komodo.md file - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"komodo\",\"method\":\"passthru\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/komodo/passthru?function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -function | string | no help info -hex | string | no help info - -dex API -=== -need to create help/dex.md file - -## method: kvsearch - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvsearch\",\"symbol\":\"{string}\",\"key\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/kvsearch?symbol={string}&key={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -key | string | no help info - -## method: kvupdate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"symbol\":\"{string}\",\"key\":\"{string}\",\"value\":\"{string}\",\"flags\":\"{int}\",\"unused\":\"{int}\",\"unusedb\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/kvupdate?symbol={string}&key={string}&value={string}&flags={int}&unused={int}&unusedb={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -key | string | no help info -value | string | no help info -flags | int | no help info -unused | int | no help info -unusedb | int | no help info - -## method: send - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"{string}\",\"handler\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/send?hex={string}&handler={string} -``` - -field | value type | Description ---------- | ------- | ----------- -hex | string | no help info -handler | string | no help info - -## method: gettransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"{hash}\",\"symbol\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettransaction?txid={hash}&symbol={str} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info - -## method: getinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getinfo\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getinfo?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getnotaries - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getnotaries\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getnotaries?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: alladdresses - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/alladdresses?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getbestblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbestblockhash\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getbestblockhash?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -## method: getblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getblockhash?symbol={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -height | int | no help info - -## method: getblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblock\",\"hash\":\"{hash}\",\"symbol\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getblock?hash={hash}&symbol={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -symbol | str | no help info - -## method: sendrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"symbol\":\"{string}\",\"signedtx\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/sendrawtransaction?symbol={string}&signedtx={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -signedtx | string | no help info - -## method: gettxout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettxout?txid={hash}&symbol={str}&vout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info -vout | int | no help info - -## method: importaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/importaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: validateaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"validateaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/validateaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: checkaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"checkaddress\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/checkaddress?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listunspent?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listtransactions - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listtransactions?symbol={string}&address={string}&count={float}&skip={float} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info -count | float | no help info -skip | float | no help info - -## method: listunspent2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent2\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listunspent2?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: listtransactions2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions2\",\"symbol\":\"{string}\",\"address\":\"{string}\",\"count\":\"{float}\",\"skip\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listtransactions2?symbol={string}&address={string}&count={float}&skip={float} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info -count | float | no help info -skip | float | no help info - -## method: gettxin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxin\",\"txid\":\"{hash}\",\"symbol\":\"{str}\",\"vout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/gettxin?txid={hash}&symbol={str}&vout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -symbol | str | no help info -vout | int | no help info - -## method: listspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listspent\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/listspent?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: getbalance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/getbalance?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: explorer - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"explorer\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/dex/explorer?symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info - -basilisk API -=== -need to create help/basilisk.md file - -## method: genesis_opreturn - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"genesis_opreturn\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/genesis_opreturn?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: history - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"history\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/history?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: paxfiats - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\",\"mask\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/paxfiats?mask={int} -``` - -field | value type | Description ---------- | ------- | ----------- -mask | int | no help info - -## method: balances - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"balances\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/balances?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: value - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"value\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/value?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: rawtx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"rawtx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/rawtx?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: refresh - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"refresh\",\"symbol\":\"{string}\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/refresh?symbol={string}&address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -address | string | no help info - -## method: utxorawtx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"symbol\":\"{string}\",\"utxos\":\"{array}\",\"vals\":\"{object}\",\"ignore\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/utxorawtx?symbol={string}&utxos={array}&vals={object}&ignore={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -utxos | array | no help info -vals | object | no help info -ignore | string | no help info - -## method: getmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"getmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/getmessage?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: sendmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"sendmessage\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/sendmessage?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoheaders - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoheaders\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoheaders?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoblock\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoblock?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckotx - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckotx\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckotx?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: geckoget - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"geckoget\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/geckoget?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: addrelay - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"addrelay\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/addrelay?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: dispatch - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"dispatch\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/dispatch?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: publish - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"publish\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/publish?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: subscribe - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"subscribe\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/subscribe?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: forward - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"forward\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/forward?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: mailbox - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"mailbox\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/basilisk/mailbox?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -bitcoinrpc API -=== -need to create help/bitcoinrpc.md file - -## method: getinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getinfo\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getinfo -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getblockcount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockcount\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblockcount -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getdifficulty - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getdifficulty\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getdifficulty -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getbestblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbestblockhash\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getbestblockhash -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getblockhash - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblockhash\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblockhash?height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -height | int | no help info - -## method: getblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getblock\",\"blockhash\":\"{hash}\",\"verbose\":\"{int}\",\"remoteonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getblock?blockhash={hash}&verbose={int}&remoteonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -blockhash | hash | no help info -verbose | int | no help info -remoteonly | int | no help info - -## method: getrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawtransaction\",\"txid\":\"{hash}\",\"verbose\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getrawtransaction?txid={hash}&verbose={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -verbose | int | no help info - -## method: gettransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettransaction\",\"txid\":\"{hash}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettransaction?txid={hash} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info - -## method: gettxout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxout\",\"txid\":\"{hash}\",\"vout\":\"{int}\",\"mempool\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettxout?txid={hash}&vout={int}&mempool={int} -``` - -field | value type | Description ---------- | ------- | ----------- -txid | hash | no help info -vout | int | no help info -mempool | int | no help info - -## method: listunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listunspent\",\"minconf\":\"{int}\",\"maxconf\":\"{int}\",\"array\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listunspent?minconf={int}&maxconf={int}&array={array} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -maxconf | int | no help info -array | array | no help info - -## method: decodescript - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decodescript\",\"scriptstr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/decodescript?scriptstr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -scriptstr | string | no help info - -## method: decoderawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"decoderawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/decoderawtransaction?rawtx={string}&suppress={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -suppress | int | no help info - -## method: validaterawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validaterawtransaction\",\"rawtx\":\"{string}\",\"suppress\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validaterawtransaction?rawtx={string}&suppress={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -suppress | int | no help info - -## method: createrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createrawtransaction\",\"vins\":\"{array}\",\"vouts\":\"{object}\",\"locktime\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/createrawtransaction?vins={array}&vouts={object}&locktime={int} -``` - -field | value type | Description ---------- | ------- | ----------- -vins | array | no help info -vouts | object | no help info -locktime | int | no help info - -## method: validatepubkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validatepubkey\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validatepubkey?pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | string | no help info - -## method: validateaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"validateaddress\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/validateaddress?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: walletlock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletlock\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletlock -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: walletpassphrase - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"timeout\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrase?password={string}&permanentfile={string}&timeout={int} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info -timeout | int | no help info - -## method: encryptwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/encryptwallet?passphrase={string}&password={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info -password | string | no help info -permanentfile | string | no help info - -## method: walletpassphrasechange - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrasechange\",\"oldpassword\":\"{string}\",\"newpassword\":\"{string}\",\"oldpermanentfile\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/walletpassphrasechange?oldpassword={string}&newpassword={string}&oldpermanentfile={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -oldpassword | string | no help info -newpassword | string | no help info -oldpermanentfile | string | no help info -permanentfile | string | no help info - -## method: dumpwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/dumpwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: backupwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"backupwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/backupwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: importwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importwallet\",\"filename\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importwallet?filename={string} -``` - -field | value type | Description ---------- | ------- | ----------- -filename | string | no help info - -## method: getnewaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getnewaddress\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getnewaddress?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: importprivkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importprivkey\",\"wif\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importprivkey?wif={string}&account={string}&rescan={int} -``` - -field | value type | Description ---------- | ------- | ----------- -wif | string | no help info -account | string | no help info -rescan | int | no help info - -## method: importaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"importaddress\",\"address\":\"{string}\",\"account\":\"{string}\",\"rescan\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/importaddress?address={string}&account={string}&rescan={int} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -account | string | no help info -rescan | int | no help info - -## method: dumpprivkey - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"dumpprivkey\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/dumpprivkey?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: listtransactions - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listtransactions\",\"account\":\"{string}\",\"count\":\"{int}\",\"skip\":\"{int}\",\"includewatchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listtransactions?account={string}&count={int}&skip={int}&includewatchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -count | int | no help info -skip | int | no help info -includewatchonly | int | no help info - -## method: listreceivedbyaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaddress\",\"minconf\":\"{int}\",\"includeempty\":\"{int}\",\"flag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaddress?minconf={int}&includeempty={int}&flag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -includeempty | int | no help info -flag | int | no help info - -## method: listreceivedbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listreceivedbyaccount\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"watchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listreceivedbyaccount?confirmations={int}&includeempty={int}&watchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -confirmations | int | no help info -includeempty | int | no help info -watchonly | int | no help info - -## method: listaccounts - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaccounts\",\"minconf\":\"{int}\",\"includewatchonly\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listaccounts?minconf={int}&includewatchonly={int} -``` - -field | value type | Description ---------- | ------- | ----------- -minconf | int | no help info -includewatchonly | int | no help info - -## method: listaddressgroupings - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listaddressgroupings\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listaddressgroupings -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getreceivedbyaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaddress\",\"address\":\"{string}\",\"minconf\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaddress?address={string}&minconf={int} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -minconf | int | no help info - -## method: getreceivedbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getreceivedbyaccount\",\"account\":\"{string}\",\"includeempty\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getreceivedbyaccount?account={string}&includeempty={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -includeempty | int | no help info - -## method: getbalance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getbalance\",\"account\":\"{string}\",\"confirmations\":\"{int}\",\"includeempty\":\"{int}\",\"lastheight\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getbalance?account={string}&confirmations={int}&includeempty={int}&lastheight={int} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info -confirmations | int | no help info -includeempty | int | no help info -lastheight | int | no help info - -## method: getaddressesbyaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaddressesbyaccount\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaddressesbyaccount?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: getaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccount\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaccount?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: getaccountaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getaccountaddress\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getaccountaddress?account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -account | string | no help info - -## method: setaccount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"setaccount\",\"address\":\"{string}\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/setaccount?address={string}&account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -account | string | no help info - -## method: createmultisig - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"createmultisig\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"ignore\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/createmultisig?M={int}&pubkeys={array}&ignore={string} -``` - -field | value type | Description ---------- | ------- | ----------- -M | int | no help info -pubkeys | array | no help info -ignore | string | no help info - -## method: addmultisigaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"addmultisigaddress\",\"M\":\"{int}\",\"pubkeys\":\"{array}\",\"account\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/addmultisigaddress?M={int}&pubkeys={array}&account={string} -``` - -field | value type | Description ---------- | ------- | ----------- -M | int | no help info -pubkeys | array | no help info -account | string | no help info - -## method: settxfee - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"settxfee\",\"amount\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/settxfee?amount={float} -``` - -field | value type | Description ---------- | ------- | ----------- -amount | float | no help info - -## method: checkwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"checkwallet\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/checkwallet -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: repairwallet - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"repairwallet\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/repairwallet -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: signrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signrawtransaction\",\"rawtx\":\"{string}\",\"vins\":\"{array}\",\"privkeys\":\"{object}\",\"sighash\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/signrawtransaction?rawtx={string}&vins={array}&privkeys={object}&sighash={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -vins | array | no help info -privkeys | object | no help info -sighash | string | no help info - -## method: signmessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"signmessage\",\"address\":\"{string}\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/signmessage?address={string}&message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -message | string | no help info - -## method: verifymessage - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"verifymessage\",\"address\":\"{string}\",\"sig\":\"{string}\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/verifymessage?address={string}&sig={string}&message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -sig | string | no help info -message | string | no help info - -## method: sendrawtransaction - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendrawtransaction\",\"rawtx\":\"{string}\",\"allowhighfees\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendrawtransaction?rawtx={string}&allowhighfees={int} -``` - -field | value type | Description ---------- | ------- | ----------- -rawtx | string | no help info -allowhighfees | int | no help info - -## method: sendfrom - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendfrom\",\"fromaccount\":\"{string}\",\"toaddress\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendfrom?fromaccount={string}&toaddress={string}&amount={float}&minconf={int}&comment={string}&comment2={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -toaddress | string | no help info -amount | float | no help info -minconf | int | no help info -comment | string | no help info -comment2 | string | no help info - -## method: sendmany - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendmany\",\"fromaccount\":\"{string}\",\"payments\":\"{array}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendmany?fromaccount={string}&payments={array}&minconf={int}&comment={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -payments | array | no help info -minconf | int | no help info -comment | string | no help info - -## method: sendtoaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"sendtoaddress\",\"address\":\"{string}\",\"amount\":\"{float}\",\"comment\":\"{string}\",\"comment2\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/sendtoaddress?address={string}&amount={float}&comment={string}&comment2={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info -amount | float | no help info -comment | string | no help info -comment2 | string | no help info - -## method: lockunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"lockunspent\",\"flag\":\"{int}\",\"array\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/lockunspent?flag={int}&array={array} -``` - -field | value type | Description ---------- | ------- | ----------- -flag | int | no help info -array | array | no help info - -## method: listlockunspent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listlockunspent\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listlockunspent -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: submitblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"submitblock\",\"rawbytes\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/submitblock?rawbytes={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rawbytes | string | no help info - -## method: listsinceblock - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"listsinceblock\",\"blockhash\":\"{hash}\",\"target\":\"{int}\",\"flag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/listsinceblock?blockhash={hash}&target={int}&flag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -blockhash | hash | no help info -target | int | no help info -flag | int | no help info - -## method: gettxoutsetinfo - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"gettxoutsetinfo\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/gettxoutsetinfo -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: getrawchangeaddress - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"getrawchangeaddress\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/getrawchangeaddress -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: move - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"move\",\"fromaccount\":\"{string}\",\"toaccount\":\"{string}\",\"amount\":\"{float}\",\"minconf\":\"{int}\",\"comment\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/bitcoinrpc/move?fromaccount={string}&toaccount={string}&amount={float}&minconf={int}&comment={string} -``` - -field | value type | Description ---------- | ------- | ----------- -fromaccount | string | no help info -toaccount | string | no help info -amount | float | no help info -minconf | int | no help info -comment | string | no help info - -iguana API -=== -need to create help/iguana.md file - -## method: splitfunds - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"splitfunds\",\"satoshis\":\"{int}\",\"duplicates\":\"{int}\",\"sendflag\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/splitfunds?satoshis={int}&duplicates={int}&sendflag={int} -``` - -field | value type | Description ---------- | ------- | ----------- -satoshis | int | no help info -duplicates | int | no help info -sendflag | int | no help info - -## method: makekeypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"makekeypair\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/makekeypair -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: rates - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rates\",\"unused\":\"{int}\",\"quotes\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/rates?unused={int}"es={array} -``` - -field | value type | Description ---------- | ------- | ----------- -unused | int | no help info -quotes | array | no help info - -## method: rate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/rate?base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -base | string | no help info -rel | string | no help info - -## method: prices - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"prices\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"period\":\"{int}\",\"start\":\"{int}\",\"end\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/prices?exchange={string}&base={string}&rel={string}&period={int}&start={int}&end={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -period | int | no help info -start | int | no help info -end | int | no help info - -## method: snapshot - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"snapshot\",\"symbol\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/snapshot?symbol={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -height | int | no help info - -## method: dividends - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dividends\",\"height\":\"{int}\",\"vals\":\"{array}\",\"symbol\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/dividends?height={int}&vals={array}&symbol={string} -``` - -field | value type | Description ---------- | ------- | ----------- -height | int | no help info -vals | array | no help info -symbol | string | no help info - -## method: passthru - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"passthru\",\"asset\":\"{string}\",\"function\":\"{string}\",\"hex\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/passthru?asset={string}&function={string}&hex={string} -``` - -field | value type | Description ---------- | ------- | ----------- -asset | string | no help info -function | string | no help info -hex | string | no help info - -## method: initfastfind - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"initfastfind\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/initfastfind?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: dpow - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"{string}\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/dpow?symbol={string}&pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -symbol | string | no help info -pubkey | string | no help info - -## method: peers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"peers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/peers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: maxpeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"activecoin\":\"{string}\",\"max\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/maxpeers?activecoin={string}&max={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -max | int | no help info - -## method: getconnectioncount - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"getconnectioncount\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/getconnectioncount?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: addcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addcoin?newcoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -newcoin | string | no help info - -## method: validate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"validate\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/validate?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: removecoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removecoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/removecoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: startcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"startcoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/startcoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: pausecoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/pausecoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: stopcoin - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stopcoin\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/stopcoin?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: addnode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addnode?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: addnotary - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/addnotary?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: persistent - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"persistent\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/persistent?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: removenode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"removenode\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/removenode?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: oneshot - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"oneshot\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/oneshot?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: nodestatus - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"activecoin\":\"{string}\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/nodestatus?activecoin={string}&ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -ipaddr | string | no help info - -## method: balance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"balance\",\"activecoin\":\"{string}\",\"address\":\"{string}\",\"heightd\":\"{float}\",\"minconfd\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/balance?activecoin={string}&address={string}&heightd={float}&minconfd={float} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -address | string | no help info -heightd | float | no help info -minconfd | float | no help info - -## method: spendmsig - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"spendmsig\",\"activecoin\":\"{string}\",\"vintxid\":\"{hash}\",\"vinvout\":\"{int}\",\"destaddress\":\"{string}\",\"destamount\":\"{float}\",\"destaddress2\":\"{string}\",\"destamount2\":\"{float}\",\"M\":\"{int}\",\"N\":\"{int}\",\"pubA\":\"{string}\",\"wifA\":\"{string}\",\"pubB\":\"{string}\",\"wifB\":\"{string}\",\"pubC\":\"{string}\",\"wifC\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/spendmsig?activecoin={string}&vintxid={hash}&vinvout={int}&destaddress={string}&destamount={float}&destaddress2={string}&destamount2={float}&M={int}&N={int}&pubA={string}&wifA={string}&pubB={string}&wifB={string}&pubC={string}&wifC={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -vintxid | hash | no help info -vinvout | int | no help info -destaddress | string | no help info -destamount | float | no help info -destaddress2 | string | no help info -destamount2 | float | no help info -M | int | no help info -N | int | no help info -pubA | string | no help info -wifA | string | no help info -pubB | string | no help info -wifB | string | no help info -pubC | string | no help info -wifC | string | no help info - -## method: bundleaddresses - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundleaddresses\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/bundleaddresses?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: bundlehashes - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"bundlehashes\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/bundlehashes?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: PoSweights - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"PoSweights\",\"activecoin\":\"{string}\",\"height\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/PoSweights?activecoin={string}&height={int} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info -height | int | no help info - -## method: stakers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"stakers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/iguana/stakers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -jumblr API -=== -need to create help/jumblr.md file - -## method: setpassphrase - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/jumblr/setpassphrase?passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info - -InstantDEX API -=== -need to create help/InstantDEX.md file - -## method: allcoins - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allcoins\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allcoins -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: available - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"available\",\"source\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/available?source={string} -``` - -field | value type | Description ---------- | ------- | ----------- -source | string | no help info - -## method: request - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"hexstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/request?hash={hash}&vals={array}&hexstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -hexstr | str | no help info - -## method: incoming - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"incoming\",\"requestid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/incoming?requestid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info - -## method: automatched - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"automatched\",\"requestid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/automatched?requestid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info - -## method: accept - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"accept\",\"requestid\":\"{int}\",\"quoteid\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/accept?requestid={int}"eid={int} -``` - -field | value type | Description ---------- | ------- | ----------- -requestid | int | no help info -quoteid | int | no help info - -## method: buy - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"buy\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/buy?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -dotrade | float | no help info - -## method: sell - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"sell\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"dotrade\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/sell?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&dotrade={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -dotrade | float | no help info - -## method: withdraw - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"destaddr\":\"{string}\",\"amount\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/withdraw?exchange={string}&base={string}&destaddr={string}&amount={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -destaddr | string | no help info -amount | float | no help info - -## method: apikeypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"{string}\",\"apikey\":\"{string}\",\"apisecret\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/apikeypair?exchange={string}&apikey={string}&apisecret={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -apikey | string | no help info -apisecret | string | no help info - -## method: setuserid - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"{string}\",\"userid\":\"{string}\",\"tradepassword\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/setuserid?exchange={string}&userid={string}&tradepassword={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -userid | string | no help info -tradepassword | string | no help info - -## method: balance - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"{string}\",\"base\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/balance?exchange={string}&base={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info - -## method: orderstatus - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/orderstatus?exchange={string}&orderid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -orderid | string | no help info - -## method: cancelorder - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"{string}\",\"orderid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/cancelorder?exchange={string}&orderid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -orderid | string | no help info - -## method: openorders - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/openorders?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: tradehistory - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/tradehistory?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: orderbook - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"depth\":\"{int}\",\"allfields\":\"{int}\",\"ignore\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/orderbook?exchange={string}&base={string}&rel={string}&depth={int}&allfields={int}&ignore={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -depth | int | no help info -allfields | int | no help info -ignore | int | no help info - -## method: pollgap - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"pollgap\",\"exchange\":\"{string}\",\"pollgap\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/pollgap?exchange={string}&pollgap={int} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -pollgap | int | no help info - -## method: allexchanges - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allexchanges -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: allpairs - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"allpairs\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/allpairs?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: supports - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"supports\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/InstantDEX/supports?exchange={string}&base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info - -tradebot API -=== -need to create help/tradebot.md file - -## method: liquidity - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"hash\":\"{hash}\",\"vals\":\"{array}\",\"targetcoin\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/liquidity?hash={hash}&vals={array}&targetcoin={str} -``` - -field | value type | Description ---------- | ------- | ----------- -hash | hash | no help info -vals | array | no help info -targetcoin | str | no help info - -## method: amlp - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/amlp?blocktrail={string} -``` - -field | value type | Description ---------- | ------- | ----------- -blocktrail | string | no help info - -## method: notlp - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/notlp -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: gensvm - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/gensvm?base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -base | string | no help info -rel | string | no help info - -## method: openliquidity - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"openliquidity\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/openliquidity -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: aveprice - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"aveprice\",\"comment\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"basevolume\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/aveprice?comment={string}&base={string}&rel={string}&basevolume={float} -``` - -field | value type | Description ---------- | ------- | ----------- -comment | string | no help info -base | string | no help info -rel | string | no help info -basevolume | float | no help info - -## method: monitor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"commission\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/monitor?exchange={string}&base={string}&rel={string}&commission={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -commission | float | no help info - -## method: monitorall - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"monitorall\",\"exchange\":\"{string}\",\"commission\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/monitorall?exchange={string}&commission={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -commission | float | no help info - -## method: unmonitor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"unmonitor\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/unmonitor?exchange={string}&base={string}&rel={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info - -## method: accumulate - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"accumulate\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/accumulate?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -duration | float | no help info - -## method: divest - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"divest\",\"exchange\":\"{string}\",\"base\":\"{string}\",\"rel\":\"{string}\",\"price\":\"{float}\",\"volume\":\"{float}\",\"duration\":\"{float}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/divest?exchange={string}&base={string}&rel={string}&price={float}&volume={float}&duration={float} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -base | string | no help info -rel | string | no help info -price | float | no help info -volume | float | no help info -duration | float | no help info - -## method: activebots - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"activebots\",\"exchange\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/activebots?exchange={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info - -## method: status - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"status\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/status?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: pause - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"pause\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/pause?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: stop - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"stop\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/stop?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: resume - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"resume\",\"exchange\":\"{string}\",\"botid\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/resume?exchange={string}&botid={string} -``` - -field | value type | Description ---------- | ------- | ----------- -exchange | string | no help info -botid | string | no help info - -## method: allbalances - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"allbalances\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/allbalances -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: anchor - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"anchor\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/anchor -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: portfolio - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"portfolio\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/portfolio -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: goals - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"goals\",\"currencies\":\"{array}\",\"vals\":\"{object}\",\"targettime\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/tradebot/goals?currencies={array}&vals={object}&targettime={int} -``` - -field | value type | Description ---------- | ------- | ----------- -currencies | array | no help info -vals | object | no help info -targettime | int | no help info - -SuperNET API -=== -need to create help/SuperNET.md file - -## method: help - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"help\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/help -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: utime2utc - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utime2utc\",\"utime\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/utime2utc?utime={string} -``` - -field | value type | Description ---------- | ------- | ----------- -utime | string | no help info - -## method: utc2utime - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"utc2utime\",\"utc\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/utc2utime?utc={int} -``` - -field | value type | Description ---------- | ------- | ----------- -utc | int | no help info - -## method: getpeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"getpeers\",\"activecoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/getpeers?activecoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -activecoin | string | no help info - -## method: mypeers - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"mypeers\",\"supernet\":\"{array}\",\"rawpeers\":\"{array}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/mypeers?supernet={array}&rawpeers={array} -``` - -field | value type | Description ---------- | ------- | ----------- -supernet | array | no help info -rawpeers | array | no help info - -## method: stop - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"stop\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/stop -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: saveconf - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"saveconf\",\"wallethash\":\"{hash}\",\"confjsonstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/saveconf?wallethash={hash}&confjsonstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -wallethash | hash | no help info -confjsonstr | str | no help info - -## method: layer - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"layer\",\"mypriv\":\"{hash}\",\"otherpubs\":\"{array}\",\"str\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/layer?mypriv={hash}&otherpubs={array}&str={str} -``` - -field | value type | Description ---------- | ------- | ----------- -mypriv | hash | no help info -otherpubs | array | no help info -str | str | no help info - -## method: bitcoinrpc - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"bitcoinrpc\",\"setcoin\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/bitcoinrpc?setcoin={string} -``` - -field | value type | Description ---------- | ------- | ----------- -setcoin | string | no help info - -## method: myipaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/myipaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: setmyipaddr - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"setmyipaddr\",\"ipaddr\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/setmyipaddr?ipaddr={string} -``` - -field | value type | Description ---------- | ------- | ----------- -ipaddr | string | no help info - -## method: login - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"login\",\"handle\":\"{string}\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/login?handle={string}&password={string}&permanentfile={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -handle | string | no help info -password | string | no help info -permanentfile | string | no help info -passphrase | string | no help info - -## method: logout - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"logout\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/logout -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: activehandle - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"activehandle\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/activehandle -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: encryptjson - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"encryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\",\"payload\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/encryptjson?password={string}&permanentfile={string}&payload={string} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info -payload | string | no help info - -## method: decryptjson - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decryptjson\",\"password\":\"{string}\",\"permanentfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/decryptjson?password={string}&permanentfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -password | string | no help info -permanentfile | string | no help info - -## method: html - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"html\",\"agentform\":\"{string}\",\"htmlfile\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/html?agentform={string}&htmlfile={string} -``` - -field | value type | Description ---------- | ------- | ----------- -agentform | string | no help info -htmlfile | string | no help info - -## method: rosetta - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rosetta\",\"passphrase\":\"{string}\",\"pin\":\"{string}\",\"showprivkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/rosetta?passphrase={string}&pin={string}&showprivkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info -pin | string | no help info -showprivkey | string | no help info - -## method: keypair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"keypair\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/keypair -``` - -field | value type | Description ---------- | ------- | ----------- - -## method: priv2pub - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2pub\",\"privkey\":\"{hash}\",\"addrtype\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/priv2pub?privkey={hash}&addrtype={int} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -addrtype | int | no help info - -## method: wif2priv - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"wif2priv\",\"wif\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/wif2priv?wif={string} -``` - -field | value type | Description ---------- | ------- | ----------- -wif | string | no help info - -## method: priv2wif - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"priv2wif\",\"priv\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/priv2wif?priv={string} -``` - -field | value type | Description ---------- | ------- | ----------- -priv | string | no help info - -## method: addr2rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"addr2rmd160\",\"address\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/addr2rmd160?address={string} -``` - -field | value type | Description ---------- | ------- | ----------- -address | string | no help info - -## method: rmd160conv - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"rmd160conv\",\"rmd160\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/rmd160conv?rmd160={string} -``` - -field | value type | Description ---------- | ------- | ----------- -rmd160 | string | no help info - -## method: cipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"cipher\",\"privkey\":\"{hash}\",\"destpubkey\":\"{hash}\",\"message\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/cipher?privkey={hash}&destpubkey={hash}&message={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -destpubkey | hash | no help info -message | str | no help info - -## method: decipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"decipher\",\"privkey\":\"{hash}\",\"srcpubkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/decipher?privkey={hash}&srcpubkey={hash}&cipherstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -srcpubkey | hash | no help info -cipherstr | str | no help info - -## method: broadcastcipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastcipher\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/broadcastcipher?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: broadcastdecipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"broadcastdecipher\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/broadcastdecipher?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: multicastcipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastcipher\",\"pubkey\":\"{hash}\",\"message\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/multicastcipher?pubkey={hash}&message={str} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | hash | no help info -message | str | no help info - -## method: multicastdecipher - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"SuperNET\",\"method\":\"multicastdecipher\",\"privkey\":\"{hash}\",\"cipherstr\":\"{str}\"}" -``` - -```url -http://127.0.0.1:7778/api/SuperNET/multicastdecipher?privkey={hash}&cipherstr={str} -``` - -field | value type | Description ---------- | ------- | ----------- -privkey | hash | no help info -cipherstr | str | no help info - -mouse API -=== -need to create help/mouse.md file - -## method: image - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"image\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/image?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: change - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"change\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/change?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: click - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"click\",\"name\":\"{string}\",\"x\":\"{int}\",\"y\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/click?name={string}&x={int}&y={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -x | int | no help info -y | int | no help info - -## method: close - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"close\",\"name\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/close?name={string} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info - -## method: leave - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"mouse\",\"method\":\"leave\",\"name\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/mouse/leave?name={string} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info - -keyboard API -=== -need to create help/keyboard.md file - -## method: key - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"keyboard\",\"method\":\"key\",\"name\":\"{string}\",\"c\":\"{int}\"}" -``` - -```url -http://127.0.0.1:7778/api/keyboard/key?name={string}&c={int} -``` - -field | value type | Description ---------- | ------- | ----------- -name | string | no help info -c | int | no help info - -hash API -=== -need to create help/hash.md file - -## method: hex - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"hex\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/hex?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: unhex - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"unhex\",\"hexmsg\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/unhex?hexmsg={string} -``` - -field | value type | Description ---------- | ------- | ----------- -hexmsg | string | no help info - -## method: curve25519_pair - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519_pair\",\"element\":\"{hash}\",\"scalar\":\"{hash}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/curve25519_pair?element={hash}&scalar={hash} -``` - -field | value type | Description ---------- | ------- | ----------- -element | hash | no help info -scalar | hash | no help info - -## method: NXT - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"NXT\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/NXT?passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -passphrase | string | no help info - -## method: curve25519 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"curve25519\",\"pubkey\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/curve25519?pubkey={string} -``` - -field | value type | Description ---------- | ------- | ----------- -pubkey | string | no help info - -## method: crc32 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"crc32\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/crc32?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: base64_encode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_encode\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/base64_encode?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: base64_decode - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"base64_decode\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/base64_decode?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd160_sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd160_sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha256_sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha256_sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha224 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha224\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha224?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha384 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha384\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha384?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha512 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha512\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha512?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd128 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd128\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd128?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd160\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd160?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd256\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd256?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: rmd320 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"rmd320\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/rmd320?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: sha1 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"sha1\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/sha1?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md2\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md2?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md4 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md4\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md4?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: md5 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"md5\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/md5?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: tiger192_3 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"tiger192_3\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/tiger192_3?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -## method: whirlpool - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hash\",\"method\":\"whirlpool\",\"message\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hash/whirlpool?message={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info - -hmac API -=== -need to create help/hmac.md file - -## method: sha224 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha224\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha224?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha256?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha384 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha384\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha384?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha512 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha512\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha512?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd128 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd128\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd128?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd160 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd160\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd160?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd256 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd256\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd256?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: rmd320 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"rmd320\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/rmd320?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: sha1 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"sha1\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/sha1?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md2 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md2\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md2?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md4 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md4\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md4?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: md5 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"md5\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/md5?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: tiger192_3 - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"tiger192_3\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/tiger192_3?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -## method: whirlpool - -put helpful info here - - -```shell -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"hmac\",\"method\":\"whirlpool\",\"message\":\"{string}\",\"passphrase\":\"{string}\"}" -``` - -```url -http://127.0.0.1:7778/api/hmac/whirlpool?message={string}&passphrase={string} -``` - -field | value type | Description ---------- | ------- | ----------- -message | string | no help info -passphrase | string | no help info - -end of help - From 72d55612246f6057b68d6cd3f33591f5ba4b691f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 17:57:57 +0200 Subject: [PATCH 024/286] Test --- iguana/tests/walletpassphrase | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/tests/walletpassphrase b/iguana/tests/walletpassphrase index 1416189c8..dc5eae04e 100755 --- a/iguana/tests/walletpassphrase +++ b/iguana/tests/walletpassphrase @@ -1,3 +1,4 @@ #!/bin/bash #curl --url "http://127.0.0.1:7778" --data "{\"method\":\"walletpassphrase\",\"params\":[\"test\", 600]}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"test\",\"timeout\":86444}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"test\"}" From 55ebdcb8242fde2cc2963941b6f45ae5e5f5f17f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:02:45 +0200 Subject: [PATCH 025/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 041bfe1c6..956c27979 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -329,7 +329,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); - return(clonestr("{\"result\":\"success\"}")); + return(jprint(retjson,1)); } } From 2cd1700bbacfa334eb8a4724d972d16fa3706ff1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:10:58 +0200 Subject: [PATCH 026/286] Test --- basilisk/jumblr.c | 1 + iguana/main.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 956c27979..680faed18 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -238,6 +238,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 OS_randombytes(&r,sizeof(r)); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z diff --git a/iguana/main.c b/iguana/main.c index 7c6b7b98d..7b6dd88c0 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -751,9 +751,9 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 6 ) { - jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } sleep(20); } From 249f2846a4ccd893534b3e295814d3291fe9512c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:19:27 +0200 Subject: [PATCH 027/286] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 680faed18..5e5c658b6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -236,6 +236,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 // if BTC has arrived in destination address, invoke DEX -> BTC fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From 5886b37f51b1c8d9e80655a9f8fa5754ce2a5962 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:25:47 +0200 Subject: [PATCH 028/286] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5e5c658b6..ef95a8e64 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -237,6 +237,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From 0634b3edf79ab99981c0473ae5a07a63bb8207d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:28:36 +0200 Subject: [PATCH 029/286] Test --- iguana/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/main.c b/iguana/main.c index 7b6dd88c0..218eac812 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -748,6 +748,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + printf("JUMBLR loop\n"); while ( 1 ) { t = (uint32_t)time(NULL); @@ -755,6 +756,7 @@ void jumblr_loop(void *ptr) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } + printf("t.%u %p\n",t,coin); sleep(20); } } From 574aebdbee0c2b77c06f2fd7e093eeb0aa7f542a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:35:08 +0200 Subject: [PATCH 030/286] Test --- iguana/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 218eac812..daf9c52a2 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -752,11 +752,11 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 6 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 60 ) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } - printf("t.%u %p\n",t,coin); + printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); } } From 6522e750b86abe7d84fb990200937a2f6833ccca Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:37:47 +0200 Subject: [PATCH 031/286] Test --- basilisk/jumblr.c | 2 +- iguana/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ef95a8e64..1c34b3461 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -237,7 +237,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR.%s %d selector.%d modval.%d r.%d\n",coin->symbol,coin->FULLNODE,selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); diff --git a/iguana/main.c b/iguana/main.c index daf9c52a2..c7e19ec8f 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -756,7 +756,7 @@ void jumblr_loop(void *ptr) { jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); } - printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); + //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); } } From a01d0ec247ad584e5513366c60e91347a94c5bb6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 18:49:54 +0200 Subject: [PATCH 032/286] batch12 --- iguana/main.c | 4 +- iguana/tests/KMD.batch12 | 141 ++++++++++++++++++++++++ iguana/tests/KMD.batch12.importaddress | 139 +++++++++++++++++++++++ iguana/tests/KMD.batch12.listunspent | 112 +++++++++++++++++++ iguana/tests/REVS.batch12 | 14 +++ iguana/tests/REVS.batch12.importaddress | 12 ++ iguana/tests/dexgetbalance | 3 +- iguana/tests/request | 2 +- 8 files changed, 423 insertions(+), 4 deletions(-) create mode 100755 iguana/tests/KMD.batch12 create mode 100755 iguana/tests/KMD.batch12.importaddress create mode 100755 iguana/tests/KMD.batch12.listunspent create mode 100755 iguana/tests/REVS.batch12 create mode 100755 iguana/tests/REVS.batch12.importaddress diff --git a/iguana/main.c b/iguana/main.c index c7e19ec8f..dbc632b66 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1643,7 +1643,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) printf("# %s KMD %.8f\n",coinaddr,dstr(kmdamount)); if ( (iter & 1) == 0 ) { - if ( (0) ) + if ( (1) ) { printf("curl --url \"http://127.0.0.1:7778\" --data \"{\\\"agent\\\":\\\"dex\\\",\\\"method\\\":\\\"importaddress\\\",\\\"address\\\":\\\"%s\\\",\\\"symbol\\\":\\\"KMD\\\"}\" # %.8f\n",coinaddr,dstr(kmdamount)); printf("sleep 3\n"); @@ -1707,7 +1707,7 @@ void iguana_main(void *arg) else printf("ENDIAN ERROR\n"); mycalloc(0,0,0); #ifdef __APPLE__ - char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 12; + char *batchstr,*batchstr2; cJSON *batchjson; long batchsize; char fname[512],fname2[512]; int32_t batchid = 13; sprintf(fname,"REVS.raw"), sprintf(fname2,"REVS.rawtxids"); if ( (0) && (batchstr= OS_filestr(&batchsize,fname)) != 0 && (batchstr2= OS_filestr(&batchsize,fname2)) != 0 ) { diff --git a/iguana/tests/KMD.batch12 b/iguana/tests/KMD.batch12 new file mode 100755 index 000000000..f4b24ca4a --- /dev/null +++ b/iguana/tests/KMD.batch12 @@ -0,0 +1,141 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +./komodo-cli sendtoaddress RDTjem9CP97XPXvet1sQBb428xrmSZJSsd 1568.45531762 +sleep 3 +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +./komodo-cli sendtoaddress RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz 73430.96919475 +sleep 3 +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +./komodo-cli sendtoaddress RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE 5689.04575312 +sleep 3 +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +./komodo-cli sendtoaddress RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT 17817.00058850 +sleep 3 +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +./komodo-cli sendtoaddress RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB 202518.10752377 +sleep 3 +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +./komodo-cli sendtoaddress RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf 6963.60677351 +sleep 3 +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +./komodo-cli sendtoaddress RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv 32042.52085087 +sleep 3 +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +./komodo-cli sendtoaddress RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A 2135.12309659 +sleep 3 +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +./komodo-cli sendtoaddress RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic 5533.00461690 +sleep 3 +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +./komodo-cli sendtoaddress RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i 50.26846585 +sleep 3 +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +./komodo-cli sendtoaddress RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 1733.05190072 +sleep 3 +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +./komodo-cli sendtoaddress RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y 11852.83167290 +sleep 3 +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +./komodo-cli sendtoaddress RH9CANWQNvqSktmX39ruDfiNFimcToD2ur 43125.33019700 +sleep 3 +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +./komodo-cli sendtoaddress RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b 36837.09249870 +sleep 3 +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +./komodo-cli sendtoaddress RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 3016.26045526 +sleep 3 +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +./komodo-cli sendtoaddress RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb 91240.39653929 +sleep 3 +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +./komodo-cli sendtoaddress RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury 2440.00507548 +sleep 3 +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +./komodo-cli sendtoaddress RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX 3823.81289934 +sleep 3 +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +./komodo-cli sendtoaddress RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz 2772.48246697 +sleep 3 +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +./komodo-cli sendtoaddress RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +./komodo-cli sendtoaddress RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut 10316.17621736 +sleep 3 +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +./komodo-cli sendtoaddress RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW 29566.93551966 +sleep 3 +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +./komodo-cli sendtoaddress RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX 19365.33667225 +sleep 3 +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +./komodo-cli sendtoaddress R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X 55229.13842423 +sleep 3 +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +./komodo-cli sendtoaddress RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +./komodo-cli sendtoaddress RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 10066.89321267 +sleep 3 +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +./komodo-cli sendtoaddress RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ 2834.17657315 +sleep 3 +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + + +# total KMD 701710.56131060 REVS 0.00000000 diff --git a/iguana/tests/KMD.batch12.importaddress b/iguana/tests/KMD.batch12.importaddress new file mode 100755 index 000000000..c140a3396 --- /dev/null +++ b/iguana/tests/KMD.batch12.importaddress @@ -0,0 +1,139 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"KMD\"}" # 1568.45531762 +sleep 3 +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz\",\"symbol\":\"KMD\"}" # 73430.96919475 +sleep 3 +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE\",\"symbol\":\"KMD\"}" # 5689.04575312 +sleep 3 +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT\",\"symbol\":\"KMD\"}" # 17817.00058850 +sleep 3 +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" # 202518.10752377 +sleep 3 +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf\",\"symbol\":\"KMD\"}" # 6963.60677351 +sleep 3 +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv\",\"symbol\":\"KMD\"}" # 32042.52085087 +sleep 3 +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" # 2135.12309659 +sleep 3 +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic\",\"symbol\":\"KMD\"}" # 5533.00461690 +sleep 3 +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i\",\"symbol\":\"KMD\"}" # 50.26846585 +sleep 3 +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7\",\"symbol\":\"KMD\"}" # 1733.05190072 +sleep 3 +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"KMD\"}" # 11852.83167290 +sleep 3 +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RH9CANWQNvqSktmX39ruDfiNFimcToD2ur\",\"symbol\":\"KMD\"}" # 43125.33019700 +sleep 3 +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b\",\"symbol\":\"KMD\"}" # 36837.09249870 +sleep 3 +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"KMD\"}" # 3016.26045526 +sleep 3 +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb\",\"symbol\":\"KMD\"}" # 91240.39653929 +sleep 3 +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury\",\"symbol\":\"KMD\"}" # 2440.00507548 +sleep 3 +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"KMD\"}" # 3823.81289934 +sleep 3 +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" # 2772.48246697 +sleep 3 +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" # 693.08132289 +sleep 3 +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" # 10316.17621736 +sleep 3 +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" # 29566.93551966 +sleep 3 +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX\",\"symbol\":\"KMD\"}" # 19365.33667225 +sleep 3 +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X\",\"symbol\":\"KMD\"}" # 55229.13842423 +sleep 3 +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB\",\"symbol\":\"KMD\"}" # 29049.45748125 +sleep 3 +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" # 10066.89321267 +sleep 3 +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" # 2834.17657315 +sleep 3 +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + diff --git a/iguana/tests/KMD.batch12.listunspent b/iguana/tests/KMD.batch12.listunspent new file mode 100755 index 000000000..b54d4d79c --- /dev/null +++ b/iguana/tests/KMD.batch12.listunspent @@ -0,0 +1,112 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"KMD\"}" +echo "1568.45531762 <- expected amount RDTjem9CP97XPXvet1sQBb428xrmSZJSsd" + +# RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz KMD 73430.96919475 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz\",\"symbol\":\"KMD\"}" +echo "73430.96919475 <- expected amount RAvtq1kazCRZUvWvPsN7ioY2Vt1EYtgpuz" + +# RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE KMD 5689.04575312 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE\",\"symbol\":\"KMD\"}" +echo "5689.04575312 <- expected amount RWxT4Jfwp1Bv6RYdUMdrQ6oXt6dMsQZ8jE" + +# RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT KMD 17817.00058850 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT\",\"symbol\":\"KMD\"}" +echo "17817.00058850 <- expected amount RXQxetCQScefabaJaFyqCJ1FvfNwsKtvMT" + +# RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB KMD 202518.10752377 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB\",\"symbol\":\"KMD\"}" +echo "202518.10752377 <- expected amount RPqAFgwnB1hjae6Ar4Kms973uS93HbDkoB" + +# RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf KMD 6963.60677351 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf\",\"symbol\":\"KMD\"}" +echo "6963.60677351 <- expected amount RH4SXj2zZqfG4TfejyHcVpaoPoDv1Uonnf" + +# RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv KMD 32042.52085087 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv\",\"symbol\":\"KMD\"}" +echo "32042.52085087 <- expected amount RXyXDkiMmU8jdnCuyCrZHqWthU4kp9PUhv" + +# RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A KMD 2135.12309659 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A\",\"symbol\":\"KMD\"}" +echo "2135.12309659 <- expected amount RWTfFTP7c9WxLhgxd2EXSsKszpDVPXHN8A" + +# RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic KMD 5533.00461690 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic\",\"symbol\":\"KMD\"}" +echo "5533.00461690 <- expected amount RAGhCfNvxpL55JFV7h2HQa5dSEK86Jg3ic" + +# RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i KMD 50.26846585 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i\",\"symbol\":\"KMD\"}" +echo "50.26846585 <- expected amount RDoLVY35wbzTXZ9QgFRSAzHfAiYYG7e65i" + +# RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7 KMD 1733.05190072 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7\",\"symbol\":\"KMD\"}" +echo "1733.05190072 <- expected amount RMHZ76hvxs8n2yDnkUa122rs5gubMxhiw7" + +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"KMD\"}" +echo "11852.83167290 <- expected amount RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y" + +# RH9CANWQNvqSktmX39ruDfiNFimcToD2ur KMD 43125.33019700 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RH9CANWQNvqSktmX39ruDfiNFimcToD2ur\",\"symbol\":\"KMD\"}" +echo "43125.33019700 <- expected amount RH9CANWQNvqSktmX39ruDfiNFimcToD2ur" + +# RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b KMD 36837.09249870 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b\",\"symbol\":\"KMD\"}" +echo "36837.09249870 <- expected amount RSp4ceoTDQt7fbweFBpEbvbTTH8J9SEp4b" + +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"KMD\"}" +echo "3016.26045526 <- expected amount RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8" + +# RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb KMD 91240.39653929 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb\",\"symbol\":\"KMD\"}" +echo "91240.39653929 <- expected amount RLWvbjH97gqjGXsRyPijDmwuKNFqsaaerb" + +# RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury KMD 2440.00507548 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury\",\"symbol\":\"KMD\"}" +echo "2440.00507548 <- expected amount RGoB4uxdk2SDs5yCerizsQ3UFD7NqJjury" + +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"KMD\"}" +echo "3823.81289934 <- expected amount RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX" + +# RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz KMD 2772.48246697 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz\",\"symbol\":\"KMD\"}" +echo "2772.48246697 <- expected amount RLyaf3XgjHruSeJd4oj83E8btck7kYPmVz" + +# RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv KMD 693.08132289 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv\",\"symbol\":\"KMD\"}" +echo "693.08132289 <- expected amount RHJ55iWUQNbKcSn8shbv1RbGuip3RSRHFv" + +# RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut KMD 10316.17621736 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut\",\"symbol\":\"KMD\"}" +echo "10316.17621736 <- expected amount RQgfzPR4zeCyLWaddHysGEVzoKLZa5E4Ut" + +# RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW KMD 29566.93551966 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW\",\"symbol\":\"KMD\"}" +echo "29566.93551966 <- expected amount RAGGPNoZgxAj6ABBTwehQfVYEa1PEN4qZW" + +# RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX KMD 19365.33667225 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX\",\"symbol\":\"KMD\"}" +echo "19365.33667225 <- expected amount RNQzdseaqPikT6Df2ECFQXxW4yUr4fahqX" + +# R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X KMD 55229.13842423 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X\",\"symbol\":\"KMD\"}" +echo "55229.13842423 <- expected amount R9PwsNzuksjJzZUAAX4yfDwdSy5Y4KP25X" + +# RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB KMD 29049.45748125 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB\",\"symbol\":\"KMD\"}" +echo "29049.45748125 <- expected amount RC3DmLpKZyMD66JnKXVRHT9AVcok9xwGgB" + +# RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47 KMD 10066.89321267 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47\",\"symbol\":\"KMD\"}" +echo "10066.89321267 <- expected amount RHy56MTg74v8AY1Eo2RgbohbMbdHjUDN47" + +# RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ KMD 2834.17657315 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ\",\"symbol\":\"KMD\"}" +echo "2834.17657315 <- expected amount RDdUQ5t6SYYGZUdAxBk5i7QdTWvzAshxNZ" + diff --git a/iguana/tests/REVS.batch12 b/iguana/tests/REVS.batch12 new file mode 100755 index 000000000..78ad38586 --- /dev/null +++ b/iguana/tests/REVS.batch12 @@ -0,0 +1,14 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +sleep 1 +fiat/revs sendtoaddress RDTjem9CP97XPXvet1sQBb428xrmSZJSsd 31.12033224 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +sleep 1 +fiat/revs sendtoaddress RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y 139.09398517 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +sleep 1 +fiat/revs sendtoaddress RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 59.85500000 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +sleep 1 +fiat/revs sendtoaddress RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX 75.88015839 + +# total KMD 0.00000000 REVS 305.94947580 diff --git a/iguana/tests/REVS.batch12.importaddress b/iguana/tests/REVS.batch12.importaddress new file mode 100755 index 000000000..53ae5be86 --- /dev/null +++ b/iguana/tests/REVS.batch12.importaddress @@ -0,0 +1,12 @@ +# RDTjem9CP97XPXvet1sQBb428xrmSZJSsd KMD 1568.45531762, REVS 31.12033224 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RDTjem9CP97XPXvet1sQBb428xrmSZJSsd\",\"symbol\":\"REVS\"}" # 31.12033224 +sleep 3 +# RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y KMD 11852.83167290, REVS 139.09398517 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RHmVdfQM3PbJayYGbYnGtsqiWD9gDt2n4y\",\"symbol\":\"REVS\"}" # 139.09398517 +sleep 3 +# RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8 KMD 3016.26045526, REVS 59.85500000 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RUbMmLRMeSf2xnBHspdzS2JC3e8epKmoM8\",\"symbol\":\"REVS\"}" # 59.85500000 +sleep 3 +# RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX KMD 3823.81289934, REVS 75.88015839 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RXQBgNYtszvmdwniLu1nteS9MX1xD75bNX\",\"symbol\":\"REVS\"}" # 75.88015839 +sleep 3 diff --git a/iguana/tests/dexgetbalance b/iguana/tests/dexgetbalance index d0f90e62b..0e91dac58 100755 --- a/iguana/tests/dexgetbalance +++ b/iguana/tests/dexgetbalance @@ -1,2 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RU58D7nNLXwD29hgC2MPgtAF458gGxnPYS\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"USD\"}" diff --git a/iguana/tests/request b/iguana/tests/request index 58ccace04..ac3337301 100755 --- a/iguana/tests/request +++ b/iguana/tests/request @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"BTCD\",\"amount\":0.03,\"dest\":\"BTC\",\"minprice\":0.002}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" From 70401e923cab79fc2f3c228f97b188dcd1c2a26d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:12:50 +0200 Subject: [PATCH 033/286] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1c34b3461..6e82caa2c 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -262,9 +262,9 @@ r = 0; free(retstr); } free(zaddr); - } + } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } + } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); From 247e7c95c418f9af7370dc2b4129827529e0d47d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:42:52 +0200 Subject: [PATCH 034/286] Test --- basilisk/jumblr.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6e82caa2c..90636c492 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -132,8 +132,20 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; int64_t balance = 0; - if ( (retstr= jumblr_zgetbalance(myinfo,coin,addr)) != 0 ) + char *retstr; double val; cJSON *retjson; int64_t balance = 0; + if ( strlen(addr) < 40 ) + { + if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + balance = jdouble(retjson,"balance") * SATOSHIDEN; + free_json(retjson); + } + free(retstr); + } + } + else if ( (retstr= jumblr_zgetbalance(myinfo,coin,addr)) != 0 ) { if ( (val= atof(retstr)) > SMALLVAL ) balance = val * SATOSHIDEN; From a6e2e55e8136d8055fa326d923c7f2def0948e65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:49:19 +0200 Subject: [PATCH 035/286] Test --- basilisk/jumblr.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 90636c492..921f7360e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}]], 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -249,7 +249,6 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; - printf("JUMBLR.%s %d selector.%d modval.%d r.%d\n",coin->symbol,coin->FULLNODE,selector,modval,r&7); if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); From c1497141c3ba7514cf2db3c00919a2f508b84621 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 19:55:15 +0200 Subject: [PATCH 036/286] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 921f7360e..93a5cb11f 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From 846b13cac3d4e6816c8daf5474de08cd4dc72824 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:04:03 +0200 Subject: [PATCH 037/286] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 93a5cb11f..35b96646b 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]]\", 1, %.8f",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From d71be23c8019b873a063555ab5bf74ff604a4fa9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:07:07 +0200 Subject: [PATCH 038/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 35b96646b..e26fd3b14 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,7 +75,7 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From c7be132fd1b1c446a733d1f22f8069f3f988cf96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:12:51 +0200 Subject: [PATCH 039/286] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e26fd3b14..804660308 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\\\"%s\\\":%.8f}, {\\\"%s\\\":%.8f}]\", 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", \"[{\"%s\":%.8f}, {\"%s\":%.8f}]\", 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From e6745ea2c32328700abf8d70f4880399b422278e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:19:52 +0200 Subject: [PATCH 040/286] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 804660308..50c279d2e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -75,21 +75,21 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; - sprintf(params,"[\"%s\", [{\"%s\":%.8f}, {\"%s\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } From 8bb5475544de599c661f51bf20abfaa4ac99526a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:28:50 +0200 Subject: [PATCH 041/286] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index fbe9ba5b5..86f22cb3c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -538,7 +538,7 @@ char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin { } - else if ( (sobj= jobj(item,"scriptPubKey")) == 0 && (spendscriptstr= jstr(sobj,"hex")) == 0 ) + else if ( (sobj= jobj(item,"scriptPubKey")) == 0 || (spendscriptstr= jstr(sobj,"hex")) == 0 ) { printf("no spendscript (%s)\n",jprint(item,0)); continue; From 8e74fb503f1fb20cf57542e654d6673ea2f5c924 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 3 Mar 2017 20:59:08 +0200 Subject: [PATCH 042/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 50c279d2e..afc5a0a2d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -68,7 +68,7 @@ char *jumblr_zlistoperationids(struct supernet_info *myinfo,struct iguana_info * char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) { char params[1024]; - sprintf(params,"[\"%s\"]",opid); + sprintf(params,"[[\"%s\"]]",opid); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); } From d668d423cf501c529627e164fff93073a7c12b26 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:41:27 +0200 Subject: [PATCH 043/286] Active handle with jumble --- basilisk/jumblr.c | 7 +++++-- iguana/iguana777.h | 1 + iguana/main.c | 11 ++++++++++- includes/iguana_funcs.h | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index afc5a0a2d..f2a7c59df 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -32,7 +32,6 @@ #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_FEE 0.001 -#define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) { @@ -254,7 +253,7 @@ r = 0; printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { - case 0: // public -> z + case 0: // public -> z, need to importprivkey priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { @@ -356,8 +355,12 @@ ZERO_ARGS(jumblr,status) retjson = cJSON_CreateObject(); step_t2z = step_z2z = step_z2t = deposited = finished = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); deposited = jumblr_receivedby(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); finished = jumblr_receivedby(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a9b88c7b3..8e33594a5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,7 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +#define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item { UT_hash_handle hh; diff --git a/iguana/main.c b/iguana/main.c index dbc632b66..304b32ecb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1452,7 +1452,7 @@ ZERO_ARGS(SuperNET,logout) ZERO_ARGS(SuperNET,activehandle) { - cJSON *retjson; + cJSON *retjson; char BTCaddr[64],KMDaddr[64]; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); retjson = SuperNET_rosettajson(myinfo,myinfo->persistent_priv,0); @@ -1468,6 +1468,15 @@ ZERO_ARGS(SuperNET,activehandle) jaddstr(retjson,"status","unlocked"); jaddnum(retjson,"duration",myinfo->expiration - time(NULL)); } else jaddstr(retjson,"status","locked"); + if ( myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"BTCdeposit","notyet"); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"KMDjumblr",KMDaddr); + } SuperNET_MYINFOadd(myinfo); return(jprint(retjson,1)); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 43f997c75..e82603144 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -615,6 +615,7 @@ int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *ref bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); +bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 44b53704a03f7f413a66186dbddbc8005d6dd4ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:46:14 +0200 Subject: [PATCH 044/286] Test --- iguana/tests/jumblrstatus | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 iguana/tests/jumblrstatus diff --git a/iguana/tests/jumblrstatus b/iguana/tests/jumblrstatus new file mode 100755 index 000000000..6c1824244 --- /dev/null +++ b/iguana/tests/jumblrstatus @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"status\"}" From 12fe3efcce70db604ce071a23cfa9516886ceaf3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:50:37 +0200 Subject: [PATCH 045/286] Test --- basilisk/jumblr.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f2a7c59df..1cf3d87ae 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -99,6 +99,13 @@ char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_i return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } +char *jumblr_listreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listreceivedbyaddress",params)); +} + char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; @@ -109,9 +116,9 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; - if ( (retstr= jumblr_zlistreceivedbyaddress(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_listreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("z_listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + printf("listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) From 3e7aa0bcab15e9c72db43e9e9b0e7b0d41d03584 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:54:08 +0200 Subject: [PATCH 046/286] Test --- basilisk/jumblr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1cf3d87ae..7b957e07e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -99,11 +99,11 @@ char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_i return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } -char *jumblr_listreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; sprintf(params,"[\"%s\", 1]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listreceivedbyaddress",params)); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) @@ -116,9 +116,9 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; - if ( (retstr= jumblr_listreceivedbyaddress(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("listreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); + printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) From 77339abe8be532fb18e4c1b9e88b8431d7a76b70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 00:58:24 +0200 Subject: [PATCH 047/286] Test --- basilisk/jumblr.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 7b957e07e..ca146101a 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -106,6 +106,13 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } +char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 0]",wifstr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); +} + char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; @@ -115,11 +122,11 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; cJSON *retjson,*item; int32_t i,n; int64_t total = 0; + char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); - if ( (retjson= cJSON_Parse(retstr)) != 0 ) + /*if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) { @@ -130,7 +137,8 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, } } free_json(retjson); - } + }*/ + total = atof(retstr) * SATOSHIDEN; free(retstr); } return(total); @@ -335,7 +343,7 @@ r = 0; STRING_ARG(jumblr,setpassphrase,passphrase) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; + cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); else @@ -343,10 +351,14 @@ STRING_ARG(jumblr,setpassphrase,passphrase) safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); return(jprint(retjson,1)); From 6905f3303a81e4dc8ce158b8266bcbd6df7ac8f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:00:41 +0200 Subject: [PATCH 048/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ca146101a..88a9460bd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -109,7 +109,7 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) { char params[1024]; - sprintf(params,"[\"%s\", 0]",wifstr); + sprintf(params,"[\"%s\", false]",wifstr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); } From 9a554e11f19c10c8075f141d56903ef77854b3f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:03:28 +0200 Subject: [PATCH 049/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 88a9460bd..b2ae526e4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -109,7 +109,7 @@ char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_inf char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr) { char params[1024]; - sprintf(params,"[\"%s\", false]",wifstr); + sprintf(params,"[\"%s\", \"\", false]",wifstr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importprivkey",params)); } From d73346719c75686a3319b8b13fb19190ca598c75 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:06:24 +0200 Subject: [PATCH 050/286] Test --- iguana/tests/walletpassphrase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/walletpassphrase b/iguana/tests/walletpassphrase index dc5eae04e..94d46e776 100755 --- a/iguana/tests/walletpassphrase +++ b/iguana/tests/walletpassphrase @@ -1,4 +1,4 @@ #!/bin/bash #curl --url "http://127.0.0.1:7778" --data "{\"method\":\"walletpassphrase\",\"params\":[\"test\", 600]}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"test\",\"timeout\":86444}" -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"test\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"jumblr\",\"method\":\"setpassphrase\",\"passphrase\":\"jumblr test\"}" From fdc0ae60f5ae8b9c854d57875923cd923c88612b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:09:46 +0200 Subject: [PATCH 051/286] Test --- iguana/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 304b32ecb..fc9ed1609 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -752,9 +752,9 @@ void jumblr_loop(void *ptr) while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 120) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) { - jumblr_iteration(myinfo,coin,(t % 360) / 120,t % 120); + jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(20); From e725ba05186a0bf2e311b95975708e4a2cba734e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:21:18 +0200 Subject: [PATCH 052/286] Importprivkey if native --- iguana/iguana_wallet.c | 6 ++++++ includes/iguana_funcs.h | 1 + 2 files changed, 7 insertions(+) diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 11d631d2b..65f5c0d56 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1360,6 +1360,12 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) if ( coin != 0 ) { bitcoin_address(coin->changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( coin->FULLNODE < 0 ) + { + char wifstr[64]; + bitcoin_priv2wif(wifstr,myinfo->persistent_priv,coin->chain->wiftype); + jumblr_importprivkey(myinfo,coin,wifstr); + } } //basilisk_unspents_update(myinfo,coin); return(retstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index e82603144..c6a2e3a3f 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -616,6 +616,7 @@ bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); +char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From ba9a75d779291a53505dde5d8cc51424f5d7ffdc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 01:46:02 +0200 Subject: [PATCH 053/286] Test --- basilisk/jumblr.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b2ae526e4..1b59067a4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -71,6 +71,13 @@ char *jumblr_zgetoperationresult(struct supernet_info *myinfo,struct iguana_info return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationresult",params)); } +char *jumblr_zgetoperationstatus(struct supernet_info *myinfo,struct iguana_info *coin,char *opid) +{ + char params[1024]; + sprintf(params,"[[\"%s\"]]",opid); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getoperationstatus",params)); +} + char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; @@ -212,7 +219,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str char *retstr,*status; cJSON *retjson; if ( ptr->status == 0 ) { - if ( (retstr= jumblr_zgetoperationresult(myinfo,coin,ptr->opid)) != 0 ) + if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { From 390ff2af7be584811f5e86d7ccaf9a113571a215 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:02:28 +0200 Subject: [PATCH 054/286] Test --- basilisk/jumblr.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1b59067a4..f4126d628 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -374,7 +374,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t deposited,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); @@ -383,11 +383,13 @@ ZERO_ARGS(jumblr,status) jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - deposited = jumblr_receivedby(myinfo,coin,KMDaddr); + received = jumblr_receivedby(myinfo,coin,KMDaddr); + deposited = SATOSHIDEN * jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); finished = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblred = SATOSHIDEN * jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { if ( strlen(ptr->src) >= 40 ) @@ -404,7 +406,9 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); jaddnum(retjson,"finished",dstr(finished)); - jaddnum(retjson,"pending",dstr(deposited) - dstr(finished)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"pending",dstr(received) - dstr(finished)); + jaddnum(retjson,"jumblred",dstr(jumblred)); return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); } From e3c6793ef1564dab84425fc20ac1d6bf0b1829b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:09:21 +0200 Subject: [PATCH 055/286] Test --- basilisk/jumblr.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f4126d628..8ab873903 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -102,14 +102,14 @@ char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } @@ -123,10 +123,17 @@ char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[\"%s\", 3]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } +char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 3]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getbalance",params)); +} + int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; @@ -153,16 +160,13 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; cJSON *retjson; int64_t balance = 0; + char *retstr; double val; int64_t balance = 0; if ( strlen(addr) < 40 ) { - if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + if ( (retstr= jumblr_getbalance(myinfo,coin,addr)) != 0 ) { - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - balance = jdouble(retjson,"balance") * SATOSHIDEN; - free_json(retjson); - } + if ( (val= atof(retstr)) > SMALLVAL ) + balance = val * SATOSHIDEN; free(retstr); } } From f6960cbb8880eaebbc6a2aa9eac516ed263f0d5e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:13:35 +0200 Subject: [PATCH 056/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 8ab873903..b3f0dc3ca 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -131,7 +131,7 @@ char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,ch { char params[1024]; sprintf(params,"[\"%s\", 3]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getbalance",params)); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) From fcc956f79b6fa9b8de6dac4d649e36c195d442be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:18:40 +0200 Subject: [PATCH 057/286] Test --- basilisk/jumblr.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b3f0dc3ca..b40be9279 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -127,11 +127,11 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } -char *jumblr_getbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); - return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); + sprintf(params,"[3, 99999999, \"%s\"]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) @@ -160,13 +160,18 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; double val; int64_t balance = 0; + char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( strlen(addr) < 40 ) { - if ( (retstr= jumblr_getbalance(myinfo,coin,addr)) != 0 ) + if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { - if ( (val= atof(retstr)) > SMALLVAL ) - balance = val * SATOSHIDEN; + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + for (i=0; ijumblrs,ptr,tmp) { if ( strlen(ptr->src) >= 40 ) From dcc6d75d09a53a9a7def8ac237d85a95a0628ee8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:20:24 +0200 Subject: [PATCH 058/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index b40be9279..46a1bf979 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -130,7 +130,7 @@ char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,c char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[3, 99999999, \"%s\"]",addr); + sprintf(params,"[3, 99999999, [\"%s\"]]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } From 2c4081bc578ffba67da7d7ec2ed7ca82249ca63c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 02:21:20 +0200 Subject: [PATCH 059/286] Test --- basilisk/jumblr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 46a1bf979..4cfd89367 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -102,14 +102,14 @@ char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_zlistreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_listreceivedbyaddress",params)); } char *jumblr_getreceivedbyaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getreceivedbyaddress",params)); } @@ -123,14 +123,14 @@ char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin char *jumblr_zgetbalance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[\"%s\", 3]",addr); + sprintf(params,"[\"%s\", 1]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getbalance",params)); } char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char params[1024]; - sprintf(params,"[3, 99999999, [\"%s\"]]",addr); + sprintf(params,"[1, 99999999, [\"%s\"]]",addr); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",params)); } From 9763b00743378783d5311d59cbea75c899218289 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:33:27 +0200 Subject: [PATCH 060/286] Test --- basilisk/jumblr.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4cfd89367..d5b26f1f2 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -136,22 +136,9 @@ char *jumblr_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,c int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { - char *retstr; int64_t total = 0; //cJSON *retjson,*item; int32_t i,n; + char *retstr; int64_t total = 0; if ( (retstr= jumblr_getreceivedbyaddress(myinfo,coin,addr)) != 0 ) { - printf("jumblr_getreceivedbyaddress.(%s) -> (%s)\n",addr,retstr); - /*if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) - { - for (i=0; isrc,from,sizeof(ptr->src)); if ( (amounts= jarray(&n,params,"amounts")) != 0 ) @@ -207,6 +197,7 @@ void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) for (i=0; i 0 ) { if ( strcmp(addr,JUMBLR_ADDR) == 0 ) @@ -246,6 +237,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) { + printf("%s\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) From bfd38344436dd9a083de756e809508c7ccf5b8d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:53:10 +0200 Subject: [PATCH 061/286] Test --- basilisk/jumblr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index d5b26f1f2..6b57481a6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -221,6 +221,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { + printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) From a19417c6c8c4d39bae4945f0ddf68159925f61b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:55:54 +0200 Subject: [PATCH 062/286] Test --- basilisk/jumblr.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6b57481a6..6bd80bab7 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -221,10 +221,9 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { - printf("%s\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"pending") != 0 ) + if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"success") == 0 ) jumblr_itemset(ptr,retjson,status); free_json(retjson); } From 9574d0d83d2a1484d095311875c0727cb9bf66ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 09:58:07 +0200 Subject: [PATCH 063/286] Test --- basilisk/jumblr.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6bd80bab7..45e3d8cdd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -173,7 +173,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha return(balance); } -void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) +int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) { cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount; /*"params" : { @@ -212,6 +212,7 @@ void jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) } ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; } + return(1); } void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) @@ -223,8 +224,17 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 && strcmp(status,"success") == 0 ) - jumblr_itemset(ptr,retjson,status); + if ( (status= jstr(retjson,"status")) != 0 ) + { + if ( strcmp(status,"success") == 0 ) + ptr->status = jumblr_itemset(ptr,retjson,status); + else if ( strcmp(status,"failure") == 0 ) + { + printf("%s failed\n",ptr->opid); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } + } free_json(retjson); } free(retstr); From 0fc2622ce6f3c20b3ba1be88945d30da6f923dea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:01:03 +0200 Subject: [PATCH 064/286] Test --- basilisk/jumblr.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 45e3d8cdd..835840b6d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -217,22 +217,28 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) { - char *retstr,*status; cJSON *retjson; + char *retstr,*status; cJSON *retjson,*item; if ( ptr->status == 0 ) { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (status= jstr(retjson,"status")) != 0 ) + if ( cJSON_GetArraySize(retjson) == 1 ) { - if ( strcmp(status,"success") == 0 ) - ptr->status = jumblr_itemset(ptr,retjson,status); - else if ( strcmp(status,"failure") == 0 ) + item = jitem(retjson,0); + if ( (status= jstr(item,"status")) != 0 ) { - printf("%s failed\n",ptr->opid); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - ptr->status = -1; + if ( strcmp(status,"success") == 0 ) + { + ptr->status = jumblr_itemset(ptr,item,status); + } + else if ( strcmp(status,"failure") == 0 ) + { + printf("%s failed\n",ptr->opid); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } } } free_json(retjson); From 65e2efa1bb3bcfce67e2ea723d99771851633b67 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:03:49 +0200 Subject: [PATCH 065/286] Test --- iguana/iguana777.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 8e33594a5..aa85d607c 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -96,7 +96,7 @@ struct jumblr_item UT_hash_handle hh; int64_t amount,fee,txfee; uint32_t spent; - char opid[65],src[65],dest[65],status; + char opid[66],src[66],dest[66],status; }; struct liquidity_info From c7a42536e55b144858cc7bb3733198a4912a0494 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:05:51 +0200 Subject: [PATCH 066/286] Test --- iguana/iguana777.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index aa85d607c..89d25f734 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -95,8 +95,8 @@ struct jumblr_item { UT_hash_handle hh; int64_t amount,fee,txfee; - uint32_t spent; - char opid[66],src[66],dest[66],status; + uint32_t spent,pad; + char opid[64],src[128],dest[128],status; }; struct liquidity_info From b91196347b40e87aadaa28e31c0b98e43bacecce Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:08:29 +0200 Subject: [PATCH 067/286] Test --- basilisk/jumblr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 835840b6d..bb28fa0a4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -27,7 +27,7 @@ z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) */ -#define JUMBLR_INCR 99 +#define JUMBLR_INCR 99.5 #define JUMBLR_TXFEE 0.01 #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" @@ -159,8 +159,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - if ( balance == 0 ) - printf("listunspent.(%s)\n",addr); + //if ( balance == 0 ) + // printf("listunspent.(%s)\n",addr); free(retstr); } } @@ -189,7 +189,7 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) }*/ if ( (params= jobj(item,"params")) != 0 ) { - printf("params.(%s)\n",jprint(params,0)); + //printf("params.(%s)\n",jprint(params,0)); if ( (from= jstr(params,"fromaddress")) != 0 ) safecopy(ptr->src,from,sizeof(ptr->src)); if ( (amounts= jarray(&n,params,"amounts")) != 0 ) @@ -227,6 +227,7 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( cJSON_GetArraySize(retjson) == 1 ) { item = jitem(retjson,0); + printf("%s\n",jprint(item,0)); if ( (status= jstr(item,"status")) != 0 ) { if ( strcmp(status,"success") == 0 ) From ed6b926d5649950987a21d83a10a77f9b1bae552 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:12:32 +0200 Subject: [PATCH 068/286] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index bb28fa0a4..ccb90f81d 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -227,14 +227,14 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( cJSON_GetArraySize(retjson) == 1 ) { item = jitem(retjson,0); - printf("%s\n",jprint(item,0)); + //printf("%s\n",jprint(item,0)); if ( (status= jstr(item,"status")) != 0 ) { if ( strcmp(status,"success") == 0 ) { ptr->status = jumblr_itemset(ptr,item,status); } - else if ( strcmp(status,"failure") == 0 ) + else if ( strcmp(status,"failed") == 0 ) { printf("%s failed\n",ptr->opid); free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); From 80d74e755b893d2898ad6465dbd39537af54e373 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:21:28 +0200 Subject: [PATCH 069/286] Test --- basilisk/jumblr.c | 8 +++++--- iguana/main.c | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ccb90f81d..13ab787e9 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -322,6 +322,7 @@ r = 0; { if ( strlen(ptr->src) < 40 ) { + printf("%s -> %s check for z to z\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) @@ -345,6 +346,7 @@ r = 0; { if ( strlen(ptr->src) >= 40 ) { + printf("%s -> %s check for z to t\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); @@ -423,10 +425,10 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"finished",dstr(finished)); - jaddnum(retjson,"received",dstr(received)); - jaddnum(retjson,"pending",dstr(received) - dstr(finished)); + jaddnum(retjson,"pending",dstr(deposited) + dstr(step_t2z) + dstr(step_z2z) + dstr(step_z2t)); jaddnum(retjson,"jumblred",dstr(jumblred)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); } diff --git a/iguana/main.c b/iguana/main.c index fc9ed1609..86742ee04 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,17 +747,17 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % 1200) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) { - jumblr_iteration(myinfo,coin,(t % 3600) / 1200,t % 1200); + jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); - sleep(20); + sleep(40); } } From bb745350f86419b6c4bc8f58c19043b6b3246f52 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:22:30 +0200 Subject: [PATCH 070/286] Test --- basilisk/jumblr.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 13ab787e9..f1a84ff43 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -159,8 +159,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - //if ( balance == 0 ) - // printf("listunspent.(%s)\n",addr); + if ( balance == 0 ) + printf("listunspent.(%s)\n",addr); free(retstr); } } @@ -197,7 +197,7 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) for (i=0; i 0 ) { if ( strcmp(addr,JUMBLR_ADDR) == 0 ) @@ -254,7 +254,6 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; if ( (retstr= jumblr_zlistoperationids(myinfo,coin)) != 0 ) { - printf("%s\n",retstr); if ( (array= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(array)) > 0 ) From cd433621215d2be1de5c9536d2fe1e83d0deb25e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:30:47 +0200 Subject: [PATCH 071/286] Test --- basilisk/jumblr.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f1a84ff43..560fa8552 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -393,12 +393,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t pending,received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -416,15 +416,16 @@ ZERO_ARGS(jumblr,status) if ( strlen(ptr->dest) >= 40 ) step_z2z += ptr->amount; else step_z2t += ptr->amount; - } - else step_t2z += ptr->amount; + } else step_t2z += ptr->amount; + if ( ptr->spent == 0 ) + pending += ptr->amount; } jaddstr(retjson,"result","success"); jaddnum(retjson,"deposited",dstr(deposited)); jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"pending",dstr(deposited) + dstr(step_t2z) + dstr(step_z2z) + dstr(step_z2t)); + jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumblred",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); From cad9d1b0d638f0f06ecb42fe77e0694601dd4115 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 10:53:31 +0200 Subject: [PATCH 072/286] Test --- basilisk/jumblr.c | 50 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 560fa8552..05151401f 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -33,6 +33,15 @@ #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_FEE 0.001 +int32_t jumblr_addresstype(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 ) + return('z'); + else if ( strlen(addr) < 40 ) + return('t'); + else return(-1); +} + struct jumblr_item *jumblr_opidfind(struct supernet_info *myinfo,char *opid) { struct jumblr_item *ptr; @@ -81,6 +90,8 @@ char *jumblr_zgetoperationstatus(struct supernet_info *myinfo,struct iguana_info char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddr) != 'z' || jumblr_addresstype(myinfo,coin,taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -88,6 +99,8 @@ char *jumblr_sendt_to_z(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddrS) != 'z' || jumblr_addresstype(myinfo,coin,zaddrD) != 'z' ) + return(clonestr("{\"error\":\"illegal address in z to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -95,6 +108,8 @@ char *jumblr_sendz_to_z(struct supernet_info *myinfo,struct iguana_info *coin,ch char *jumblr_sendz_to_t(struct supernet_info *myinfo,struct iguana_info *coin,char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(myinfo,coin,zaddr) != 'z' || jumblr_addresstype(myinfo,coin,taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_sendmany",params)); } @@ -148,7 +163,7 @@ int64_t jumblr_receivedby(struct supernet_info *myinfo,struct iguana_info *coin, int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) { char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; - if ( strlen(addr) < 40 ) + if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { @@ -259,8 +274,14 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( (n= cJSON_GetArraySize(array)) > 0 ) { for (i=0; istatus == 0 ) - jumblr_opidupdate(myinfo,coin,ptr); + { + if ( (ptr= jumblr_opidadd(myinfo,coin,jstri(array,i))) != 0 ) + { + if ( ptr->status == 0 ) + jumblr_opidupdate(myinfo,coin,ptr); + printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + } + } } free_json(array); } @@ -279,6 +300,22 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, return(privkey); } +void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + struct jumblr_item *tmp; char oldsrc[128]; + strcpy(oldsrc,ptr->src); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("%s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + } + } +} + void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; @@ -319,9 +356,8 @@ r = 0; jumblr_opidsupdate(myinfo,coin); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( strlen(ptr->src) < 40 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - printf("%s -> %s check for z to z\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) @@ -343,9 +379,8 @@ r = 0; jumblr_opidsupdate(myinfo,coin); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - if ( strlen(ptr->src) >= 40 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - printf("%s -> %s check for z to t\n",ptr->src,ptr->dest); if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); @@ -353,6 +388,7 @@ r = 0; { printf("sendz_to_t.(%s)\n",retstr); free(retstr); + jumblr_prune(myinfo,coin,ptr); } ptr->spent = (uint32_t)time(NULL); break; From 18100ada9ed7f00997533bbcd9f6cf169d223abe Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:05:23 +0200 Subject: [PATCH 073/286] Test --- basilisk/jumblr.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 05151401f..f66fa2a0e 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -27,7 +27,7 @@ z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) */ -#define JUMBLR_INCR 99.5 +#define JUMBLR_INCR 99.65 #define JUMBLR_TXFEE 0.01 #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" @@ -264,6 +264,22 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str } } +void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) +{ + struct jumblr_item *tmp; char oldsrc[128]; + strcpy(oldsrc,ptr->src); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + } + } +} + void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) { char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; @@ -280,6 +296,8 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->dest,JUMBLR_ADDR) == 0 ) + jumblr_prune(myinfo,coin,ptr); } } } @@ -300,22 +318,6 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, return(privkey); } -void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) -{ - struct jumblr_item *tmp; char oldsrc[128]; - strcpy(oldsrc,ptr->src); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) - { - if ( strcmp(oldsrc,ptr->dest) == 0 ) - { - printf("%s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - strcpy(oldsrc,ptr->src); - } - } -} - void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; @@ -388,7 +390,6 @@ r = 0; { printf("sendz_to_t.(%s)\n",retstr); free(retstr); - jumblr_prune(myinfo,coin,ptr); } ptr->spent = (uint32_t)time(NULL); break; From 66f24aea41bc5f8f94167c8f918acd3517e04c25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:07:10 +0200 Subject: [PATCH 074/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f66fa2a0e..87ee3ed71 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -296,7 +296,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); - if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->dest,JUMBLR_ADDR) == 0 ) + if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 't' ) jumblr_prune(myinfo,coin,ptr); } } From 8289832e696b3cef5b198dad11dc3a5c26cfbcb2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:36:53 +0200 Subject: [PATCH 075/286] Test --- basilisk/jumblr.c | 36 ++++++++++++++++++++---------------- iguana/main.c | 2 +- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 87ee3ed71..739f249c6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -266,16 +266,23 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str void jumblr_prune(struct supernet_info *myinfo,struct iguana_info *coin,struct jumblr_item *ptr) { - struct jumblr_item *tmp; char oldsrc[128]; + struct jumblr_item *tmp; char oldsrc[128]; int32_t flag = 1; + printf("PRUNE %s\n",ptr->opid); strcpy(oldsrc,ptr->src); free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + while ( flag != 0 ) { - if ( strcmp(oldsrc,ptr->dest) == 0 ) + flag = 0; + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) { - printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); - free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); - strcpy(oldsrc,ptr->src); + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + strcpy(oldsrc,ptr->src); + flag = 1; + break; + } } } } @@ -335,7 +342,7 @@ r = 0; priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { - if ( (r & 7) == 0 ) + if ( (r & 1) == 0 ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) { @@ -352,7 +359,7 @@ r = 0; free(zaddr); } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); + } //else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); @@ -360,7 +367,7 @@ r = 0; { if ( jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress(myinfo,coin)) != 0 ) { @@ -383,7 +390,7 @@ r = 0; { if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 'z' ) { - if ( (r & 7) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) @@ -430,12 +437,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t pending,received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -454,15 +461,12 @@ ZERO_ARGS(jumblr,status) step_z2z += ptr->amount; else step_z2t += ptr->amount; } else step_t2z += ptr->amount; - if ( ptr->spent == 0 ) - pending += ptr->amount; } jaddstr(retjson,"result","success"); - jaddnum(retjson,"deposited",dstr(deposited)); + jaddnum(retjson,"deposits",dstr(deposited)); jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumblred",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); diff --git a/iguana/main.c b/iguana/main.c index 86742ee04..55ca8824c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -757,7 +757,7 @@ void jumblr_loop(void *ptr) jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); } //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); - sleep(40); + sleep(55); } } From e04f8891e47407b33ed6cb72139c0cefc1c48927 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:37:16 +0200 Subject: [PATCH 076/286] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 739f249c6..ab01e1637 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -174,8 +174,8 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha balance += SATOSHIDEN * jdouble(jitem(retjson,i),"amount"); free_json(retjson); } - if ( balance == 0 ) - printf("listunspent.(%s)\n",addr); + //if ( balance == 0 ) + // printf("listunspent.(%s)\n",addr); free(retstr); } } From 79a4714c7e89fe35826a7995d4d267c6c9e21ed7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:55:54 +0200 Subject: [PATCH 077/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ab01e1637..f22d14e7b 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -302,7 +302,7 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin) { if ( ptr->status == 0 ) jumblr_opidupdate(myinfo,coin,ptr); - printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + //printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); if ( jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->dest) == 't' ) jumblr_prune(myinfo,coin,ptr); } From 6b26261d96758d5f91bf6d0ff4232db0381a22c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:56:13 +0200 Subject: [PATCH 078/286] Test --- iguana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/main.c b/iguana/main.c index 55ca8824c..986764423 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From 3ca5e80423fda8db245cf573500ff09ef941a1d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 11:57:29 +0200 Subject: [PATCH 079/286] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f22d14e7b..9e2568f75 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -332,10 +332,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 // if BTC has arrived in destination address, invoke DEX -> BTC fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey From fa25754e68f75a616a9c36a448e40941b1509b63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 12:21:38 +0200 Subject: [PATCH 080/286] Test --- basilisk/jumblr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 9e2568f75..cd47d8814 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -335,7 +335,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 //r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -428,7 +428,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddstr(retjson,"KMDdeposit",KMDaddr); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jumblr_importprivkey(myinfo,coin,wifstr); + // jumblr_importprivkey(myinfo,coin,wifstr); dont mix jumbled funds with normal! jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); return(jprint(retjson,1)); From 648e3935817f683b3ffd4d563372411d9318ecee Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 12:53:09 +0200 Subject: [PATCH 081/286] Test --- basilisk/jumblr.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index cd47d8814..f61e07090 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -335,7 +335,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 //r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -437,12 +437,12 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = 0; + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); @@ -467,7 +467,12 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"t_to_z",dstr(step_t2z)); jaddnum(retjson,"z_to_z",dstr(step_z2z)); jaddnum(retjson,"z_to_t",dstr(step_z2t)); - jaddnum(retjson,"jumblred",dstr(jumblred)); + maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); + minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); + if ( maxval > minval ) + pending = (maxval - minval); + jaddnum(retjson,"pending",dstr(pending)); + jaddnum(retjson,"jumbled",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); From 4df6716b14c2c2c30d49fe7273b3a7adea9b1557 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:19:45 +0200 Subject: [PATCH 082/286] Test --- basilisk/jumblr.c | 68 ++++++++++++++++++++++++++++++++++++++++------- iguana/main.c | 2 +- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f61e07090..c7679b234 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -63,6 +63,34 @@ struct jumblr_item *jumblr_opidadd(struct supernet_info *myinfo,struct iguana_in return(ptr); } +char *jumblr_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024]; + if ( coin->FULLNODE < 0 ) + { + sprintf(params,"[\"%s\"]",addr); + return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"validateaddress",params)); + } else return(_dex_validateaddress(myinfo,coin->symbol,addr)); +} + +int32_t jumblr_ismine(struct supernet_info *myinfo,struct iguana_info *coin,char *addr) +{ + char params[1024],*retstr; cJSON *retjson,*obj; int32_t retval = -1; + sprintf(params,"[\"%s\"]",addr); + if ( (retstr= jumblr_validateaddress(myinfo,coin,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (obj= jobj(retjson,"ismine")) != 0 && is_cJSON_True(obj) != 0 ) + retval = 1; + else retval = 0; + free_json(retjson); + } + free(retstr); + } + return(retval); +} + char *jumblr_zgetnewaddress(struct supernet_info *myinfo,struct iguana_info *coin) { return(bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"z_getnewaddress","")); @@ -165,17 +193,27 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { - if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) + if ( jumblr_ismine(myinfo,coin,addr) > 0 ) + { + if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + for (i=0; isymbol,addr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) - for (i=0; i minbtc ) + { + + } +} + void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { - char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 priv0; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; + char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; // if BTC has arrived in deposit address, invoke DEX -> KMD // if BTC has arrived in destination address, invoke DEX -> BTC + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -//r = 0; +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey - priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { if ( (r & 1) == 0 ) diff --git a/iguana/main.c b/iguana/main.c index 986764423..55ca8824c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { From 7c1344254f87d787f198edfbc003d026ae387540 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:30:01 +0200 Subject: [PATCH 083/286] Test --- basilisk/jumblr.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c7679b234..702061a24 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -365,10 +365,14 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - double btcavail,minbtc; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + double btcavail,minbtc,kmdprice,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) { - + minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); + if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + { + printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); + } } } @@ -440,7 +444,7 @@ r = 0; { if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { - priv0 = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) { printf("sendz_to_t.(%s)\n",retstr); @@ -461,7 +465,7 @@ r = 0; STRING_ARG(jumblr,setpassphrase,passphrase) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; + cJSON *retjson; char KMDaddr[64],BTCaddr[64],wifstr[64]; bits256 privkey; struct iguana_info *coinbtc; if ( passphrase == 0 || passphrase[0] == 0 || (coin= iguana_coinfind("KMD")) == 0 || coin->FULLNODE >= 0 ) return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); else @@ -472,13 +476,19 @@ STRING_ARG(jumblr,setpassphrase,passphrase) privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); jumblr_importprivkey(myinfo,coin,wifstr); - jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - // jumblr_importprivkey(myinfo,coin,wifstr); dont mix jumbled funds with normal! - jaddstr(retjson,"BTCjumblr","notyet"); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); + jumblr_importprivkey(myinfo,coinbtc,wifstr); + jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + } + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); return(jprint(retjson,1)); } } From 23ab04f414c9a203c2ba5804a82211cd52e26d61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:50:45 +0200 Subject: [PATCH 084/286] Test --- basilisk/jumblr.c | 4 ++++ crypto777/iguana_utils.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 702061a24..57d3a12cd 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -528,7 +528,11 @@ ZERO_ARGS(jumblr,status) maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); if ( maxval > minval ) + { pending = (maxval - minval); + if ( pending < finished*.1 ) + pending = 0; + } jaddnum(retjson,"pending",dstr(pending)); jaddnum(retjson,"jumbled",dstr(jumblred)); jaddnum(retjson,"received",dstr(received)); diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index e9b8b8a51..80988fa5f 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -1164,7 +1164,7 @@ char *bittrex_orderbook(char *base,char *rel,int32_t maxdepth) double calc_theoretical(double weighted,double CMC_average,double changes[3]) { - double adjusted = 0.,theoretical = 0.; + double theoretical = 0.; //adjusted = 0., if ( weighted > SMALLVAL && CMC_average > SMALLVAL ) { theoretical = (weighted + CMC_average) * 0.5; @@ -1185,7 +1185,7 @@ double calc_theoretical(double weighted,double CMC_average,double changes[3]) if ( adjusted != 0. && theoretical != 0. ) theoretical = (theoretical + adjusted) * 0.5;*/ } - printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); + //printf("adjusted %.8f theoretical %.8f (%.8f + wt %.8f)\n",adjusted,theoretical,CMC_average,weighted); return(theoretical); } From 847010bd9e91101bc8632c7deebffc1b6b294891 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 13:54:11 +0200 Subject: [PATCH 085/286] Test --- basilisk/jumblr.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 57d3a12cd..463d71397 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -487,7 +487,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + if ( coinbtc != 0 ) jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); return(jprint(retjson,1)); } @@ -495,20 +495,24 @@ STRING_ARG(jumblr,setpassphrase,passphrase) ZERO_ARGS(jumblr,status) { - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) { jumblr_opidsupdate(myinfo,coin); retjson = cJSON_CreateObject(); step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); received = jumblr_receivedby(myinfo,coin,KMDaddr); deposited = jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); finished = jumblr_receivedby(myinfo,coin,KMDaddr); jumblred = jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) From 6a6b4b05434068cc70aabe208de9f1be1ea310d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:00:15 +0200 Subject: [PATCH 086/286] Test --- basilisk/jumblr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 463d71397..126df93c0 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -193,7 +193,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; if ( jumblr_addresstype(myinfo,coin,addr) == 't' ) { - if ( jumblr_ismine(myinfo,coin,addr) > 0 ) + if ( coin->FULLNODE < 0 && jumblr_ismine(myinfo,coin,addr) > 0 ) { if ( (retstr= jumblr_listunspent(myinfo,coin,addr)) != 0 ) { @@ -209,6 +209,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha } else if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) { + printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { balance = jdouble(retjson,"balance") * SATOSHIDEN; From b3b7c10ebcc69cee8c3fc29b6838feba62c9bf8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:07:49 +0200 Subject: [PATCH 087/286] Test --- basilisk/jumblr.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 126df93c0..d9d4ef517 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -207,7 +207,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha free(retstr); } } - else if ( (retstr= _dex_getbalance(myinfo,coin->symbol,addr)) != 0 ) + else if ( (retstr= dex_getbalance(myinfo,coin,0,0,coin->symbol,addr)) != 0 ) { printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -476,13 +476,15 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jumblr_importprivkey(myinfo,coin,wifstr); + if ( coin->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coin,wifstr); jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"BTCdeposit",BTCaddr); if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) { bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); - jumblr_importprivkey(myinfo,coinbtc,wifstr); + if ( coinbtc->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coinbtc,wifstr); jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); } jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); From 01afe01a1c244e1917ab5ad79fb3c194334769e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:11:28 +0200 Subject: [PATCH 088/286] Test --- basilisk/jumblr.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index d9d4ef517..6756fe0d3 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -370,7 +370,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); - if ( coinbtc != 0 && (btcavail= jumblr_balance(myinfo,coinbtc,BTCaddr)) > minbtc ) + if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); } @@ -389,7 +389,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey @@ -485,13 +485,13 @@ STRING_ARG(jumblr,setpassphrase,passphrase) bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); if ( coinbtc->FULLNODE < 0 ) jumblr_importprivkey(myinfo,coinbtc,wifstr); - jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); return(jprint(retjson,1)); } } @@ -508,14 +508,14 @@ ZERO_ARGS(jumblr,status) jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"BTCdeposit",BTCaddr); if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - jaddnum(retjson,"BTCdeposits",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); received = jumblr_receivedby(myinfo,coin,KMDaddr); deposited = jumblr_balance(myinfo,coin,KMDaddr); jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",jumblr_balance(myinfo,coinbtc,BTCaddr)); + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); finished = jumblr_receivedby(myinfo,coin,KMDaddr); jumblred = jumblr_balance(myinfo,coin,KMDaddr); HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) From b71ba733d6fa91e00dbf30d2d7dedcfad683e8dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:15:04 +0200 Subject: [PATCH 089/286] Test --- basilisk/jumblr.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 6756fe0d3..5212c20db 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -209,7 +209,7 @@ int64_t jumblr_balance(struct supernet_info *myinfo,struct iguana_info *coin,cha } else if ( (retstr= dex_getbalance(myinfo,coin,0,0,coin->symbol,addr)) != 0 ) { - printf("retstr.(%s)\n",retstr); + //printf("retstr.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { balance = jdouble(retjson,"balance") * SATOSHIDEN; @@ -366,8 +366,14 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - double btcavail,minbtc,kmdprice,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - if ( (kmdprice= get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average)) != 0. ) + static double kmdprice; static uint32_t lasttime; + double btcavail,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + if ( kmdprice == 0. || time(NULL) > lasttime+600 ) + { + kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); + lasttime = (uint32_t)time(NULL); + } + if ( kmdprice > SMALLVAL ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) @@ -379,11 +385,16 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { + static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; // if BTC has arrived in deposit address, invoke DEX -> KMD // if BTC has arrived in destination address, invoke DEX -> BTC privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + if ( time(NULL) > lasttime+60 ) + { + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + lasttime = (uint32_t)time(NULL); + } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); r = 0; From d25a887d1973681fe1e14bcfc9358da233c620ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 15:18:29 +0200 Subject: [PATCH 090/286] Test --- basilisk/jumblr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5212c20db..841fc3432 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -367,11 +367,13 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { static double kmdprice; static uint32_t lasttime; - double btcavail,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); + printf("DEXcheck %p\n",coinbtc); if ( kmdprice == 0. || time(NULL) > lasttime+600 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); lasttime = (uint32_t)time(NULL); + printf("KMD %.8f\n",kmdprice); } if ( kmdprice > SMALLVAL ) { @@ -379,7 +381,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); - } + } else printf("btcavail %.8f\n",btcavail); } } From 298978957695b366a8685a910201c0df9207fea1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:09:17 +0200 Subject: [PATCH 091/286] Test --- basilisk/basilisk_DEX.c | 6 +++--- basilisk/basilisk_MSG.c | 4 ++-- basilisk/basilisk_bitcoin.c | 14 ++++++++++---- basilisk/jumblr.c | 25 +++++++++++++++++++------ includes/iguana_funcs.h | 1 + 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 607d32099..bc8b69ed5 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -681,19 +681,19 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) } else printf("error creating request\n"); if ( datalen > 0 ) { - uint32_t msgid,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; + uint32_t msgid,crc=0;//,crcs[2],numiters = 0; uint8_t buf[4096]; memset(hash.bytes,0,sizeof(hash)); msgid = (uint32_t)time(NULL); DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); sleep(3); - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) + /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) { //printf("didnt get back what was sent\n"); sleep(3); basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); numiters++; - } + }*/ if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) return(clonestr("{\"result\":\"DEX message sent\"}")); else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index e80e37f73..12f3367dd 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -335,7 +335,7 @@ int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits25 jaddnum(valsobj,"timeout",1000); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - //char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); + char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); if ( (retstr= basilisk_sendmessage(myinfo,0,0,0,desthash,valsobj,hexstr)) != 0 ) free(retstr); free_json(valsobj); @@ -386,7 +386,7 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) { - //printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); + printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index e42ab5146..ea1574e31 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -567,12 +567,12 @@ int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,ch coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); if ( signedtx != 0 ) { - txfee = coin->estimatedfee * (strlen(signedtx) + numvins); + txfee = coin->estimatedfee * (strlen(signedtx)/2 + numvins); free(signedtx); } else if ( rawtx != 0 ) { - txfee = coin->estimatedfee * (strlen(rawtx) + numvins * 110); + txfee = coin->estimatedfee * (strlen(rawtx)/2 + numvins * 110); free(rawtx); } return(txfee); @@ -748,7 +748,7 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V) { - uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; + uint8_t buf[4096]; int32_t oplen,len,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; if ( valsobj == 0 ) return(clonestr("{\"error\":\"null valsobj\"}")); //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) @@ -798,7 +798,13 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); } rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); - //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); + if ( txfee == 0 ) + { + txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + printf("new txfee %.8f\n",dstr(txfee)); + } + printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } if ( rawtx != 0 ) { diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 841fc3432..9f7e972c1 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -366,9 +366,9 @@ bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr, void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) { - static double kmdprice; static uint32_t lasttime; - double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc = iguana_coinfind("BTC"); - printf("DEXcheck %p\n",coinbtc); + static double kmdprice,pending; static uint32_t lasttime; + double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc; cJSON *vals; bits256 hash; char *retstr; + coinbtc = iguana_coinfind("BTC"); if ( kmdprice == 0. || time(NULL) > lasttime+600 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); @@ -378,9 +378,22 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch if ( kmdprice > SMALLVAL ) { minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); - if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc ) + if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc+pending ) { printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); + vals = cJSON_CreateObject(); + jaddstr(vals,"source","BTC"); + jaddstr(vals,"dest","KMD"); + jaddnum(vals,"amount",btcavail*.95); + jaddnum(vals,"minprice",kmdprice*.95); + memset(hash.bytes,0,sizeof(hash)); + pending = btcavail; + if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) + { + printf("request.(%s) -> (%s)\n",jprint(vals,0),retstr); + free(retstr); + } + // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" } else printf("btcavail %.8f\n",btcavail); } } @@ -389,11 +402,11 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 { static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; - // if BTC has arrived in deposit address, invoke DEX -> KMD - // if BTC has arrived in destination address, invoke DEX -> BTC privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( time(NULL) > lasttime+60 ) { + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); lasttime = (uint32_t)time(NULL); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index c6a2e3a3f..7d8e3b679 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -617,6 +617,7 @@ void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coi void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); +int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins); // ------------------------------------------------------[ Preparation ]---- // Initialise a gfshare context for producing shares From 348e68f3988b6327f128f96b8891c0a76abf6ba5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:19:22 +0200 Subject: [PATCH 092/286] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bc8b69ed5..25614a23c 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -694,9 +694,9 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); numiters++; }*/ - if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) + //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) return(clonestr("{\"result\":\"DEX message sent\"}")); - else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); + //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); } return(clonestr("{\"error\":\"DEX message not sent\"}")); } diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 12f3367dd..fc2200360 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -386,7 +386,7 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) { - printf("channel.%u msgid.%u gotmessage.(%d)\n",channel,msgid,(int32_t)strlen(retstr)); + printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) From ae2595361c63d83dc3a7ac6c0aa4c604d882692d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:42:37 +0200 Subject: [PATCH 093/286] Test --- basilisk/basilisk_DEX.c | 2 +- basilisk/tradebots_liquidity.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 25614a23c..5379c271a 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -639,7 +639,7 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { uint8_t serialized[512]; char buf[512]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; - jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN); + jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"srchash") == 0 ) jaddbits256(vals,"srchash",myinfo->myaddr.persistent); if ( jobj(vals,"desthash") == 0 ) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index cc38a2369..3cc4e7617 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -932,6 +932,8 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 li.ask = jdouble(vals,"ask"); if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; + if ( strcmp(li.base,"KMD") == 0 && strcmp(li.rel,"BTC") == 0 && li.minvol > 100. ) + li.minvol = 100.; if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) li.maxvol = li.minvol; if ( (li.totalvol= jdouble(vals,"total")) < li.maxvol ) From 68dcf9b9973b50efeaf2420a0ee1fac3117add03 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 16:49:55 +0200 Subject: [PATCH 094/286] Test --- basilisk/basilisk_tradebot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 7940a4e94..4ae47f069 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -331,7 +331,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk if ( fabs(aveprice) < SMALLVAL ) return(0); //retvals[0] = avebid, retvals[1] = bidvol, retvals[2] = aveask, retvals[3] = askvol; - destamount = (1.0 - profitmargin) * aveprice * list[0].srcamount; + destamount = (1.0 - profitmargin) * aveprice * list[0].srcamount * SATOSHIDEN; printf("aveprice %f dest %.8f avebid %f bidvol %f, aveask %f askvol %f\n",aveprice,dstr(destamount),retvals[0],retvals[1],retvals[2],retvals[3]); if ( (retstr= InstantDEX_available(myinfo,iguana_coinfind(list[0].dest),0,0,list[0].dest)) != 0 ) { From 1c3ed5a4e86ebde0581ac08be2ee7f9723f3576d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 17:59:37 +0200 Subject: [PATCH 095/286] Test --- .gitignore | 2 ++ basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_tradebot.c | 2 +- iguana/iguana_payments.c | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ba6f0a1f2..04fc232c4 100755 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ iguana/help.json iguana/index7778.html *.json + +iguana/DB/KMD/utxo.dat diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 5379c271a..85b9c5376 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+3 ) + if ( time(NULL) < lastpoll+13 ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); @@ -570,7 +570,7 @@ cJSON *basilisk_unspents(struct supernet_info *myinfo,struct iguana_info *coin,c } else if ( coin->FULLNODE == 0 ) { - if ( (retstr= _dex_listunspent(myinfo,coin->symbol,coinaddr)) != 0 ) + if ( (retstr= dex_listunspent(myinfo,coin,0,0,coin->symbol,coinaddr)) != 0 ) { unspents = cJSON_Parse(retstr); free(retstr); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index fc2200360..4cf5b5f49 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -217,7 +217,7 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; portable_mutex_unlock(&myinfo->messagemutex); -//printf("add message keylen.%d [%d]\n",msg->keylen,datalen); +printf("add message keylen.%d [%d]\n",msg->keylen,datalen); //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); if ( sendping != 0 ) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index ea1574e31..5864db483 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -769,7 +769,7 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi addresses = iguana_getaddressesbyaccount(myinfo,coin,"*"); jadd(valsobj,"addresses",addresses); } - //printf("use addresses.(%s)\n",jprint(addresses,0)); + printf("use addresses.(%s)\n",jprint(addresses,0)); //printf("(%s) vals.(%s) change.(%s) spend.%s\n",coin->symbol,jprint(valsobj,0),changeaddr,spendscriptstr); if ( changeaddr == 0 || changeaddr[0] == 0 || spendscriptstr == 0 || spendscriptstr[0] == 0 ) return(clonestr("{\"error\":\"invalid changeaddr or spendscript or addresses\"}")); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 4ae47f069..d98bc1200 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -104,7 +104,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj\n"); + } else printf("no info field in swap obj.(%s)\n",jprint(obj,0)); return(-1); } diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 86f22cb3c..73b11d919 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 4 Mar 2017 18:12:17 +0200 Subject: [PATCH 096/286] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 73b11d919..86f22cb3c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 4 Mar 2017 18:59:34 +0200 Subject: [PATCH 097/286] Test --- basilisk/basilisk.c | 2 +- basilisk/basilisk.h | 15 ++------ basilisk/basilisk_DEX.c | 30 +++++++++------- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_swap.c | 72 ++++++++++++++++++++----------------- basilisk/jumblr.c | 1 + iguana/iguana777.h | 11 ++++++ includes/iguana_funcs.h | 2 +- 8 files changed, 74 insertions(+), 61 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index e4760e040..fe2150489 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -924,7 +924,7 @@ void basilisks_loop(void *arg) if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); - basilisk_requests_poll(myinfo); + basilisk_requests_poll(myinfo,myinfo->persistent_priv); } //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 45bbdd6b2..7ca809600 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -41,6 +41,8 @@ #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" +struct basilisk_swap; + struct basilisk_rawtxinfo { char destaddr[64]; @@ -77,17 +79,6 @@ struct basilisk_swapinfo uint8_t secretAm256[32],secretBn256[32]; }; -struct basilisk_swap -{ - struct supernet_info *myinfo; struct iguana_info *bobcoin,*alicecoin; - void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); - struct basilisk_swapinfo I; - struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; - bits256 privkeys[INSTANTDEX_DECKSIZE]; - uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t verifybuf[65536]; -}; - struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; struct basilisk_item @@ -135,7 +126,7 @@ int32_t basilisk_update(char *symbol,uint32_t reftimestamp); void basilisk_seqresult(struct supernet_info *myinfo,char *retstr); struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbol,char *chainname,cJSON *valsobj); void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn); -void basilisk_rawtx_setparms(char *name,struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); +void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); void basilisk_setmyid(struct supernet_info *myinfo); int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_request *rp); cJSON *basilisk_requestjson(struct basilisk_request *rp); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 85b9c5376..7d0aafeb2 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -229,7 +229,7 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 return(-1); } -char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) +char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { cJSON *retjson; struct basilisk_request *rp=0; int32_t i; if ( _rp->requestid == myinfo->lastdexrequestid ) @@ -251,7 +251,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,u *rp = *_rp; printf("START thread to complete %u/%u for (%s %.8f) <-> (%s %.8f) q.%u\n",rp->requestid,rp->quoteid,rp->src,dstr(rp->srcamount),rp->dest,dstr(rp->destamount),rp->quoteid); myinfo->lastdexrequestid = rp->requestid; - if ( basilisk_thread_start(myinfo,rp,statebits,optionduration) != 0 ) + if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration) != 0 ) { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); @@ -272,7 +272,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,u } else return(clonestr("{\"error\":\"unexpected basilisk_start not mine and amrelay\"}")); } -void basilisk_requests_poll(struct supernet_info *myinfo) +void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); @@ -346,7 +346,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) dex_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen); //INSTANTDEX_LOCKTIME*2 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,&issueR,0,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,0,issueR.optionhours * 3600)) != 0 ) free(retstr); /*crcs[0] = crcs[1] = 0; numiters = 0; @@ -489,7 +489,7 @@ char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32 return(jprint(retjson,1)); } -char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,uint32_t quoteid,struct basilisk_request *refrp) +char *basilisk_respond_accept(struct supernet_info *myinfo,bits256 privkey,uint32_t requestid,uint32_t quoteid,struct basilisk_request *refrp) { int32_t i,num=0; char *retstr=0; struct basilisk_request *requests,*rp; uint8_t space[4096]; portable_mutex_lock(&myinfo->DEX_reqmutex); @@ -501,7 +501,7 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,ui if ( rp->requestid == requestid && rp->quoteid == quoteid ) { printf("start from accept\n"); - retstr = basilisk_start(myinfo,rp,1,0); + retstr = basilisk_start(myinfo,privkey,rp,1,0); break; } } @@ -637,7 +637,7 @@ STRING_ARG(InstantDEX,available,source) HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { - uint8_t serialized[512]; char buf[512]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"srchash") == 0 ) @@ -647,12 +647,16 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); jaddnum(vals,"timestamp",time(NULL)); - hash = myinfo->myaddr.persistent; + if ( jint(vals,"usejumblr") != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + else privkey = myinfo->persistent_priv; + hash = curve25519(privkey,curve25519_basepoint9()); + //hash = myinfo->myaddr.persistent; printf("service.(%s)\n",jprint(vals,0)); memset(&R,0,sizeof(R)); if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) { - iambob = bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,R.src,R.dest,myinfo->myaddr.persistent,GENESIS_PUBKEY); + iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); if ( (optionhours= jint(vals,"optionhours")) != 0 ) { printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); @@ -681,11 +685,11 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) } else printf("error creating request\n"); if ( datalen > 0 ) { - uint32_t msgid,crc=0;//,crcs[2],numiters = 0; uint8_t buf[4096]; + uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; memset(hash.bytes,0,sizeof(hash)); msgid = (uint32_t)time(NULL); DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); + basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); sleep(3); /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) { @@ -776,7 +780,7 @@ TWO_INTS(InstantDEX,accept,requestid,quoteid) cJSON *vals; char *retstr; myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - return(basilisk_respond_accept(myinfo,requestid,quoteid,&myinfo->DEXaccept)); + return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); else { vals = cJSON_CreateObject(); diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 5864db483..e601c1e64 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -748,7 +748,7 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V) { - uint8_t buf[4096]; int32_t oplen,len,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; + uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; if ( valsobj == 0 ) return(clonestr("{\"error\":\"null valsobj\"}")); //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2b0c72d91..b9f785887 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -956,15 +956,15 @@ int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swa return(-1); } -bits256 instantdex_derivekeypair(struct supernet_info *myinfo,bits256 *newprivp,uint8_t pubkey[33],bits256 privkey,bits256 orderhash) +bits256 instantdex_derivekeypair(void *ctx,bits256 *newprivp,uint8_t pubkey[33],bits256 privkey,bits256 orderhash) { bits256 sharedsecret; sharedsecret = curve25519_shared(privkey,orderhash); vcalc_sha256cat(newprivp->bytes,orderhash.bytes,sizeof(orderhash),sharedsecret.bytes,sizeof(sharedsecret)); - return(bitcoin_pubkey33(myinfo->ctx,pubkey,*newprivp)); + return(bitcoin_pubkey33(ctx,pubkey,*newprivp)); } -int32_t instantdex_pubkeyargs(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte) +int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpubs,bits256 privkey,bits256 hash,int32_t firstbyte) { char buf[3]; int32_t i,n,m,len=0; bits256 pubi,reveal; uint64_t txid; uint8_t secret160[20],pubkey[33]; sprintf(buf,"%c0",'A' - 0x02 + firstbyte); @@ -976,7 +976,7 @@ int32_t instantdex_pubkeyargs(struct supernet_info *myinfo,struct basilisk_swap } for (i=n=m=0; iname,name); rawtx->coin = coin; @@ -1050,7 +1050,7 @@ void basilisk_rawtx_setparms(char *name,struct supernet_info *myinfo,struct basi } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) @@ -1077,7 +1077,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco *alicecoinp = iguana_coinfind(src); } else return(0); - if ( bits256_cmp(myinfo->myaddr.persistent,srchash) == 0 ) + if ( bits256_cmp(pubkey,srchash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) return(1); @@ -1085,7 +1085,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco return(-1); else return(0); } - else if ( bits256_cmp(myinfo->myaddr.persistent,desthash) == 0 ) + else if ( bits256_cmp(pubkey,desthash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) return(-1); @@ -1096,7 +1096,7 @@ int32_t bitcoin_coinptrs(struct supernet_info *myinfo,struct iguana_info **bobco return(0); } -struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t optionduration) +struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration) { struct iguana_info *coin,*bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; @@ -1168,7 +1168,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil swap->I.choosei = -swap->I.choosei; swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; - swap->I.myhash = myinfo->myaddr.persistent; + swap->I.myhash = pubkey25519; if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) { swap->I.otherhash = swap->I.req.desthash; @@ -1186,46 +1186,46 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil printf("neither src nor dest error\n"); return(0); } - if ( (bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(myinfo,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); } - if ( bits256_nonz(myinfo->persistent_priv) == 0 || (x= instantdex_pubkeyargs(myinfo,swap,2 + INSTANTDEX_DECKSIZE,myinfo->persistent_priv,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { printf("couldnt generate privkeys %d\n",x); return(0); } if ( swap->I.iambob != 0 ) { - basilisk_rawtx_setparms("myfee",myinfo,swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("otherfee",myinfo,swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); - bobpub33 = myinfo->persistent_pubkey33; + basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + bobpub33 = pubkey33; } else { - basilisk_rawtx_setparms("otherfee",myinfo,swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("myfee",myinfo,swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); - alicepub33 = myinfo->persistent_pubkey33; + basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + alicepub33 = pubkey33; } - basilisk_rawtx_setparms("bobdeposit",myinfo,swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); - basilisk_rawtx_setparms("bobrefund",myinfo,swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); + basilisk_rawtx_setparms("bobdeposit",swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); + basilisk_rawtx_setparms("bobrefund",swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); swap->bobrefund.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("aliceclaim",myinfo,swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); + basilisk_rawtx_setparms("aliceclaim",swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); swap->aliceclaim.I.suppress_pubkeys = 1; swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; - basilisk_rawtx_setparms("bobpayment",myinfo,swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); - basilisk_rawtx_setparms("alicespend",myinfo,swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); + basilisk_rawtx_setparms("bobpayment",swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); + basilisk_rawtx_setparms("alicespend",swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); swap->alicespend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("bobreclaim",myinfo,swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); + basilisk_rawtx_setparms("bobreclaim",swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); swap->bobreclaim.I.suppress_pubkeys = 1; swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; - basilisk_rawtx_setparms("alicepayment",myinfo,swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); - basilisk_rawtx_setparms("bobspend",myinfo,swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); + basilisk_rawtx_setparms("alicepayment",swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); + basilisk_rawtx_setparms("bobspend",swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); swap->bobspend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("alicereclaim",myinfo,swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); + basilisk_rawtx_setparms("alicereclaim",swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); swap->alicereclaim.I.suppress_pubkeys = 1; printf("IAMBOB.%d\n",swap->I.iambob); return(swap); @@ -1756,7 +1756,7 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; - myinfo = swap->myinfo; + myinfo = &swap->myinfo; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -1933,9 +1933,9 @@ void basilisk_swaploop(void *_swap) free(data); } -struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) { - int32_t i,m,n; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; + int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1949,9 +1949,15 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - swap->myinfo = myinfo; + //swap->myinfo = myinfo; + swap->myinfo.ctx = myinfo->ctx; + bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); + pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + swap->myinfo.persistent_priv = privkey; + swap->myinfo.myaddr.persistent = pubkey25519; + memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo,swap,optionduration) != 0 ) + if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 9f7e972c1..c09076a46 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -386,6 +386,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.95); jaddnum(vals,"minprice",kmdprice*.95); + jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 89d25f734..e724e828b 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -152,6 +152,17 @@ struct supernet_info uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; +struct basilisk_swap +{ + struct supernet_info myinfo; struct iguana_info *bobcoin,*alicecoin; + void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + struct basilisk_swapinfo I; + struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; + bits256 privkeys[INSTANTDEX_DECKSIZE]; + uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint8_t verifybuf[65536]; +}; + #include "../includes/iguana_funcs.h" #include "../includes/iguana_globals.h" #include "../gecko/gecko.h" diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 7d8e3b679..dffa53ed0 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -595,7 +595,7 @@ int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fil void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notaries,uint32_t ipbits); void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); -void basilisk_requests_poll(struct supernet_info *myinfo); +void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 59fa0eabf596cfbb1016cfa620e152cc00406f95 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:16:42 +0200 Subject: [PATCH 098/286] Test --- basilisk/basilisk_swap.c | 246 +++++++++++++++++++-------------------- basilisk/jumblr.c | 2 +- 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b9f785887..67bd43ae6 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -291,7 +291,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b #endif signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); - if ( (retstr= basilisk_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) + if ( (retstr= basilisk_sendrawtransaction(&swap->myinfo,coin,signedtx)) != 0 ) { if ( is_hexstr(retstr,0) == 64 ) { @@ -371,11 +371,11 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b jadd(txobj,"vin",vins); //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); - if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) + if ( (rawtxbytes= bitcoin_json2hex(&swap->myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { if ( needsig == 0 ) signedtx = rawtxbytes; - if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) + if ( signedtx != 0 || (signedtx= iguana_signrawtx(&swap->myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; dest->txbytes = calloc(1,dest->I.datalen); @@ -410,7 +410,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); - basilisk_txlog(myinfo,swap,&swap->otherfee,-1); + basilisk_txlog(&swap->myinfo,swap,&swap->otherfee,-1); return(0); } @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct supernet_info *myinfo,struct basilisk_ { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(&swap->myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -495,10 +495,10 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -506,7 +506,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ for (i=0; ialiceclaim.I.datalen; i++) printf("%02x",swap->aliceclaim.txbytes[i]); printf(" <- aliceclaim\n"); - basilisk_txlog(myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); + basilisk_txlog(&swap->myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); return(retval); } } @@ -518,12 +518,12 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); printf(" <- bobrefund.(%s)\n",bits256_str(str,swap->bobrefund.I.txid)); - basilisk_txlog(myinfo,swap,&swap->bobrefund,delay); + basilisk_txlog(&swap->myinfo,swap,&swap->bobrefund,delay); return(retval); } return(-1); @@ -541,12 +541,12 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); printf(" <- bobreclaim\n"); - basilisk_txlog(myinfo,swap,&swap->bobreclaim,delay); + basilisk_txlog(&swap->myinfo,swap,&swap->bobreclaim,delay); return(retval); } return(-1); @@ -556,13 +556,13 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -571,7 +571,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); swap->I.alicespent = 1; - basilisk_txlog(myinfo,swap,&swap->alicespend,-1); + basilisk_txlog(&swap->myinfo,swap,&swap->alicespend,-1); return(retval); } } @@ -583,13 +583,13 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; //printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); swap->I.bobspent = 1; - basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim + basilisk_txlog(&swap->myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); @@ -598,7 +598,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -726,7 +726,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis rawtx->I.locktime = locktime; //printf("%s locktime.%u\n",rawtx->name,locktime); V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(&swap->myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; @@ -737,7 +737,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; icoin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -746,7 +746,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -790,8 +790,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobpayment.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobpayment.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d\n",swap->bobpayment.I.datalen); - iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobpayment.vins); - basilisk_bobpayment_reclaim(myinfo,swap,swap->I.callduration); + iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobpayment.vins); + basilisk_bobpayment_reclaim(&swap->myinfo,swap,swap->I.callduration); printf("bobscripts set completed\n"); return(0); } @@ -823,8 +823,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobdeposit.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobdeposit.redeemlen); //printf("GENERATED BOB DEPOSIT\n"); - iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobdeposit.vins); - basilisk_bobdeposit_refund(myinfo,swap,swap->I.putduration); + iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobdeposit.vins); + basilisk_bobdeposit_refund(&swap->myinfo,swap,swap->I.putduration); printf("bobscripts set completed\n"); return(0); } @@ -856,7 +856,7 @@ int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *da swap->I.privAm = privkey; vcalc_sha256(0,swap->I.secretAm256,privkey.bytes,sizeof(privkey)); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); - basilisk_bobscripts_set(myinfo,swap,0,1); + basilisk_bobscripts_set(&swap->myinfo,swap,0,1); } else { @@ -875,19 +875,19 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 { struct basilisk_swap *swap = ptr; if ( internal_func != 0 ) - return((*internal_func)(myinfo,swap,data,datalen)); + return((*internal_func)(&swap->myinfo,swap,data,datalen)); else return(0); } int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { int32_t datalen; uint32_t crc; - if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) { if ( datalen > 0 && datalen < maxlen ) { memcpy(data,swap->verifybuf,datalen); - return((*basilisk_verify_func)(myinfo,swap,data,datalen)); + return((*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)); } } return(-1); @@ -896,10 +896,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) + // basilisk_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); + //if ( basilisk_crcsend(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + dex_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 return(0); } @@ -927,16 +927,16 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { } - if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); - return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); + return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->alicereclaim)); } } return(-1); @@ -944,14 +944,14 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swap *swap) { - if ( basilisk_priviextract(myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) { } if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); - return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); + return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend)); } return(-1); } @@ -1266,7 +1266,7 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap { myinfo->swaps[i] = myinfo->swaps[--myinfo->numswaps]; myinfo->swaps[myinfo->numswaps] = 0; - basilisk_swap_finished(myinfo,swap); + basilisk_swap_finished(&swap->myinfo,swap); break; } portable_mutex_unlock(&myinfo->DEX_swapmutex); @@ -1358,7 +1358,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretAm[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretAm256[i] = data[len++]; - basilisk_bobscripts_set(myinfo,swap,1,1); + basilisk_bobscripts_set(&swap->myinfo,swap,1,1); } else { @@ -1368,7 +1368,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretBn[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretBn256[i] = data[len++]; - //basilisk_bobscripts_set(myinfo,swap,0); + //basilisk_bobscripts_set(&swap->myinfo,swap,0); } } else printf("failed verification: wrong firstbyte.%d errs.%d\n",wrongfirstbyte,errs); } @@ -1379,7 +1379,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) { uint8_t sendbuf[32768]; int32_t sendlen; - if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) + if ( basilisk_swapdata_rawtx(&swap->myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) { @@ -1400,7 +1400,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + return(basilisk_swapsend(&swap->myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); } } return(nextbits); @@ -1411,9 +1411,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); + datalen = basilisk_swapdata_deck(&swap->myinfo,swap,data,maxlen); //printf("send deck.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1421,7 +1421,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw if ( (swap->I.statebits & 0x02) == 0 ) { //printf("check for other deck\n"); - if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) swap->I.statebits |= 0x02; else return(-1); } @@ -1432,7 +1432,7 @@ void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap, { int32_t datalen; datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); + basilisk_swapsend(&swap->myinfo,swap,0x80000000,data,datalen,0,0); } void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1455,14 +1455,14 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa data[datalen++] = swap->I.pubA1.bytes[i]; printf("SEND pubA0/1 %s\n",bits256_str(str,swap->I.pubA0)); } - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); } void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { uint8_t pubkey33[33]; //char str[65],str2[65]; //printf("check otherchoosei\n"); - if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { if ( swap->I.iambob != 0 ) { @@ -1474,7 +1474,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); - basilisk_bobscripts_set(myinfo,swap,1,1); + basilisk_bobscripts_set(&swap->myinfo,swap,1,1); } } else @@ -1487,7 +1487,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); - //basilisk_bobscripts_set(myinfo,swap,0); + //basilisk_bobscripts_set(&swap->myinfo,swap,0); } } swap->I.statebits |= 0x08; @@ -1522,7 +1522,7 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s data[datalen++] = swap->I.secretAm256[i]; } //printf("send privkeys.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) @@ -1539,22 +1539,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { - if ( basilisk_swapget(myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) { // verify and submit otherfee swap->I.statebits |= 0x80; - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); } } - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; sleep(3 + (swap->I.iambob == 0)*1); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1566,13 +1566,13 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) { printf("check alicepayment\n"); - if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; printf("got alicepayment\n"); @@ -1580,7 +1580,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1588,25 +1588,25 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x4000) == 0 ) { - basilisk_bobscripts_set(myinfo,swap,0,1); + basilisk_bobscripts_set(&swap->myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm + if ( basilisk_swapget(&swap->myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(&swap->myinfo,swap) == 0 ) // divulges privAm { printf("got privi spend alicepayment\n"); - basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend); + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); else { - tradebot_swap_balancingtrade(myinfo,swap,1); + tradebot_swap_balancingtrade(&swap->myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(&swap->myinfo,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1622,14 +1622,14 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1648,7 +1648,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x200) == 0 ) { printf("checkfor deposit\n"); - if ( basilisk_swapget(myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) { // verify deposit and submit, set confirmed height printf("got bobdeposit\n"); @@ -1657,7 +1657,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1666,22 +1666,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) { - if ( basilisk_swapget(myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) + if ( basilisk_swapget(&swap->myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) { printf("got bobpayment\n"); - tradebot_swap_balancingtrade(myinfo,swap,0); + tradebot_swap_balancingtrade(&swap->myinfo,swap,0); // verify payment and submit, set confirmed height swap->I.statebits |= 0x8000; } } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1690,17 +1690,17 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(&swap->myinfo,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; printf("send privAm\n"); - swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); } } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(&swap->myinfo,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1710,7 +1710,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1718,11 +1718,11 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap retval = 1; } } - else if ( basilisk_privBn_extract(myinfo,swap,data,maxlen) == 0 ) + else if ( basilisk_privBn_extract(&swap->myinfo,swap,data,maxlen) == 0 ) { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -1734,8 +1734,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); sleep(3 + (swap->I.iambob == 0)); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } return(retval); } @@ -1766,33 +1766,33 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); - dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 + //basilisk_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); + dex_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendpubkeys(&swap->myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(&swap->myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); + basilisk_waitchoosei(&swap->myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; sleep(1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_sendmostprivs(myinfo,swap,data,maxlen); - if ( basilisk_swapget(myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); + basilisk_sendmostprivs(&swap->myinfo,swap,data,maxlen); + if ( basilisk_swapget(&swap->myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) { swap->I.statebits |= 0x20; break; } sleep(3 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1800,12 +1800,12 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); printf("sendstate.%x\n",swap->I.statebits); - basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); printf("swapget\n"); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { @@ -1839,11 +1839,11 @@ void basilisk_swaploop(void *_swap) for (i=0; i<32; i++) printf("%02x",swap->pubB1.bytes[i]); printf(" <- pubB1\n");*/ - basilisk_txlog(myinfo,swap,0,-1); + basilisk_txlog(&swap->myinfo,swap,0,-1); if ( swap->I.iambob != 0 ) { printf("bobscripts set\n"); - if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) + if ( basilisk_bobscripts_set(&swap->myinfo,swap,1,1) < 0 ) { sleep(3); printf("bobscripts set error\n"); @@ -1856,7 +1856,7 @@ void basilisk_swaploop(void *_swap) { //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; - basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); + basilisk_alicepayment(&swap->myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); @@ -1868,8 +1868,8 @@ void basilisk_swaploop(void *_swap) for (i=0; ialicepayment.I.spendlen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); - iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); - basilisk_txlog(myinfo,swap,&swap->alicepayment,-1); + iguana_unspents_mark(&swap->myinfo,swap->alicecoin,swap->alicepayment.vins); + basilisk_txlog(&swap->myinfo,swap,&swap->alicepayment,-1); break; } } @@ -1878,9 +1878,9 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); - iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); - basilisk_txlog(myinfo,swap,&swap->myfee,-1); + swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + iguana_unspents_mark(&swap->myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); + basilisk_txlog(&swap->myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); @@ -1895,22 +1895,22 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) + while ( basilisk_swapiteration(&swap->myinfo,swap,data,maxlen) == 0 ) { sleep(3); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + dpow_nanomsg_update(&swap->myinfo); + dex_updateclient(&swap->myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { printf("BOB reclaims refund\n"); - basilisk_bobdeposit_refund(myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + basilisk_bobdeposit_refund(&swap->myinfo,swap,0); + if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } @@ -1919,17 +1919,17 @@ void basilisk_swaploop(void *_swap) // maybe wait for bobrefund to be confirmed for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privBn.bytes[j]; - basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); + basilisk_swapsend(&swap->myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } } - if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed + if ( swapcompleted(&swap->myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) - tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); - else tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); + tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); + else tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); } printf("%s swap finished statebits %x\n",swap->I.iambob!=0?"BOB":"ALICE",swap->I.statebits); - basilisk_swap_purge(myinfo,swap); + basilisk_swap_purge(&swap->myinfo,swap); free(data); } diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c09076a46..2530a51b4 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,7 +384,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.95); + jaddnum(vals,"amount",btcavail*.85); jaddnum(vals,"minprice",kmdprice*.95); jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); From f512da63ae8e49d64433bd808fbe1f89ea7ac1bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:25:40 +0200 Subject: [PATCH 099/286] Test --- iguana/dpow/dpow_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7cac5a7ea..3c24aca37 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -257,7 +257,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; //for (i=0; ihandler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + printf(" uniq.%s DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",dexp->handler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( strcmp(dexp->handler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) { if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) @@ -306,7 +306,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 //prio = 8; //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDPRIO,&prio,sizeof(prio)); //nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVPRIO,&prio,sizeof(prio)); - } + } if ( reqsock >= 0 ) { if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) @@ -368,7 +368,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 if ( nn_poll(&pfd,1,100) > 0 ) { sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - //printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); + printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); break; } usleep(1000); From ba1b581f0c0ba939b39e9c28773311f7e321f159 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:31:24 +0200 Subject: [PATCH 100/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3c24aca37..09af1a04c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -257,9 +257,9 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; //for (i=0; ihandler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( strcmp(dexp->handler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) { + printf(" uniq.%s DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",dexp->handler,size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) free(retstr); } From 3f25ae3c3c663227d2147136d35f7d9349e119f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:33:59 +0200 Subject: [PATCH 101/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 09af1a04c..9a69085e5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1091,7 +1091,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp if ( dexp->datalen == (size - sizeof(*dexp)) ) { crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); - if ( dexp->crc32 == crc32 )//&& (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) + if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); From 383c4ae79a43391597c347e9d4a3d614ebe9f401 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:38:24 +0200 Subject: [PATCH 102/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9a69085e5..e5d50a111 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1093,7 +1093,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); - else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); + //else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); } return(-1); From 8c8b249f57f44cc8cf85bf5bdb34c8825f847c3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:38:56 +0200 Subject: [PATCH 103/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e5d50a111..d68b36283 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2010,7 +2010,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); - } else printf("failed dexpacketcheck\n"); + } //else printf("failed dexpacketcheck\n"); } //printf("GOT DEX rep PACKET.%d\n",size); //if ( freeptr != 0 ) From b1087ee2106bc8ee9d328313a9f12dec88cd5f20 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 19:50:12 +0200 Subject: [PATCH 104/286] Test --- basilisk/basilisk_MSG.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 4cf5b5f49..156cbef3d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -217,7 +217,11 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; portable_mutex_unlock(&myinfo->messagemutex); -printf("add message keylen.%d [%d]\n",msg->keylen,datalen); + { + bits256 srchash,desthash; uint32_t channel,msgid; + basilisk_messagekeyread(key,&channel,&msgid,&srchash,&desthash); + printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); + } //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); if ( sendping != 0 ) From 973fa0bbe767d11cf3217e55c88cd1a121d1a1be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:26:00 +0200 Subject: [PATCH 105/286] Test --- basilisk/basilisk_MSG.c | 12 +++++++++ basilisk/basilisk_swap.c | 51 +++++++++++++++++++++++++++++--------- basilisk/jumblr.c | 2 +- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 26 ++++++++++++++++--- iguana/main.c | 2 +- 6 files changed, 77 insertions(+), 18 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 156cbef3d..4f7ccc9ab 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -263,6 +263,18 @@ char *basilisk_respond_MSG(struct supernet_info *myinfo,char *CMD,void *addr,cha return(retstr); } +cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr) +{ + cJSON *valsobj,*retjson = 0; char *retstr; + if ( (valsobj= cJSON_Parse(jsonstr)) != 0 ) + { + retstr = basilisk_iterate_MSG(myinfo,juint(valsobj,"channel"),juint(valsobj,"msgid"),jbits256(valsobj,"srchash"),jbits256(valsobj,"desthash"),juint(valsobj,"width")); + retjson = cJSON_Parse(retstr); + free(retstr); + } + return(retjson); +} + #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 67bd43ae6..c94fa93d7 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -414,7 +414,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t return(0); } -int32_t basilisk_rawtx_spendscript(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) +int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; datalen = recvbuf[0]; @@ -495,7 +495,7 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) @@ -556,7 +556,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; @@ -598,7 +598,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(&swap->myinfo,swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -881,16 +881,43 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - int32_t datalen; uint32_t crc; - if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) - { - if ( datalen > 0 && datalen < maxlen ) + cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; + //int32_t datalen; uint32_t crc; + //if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + valsobj = cJSON_CreateObject(); + jaddnum(valsobj,"channel",swap->I.req.quoteid); + jaddnum(valsobj,"msgid",msgbits); + jaddbits256(valsobj,"srchash",swap->I.otherhash); + jaddbits256(valsobj,"desthash",swap->I.myhash); + jaddnum(valsobj,"width",0); + if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) { - memcpy(data,swap->verifybuf,datalen); - return((*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; i> 1; + if ( datalen > 0 && datalen < maxlen ) + { + decode_hex(data,datalen,hexstr); + if ( (retval= (*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)) == 0 ) + { + break; + } + } + } + } + } + free_json(array); } + free(retstr); } - return(-1); + return(retval); } uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) @@ -1949,7 +1976,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - //swap->myinfo = myinfo; + swap->myinfo = *myinfo; swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 2530a51b4..e1ffb7f58 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -413,7 +413,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index e6e8f9d80..7ddef6ce3 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -167,6 +167,7 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char *key,char *value,int32_t flags); cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key); void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); +cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -178,6 +179,7 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 char *_dex_gettxin(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent2(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listspent(struct supernet_info *myinfo,char *symbol,char *address); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d68b36283..87985e7d3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -416,14 +416,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//#ifndef __APPLE__ +#ifndef __APPLE__ if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -//#endif +#endif } } if ( freeptr != 0 ) @@ -644,6 +644,14 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'M' ) + { + if ( (retjson= dpow_getmessage(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'N' ) { uint8_t pubkeys[64][33]; char str[128]; int32_t numnotaries; cJSON *array,*item; @@ -993,6 +1001,15 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre return(_dex_sendrequeststr(myinfo,&dexreq,address,0,1,"")); } +char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'M'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; @@ -1992,8 +2009,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) free(retstr); if ( broadcastflag != 0 ) { - //printf("BROADCAST dexp request.[%d]\n",size); + printf("BROADCAST dexp request.[%d]\n",size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); } } else @@ -2007,7 +2025,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } //else printf("failed dexpacketcheck\n"); diff --git a/iguana/main.c b/iguana/main.c index 55ca8824c..986764423 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,7 +747,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From da18970c671c6f5676a4f8bdad2f85a83adf3aed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:32:14 +0200 Subject: [PATCH 106/286] Test --- basilisk/basilisk_MSG.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 4f7ccc9ab..cacf9f0e5 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,7 +400,10 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - if ( (retstr= basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0)) != 0 ) + if ( myinfo->IAMNOTARY != 0 ) + retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); + else retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); + if ( retstr != 0 ) { printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 12b1b22de7a229d9876c2de4d77f19138f387200 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:32:41 +0200 Subject: [PATCH 107/286] Test --- basilisk/basilisk_MSG.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index cacf9f0e5..b7541bb96 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -402,10 +402,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddbits256(valsobj,"desthash",desthash); if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - else retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - if ( retstr != 0 ) + else { + retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); + } + if ( retstr != 0 ) + { if ( (retarray= cJSON_Parse(retstr)) != 0 ) { if ( is_cJSON_Array(retarray) == 0 ) From cf225f8aefdca1219ac503ffe24e86a71954f882 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:39:37 +0200 Subject: [PATCH 108/286] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 7d0aafeb2..564a30f23 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+13 ) + if ( time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); From 435cb374b2b95ddc1752f68326fafca3992e2fed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:42:35 +0200 Subject: [PATCH 109/286] Test --- basilisk/basilisk_DEX.c | 2 +- iguana/tests/notlp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/notlp diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 564a30f23..e8036287e 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) + if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); diff --git a/iguana/tests/notlp b/iguana/tests/notlp new file mode 100755 index 000000000..b29c9dde7 --- /dev/null +++ b/iguana/tests/notlp @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"notlp\"}" From eb1ee31610432afadad8ba46eb6ef769e42e6a14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:43:38 +0200 Subject: [PATCH 110/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e1ffb7f58..a53d05069 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -369,7 +369,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch static double kmdprice,pending; static uint32_t lasttime; double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc; cJSON *vals; bits256 hash; char *retstr; coinbtc = iguana_coinfind("BTC"); - if ( kmdprice == 0. || time(NULL) > lasttime+600 ) + if ( kmdprice == 0. || time(NULL) > lasttime+60 ) { kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); lasttime = (uint32_t)time(NULL); From 889018be37d1f0e7e49c31928e7c6cb8d8d62f99 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:51:17 +0200 Subject: [PATCH 111/286] Test --- basilisk/jumblr.c | 12 ++---------- iguana/main.c | 17 ++++++++++++----- includes/iguana_funcs.h | 1 + 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a53d05069..5272bd8f3 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -395,22 +395,14 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch free(retstr); } // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" - } else printf("btcavail %.8f\n",btcavail); - } + } else printf("btcavail %.8f pending %.8f\n",btcavail,pending); + } else printf("null kmdprice %.8f\n",kmdprice); } void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - if ( time(NULL) > lasttime+60 ) - { - // if BTC has arrived in deposit address, invoke DEX -> KMD - // if BTC has arrived in destination address, invoke DEX -> BTC - jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); - lasttime = (uint32_t)time(NULL); - } fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); //r = 0; diff --git a/iguana/main.c b/iguana/main.c index 986764423..8b06d5deb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -747,16 +747,23 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { - t = (uint32_t)time(NULL); - if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) + if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 ) { - jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + // if BTC has arrived in deposit address, invoke DEX -> KMD + // if BTC has arrived in destination address, invoke DEX -> BTC + jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); + t = (uint32_t)time(NULL); + if ( myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) + { + jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); + } + //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); } - //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); sleep(55); } } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index dffa53ed0..b60b72b8a 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -615,6 +615,7 @@ int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *ref bits256 mpz_div64(bits256 hash,uint64_t divval); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); +void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins); From 0fcaaab67a539693f15550690d15a16faec7ac72 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 4 Mar 2017 23:55:07 +0200 Subject: [PATCH 112/286] Test --- iguana/iguana_notary.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index c9532e3c0..2d718e6ba 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -615,7 +615,7 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout) TWO_STRINGS(dex,listunspent,symbol,address) { - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->blocktrail_apikey[0] != 0 ) { char url[1024],*retstr,*coinaddr,*script; int32_t i,n,vout; cJSON *retjson,*data,*item,*item3,*data3; bits256 txid; uint64_t val; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/unspent-outputs?api_key=%s",address,myinfo->blocktrail_apikey); @@ -670,7 +670,7 @@ TWO_STRINGS(dex,listunspent,symbol,address) TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->IAMLP != 0 ) + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 && coin->FULLNODE == 0 && myinfo->blocktrail_apikey[0] != 0 ) { char url[1024],*retstr,*retstr2; cJSON *retjson,*retjson2,*retjson3,*data,*data2; int32_t i,n; sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s/transactions?api_key=%s",address,myinfo->blocktrail_apikey); @@ -860,7 +860,7 @@ TWO_STRINGS(dex,getbalance,symbol,address) } if ( symbol != 0 && address != 0 ) { - if ( strcmp(symbol,"BTC") == 0 && myinfo->IAMLP != 0 ) + if ( strcmp(symbol,"BTC") == 0 && myinfo->blocktrail_apikey[0] != 0 ) { sprintf(url,"https://api.blocktrail.com/v1/btc/address/%s?api_key=%s",address,myinfo->blocktrail_apikey); if ( (retstr= issue_curl(url)) != 0 ) From c7b4b26b92a8b12d886bea35739a70a6bbc00a83 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:04:07 +0200 Subject: [PATCH 113/286] Test --- basilisk/basilisk_MSG.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index b7541bb96..33de5aa2f 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -434,7 +434,7 @@ int32_t basilisk_process_retarray(struct supernet_info *myinfo,void *ptr,int32_t item = jitem(retarray,i); if ( jobj(item,"error") != 0 ) continue; - //printf("(%s).%d ",jprint(item,0),i); + printf("(%s).%d ",jprint(item,0),i); if ( (datalen= basilisk_message_returned(key,data,maxlen,item)) > 0 ) { duration = juint(item,"duration"); From 9bb36b37a4e1dcf296bf03988f7d681541e9f1fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:13:13 +0200 Subject: [PATCH 114/286] Test --- basilisk/basilisk_MSG.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 33de5aa2f..be288096b 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,13 +400,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - if ( myinfo->IAMNOTARY != 0 ) + //if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - else + /*else { retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); - } + }*/ if ( retstr != 0 ) { if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 31b91361b50fa81eaf3976f989c91cf371744a3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:17:41 +0200 Subject: [PATCH 115/286] Test --- basilisk/basilisk_MSG.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index be288096b..33de5aa2f 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -400,13 +400,13 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 jaddnum(valsobj,"numrequired",1); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - //if ( myinfo->IAMNOTARY != 0 ) + if ( myinfo->IAMNOTARY != 0 ) retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); - /*else + else { retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); - }*/ + } if ( retstr != 0 ) { if ( (retarray= cJSON_Parse(retstr)) != 0 ) From 41f21d67f97b0ba20bc028cec0b5609394b97088 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:27:27 +0200 Subject: [PATCH 116/286] Test --- basilisk/basilisk_swap.c | 252 +++++++++++++++++++-------------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index c94fa93d7..893030f84 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -291,7 +291,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b #endif signedtx = malloc(datalen*2 + 1); init_hexbytes_noT(signedtx,data,datalen); - if ( (retstr= basilisk_sendrawtransaction(&swap->myinfo,coin,signedtx)) != 0 ) + if ( (retstr= basilisk_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) { if ( is_hexstr(retstr,0) == 64 ) { @@ -371,11 +371,11 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b jadd(txobj,"vin",vins); //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); - if ( (rawtxbytes= bitcoin_json2hex(&swap->myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) + if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { if ( needsig == 0 ) signedtx = rawtxbytes; - if ( signedtx != 0 || (signedtx= iguana_signrawtx(&swap->myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) + if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; dest->txbytes = calloc(1,dest->I.datalen); @@ -410,7 +410,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); - basilisk_txlog(&swap->myinfo,swap,&swap->otherfee,-1); + basilisk_txlog(myinfo,swap,&swap->otherfee,-1); return(0); } @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(&swap->myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -498,7 +498,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -506,7 +506,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ for (i=0; ialiceclaim.I.datalen; i++) printf("%02x",swap->aliceclaim.txbytes[i]); printf(" <- aliceclaim\n"); - basilisk_txlog(&swap->myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); + basilisk_txlog(myinfo,swap,&swap->aliceclaim,swap->I.putduration+swap->I.callduration); return(retval); } } @@ -518,12 +518,12 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); printf(" <- bobrefund.(%s)\n",bits256_str(str,swap->bobrefund.I.txid)); - basilisk_txlog(&swap->myinfo,swap,&swap->bobrefund,delay); + basilisk_txlog(myinfo,swap,&swap->bobrefund,delay); return(retval); } return(-1); @@ -541,12 +541,12 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); printf(" <- bobreclaim\n"); - basilisk_txlog(&swap->myinfo,swap,&swap->bobreclaim,delay); + basilisk_txlog(myinfo,swap,&swap->bobreclaim,delay); return(retval); } return(-1); @@ -562,7 +562,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -571,7 +571,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * printf("%02x",swap->alicespend.txbytes[i]); printf(" <- alicespend\n\n"); swap->I.alicespent = 1; - basilisk_txlog(&swap->myinfo,swap,&swap->alicespend,-1); + basilisk_txlog(myinfo,swap,&swap->alicespend,-1); return(retval); } } @@ -583,13 +583,13 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; //printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(&swap->myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); swap->I.bobspent = 1; - basilisk_txlog(&swap->myinfo,swap,dest,0); // bobspend or alicereclaim + basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); @@ -726,7 +726,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis rawtx->I.locktime = locktime; //printf("%s locktime.%u\n",rawtx->name,locktime); V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(&swap->myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; @@ -737,7 +737,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; imyinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -746,7 +746,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(&swap->myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -790,8 +790,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobpayment.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobpayment.redeemlen); printf(" <- GENERATED BOB PAYMENT.%d\n",swap->bobpayment.I.datalen); - iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobpayment.vins); - basilisk_bobpayment_reclaim(&swap->myinfo,swap,swap->I.callduration); + iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobpayment.vins); + basilisk_bobpayment_reclaim(myinfo,swap,swap->I.callduration); printf("bobscripts set completed\n"); return(0); } @@ -823,8 +823,8 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa // printf("%02x",swap->bobdeposit.redeemscript[j]); //printf(" <- redeem.%d\n",swap->bobdeposit.redeemlen); //printf("GENERATED BOB DEPOSIT\n"); - iguana_unspents_mark(&swap->myinfo,swap->bobcoin,swap->bobdeposit.vins); - basilisk_bobdeposit_refund(&swap->myinfo,swap,swap->I.putduration); + iguana_unspents_mark(myinfo,swap->bobcoin,swap->bobdeposit.vins); + basilisk_bobdeposit_refund(myinfo,swap,swap->I.putduration); printf("bobscripts set completed\n"); return(0); } @@ -856,7 +856,7 @@ int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *da swap->I.privAm = privkey; vcalc_sha256(0,swap->I.secretAm256,privkey.bytes,sizeof(privkey)); printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); - basilisk_bobscripts_set(&swap->myinfo,swap,0,1); + basilisk_bobscripts_set(myinfo,swap,0,1); } else { @@ -875,7 +875,7 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 { struct basilisk_swap *swap = ptr; if ( internal_func != 0 ) - return((*internal_func)(&swap->myinfo,swap,data,datalen)); + return((*internal_func)(myinfo,swap,data,datalen)); else return(0); } @@ -883,7 +883,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; //int32_t datalen; uint32_t crc; - //if ( (crc= basilisk_crcrecv(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) + //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) valsobj = cJSON_CreateObject(); jaddnum(valsobj,"channel",swap->I.req.quoteid); jaddnum(valsobj,"msgid",msgbits); @@ -905,7 +905,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( datalen > 0 && datalen < maxlen ) { decode_hex(data,datalen,hexstr); - if ( (retval= (*basilisk_verify_func)(&swap->myinfo,swap,data,datalen)) == 0 ) + if ( (retval= (*basilisk_verify_func)(myinfo,swap,data,datalen)) == 0 ) { break; } @@ -923,10 +923,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(&swap->myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) + // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); + //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(&swap->myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 return(0); } @@ -954,16 +954,16 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { } - if ( basilisk_swapget(&swap->myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); - return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->alicereclaim)); + return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); } } return(-1); @@ -971,14 +971,14 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swap *swap) { - if ( basilisk_priviextract(&swap->myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) + if ( basilisk_priviextract(myinfo,swap->bobcoin,"privAm",&swap->I.privAm,swap->I.secretAm,swap->bobpayment.I.actualtxid,0) == 0 ) { } if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); - return(basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend)); + return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); } return(-1); } @@ -1293,7 +1293,7 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap { myinfo->swaps[i] = myinfo->swaps[--myinfo->numswaps]; myinfo->swaps[myinfo->numswaps] = 0; - basilisk_swap_finished(&swap->myinfo,swap); + basilisk_swap_finished(myinfo,swap); break; } portable_mutex_unlock(&myinfo->DEX_swapmutex); @@ -1385,7 +1385,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretAm[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretAm256[i] = data[len++]; - basilisk_bobscripts_set(&swap->myinfo,swap,1,1); + basilisk_bobscripts_set(myinfo,swap,1,1); } else { @@ -1395,7 +1395,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t swap->I.secretBn[i] = data[len++]; for (i=0; i<32; i++) swap->I.secretBn256[i] = data[len++]; - //basilisk_bobscripts_set(&swap->myinfo,swap,0); + //basilisk_bobscripts_set(myinfo,swap,0); } } else printf("failed verification: wrong firstbyte.%d errs.%d\n",wrongfirstbyte,errs); } @@ -1406,7 +1406,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) { uint8_t sendbuf[32768]; int32_t sendlen; - if ( basilisk_swapdata_rawtx(&swap->myinfo,swap,data,maxlen,rawtx) != 0 ) + if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) { @@ -1427,7 +1427,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(&swap->myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); } } return(nextbits); @@ -1438,9 +1438,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - datalen = basilisk_swapdata_deck(&swap->myinfo,swap,data,maxlen); + datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); //printf("send deck.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1448,7 +1448,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw if ( (swap->I.statebits & 0x02) == 0 ) { //printf("check for other deck\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) swap->I.statebits |= 0x02; else return(-1); } @@ -1459,7 +1459,7 @@ void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap, { int32_t datalen; datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - basilisk_swapsend(&swap->myinfo,swap,0x80000000,data,datalen,0,0); + basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) @@ -1482,14 +1482,14 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa data[datalen++] = swap->I.pubA1.bytes[i]; printf("SEND pubA0/1 %s\n",bits256_str(str,swap->I.pubA0)); } - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04,swap->I.crcs_mychoosei); } void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { uint8_t pubkey33[33]; //char str[65],str2[65]; //printf("check otherchoosei\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { if ( swap->I.iambob != 0 ) { @@ -1501,7 +1501,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); - basilisk_bobscripts_set(&swap->myinfo,swap,1,1); + basilisk_bobscripts_set(myinfo,swap,1,1); } } else @@ -1514,7 +1514,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); - //basilisk_bobscripts_set(&swap->myinfo,swap,0); + //basilisk_bobscripts_set(myinfo,swap,0); } } swap->I.statebits |= 0x08; @@ -1549,7 +1549,7 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s data[datalen++] = swap->I.secretAm256[i]; } //printf("send privkeys.%d\n",datalen); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) @@ -1566,22 +1566,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { - if ( basilisk_swapget(&swap->myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x80,data,maxlen,basilisk_verify_otherfee) == 0 ) { // verify and submit otherfee swap->I.statebits |= 0x80; - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendstate(myinfo,swap,data,maxlen); } } - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; - sleep(3 + (swap->I.iambob == 0)*1); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + sleep(13 + (swap->I.iambob == 0)*1); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1593,13 +1593,13 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) { printf("check alicepayment\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; printf("got alicepayment\n"); @@ -1607,7 +1607,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1615,25 +1615,25 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x4000) == 0 ) { - basilisk_bobscripts_set(&swap->myinfo,swap,0,1); + basilisk_bobscripts_set(myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_swapget(&swap->myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(&swap->myinfo,swap) == 0 ) // divulges privAm + if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { printf("got privi spend alicepayment\n"); - basilisk_alicepayment_spend(&swap->myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); else { - tradebot_swap_balancingtrade(&swap->myinfo,swap,1); + tradebot_swap_balancingtrade(myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(&swap->myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1649,14 +1649,14 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1675,7 +1675,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x200) == 0 ) { printf("checkfor deposit\n"); - if ( basilisk_swapget(&swap->myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x200,data,maxlen,basilisk_verify_bobdeposit) == 0 ) { // verify deposit and submit, set confirmed height printf("got bobdeposit\n"); @@ -1684,7 +1684,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1693,22 +1693,22 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) { - if ( basilisk_swapget(&swap->myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) + if ( basilisk_swapget(myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) { printf("got bobpayment\n"); - tradebot_swap_balancingtrade(&swap->myinfo,swap,0); + tradebot_swap_balancingtrade(myinfo,swap,0); // verify payment and submit, set confirmed height swap->I.statebits |= 0x8000; } } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1717,17 +1717,17 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(&swap->myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; printf("send privAm\n"); - swap->I.statebits |= basilisk_swapsend(&swap->myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); } } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(&swap->myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1737,7 +1737,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1745,11 +1745,11 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap retval = 1; } } - else if ( basilisk_privBn_extract(&swap->myinfo,swap,data,maxlen) == 0 ) + else if ( basilisk_privBn_extract(myinfo,swap,data,maxlen) == 0 ) { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -1760,9 +1760,9 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); - sleep(3 + (swap->I.iambob == 0)); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + sleep(13 + (swap->I.iambob == 0)); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } return(retval); } @@ -1793,33 +1793,33 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); - dex_channelsend(&swap->myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_sendpubkeys(&swap->myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(&swap->myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); - basilisk_waitchoosei(&swap->myinfo,swap,data,maxlen); // wait for choosei 0x08 + //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); + dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; - sleep(1); - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + sleep(10); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_sendchoosei(&swap->myinfo,swap,data,maxlen); - basilisk_sendmostprivs(&swap->myinfo,swap,data,maxlen); - if ( basilisk_swapget(&swap->myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_sendmostprivs(myinfo,swap,data,maxlen); + if ( basilisk_swapget(myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) { swap->I.statebits |= 0x20; break; } - sleep(3 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + sleep(13 + (swap->I.iambob == 0)*1); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1827,12 +1827,12 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); printf("sendstate.%x\n",swap->I.statebits); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); + basilisk_sendstate(myinfo,swap,data,maxlen); printf("swapget\n"); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { @@ -1866,11 +1866,11 @@ void basilisk_swaploop(void *_swap) for (i=0; i<32; i++) printf("%02x",swap->pubB1.bytes[i]); printf(" <- pubB1\n");*/ - basilisk_txlog(&swap->myinfo,swap,0,-1); + basilisk_txlog(myinfo,swap,0,-1); if ( swap->I.iambob != 0 ) { printf("bobscripts set\n"); - if ( basilisk_bobscripts_set(&swap->myinfo,swap,1,1) < 0 ) + if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) { sleep(3); printf("bobscripts set error\n"); @@ -1883,11 +1883,11 @@ void basilisk_swaploop(void *_swap) { //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; - basilisk_alicepayment(&swap->myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); + basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); - sleep(3); + sleep(13); } else { @@ -1895,8 +1895,8 @@ void basilisk_swaploop(void *_swap) for (i=0; ialicepayment.I.spendlen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); - iguana_unspents_mark(&swap->myinfo,swap->alicecoin,swap->alicepayment.vins); - basilisk_txlog(&swap->myinfo,swap,&swap->alicepayment,-1); + iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); + basilisk_txlog(myinfo,swap,&swap->alicepayment,-1); break; } } @@ -1905,9 +1905,9 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); - iguana_unspents_mark(&swap->myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); - basilisk_txlog(&swap->myinfo,swap,&swap->myfee,-1); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); + basilisk_txlog(myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); @@ -1922,22 +1922,22 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(&swap->myinfo,swap,data,maxlen) == 0 ) + while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { - sleep(3); - basilisk_sendstate(&swap->myinfo,swap,data,maxlen); - basilisk_swapget(&swap->myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + sleep(13); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(&swap->myinfo); - dex_updateclient(&swap->myinfo); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { printf("BOB reclaims refund\n"); - basilisk_bobdeposit_refund(&swap->myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(&swap->myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + basilisk_bobdeposit_refund(myinfo,swap,0); + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } @@ -1946,17 +1946,17 @@ void basilisk_swaploop(void *_swap) // maybe wait for bobrefund to be confirmed for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privBn.bytes[j]; - basilisk_swapsend(&swap->myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); + basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } } - if ( swapcompleted(&swap->myinfo,swap) > 0 ) // only if swap completed + if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) - tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); - else tradebot_pendingadd(&swap->myinfo,swapjson(&swap->myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); + tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.src,dstr(swap->I.req.srcamount),swap->I.req.dest,dstr(swap->I.req.destamount)); + else tradebot_pendingadd(myinfo,swapjson(myinfo,swap),swap->I.req.dest,dstr(swap->I.req.destamount),swap->I.req.src,dstr(swap->I.req.srcamount)); } printf("%s swap finished statebits %x\n",swap->I.iambob!=0?"BOB":"ALICE",swap->I.statebits); - basilisk_swap_purge(&swap->myinfo,swap); + basilisk_swap_purge(myinfo,swap); free(data); } From d9bfcad2985ee6c086025394ef9a75a531459495 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:29:17 +0200 Subject: [PATCH 117/286] Test --- basilisk/basilisk_swap.c | 10 +++++----- iguana/iguana777.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 893030f84..af2ab611f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -457,7 +457,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(myinfo,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -1783,7 +1783,7 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; - myinfo = &swap->myinfo; + myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); @@ -1976,13 +1976,13 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap = calloc(1,sizeof(*swap)); vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; - swap->myinfo = *myinfo; - swap->myinfo.ctx = myinfo->ctx; + swap->myinfoptr = myinfo; + /*swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); swap->myinfo.persistent_priv = privkey; swap->myinfo.myaddr.persistent = pubkey25519; - memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); + memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33);*/ m = n = 0; if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index e724e828b..782695f8d 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -154,7 +154,7 @@ struct supernet_info struct basilisk_swap { - struct supernet_info myinfo; struct iguana_info *bobcoin,*alicecoin; + struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; From 2b717a63d3cb030bfb45d22fbc2d13786147f568 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:38:05 +0200 Subject: [PATCH 118/286] Test --- basilisk/basilisk_swap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index af2ab611f..f01f125b0 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1977,12 +1977,12 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; - /*swap->myinfo.ctx = myinfo->ctx; + //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); - swap->myinfo.persistent_priv = privkey; - swap->myinfo.myaddr.persistent = pubkey25519; - memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33);*/ + //swap->myinfo.persistent_priv = privkey; + //swap->myinfo.myaddr.persistent = pubkey25519; + //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); m = n = 0; if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) { From f94a6d4ebc88cb638bd1a3879b115e7d6dcd740a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:44:02 +0200 Subject: [PATCH 119/286] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f01f125b0..e51e98d97 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1979,7 +1979,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap->myinfoptr = myinfo; //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); - pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + pubkey25519 = myinfo->myaddr.persistent;//curve25519(privkey,curve25519_basepoint9()); //swap->myinfo.persistent_priv = privkey; //swap->myinfo.myaddr.persistent = pubkey25519; //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); From c6129bdb68bec5374a941308002287a369747390 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 00:50:44 +0200 Subject: [PATCH 120/286] Test --- basilisk/jumblr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 5272bd8f3..1fd686e34 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,9 +384,9 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.85); + jaddnum(vals,"amount",btcavail*.25); jaddnum(vals,"minprice",kmdprice*.95); - jaddnum(vals,"usejumblr",1); + //jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) @@ -401,7 +401,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) { - static uint32_t lasttime; + //static uint32_t lasttime; char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); From 8ac4e64ecb7d344024ced7f7162bd81e33aa59fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:00:14 +0200 Subject: [PATCH 121/286] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index e8036287e..688ebc169 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -742,7 +742,7 @@ INT_ARG(InstantDEX,incoming,requestid) msgid = (uint32_t)time(NULL) + drift; if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) { - //printf("GOT.(%s)\n",jprint(retarray,0)); + printf("GOT.(%s)\n",jprint(retarray,0)); if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) { jaddstr(retjson,"result","success"); From 1760cc4fcb2824b63d52aa57715fb11aedd2bde6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:04:10 +0200 Subject: [PATCH 122/286] Test --- basilisk/jumblr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 1fd686e34..e001f5174 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -384,7 +384,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); jaddstr(vals,"dest","KMD"); - jaddnum(vals,"amount",btcavail*.25); + jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); //jaddnum(vals,"usejumblr",1); memset(hash.bytes,0,sizeof(hash)); From 456dbd41e482ce2b51f0f5b2d2cb613798d4c6ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:16:56 +0200 Subject: [PATCH 123/286] Test --- basilisk/basilisk_MSG.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 33de5aa2f..f7cfbec45 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -103,7 +103,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,srchash,desthash); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg0.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,desthash,srchash); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg0.(%s)\n",jprint(item,0)); @@ -113,7 +117,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,zero,desthash); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg1.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,desthash,zero); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg1.(%s)\n",jprint(item,0)); @@ -122,7 +130,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,srchash,zero); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg2.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } //keylen = basilisk_messagekey(key,channel,msgid,zero,srchash); //if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) // jaddi(array,item);//, printf("gotmsg2.(%s)\n",jprint(item,0)); @@ -131,7 +143,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ { keylen = basilisk_messagekey(key,channel,msgid,zero,zero); if ( (item= _basilisk_respond_getmessage(myinfo,key,keylen)) != 0 ) - jaddi(array,item);//, printf("gotmsg3.(%s)\n",jprint(item,0)); + { + jaddbits256(item,"src",srchash); + jaddbits256(item,"dest",desthash); + jaddi(array,item); + } } } msgid--; @@ -143,7 +159,11 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ if ( basilisk_msgcmp(msg,origwidth,channel,origmsgid,zero,zero) == 0 ) { if ( (msgjson= basilisk_msgjson(msg,msg->key,msg->keylen)) != 0 ) + { + jaddbits256(msgjson,"src",srchash); + jaddbits256(msgjson,"dest",desthash); jaddi(array,msgjson); + } } } if ( now > msg->expiration+60 ) @@ -404,8 +424,9 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); else { + char str[65],str2[65]; retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - printf("channel.%u msgid.%u gotmessage.(%d) %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)"); + printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); } if ( retstr != 0 ) { From b6dd4e69b4a5b0677b7b1129d42b9859f8dfffc6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:17:49 +0200 Subject: [PATCH 124/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 87985e7d3..f66fa7174 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -620,7 +620,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); if ( retstr == 0 ) { - *broadcastflagp = 1; + //*broadcastflagp = 1; retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); } else From 422a40f4b237a45a350d7b58f293033f7831ceed Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:28:02 +0200 Subject: [PATCH 125/286] Test --- iguana/dpow/dpow_network.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index f66fa7174..68623a4a6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -416,14 +416,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -#ifndef __APPLE__ - if ( (rand() % 100) < 40 ) +//#ifndef __APPLE__ + if ( 0 && (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -#endif +//#endif } } if ( freeptr != 0 ) From 1221e44f92621fadb3e6ab1179a264e014628f38 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:42:43 +0200 Subject: [PATCH 126/286] test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 68623a4a6..e568d62e5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1108,7 +1108,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp if ( dexp->datalen == (size - sizeof(*dexp)) ) { crc32 = calc_crc32(0,dexp->packet,dexp->datalen);//(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); - if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) + if ( dexp->crc32 == crc32 )//&& (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); //else printf("dexp %08x != %08x || firstz.%d < 0\n",dexp->crc32,crc32,firstz); } else printf("datalen.%d != (%d - %ld)\n",dexp->datalen,size,sizeof(*dexp)); From bb16797aa1146d460500f72b35f2fb59c3c0b7b6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 01:54:02 +0200 Subject: [PATCH 127/286] Test --- iguana/dpow/dpow_network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e568d62e5..86b53d7ee 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1119,6 +1119,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp int32_t dex_subsock_poll(struct supernet_info *myinfo) { int32_t size= -1; struct dex_nanomsghdr *dexp; void *freeptr; + return(0); //fprintf(stderr,"subsock.%d\n",myinfo->subsock); if ( myinfo->subsock >= 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->subsock,&dexp)) >= 0 ) { From c5426295f097becc10f1df4915064586586eae49 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 02:03:49 +0200 Subject: [PATCH 128/286] Test --- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_swap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index f7cfbec45..d10a51369 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -98,7 +98,7 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ // char str[65],str2[65]; printf("MSGiterate (%s) -> (%s)\n",bits256_str(str,srchash),bits256_str(str2,desthash)); array = cJSON_CreateArray(); portable_mutex_lock(&myinfo->messagemutex); - //printf("iterate_MSG allflag.%d width.%d channel.%d msgid.%d src.%llx -> %llx\n",allflag,origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); + printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); for (i=0; iI.otherhash); jaddbits256(valsobj,"desthash",swap->I.myhash); - jaddnum(valsobj,"width",0); + jaddnum(valsobj,"width",30); if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) { if ( (array= cJSON_Parse(retstr)) != 0 ) From 9ed0c3301507fa99fb559935e4f5eb3ec5ee3e37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 11:38:31 +0200 Subject: [PATCH 129/286] Sock --- basilisk/basilisk_MSG.c | 24 ++++++ iguana/dPoW.h | 3 + iguana/dpow/dpow_network.c | 147 ++++++++++++++++++++++++++++++++-- iguana/iguana777.h | 4 + iguana/iguana_notary.c | 10 +++ iguana/main.c | 3 + includes/iguana_apideclares.h | 2 + includes/iguana_funcs.h | 1 + 8 files changed, 188 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index d10a51369..e6d55208d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -295,6 +295,30 @@ cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr) return(retjson); } +cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr) +{ + cJSON *vals,*retjson=0; char *retstr=0,*datastr; int32_t datalen,keylen; uint8_t *data=0,key[BASILISK_KEYSIZE]; + if ( (vals= cJSON_Parse(jsonstr)) != 0 ) + { + keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); + if ( (datastr= jstr(vals,"data")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + data = malloc(datalen); + decode_hex(data,datalen,datastr); + if ( (retstr= basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration"))) != 0 ) + retjson = cJSON_Parse(retstr); + } + if ( retstr != 0 ) + free(retstr); + if ( data != 0 ) + free(data); + } + if ( retjson == 0 ) + retjson = cJSON_Parse("{\"error\":\"couldnt add message\"}"); + return(retjson); +} + #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 7ddef6ce3..dcde86599 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -168,6 +168,8 @@ cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key); void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_getmessage(struct supernet_info *myinfo,char *jsonstr); +cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr); +cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -191,6 +193,7 @@ int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags); char *_dex_kvsearch(struct supernet_info *myinfo,char *symbol,char *key); +char *_dex_psock(struct supernet_info *myinfo,char *jsonstr); int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 86b53d7ee..73d6054e7 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -239,6 +239,106 @@ char *nanomsg_tcpname(struct supernet_info *myinfo,char *str,char *ipaddr,uint16 return(str); } +void dpow_psockloop(void *_ptr) +{ + int32_t i,nonz,size,sentbytes; uint32_t now; struct psock *ptr; void *buf; struct supernet_info *myinfo = _ptr; + while ( 1 ) + { + now = (uint32_t)time(NULL); + for (i=nonz=0; inumpsocks; i++) // change to nn_poll! + { + portable_mutex_lock(&myinfo->psockmutex); + if ( i < myinfo->numpsocks ) + { + ptr = &myinfo->PSOCKS[i]; + if ( (size= nn_recv(ptr->pullsock,&buf,NN_MSG,0)) > 0 ) + { + ptr->lasttime = now; + if ( (sentbytes= nn_send(ptr->pubsock,buf,size,0)) > 0 ) + { + printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); + nonz++; + } + } + else if ( now > ptr->lasttime+PSOCK_IDLETIMEOUT ) + { + printf("PSOCKS[%d] of %d (%u %u) lag.%d IDLETIMEOUT\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,now - ptr->lasttime); + nn_close(ptr->pullsock); + nn_close(ptr->pubsock); + if ( myinfo->numpsocks > 1 ) + { + myinfo->PSOCKS[i] = myinfo->PSOCKS[--myinfo->numpsocks]; + memset(&myinfo->PSOCKS[myinfo->numpsocks],0,sizeof(*ptr)); + } else myinfo->numpsocks = 0; + } + if ( buf != 0 ) + nn_freemsg(buf), buf = 0; + } + portable_mutex_unlock(&myinfo->psockmutex); + } + if ( nonz == 0 ) + usleep(100000); + } +} + +void dpow_psockadd(struct supernet_info *myinfo,int32_t pullsock,uint16_t pushport,int32_t pubsock,uint16_t subport) +{ + struct psock *ptr; + portable_mutex_lock(&myinfo->psockmutex); + myinfo->PSOCKS = realloc(myinfo->PSOCKS,sizeof(*myinfo->PSOCKS) * (myinfo->numpsocks + 1)); + ptr = &myinfo->PSOCKS[myinfo->numpsocks++]; + ptr->pullsock = pullsock; + ptr->pushport = pushport; + ptr->pubsock = pubsock; + ptr->subport = subport; + ptr->lasttime = (uint32_t)time(NULL); + portable_mutex_unlock(&myinfo->psockmutex); +} + +cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) +{ + char pushaddr[128],subaddr[128]; uint16_t i,pushport,subport; int32_t timeout,maxsize,pullsock=-1,pubsock=-1; cJSON *retjson=0; + retjson = cJSON_CreateObject(); + pushport = myinfo->psockport++; + subport = myinfo->psockport++; + for (i=0; i<100; i++) + { + nanomsg_tcpname(myinfo,pushaddr,myinfo->ipaddr,pushport), pushport += 2; + nanomsg_tcpname(myinfo,subaddr,myinfo->ipaddr,subport), subport += 2; + if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + { + if ( nn_bind(pullsock,pushaddr) >= 0 && nn_bind(pubsock,subaddr) >= 0 ) + { + timeout = 10; + nn_setsockopt(pubsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + maxsize = 1024 * 1024; + nn_setsockopt(pullsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize)); + dpow_psockadd(myinfo,pullsock,pushport,pubsock,subport); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"pushaddr",pushaddr); + jaddstr(retjson,"subaddr",subaddr); + break; + } + } + if ( pushport < 1000 ) + pushport = 1001; + if ( subport < 1000 ) + subport = 1001; + } + if ( i == 100 ) + { + jaddstr(retjson,"error","cant find psock ports"); + if ( pullsock >= 0 ) + nn_close(pullsock); + if ( pubsock >= 0 ) + nn_close(pubsock); + } + return(retjson); +} + static int _increasing_ipbits(const void *a,const void *b) { #define uint32_a (*(uint32_t *)a) @@ -254,7 +354,7 @@ static int _increasing_ipbits(const void *a,const void *b) void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t size) { - char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; + char *retstr; int32_t datalen; struct dex_request dexreq; //struct iguana_info *coin; //for (i=0; ihandler,"DEX") == 0 && dexp->datalen > BASILISK_KEYSIZE ) @@ -266,12 +366,12 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t else if ( strcmp(dexp->handler,"request") == 0 ) { datalen = dex_rwrequest(0,dexp->packet,&dexreq); - if ( myinfo->IAMNOTARY != 0 && dexreq.func == 'A' && (coin= iguana_coinfind(dexreq.name)) != 0 ) + /*if ( myinfo->IAMNOTARY != 0 && dexreq.func == 'A' && (coin= iguana_coinfind(dexreq.name)) != 0 ) { if ( (retstr= dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) free(retstr); printf("process broadcast importaddress.(%s) [%s]\n",(char *)&dexp->packet[datalen],dexreq.name); - } + }*/ } } @@ -652,6 +752,23 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'Z' ) + { + if ( (retjson= dpow_psock(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } + else if ( 0 && dexreq.func == 'a' ) + { + if ( (retjson= dpow_addmessage(myinfo,(char *)&dexp->packet[datalen])) != 0 ) + { + *broadcastflagp = 1; + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'N' ) { uint8_t pubkeys[64][33]; char str[128]; int32_t numnotaries; cJSON *array,*item; @@ -1010,6 +1127,24 @@ char *_dex_getmessage(struct supernet_info *myinfo,char *jsonstr) return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); } +char *_dex_sendmessage(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'a'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + +char *_dex_psock(struct supernet_info *myinfo,char *jsonstr) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); + dexreq.func = 'Z'; + return(_dex_sendrequeststr(myinfo,&dexreq,jsonstr,0,1,"")); +} + char *_dex_listunspentarg(struct supernet_info *myinfo,char *symbol,char *address,uint8_t arg) { struct dex_request dexreq; char *retstr; @@ -1102,7 +1237,7 @@ int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t size) { - int32_t firstz=-1; uint32_t crc32; + uint32_t crc32; //int32_t firstz=-1; if ( dexp->version0 == (DEX_VERSION & 0xff) && dexp->version1 == ((DEX_VERSION >> 8) & 0xff) ) { if ( dexp->datalen == (size - sizeof(*dexp)) ) @@ -1988,7 +2123,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); @@ -2012,7 +2147,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { printf("BROADCAST dexp request.[%d]\n",size); signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); - signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); + //signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); } } else diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 782695f8d..a31b4b01e 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,9 @@ struct supernet_address struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; +#define PSOCK_IDLETIMEOUT 600 +struct psock { uint32_t lasttime; int32_t pullsock,pubsock; uint16_t pushport,subport; }; + #define JUMBLR_DEPOSITPREFIX "deposit " struct jumblr_item { @@ -149,6 +152,7 @@ struct supernet_info uint8_t logs[256],exps[510]; struct message_info msgids[8192]; double *svmfeatures; + uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 2d718e6ba..e8b80daa2 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -747,6 +747,16 @@ TWO_STRINGS(dex,validateaddress,symbol,address) return(_dex_validateaddress(myinfo,symbol,address)); } +STRING_ARG(dex,getmessage,argstr) +{ + return(_dex_getmessage(myinfo,argstr)); +} + +STRING_ARG(dex,psock,argstr) +{ + return(_dex_psock(myinfo,argstr)); +} + STRING_ARG(dex,getnotaries,symbol) { return(_dex_getnotaries(myinfo,symbol)); diff --git a/iguana/main.c b/iguana/main.c index 8b06d5deb..b8d7e20a6 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -785,6 +785,7 @@ void iguana_launchdaemons(struct supernet_info *myinfo) printf("launch mainloop\n"); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)DEX_explorerloop,(void *)myinfo); OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)jumblr_loop,(void *)myinfo); + OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)dpow_psockloop,(void *)myinfo); mainloop(myinfo); } @@ -1749,6 +1750,7 @@ void iguana_main(void *arg) myinfo->rpcport = IGUANA_RPCPORT; myinfo->dpowsock = myinfo->dexsock = myinfo->pubsock = myinfo->subsock = myinfo->reqsock = myinfo->repsock = -1; dex_init(myinfo); + myinfo->psockport = 30000; if ( arg != 0 ) { if ( strcmp((char *)arg,"OStests") == 0 ) @@ -1775,6 +1777,7 @@ void iguana_main(void *arg) portable_mutex_init(&myinfo->pending_mutex); portable_mutex_init(&myinfo->dpowmutex); portable_mutex_init(&myinfo->notarymutex); + portable_mutex_init(&myinfo->psockmutex); #if LIQUIDITY_PROVIDER myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("nxtae"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 3f952e15a..632026ffb 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -49,6 +49,8 @@ HASH_AND_STRING_AND_INT(dex,gettxin,txid,symbol,vout); TWO_STRINGS(dex,listspent,symbol,address); TWO_STRINGS(dex,getbalance,symbol,address); STRING_ARG(dex,explorer,symbol); +STRING_ARG(dex,getmessage,argstr); +STRING_ARG(dex,psock,argstr); HASH_ARRAY_STRING(basilisk,genesis_opreturn,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index b60b72b8a..95ae1e414 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -596,6 +596,7 @@ void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notar void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); +void dpow_psockloop(void *_ptr); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 1b8b4262bf0b9f19d7d49e8b6770e53f18982216 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 11:40:37 +0200 Subject: [PATCH 130/286] Test --- iguana/iguana777.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a31b4b01e..5beb12130 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -59,12 +59,14 @@ #include "../crypto777/nanosrc/nn.h" #include "../crypto777/nanosrc/bus.h" #include "../crypto777/nanosrc/pubsub.h" +#include "../crypto777/nanosrc/pipeline.h" #include "../crypto777/nanosrc/reqrep.h" #include "../crypto777/nanosrc/tcp.h" #else #include "/usr/local/include/nanomsg/nn.h" #include "/usr/local/include/nanomsg/bus.h" #include "/usr/local/include/nanomsg/pubsub.h" +#include "/usr/local/include/nanomsg/pipeline.h" #include "/usr/local/include/nanomsg/reqrep.h" #include "/usr/local/include/nanomsg/tcp.h" #endif From ea3226e721ad772e2d0287e0f0ea6c210dd07db8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:09:54 +0200 Subject: [PATCH 131/286] Test --- basilisk/basilisk_DEX.c | 20 +++- basilisk/basilisk_swap.c | 195 +++++++++++++++++++++++++++-------- basilisk/basilisk_tradebot.c | 8 ++ iguana/dpow/dpow_network.c | 13 +-- iguana/iguana777.h | 7 +- iguana/tests/dexkvupdate | 4 +- iguana/tests/dexpsock | 2 + 7 files changed, 192 insertions(+), 57 deletions(-) create mode 100755 iguana/tests/dexpsock diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 688ebc169..7cadc124c 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -276,7 +276,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; - if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive == 0) ) + if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); @@ -317,7 +317,23 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_updateclient(myinfo); if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) + } + else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) + { + dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_pubkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + free(retstr); + } + else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) + { + dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + free(retstr); + /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); printf("my req hwm %f -> %u\n",hwm,issueR.requestid); basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d77843148..7f935e2d7 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -245,7 +245,7 @@ int32_t basilisk_confirmsobj(cJSON *item) return(-1); } -int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx *rawtx) +int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { cJSON *argjson,*valuearray=0; char *valstr; int32_t i,n,retval = -1; #ifdef BASILISK_DISABLEWAITTX @@ -255,7 +255,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx jaddbits256(argjson,"txid",rawtx->I.actualtxid); jaddnum(argjson,"vout",0); jaddstr(argjson,"coin",rawtx->coin->symbol); - if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0)) != 0 ) + if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,swap->persistent_pubkey,argjson,0)) != 0 ) { //char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid),valstr); if ( (valuearray= cJSON_Parse(valstr)) != 0 ) @@ -704,7 +704,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); if ( rawtx->coin->changeaddr[0] == 0 ) { - bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } init_hexbytes_noT(scriptstr,script,scriptlen); @@ -720,7 +720,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis jaddnum(valsobj,"timeout",30000); jaddnum(valsobj,"timestamp",swap->I.started+delay); addresses = cJSON_CreateArray(); - bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); jaddistr(addresses,coinaddr); jadd(valsobj,"addresses",addresses); rawtx->I.locktime = locktime; @@ -1123,15 +1123,21 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration) +struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - struct iguana_info *coin,*bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; - if ( strcmp("BTC",swap->I.req.src) == 0 ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + swap->I.bobsatoshis = swap->I.req.destamount; + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->alicecoin = iguana_coinfind(swap->I.req.src); + swap->I.alicesatoshis = swap->I.req.srcamount; + swap->I.aliceconfirms = swap->I.bobconfirms * 3; + /*if ( strcmp("BTC",swap->I.req.src) == 0 ) { swap->bobcoin = iguana_coinfind("BTC"); swap->I.bobsatoshis = swap->I.req.srcamount; @@ -1171,7 +1177,7 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey } else printf("neither coin handles ctlv %s %s\n",swap->I.req.src,swap->I.req.dest); } else printf("cant find src or dest coin.(%s %s)\n",swap->I.req.src,swap->I.req.dest); } else printf("cant find src coin.(%s)\n",swap->I.req.src); - } + }*/ if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); @@ -1196,7 +1202,17 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; - if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) + if ( statebits != 0 ) + { + swap->I.iambob = 0; + swap->I.otherhash = swap->I.req.desthash; + } + else + { + swap->I.iambob = 1; + swap->I.otherhash = swap->I.req.srchash; + } + /*if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) { swap->I.otherhash = swap->I.req.desthash; if ( strcmp(swap->I.req.src,swap->I.bobstr) == 0 ) @@ -1212,7 +1228,7 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey { printf("neither src nor dest error\n"); return(0); - } + }*/ if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); @@ -1607,7 +1623,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x2000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicepayment) >= swap->I.aliceconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->alicepayment) >= swap->I.aliceconfirms ) { swap->I.statebits |= 0x2000; printf("alicepayment confirmed\n"); @@ -1633,7 +1649,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap tradebot_swap_balancingtrade(myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; - while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) + while ( basilisk_numconfirms(myinfo,swap,&swap->bobspend) < swap->I.aliceconfirms ) { printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; @@ -1656,7 +1672,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("Bob reclaimed own payment\n"); while ( 0 && (swap->I.statebits & 0x100000) == 0 ) // why wait for own tx? { - if ( basilisk_numconfirms(myinfo,&swap->bobreclaim) >= 1 ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobreclaim) >= 1 ) { printf("bobreclaim confirmed\n"); swap->I.statebits |= 0x100000; @@ -1684,7 +1700,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x400) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobdeposit) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobdeposit) >= swap->I.bobconfirms ) { printf("bobdeposit confirmed\n"); swap->I.statebits |= 0x400; @@ -1708,7 +1724,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x10000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->bobpayment) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->bobpayment) >= swap->I.bobconfirms ) { printf("bobpayment confirmed\n"); swap->I.statebits |= 0x10000; @@ -1717,7 +1733,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; @@ -1727,7 +1743,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } else if ( (swap->I.statebits & 0x40000) == 0 ) { - if ( basilisk_numconfirms(myinfo,&swap->alicespend) >= swap->I.bobconfirms ) + if ( basilisk_numconfirms(myinfo,swap,&swap->alicespend) >= swap->I.bobconfirms ) { swap->I.statebits |= 0x40000; printf("Alice confirms spend of Bob's payment\n"); @@ -1780,6 +1796,68 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) return(retjson); } +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr) +{ + char keystr[64],databuf[1024],*retstr,*datastr; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; + if ( swap->connected == 1 ) + return; + if ( swap->pushsock < 0 && swap->subsock < 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + { + timeout = 100; + nn_setsockopt(pushsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 1; + nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + swap->pushsock = pushsock; + swap->subsock = subsock; + } + sprintf(keystr,"%08x-%08x",swap->I.req.requestid,swap->I.req.quoteid); + if ( pushaddr != 0 && subaddr != 0 ) + { + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + swap->connected = 1; + sprintf(databuf,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen(databuf) + 1; + decode_hex(data,datalen,databuf); + init_hexbytes_noT(databuf,data,datalen); + printf("%s -> %s\n",keystr,databuf); + if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) + { + printf("KVupdate.(%s)\n",retstr); + free(retstr); + } + } + else + { + if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (datastr= jstr(retjson,"value")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + decode_hex((uint8_t *)databuf,datalen,datastr); + if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + { + pushaddr = jstr(addrjson,"push"); + subaddr = jstr(addrjson,"sub"); + if ( pushaddr != 0 && subaddr != 0 ) + { + printf("KV decoded (%s and %s)\n",pushaddr,subaddr); + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + swap->connected = 1; + } + free_json(addrjson); + } + } + free_json(retjson); + } + printf("KVsearch.(%s)\n",retstr); + free(retstr); + } + } +} + void basilisk_swaploop(void *_swap) { uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; @@ -1792,21 +1870,30 @@ void basilisk_swaploop(void *_swap) channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { - printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); - //basilisk_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid),60); dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - basilisk_sendstate(myinfo,swap,data,maxlen); - basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys - if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 - basilisk_sendchoosei(myinfo,swap,data,maxlen); - basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 - if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) - break; + if ( swap->I.iambob == 0 && swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,0,0); + if ( swap->connected != 0 ) + { + printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); + basilisk_sendstate(myinfo,swap,data,maxlen); + basilisk_sendpubkeys(myinfo,swap,data,maxlen); // send pubkeys + if ( basilisk_checkdeck(myinfo,swap,data,maxlen) == 0) // check for other deck 0x02 + basilisk_sendchoosei(myinfo,swap,data,maxlen); + basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 + if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) + break; + } sleep(10); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); + } + if ( swap->connected == 0 ) + { + printf("couldnt establish connection\n"); + retval = -1; } - while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) + while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); @@ -1818,17 +1905,20 @@ void basilisk_swaploop(void *_swap) break; } sleep(13 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } + myinfo->DEXactive = swap->I.expiration; if ( time(NULL) >= expiration ) + { retval = -1; - myinfo->DEXactive = swap->I.expiration; + myinfo->DEXactive = 0; + } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); printf("swapget\n"); @@ -1929,8 +2019,8 @@ void basilisk_swaploop(void *_swap) basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) @@ -1962,7 +2052,8 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) { - int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; + int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; + // statebits 1 -> client, 0 -> LP portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1974,25 +2065,39 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 { printf("basilisk_thread_start request.%u statebits.%d\n",rp->requestid,statebits); swap = calloc(1,sizeof(*swap)); + swap->subsock = swap->pushsock = -1; vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; - //swap->myinfo.ctx = myinfo->ctx; bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); - pubkey25519 = myinfo->myaddr.persistent;//curve25519(privkey,curve25519_basepoint9()); - //swap->myinfo.persistent_priv = privkey; - //swap->myinfo.myaddr.persistent = pubkey25519; - //memcpy(swap->myinfo.persistent_pubkey33,pubkey33,33); + pubkey25519 = curve25519(privkey,curve25519_basepoint9()); + swap->persistent_pubkey = pubkey25519; + swap->persistent_privkey = privkey; + memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration) != 0 ) + if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) { + if ( statebits == 0 ) + { + if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) + { + // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + basilisk_psockinit(myinfo,swap,jstr(retjson,"pushaddr"),jstr(retjson,"subaddr")); + free_json(retjson); + } + free(retstr); + } + } else basilisk_psockinit(myinfo,swap,0,0); + starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { m = n = 0; - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); sleep(3); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index d98bc1200..dbb6ca742 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -290,6 +290,10 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } if ( bits256_cmp(myinfo->myaddr.persistent,list[0].srchash) == 0 ) // my request myrequest = 1; + else if ( bits256_cmp(myinfo->jumblr_pubkey,list[0].srchash) == 0 ) // my request + myrequest = 1; + else if ( bits256_cmp(myinfo->jumblr_depositkey,list[0].srchash) == 0 ) // my request + myrequest = 1; for (i=0; imyaddr.persistent,list[i].desthash) == 0 ) // my quoteid myrequest |= 2; + else if ( bits256_cmp(myinfo->jumblr_pubkey,list[i].desthash) == 0 ) // my quoteid + myrequest |= 2; + else if ( bits256_cmp(myinfo->jumblr_depositkey,list[i].desthash) == 0 ) // my quoteid + myrequest |= 2; havequoteflag++; if ( pendingid == 0 ) { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 73d6054e7..a0b99d84a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -303,6 +303,7 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) subport = myinfo->psockport++; for (i=0; i<100; i++) { + pullsock = pubsock = -1; nanomsg_tcpname(myinfo,pushaddr,myinfo->ipaddr,pushport), pushport += 2; nanomsg_tcpname(myinfo,subaddr,myinfo->ipaddr,subport), subport += 2; if ( (pullsock= nn_socket(AF_SP,NN_PULL)) >= 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) @@ -322,6 +323,10 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) jaddstr(retjson,"subaddr",subaddr); break; } + if ( pullsock >= 0 ) + nn_close(pullsock); + if ( pubsock >= 0 ) + nn_close(pubsock); } if ( pushport < 1000 ) pushport = 1001; @@ -329,13 +334,7 @@ cJSON *dpow_psock(struct supernet_info *myinfo,char *jsonstr) subport = 1001; } if ( i == 100 ) - { jaddstr(retjson,"error","cant find psock ports"); - if ( pullsock >= 0 ) - nn_close(pullsock); - if ( pubsock >= 0 ) - nn_close(pubsock); - } return(retjson); } @@ -1139,6 +1138,8 @@ char *_dex_sendmessage(struct supernet_info *myinfo,char *jsonstr) char *_dex_psock(struct supernet_info *myinfo,char *jsonstr) { struct dex_request dexreq; + if ( jsonstr == 0 ) + jsonstr = "{}"; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,"KMD",sizeof(dexreq.name)); dexreq.func = 'Z'; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5beb12130..e9b6a5f23 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -116,7 +116,7 @@ struct message_info { int32_t msgcount; bits256 refhash,msghashes[64]; uint32_t struct supernet_info { struct supernet_address myaddr; - bits256 persistent_priv,privkey; + bits256 persistent_priv,privkey,jumblr_pubkey,jumblr_depositkey; uint8_t persistent_pubkey33[33]; char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024],jumblr_passphrase[1024]; char *decryptstr; @@ -162,11 +162,14 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; + int32_t subsock,pushsock,connected; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t verifybuf[65536]; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; + }; #include "../includes/iguana_funcs.h" diff --git a/iguana/tests/dexkvupdate b/iguana/tests/dexkvupdate index a98240995..a6792a142 100755 --- a/iguana/tests/dexkvupdate +++ b/iguana/tests/dexkvupdate @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KMD\"}" -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KV\"}" +#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"test\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"kvupdate\",\"key\":\"testtest\",\"value\":\"$1\",\"flags\":0,\"symbol\":\"KV\"}" diff --git a/iguana/tests/dexpsock b/iguana/tests/dexpsock new file mode 100755 index 000000000..0a0e6fb16 --- /dev/null +++ b/iguana/tests/dexpsock @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"psock\"}" From c44405d9656e75bf1b84f3aff7c3e466596ead89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:26:19 +0200 Subject: [PATCH 132/286] Test --- basilisk/basilisk_swap.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7f935e2d7..61c01ab95 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1077,13 +1077,13 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash,int32_t iambob) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) return(0); *bobcoinp = *alicecoinp = 0; - if ( strcmp("BTC",src) == 0 ) + /*if ( strcmp("BTC",src) == 0 ) { *bobcoinp = iguana_coinfind(src); *alicecoinp = iguana_coinfind(dest); @@ -1103,7 +1103,9 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu *bobcoinp = iguana_coinfind(dest); *alicecoinp = iguana_coinfind(src); } - else return(0); + else return(0);*/ + *bobcoinp = iguana_coinfind(dest); + *alicecoinp = iguana_coinfind(src); if ( bits256_cmp(pubkey,srchash) == 0 ) { if ( strcmp(src,(*bobcoinp)->symbol) == 0 ) @@ -1229,9 +1231,9 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey printf("neither src nor dest error\n"); return(0); }*/ - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)); return(0); } if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) From f6b0c9c40245775e9d4d06a833f532e7fa464841 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:27:29 +0200 Subject: [PATCH 133/286] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 61c01ab95..09db82854 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1077,7 +1077,7 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili } else printf("%s vouttype.%d destaddr.(%s)\n",name,rawtx->I.vouttype,rawtx->I.destaddr); } -int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash,int32_t iambob) +int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct iguana_info **alicecoinp,char *src,char *dest,bits256 srchash,bits256 desthash) { struct iguana_info *coin = iguana_coinfind(src); if ( coin == 0 || iguana_coinfind(dest) == 0 ) @@ -1231,9 +1231,9 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey printf("neither src nor dest error\n"); return(0); }*/ - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)+1)/2 != swap->I.iambob ) + if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash,swap->I.iambob)); + printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); } if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) From e4d266aa91c6f2d4724a46d27c36d422aaf21101 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:49:52 +0200 Subject: [PATCH 134/286] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 09db82854..a2c47b67d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,12 +1230,12 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey { printf("neither src nor dest error\n"); return(0); - }*/ + } if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) { printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); return(0); - } + }*/ if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { printf("couldnt generate privkeys %d\n",x); From 5bd6c409b1e074632f9481359d35fcd4191c8f24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 15:59:01 +0200 Subject: [PATCH 135/286] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a2c47b67d..5843af951 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1818,9 +1818,9 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, { if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) swap->connected = 1; - sprintf(databuf,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); - datalen = (int32_t)strlen(databuf) + 1; - decode_hex(data,datalen,databuf); + sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen((char *)data) + 1; + printf("datalen.%d (%s)\n",datalen,(char *)data); init_hexbytes_noT(databuf,data,datalen); printf("%s -> %s\n",keystr,databuf); if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) From 68ca1cc0b54bfa6c97eba98b24f30299a2d0cb06 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 16:45:39 +0200 Subject: [PATCH 136/286] Test --- basilisk/basilisk_MSG.c | 4 +-- basilisk/basilisk_swap.c | 70 ++++++++++++++++++++++++++++++++++++-- iguana/dpow/dpow_network.c | 2 +- iguana/iguana777.h | 8 +++++ 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index e6d55208d..a3ea7b343 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -448,9 +448,9 @@ cJSON *basilisk_channelget(struct supernet_info *myinfo,bits256 srchash,bits256 retstr = basilisk_getmessage(myinfo,0,0,0,desthash,valsobj,0); else { - char str[65],str2[65]; + //char str[65],str2[65]; retstr = _dex_getmessage(myinfo,jprint(valsobj,0)); - printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); + //printf("channel.%u msgid.%u gotmessage.(%d) %s %s %s\n",channel,msgid,(int32_t)strlen(retstr),strlen(retstr) < 100 ? retstr : "(too long)",bits256_str(str,srchash),bits256_str(str2,desthash)); } if ( retstr != 0 ) { diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 5843af951..47eecd497 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -879,9 +879,29 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 else return(0); } +void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen) +{ + int32_t i; struct basilisk_swapmessage *mp; + for (i=0; inummessages; i++) + if ( crc32 == swap->messages[i].crc32 ) + return; + printf("new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); + mp = &swap->messages[swap->nummessages++]; + mp->crc32 = crc32; + mp->srchash = srchash; + mp->desthash = desthash; + mp->msgbits = msgbits; + mp->quoteid = quoteid; + mp->data = malloc(datalen); + memcpy(mp->data,data,datalen); + mp->datalen = datalen; +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; + uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; + /*cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; //int32_t datalen; uint32_t crc; //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) valsobj = cJSON_CreateObject(); @@ -916,17 +936,54 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap free_json(array); } free(retstr); + }*/ + while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) + { + memset(srchash.bytes,0,sizeof(srchash)); + memset(desthash.bytes,0,sizeof(desthash)); + crc32 = calc_crc32(0,ptr,size); + offset = 0; + for (i=0; i<32; i++) + srchash.bytes[i] = ptr[offset++]; + for (i=0; i<32; i++) + desthash.bytes[i] = ptr[offset++]; + offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); + offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + if ( ptr != 0 ) + nn_freemsg(ptr), ptr = 0; + } + for (i=0; inummessages; i++) + { + if ( swap->messages[i].msgbits == msgbits ) + { + printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); + break; + } } return(retval); } uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { + uint8_t *buf; int32_t sentbytes,offset=0,i; //if ( (rand() % 10) == 0 ) // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); - dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 + buf = malloc(datalen) + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2; + for (i=0; i<32; i++) + buf[offset++] = swap->I.myhash.bytes[i]; + for (i=0; i<32; i++) + buf[offset++] = swap->I.otherhash.bytes[i]; + offset += iguana_rwnum(1,&buf[offset],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); + offset += iguana_rwnum(1,&buf[offset],sizeof(msgbits),&msgbits); + memcpy(&buf[offset],data,datalen), offset += datalen; + if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) + printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + free(buf); return(0); } @@ -1127,7 +1184,8 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + //struct iguana_info *bobcoin,*alicecoin; + uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; @@ -1285,6 +1343,7 @@ void basilisk_rawtx_purge(struct basilisk_rawtx *rawtx) void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *swap) { + int32_t i; swap->I.finished = (uint32_t)time(NULL); // save to permanent storage basilisk_rawtx_purge(&swap->bobdeposit); @@ -1297,6 +1356,11 @@ void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *s basilisk_rawtx_purge(&swap->bobreclaim); basilisk_rawtx_purge(&swap->bobspend); basilisk_rawtx_purge(&swap->bobrefund); + for (i=0; inummessages; i++) + if ( swap->messages[i].data != 0 ) + free(swap->messages[i].data), swap->messages[i].data = 0; + free(swap->messages), swap->messages = 0; + swap->nummessages = 0; } void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a0b99d84a..6f17c611a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -467,7 +467,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 if ( nn_poll(&pfd,1,100) > 0 ) { sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); + //printf(" sent.%d:%d datalen.%d crc.%08x\n",sentbytes,size,datalen,calc_crc32(0,(void *)dexp,size)); break; } usleep(1000); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index e9b6a5f23..cf733a81b 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -158,6 +158,13 @@ struct supernet_info uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; }; +struct basilisk_swapmessage +{ + bits256 srchash,desthash; + uint32_t crc32,msgbits,quoteid,datalen; + uint8_t *data; +}; + struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; @@ -167,6 +174,7 @@ struct basilisk_swap struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; int32_t subsock,pushsock,connected; + struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; From 20edc4e11088cf7f2694e1763a3b05498e6ba53d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:27:02 +0200 Subject: [PATCH 137/286] Test --- basilisk/basilisk_swap.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 47eecd497..3a45d7fb3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -951,7 +951,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) - nn_freemsg(ptr), ptr = 0; + { + fprintf(stderr,"free ptr\n"); + nn_freemsg(ptr); + ptr = 0; + fprintf(stderr,"freed ptr\n"); + } } for (i=0; inummessages; i++) { @@ -983,7 +988,9 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + fprintf(stderr,"free buf\n"); free(buf); + fprintf(stderr,"freed buf\n"); return(0); } From 3647dbb01e9636de0365c15b08f2e35767a6723e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:35:00 +0200 Subject: [PATCH 138/286] Test --- basilisk/basilisk_swap.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3a45d7fb3..97202bc6b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -951,12 +951,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) - { - fprintf(stderr,"free ptr\n"); - nn_freemsg(ptr); - ptr = 0; - fprintf(stderr,"freed ptr\n"); - } + nn_freemsg(ptr), ptr = 0; } for (i=0; inummessages; i++) { @@ -978,7 +973,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) //return(nextbits); //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 - buf = malloc(datalen) + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2; + buf = malloc(datalen + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2); for (i=0; i<32; i++) buf[offset++] = swap->I.myhash.bytes[i]; for (i=0; i<32; i++) @@ -988,9 +983,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - fprintf(stderr,"free buf\n"); free(buf); - fprintf(stderr,"freed buf\n"); return(0); } From 3b95bcd971162383dfe5a605fc4b496e185ca3ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:44:05 +0200 Subject: [PATCH 139/286] Test --- basilisk/basilisk_swap.c | 7 ++++--- iguana/iguana777.h | 2 +- iguana/unparsed.txt | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 iguana/unparsed.txt diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 97202bc6b..4879757b8 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -955,9 +955,9 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + //printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } @@ -1895,6 +1895,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } else { + printf("connected.%d\n",swap->connected); if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -1918,7 +1919,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } free_json(retjson); } - printf("KVsearch.(%s)\n",retstr); + printf("KVsearch.(%s) connected.%d\n",retstr,swap->connected); free(retstr); } } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index cf733a81b..b66a833a0 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -169,11 +169,11 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); + int32_t subsock,pushsock,connected; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; - int32_t subsock,pushsock,connected; struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt new file mode 100644 index 000000000..8d0877d63 --- /dev/null +++ b/iguana/unparsed.txt @@ -0,0 +1 @@ +6304a16dbc58b1752102baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac67a914eed7fe456f91215de2205098928052bd8dbda9c6882103baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac68 From 86f56ab98618a9af80a8be4b99b35ee2a3394f2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 17:56:41 +0200 Subject: [PATCH 140/286] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_swap.c | 10 +++++++--- basilisk/jumblr.c | 2 +- iguana/unparsed.txt | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 7cadc124c..bb17423af 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) @@ -758,7 +758,7 @@ INT_ARG(InstantDEX,incoming,requestid) msgid = (uint32_t)time(NULL) + drift; if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) { - printf("GOT.(%s)\n",jprint(retarray,0)); + //printf("GOT.(%s)\n",jprint(retarray,0)); if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) { jaddstr(retjson,"result","success"); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 4879757b8..d7aa5a418 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1383,10 +1383,13 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - struct basilisk_swap *swap = ptr; + int32_t retval; struct basilisk_swap *swap = ptr; if ( datalen == sizeof(swap->I.otherstatebits) ) - return(iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits)); - else return(-1); + { + retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); + printf("got sendstate.%x\n",swap->I.otherstatebits); + return(retval); + } else return(-1); } int32_t basilisk_verify_choosei(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) @@ -1540,6 +1543,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; + printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index e001f5174..f77302a91 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -564,7 +564,7 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + } else return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 8d0877d63..d468bd962 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -6304a16dbc58b1752102baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac67a914eed7fe456f91215de2205098928052bd8dbda9c6882103baf994f2e1e765f474a3fd8c46f6b13c518e8855858ab46c69008c91ee84cda2ac68 +6304ed6fbc58b1752102b12fb1636597dbb81f5da6b05fa8e7d1d2613ada75c57fe6de2816e7ec3b23b5ac67a914f2d2987381a415363dc6a07c2d6440eefff54279882103fef6acf0aa9a0306647a928cc20784fe8349d020d811d2c098b370aa7bc3ba64ac68 From 4b316f55ea3c2ca46512db9a9eca3e28ed6161e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:08:18 +0200 Subject: [PATCH 141/286] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bb17423af..78bad0c89 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) From d02161bf8c09e04e72284f118d1434abfcc7d7d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:09:40 +0200 Subject: [PATCH 142/286] Test --- basilisk/basilisk_DEX.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 78bad0c89..bb17423af 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) From ce0b209cfd56c13d540deab8e5bd5787318aa17f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:13:55 +0200 Subject: [PATCH 143/286] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d7aa5a418..449e5d4cf 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1914,8 +1914,8 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, subaddr = jstr(addrjson,"sub"); if ( pushaddr != 0 && subaddr != 0 ) { - printf("KV decoded (%s and %s)\n",pushaddr,subaddr); - if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) + printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); + if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) swap->connected = 1; } free_json(addrjson); @@ -1923,7 +1923,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, } free_json(retjson); } - printf("KVsearch.(%s) connected.%d\n",retstr,swap->connected); + printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); free(retstr); } } From 38a5aaa03496d8db29f8e49471582d7ebcdf63a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:22:52 +0200 Subject: [PATCH 144/286] Test --- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_MSG.c | 4 ++-- basilisk/basilisk_swap.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bb17423af..78bad0c89 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -315,7 +315,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index a3ea7b343..64aecc90d 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -240,7 +240,7 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 { bits256 srchash,desthash; uint32_t channel,msgid; basilisk_messagekeyread(key,&channel,&msgid,&srchash,&desthash); - printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); + //printf("add message keylen.%d [%d] msgid.%x channel.%x\n",msg->keylen,datalen,msgid,channel); } //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); @@ -395,7 +395,7 @@ int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits25 jaddnum(valsobj,"timeout",1000); jaddbits256(valsobj,"srchash",srchash); jaddbits256(valsobj,"desthash",desthash); - char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); + //char str[65]; printf("sendmessage.[%d] channel.%u msgid.%x -> %s numrelays.%d\n",datalen,channel,msgid,bits256_str(str,desthash),myinfo->NOTARY.NUMRELAYS); if ( (retstr= basilisk_sendmessage(myinfo,0,0,0,desthash,valsobj,hexstr)) != 0 ) free(retstr); free_json(valsobj); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 449e5d4cf..ec4d01ca3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1061,7 +1061,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; iI.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { - printf("couldnt generate privkeys %d\n",x); + char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } if ( swap->I.iambob != 0 ) From d843d822a25543c9fbad3ce1c2afba8b899b37c3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:36:22 +0200 Subject: [PATCH 145/286] Test --- basilisk/basilisk_swap.c | 17 ++++++++++++++--- iguana/unparsed.txt | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ec4d01ca3..7e2157256 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -949,7 +949,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); - basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + if ( size > offset ) + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } @@ -980,9 +981,19 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw buf[offset++] = swap->I.otherhash.bytes[i]; offset += iguana_rwnum(1,&buf[offset],sizeof(swap->I.req.quoteid),&swap->I.req.quoteid); offset += iguana_rwnum(1,&buf[offset],sizeof(msgbits),&msgbits); - memcpy(&buf[offset],data,datalen), offset += datalen; + if ( datalen > 0 ) + memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + else + { + if ( msgbits == 0x80000000 ) + { + for (i=0; i<4; i++) + printf("%02x ",data[i]); + printf("datalen.%d\n",datalen); + } + } free(buf); return(0); } @@ -1061,7 +1072,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; i Date: Sun, 5 Mar 2017 18:39:17 +0200 Subject: [PATCH 146/286] Test --- basilisk/jumblr.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index f77302a91..ec3e797dc 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -564,7 +564,12 @@ ZERO_ARGS(jumblr,status) jaddnum(retjson,"received",dstr(received)); jaddnum(retjson,"finished",dstr(finished)); return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } + else + { + printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); + return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } } #include "../includes/iguana_apiundefs.h" From 8713888524d2ea97a93aec604fece0de629bcded Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:50:28 +0200 Subject: [PATCH 147/286] Test --- basilisk/basilisk_swap.c | 13 +++++++++++-- iguana/unparsed.txt | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7e2157256..546bf4265 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -885,7 +885,10 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf("new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + if ( datalen < 8 ) + for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -949,6 +952,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + if ( _msgbits == 0x80000000 ) + { + for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) @@ -991,7 +1000,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw { for (i=0; i<4; i++) printf("%02x ",data[i]); - printf("datalen.%d\n",datalen); + printf("datalen.%d offset.%d\n",datalen,offset); } } free(buf); diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 39ba7bdda..515dd4416 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -6304d878bc58b17521029c992b28fcb42e4ecb64a7bef533a7998bd971a287891e7b51230b68f3051ebeac67a914782e47739e559fe5da02f4b40be525e7c47fccee88210387ddc27d8419f5eadb7f32e44f9246c168d379e73ab372398258acc7ef4fc36eac68 +63041a7dbc58b175210205a68a29ddd5ac3bc216274770787fe667c6687c7880c09d6e6d4177c6a261bbac67a914c176c745680464cea293d4f0ff70165fc00e84fc8821039a493992a86ce8bb4f7f66e74ac3929bfb37fa9f0efb3175b2c8d8e25b051daaac68 From ed89cf5ada66d5c0f4da50ff2169118a25203b80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 18:57:39 +0200 Subject: [PATCH 148/286] Test --- basilisk/basilisk_swap.c | 4 ++-- iguana/unparsed.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 546bf4265..19ed533c3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -887,7 +887,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa return; if ( datalen < 8 ) for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; @@ -956,7 +956,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt index 515dd4416..8a0784e21 100644 --- a/iguana/unparsed.txt +++ b/iguana/unparsed.txt @@ -1 +1 @@ -63041a7dbc58b175210205a68a29ddd5ac3bc216274770787fe667c6687c7880c09d6e6d4177c6a261bbac67a914c176c745680464cea293d4f0ff70165fc00e84fc8821039a493992a86ce8bb4f7f66e74ac3929bfb37fa9f0efb3175b2c8d8e25b051daaac68 +6304457fbc58b1752102a8840cca0df07b83f53909a449e33ad300f8f72f72fcff2402113056ec281a6dac67a914dd008e8066dfa7f5e138b88892d3b751c39609a5882103d23f308d9f85ec5633122dd6c59e7004ab5915cc073104873a06adeef24eb6dbac68 From 54c6de9dbdd1474ecac61c4482900ce8cee963ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:04:13 +0200 Subject: [PATCH 149/286] Test --- .gitignore | 6 ++++++ basilisk/basilisk_swap.c | 7 ++++++- iguana/unparsed.txt | 1 - 3 files changed, 12 insertions(+), 2 deletions(-) delete mode 100644 iguana/unparsed.txt diff --git a/.gitignore b/.gitignore index 04fc232c4..ee4a9db1d 100755 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,9 @@ iguana/index7778.html *.json iguana/DB/KMD/utxo.dat + +iguana/unparsed.txt + +iguana/unparsed.txt + +iguana/unparsed.txt diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 19ed533c3..e2885b51f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -967,7 +967,12 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - //printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + if ( swap->messages[i].datalen < 8 ) + { + for (i=0; imessages[i].datalen; i++) + printf("%02x",swap->messages[i].data[i]); + printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); + } retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } diff --git a/iguana/unparsed.txt b/iguana/unparsed.txt deleted file mode 100644 index 8a0784e21..000000000 --- a/iguana/unparsed.txt +++ /dev/null @@ -1 +0,0 @@ -6304457fbc58b1752102a8840cca0df07b83f53909a449e33ad300f8f72f72fcff2402113056ec281a6dac67a914dd008e8066dfa7f5e138b88892d3b751c39609a5882103d23f308d9f85ec5633122dd6c59e7004ab5915cc073104873a06adeef24eb6dbac68 From 0e5fbf2a75bcef33ed73f48e63cb7c02344a30c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:14:58 +0200 Subject: [PATCH 150/286] Test --- basilisk/basilisk_swap.c | 64 ++---------------------------------- basilisk/basilisk_tradebot.c | 2 +- 2 files changed, 3 insertions(+), 63 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e2885b51f..e015ff4a4 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -885,9 +885,6 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - if ( datalen < 8 ) - for (i=0; inummessages,datalen,quoteid,msgbits); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; @@ -904,42 +901,6 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; - /*cJSON *valsobj,*array,*item; int32_t i,n,datalen,retval = -1; char *retstr,*hexstr=0; - //int32_t datalen; uint32_t crc; - //if ( (crc= basilisk_crcrecv(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),&datalen,swap->I.otherhash,swap->I.myhash,swap->I.req.quoteid,msgbits)) != 0 ) - valsobj = cJSON_CreateObject(); - jaddnum(valsobj,"channel",swap->I.req.quoteid); - jaddnum(valsobj,"msgid",msgbits); - jaddbits256(valsobj,"srchash",swap->I.otherhash); - jaddbits256(valsobj,"desthash",swap->I.myhash); - jaddnum(valsobj,"width",30); - if ( (retstr= _dex_getmessage(myinfo,jprint(valsobj,1))) != 0 ) - { - if ( (array= cJSON_Parse(retstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(array)) > 0 ) - { - for (i=0; i> 1; - if ( datalen > 0 && datalen < maxlen ) - { - decode_hex(data,datalen,hexstr); - if ( (retval= (*basilisk_verify_func)(myinfo,swap,data,datalen)) == 0 ) - { - break; - } - } - } - } - } - free_json(array); - } - free(retstr); - }*/ while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { memset(srchash.bytes,0,sizeof(srchash)); @@ -952,12 +913,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); - if ( _msgbits == 0x80000000 ) - { - for (i=0; i offset ) basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); if ( ptr != 0 ) @@ -967,12 +922,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) { - if ( swap->messages[i].datalen < 8 ) - { - for (i=0; imessages[i].datalen; i++) - printf("%02x",swap->messages[i].data[i]); - printf("matched %x datalen.%d\n",msgbits,swap->messages[i].datalen); - } retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } @@ -999,15 +948,6 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else - { - if ( msgbits == 0x80000000 ) - { - for (i=0; i<4; i++) - printf("%02x ",data[i]); - printf("datalen.%d offset.%d\n",datalen,offset); - } - } free(buf); return(0); } @@ -1412,7 +1352,7 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - printf("got sendstate.%x\n",swap->I.otherstatebits); + //printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1568,7 +1508,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; - printf("sendstate.%x\n",swap->I.statebits); + //printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index dbb6ca742..ec60b1cc2 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -104,7 +104,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj.(%s)\n",jprint(obj,0)); + } else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(-1); } From aeea388d671b563cf56ed9fc0c44ec0f2e88e0af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:25:20 +0200 Subject: [PATCH 151/286] Test --- basilisk/basilisk.h | 2 +- iguana/iguana_unspents.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 7ca809600..2900dd35f 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -77,7 +77,7 @@ struct basilisk_swapinfo int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate; uint8_t secretAm[20],secretBn[20]; uint8_t secretAm256[32],secretBn256[32]; -}; +} PACKED; struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 0a2951429..12ec1e208 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -916,7 +916,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; - if ( coin->utxofp == 0 ) + if ( 0 && coin->utxofp == 0 ) { sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (coin->utxofp= fopen(fname,"rb+")) == 0 ) @@ -939,6 +939,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, void iguana_unspents_markinit(struct supernet_info *myinfo,struct iguana_info *coin) { char *filestr,fname[1024]; FILE *fp; long filesize; bits256 filetxid; cJSON *array,*item; int32_t i,filevout,n,firstslot; +return; sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (fp= fopen(fname,"rb")) != 0 ) { From 8562b85e228a6ea803b7e28c35844c66c70ab4c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:32:32 +0200 Subject: [PATCH 152/286] Test --- basilisk/basilisk.h | 6 +++--- iguana/iguana_unspents.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 2900dd35f..42a072486 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -69,15 +69,15 @@ struct basilisk_swapinfo char bobstr[64],alicestr[64]; bits256 myhash,otherhash,orderhash; uint32_t statebits,otherstatebits,started,expiration,finished,dead,reftime,putduration,callduration; - int32_t bobconfirms,aliceconfirms,iambob,reclaimed,bobspent,alicespent; + int32_t bobconfirms,aliceconfirms,iambob,reclaimed,bobspent,alicespent,pad; uint64_t alicesatoshis,bobsatoshis,bobinsurance,aliceinsurance; bits256 myprivs[2],mypubs[2],otherpubs[2],pubA0,pubA1,pubB0,pubB1,privAm,pubAm,privBn,pubBn; uint32_t crcs_mypub[2],crcs_mychoosei[2],crcs_myprivs[2],crcs_mypriv[2]; - int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate; + int32_t choosei,otherchoosei,cutverified,otherverifiedcut,numpubs,havestate,otherhavestate,pad2; uint8_t secretAm[20],secretBn[20]; uint8_t secretAm256[32],secretBn256[32]; -} PACKED; +}; struct basilisk_value { bits256 txid; int64_t value; int32_t height; int16_t vout; char coinaddr[64]; }; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 12ec1e208..19db61d54 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -916,7 +916,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; - if ( 0 && coin->utxofp == 0 ) + if ( (0) && coin->utxofp == 0 ) { sprintf(fname,"%s/%s/utxo.dat",GLOBAL_DBDIR,coin->symbol), OS_compatible_path(fname); if ( (coin->utxofp= fopen(fname,"rb+")) == 0 ) From 071f3fc738f996e548b37de6cd38e60926273c7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:42:45 +0200 Subject: [PATCH 153/286] Test --- basilisk/basilisk_tradebot.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index ec60b1cc2..bf590458f 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -92,6 +92,7 @@ cJSON *basilisk_swapobj(struct supernet_info *myinfo,struct basilisk_swap *swap) jaddnum(obj,"quoteid",swap->I.req.quoteid); jadd(obj,"req",basilisk_requestjson(&swap->I.req)); jaddstr(obj,"info",hexstr); + printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(obj); } From 0a5f8883546755661df59fa14897a4a35e2cdf4e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 19:54:23 +0200 Subject: [PATCH 154/286] Test --- basilisk/basilisk_swap.c | 30 ++++++++++++++++-------------- basilisk/basilisk_tradebot.c | 4 ++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e015ff4a4..73a5cc073 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,6 +13,8 @@ * * ******************************************************************************/ +#define DEX_SLEEP 1 + // Todo: monitor blockchains, ie complete extracting scriptsig // mode to autocreate required outputs // more better LP commands @@ -779,7 +781,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); - sleep(3); + sleep(DEX_SLEEP); } else { @@ -812,7 +814,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); - sleep(3); + sleep(DEX_SLEEP); } else { @@ -1628,7 +1630,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( (swap->I.otherstatebits & 0x80) != 0 && (swap->I.statebits & 0x80) != 0 ) break; - sleep(13 + (swap->I.iambob == 0)*1); + sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) @@ -1689,7 +1691,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("bobspend confirmed\n"); swap->I.statebits |= 0x80000; printf("Bob confirms spend of Alice's payment\n"); - sleep(10); + sleep(DEX_SLEEP); } retval = 1; } @@ -1811,7 +1813,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } if ( (rand() % 30) == 0 ) printf("finished swapstate.%x other.%x\n",swap->I.statebits,swap->I.otherstatebits); - sleep(13 + (swap->I.iambob == 0)); + sleep(DEX_SLEEP + (swap->I.iambob == 0)); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } @@ -1920,7 +1922,7 @@ void basilisk_swaploop(void *_swap) if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; } - sleep(10); + sleep(DEX_SLEEP); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); } @@ -1940,7 +1942,7 @@ void basilisk_swaploop(void *_swap) swap->I.statebits |= 0x20; break; } - sleep(13 + (swap->I.iambob == 0)*1); + sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); } @@ -1955,11 +1957,11 @@ void basilisk_swaploop(void *_swap) { //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); - printf("sendstate.%x\n",swap->I.statebits); + //printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); - printf("swapget\n"); + //printf("swapget\n"); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); - printf("after swapget\n"); + //printf("after swapget\n"); if ( swap->myfee.txbytes == 0 ) { /*for (i=0; i<20; i++) @@ -1998,7 +2000,7 @@ void basilisk_swaploop(void *_swap) printf("bobscripts set\n"); if ( basilisk_bobscripts_set(myinfo,swap,1,1) < 0 ) { - sleep(3); + sleep(DEX_SLEEP); printf("bobscripts set error\n"); continue; } @@ -2013,7 +2015,7 @@ void basilisk_swaploop(void *_swap) if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); - sleep(13); + sleep(DEX_SLEEP); } else { @@ -2050,7 +2052,7 @@ void basilisk_swaploop(void *_swap) } while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { - sleep(13); + sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) @@ -2134,7 +2136,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 m = n = 0; //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); - sleep(3); + sleep(DEX_SLEEP); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index bf590458f..7491d8182 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -92,7 +92,7 @@ cJSON *basilisk_swapobj(struct supernet_info *myinfo,struct basilisk_swap *swap) jaddnum(obj,"quoteid",swap->I.req.quoteid); jadd(obj,"req",basilisk_requestjson(&swap->I.req)); jaddstr(obj,"info",hexstr); - printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); + //printf("strlen(hexstr) swap->I %d vs %d\n",(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(obj); } @@ -105,7 +105,7 @@ int32_t basilisk_swapconv(struct supernet_info *myinfo,struct basilisk_swap *swa if ( juint(obj,"requestid") == swap->I.req.requestid && juint(obj,"quoteid") == swap->I.req.quoteid ) return(0); printf("swapconv mismatched req/quote %d %d, %d %d\n",juint(obj,"requestid"),swap->I.req.requestid,juint(obj,"quoteid"),swap->I.req.quoteid); - } else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); + } //else printf("no info field in swap obj.(%s) len.%d vs %d\n",jprint(obj,0),(int32_t)strlen(hexstr),(int32_t)sizeof(swap->I)*2); return(-1); } From 328331656996e995fac349b4c30f10b5c2479395 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:07:50 +0200 Subject: [PATCH 155/286] Test --- basilisk/basilisk_MSG.c | 2 +- basilisk/jumblr.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 64aecc90d..3af06c656 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -479,7 +479,7 @@ int32_t basilisk_process_retarray(struct supernet_info *myinfo,void *ptr,int32_t item = jitem(retarray,i); if ( jobj(item,"error") != 0 ) continue; - printf("(%s).%d ",jprint(item,0),i); + //printf("(%s).%d ",jprint(item,0),i); if ( (datalen= basilisk_message_returned(key,data,maxlen,item)) > 0 ) { duration = juint(item,"duration"); diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index ec3e797dc..a39e7b0a5 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,6 +383,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); + jaddbits256(vals,"srchash",curve25519(privkey,curve25519_basepoint9())); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); @@ -494,6 +495,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) jumblr_importprivkey(myinfo,coin,wifstr); @@ -506,7 +508,8 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jumblr_importprivkey(myinfo,coinbtc,wifstr); jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); if ( coinbtc != 0 ) From 7d9d5a42c835fc0ac64bb6df56271eec996a913e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:18:59 +0200 Subject: [PATCH 156/286] Test --- basilisk/basilisk_DEX.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 78bad0c89..a1f22b9ac 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -312,6 +312,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) free(retstr);*/ if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request { + printf("matched persistent\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); @@ -320,6 +321,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) } else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) { + printf("matched jumblr_pubkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); @@ -328,6 +330,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) } else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) { + printf("matched jumblr_depositkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); From 984dd6e81a3ad6486b8373fbc6c06db68e1b4fc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:23:51 +0200 Subject: [PATCH 157/286] Test --- basilisk/basilisk_DEX.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index a1f22b9ac..6e6432a3b 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,13 +231,14 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i; + cJSON *retjson; struct basilisk_request *rp=0; int32_t i,reqmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - if ( (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) + reqmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); + if ( (reqmatch != 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) { for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == _rp->requestid ) From 29a71f6f55d2ef2bc67703c0ae0cd2b41782b24d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:40:46 +0200 Subject: [PATCH 158/286] Test --- basilisk/basilisk_swap.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 73a5cc073..7704d8941 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -950,6 +950,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + else printf("send.[%d] %x\n",sentbytes,msgbits); free(buf); return(0); } @@ -1491,7 +1492,7 @@ void basilisk_sendpubkeys(struct supernet_info *myinfo,struct basilisk_swap *swa { int32_t datalen; datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); - //printf("send deck.%d\n",datalen); + printf("send deck.%d\n",datalen); swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01,swap->I.crcs_mypub); } @@ -1566,7 +1567,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa revcalc_rmd160_sha256(swap->I.secretAm,swap->I.privAm);//.bytes,sizeof(swap->privAm)); vcalc_sha256(0,swap->I.secretAm256,swap->I.privAm.bytes,sizeof(swap->I.privAm)); swap->I.pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privAm); - //printf("set privAm.%s %s\n",bits256_str(str,swap->privAm),bits256_str(str2,*(bits256 *)swap->secretAm256)); + char str[65],str2[65]; printf("set privAm.%s %s\n",bits256_str(str,swap->I.privAm),bits256_str(str2,*(bits256 *)swap->I.secretAm256)); //basilisk_bobscripts_set(myinfo,swap,0); } } @@ -2050,7 +2051,7 @@ void basilisk_swaploop(void *_swap) } } } - while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) + while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); From f19cba0e71ac338d6932160d93718d45591710ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:45:11 +0200 Subject: [PATCH 159/286] Test --- basilisk/basilisk_swap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7704d8941..1df1ce336 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -908,6 +908,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); crc32 = calc_crc32(0,ptr,size); + printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) srchash.bytes[i] = ptr[offset++]; From fc49af5f09041d42189da6f9ccc77876bc425fcf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:51:41 +0200 Subject: [PATCH 160/286] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1df1ce336..3339da360 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,7 +923,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->persistent_pubkey) == 0 ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From e2f14d679fe1d63ce15526ade8a8ad323026a5f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 20:57:51 +0200 Subject: [PATCH 161/286] Test --- basilisk/basilisk_swap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3339da360..ab6292eaa 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,7 +923,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); + if ( swap->messages[i].msgbits == msgbits )//&& bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 22ad4b81282650bea1b2cb24b0a2db274ae36815 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:02:42 +0200 Subject: [PATCH 162/286] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ab6292eaa..98f9fe9ae 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -923,8 +923,8 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap } for (i=0; inummessages; i++) { - char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits )//&& bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) != 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 4a7b48a13a497118b847c73b532936888cbf302b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:09:33 +0200 Subject: [PATCH 163/286] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 98f9fe9ae..bedcd6c13 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -924,7 +924,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap for (i=0; inummessages; i++) { //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) != 0 ) + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; From 10c9011c7984c01ef1ecaf9266ac890e29c4bca6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:22:32 +0200 Subject: [PATCH 164/286] Test --- basilisk/basilisk_swap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index bedcd6c13..decdbb00a 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -921,15 +921,17 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } + char str[65],str2[65]; for (i=0; inummessages; i++) { - //char str[65],str2[65]; printf("%s vs %s\n",bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->I.otherhash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].srchash,swap->I.otherhash) == 0 ) + printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); + if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } } + printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } From b7134e6fd6c112d95f07d3a57e68d7e808a373e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:31:58 +0200 Subject: [PATCH 165/286] Test --- basilisk/basilisk_DEX.c | 7 ++++--- basilisk/jumblr.c | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 6e6432a3b..5118711dd 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,14 +231,15 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i,reqmatch; + cJSON *retjson; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - reqmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); - if ( (reqmatch != 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) + srcmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); + destmatch = (bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_depositkey) == 0); + if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == _rp->requestid ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a39e7b0a5..4dabd3399 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,12 +383,13 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); - jaddbits256(vals,"srchash",curve25519(privkey,curve25519_basepoint9())); + hash = curve25519(privkey,curve25519_basepoint9()); + jaddbits256(vals,"srchash",hash); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); - //jaddnum(vals,"usejumblr",1); - memset(hash.bytes,0,sizeof(hash)); + jaddnum(vals,"usejumblr",1); + //memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) { From bec70b031becbcf657063847f23cd7532ab1140f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:38:14 +0200 Subject: [PATCH 166/286] Test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/jumblr.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 5118711dd..6b976d964 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -661,8 +661,6 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); - if ( jobj(vals,"srchash") == 0 ) - jaddbits256(vals,"srchash",myinfo->myaddr.persistent); if ( jobj(vals,"desthash") == 0 ) jaddbits256(vals,"desthash",hash); jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); @@ -673,6 +671,8 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) else privkey = myinfo->persistent_priv; hash = curve25519(privkey,curve25519_basepoint9()); //hash = myinfo->myaddr.persistent; + if ( jobj(vals,"srchash") == 0 ) + jaddbits256(vals,"srchash",hash); printf("service.(%s)\n",jprint(vals,0)); memset(&R,0,sizeof(R)); if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4dabd3399..a5e356735 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -383,13 +383,12 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); vals = cJSON_CreateObject(); jaddstr(vals,"source","BTC"); - hash = curve25519(privkey,curve25519_basepoint9()); - jaddbits256(vals,"srchash",hash); + //hash = curve25519(privkey,curve25519_basepoint9()); jaddstr(vals,"dest","KMD"); jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"minprice",kmdprice*.95); jaddnum(vals,"usejumblr",1); - //memset(hash.bytes,0,sizeof(hash)); + memset(hash.bytes,0,sizeof(hash)); pending = btcavail; if ( (retstr= InstantDEX_request(myinfo,coinbtc,0,0,hash,vals,"")) != 0 ) { From 16e75cb61f1f9e0e85d27a28b2cfc810c0beff90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:48:06 +0200 Subject: [PATCH 167/286] Test --- basilisk/basilisk_DEX.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 6b976d964..9ffba09ef 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -277,7 +277,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) { static uint32_t lastpoll; - char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; + char *retstr,BTCaddr[64],KMDaddr[64]; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); @@ -327,7 +327,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_pubkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,""),&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); } else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) @@ -336,7 +336,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->jumblr_depositkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX),&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) free(retstr); From ce1b86963a4685de823b7f248dc3f0ccde368464 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 21:52:26 +0200 Subject: [PATCH 168/286] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index decdbb00a..28606f5a3 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -921,17 +921,17 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - char str[65],str2[65]; + //char str[65],str2[65]; for (i=0; inummessages; i++) { - printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); + //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); break; } } - printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); + //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } From d3031aaec106ea959f782944e85424240df0f120 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 5 Mar 2017 22:28:38 +0200 Subject: [PATCH 169/286] Test --- basilisk/jumblr.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index a5e356735..c64614514 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -245,7 +245,9 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) { //printf("params.(%s)\n",jprint(params,0)); if ( (from= jstr(params,"fromaddress")) != 0 ) + { safecopy(ptr->src,from,sizeof(ptr->src)); + } if ( (amounts= jarray(&n,params,"amounts")) != 0 ) { for (i=0; istatus == 0 ) { if ( (retstr= jumblr_zgetoperationstatus(myinfo,coin,ptr->opid)) != 0 ) @@ -287,6 +289,15 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str if ( strcmp(status,"success") == 0 ) { ptr->status = jumblr_itemset(ptr,item,status); + jumblr_privkey(myinfo,BTCaddr,KMDdeposit,JUMBLR_DEPOSITPREFIX); + jumblr_privkey(myinfo,BTCaddr,KMDjumblr,""); + if ( (jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->src,KMDdeposit) != 0) || (jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->src) == 't' && strcmp(ptr->dest,KMDjumblr) != 0) ) + { + printf("a non-jumblr t->z pruned\n"); + free(jumblr_zgetoperationresult(myinfo,coin,ptr->opid)); + ptr->status = -1; + } + } else if ( strcmp(status,"failed") == 0 ) { From b309937f475bfa87e7e2fc24b7945792d43e8fd1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:08:48 +0200 Subject: [PATCH 170/286] Test --- basilisk/basilisk.c | 3 +- basilisk/basilisk_DEX.c | 83 +++++------------------------------- basilisk/basilisk_swap.c | 14 +++++- basilisk/basilisk_tradebot.c | 14 ++---- basilisk/jumblr.c | 2 + basilisk/smartaddress.c | 81 +++++++++++++++++++++++++++++++++++ iguana/dpow/dpow_network.c | 6 +-- iguana/iguana777.h | 7 +++ iguana/iguana_wallet.c | 3 ++ iguana/tests/loop | 1 - includes/iguana_funcs.h | 6 ++- 11 files changed, 128 insertions(+), 92 deletions(-) create mode 100755 basilisk/smartaddress.c diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index fe2150489..ae02e86ea 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -482,6 +482,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_ether.c" #include "basilisk_waves.c" #include "basilisk_lisk.c" +#include "smartaddress.c" #include "basilisk_MSG.c" #include "tradebots_marketmaker.c" @@ -924,7 +925,7 @@ void basilisks_loop(void *arg) if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { //fprintf(stderr,"H "); - basilisk_requests_poll(myinfo,myinfo->persistent_priv); + basilisk_requests_poll(myinfo); } //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 9ffba09ef..973f7fc2a 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -237,8 +237,8 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - srcmatch = (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->srchash,myinfo->jumblr_depositkey) == 0); - destmatch = (bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_pubkey) == 0 || bits256_cmp(_rp->desthash,myinfo->jumblr_depositkey) == 0); + srcmatch = smartaddress_pubkey(myinfo,&privkey,_rp->srchash) >= 0; + destmatch = smartaddress_pubkey(myinfo,&privkey,_rp->desthash) >= 0; if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) @@ -274,10 +274,10 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis } else return(clonestr("{\"error\":\"unexpected basilisk_start not mine and amrelay\"}")); } -void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) +void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; - char *retstr,BTCaddr[64],KMDaddr[64]; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; double hwm = 0.; + char *retstr; uint8_t data[32768]; cJSON *outerarray,*retjson; uint32_t msgid,channel; int32_t datalen,i,n; struct basilisk_request issueR; bits256 privkey; double hwm = 0.; if ( myinfo->IAMNOTARY != 0 || time(NULL) < lastpoll+20 || (myinfo->IAMLP == 0 && myinfo->DEXactive < time(NULL)) ) return; lastpoll = (uint32_t)time(NULL); @@ -301,61 +301,15 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); if ( hwm > 0. ) { - //printf("hwm %f\n",hwm); - //for (i=0; iDEXaccept = issueR; - /*issueR.quoteid = basilisk_quoteid(&issueR); - datalen = basilisk_rwDEXquote(1,data,&issueR); - msgid = (uint32_t)time(NULL); - keylen = basilisk_messagekey(key,0,msgid,issueR.srchash,issueR.desthash); - if ( (retstr= basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,BASILISK_DEXDURATION)) != 0 ) - free(retstr);*/ - if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request - { - printf("matched persistent\n"); - dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } - else if ( bits256_cmp(myinfo->jumblr_pubkey,issueR.srchash) == 0 ) - { - printf("matched jumblr_pubkey\n"); - dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,""),&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } - else if ( bits256_cmp(myinfo->jumblr_depositkey,issueR.srchash) == 0 ) + if ( smartaddress_pubkey(myinfo,&privkey,issueR.srchash) >= 0 ) { - printf("matched jumblr_depositkey\n"); + printf("matched dex_smartpubkey\n"); dex_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid)); // 60 dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); - if ( (retstr= basilisk_start(myinfo,jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX),&issueR,1,issueR.optionhours * 3600)) != 0 ) + if ( (retstr= basilisk_start(myinfo,privkey,&issueR,1,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*if ( (retstr= InstantDEX_accept(myinfo,0,0,0,issueR.requestid,issueR.quoteid)) != 0 ) - free(retstr); - printf("my req hwm %f -> %u\n",hwm,issueR.requestid); - basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); - numiters = crc = 0; - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),crcs)) == 0 ) - { - printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,issueR.srchash,issueR.desthash,channel,0x4000000,(void *)&issueR.requestid,sizeof(issueR.requestid),60); - numiters++; - } - if ( crc != 0 ) - { - printf("crc.%08x -> basilisk_starta\n",crc); - if ( (retstr= basilisk_start(myinfo,&issueR,1,issueR.optionhours * 3600)) != 0 ) - free(retstr); - } // else printf("couldnt accept offer\n");*/ } else if ( issueR.requestid != myinfo->lastdexrequestid )//if ( issueR.quoteid == 0 ) { @@ -369,22 +323,6 @@ void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey) dex_updateclient(myinfo); if ( (retstr= basilisk_start(myinfo,myinfo->persistent_priv,&issueR,0,issueR.optionhours * 3600)) != 0 ) free(retstr); - /*crcs[0] = crcs[1] = 0; - numiters = 0; - basilisk_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen,INSTANTDEX_LOCKTIME*2); - while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),issueR.desthash,issueR.srchash,channel,msgid,data,datalen,crcs)) == 0 ) - { - //printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,issueR.desthash,issueR.srchash,channel,msgid,data,datalen,INSTANTDEX_LOCKTIME*2); - numiters++; - } - if ( crc != 0 ) - { - printf("crc.%08x -> basilisk_start\n",crc); - if ( (retstr= basilisk_start(myinfo,&issueR,0,issueR.optionhours * 3600)) != 0 ) - free(retstr); - }*/ } //else printf("basilisk_requests_poll unexpected hwm issueR\n"); } } @@ -658,7 +596,7 @@ STRING_ARG(InstantDEX,available,source) HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) { - uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); if ( jobj(vals,"desthash") == 0 ) @@ -666,11 +604,10 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); jaddnum(vals,"timestamp",time(NULL)); - if ( jint(vals,"usejumblr") != 0 ) - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + if ( (jumblr= jint(vals,"usejumblr")) != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); else privkey = myinfo->persistent_priv; hash = curve25519(privkey,curve25519_basepoint9()); - //hash = myinfo->myaddr.persistent; if ( jobj(vals,"srchash") == 0 ) jaddbits256(vals,"srchash",hash); printf("service.(%s)\n",jprint(vals,0)); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 28606f5a3..e7ed820a2 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,6 +13,10 @@ * * ******************************************************************************/ +/*use external privkey to sign +make sure to broadcast deposit before claiming refund, or to just skip it if neither is done +*/ + #define DEX_SLEEP 1 // Todo: monitor blockchains, ie complete extracting scriptsig @@ -628,7 +632,7 @@ int32_t basilisk_verify_pubpair(int32_t *wrongfirstbytep,struct basilisk_swap *s cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) { - cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid; + cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; privkeyarray = cJSON_CreateArray(); //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); if ( (n= cJSON_GetArraySize(vins)) > 0 ) @@ -657,7 +661,13 @@ cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *co { bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); jaddistr(privkeyarray,waddr->wifstr); - } else printf("cant find (%s) in wallet\n",coinaddr); + } + else if ( smartaddress(myinfo,&privkey,coinaddr) > 0 ) + { + bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); + jaddistr(privkeyarray,waddr->wifstr); + } + else printf("cant find (%s) in wallet\n",coinaddr); } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); } else printf("invalid txid/vout %d of %d\n",i,n); } diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 7491d8182..8b66ee5a8 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -279,7 +279,7 @@ int32_t basilisk_request_cmpref(struct basilisk_request *ref,struct basilisk_req double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk_request *issueR,struct basilisk_request *list,int32_t n) { - int32_t i,noquoteflag=0,havequoteflag=0,myrequest=0,maxi=-1; int64_t balance=0,destamount,minamount = 0,maxamount = 0; uint32_t pendingid=0; struct basilisk_swap *active; double metric = 0.; + int32_t i,noquoteflag=0,havequoteflag=0,myrequest=0,maxi=-1; int64_t balance=0,destamount,minamount = 0,maxamount = 0; bits256 privkey; uint32_t pendingid=0; struct basilisk_swap *active; double metric = 0.; memset(issueR,0,sizeof(*issueR)); minamount = list[0].minamount; //printf("need to verify null quoteid is list[0] requestid.%u quoteid.%u\n",list[0].requestid,list[0].quoteid); @@ -289,11 +289,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk return(0.); pendingid = active->I.req.quoteid; } - if ( bits256_cmp(myinfo->myaddr.persistent,list[0].srchash) == 0 ) // my request - myrequest = 1; - else if ( bits256_cmp(myinfo->jumblr_pubkey,list[0].srchash) == 0 ) // my request - myrequest = 1; - else if ( bits256_cmp(myinfo->jumblr_depositkey,list[0].srchash) == 0 ) // my request + if ( smartaddress_pubkey(myinfo,&privkey,list[0].srchash) >= 0 ) myrequest = 1; for (i=0; imyaddr.persistent,list[i].desthash) == 0 ) // my quoteid - myrequest |= 2; - else if ( bits256_cmp(myinfo->jumblr_pubkey,list[i].desthash) == 0 ) // my quoteid - myrequest |= 2; - else if ( bits256_cmp(myinfo->jumblr_depositkey,list[i].desthash) == 0 ) // my quoteid + if ( smartaddress_pubkey(myinfo,&privkey,list[i].desthash) >= 0 ) myrequest |= 2; havequoteflag++; if ( pendingid == 0 ) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c64614514..4d897725a 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -506,6 +506,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + smartaddress_add(myinfo,privkey); myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) @@ -520,6 +521,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + smartaddress_add(myinfo,privkey); myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c new file mode 100755 index 000000000..bfcaf50e8 --- /dev/null +++ b/basilisk/smartaddress.c @@ -0,0 +1,81 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +// included from basilisk.c + +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) +{ + struct smartaddress *ap; + int32_t i; + if ( myinfo->numsmartaddrs < sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs) ) + { + for (i=0; inumsmartaddrs; i++) + if ( bits256_cmp(myinfo->smartaddrs[i].privkey,privkey) == 0 ) + return(-1); + ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; + ap->privkey = privkey; + bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); + ap->pubkey = curve25519(privkey,curve25519_basepoint9()); + calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + } + printf("too many smartaddresses\n"); + return(-1); +} + +int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr) +{ + int32_t i; uint8_t addrtype,rmd160[20]; + memset(privkeyp,0,sizeof(*privkeyp)); + bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); + for (i=0; inumsmartaddrs; i++) + if ( memcmp(myinfo->smartaddrs[i].rmd160,rmd160,20) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(-1); +} + +int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey) +{ + int32_t i; + memset(privkeyp,0,sizeof(*privkeyp)); + for (i=0; inumsmartaddrs; i++) + if ( bits256_cmp(myinfo->smartaddrs[i].pubkey,pubkey) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(-1); +} + +int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33) +{ + int32_t i; + memset(privkeyp,0,sizeof(*privkeyp)); + for (i=0; inumsmartaddrs; i++) + if ( memcmp(myinfo->smartaddrs[i].pubkey33,pubkey33,33) == 0 ) + { + *privkeyp = myinfo->smartaddrs[i].privkey; + return(i); + } + return(0); +} + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + + +#include "../includes/iguana_apiundefs.h" diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6f17c611a..0bd18acf1 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -515,14 +515,14 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *key,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//#ifndef __APPLE__ - if ( 0 && (rand() % 100) < 40 ) +#ifndef __APPLE__ + if ( (rand() % 100) < 40 ) { nanomsg_tcpname(0,str,ipaddr,REP_SOCK); nn_connect(myinfo->reqsock,str); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } -//#endif +#endif } } if ( freeptr != 0 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index b66a833a0..5da5222c5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -90,6 +90,12 @@ struct supernet_address char NXTADDR[32],BTC[64],BTCD[64]; }; +struct smartaddress +{ + bits256 privkey,pubkey; + uint8_t pubkey33[33],rmd160[20]; +}; + struct pending_trade { UT_hash_handle hh; double basevolume,relvolume,dir; char base[32],rel[32]; }; #define PSOCK_IDLETIMEOUT 600 @@ -156,6 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; + struct smartaddress smartaddrs[64]; int32_t numsmartaddrs; }; struct basilisk_swapmessage diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 65f5c0d56..d6183f657 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1367,6 +1367,9 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) jumblr_importprivkey(myinfo,coin,wifstr); } } + if ( bits256_nonz(myinfo->persistent_priv) != 0 ) + smartaddress_add(myinfo,myinfo->persistent_priv); + //basilisk_unspents_update(myinfo,coin); return(retstr); } diff --git a/iguana/tests/loop b/iguana/tests/loop index b7e8cfa16..460d2c4db 100755 --- a/iguana/tests/loop +++ b/iguana/tests/loop @@ -1,7 +1,6 @@ #!/bin/bash while true do -./dexlistunspent ./dexgetinfo done diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 95ae1e414..bcdd21cdf 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -595,8 +595,12 @@ int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fil void basilisk_ensurerelay(struct supernet_info *myinfo,struct iguana_info *notaries,uint32_t ipbits); void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); -void basilisk_requests_poll(struct supernet_info *myinfo,bits256 privkey); +void basilisk_requests_poll(struct supernet_info *myinfo); void dpow_psockloop(void *_ptr); +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey); +int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr); +int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey); +int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33); void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); From 723b1f454d711f2c9f2675df9597aac86dcf1422 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:14:28 +0200 Subject: [PATCH 171/286] Test --- basilisk/basilisk_DEX.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 973f7fc2a..30f9bed74 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -231,14 +231,14 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; + cJSON *retjson; bits256 tmpprivkey; struct basilisk_request *rp=0; int32_t i,srcmatch,destmatch; if ( _rp->requestid == myinfo->lastdexrequestid ) { //printf("filter duplicate r%u\n",_rp->requestid); return(clonestr("{\"error\":\"filter duplicate requestid\"}")); } - srcmatch = smartaddress_pubkey(myinfo,&privkey,_rp->srchash) >= 0; - destmatch = smartaddress_pubkey(myinfo,&privkey,_rp->desthash) >= 0; + srcmatch = smartaddress_pubkey(myinfo,&tmpprivkey,_rp->srchash) >= 0; + destmatch = smartaddress_pubkey(myinfo,&tmpprivkey,_rp->desthash) >= 0; if ( srcmatch != 0 || destmatch != 0 ) { for (i=0; inumswaps; i++) @@ -257,8 +257,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); - } - else return(clonestr("{\"error\":\"couldnt atomic swap thread\"}")); + } else return(clonestr("{\"error\":\"couldnt atomic swap thread\"}")); } else { From 16e96e1a42ae59b4954ab4d6c670dea10aa3d2c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:16:11 +0200 Subject: [PATCH 172/286] Test --- basilisk/smartaddress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index bfcaf50e8..66e54590d 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -30,7 +30,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); } - printf("too many smartaddresses\n"); + printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); return(-1); } From d8c3bcdbf1c44a5619edcabf5ef0741009e3e4e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:21:42 +0200 Subject: [PATCH 173/286] Test --- basilisk/basilisk_swap.c | 6 +++--- basilisk/smartaddress.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e7ed820a2..a3cfebe14 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -662,10 +662,10 @@ cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *co bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); jaddistr(privkeyarray,waddr->wifstr); } - else if ( smartaddress(myinfo,&privkey,coinaddr) > 0 ) + else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) { - bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); - jaddistr(privkeyarray,waddr->wifstr); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jaddistr(privkeyarray,wifstr); } else printf("cant find (%s) in wallet\n",coinaddr); } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 66e54590d..bd54aefe4 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,6 +29,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); return(-1); From 17ec128da646b33030fd3ddf7609ff6979526fb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:26:43 +0200 Subject: [PATCH 174/286] Test --- basilisk/smartaddress.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index bd54aefe4..e653a96db 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -44,8 +44,10 @@ int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinad if ( memcmp(myinfo->smartaddrs[i].rmd160,rmd160,20) == 0 ) { *privkeyp = myinfo->smartaddrs[i].privkey; + printf("MATCHED %s\n",coinaddr); return(i); } + printf("smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); return(-1); } From 9d2b7a628c0cf230e643b34da91a4663ce5dc5cf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:31:49 +0200 Subject: [PATCH 175/286] Test --- basilisk/basilisk_swap.c | 4 ++-- basilisk/smartaddress.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a3cfebe14..655ffe433 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -918,7 +918,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); crc32 = calc_crc32(0,ptr,size); - printf("gotmsg.[%d] crc.%x\n",size,crc32); + //printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) srchash.bytes[i] = ptr[offset++]; @@ -964,7 +964,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x\n",sentbytes,msgbits); + //else printf("send.[%d] %x\n",sentbytes,msgbits); free(buf); return(0); } diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index e653a96db..0b79e950b 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,6 +29,10 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + char coinaddr[64]; bitcoin_address(coinaddr,0,ap->rmd160,20); + for (i=0; i<20; i++) + printf("%02x",ap->rmd160[i]); + printf (" <- rmd160 for %d %s\n",myinfo->numsmartaddrs,coinaddr); return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); From 1adb8552f71be4d57e87aedf7ca746b51e0bdd27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:40:22 +0200 Subject: [PATCH 176/286] Test --- basilisk/jumblr.c | 4 ++-- basilisk/smartaddress.c | 8 ++++---- iguana/iguana_wallet.c | 2 +- includes/iguana_funcs.h | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 4d897725a..11ef2a220 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -506,7 +506,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) retjson = cJSON_CreateObject(); jaddstr(retjson,"result","success"); privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - smartaddress_add(myinfo,privkey); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); if ( coin->FULLNODE < 0 ) @@ -521,7 +521,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase) jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); } privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - smartaddress_add(myinfo,privkey); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"BTCjumblr",BTCaddr); diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 0b79e950b..3fc645fcf 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -15,7 +15,7 @@ // included from basilisk.c -int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCaddr,char *KMDaddr) { struct smartaddress *ap; int32_t i; @@ -27,12 +27,12 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey) ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; ap->privkey = privkey; bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); - ap->pubkey = curve25519(privkey,curve25519_basepoint9()); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); - char coinaddr[64]; bitcoin_address(coinaddr,0,ap->rmd160,20); + ap->pubkey = curve25519(privkey,curve25519_basepoint9()); + char coinaddr[64]; bitcoin_address(coinaddr,0,ap->pubkey33,33); for (i=0; i<20; i++) printf("%02x",ap->rmd160[i]); - printf (" <- rmd160 for %d %s\n",myinfo->numsmartaddrs,coinaddr); + printf (" <- rmd160 for %d %s vs %s\n",myinfo->numsmartaddrs,coinaddr,BTCaddr); return(myinfo->numsmartaddrs); } printf("too many smartaddresses %d vs %d\n",myinfo->numsmartaddrs,(int32_t)(sizeof(myinfo->smartaddrs)/sizeof(*myinfo->smartaddrs))); diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index d6183f657..90303ae80 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1368,7 +1368,7 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) } } if ( bits256_nonz(myinfo->persistent_priv) != 0 ) - smartaddress_add(myinfo,myinfo->persistent_priv); + smartaddress_add(myinfo,myinfo->persistent_priv,"",""); //basilisk_unspents_update(myinfo,coin); return(retstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index bcdd21cdf..f36ea10e4 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -597,7 +597,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr); int32_t iguana_datachain_scan(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t rmd160[20]); void basilisk_requests_poll(struct supernet_info *myinfo); void dpow_psockloop(void *_ptr); -int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey); +int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCaddr,char *KMDaddr); int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinaddr); int32_t smartaddress_pubkey(struct supernet_info *myinfo,bits256 *privkeyp,bits256 pubkey); int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uint8_t *pubkey33); From 8a8ebf5f48c53a900fcb638659dc0ddae7333a98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:45:16 +0200 Subject: [PATCH 177/286] Test --- basilisk/smartaddress.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 3fc645fcf..0f1ea7224 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -51,7 +51,9 @@ int32_t smartaddress(struct supernet_info *myinfo,bits256 *privkeyp,char *coinad printf("MATCHED %s\n",coinaddr); return(i); } - printf("smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); + for (i=0; i<20; i++) + printf("%02x",rmd160[i]); + printf(" <- rmd160 smartaddress cant find (%s) of %d\n",coinaddr,myinfo->numsmartaddrs); return(-1); } From 0eaf00aa98ece0d1cfe5a488435b0746d10ab91a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:50:50 +0200 Subject: [PATCH 178/286] Test --- basilisk/smartaddress.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 0f1ea7224..2aa4b5923 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -29,9 +29,14 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCa bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); calc_rmd160(0,ap->rmd160,ap->pubkey33,33); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); - char coinaddr[64]; bitcoin_address(coinaddr,0,ap->pubkey33,33); + char coinaddr[64]; uint8_t addrtype,rmd160[20]; + bitcoin_address(coinaddr,0,ap->pubkey33,33); for (i=0; i<20; i++) printf("%02x",ap->rmd160[i]); + bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr); + printf(", "); + for (i=0; i<20; i++) + printf("%02x",rmd160[i]); printf (" <- rmd160 for %d %s vs %s\n",myinfo->numsmartaddrs,coinaddr,BTCaddr); return(myinfo->numsmartaddrs); } From 09a946c5fd2d224a3944bbe7e1bacd3474023c63 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Mar 2017 21:57:47 +0200 Subject: [PATCH 179/286] Test --- basilisk/smartaddress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 2aa4b5923..95b15c6e9 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -27,7 +27,7 @@ int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *BTCa ap = &myinfo->smartaddrs[myinfo->numsmartaddrs++]; ap->privkey = privkey; bitcoin_pubkey33(myinfo->ctx,ap->pubkey33,privkey); - calc_rmd160(0,ap->rmd160,ap->pubkey33,33); + calc_rmd160_sha256(ap->rmd160,ap->pubkey33,33); ap->pubkey = curve25519(privkey,curve25519_basepoint9()); char coinaddr[64]; uint8_t addrtype,rmd160[20]; bitcoin_address(coinaddr,0,ap->pubkey33,33); From 86ca9765f648d67c24722f9328ccbbe4149c1395 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 10:10:23 +0200 Subject: [PATCH 180/286] Test --- basilisk/basilisk_swap.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 655ffe433..8794cab01 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -912,7 +912,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { - uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; + uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { memset(srchash.bytes,0,sizeof(srchash)); @@ -937,10 +937,13 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { - retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); - break; + mp = &swap->messages[i]; + if ( msgbits != 0x80000000 ) + break; } } + if ( mp != 0 ) + retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } @@ -1365,10 +1368,11 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - int32_t retval; struct basilisk_swap *swap = ptr; - if ( datalen == sizeof(swap->I.otherstatebits) ) + int32_t retval; uint32_t t; struct basilisk_swap *swap = ptr; + if ( datalen == sizeof(swap->I.otherstatebits)+sizeof(t) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); + retval += iguana_rwnum(0,data,sizeof(t),&t); //printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); @@ -1524,9 +1528,10 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - int32_t datalen; + int32_t datalen; uint32_t t = (uint32_t)time(NULL); //printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); + datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From e3824d672e067688d6250777a7fb075cee636eaa Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:11:12 +0200 Subject: [PATCH 181/286] Test --- basilisk/basilisk_swap.c | 6 ++++-- iguana/iguana_chains.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 8794cab01..9615da35d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -719,6 +719,8 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } + //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + // txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -1373,7 +1375,7 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); retval += iguana_rwnum(0,data,sizeof(t),&t); - //printf("got sendstate.%x\n",swap->I.otherstatebits); + printf("got sendstate.%x t.%u\n",swap->I.otherstatebits,t); return(retval); } else return(-1); } @@ -1529,7 +1531,7 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen; uint32_t t = (uint32_t)time(NULL); - //printf("sendstate.%x\n",swap->I.statebits); + printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 87a8ce798..b5749f8f5 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -486,7 +486,7 @@ void iguana_chaininit(struct supernet_info *myinfo,struct iguana_chain *chain,in if ( strcmp(chain->symbol,"BTC") == 0 ) { chain->unitval = 0x1d; - chain->txfee = 10000; + chain->txfee = 50000; chain->havecltv = 1; } else chain->txfee = 10000; From cbf8fed7cb9316f910faac15d3ae7438a99d7013 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:15:53 +0200 Subject: [PATCH 182/286] Test --- basilisk/basilisk_swap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 9615da35d..8cda95bc5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -899,7 +899,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf(" new message.[%d] datalen.%d Q.%x msg.%x\n",swap->nummessages,datalen,quoteid,msgbits); + printf(" new message.[%d] datalen.%d Q.%x msg.%x [%x]\n",swap->nummessages,datalen,quoteid,msgbits,*(uint32_t *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -942,6 +942,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; + printf("set 80000000 -> %d\n",i); } } if ( mp != 0 ) From 1beb3bd8c75921d63171e2cfe161528f8e6f5c98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:24:40 +0200 Subject: [PATCH 183/286] Test --- basilisk/basilisk_swap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 8cda95bc5..ef8ff6633 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -899,7 +899,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa for (i=0; inummessages; i++) if ( crc32 == swap->messages[i].crc32 ) return; - printf(" new message.[%d] datalen.%d Q.%x msg.%x [%x]\n",swap->nummessages,datalen,quoteid,msgbits,*(uint32_t *)data); + printf(" new message.[%d] datalen.%d Q.%x msg.%x [%llx]\n",swap->nummessages,datalen,quoteid,msgbits,*(long long *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); mp = &swap->messages[swap->nummessages++]; mp->crc32 = crc32; @@ -942,11 +942,11 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; - printf("set 80000000 -> %d\n",i); + printf("set 80000000 -> %d [%llx]\n",i,*(long long *)swap->messages[i].data); } } if ( mp != 0 ) - retval = (*basilisk_verify_func)(myinfo,swap,swap->messages[i].data,swap->messages[i].datalen); + retval = (*basilisk_verify_func)(myinfo,swap,mp->data,mp->datalen); //printf("mine/other %s vs %s\n",bits256_str(str,swap->I.myhash),bits256_str(str2,swap->I.otherhash)); return(retval); } @@ -970,7 +970,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - //else printf("send.[%d] %x\n",sentbytes,msgbits); + else printf("send.[%d] %x [%llx]\n",sentbytes,msgbits,*(long long *)&buf[offset - datalen]); free(buf); return(0); } From 71a5bc16a2bb4423735448990a5d7b0e732eb585 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:33:22 +0200 Subject: [PATCH 184/286] Test --- basilisk/basilisk_swap.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ef8ff6633..2092f9afc 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -897,7 +897,7 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa { int32_t i; struct basilisk_swapmessage *mp; for (i=0; inummessages; i++) - if ( crc32 == swap->messages[i].crc32 ) + if ( crc32 == swap->messages[i].crc32 && msgbits == swap->messages[i].msgbits && bits256_cmp(srchash,swap->messages[i].srchash) == 0 && bits256_cmp(desthash,swap->messages[i].desthash) == 0 ) return; printf(" new message.[%d] datalen.%d Q.%x msg.%x [%llx]\n",swap->nummessages,datalen,quoteid,msgbits,*(long long *)data); swap->messages = realloc(swap->messages,sizeof(*swap->messages) * (swap->nummessages + 1)); @@ -929,7 +929,10 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); if ( size > offset ) + { + printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + } if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } @@ -970,7 +973,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x [%llx]\n",sentbytes,msgbits,*(long long *)&buf[offset - datalen]); + else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); } From 90eab0ae3750bd7732f6926b787f11e2cf885ca7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:40:11 +0200 Subject: [PATCH 185/286] Test --- basilisk/basilisk_swap.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2092f9afc..7fc616e9c 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1374,12 +1374,11 @@ void basilisk_swap_purge(struct supernet_info *myinfo,struct basilisk_swap *swap int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { - int32_t retval; uint32_t t; struct basilisk_swap *swap = ptr; - if ( datalen == sizeof(swap->I.otherstatebits)+sizeof(t) ) + int32_t retval; struct basilisk_swap *swap = ptr; + if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - retval += iguana_rwnum(0,data,sizeof(t),&t); - printf("got sendstate.%x t.%u\n",swap->I.otherstatebits,t); + printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1534,10 +1533,9 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - int32_t datalen; uint32_t t = (uint32_t)time(NULL); + int32_t datalen=0; printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); - datalen += iguana_rwnum(1,data,sizeof(t),&t); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From 72d1d2b0e5d06198b70c2da05158bcf9d1404bb5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 15:47:14 +0200 Subject: [PATCH 186/286] Test --- basilisk/basilisk_swap.c | 97 +--------------------------------------- 1 file changed, 2 insertions(+), 95 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7fc616e9c..5eeb65d96 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -930,7 +930,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); if ( size > offset ) { - printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); + //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); } if ( ptr != 0 ) @@ -945,7 +945,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap mp = &swap->messages[i]; if ( msgbits != 0x80000000 ) break; - printf("set 80000000 -> %d [%llx]\n",i,*(long long *)swap->messages[i].data); } } if ( mp != 0 ) @@ -957,11 +956,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t datalen,uint32_t nextbits,uint32_t crcs[2]) { uint8_t *buf; int32_t sentbytes,offset=0,i; - //if ( (rand() % 10) == 0 ) - // basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); - //if ( basilisk_crcsend(myinfo,0,swap->verifybuf,sizeof(swap->verifybuf),swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,crcs) != 0 ) - //return(nextbits); - //dex_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen); //INSTANTDEX_LOCKTIME*2 buf = malloc(datalen + sizeof(msgbits) + sizeof(swap->I.req.quoteid) + sizeof(bits256)*2); for (i=0; i<32; i++) buf[offset++] = swap->I.myhash.bytes[i]; @@ -973,7 +967,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); - else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); + //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); } @@ -1131,27 +1125,6 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu if ( coin == 0 || iguana_coinfind(dest) == 0 ) return(0); *bobcoinp = *alicecoinp = 0; - /*if ( strcmp("BTC",src) == 0 ) - { - *bobcoinp = iguana_coinfind(src); - *alicecoinp = iguana_coinfind(dest); - } - else if ( strcmp("BTC",dest) == 0 ) - { - *bobcoinp = iguana_coinfind(dest); - *alicecoinp = iguana_coinfind(src); - } - else if ( (coin= iguana_coinfind(src)) != 0 && coin->chain->havecltv != 0 ) - { - *bobcoinp = iguana_coinfind(src); - *alicecoinp = iguana_coinfind(dest); - } - else if ( (coin= iguana_coinfind(dest)) != 0 && coin->chain->havecltv != 0 ) - { - *bobcoinp = iguana_coinfind(dest); - *alicecoinp = iguana_coinfind(src); - } - else return(0);*/ *bobcoinp = iguana_coinfind(dest); *alicecoinp = iguana_coinfind(src); if ( bits256_cmp(pubkey,srchash) == 0 ) @@ -1175,7 +1148,6 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - //struct iguana_info *bobcoin,*alicecoin; uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) @@ -1188,47 +1160,6 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->alicecoin = iguana_coinfind(swap->I.req.src); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; - /*if ( strcmp("BTC",swap->I.req.src) == 0 ) - { - swap->bobcoin = iguana_coinfind("BTC"); - swap->I.bobsatoshis = swap->I.req.srcamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.dest); - swap->I.alicesatoshis = swap->I.req.destamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - } - else if ( strcmp("BTC",swap->I.req.dest) == 0 ) - { - swap->bobcoin = iguana_coinfind("BTC"); - swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - } - else - { - if ( (coin= iguana_coinfind(swap->I.req.src)) != 0 ) - { - if ( coin->chain->havecltv != 0 ) - { - swap->bobcoin = coin; - swap->I.bobsatoshis = swap->I.req.srcamount; - swap->alicecoin = iguana_coinfind(swap->I.req.dest); - swap->I.alicesatoshis = swap->I.req.destamount; - } - else if ( (coin= iguana_coinfind(swap->I.req.dest)) != 0 ) - { - if ( coin->chain->havecltv != 0 ) - { - swap->bobcoin = coin; - swap->I.bobsatoshis = swap->I.req.destamount; - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - } else printf("neither coin handles ctlv %s %s\n",swap->I.req.src,swap->I.req.dest); - } else printf("cant find src or dest coin.(%s %s)\n",swap->I.req.src,swap->I.req.dest); - } else printf("cant find src coin.(%s)\n",swap->I.req.src); - }*/ if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); @@ -1263,28 +1194,6 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - /*if ( bits256_cmp(swap->I.myhash,swap->I.req.srchash) == 0 ) - { - swap->I.otherhash = swap->I.req.desthash; - if ( strcmp(swap->I.req.src,swap->I.bobstr) == 0 ) - swap->I.iambob = 1; - } - else if ( bits256_cmp(swap->I.myhash,swap->I.req.desthash) == 0 ) - { - swap->I.otherhash = swap->I.req.srchash; - if ( strcmp(swap->I.req.dest,swap->I.bobstr) == 0 ) - swap->I.iambob = 1; - } - else - { - printf("neither src nor dest error\n"); - return(0); - } - if ( (bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)+1)/2 != swap->I.iambob ) - { - printf("error iambob.%d != %d\n",swap->I.iambob,bitcoin_coinptrs(pubkey25519,&bobcoin,&alicecoin,swap->I.req.src,swap->I.req.dest,swap->I.req.srchash,swap->I.req.desthash)); - return(0); - }*/ if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); @@ -1378,7 +1287,6 @@ int32_t basilisk_verify_otherstatebits(struct supernet_info *myinfo,void *ptr,ui if ( datalen == sizeof(swap->I.otherstatebits) ) { retval = iguana_rwnum(0,data,sizeof(swap->I.otherstatebits),&swap->I.otherstatebits); - printf("got sendstate.%x\n",swap->I.otherstatebits); return(retval); } else return(-1); } @@ -1534,7 +1442,6 @@ int32_t basilisk_checkdeck(struct supernet_info *myinfo,struct basilisk_swap *sw void basilisk_sendstate(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t datalen=0; - printf("sendstate.%x\n",swap->I.statebits); datalen = iguana_rwnum(1,data,sizeof(swap->I.statebits),&swap->I.statebits); basilisk_swapsend(myinfo,swap,0x80000000,data,datalen,0,0); } From 4137c512f780121a4f181a86cc7982fde250f16f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Mar 2017 17:17:46 +0200 Subject: [PATCH 187/286] Test --- basilisk/basilisk.h | 2 +- basilisk/basilisk_swap.c | 28 ++++++++++++++-------------- basilisk/tradebots_liquidity.c | 2 ++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 42a072486..916504b2d 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -16,7 +16,7 @@ #ifndef H_BASILISK_H #define H_BASILISK_H -//#define BASILISK_DISABLESENDTX +#define BASILISK_DISABLESENDTX #define BASILISK_DISABLEWAITTX #include "../iguana/iguana777.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 5eeb65d96..fa237968b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -501,10 +501,10 @@ int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits2 int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobdeposit,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) printf("%02x",swap->bobdeposit.txbytes[i]); @@ -524,7 +524,7 @@ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_ { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) printf("%02x",swap->bobrefund.txbytes[i]); @@ -547,7 +547,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) printf("%02x",swap->bobreclaim.txbytes[i]); @@ -562,13 +562,13 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { uint8_t userdata[512]; int32_t i,retval,len = 0; bits256 revAm; struct basilisk_swap *swap = ptr; memset(revAm.bytes,0,sizeof(revAm)); - if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->blocks.hwmchain.height,&swap->bobpayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobpayment,0,data,datalen,0) == 0 ) { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->blocks.hwmchain.height,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) printf("%02x",swap->bobpayment.txbytes[i]); @@ -587,9 +587,9 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) { int32_t i,retval; - //printf("alicepayment_spend\n"); + printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); - if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->blocks.hwmchain.height,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) + if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->longestchain,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); @@ -604,7 +604,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; - if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->blocks.hwmchain.height,&swap->alicepayment,0,data,datalen,0) == 0 ) + if ( basilisk_rawtx_spendscript(swap,swap->alicecoin->longestchain,&swap->alicepayment,0,data,datalen,0) == 0 ) return(0); else return(-1); } @@ -751,7 +751,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis n = cJSON_GetArraySize(retarray); for (i=0; icoin->blocks.hwmchain.height,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { rawtx->vins = jobj(jitem(retarray,i),"vins"); break; @@ -760,7 +760,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis } else { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->blocks.hwmchain.height,rawtx,retarray,lockinputs,V); + retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); rawtx->vins = jobj(retarray,"vins"); } free(retarray); @@ -986,7 +986,7 @@ int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *c if ( memcmp(secret160,rmd160,sizeof(rmd160)) == sizeof(rmd160) ) { *destp = privkey; - printf("found %s (%s)\n",name,bits256_str(str,privkey)); + printf("found privi %s (%s)\n",name,bits256_str(str,privkey)); return(0); } } @@ -1471,7 +1471,7 @@ void basilisk_sendchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { - uint8_t pubkey33[33]; //char str[65],str2[65]; + uint8_t pubkey33[33]; char str[65],str2[65]; //printf("check otherchoosei\n"); if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) { @@ -1484,7 +1484,7 @@ void basilisk_waitchoosei(struct supernet_info *myinfo,struct basilisk_swap *swa revcalc_rmd160_sha256(swap->I.secretBn,swap->I.privBn);//.bytes,sizeof(swap->privBn)); vcalc_sha256(0,swap->I.secretBn256,swap->I.privBn.bytes,sizeof(swap->I.privBn)); swap->I.pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->I.privBn); - //printf("set privBn.%s %s\n",bits256_str(str,swap->privBn),bits256_str(str2,*(bits256 *)swap->secretBn256)); + printf("set privBn.%s %s\n",bits256_str(str,swap->I.privBn),bits256_str(str2,*(bits256 *)swap->I.secretBn256)); basilisk_bobscripts_set(myinfo,swap,1,1); } } diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 3cc4e7617..c87cea550 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1131,6 +1131,8 @@ void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_s void tradebot_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) { + printf("balancing trade\n"); + return; if ( swap->balancingtrade == 0 ) _default_swap_balancingtrade(myinfo,swap,iambob); else (*swap->balancingtrade)(myinfo,swap,iambob); From bce6732888db6cc318a638cd6641127a4cf10baa Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 09:47:36 +0200 Subject: [PATCH 188/286] Cancel refresh --- basilisk/basilisk.c | 13 + basilisk/basilisk.h | 3 +- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_swap.c | 490 +++++++++++++++++++++------------- iguana/iguana777.h | 3 +- iguana/main.c | 1 + includes/iguana_apideclares.h | 1 + 7 files changed, 322 insertions(+), 191 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index ae02e86ea..47c997c14 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1086,9 +1086,16 @@ int32_t utxocmp(cJSON *utxo,cJSON *utxo2) else return(-1); } +ZERO_ARGS(basilisk,cancelrefresh) +{ + myinfo->cancelrefresh = 1; + return(clonestr("{\"result\":\"refresh cancel started\"}")); +} + TWO_STRINGS(basilisk,refresh,symbol,address) { cJSON *array=0,*array2=0,*array3,*item,*item2; char *retstr; int32_t i,j,n,m,vout; bits256 txid; + myinfo->cancelrefresh = 0; if ( symbol != 0 && iguana_isnotarychain(symbol) >= 0 && address != 0 && address[0] != 0 ) { if ( (retstr= _dex_listunspent(myinfo,symbol,address)) != 0 ) @@ -1111,6 +1118,8 @@ TWO_STRINGS(basilisk,refresh,symbol,address) //printf("MERGE %s and %s\n",jprint(array,0),jprint(array2,0)); for (j=0; jcancelrefresh != 0 ) + break; item2 = jitem(array2,j); for (i=0; icancelrefresh != 0 ) + break; item = jitem(array,i); txid = jbits256(item,"txid"); vout = jint(item,"vout"); @@ -1152,9 +1163,11 @@ TWO_STRINGS(basilisk,refresh,symbol,address) } } free_json(array); + myinfo->cancelrefresh = 0; return(jprint(array3,1)); } else return(clonestr("[]")); } + myinfo->cancelrefresh = 0; return(clonestr("{\"error\":\"invalid coin or address specified\"}")); } diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 916504b2d..a7bb6be4d 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -37,6 +37,7 @@ #define INSTANTDEX_INSURANCEDIV 777 #define INSTANTDEX_PUBKEY "03bc2c7ba671bae4a6fc835244c9762b41647b9827d4780a89a949b984a8ddcc06" #define INSTANTDEX_RMD160 "ca1e04745e8ca0c60d8c5881531d51bec470743f" +#define JUMBLR_RMD160 "5177f8b427e5f47342a4b8ab5dac770815d4389e" #define TIERNOLAN_RMD160 "daedddd8dbe7a2439841ced40ba9c3d375f98146" #define INSTANTDEX_BTC "1KRhTPvoxyJmVALwHFXZdeeWFbcJSbkFPu" #define INSTANTDEX_BTCD "RThtXup6Zo7LZAi8kRWgjAyi1s4u6U9Cpf" @@ -126,7 +127,7 @@ int32_t basilisk_update(char *symbol,uint32_t reftimestamp); void basilisk_seqresult(struct supernet_info *myinfo,char *retstr); struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbol,char *chainname,cJSON *valsobj); void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn); -void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); +void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag); void basilisk_setmyid(struct supernet_info *myinfo); int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_request *rp); cJSON *basilisk_requestjson(struct basilisk_request *rp); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 30f9bed74..f67a8684d 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -253,7 +253,7 @@ char *basilisk_start(struct supernet_info *myinfo,bits256 privkey,struct basilis *rp = *_rp; printf("START thread to complete %u/%u for (%s %.8f) <-> (%s %.8f) q.%u\n",rp->requestid,rp->quoteid,rp->src,dstr(rp->srcamount),rp->dest,dstr(rp->destamount),rp->quoteid); myinfo->lastdexrequestid = rp->requestid; - if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration) != 0 ) + if ( basilisk_thread_start(myinfo,privkey,rp,statebits,optionduration,0) != 0 ) { basilisk_request_enqueue(myinfo,rp); return(clonestr("{\"result\":\"started atomic swap thread\"}")); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index fa237968b..14a27263b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -316,15 +316,11 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b return(txid); } -int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) +int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { - char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; uint32_t timestamp,sequenceid=0xffffffff; struct vin_info *V; uint32_t locktime=0; + char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; + V = calloc(16,sizeof(*V)); - timestamp = swap->I.started; - if ( dest == &swap->aliceclaim ) - locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; - else if ( dest == &swap->bobreclaim ) - locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); privkeys = cJSON_CreateArray(); @@ -399,6 +395,159 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b return(retval); } +int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) +{ + uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; + timestamp = swap->I.started; + if ( dest == &swap->aliceclaim ) + locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; + else if ( dest == &swap->bobreclaim ) + locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; + return(_basilisk_rawtx_sign(myinfo,height,timestamp,locktime,sequenceid,dest,rawtx,privkey,privkey2,userdata,userdatalen,ignore_cltverr)); +} + +cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) +{ + cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; + privkeyarray = cJSON_CreateArray(); + //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); + if ( (n= cJSON_GetArraySize(vins)) > 0 ) + { + for (i=0; i= 0 ) + { + iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); + if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) + { + len = (int32_t)strlen(hexstr) >> 1; + if ( len < (sizeof(script) << 1) ) + { + decode_hex(script,len,hexstr); + if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) + bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); + } + } + if ( coinaddr[0] != 0 ) + { + if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) + { + bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); + jaddistr(privkeyarray,waddr->wifstr); + } + else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + jaddistr(privkeyarray,wifstr); + } + else printf("cant find (%s) in wallet\n",coinaddr); + } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); + } else printf("invalid txid/vout %d of %d\n",i,n); + } + } + return(privkeyarray); +} + +int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) +{ + char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; + if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) + { + privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); + if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) + { + if ( lockinputs != 0 ) + { + //printf("lockinputs\n"); + iguana_RTunspentslock(myinfo,rawtx->coin,vins); + if ( (n= cJSON_GetArraySize(vins)) != 0 ) + { + bits256 txid; int32_t vout; + for (i=0; iI.datalen = (int32_t)strlen(signedtx) >> 1; + rawtx->txbytes = calloc(1,rawtx->I.datalen); + decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); + printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); + free(signedtx); + retval = 0; + } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll + free_json(privkeyarray); + } + return(retval); +} + +int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +{ + char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; + //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( rawtx->coin->changeaddr[0] == 0 ) + { + bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); + printf("set change address.(%s)\n",rawtx->coin->changeaddr); + } + //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + // txfee = 0; + init_hexbytes_noT(scriptstr,script,scriptlen); + basilisktag = (uint32_t)rand(); + valsobj = cJSON_CreateObject(); + jaddstr(valsobj,"coin",rawtx->coin->symbol); + jaddstr(valsobj,"spendscript",scriptstr); + jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); + jadd64bits(valsobj,"satoshis",rawtx->I.amount); + jadd64bits(valsobj,"txfee",txfee); + jaddnum(valsobj,"minconf",minconf); + jaddnum(valsobj,"locktime",locktime); + jaddnum(valsobj,"timeout",30000); + jaddnum(valsobj,"timestamp",swapstarted+delay); + addresses = cJSON_CreateArray(); + bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,pubkey33,33); + jaddistr(addresses,coinaddr); + jadd(valsobj,"addresses",addresses); + rawtx->I.locktime = locktime; + //printf("%s locktime.%u\n",rawtx->name,locktime); + V = calloc(256,sizeof(*V)); + if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) + { + //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + flag = 0; + if ( (retarray= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_Array(retarray) != 0 ) + { + n = cJSON_GetArraySize(retarray); + for (i=0; icoin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) + { + rawtx->vins = jobj(jitem(retarray,i),"vins"); + break; + } + } + } + else + { + retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); + rawtx->vins = jobj(retarray,"vins"); + } + free(retarray); + } else printf("error parsing.(%s)\n",retstr); + free(retstr); + } else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); + free_json(valsobj); + free(V); + return(retval); +} + struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) @@ -463,7 +612,8 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str { decode_hex(rawtx->spendscript,hexlen,hexstr); rawtx->I.spendlen = hexlen; - basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment + if ( swap != 0 ) + basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment retval = 0; } } else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); @@ -473,7 +623,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str return(retval); } -int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) +int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) { int32_t i,len = 0; #ifdef DISABLE_CHECKSIG @@ -503,7 +653,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) { - len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobdeposit.I.datalen; i++) @@ -523,7 +673,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t delay) { uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; - len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); + len = basilisk_swapuserdata(userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) { for (i=0; ibobrefund.I.datalen; i++) @@ -546,7 +696,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk { uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; printf("basilisk_bobpayment_reclaim\n"); - len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) { for (i=0; ibobreclaim.I.datalen; i++) @@ -566,8 +716,8 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * { for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; - len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); + len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); + char str[65],str2[65]; printf("bobpaid.(%s) (%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) @@ -584,6 +734,12 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * return(-1); } +void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) +{ + alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); + basilisk_rawtx_gen("alicepayment",myinfo,swap->I.started,swap->persistent_pubkey33,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); +} + int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) { int32_t i,retval; @@ -594,13 +750,104 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk for (i=0; iI.datalen; i++) printf("%02x",dest->txbytes[i]); printf(" <- msigspend\n\n"); - swap->I.bobspent = 1; + if ( dest == &swap->bobspend ) + swap->I.bobspent = 1; basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim return(retval); } return(-1); } +int32_t basilisk_bobpayment_spendclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 revAm; uint8_t userdata[512]; int32_t i,len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(revAm.bytes,0,sizeof(revAm)); + for (i=0; i<32; i++) + revAm.bytes[i] = privAm.bytes[31-i]; + len = basilisk_swapuserdata(userdata,revAm,0,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobpayment_reclaimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs1,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(zero.bytes,0,sizeof(zero)); + len = basilisk_swapuserdata(userdata,zero,1,myprivs1,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs1,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobdeposit_refundclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,bits256 privBn,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + len = basilisk_swapuserdata(userdata,privBn,0,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,0)) == 0 ) + { + } + } + return(retval); +} + +int32_t basilisk_bobdeposit_claimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) +{ + bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; + basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); + dest->I.suppress_pubkeys = 1; + basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); + if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) + { + memset(zero.bytes,0,sizeof(zero)); + len = basilisk_swapuserdata(userdata,zero,1,myprivs0,src->redeemscript,src->I.redeemlen); + if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) + { + } + } + return(retval); +} + +//basilisk_alicepayment_clone(myinfo,&dest,&src,swapstarted,changepubkey33,alicecoin,quoteid,amount,privAm,pubAm,privBn,pubBn); + +int32_t basilisk_alicepayment_spendclone(struct supernet_info *myinfo,struct iguana_info *alicecoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 privBn,int32_t jumblrflag) +{ + uint8_t pubAm33[33],pubBn33[33]; bits256 pubAm,pubBn; int32_t retval,numconfirms = 0; uint32_t sequenceid = 0xffffffff; + bitcoin_pubkey33(myinfo->ctx,pubAm33,privAm); + memcpy(pubAm.bytes,pubAm33+1,32); + bitcoin_pubkey33(myinfo->ctx,pubBn33,privBn); + memcpy(pubBn.bytes,pubBn33+1,32); + memset(src,0,sizeof(*src)); + memset(dest,0,sizeof(*dest)); + basilisk_rawtx_setparms("alicepayment",quoteid,src,alicecoin,numconfirms,0,amount,2,0,jumblrflag); + src->I.spendlen = basilisk_alicescript(src->redeemscript,&src->I.redeemlen,src->spendscript,0,src->I.destaddr,alicecoin->chain->p2shtype,pubAm,pubBn); + basilisk_rawtx_gen("alicepayment",myinfo,swapstarted,changepubkey33,0,1,src,src->I.locktime,src->spendscript,src->I.spendlen,alicecoin->chain->txfee,1,0); + if ( (retval= _basilisk_rawtx_sign(myinfo,alicecoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,privAm,&privBn,0,0,1)) == 0 ) + { + + } + return(retval); +} + int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) { struct basilisk_swap *swap = ptr; @@ -630,148 +877,6 @@ int32_t basilisk_verify_pubpair(int32_t *wrongfirstbytep,struct basilisk_swap *s return(0); } -cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) -{ - cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; - privkeyarray = cJSON_CreateArray(); - //printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr); - if ( (n= cJSON_GetArraySize(vins)) > 0 ) - { - for (i=0; i= 0 ) - { - iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); - if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) - { - len = (int32_t)strlen(hexstr) >> 1; - if ( len < (sizeof(script) << 1) ) - { - decode_hex(script,len,hexstr); - if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) - bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); - } - } - if ( coinaddr[0] != 0 ) - { - if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) - { - bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); - jaddistr(privkeyarray,waddr->wifstr); - } - else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) - { - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - jaddistr(privkeyarray,wifstr); - } - else printf("cant find (%s) in wallet\n",coinaddr); - } else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); - } else printf("invalid txid/vout %d of %d\n",i,n); - } - } - return(privkeyarray); -} - -int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) -{ - char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; - if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) - { - privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); - if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) - { - if ( lockinputs != 0 ) - { - //printf("lockinputs\n"); - iguana_RTunspentslock(myinfo,rawtx->coin,vins); - if ( (n= cJSON_GetArraySize(vins)) != 0 ) - { - bits256 txid; int32_t vout; - for (i=0; iI.datalen = (int32_t)strlen(signedtx) >> 1; - rawtx->txbytes = calloc(1,rawtx->I.datalen); - decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); - printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); - free(signedtx); - retval = 0; - } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll - free_json(privkeyarray); - } - return(retval); -} - -int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) -{ - char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; - //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); - if ( rawtx->coin->changeaddr[0] == 0 ) - { - bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); - printf("set change address.(%s)\n",rawtx->coin->changeaddr); - } - //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - // txfee = 0; - init_hexbytes_noT(scriptstr,script,scriptlen); - basilisktag = (uint32_t)rand(); - valsobj = cJSON_CreateObject(); - jaddstr(valsobj,"coin",rawtx->coin->symbol); - jaddstr(valsobj,"spendscript",scriptstr); - jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); - jadd64bits(valsobj,"satoshis",rawtx->I.amount); - jadd64bits(valsobj,"txfee",txfee); - jaddnum(valsobj,"minconf",minconf); - jaddnum(valsobj,"locktime",locktime); - jaddnum(valsobj,"timeout",30000); - jaddnum(valsobj,"timestamp",swap->I.started+delay); - addresses = cJSON_CreateArray(); - bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); - jaddistr(addresses,coinaddr); - jadd(valsobj,"addresses",addresses); - rawtx->I.locktime = locktime; - //printf("%s locktime.%u\n",rawtx->name,locktime); - V = calloc(256,sizeof(*V)); - if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) - { - //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); - flag = 0; - if ( (retarray= cJSON_Parse(retstr)) != 0 ) - { - if ( is_cJSON_Array(retarray) != 0 ) - { - n = cJSON_GetArraySize(retarray); - for (i=0; icoin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) - { - rawtx->vins = jobj(jitem(retarray,i),"vins"); - break; - } - } - } - else - { - retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); - rawtx->vins = jobj(retarray,"vins"); - } - free(retarray); - } else printf("error parsing.(%s)\n",retstr); - free(retstr); - } else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); - free_json(valsobj); - free(V); - return(retval); -} - int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) { int32_t i,j; //char str[65]; @@ -789,7 +894,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa { //if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 ) // break; - basilisk_rawtx_gen("payment",myinfo,swap,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); + basilisk_rawtx_gen("payment",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); @@ -822,7 +927,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa { //if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 ) // break; - basilisk_rawtx_gen("deposit",myinfo,swap,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); + basilisk_rawtx_gen("deposit",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); @@ -912,6 +1017,16 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa mp->datalen = datalen; } +FILE *basilisk_swap_save(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) +{ + FILE *fp; char fname[512]; + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) == 0 ) + fp = fopen(fname,"wb+"); + else fseek(fp,0,SEEK_END); + return(fp); +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; @@ -1090,7 +1205,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu return(n); } -void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33) +void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag) { strcpy(rawtx->name,name); rawtx->coin = coin; @@ -1101,9 +1216,12 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit if ( rawtx->I.vouttype == 0 ) { - if ( strcmp(coin->symbol,"BTC") == 0 && (swap->I.req.quoteid % 10) == 0 ) - decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); - else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); + if ( jumblrflag == 0 ) + { + if ( strcmp(coin->symbol,"BTC") == 0 && (quoteid % 10) == 0 ) + decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); + else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); + } else decode_hex(rawtx->I.rmd160,20,JUMBLR_RMD160); bitcoin_address(rawtx->I.destaddr,rawtx->coin->chain->pubtype,rawtx->I.rmd160,20); } if ( pubkey33 != 0 ) @@ -1146,9 +1264,9 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) +struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) { - uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; + uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; @@ -1194,41 +1312,42 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } + jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; if ( swap->I.iambob != 0 ) { - basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); bobpub33 = pubkey33; } else { - basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); - basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); + basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); + basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); alicepub33 = pubkey33; } - basilisk_rawtx_setparms("bobdeposit",swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); - basilisk_rawtx_setparms("bobrefund",swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); + basilisk_rawtx_setparms("bobdeposit",swap->I.req.quoteid,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0,jumblrflag); + basilisk_rawtx_setparms("bobrefund",swap->I.req.quoteid,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33,jumblrflag); swap->bobrefund.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("aliceclaim",swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); + basilisk_rawtx_setparms("aliceclaim",swap->I.req.quoteid,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33,jumblrflag); swap->aliceclaim.I.suppress_pubkeys = 1; swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; - basilisk_rawtx_setparms("bobpayment",swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); - basilisk_rawtx_setparms("alicespend",swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); + basilisk_rawtx_setparms("bobpayment",swap->I.req.quoteid,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0,jumblrflag); + basilisk_rawtx_setparms("alicespend",swap->I.req.quoteid,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33,jumblrflag); swap->alicespend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("bobreclaim",swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); + basilisk_rawtx_setparms("bobreclaim",swap->I.req.quoteid,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33,jumblrflag); swap->bobreclaim.I.suppress_pubkeys = 1; swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; - basilisk_rawtx_setparms("alicepayment",swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); - basilisk_rawtx_setparms("bobspend",swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); + basilisk_rawtx_setparms("alicepayment",swap->I.req.quoteid,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0,jumblrflag); + basilisk_rawtx_setparms("bobspend",swap->I.req.quoteid,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33,jumblrflag); swap->bobspend.I.suppress_pubkeys = 1; - basilisk_rawtx_setparms("alicereclaim",swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); + basilisk_rawtx_setparms("alicereclaim",swap->I.req.quoteid,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33,jumblrflag); swap->alicereclaim.I.suppress_pubkeys = 1; printf("IAMBOB.%d\n",swap->I.iambob); return(swap); @@ -1536,12 +1655,6 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); } -void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) -{ - alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); - basilisk_rawtx_gen("alicepayment",myinfo,swap,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); -} - int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) { int32_t j,datalen,retval = 0; @@ -1961,7 +2074,7 @@ void basilisk_swaploop(void *_swap) } } printf("generate fee\n"); - if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) + if ( basilisk_rawtx_gen("myfee",myinfo,swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); @@ -2019,7 +2132,7 @@ void basilisk_swaploop(void *_swap) free(data); } -struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; // statebits 1 -> client, 0 -> LP @@ -2044,7 +2157,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) + if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) { if ( statebits == 0 ) { @@ -2094,6 +2207,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 //for (i=0; iI.req); i++) // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); + swap->fp = basilisk_swap_save(myinfo,privkey,rp,statebits,optionduration,reinit); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5da5222c5..a4a39c242 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -162,7 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; - struct smartaddress smartaddrs[64]; int32_t numsmartaddrs; + struct smartaddress smartaddrs[64]; int32_t numsmartaddrs,cancelrefresh; }; struct basilisk_swapmessage @@ -177,6 +177,7 @@ struct basilisk_swap struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); int32_t subsock,pushsock,connected; + FILE *fp; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; diff --git a/iguana/main.c b/iguana/main.c index b8d7e20a6..ac883a401 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -683,6 +683,7 @@ void iguana_ensuredirs() sprintf(dirname,"%s",GLOBAL_GENESISDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_CONFSDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_DBDIR), OS_ensure_directory(dirname); + sprintf(dirname,"%s/SWAPS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/TRANSACTIONS",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/purgeable",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s",GLOBAL_TMPDIR), OS_ensure_directory(dirname); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 632026ffb..cfb110ae6 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -59,6 +59,7 @@ HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); TWO_STRINGS(basilisk,refresh,symbol,address); +ZERO_ARGS(basilisk,cancelrefresh); STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore); HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); From 3963db3ff2b10b9a5437a952a631c65d99ec98e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 15:46:07 +0200 Subject: [PATCH 189/286] Test --- basilisk/basilisk_swap.c | 95 +++++++++++++++++++++++++++++++++++++--- iguana/iguana777.h | 1 + iguana/iguana_notary.c | 1 - 3 files changed, 89 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 14a27263b..684723e8b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -998,7 +998,7 @@ int32_t basilisk_process_swapverify(struct supernet_info *myinfo,void *ptr,int32 else return(0); } -void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen) +void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t crc32,bits256 srchash,bits256 desthash,uint32_t quoteid,uint32_t msgbits,uint8_t *data,int32_t datalen,int32_t reinit) { int32_t i; struct basilisk_swapmessage *mp; for (i=0; inummessages; i++) @@ -1013,20 +1013,82 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa mp->msgbits = msgbits; mp->quoteid = quoteid; mp->data = malloc(datalen); - memcpy(mp->data,data,datalen); mp->datalen = datalen; + memcpy(mp->data,data,datalen); + if ( reinit == 0 && swap->fp != 0 ) + { + fwrite(mp,1,sizeof(*mp),swap->fp); + fwrite(data,1,datalen,swap->fp); + fflush(swap->fp); + } } -FILE *basilisk_swap_save(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) +FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); if ( (fp= fopen(fname,"rb+")) == 0 ) - fp = fopen(fname,"wb+"); - else fseek(fp,0,SEEK_END); + { + if ( (fp= fopen(fname,"wb+")) != 0 ) + { + fwrite(privkey.bytes,1,sizeof(privkey),fp); + fwrite(rp,1,sizeof(*rp),fp); + fwrite(&statebits,1,sizeof(statebits),fp); + fwrite(&optionduration,1,sizeof(optionduration),fp); + fflush(fp); + } + } + else if ( reinit != 0 ) + { + } return(fp); } +struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit); + +void basilisk_swaps_init(struct supernet_info *myinfo) +{ + char fname[512]; uint32_t iter,swapcompleted,requestid,quoteid,optionduration,statebits; FILE *fp; bits256 privkey;struct basilisk_request R; struct basilisk_swapmessage M; struct basilisk_swap *swap = 0; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) != 0 ) + { + while ( fread(&requestid,1,sizeof(requestid),myinfo->swapsfp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),myinfo->swapsfp) == sizeof(quoteid) ) + { + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed + { + memset(&M,0,sizeof(M)); + swapcompleted = 0; + for (iter=0; iter<2; iter++) + { + while ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && + fread(&R,1,sizeof(R),fp) == sizeof(R) && + fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && + fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) && + fread(&M,1,sizeof(M),fp) == sizeof(M) ) + { + if ( M.datalen < 100000 ) + { + if ( M.data == 0 ) + M.data = malloc(M.datalen); + fread(M.data,1,M.datalen,fp); + if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + { + if ( iter == 1 && (swap= basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1)) != 0 ) + basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + } + free(M.data), M.data = 0; + } + } + if ( swapcompleted != 0 ) + break; + rewind(fp); + } + } + } + } +} + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; @@ -1046,7 +1108,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( size > offset ) { //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); - basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset); + basilisk_swapgotdata(myinfo,swap,crc32,srchash,desthash,quoteid,_msgbits,&ptr[offset],size-offset,0); } if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; @@ -2207,7 +2269,26 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 //for (i=0; iI.req); i++) // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); - swap->fp = basilisk_swap_save(myinfo,privkey,rp,statebits,optionduration,reinit); + if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) + { + if ( reinit == 0 ) + { + if ( myinfo->swapsfp == 0 ) + { + char fname[512]; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) + myinfo->swapsfp = fopen(fname,"wb+"); + else fseek(myinfo->swapsfp,0,SEEK_END); + } + if ( myinfo->swapsfp != 0 ) + { + fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); + fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); + fflush(myinfo->swapsfp); + } + } + } if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index a4a39c242..f09c5a9dc 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -162,6 +162,7 @@ struct supernet_info double *svmfeatures; uint16_t psockport,numpsocks; struct psock *PSOCKS; portable_mutex_t psockmutex; uint8_t notaries[64][33]; int32_t numnotaries,DEXEXPLORER; + FILE *swapsfp; struct smartaddress smartaddrs[64]; int32_t numsmartaddrs,cancelrefresh; }; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index e8b80daa2..d4378efd6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -373,7 +373,6 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) else return(clonestr("{\"error\":\"assetchain not active, start in bitcoind mode\"}")); } - TWO_STRINGS(dex,send,hex,handler) { uint8_t data[8192]; int32_t datalen; char *retstr; From ec963ab8dd6db60b5d2086a86bf2db22b94a8fff Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 17:50:53 +0200 Subject: [PATCH 190/286] Test --- .gitignore | 6 + basilisk/basilisk_DEX.c | 7 + basilisk/basilisk_swap.c | 263 ++++++++++++++++++++-------------- iguana/iguana777.h | 7 +- iguana/tests/DEXinit | 2 + includes/iguana_apideclares.h | 1 + 6 files changed, 173 insertions(+), 113 deletions(-) create mode 100755 iguana/tests/DEXinit diff --git a/.gitignore b/.gitignore index ee4a9db1d..10edeb358 100755 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,9 @@ iguana/unparsed.txt iguana/unparsed.txt iguana/unparsed.txt + +iguana/DB/SWAPS/.tmpmarker + +iguana/DB/SWAPS/list + +iguana/DB/SWAPS/15974209-4014252807 diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index f67a8684d..3e3aaf8ea 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -748,4 +748,11 @@ TWO_INTS(InstantDEX,accept,requestid,quoteid) return(retstr); } } + +ZERO_ARGS(InstantDEX,init) +{ + basilisk_swaps_init(myinfo); + return(clonestr("{\"result\":\"success\"}")); +} + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 684723e8b..7f0cd0062 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1055,29 +1055,41 @@ void basilisk_swaps_init(struct supernet_info *myinfo) while ( fread(&requestid,1,sizeof(requestid),myinfo->swapsfp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),myinfo->swapsfp) == sizeof(quoteid) ) { sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + printf("%s\n",fname); if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed { memset(&M,0,sizeof(M)); swapcompleted = 0; for (iter=0; iter<2; iter++) { - while ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && + if ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && fread(&R,1,sizeof(R),fp) == sizeof(R) && fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && - fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) && - fread(&M,1,sizeof(M),fp) == sizeof(M) ) + fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) ) { - if ( M.datalen < 100000 ) + while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) { - if ( M.data == 0 ) - M.data = malloc(M.datalen); - fread(M.data,1,M.datalen,fp); - if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + M.data = 0; + printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); + if ( M.datalen < 100000 ) { - if ( iter == 1 && (swap= basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1)) != 0 ) - basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + M.data = malloc(M.datalen); + fread(M.data,1,M.datalen,fp); + if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) + { + if ( iter == 1 ) + { + if ( swap == 0 ) + { + swap = basilisk_thread_start(myinfo,privkey,&R,statebits,optionduration,1); + swap->I.choosei = swap->I.otherchoosei = -1; + } + if ( swap != 0 ) + basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); + } + } else printf("crc mismatch %x vs %x\n",calc_crc32(0,M.data,M.datalen),M.crc32); + free(M.data), M.data = 0; } - free(M.data), M.data = 0; } } if ( swapcompleted != 0 ) @@ -1096,7 +1108,6 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap { memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); - crc32 = calc_crc32(0,ptr,size); //printf("gotmsg.[%d] crc.%x\n",size,crc32); offset = 0; for (i=0; i<32; i++) @@ -1105,6 +1116,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap desthash.bytes[i] = ptr[offset++]; offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),"eid); offset += iguana_rwnum(0,&ptr[offset],sizeof(uint32_t),&_msgbits); + crc32 = calc_crc32(0,&ptr[offset],size-offset); if ( size > offset ) { //printf("size.%d offset.%d datalen.%d\n",size,offset,size-offset); @@ -1326,57 +1338,80 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } -struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) +struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { - uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; - swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; - if ( optionduration < 0 ) - swap->I.putduration -= optionduration; - else if ( optionduration > 0 ) - swap->I.callduration += optionduration; - swap->bobcoin = iguana_coinfind(swap->I.req.dest); - swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); - swap->alicecoin = iguana_coinfind(swap->I.req.src); - swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; - if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) + FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + printf("swapfile.(%s)\n",fname); + if ( reinit != 0 ) { - printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); - free(swap); - return(0); - } - if ( swap->I.bobconfirms == 0 ) - swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; - if ( swap->I.aliceconfirms == 0 ) - swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; - if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.bobinsurance = 10000; - if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.aliceinsurance = 10000; - strcpy(swap->I.bobstr,swap->bobcoin->symbol); - strcpy(swap->I.alicestr,swap->alicecoin->symbol); - swap->I.started = (uint32_t)time(NULL); - swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; - OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); - if ( swap->I.choosei < 0 ) - swap->I.choosei = -swap->I.choosei; - swap->I.choosei %= INSTANTDEX_DECKSIZE; - swap->I.otherchoosei = -1; - swap->I.myhash = pubkey25519; - if ( statebits != 0 ) - { - swap->I.iambob = 0; - swap->I.otherhash = swap->I.req.desthash; + if ( (fp= fopen(fname,"rb")) != 0 ) + { + fread(&swap->I,1,sizeof(swap->I),fp); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } } else { - swap->I.iambob = 1; - swap->I.otherhash = swap->I.req.srchash; + swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; + if ( optionduration < 0 ) + swap->I.putduration -= optionduration; + else if ( optionduration > 0 ) + swap->I.callduration += optionduration; + swap->I.bobsatoshis = swap->I.req.destamount; + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->I.alicesatoshis = swap->I.req.srcamount; + swap->I.aliceconfirms = swap->I.bobconfirms * 3; + if ( swap->I.bobconfirms == 0 ) + swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; + if ( swap->I.aliceconfirms == 0 ) + swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; + if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) + swap->I.bobinsurance = 10000; + if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) + swap->I.aliceinsurance = 10000; + strcpy(swap->I.bobstr,swap->bobcoin->symbol); + strcpy(swap->I.alicestr,swap->alicecoin->symbol); + swap->I.started = (uint32_t)time(NULL); + swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; + OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); + if ( swap->I.choosei < 0 ) + swap->I.choosei = -swap->I.choosei; + swap->I.choosei %= INSTANTDEX_DECKSIZE; + swap->I.otherchoosei = -1; + swap->I.myhash = pubkey25519; + if ( statebits != 0 ) + { + swap->I.iambob = 0; + swap->I.otherhash = swap->I.req.desthash; + } + else + { + swap->I.iambob = 1; + swap->I.otherhash = swap->I.req.srchash; + } + if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + { + char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); + return(0); + } + if ( (fp= fopen(fname,"wb")) != 0 ) + { + printf("save swapfile\n"); + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } } - if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + swap->alicecoin = iguana_coinfind(swap->I.req.src); + if ( swap->bobcoin == 0 || swap->alicecoin == 0 ) { - char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); + printf("missing bobcoin.%p or missing alicecoin.%p src.%p dest.%p\n",swap->bobcoin,swap->alicecoin,iguana_coinfind(swap->I.req.src),iguana_coinfind(swap->I.req.dest)); + free(swap); return(0); } jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; @@ -2207,21 +2242,21 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 } if ( i == myinfo->numswaps && i < sizeof(myinfo->swaps)/sizeof(*myinfo->swaps) ) { - printf("basilisk_thread_start request.%u statebits.%d\n",rp->requestid,statebits); swap = calloc(1,sizeof(*swap)); swap->subsock = swap->pushsock = -1; vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfoptr = myinfo; + printf("basilisk_thread_start request.%u statebits.%d (%s/%s) reinit.%d\n",rp->requestid,statebits,rp->src,rp->dest,reinit); bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); pubkey25519 = curve25519(privkey,curve25519_basepoint9()); swap->persistent_pubkey = pubkey25519; swap->persistent_privkey = privkey; memcpy(swap->persistent_pubkey33,pubkey33,33); m = n = 0; - if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) + if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits,reinit) != 0 ) { - if ( statebits == 0 ) + if ( statebits == 0 )//&& (swap->subsock < 0 || swap->pushsock < 0) ) { if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) { @@ -2234,67 +2269,77 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 free(retstr); } } else basilisk_psockinit(myinfo,swap,0,0); - - starttime = (uint32_t)time(NULL); - printf("statebits.%x m.%d n.%d\n",statebits,m,n); - while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) + if ( reinit != 0 ) + { + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) + { + + } + myinfo->swaps[myinfo->numswaps++] = swap; + } + else { - m = n = 0; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); - sleep(DEX_SLEEP); - printf("waiting for offer to be accepted\n"); - channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) + starttime = (uint32_t)time(NULL); + printf("statebits.%x m.%d n.%d\n",statebits,m,n); + while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { - if ( is_cJSON_Array(retarray) != 0 && (n= cJSON_GetArraySize(retarray)) > 0 ) + m = n = 0; + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); + sleep(DEX_SLEEP); + printf("waiting for offer to be accepted\n"); + channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + if ( (retarray= basilisk_channelget(myinfo,rp->srchash,rp->desthash,channel,0x4000000,30)) != 0 ) { - for (i=0; i 0 ) { - item = jitem(retarray,i); - if ( (msgobj= jarray(&n,item,"messages")) != 0 && n > 0 ) + for (i=0; i 0 ) + { + item = jitem(msgobj,0); + if ( jobj(item,"data") != 0 && jobj(item,"key") != 0 ) + m++; + else printf("(%s)\n",jprint(item,0)); + } //else printf("msgobj.%p m.%d n.%d\n",msgobj,m,n); + } } - } - } else printf("no retarray\n"); - } - printf("LAUNCH check.%d m.%d\n",statebits,m); - if ( statebits != 0 || m > 0 )//n/2 ) - { - //for (i=0; iI.req); i++) - // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); - fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); - if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) + } else printf("no retarray\n"); + } + printf("LAUNCH check.%d m.%d\n",statebits,m); + if ( statebits != 0 || m > 0 )//n/2 ) { - if ( reinit == 0 ) + //for (i=0; iI.req); i++) + // fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); + fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); + if ( (swap->fp= basilisk_swap_save(myinfo,swap,privkey,rp,statebits,optionduration,reinit)) != 0 ) { - if ( myinfo->swapsfp == 0 ) - { - char fname[512]; - sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) - myinfo->swapsfp = fopen(fname,"wb+"); - else fseek(myinfo->swapsfp,0,SEEK_END); - } - if ( myinfo->swapsfp != 0 ) + if ( reinit == 0 ) { - fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); - fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); - fflush(myinfo->swapsfp); + if ( myinfo->swapsfp == 0 ) + { + char fname[512]; + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (myinfo->swapsfp= fopen(fname,"rb+")) == 0 ) + myinfo->swapsfp = fopen(fname,"wb+"); + else fseek(myinfo->swapsfp,0,SEEK_END); + } + if ( myinfo->swapsfp != 0 ) + { + fwrite(&rp->requestid,1,sizeof(rp->requestid),myinfo->swapsfp); + fwrite(&rp->quoteid,1,sizeof(rp->quoteid),myinfo->swapsfp); + fflush(myinfo->swapsfp); + } } } - } - if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) - { - - } - myinfo->swaps[myinfo->numswaps++] = swap; - } else printf("%u/%u offer wasnt accepted statebits.%d m.%d n.%d\n",rp->requestid,rp->quoteid,statebits,m,n); + if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) + { + + } + myinfo->swaps[myinfo->numswaps++] = swap; + } else printf("%u/%u offer wasnt accepted statebits.%d m.%d n.%d\n",rp->requestid,rp->quoteid,statebits,m,n); + } } } portable_mutex_unlock(&myinfo->DEX_swapmutex); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f09c5a9dc..ae6629a6f 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -180,13 +180,12 @@ struct basilisk_swap int32_t subsock,pushsock,connected; FILE *fp; bits256 persistent_privkey,persistent_pubkey; - struct basilisk_swapinfo I; + struct basilisk_swapmessage *messages; int32_t nummessages; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; + struct basilisk_swapinfo I; bits256 privkeys[INSTANTDEX_DECKSIZE]; - struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; - uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; - }; #include "../includes/iguana_funcs.h" diff --git a/iguana/tests/DEXinit b/iguana/tests/DEXinit new file mode 100755 index 000000000..63e43fe15 --- /dev/null +++ b/iguana/tests/DEXinit @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"init\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index cfb110ae6..dc8f26e42 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -217,6 +217,7 @@ STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap); ZERO_ARGS(InstantDEX,allexchanges); STRING_ARG(InstantDEX,allpairs,exchange); THREE_STRINGS(InstantDEX,supports,exchange,base,rel); +ZERO_ARGS(InstantDEX,init); //THREE_STRINGS(atomic,approve,myorderid,otherid,txname); //THREE_STRINGS(atomic,claim,myorderid,otherid,txname); From 1fcd4af7100aac54d71d6650db02e21481849bd4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:02:13 +0200 Subject: [PATCH 191/286] Test --- basilisk/basilisk_swap.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7f0cd0062..f03ebf4ef 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,12 +1230,12 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu { if ( swap->I.numpubs+2 >= numpubs ) return(numpubs); - printf(">>>>>> start generating %s\n",buf); + fprintf(stderr,">>>>>> start generating %s\n",buf); } for (i=n=m=0; iI,1,sizeof(swap->I),fp); @@ -1355,15 +1356,18 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv } else { + fprintf(stderr,"A\n"); swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; + fprintf(stderr,"B\n"); swap->I.bobsatoshis = swap->I.req.destamount; swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; + fprintf(stderr,"C\n"); if ( swap->I.bobconfirms == 0 ) swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) @@ -1372,6 +1376,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.aliceinsurance = 10000; + fprintf(stderr,"D\n"); strcpy(swap->I.bobstr,swap->bobcoin->symbol); strcpy(swap->I.alicestr,swap->alicecoin->symbol); swap->I.started = (uint32_t)time(NULL); @@ -1379,6 +1384,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; + fprintf(stderr,"E\n"); swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; @@ -1392,14 +1398,15 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } + fprintf(stderr,"F\n"); if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } + fprintf(stderr,"save swapfile.(%s)\n",fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - printf("save swapfile\n"); fwrite(&swap->I,1,sizeof(swap->I),fp); fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); fwrite(swap->deck,1,sizeof(swap->deck),fp); From 4828910d4af6117afb0a7efbc0d4bc3ce18519b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:10:46 +0200 Subject: [PATCH 192/286] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 6 +++++- iguana/iguana777.h | 7 ++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 10edeb358..a4430f4ea 100755 --- a/.gitignore +++ b/.gitignore @@ -174,3 +174,5 @@ iguana/DB/SWAPS/.tmpmarker iguana/DB/SWAPS/list iguana/DB/SWAPS/15974209-4014252807 + +iguana/iguana777.o-0cc60f50 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f03ebf4ef..61151df29 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1235,7 +1235,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu for (i=n=m=0; iI.aliceinsurance = 10000; fprintf(stderr,"D\n"); strcpy(swap->I.bobstr,swap->bobcoin->symbol); + fprintf(stderr,"D2\n"); strcpy(swap->I.alicestr,swap->alicecoin->symbol); + fprintf(stderr,"D3\n"); swap->I.started = (uint32_t)time(NULL); + fprintf(stderr,"D4\n"); swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; + fprintf(stderr,"D5\n"); OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index ae6629a6f..f09c5a9dc 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -180,12 +180,13 @@ struct basilisk_swap int32_t subsock,pushsock,connected; FILE *fp; bits256 persistent_privkey,persistent_pubkey; - struct basilisk_swapmessage *messages; int32_t nummessages; - uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; - struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; struct basilisk_swapinfo I; + struct basilisk_rawtx bobdeposit,bobpayment,alicepayment,myfee,otherfee,aliceclaim,alicespend,bobreclaim,bobspend,bobrefund,alicereclaim; bits256 privkeys[INSTANTDEX_DECKSIZE]; + struct basilisk_swapmessage *messages; int32_t nummessages; uint64_t otherdeck[INSTANTDEX_DECKSIZE][2],deck[INSTANTDEX_DECKSIZE][2]; + uint8_t persistent_pubkey33[33],pad[15],verifybuf[65536]; + }; #include "../includes/iguana_funcs.h" From 4690cdf001b5a06da656ee35811e64cb6f5c9857 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 18:14:43 +0200 Subject: [PATCH 193/286] Test --- basilisk/basilisk_swap.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 61151df29..ed1023c77 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1230,7 +1230,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu { if ( swap->I.numpubs+2 >= numpubs ) return(numpubs); - fprintf(stderr,">>>>>> start generating %s\n",buf); + //fprintf(stderr,">>>>>> start generating %s\n",buf); } for (i=n=m=0; iI.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; if ( optionduration < 0 ) swap->I.putduration -= optionduration; else if ( optionduration > 0 ) swap->I.callduration += optionduration; - fprintf(stderr,"B\n"); swap->I.bobsatoshis = swap->I.req.destamount; swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; swap->I.aliceconfirms = swap->I.bobconfirms * 3; - fprintf(stderr,"C\n"); - if ( swap->I.bobconfirms == 0 ) - swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; - if ( swap->I.aliceconfirms == 0 ) - swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.aliceinsurance = 10000; - fprintf(stderr,"D\n"); - strcpy(swap->I.bobstr,swap->bobcoin->symbol); - fprintf(stderr,"D2\n"); - strcpy(swap->I.alicestr,swap->alicecoin->symbol); - fprintf(stderr,"D3\n"); + strcpy(swap->I.bobstr,swap->I.req.dest); + strcpy(swap->I.alicestr,swap->I.req.src); swap->I.started = (uint32_t)time(NULL); - fprintf(stderr,"D4\n"); swap->I.expiration = swap->I.req.timestamp + swap->I.putduration + swap->I.callduration; - fprintf(stderr,"D5\n"); OS_randombytes((uint8_t *)&swap->I.choosei,sizeof(swap->I.choosei)); if ( swap->I.choosei < 0 ) swap->I.choosei = -swap->I.choosei; - fprintf(stderr,"E\n"); swap->I.choosei %= INSTANTDEX_DECKSIZE; swap->I.otherchoosei = -1; swap->I.myhash = pubkey25519; @@ -1402,13 +1389,11 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.iambob = 1; swap->I.otherhash = swap->I.req.srchash; } - fprintf(stderr,"F\n"); if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) { char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } - fprintf(stderr,"save swapfile.(%s)\n",fname); if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); @@ -1425,6 +1410,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv free(swap); return(0); } + if ( swap->I.bobconfirms == 0 ) + swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; + if ( swap->I.aliceconfirms == 0 ) + swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; if ( swap->I.iambob != 0 ) { From 90b4495a15c62708841ea1e679c77bc0f29392da Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 19:02:02 +0200 Subject: [PATCH 194/286] Test --- .gitignore | 4 ++++ basilisk/basilisk_swap.c | 35 ++++++++++++++++++++++++----------- iguana/iguana777.h | 2 +- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index a4430f4ea..a3fcad7b7 100755 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,7 @@ iguana/DB/SWAPS/list iguana/DB/SWAPS/15974209-4014252807 iguana/iguana777.o-0cc60f50 + +iguana/DB/SWAPS/667293271-3414303895 + +iguana/DB/SWAPS/667293271-3414303895.swap diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index ed1023c77..114d407d5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1101,11 +1101,14 @@ void basilisk_swaps_init(struct supernet_info *myinfo) } } +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr); + int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; while ( (size= nn_recv(swap->subsock,&ptr,NN_MSG,0)) >= 0 ) { + swap->lasttime = (uint32_t)time(NULL); memset(srchash.bytes,0,sizeof(srchash)); memset(desthash.bytes,0,sizeof(desthash)); //printf("gotmsg.[%d] crc.%x\n",size,crc32); @@ -1125,6 +1128,15 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } + if ( swap->I.iambob == 0 && time(NULL) > swap->lasttime+360 ) + { + printf("nothing received for a while from Bob, try new sockets\n"); + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; + basilisk_psockinit(myinfo,swap,0,0); + } //char str[65],str2[65]; for (i=0; inummessages; i++) { @@ -1341,15 +1353,14 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - printf("swapfile.(%s)\n",fname); if ( reinit != 0 ) { - fprintf(stderr,"Z\n"); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fread(swap->deck,1,sizeof(swap->deck),fp); fclose(fp); } @@ -1394,13 +1405,6 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); return(0); } - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); - fwrite(swap->deck,1,sizeof(swap->deck),fp); - fclose(fp); - } } swap->bobcoin = iguana_coinfind(swap->I.req.dest); swap->alicecoin = iguana_coinfind(swap->I.req.src); @@ -2039,7 +2043,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; char fname[512]; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; FILE *fp; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2094,6 +2098,15 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { //dpow_nanomsg_update(myinfo); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f09c5a9dc..d39f498b5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -177,7 +177,7 @@ struct basilisk_swap { struct supernet_info *myinfoptr; struct iguana_info *bobcoin,*alicecoin; void (*balancingtrade)(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob); - int32_t subsock,pushsock,connected; + int32_t subsock,pushsock,connected; uint32_t lasttime; FILE *fp; bits256 persistent_privkey,persistent_pubkey; struct basilisk_swapinfo I; From 692208a96876811e9dcc6b76612465a1995cc1fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 19:05:05 +0200 Subject: [PATCH 195/286] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 114d407d5..490b551d6 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1128,7 +1128,7 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - if ( swap->I.iambob == 0 && time(NULL) > swap->lasttime+360 ) + if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) { printf("nothing received for a while from Bob, try new sockets\n"); if ( swap->pushsock >= 0 ) From 6b8afc8099af8e1a211d6576d7f71c5d11a709af Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 20:59:34 +0200 Subject: [PATCH 196/286] Test --- .gitignore | 4 ++++ basilisk/basilisk_swap.c | 16 ++++++++------ iguana/exchanges/mm.c | 24 ++++++++++++-------- iguana/iguana_payments.c | 4 ++-- iguana/iguana_sign.c | 47 ++++++++++++++++------------------------ 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index a3fcad7b7..89d21bd7a 100755 --- a/.gitignore +++ b/.gitignore @@ -180,3 +180,7 @@ iguana/iguana777.o-0cc60f50 iguana/DB/SWAPS/667293271-3414303895 iguana/DB/SWAPS/667293271-3414303895.swap + +iguana/DB/SWAPS/548227681-1452262678.swap + +iguana/DB/SWAPS/548227681-1452262678 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 490b551d6..1ee664552 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -255,7 +255,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_swap * { cJSON *argjson,*valuearray=0; char *valstr; int32_t i,n,retval = -1; #ifdef BASILISK_DISABLEWAITTX - return(10); + return(100); #endif argjson = cJSON_CreateObject(); jaddbits256(argjson,"txid",rawtx->I.actualtxid); @@ -319,7 +319,6 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; - V = calloc(16,sizeof(*V)); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); @@ -333,7 +332,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ bitcoin_priv2wif(wifstr,*privkey2,rawtx->coin->chain->wiftype); jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; - //char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); + char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); } else V[0].N = V[0].M = 1; V[0].suppress_pubkeys = dest->I.suppress_pubkeys; V[0].ignore_cltverr = ignore_cltverr; @@ -352,6 +351,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ needsig = 0; #endif } + printf("rawtx B\n"); if ( bits256_nonz(rawtx->I.actualtxid) != 0 ) jaddbits256(item,"txid",rawtx->I.actualtxid); else jaddbits256(item,"txid",rawtx->I.signedtxid); @@ -371,10 +371,11 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ jaddi(vins,item); jdelete(txobj,"vin"); jadd(txobj,"vin",vins); - //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->locktime,dest->locktime,rawtx->name,hexstr,dest->name,dest->suppress_pubkeys); + printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { + printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); if ( needsig == 0 ) signedtx = rawtxbytes; if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) @@ -745,6 +746,7 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk int32_t i,retval; printf("alicepayment_spend\n"); swap->alicepayment.I.spendlen = basilisk_alicescript(swap->alicepayment.redeemscript,&swap->alicepayment.I.redeemlen,swap->alicepayment.spendscript,0,swap->alicepayment.I.destaddr,swap->alicecoin->chain->p2shtype,swap->I.pubAm,swap->I.pubBn); + printf("alicepayment_spend len.%d\n",swap->alicepayment.I.spendlen); if ( (retval= basilisk_rawtx_sign(myinfo,swap->alicecoin->longestchain,swap,dest,&swap->alicepayment,swap->I.privAm,&swap->I.privBn,0,0,1)) == 0 ) { for (i=0; iI.datalen; i++) @@ -1373,9 +1375,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv else if ( optionduration > 0 ) swap->I.callduration += optionduration; swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); swap->I.alicesatoshis = swap->I.req.srcamount; - swap->I.aliceconfirms = swap->I.bobconfirms * 3; if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) swap->I.bobinsurance = 10000; if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) @@ -1414,6 +1414,8 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv free(swap); return(0); } + swap->I.bobconfirms = (1*0 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + swap->I.aliceconfirms = swap->I.bobconfirms * 3; if ( swap->I.bobconfirms == 0 ) swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) @@ -1800,7 +1802,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( basilisk_swapget(myinfo,swap,0x1000,data,maxlen,basilisk_verify_alicepaid) == 0 ) { swap->I.statebits |= 0x1000; - printf("got alicepayment\n"); + printf("got alicepayment aliceconfirms.%d\n",swap->I.aliceconfirms); } } else if ( (swap->I.statebits & 0x2000) == 0 ) diff --git a/iguana/exchanges/mm.c b/iguana/exchanges/mm.c index 2b4dee270..69502f02f 100644 --- a/iguana/exchanges/mm.c +++ b/iguana/exchanges/mm.c @@ -22,6 +22,7 @@ #include #include #include "OS_portable.h" +#define MAX(a,b) ((a) > (b) ? (a) : (b)) struct mmpending_order { @@ -501,15 +502,16 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddnum(vals,"ask",ask); vol = bidvol > askvol ? askvol : bidvol; jaddnum(vals,"maxvol",vol); - jaddnum(vals,"minvol",vol * 0.1); + jaddnum(vals,"minvol",vol*0.1 > 100 ? 100 : vol * 0.1); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); + printf("(%s)\n",postdata); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } - spread_ratio = (ask - bid) / (bid + ask); + spread_ratio = .5 * ((ask - bid) / (bid + ask)); for (i=0; i SMALLVAL ) @@ -519,7 +521,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double jaddnum(vals,"bid",PAXPRICES[i] * (1. - spread_ratio)); jaddnum(vals,"ask",PAXPRICES[i] * (1. + spread_ratio)); jaddnum(vals,"maxvol",vol * PAXPRICES[i]); - jaddnum(vals,"minvol",vol * 0.1 * PAXPRICES[i]); + jaddnum(vals,"minvol",MAX(1,(int32_t)(vol * 0.01 * PAXPRICES[i]))); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) @@ -528,6 +530,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double free(retstr); } } +break; } } else printf("unsupported ask only for DEX %s/%s\n",base,rel); } @@ -561,7 +564,7 @@ int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double start_BASE,double start_REL,double profitmargin,double maxexposure,double ratioincr,char *exchange,char *name,char *base,char *rel) { static uint32_t counter; - cJSON *fiatjson; double start_DEXbase,start_DEXrel,USD_average=0.,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,usdprice=0.,CMC_average=0.,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; + cJSON *fiatjson; double bid,ask,start_DEXbase,start_DEXrel,USD_average=0.,DEX_base = 0.,DEX_rel = 0.,balance_base=0.,balance_rel=0.,mmbid,mmask,usdprice=0.,CMC_average=0.,aveprice,incr,pendingbids,pendingasks,buyvol,sellvol,bidincr,askincr,filledprice,avebid=0.,aveask=0.,val,changes[3],highbid=0.,lowask=0.,theoretical = 0.; uint32_t lasttime = 0; incr = maxexposure * ratioincr; buyvol = sellvol = 0.; start_DEXbase = dex_balance(base,baseaddr); @@ -636,8 +639,11 @@ void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double mmask = 0.; } marketmaker_volumeset(&bidincr,&askincr,incr,buyvol,pendingbids,sellvol,pendingasks,maxexposure); - printf("AVE.(%.8f %.8f) hbla %.8f %.8f bid %.8f ask %.8f theory %.8f buys.(%.6f %.6f) sells.(%.6f %.6f) incr.(%.6f %.6f) balances.(%.8f + %.8f, %.8f + %.8f)\n",avebid,aveask,highbid,lowask,mmbid,mmask,theoretical,buyvol,pendingbids,sellvol,pendingasks,bidincr,askincr,balance_base,DEX_base,balance_rel,DEX_rel); - marketmaker_spread("DEX",base,rel,avebid - profitmargin*aveprice,incr,aveask + profitmargin*aveprice,incr,profitmargin*aveprice*0.5); + printf("AVE.(%.8f %.8f) hbla %.8f %.8f bid %.8f ask %.8f theory %.8f buys.(%.6f %.6f) sells.(%.6f %.6f) incr.(%.6f %.6f) balances.(%.8f + %.8f, %.8f + %.8f) test %f\n",avebid,aveask,highbid,lowask,mmbid,mmask,theoretical,buyvol,pendingbids,sellvol,pendingasks,bidincr,askincr,balance_base,DEX_base,balance_rel,DEX_rel,(aveask - avebid)/aveprice); + if ( (aveask - avebid)/aveprice > 4*profitmargin ) + bid = highbid * (1 - 4*profitmargin), ask = lowask * (1 + 4*profitmargin); + else bid = avebid - profitmargin*aveprice, ask = avebid + profitmargin*aveprice; + marketmaker_spread("DEX",base,rel,bid,incr,ask,incr,profitmargin*aveprice*0.5); if ( (pendingbids + buyvol) > (pendingasks + sellvol) ) { bidincr *= (double)(pendingasks + sellvol) / ((pendingbids + buyvol) + (pendingasks + sellvol)); @@ -655,8 +661,8 @@ void marketmaker(double minask,double maxbid,char *baseaddr,char *reladdr,double askincr = (int32_t)askincr + 0.777; } //printf("mmbid %.8f %.6f, mmask %.8f %.6f\n",mmbid,bidincr,mmask,askincr); - marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); - sleep(60); + //marketmaker_spread(exchange,base,rel,mmbid,bidincr,mmask,askincr,profitmargin*aveprice*0.5); + sleep(6000); } } } @@ -707,7 +713,7 @@ int main(int argc, const char * argv[]) marketmaker(minask,maxbid,baseaddr,reladdr,start_base,start_rel,profitmargin,maxexposure,incrratio,exchange,name,base,rel); } free_json(addrjson); - } + } else printf("ERROR parsing.(%s)\n",retstr); free(retstr); } free_json(retjson); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 86f22cb3c..5286d37ef 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - //printf("SIGN.(%s) priv.(%s) %llx %llx\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid); + //printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) @@ -289,7 +289,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int if ( flag != 0 ) free_json(privkeys); } - //char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); + char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); return(signedtx); } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 3ef8338c6..ca2dfd181 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -581,7 +581,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ sigser = calloc(1,maxsize*2); //printf("json.%p array.%p sigser.%p\n",json,vinarray,sigser); } - //printf("version.%d\n",msg->version); + printf("version.%d\n",msg->version); if ( coin->chain->isPoS != 0 ) { len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); @@ -606,7 +606,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_in; i++) { - //printf("vin.%d starts offset.%d\n",i,len); + printf("vin.%d starts offset.%d\n",i,len); if ( vins != 0 && jitem(vins,i) != 0 ) iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); if ( (n= iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i])) < 0 ) @@ -614,7 +614,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ //printf("serialized vin.[%02x %02x %02x]\n",serialized[len],serialized[len+1],serialized[len+2]); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - //printf("vin.%d n.%d len.%d\n",i,n,len); + printf("vin.%d n.%d len.%d\n",i,n,len); len += n; if ( len > maxsize ) { @@ -624,7 +624,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } //for (i=-3; i<7; i++) // printf("%02x",serialized[len+i]); - //printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); + printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->tx_out); if ( rwflag == 0 ) { @@ -644,7 +644,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_out; i++) { - //printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); + printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); if ( (n= iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i])) < 0 ) return(-1); len += n; @@ -657,7 +657,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - //printf("lock_time.%08x len.%d\n",msg->lock_time,len); + printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -687,7 +687,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ { iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); - //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); + printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; @@ -708,7 +708,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - //printf("TX.(%s) %p\n",jprint(json,0),json); + printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -825,6 +825,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, memset(msgtx,0,sizeof(M)); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); + printf("call rwmsgtx\n"); if ( (n= iguana_rwmsgtx(coin,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) { printf("errortxobj.(%s)\n",jprint(txobj,0)); @@ -852,7 +853,9 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,int32_t height,bits256 *txidp,s if ( (serialized= origserialized) == 0 ) serialized = calloc(1,len+4096); decode_hex(serialized,len,txbytes); + printf("call data2json\n"); txobj = bitcoin_data2json(coin,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); + printf("back data2json %p\n",txobj); if ( serialized != origserialized ) free(serialized); return(txobj); @@ -1420,33 +1423,18 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); + printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - if ( (0) && vins != 0 ) - printf("txobj.(%s)\n",jprint(txobj,0)); - if ( jobj(txobj,"error") != 0 ) - { - printf("txobj.(%s)\n",jprint(txobj,0)); - } - if ( (0) && (checkstr= bitcoin_json2hex(myinfo,coin,&txid,txobj,V)) != 0 ) // no guarantee of identical regen - { - if ( strcmp(rawtx,checkstr) != 0 ) - { - printf("RAW.(%s) ->\nNEW.(%s)\n",rawtx,checkstr); - //free_json(txobj); - //free(checkstr); - //free(serialized), free(serialized2), free(serialized3), free(serialized4); - //free(extraspace); - //return(-2); - } - free(checkstr); - } + printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); + printf("call rwmsgtx vin0.scriptlen %d\n",msgtx->vins[0].scriptlen); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { + printf("back rwmsgtx\n"); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1463,6 +1451,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } + printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1473,6 +1462,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); + printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); if ( flag != 0 && pubkeysize == 33 ) // jl777: need to generalize this { for (k=0; kvins[i].p2shlen; j++) // printf("%02x",msgtx->vins[i].redeemscript[j]); bitcoin_address(coinaddr,coin->chain->p2shtype,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen); - type = iguana_calcrmd160(coin,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,01); + type = iguana_calcrmd160(coin,0,&mvin,msgtx->vins[i].redeemscript,msgtx->vins[i].p2shlen,zero,0,0); for (j=0; jsuppress_pubkeys == 0 ) @@ -1520,6 +1510,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } + printf("tail end\n"); if ( i < V->N ) V->signers[i].privkey = privkey; if ( i < numinputs ) From 69fdad64a4b0f54c9ede5a0ef758bf29f2a4d4b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:23:00 +0200 Subject: [PATCH 197/286] Test --- iguana/iguana_sign.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index ca2dfd181..043f0d827 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1431,10 +1431,9 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); - printf("call rwmsgtx vin0.scriptlen %d\n",msgtx->vins[0].scriptlen); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx\n"); + printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) From 3a0ad358cc3f31d1d6899dc36d9a5c928fb70433 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:29:59 +0200 Subject: [PATCH 198/286] Test --- iguana/iguana_sign.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 043f0d827..b45ff6938 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1462,12 +1462,6 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); - if ( flag != 0 && pubkeysize == 33 ) // jl777: need to generalize this - { - for (k=0; kvins[i].redeemscript != 0 ) { //for (j=0; jvins[i].p2shlen; j++) From 627852b04dbbf0514052c2badf877e794675fa98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:47:20 +0200 Subject: [PATCH 199/286] Test --- iguana/iguana_scripts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index 2b8d9f21e..57e8181d1 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -487,7 +487,7 @@ char *iguana_scriptaddress(struct iguana_info *coin,char *coinaddr,uint8_t *scri int32_t bitcoin_scriptget(struct iguana_info *coin,int32_t *hashtypep,uint32_t *sigsizep,uint32_t *pubkeysizep,uint8_t **userdatap,uint32_t *userdatalenp,struct vin_info *vp,uint8_t *scriptsig,int32_t len,int32_t spendtype) { - char asmstr[IGUANA_MAXSCRIPTSIZE*3]; int32_t j,n,siglen,plen; uint8_t *p2shscript; + int32_t j,n,siglen,plen; uint8_t *p2shscript; j = n = 0; *userdatap = 0; *userdatalenp = *pubkeysizep = *sigsizep = 0; @@ -559,7 +559,7 @@ int32_t bitcoin_scriptget(struct iguana_info *coin,int32_t *hashtypep,uint32_t * decode_hex(vp->rmd160,20,"010966776006953d5567439e5e39f86a0d273bee");//3564a74f9ddb4372301c49154605573d7d1a88fe"); vp->type = IGUANA_SCRIPT_76A988AC; }*/ - vp->spendlen = iguana_scriptgen(coin,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,asmstr,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); + vp->spendlen = iguana_scriptgen(coin,&vp->M,&vp->N,vp->coinaddr,vp->spendscript,0,vp->rmd160,vp->type,(const struct vin_info *)vp,vp->vin.prev_vout); //printf("type.%d asmstr.(%s) spendlen.%d\n",vp->type,asmstr,vp->spendlen); return(vp->spendlen); } From adac1ead6ba7a1d2a950129098a94127c8b487ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Mar 2017 21:52:11 +0200 Subject: [PATCH 200/286] Test --- iguana/iguana_sign.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index b45ff6938..6af99c203 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -581,7 +581,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ sigser = calloc(1,maxsize*2); //printf("json.%p array.%p sigser.%p\n",json,vinarray,sigser); } - printf("version.%d\n",msg->version); + //printf("version.%d\n",msg->version); if ( coin->chain->isPoS != 0 ) { len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); @@ -606,7 +606,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_in; i++) { - printf("vin.%d starts offset.%d\n",i,len); + //printf("vin.%d starts offset.%d\n",i,len); if ( vins != 0 && jitem(vins,i) != 0 ) iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); if ( (n= iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i])) < 0 ) @@ -614,7 +614,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ //printf("serialized vin.[%02x %02x %02x]\n",serialized[len],serialized[len+1],serialized[len+2]); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - printf("vin.%d n.%d len.%d\n",i,n,len); + //printf("vin.%d n.%d len.%d\n",i,n,len); len += n; if ( len > maxsize ) { @@ -624,7 +624,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } //for (i=-3; i<7; i++) // printf("%02x",serialized[len+i]); - printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); + //printf(" prev 3 bytes before tx_out rw.%d\n",rwflag); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->tx_out); if ( rwflag == 0 ) { @@ -644,7 +644,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } for (i=0; itx_out; i++) { - printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); + //printf("rwflag.%d vout.%d starts %d\n",rwflag,i,len); if ( (n= iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i])) < 0 ) return(-1); len += n; @@ -657,7 +657,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - printf("lock_time.%08x len.%d\n",msg->lock_time,len); + //printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -708,7 +708,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - printf("TX.(%s) %p\n",jprint(json,0),json); + //printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -825,7 +825,6 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, memset(msgtx,0,sizeof(M)); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); - printf("call rwmsgtx\n"); if ( (n= iguana_rwmsgtx(coin,height,0,txobj,serialized,len,msgtx,txidp,vpnstr,extraspace,extralen,vins,suppress_pubkeys)) <= 0 ) { printf("errortxobj.(%s)\n",jprint(txobj,0)); @@ -853,9 +852,7 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,int32_t height,bits256 *txidp,s if ( (serialized= origserialized) == 0 ) serialized = calloc(1,len+4096); decode_hex(serialized,len,txbytes); - printf("call data2json\n"); txobj = bitcoin_data2json(coin,height,txidp,msgtx,extraspace,extralen,serialized,len,vins,suppress_pubkeys); - printf("back data2json %p\n",txobj); if ( serialized != origserialized ) free(serialized); return(txobj); @@ -1423,17 +1420,17 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json\n"); + //printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx vins.%p\n",msgtx->vins); + //printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1450,7 +1447,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - printf("after privkeys tx_in.%d\n",msgtx->tx_in); + //printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1461,7 +1458,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf sigsize = 0; flag = (msgtx->vins[i].vinscript[0] == 0); type = bitcoin_scriptget(coin,&hashtype,&sigsize,&pubkeysize,&userdata,&userdatalen,&mainvin,msgtx->vins[i].vinscript+flag,msgtx->vins[i].scriptlen-flag,0); - printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); + //printf("i.%d flag.%d type.%d scriptlen.%d\n",i,flag,type,msgtx->vins[i].scriptlen); if ( msgtx->vins[i].redeemscript != 0 ) { //for (j=0; jvins[i].p2shlen; j++) @@ -1503,7 +1500,6 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } - printf("tail end\n"); if ( i < V->N ) V->signers[i].privkey = privkey; if ( i < numinputs ) From 0468083a7b5ab45ff908dffe69c399ff864327a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 09:04:59 +0200 Subject: [PATCH 201/286] Test --- basilisk/basilisk_swap.c | 127 +++++++++++++++++++++------------------ iguana/iguana_sign.c | 2 +- 2 files changed, 69 insertions(+), 60 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1ee664552..2946b1b61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1103,7 +1103,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) } } -void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr); +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t amlp); int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) { @@ -1130,24 +1130,28 @@ int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap if ( ptr != 0 ) nn_freemsg(ptr), ptr = 0; } - if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) - { - printf("nothing received for a while from Bob, try new sockets\n"); - if ( swap->pushsock >= 0 ) - nn_close(swap->pushsock), swap->pushsock = -1; - if ( swap->subsock >= 0 ) - nn_close(swap->subsock), swap->subsock = -1; - basilisk_psockinit(myinfo,swap,0,0); - } //char str[65],str2[65]; for (i=0; inummessages; i++) { //printf("%d: %s vs %s\n",i,bits256_str(str,swap->messages[i].srchash),bits256_str(str2,swap->messages[i].desthash)); - if ( swap->messages[i].msgbits == msgbits && bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) + if ( bits256_cmp(swap->messages[i].desthash,swap->I.myhash) == 0 ) { - mp = &swap->messages[i]; - if ( msgbits != 0x80000000 ) - break; + if ( swap->messages[i].msgbits == msgbits ) + { + if ( swap->I.iambob == 0 && swap->lasttime != 0 && time(NULL) > swap->lasttime+360 ) + { + printf("nothing received for a while from Bob, try new sockets\n"); + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; + swap->connected = 0; + basilisk_psockinit(myinfo,swap,0); + } + mp = &swap->messages[i]; + if ( msgbits != 0x80000000 ) + break; + } } } if ( mp != 0 ) @@ -1824,7 +1828,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { - printf("got privi spend alicepayment\n"); + printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) printf("Bob error spending alice payment\n"); @@ -1980,9 +1984,9 @@ cJSON *swapjson(struct supernet_info *myinfo,struct basilisk_swap *swap) return(retjson); } -void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,char *pushaddr,char *subaddr) +void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t amlp) { - char keystr[64],databuf[1024],*retstr,*datastr; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; + char keystr[64],databuf[1024],*retstr,*retstr2,*datastr,*pushaddr=0,*subaddr=0; cJSON *retjson,*addrjson; uint8_t data[512]; int32_t datalen,timeout,pushsock = -1,subsock = -1; if ( swap->connected == 1 ) return; if ( swap->pushsock < 0 && swap->subsock < 0 && (pushsock= nn_socket(AF_SP,NN_PUSH)) >= 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) @@ -1995,49 +1999,66 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, swap->pushsock = pushsock; swap->subsock = subsock; } + if ( swap->subsock < 0 || swap->pushsock < 0 ) + { + printf("error getting nn_sockets\n"); + return; + } sprintf(keystr,"%08x-%08x",swap->I.req.requestid,swap->I.req.quoteid); - if ( pushaddr != 0 && subaddr != 0 ) - { - if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) - swap->connected = 1; - sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); - datalen = (int32_t)strlen((char *)data) + 1; - printf("datalen.%d (%s)\n",datalen,(char *)data); - init_hexbytes_noT(databuf,data,datalen); - printf("%s -> %s\n",keystr,databuf); - if ( (retstr= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) + if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - printf("KVupdate.(%s)\n",retstr); - free(retstr); + if ( (datastr= jstr(retjson,"value")) != 0 ) + { + datalen = (int32_t)strlen(datastr) >> 1; + decode_hex((uint8_t *)databuf,datalen,datastr); + if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + { + pushaddr = jstr(addrjson,"push"); + subaddr = jstr(addrjson,"sub"); + if ( pushaddr != 0 && subaddr != 0 ) + { + printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); + if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) + swap->connected = 1; + } + free_json(addrjson); + } + } + free_json(retjson); } + printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); + free(retstr); } - else + if ( swap->connected == 0 && amlp != 0 ) { - printf("connected.%d\n",swap->connected); - if ( (retstr= _dex_kvsearch(myinfo,"KV",keystr)) != 0 ) + if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) { + // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (datastr= jstr(retjson,"value")) != 0 ) + pushaddr = jstr(retjson,"pushaddr"); + subaddr = jstr(retjson,"subaddr"); + if ( pushaddr != 0 && subaddr != 0 ) { - datalen = (int32_t)strlen(datastr) >> 1; - decode_hex((uint8_t *)databuf,datalen,datastr); - if ( (addrjson= cJSON_Parse(databuf)) != 0 ) + if ( nn_connect(pushsock,pushaddr) >= 0 && nn_connect(subsock,subaddr) >= 0 ) { - pushaddr = jstr(addrjson,"push"); - subaddr = jstr(addrjson,"sub"); - if ( pushaddr != 0 && subaddr != 0 ) + swap->connected = 1; + sprintf((char *)data,"{\"push\":\"%s\",\"sub\":\"%s\"}",pushaddr,subaddr); + datalen = (int32_t)strlen((char *)data) + 1; + printf("datalen.%d (%s)\n",datalen,(char *)data); + init_hexbytes_noT(databuf,data,datalen); + printf("%s -> %s\n",keystr,databuf); + if ( (retstr2= _dex_kvupdate(myinfo,"KV",keystr,databuf,1)) != 0 ) { - printf("KV decoded (%s and %s) %d %d\n",pushaddr,subaddr,swap->pushsock,swap->subsock); - if ( nn_connect(swap->pushsock,pushaddr) >= 0 && nn_connect(swap->subsock,subaddr) >= 0 ) - swap->connected = 1; + printf("KVupdate.(%s)\n",retstr2); + free(retstr2); } - free_json(addrjson); } } free_json(retjson); } - printf("KVsearch.(%s) connected.%d socks.(%d %d)\n",retstr,swap->connected,swap->pushsock,swap->subsock); free(retstr); } } @@ -2057,7 +2078,7 @@ void basilisk_swaploop(void *_swap) { dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); if ( swap->I.iambob == 0 && swap->connected == 0 ) - basilisk_psockinit(myinfo,swap,0,0); + basilisk_psockinit(myinfo,swap,0); if ( swap->connected != 0 ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); @@ -2246,7 +2267,7 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { - int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; + int32_t i,m,n; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; // statebits 1 -> client, 0 -> LP portable_mutex_lock(&myinfo->DEX_swapmutex); for (i=0; inumswaps; i++) @@ -2271,19 +2292,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 m = n = 0; if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits,reinit) != 0 ) { - if ( statebits == 0 )//&& (swap->subsock < 0 || swap->pushsock < 0) ) - { - if ( (retstr= _dex_psock(myinfo,"{}")) != 0 ) - { - // {"result":"success","pushaddr":"tcp://5.9.102.210:30002","subaddr":"tcp://5.9.102.210:30003","randipbits":3606291758,"coin":"KMD","tag":"6952562460568228137"} - if ( (retjson= cJSON_Parse(retstr)) != 0 ) - { - basilisk_psockinit(myinfo,swap,jstr(retjson,"pushaddr"),jstr(retjson,"subaddr")); - free_json(retjson); - } - free(retstr); - } - } else basilisk_psockinit(myinfo,swap,0,0); + basilisk_psockinit(myinfo,swap,statebits == 0); if ( reinit != 0 ) { if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 6af99c203..1d8a18ded 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1408,7 +1408,7 @@ P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) { - uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *checkstr,*privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; + uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; maxsize = 1000000; memset(privkey.bytes,0,sizeof(privkey)); if ( rawtx != 0 && rawtx[0] != 0 && (len= (int32_t)strlen(rawtx)>>1) < maxsize ) From f7d545e3b51baa067484e02a1834fc2d5a8e0820 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:03:32 +0200 Subject: [PATCH 202/286] Test --- iguana/SuperNET_keys.c | 3 ++- iguana/iguana_wallet.c | 3 +++ iguana/main.c | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index b44fc1b18..6eb315550 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -364,6 +364,7 @@ void SuperNET_parsemyinfo(struct supernet_info *myinfo,cJSON *msgjson) SuperNET_setkeys(myinfo,myinfo->persistent_priv.bytes,sizeof(myinfo->persistent_priv),0); } +int32_t Encryptwallet; char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) { long allocsize; cJSON *msgjson,*json=0; uint32_t r; bits256 wallethash,wallet2priv; int32_t len,c; @@ -376,7 +377,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else + else if ( Encryptwallet != 0 ) { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 90303ae80..bdb940621 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -15,6 +15,7 @@ #include "iguana777.h" #include "exchanges/bitcoin.h" +extern int32_t EncryptWallet; void scrubfree(char *sensitivestr) { @@ -1392,6 +1393,7 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) strcpy(myinfo->password,password); if ( permanentfile != 0 ) strcpy(myinfo->permanentfile,permanentfile); + EncryptWallet = 1; retstr = SuperNET_login(IGUANA_CALLARGS,myinfo->handle,myinfo->secret,myinfo->permanentfile,myinfo->password); //myinfo->expiration = (uint32_t)time(NULL) + 3600*24; struct iguana_waddress waddr; struct iguana_waccount *wacct; @@ -1434,6 +1436,7 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) //iguana_walletinitcheck(myinfo,coin); myinfo->dirty = (uint32_t)time(NULL); myinfo->expiration = 0; + EncryptWallet = 0; return(retstr); } diff --git a/iguana/main.c b/iguana/main.c index ac883a401..f40b7076c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1535,6 +1535,7 @@ struct supernet_info *SuperNET_accountfind(cJSON *json) FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) { + extern int32_t EncryptWallet; char *str,*decryptstr = 0; cJSON *argjson,*item,*walletitem; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); @@ -1585,7 +1586,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(myinfo->decryptstr); myinfo->decryptstr = 0; } - if ( passphrase != 0 && passphrase[0] != 0 ) + if ( passphrase != 0 && passphrase[0] != 0 && EncryptWallet != 0 ) { SuperNET_setkeys(myinfo,passphrase,(int32_t)strlen(passphrase),1); if ( myinfo->decryptstr != 0 && (argjson= cJSON_Parse(myinfo->decryptstr)) != 0 ) @@ -1613,7 +1614,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(str); myinfo->expiration = (uint32_t)(time(NULL) + 3600); return(SuperNET_activehandle(IGUANA_CALLARGS)); - } else return(clonestr("{\"error\":\"need passphrase\"}")); + } else return(clonestr("{\"error\":\"need passphrase or wallet doesnt exist\"}")); return(SuperNET_activehandle(IGUANA_CALLARGS)); } From 3690ff54b43e41d5b13323066bd118084eb0332a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:09:20 +0200 Subject: [PATCH 203/286] Test --- iguana/SuperNET_keys.c | 4 ++-- iguana/main.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 6eb315550..62fdb1b34 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -22,6 +22,7 @@ #include "../includes/curve25519.h" #include "../includes/cJSON.h" +extern int32_t EncryptWallet; /* if ( 0 ) @@ -364,7 +365,6 @@ void SuperNET_parsemyinfo(struct supernet_info *myinfo,cJSON *msgjson) SuperNET_setkeys(myinfo,myinfo->persistent_priv.bytes,sizeof(myinfo->persistent_priv),0); } -int32_t Encryptwallet; char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) { long allocsize; cJSON *msgjson,*json=0; uint32_t r; bits256 wallethash,wallet2priv; int32_t len,c; @@ -377,7 +377,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else if ( Encryptwallet != 0 ) + else if ( EncryptWallet != 0 ) { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/main.c b/iguana/main.c index f40b7076c..61caaa28f 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -24,6 +24,8 @@ #include "../pnacl_main.h" #include "iguana777.h" +int32_t EncryptWallet; + struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char *retjsonstr; char remoteaddr[64]; uint16_t port; char jsonstr[]; }; uint16_t SuperNET_API2num(char *agent,char *method) @@ -1535,7 +1537,6 @@ struct supernet_info *SuperNET_accountfind(cJSON *json) FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) { - extern int32_t EncryptWallet; char *str,*decryptstr = 0; cJSON *argjson,*item,*walletitem; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); From 3c61c0668fc3a2700201a6d1b51a962d192d484a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:10:53 +0200 Subject: [PATCH 204/286] Test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index dcde86599..278e7a2d8 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -23,7 +23,7 @@ //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_VERSION 0x0781 -#define DPOW_UTXOSIZE 10000 +#define DPOW_UTXOSIZE 30000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 #define DPOW_RATIFYDURATION (3600 * 24) From b87928993417554107fb95947cb199ebb1ac3d68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:19:47 +0200 Subject: [PATCH 205/286] Test --- basilisk/basilisk_swap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2946b1b61..516509e15 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1173,7 +1173,11 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw if ( datalen > 0 ) memcpy(&buf[offset],data,datalen), offset += datalen; if ( (sentbytes= nn_send(swap->pushsock,buf,offset,0)) != offset ) + { printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); + if ( sentbytes < 0 ) + swap->connected = 0; + } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); return(0); @@ -1767,6 +1771,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap int32_t j,datalen,retval = 0; while ( ((swap->I.otherstatebits & 0x80) == 0 || (swap->I.statebits & 0x80) == 0) && retval == 0 && time(NULL) < swap->I.expiration ) { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); printf("D r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( (swap->I.statebits & 0x80) == 0 ) // wait for fee { @@ -1789,6 +1795,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //if ( (rand() % 30) == 0 ) printf("E r%u/q%u swapstate.%x otherstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,swap->I.otherstatebits); if ( swap->I.iambob != 0 ) @@ -2077,8 +2085,8 @@ void basilisk_swaploop(void *_swap) while ( (swap->I.statebits & (0x08|0x02)) != (0x08|0x02) && time(NULL) < expiration ) { dex_channelsend(myinfo,swap->I.req.srchash,swap->I.req.desthash,channel,0x4000000,(void *)&swap->I.req.requestid,sizeof(swap->I.req.requestid)); //,60); - if ( swap->I.iambob == 0 && swap->connected == 0 ) - basilisk_psockinit(myinfo,swap,0); + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); if ( swap->connected != 0 ) { printf("A r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); @@ -2101,6 +2109,8 @@ void basilisk_swaploop(void *_swap) } while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); printf("B r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_sendchoosei(myinfo,swap,data,maxlen); @@ -2132,6 +2142,8 @@ void basilisk_swaploop(void *_swap) } while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { + if ( swap->connected == 0 ) + basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //dpow_nanomsg_update(myinfo); //dex_updateclient(myinfo); //printf("sendstate.%x\n",swap->I.statebits); From 8b137c57c5043848d6e611833cea5e3638bada9f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:21:29 +0200 Subject: [PATCH 206/286] Test --- basilisk/basilisk_swap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 516509e15..7dd4c70eb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1176,7 +1176,13 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw { printf("sentbytes.%d vs offset.%d\n",sentbytes,offset); if ( sentbytes < 0 ) + { + if ( swap->pushsock >= 0 ) + nn_close(swap->pushsock), swap->pushsock = -1; + if ( swap->subsock >= 0 ) + nn_close(swap->subsock), swap->subsock = -1; swap->connected = 0; + } } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); From 0f2a167e8d6edd71cfd4986c0ebfadccf02b61de Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 10:56:08 +0200 Subject: [PATCH 207/286] Test --- basilisk/basilisk_swap.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7dd4c70eb..2aa853b64 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -13,7 +13,8 @@ * * ******************************************************************************/ -/*use external privkey to sign +/* + resume handling: list of tx broadcast, tx pending + required items, reconnect state machine or have statemachine assume off by one or state/otherstate specific handling make sure to broadcast deposit before claiming refund, or to just skip it if neither is done */ @@ -1434,7 +1435,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.bobconfirms = swap->bobcoin->chain->minconfirms; if ( swap->I.aliceconfirms == 0 ) swap->I.aliceconfirms = swap->alicecoin->chain->minconfirms; - jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; + jumblrflag = (bits256_cmp(pubkey25519,myinfo->jumblr_pubkey) == 0 || bits256_cmp(pubkey25519,myinfo->jumblr_depositkey) == 0); if ( swap->I.iambob != 0 ) { basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); @@ -1623,7 +1624,7 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t return(errs); } -uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits) +uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { uint8_t sendbuf[32768]; int32_t sendlen; if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) @@ -1647,7 +1648,9 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis sendlen += rawtx->I.redeemlen; } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); - return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + if ( suppress_swapsend == 0 ) + return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); + else return(0); } } return(nextbits); @@ -1797,7 +1800,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) - basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); } while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { @@ -1811,7 +1814,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.statebits & 0x100) == 0 ) { printf("send bobdeposit\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x200,data,maxlen,&swap->bobdeposit,0x100,0); } // [BLOCKING: altfound] make sure altpayment is confirmed and send payment else if ( (swap->I.statebits & 0x1000) == 0 ) @@ -1835,7 +1838,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { basilisk_bobscripts_set(myinfo,swap,0,1); printf("send bobpayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain else if ( (swap->I.statebits & 0x40000) == 0 ) @@ -1844,7 +1847,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000,1) == 0 ) printf("Bob error spending alice payment\n"); else { @@ -1867,7 +1870,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap // submit reclaim of payment printf("bob reclaims bobpayment\n"); swap->I.statebits |= (0x40000 | 0x80000); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobreclaim,0,0) == 0 ) printf("Bob error reclaiming own payment after alice timed out\n"); else { @@ -1911,7 +1914,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x800) == 0 ) { printf("send alicepayment\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x1000,data,maxlen,&swap->alicepayment,0x800,0); } // [BLOCKING: payfound] make sure payment is confrmed and send in spend or see bob's reclaim and claim else if ( (swap->I.statebits & 0x8000) == 0 ) @@ -1935,7 +1938,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap else if ( (swap->I.statebits & 0x20000) == 0 ) { printf("alicespend bobpayment\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicespend,0x20000,0) != 0 && basilisk_numconfirms(myinfo,swap,&swap->alicespend) > 0 ) { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; @@ -1955,7 +1958,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( swap->bobdeposit.I.locktime != 0 && time(NULL) > swap->bobdeposit.I.locktime ) { printf("Alice claims deposit\n"); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->aliceclaim,0,0) == 0 ) printf("Alice couldnt claim deposit\n"); else { @@ -1967,7 +1970,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { printf("Alice reclaims her payment\n"); swap->I.statebits |= 0x40000000; - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000) == 0 ) + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->alicereclaim,0x40000000,0) == 0 ) printf("Alice error sending alicereclaim\n"); else { @@ -2228,7 +2231,7 @@ void basilisk_swaploop(void *_swap) if ( basilisk_rawtx_gen("myfee",myinfo,swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) { printf("done generate fee\n"); - swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); + swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); iguana_unspents_mark(myinfo,swap->I.iambob!=0?swap->bobcoin:swap->alicecoin,swap->myfee.vins); basilisk_txlog(myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) @@ -2260,7 +2263,7 @@ void basilisk_swaploop(void *_swap) { printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); - if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000) == 0 ) // use secretBn + if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn { printf("Bob submit error getting refund of deposit\n"); } From f89bc4dff642f450ce88904d81f3aea3f501f092 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 11:07:54 +0200 Subject: [PATCH 208/286] Test --- basilisk/basilisk_swap.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2aa853b64..b33cdf1d0 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -333,7 +333,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ bitcoin_priv2wif(wifstr,*privkey2,rawtx->coin->chain->wiftype); jaddistr(privkeys,wifstr); V[0].N = V[0].M = 2; - char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); + //char str[65]; printf("add second privkey.(%s) %s\n",jprint(privkeys,0),bits256_str(str,*privkey2)); } else V[0].N = V[0].M = 1; V[0].suppress_pubkeys = dest->I.suppress_pubkeys; V[0].ignore_cltverr = ignore_cltverr; @@ -372,11 +372,11 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ jaddi(vins,item); jdelete(txobj,"vin"); jadd(txobj,"vin",vins); - printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); + //printf("basilisk_rawtx_sign locktime.%u/%u for %s spendscript.%s -> %s, suppress.%d\n",rawtx->I.locktime,dest->I.locktime,rawtx->name,hexstr,dest->name,dest->I.suppress_pubkeys); txobj = bitcoin_txoutput(txobj,dest->spendscript,dest->I.spendlen,dest->I.amount); if ( (rawtxbytes= bitcoin_json2hex(myinfo,rawtx->coin,&dest->I.txid,txobj,V)) != 0 ) { - printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); + //printf("rawtx.(%s) vins.%p\n",rawtxbytes,vins); if ( needsig == 0 ) signedtx = rawtxbytes; if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) @@ -1216,7 +1216,7 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa { if ( basilisk_priviextract(myinfo,swap->bobcoin,"privBn",&swap->I.privBn,swap->I.secretBn,swap->bobrefund.I.actualtxid,0) == 0 ) { - + printf("extracted privBn from blockchain\n"); } if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { @@ -1650,7 +1650,11 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); - else return(0); + else + { + printf("suppress swapsend %x\n",msgbits); + return(0); + } } } return(nextbits); @@ -2261,6 +2265,7 @@ void basilisk_swaploop(void *_swap) printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) { + sleep(300); // wait for confirm of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn From 932a461abc690977fbe61cc312f430502adfd1d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 11:13:38 +0200 Subject: [PATCH 209/286] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b33cdf1d0..18e41e56f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1187,7 +1187,7 @@ uint32_t basilisk_swapsend(struct supernet_info *myinfo,struct basilisk_swap *sw } //else printf("send.[%d] %x offset.%d datalen.%d [%llx]\n",sentbytes,msgbits,offset,datalen,*(long long *)data); free(buf); - return(0); + return(nextbits); } int32_t basilisk_priviextract(struct supernet_info *myinfo,struct iguana_info *coin,char *name,bits256 *destp,uint8_t secret160[20],bits256 srctxid,int32_t srcvout) @@ -1946,8 +1946,8 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { for (j=datalen=0; j<32; j++) data[datalen++] = swap->I.privAm.bytes[j]; - printf("send privAm\n"); swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x40000,data,datalen,0x20000,swap->I.crcs_mypriv); + printf("send privAm %x\n",swap->I.statebits); } } else if ( (swap->I.statebits & 0x40000) == 0 ) From c091a58ffe86ffadfbd14b824d44e5eb4f6328bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 19:17:39 +0200 Subject: [PATCH 210/286] Revert walletpassphrase change --- iguana/SuperNET_keys.c | 4 +--- iguana/iguana_rpc.c | 3 ++- iguana/iguana_wallet.c | 3 --- iguana/main.c | 3 +-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 62fdb1b34..7ecab7989 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -22,8 +22,6 @@ #include "../includes/curve25519.h" #include "../includes/cJSON.h" -extern int32_t EncryptWallet; - /* if ( 0 ) { @@ -377,7 +375,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) SuperNET_parsemyinfo(myinfo,msgjson); free_json(msgjson); } - else if ( EncryptWallet != 0 ) + else { if ( bits256_nonz(myinfo->persistent_priv) == 0 ) { diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 771ca66c6..19d546676 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -31,7 +31,8 @@ char *sglue(GLUEARGS,char *agent,char *method) //printf("userpass.(%s)\n",userpass); jaddstr(json,"agent",agent); jaddstr(json,"method",method); - jaddstr(json,"coin",coin->symbol); + if ( coin != 0 ) + jaddstr(json,"coin",coin->symbol); if ( userpass != 0 ) jaddstr(json,"userpass",userpass); if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 ) diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index bdb940621..90303ae80 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -15,7 +15,6 @@ #include "iguana777.h" #include "exchanges/bitcoin.h" -extern int32_t EncryptWallet; void scrubfree(char *sensitivestr) { @@ -1393,7 +1392,6 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) strcpy(myinfo->password,password); if ( permanentfile != 0 ) strcpy(myinfo->permanentfile,permanentfile); - EncryptWallet = 1; retstr = SuperNET_login(IGUANA_CALLARGS,myinfo->handle,myinfo->secret,myinfo->permanentfile,myinfo->password); //myinfo->expiration = (uint32_t)time(NULL) + 3600*24; struct iguana_waddress waddr; struct iguana_waccount *wacct; @@ -1436,7 +1434,6 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) //iguana_walletinitcheck(myinfo,coin); myinfo->dirty = (uint32_t)time(NULL); myinfo->expiration = 0; - EncryptWallet = 0; return(retstr); } diff --git a/iguana/main.c b/iguana/main.c index 61caaa28f..ca2439b97 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -24,7 +24,6 @@ #include "../pnacl_main.h" #include "iguana777.h" -int32_t EncryptWallet; struct iguana_jsonitem { struct queueitem DL; struct supernet_info *myinfo; uint32_t fallback,expired,allocsize; char *retjsonstr; char remoteaddr[64]; uint16_t port; char jsonstr[]; }; @@ -1587,7 +1586,7 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) free(myinfo->decryptstr); myinfo->decryptstr = 0; } - if ( passphrase != 0 && passphrase[0] != 0 && EncryptWallet != 0 ) + if ( passphrase != 0 && passphrase[0] != 0 ) { SuperNET_setkeys(myinfo,passphrase,(int32_t)strlen(passphrase),1); if ( myinfo->decryptstr != 0 && (argjson= cJSON_Parse(myinfo->decryptstr)) != 0 ) From 395f6521c45bcb7ace4e188abd46b75fda3240b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 20:30:53 +0200 Subject: [PATCH 211/286] batch13 --- iguana/main.c | 6 +- iguana/tests/KMD.batch12.listunspent | 54 +++++----- iguana/tests/KMD.batch13 | 146 +++++++++++++++++++++++++++ iguana/tests/KMD.batch13.listunspent | 118 ++++++++++++++++++++++ iguana/tests/LPinit | 5 +- iguana/tests/dexgetbalance | 3 +- 6 files changed, 298 insertions(+), 34 deletions(-) create mode 100755 iguana/tests/KMD.batch13 create mode 100755 iguana/tests/KMD.batch13.listunspent diff --git a/iguana/main.c b/iguana/main.c index ca2439b97..458d63537 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1626,7 +1626,7 @@ void komodo_ICO_batch(cJSON *array,int32_t batchid) if ( (n= cJSON_GetArraySize(array)) > 0 ) { totalKMD = totalREVS = 0; - for (iter=3; iter<4; iter++) + for (iter=0; iter<1; iter++) for (i=0; i Date: Fri, 10 Mar 2017 21:09:57 +0200 Subject: [PATCH 212/286] Reduce include nesting a bit --- basilisk/basilisk.c | 550 +++++++++++++++++++++++++++++++ basilisk/basilisk_DEX.c | 243 -------------- basilisk/basilisk_MSG.c | 61 ---- basilisk/basilisk_bitcoin.c | 169 ---------- basilisk/jumblr.c | 97 ------ basilisk/smartaddress.c | 5 - basilisk/tradebots_liquidity.c | 90 +++++ basilisk/tradebots_marketmaker.c | 94 ------ gecko/gecko.c | 46 --- iguana/SuperNET_keys.c | 48 --- iguana/iguana_bitmap.c | 39 --- iguana/iguana_payments.c | 95 ++++++ iguana/iguana_sign.c | 101 ------ iguana/main.c | 120 +++++++ includes/iguana_funcs.h | 6 + 15 files changed, 861 insertions(+), 903 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 47c997c14..b6ca2cf51 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -954,6 +954,319 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) +{ + uint32_t msgid,width,channel; char *retstr; + if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"srchash")) == 0 ) + jaddbits256(vals,"srchash",hash); + if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"desthash")) == 0 ) + jaddbits256(vals,"desthash",myinfo->myaddr.persistent); + if ( (msgid= juint(vals,"msgid")) == 0 ) + { + msgid = (uint32_t)time(NULL); + jdelete(vals,"msgid"); + jaddnum(vals,"msgid",msgid); + } + if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) + { + channel = juint(vals,"channel"); + width = juint(vals,"width"); + retstr = basilisk_iterate_MSG(myinfo,channel,msgid,jbits256(vals,"srchash"),jbits256(vals,"desthash"),width); + //printf("getmessage.(%s)\n",retstr); + return(retstr); + } + //printf("getmessage not relay.%d dexsock.%d subsock.%d\n",myinfo->NOTARY.RELAYID,myinfo->dexsock,myinfo->subsock); + return(basilisk_standardservice("MSG",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,1)); +} + +HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) +{ + int32_t keylen,datalen,allocsize = 65536; uint8_t key[BASILISK_KEYSIZE],*space,*space2,*data,*ptr = 0; char *retstr=0; + space = calloc(1,allocsize); + space2 = calloc(1,allocsize); + data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],allocsize-BASILISK_KEYSIZE,hexstr); + if ( myinfo->subsock >= 0 || myinfo->dexsock >= 0 || (myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0) ) + { + keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); + if ( data != 0 ) + { + retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); + } else printf("no get_dataptr\n"); + if ( retstr != 0 ) + free(retstr); + } //else printf("not notary.%d relayid.%d\n",myinfo->IAMNOTARY,myinfo->NOTARY.RELAYID); + if ( vals != 0 && juint(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); + if ( BASILISK_KEYSIZE+datalen < allocsize ) + { + memcpy(space2,key,BASILISK_KEYSIZE); + if ( data != 0 && datalen != 0 ) + memcpy(&space2[BASILISK_KEYSIZE],data,datalen); + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1,""); + } else printf("sendmessage space too small error for %d\n",datalen); + free(space); + free(space2); + if ( ptr != 0 ) + free(ptr); + return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); +} + +HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) +{ + char *retstr=0,*symbol,*coinaddr,*infostr; cJSON *retjson,*sobj,*info,*addrs,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n,m; + if ( vals == 0 ) + return(clonestr("{\"error\":\"null valsobj\"}")); + //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) + // return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); + //if ( coin == 0 ) + { + if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) + coin = iguana_coinfind(symbol); + } + if ( jobj(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + txid = jbits256(vals,"txid"); + vout = jint(vals,"vout"); + if ( coin != 0 ) + { + if ( coin->FULLNODE < 0 ) + { + if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) + { + if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddstr(retjson,"address",coinaddr); + jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"value",dstr(value)); + jaddnum(retjson,"amount",dstr(value)); + height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); + jaddnum(retjson,"height",height); + jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); + jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddstr(retjson,"coin",coin->symbol); + } + else + { + free_json(txoutjson); + return(clonestr("{\"error\":\"return from gettxout missing fields\"}")); + } + free_json(txoutjson); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"null return from gettxout\"}")); + } + if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) + basilisktag = rand(); + if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) + timeoutmillis = BASILISK_TIMEOUT; + if ( coin->FULLNODE > 0 && (ptr= basilisk_bitcoinvalue(&Lptr,myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals)) != 0 ) + { + retstr = ptr->retstr, ptr->retstr = 0; + ptr->finished = OS_milliseconds() + 10000; + return(retstr); + } + } + if ( myinfo->reqsock >= 0 ) + { + if ( (retstr= _dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) + { + if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) + { + //printf("TX.(%s)\n",jprint(txoutjson,0)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); + if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) + { + //printf("txjson.(%s)\n",jprint(txjson,0)); + if ( (value= jdouble(txjson,"value") * SATOSHIDEN) != 0 ) + { + if ( (sobj= jobj(txjson,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 && (coinaddr= jstri(addrs,0)) != 0 ) + jaddstr(retjson,"address",coinaddr); + jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"value",dstr(value)); + if ( (infostr= _dex_getinfo(myinfo,symbol)) != 0 ) + { + if ( (info= cJSON_Parse(infostr)) != 0 ) + { + if ( (height= jint(info,"blocks")) > 0 ) + { + height -= jint(txoutjson,"confirmations"); + jaddnum(retjson,"height",height); + } + free_json(info); + } + free(infostr); + } + jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddstr(retjson,"coin",symbol); + free(retstr); + free_json(txoutjson); + return(jprint(retjson,1)); + } + } + free_json(txoutjson); + return(jprint(retjson,1)); + } + return(retstr); + } + } + return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); +} + +HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) +{ + char *retstr=0,*symbol; uint32_t basilisktag; int32_t timeoutmillis,i,retval = -1; uint64_t amount,txfee; cJSON *retarray; + if ( vals == 0 ) + return(clonestr("{\"error\":\"null valsobj\"}")); + //if ( coin == 0 ) + { + if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) + coin = iguana_coinfind(symbol); + } + if ( jobj(vals,"numrequired") == 0 ) + jaddnum(vals,"numrequired",MIN(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + if ( jobj(vals,"fanout") == 0 ) + jaddnum(vals,"fanout",MAX(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); + if ( coin != 0 ) + { + //if ( juint(vals,"burn") == 0 ) + // jaddnum(vals,"burn",0.0001); + if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) + basilisktag = rand(); + if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) + timeoutmillis = BASILISK_TIMEOUT; + if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals,0)) != 0 ) + { + printf("rawtx.(%s)\n",retstr); + if ( (amount= j64bits(vals,"satoshis")) == 0 ) + amount = jdouble(vals,"value") * SATOSHIDEN; + if ( (txfee= j64bits(vals,"txfee")) == 0 ) + txfee = coin->chain->txfee; + if ( txfee == 0 ) + txfee = 10000; + retval = -1; + if ( (retarray= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_Array(retarray) != 0 ) + { + for (i=0; iFULLNODE >= 0 ) + return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); + else + { + safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); + myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); + bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); + if ( coin->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coin,wifstr); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + { + bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); + if ( coinbtc->FULLNODE < 0 ) + jumblr_importprivkey(myinfo,coinbtc,wifstr); + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + } + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); + myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); + jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + return(jprint(retjson,1)); + } +} + +ZERO_ARGS(jumblr,status) +{ + cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; + if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) + { + jumblr_opidsupdate(myinfo,coin); + retjson = cJSON_CreateObject(); + step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); + jaddstr(retjson,"KMDdeposit",KMDaddr); + jaddstr(retjson,"BTCdeposit",BTCaddr); + if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) + jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + received = jumblr_receivedby(myinfo,coin,KMDaddr); + deposited = jumblr_balance(myinfo,coin,KMDaddr); + jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); + jaddstr(retjson,"KMDjumblr",KMDaddr); + jaddstr(retjson,"BTCjumblr",BTCaddr); + if ( coinbtc != 0 ) + jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); + finished = jumblr_receivedby(myinfo,coin,KMDaddr); + jumblred = jumblr_balance(myinfo,coin,KMDaddr); + HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) + { + if ( strlen(ptr->src) >= 40 ) + { + if ( strlen(ptr->dest) >= 40 ) + step_z2z += ptr->amount; + else step_z2t += ptr->amount; + } else step_t2z += ptr->amount; + } + jaddstr(retjson,"result","success"); + jaddnum(retjson,"deposits",dstr(deposited)); + jaddnum(retjson,"t_to_z",dstr(step_t2z)); + jaddnum(retjson,"z_to_z",dstr(step_z2z)); + jaddnum(retjson,"z_to_t",dstr(step_z2t)); + maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); + minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); + if ( maxval > minval ) + { + pending = (maxval - minval); + if ( pending < finished*.1 ) + pending = 0; + } + jaddnum(retjson,"pending",dstr(pending)); + jaddnum(retjson,"jumbled",dstr(jumblred)); + jaddnum(retjson,"received",dstr(received)); + jaddnum(retjson,"finished",dstr(finished)); + return(jprint(retjson,1)); + } + else + { + printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); + return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); + } +} + HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr) { char *retstr=0,*symbol; uint32_t basilisktag; struct basilisk_item *ptr,Lptr; int32_t timeoutmillis; @@ -1189,5 +1502,242 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) //int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *coin,uint32_t timelocked,char *destaddr,bits256 txid,int32_t vout) +THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume) +{ + double retvals[4],aveprice; cJSON *retjson = cJSON_CreateObject(); + aveprice = instantdex_avehbla(myinfo,retvals,base,rel,basevolume); + jaddstr(retjson,"result","success"); + jaddnum(retjson,"aveprice",aveprice); + jaddnum(retjson,"avebid",retvals[0]); + jaddnum(retjson,"bidvol",retvals[1]); + jaddnum(retjson,"aveask",retvals[2]); + jaddnum(retjson,"askvol",retvals[3]); + return(jprint(retjson,1)); +} + +ZERO_ARGS(InstantDEX,allcoins) +{ + struct iguana_info *tmp; cJSON *native,*notarychains,*basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); + full = cJSON_CreateArray(); + native = cJSON_CreateArray(); + basilisk = cJSON_CreateArray(); + virtual = cJSON_CreateArray(); + notarychains = cJSON_CreateArray(); + HASH_ITER(hh,myinfo->allcoins,coin,tmp) + { + if ( coin->FULLNODE < 0 ) + jaddistr(native,coin->symbol); + //else if ( coin->virtualchain != 0 ) + // jaddistr(virtual,coin->symbol); + else if ( coin->FULLNODE > 0 )//|| coin->VALIDATENODE > 0 ) + jaddistr(full,coin->symbol); + //else if ( coin->notarychain >= 0 ) + // jaddistr(notarychains,coin->symbol); + else jaddistr(basilisk,coin->symbol); + } + jadd(retjson,"native",native); + jadd(retjson,"basilisk",basilisk); + jadd(retjson,"full",full); + //jadd(retjson,"virtual",virtual); + //jadd(retjson,"notarychains",notarychains); + return(jprint(retjson,1)); +} + +STRING_ARG(InstantDEX,available,source) +{ + uint64_t total = 0; int32_t i,n=0; char coinaddr[64]; cJSON *item,*unspents,*retjson = 0; + if ( source != 0 && source[0] != 0 && (coin= iguana_coinfind(source)) != 0 ) + { + if ( myinfo->expiration != 0 ) + { + bitcoin_address(coinaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); + if ( (unspents= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) + { + //printf("available.(%s)\n",jprint(unspents,0)); + if ( (n= cJSON_GetArraySize(unspents)) > 0 ) + { + for (i=0; i %.8f\n",jprint(item,0),dstr(total)); + } + } + free_json(unspents); + } + retjson = cJSON_CreateObject(); + jaddnum(retjson,"result",dstr(total)); + printf(" n.%d total %.8f (%s)\n",n,dstr(total),jprint(retjson,0)); + return(jprint(retjson,1)); + } + printf("InstantDEX_available: need to unlock wallet\n"); + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + } + printf("InstantDEX_available: %s is not active\n",source!=0?source:""); + return(clonestr("{\"error\":\"specified coin is not active\"}")); +} + +HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) +{ + uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; + myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; + jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); + if ( jobj(vals,"desthash") == 0 ) + jaddbits256(vals,"desthash",hash); + jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); + jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); + jaddnum(vals,"timestamp",time(NULL)); + if ( (jumblr= jint(vals,"usejumblr")) != 0 ) + privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); + else privkey = myinfo->persistent_priv; + hash = curve25519(privkey,curve25519_basepoint9()); + if ( jobj(vals,"srchash") == 0 ) + jaddbits256(vals,"srchash",hash); + printf("service.(%s)\n",jprint(vals,0)); + memset(&R,0,sizeof(R)); + if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) + { + iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); + if ( (optionhours= jint(vals,"optionhours")) != 0 ) + { + printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); + if ( iambob != 0 && optionhours > 0 ) + { + sprintf(buf,"{\"error\":\"illegal call option request hours.%d when iambob.%d\"}",optionhours,iambob); + printf("ERROR.(%s)\n",buf); + return(clonestr(buf)); + } + else if ( iambob == 0 && optionhours < 0 ) + { + sprintf(buf,"{\"error\":\"illegal put option request hours.%d when iambob.%d\"}",optionhours,iambob); + printf("ERROR.(%s)\n",buf); + return(clonestr(buf)); + } + } + //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) + // R.relaybits = myinfo->myaddr.myipbits; + if ( (reqjson= basilisk_requestjson(&R)) != 0 ) + free_json(reqjson); + datalen = basilisk_rwDEXquote(1,serialized,&R); + //int32_t i; for (i=0; i 0 ) + { + uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; + memset(hash.bytes,0,sizeof(hash)); + msgid = (uint32_t)time(NULL); + DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); + sleep(3); + /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) + { + //printf("didnt get back what was sent\n"); + sleep(3); + basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); + numiters++; + }*/ + //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) + return(clonestr("{\"result\":\"DEX message sent\"}")); + //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); + } + return(clonestr("{\"error\":\"DEX message not sent\"}")); +} + +INT_ARG(InstantDEX,automatched,requestid) +{ + // return quoteid + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + return(clonestr("{\"result\":\"automatched not yet\"}")); +} + +int32_t InstantDEX_incoming_func(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) +{ + //int32_t i; + //for (i=0; iDEXpoll) + 2*drift; + if ( width < (drift+1) ) + width = 2*drift+1; + else if ( width > 64 ) + width = 64; + myinfo->DEXpoll = now; + retjson = cJSON_CreateObject(); + DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); + msgid = (uint32_t)time(NULL) + drift; + if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) + { + //printf("GOT.(%s)\n",jprint(retarray,0)); + if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) + { + jaddstr(retjson,"result","success"); + } else jaddstr(retjson,"error","cant process InstantDEX retarray"); + jadd(retjson,"responses",retarray); + } + else + { + jaddstr(retjson,"error","cant do InstantDEX channelget"); + printf("error channelget\n"); + } + return(jprint(retjson,1)); +} + +/*TWO_INTS(InstantDEX,swapstatus,requestid,quoteid) + { + cJSON *vals; char *retstr; + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + //if ( myinfo->IAMLP != 0 ) + // return(basilisk_respond_swapstatus(myinfo,myinfo->myaddr.persistent,requestid,quoteid)); + //else + { + vals = cJSON_CreateObject(); + jaddnum(vals,"requestid",(uint32_t)requestid); + jaddnum(vals,"quoteid",(uint32_t)quoteid); + jaddbits256(vals,"hash",myinfo->myaddr.persistent); + retstr = basilisk_standardservice("SWP",myinfo,0,myinfo->myaddr.persistent,vals,"",1); + free_json(vals); + return(retstr); + } + }*/ + +TWO_INTS(InstantDEX,accept,requestid,quoteid) +{ + cJSON *vals; char *retstr; + myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; + if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) + return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); + else + { + vals = cJSON_CreateObject(); + jaddnum(vals,"quoteid",(uint32_t)quoteid); + jaddnum(vals,"requestid",(uint32_t)requestid); + retstr = basilisk_standardservice("ACC",myinfo,0,myinfo->myaddr.persistent,vals,"",1); + free_json(vals); + return(retstr); + } +} + +ZERO_ARGS(InstantDEX,init) +{ + basilisk_swaps_init(myinfo); + return(clonestr("{\"result\":\"success\"}")); +} #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 3e3aaf8ea..5ec6fcaed 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -471,51 +471,6 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,bits256 privkey,uint3 retstr = clonestr("{\"error\":\"couldnt find to requestid to choose\"}"); return(retstr); } - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume) -{ - double retvals[4],aveprice; cJSON *retjson = cJSON_CreateObject(); - aveprice = instantdex_avehbla(myinfo,retvals,base,rel,basevolume); - jaddstr(retjson,"result","success"); - jaddnum(retjson,"aveprice",aveprice); - jaddnum(retjson,"avebid",retvals[0]); - jaddnum(retjson,"bidvol",retvals[1]); - jaddnum(retjson,"aveask",retvals[2]); - jaddnum(retjson,"askvol",retvals[3]); - return(jprint(retjson,1)); -} - -ZERO_ARGS(InstantDEX,allcoins) -{ - struct iguana_info *tmp; cJSON *native,*notarychains,*basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); - full = cJSON_CreateArray(); - native = cJSON_CreateArray(); - basilisk = cJSON_CreateArray(); - virtual = cJSON_CreateArray(); - notarychains = cJSON_CreateArray(); - HASH_ITER(hh,myinfo->allcoins,coin,tmp) - { - if ( coin->FULLNODE < 0 ) - jaddistr(native,coin->symbol); - //else if ( coin->virtualchain != 0 ) - // jaddistr(virtual,coin->symbol); - else if ( coin->FULLNODE > 0 )//|| coin->VALIDATENODE > 0 ) - jaddistr(full,coin->symbol); - //else if ( coin->notarychain >= 0 ) - // jaddistr(notarychains,coin->symbol); - else jaddistr(basilisk,coin->symbol); - } - jadd(retjson,"native",native); - jadd(retjson,"basilisk",basilisk); - jadd(retjson,"full",full); - //jadd(retjson,"virtual",virtual); - //jadd(retjson,"notarychains",notarychains); - return(jprint(retjson,1)); -} - cJSON *basilisk_unspents(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { cJSON *unspents=0,*array=0; char *retstr; @@ -558,201 +513,3 @@ char *basilisk_sendrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(retstr); } -STRING_ARG(InstantDEX,available,source) -{ - uint64_t total = 0; int32_t i,n=0; char coinaddr[64]; cJSON *item,*unspents,*retjson = 0; - if ( source != 0 && source[0] != 0 && (coin= iguana_coinfind(source)) != 0 ) - { - if ( myinfo->expiration != 0 ) - { - bitcoin_address(coinaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - if ( (unspents= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) - { - //printf("available.(%s)\n",jprint(unspents,0)); - if ( (n= cJSON_GetArraySize(unspents)) > 0 ) - { - for (i=0; i %.8f\n",jprint(item,0),dstr(total)); - } - } - free_json(unspents); - } - retjson = cJSON_CreateObject(); - jaddnum(retjson,"result",dstr(total)); - printf(" n.%d total %.8f (%s)\n",n,dstr(total),jprint(retjson,0)); - return(jprint(retjson,1)); - } - printf("InstantDEX_available: need to unlock wallet\n"); - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - } - printf("InstantDEX_available: %s is not active\n",source!=0?source:""); - return(clonestr("{\"error\":\"specified coin is not active\"}")); -} - -HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) -{ - uint8_t serialized[512]; bits256 privkey; char buf[512],BTCaddr[64],KMDaddr[64]; struct basilisk_request R; int32_t jumblr,iambob,optionhours; cJSON *reqjson; uint32_t datalen=0,DEX_channel; struct iguana_info *bobcoin,*alicecoin; - myinfo->DEXactive = (uint32_t)time(NULL) + 3*BASILISK_TIMEOUT + 60; - jadd64bits(vals,"minamount",jdouble(vals,"minprice") * jdouble(vals,"amount") * SATOSHIDEN * SATOSHIDEN); - if ( jobj(vals,"desthash") == 0 ) - jaddbits256(vals,"desthash",hash); - jadd64bits(vals,"satoshis",jdouble(vals,"amount") * SATOSHIDEN); - jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); - jaddnum(vals,"timestamp",time(NULL)); - if ( (jumblr= jint(vals,"usejumblr")) != 0 ) - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); - else privkey = myinfo->persistent_priv; - hash = curve25519(privkey,curve25519_basepoint9()); - if ( jobj(vals,"srchash") == 0 ) - jaddbits256(vals,"srchash",hash); - printf("service.(%s)\n",jprint(vals,0)); - memset(&R,0,sizeof(R)); - if ( basilisk_request_create(&R,vals,hash,juint(vals,"timestamp")) == 0 ) - { - iambob = bitcoin_coinptrs(hash,&bobcoin,&alicecoin,R.src,R.dest,privkey,GENESIS_PUBKEY); - if ( (optionhours= jint(vals,"optionhours")) != 0 ) - { - printf("iambob.%d optionhours.%d R.requestid.%u vs calc %u, q.%u\n",iambob,R.optionhours,R.requestid,basilisk_requestid(&R),R.quoteid); - if ( iambob != 0 && optionhours > 0 ) - { - sprintf(buf,"{\"error\":\"illegal call option request hours.%d when iambob.%d\"}",optionhours,iambob); - printf("ERROR.(%s)\n",buf); - return(clonestr(buf)); - } - else if ( iambob == 0 && optionhours < 0 ) - { - sprintf(buf,"{\"error\":\"illegal put option request hours.%d when iambob.%d\"}",optionhours,iambob); - printf("ERROR.(%s)\n",buf); - return(clonestr(buf)); - } - } - //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) - // R.relaybits = myinfo->myaddr.myipbits; - if ( (reqjson= basilisk_requestjson(&R)) != 0 ) - free_json(reqjson); - datalen = basilisk_rwDEXquote(1,serialized,&R); - //int32_t i; for (i=0; i 0 ) - { - uint32_t msgid;//,crc=0,crcs[2],numiters = 0; uint8_t buf[4096]; - memset(hash.bytes,0,sizeof(hash)); - msgid = (uint32_t)time(NULL); - DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - basilisk_channelsend(myinfo,hash,hash,DEX_channel,msgid,serialized,datalen,60); - sleep(3); - /*while ( numiters < 10 && (crc= basilisk_crcsend(myinfo,0,buf,sizeof(buf),hash,myinfo->myaddr.persistent,DEX_channel,msgid,serialized,datalen,crcs)) == 0 ) - { - //printf("didnt get back what was sent\n"); - sleep(3); - basilisk_channelsend(myinfo,myinfo->myaddr.persistent,hash,DEX_channel,msgid,serialized,datalen,60); - numiters++; - }*/ - //if ( crc != 0 )//basilisk_channelsend(myinfo,R.srchash,R.desthash,DEX_channel,(uint32_t)time(NULL),serialized,datalen,30) == 0 ) - return(clonestr("{\"result\":\"DEX message sent\"}")); - //else return(clonestr("{\"error\":\"DEX message couldnt be sent\"}")); - } - return(clonestr("{\"error\":\"DEX message not sent\"}")); -} - -INT_ARG(InstantDEX,automatched,requestid) -{ - // return quoteid - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - return(clonestr("{\"result\":\"automatched not yet\"}")); -} - -int32_t InstantDEX_incoming_func(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) -{ - //int32_t i; - //for (i=0; iDEXpoll) + 2*drift; - if ( width < (drift+1) ) - width = 2*drift+1; - else if ( width > 64 ) - width = 64; - myinfo->DEXpoll = now; - retjson = cJSON_CreateObject(); - DEX_channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); - msgid = (uint32_t)time(NULL) + drift; - if ( (retarray= basilisk_channelget(myinfo,zero,myinfo->myaddr.persistent,DEX_channel,msgid,width)) != 0 ) - { - //printf("GOT.(%s)\n",jprint(retarray,0)); - if ( (retval= basilisk_process_retarray(myinfo,0,InstantDEX_process_channelget,data,sizeof(data),DEX_channel,msgid,retarray,InstantDEX_incoming_func)) > 0 ) - { - jaddstr(retjson,"result","success"); - } else jaddstr(retjson,"error","cant process InstantDEX retarray"); - jadd(retjson,"responses",retarray); - } - else - { - jaddstr(retjson,"error","cant do InstantDEX channelget"); - printf("error channelget\n"); - } - return(jprint(retjson,1)); -} - -/*TWO_INTS(InstantDEX,swapstatus,requestid,quoteid) -{ - cJSON *vals; char *retstr; - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - //if ( myinfo->IAMLP != 0 ) - // return(basilisk_respond_swapstatus(myinfo,myinfo->myaddr.persistent,requestid,quoteid)); - //else - { - vals = cJSON_CreateObject(); - jaddnum(vals,"requestid",(uint32_t)requestid); - jaddnum(vals,"quoteid",(uint32_t)quoteid); - jaddbits256(vals,"hash",myinfo->myaddr.persistent); - retstr = basilisk_standardservice("SWP",myinfo,0,myinfo->myaddr.persistent,vals,"",1); - free_json(vals); - return(retstr); - } -}*/ - -TWO_INTS(InstantDEX,accept,requestid,quoteid) -{ - cJSON *vals; char *retstr; - myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - return(basilisk_respond_accept(myinfo,myinfo->persistent_priv,requestid,quoteid,&myinfo->DEXaccept)); - else - { - vals = cJSON_CreateObject(); - jaddnum(vals,"quoteid",(uint32_t)quoteid); - jaddnum(vals,"requestid",(uint32_t)requestid); - retstr = basilisk_standardservice("ACC",myinfo,0,myinfo->myaddr.persistent,vals,"",1); - free_json(vals); - return(retstr); - } -} - -ZERO_ARGS(InstantDEX,init) -{ - basilisk_swaps_init(myinfo); - return(clonestr("{\"result\":\"success\"}")); -} - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 3af06c656..6619c4db0 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -319,67 +319,6 @@ cJSON *dpow_addmessage(struct supernet_info *myinfo,char *jsonstr) return(retjson); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) -{ - uint32_t msgid,width,channel; char *retstr; - if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"srchash")) == 0 ) - jaddbits256(vals,"srchash",hash); - if ( bits256_cmp(GENESIS_PUBKEY,jbits256(vals,"desthash")) == 0 ) - jaddbits256(vals,"desthash",myinfo->myaddr.persistent); - if ( (msgid= juint(vals,"msgid")) == 0 ) - { - msgid = (uint32_t)time(NULL); - jdelete(vals,"msgid"); - jaddnum(vals,"msgid",msgid); - } - if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - { - channel = juint(vals,"channel"); - width = juint(vals,"width"); - retstr = basilisk_iterate_MSG(myinfo,channel,msgid,jbits256(vals,"srchash"),jbits256(vals,"desthash"),width); - //printf("getmessage.(%s)\n",retstr); - return(retstr); - } - //printf("getmessage not relay.%d dexsock.%d subsock.%d\n",myinfo->NOTARY.RELAYID,myinfo->dexsock,myinfo->subsock); - return(basilisk_standardservice("MSG",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,1)); -} - -HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) -{ - int32_t keylen,datalen,allocsize = 65536; uint8_t key[BASILISK_KEYSIZE],*space,*space2,*data,*ptr = 0; char *retstr=0; - space = calloc(1,allocsize); - space2 = calloc(1,allocsize); - data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],allocsize-BASILISK_KEYSIZE,hexstr); - if ( myinfo->subsock >= 0 || myinfo->dexsock >= 0 || (myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0) ) - { - keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); - if ( data != 0 ) - { - retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); - } else printf("no get_dataptr\n"); - if ( retstr != 0 ) - free(retstr); - } //else printf("not notary.%d relayid.%d\n",myinfo->IAMNOTARY,myinfo->NOTARY.RELAYID); - if ( vals != 0 && juint(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); - if ( BASILISK_KEYSIZE+datalen < allocsize ) - { - memcpy(space2,key,BASILISK_KEYSIZE); - if ( data != 0 && datalen != 0 ) - memcpy(&space2[BASILISK_KEYSIZE],data,datalen); - dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1,""); - } else printf("sendmessage space too small error for %d\n",datalen); - free(space); - free(space2); - if ( ptr != 0 ) - free(ptr); - return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); -} -#include "../includes/iguana_apiundefs.h" - int32_t basilisk_channelsend(struct supernet_info *myinfo,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgid,uint8_t *data,int32_t datalen,uint32_t duration) { char *retstr,*hexstr,strbuf[4096],*ptr = 0; int32_t retval = -1; cJSON *valsobj; diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index e601c1e64..3e5aae41b 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -1049,175 +1049,6 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch } #endif - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) -{ - char *retstr=0,*symbol,*coinaddr,*infostr; cJSON *retjson,*sobj,*info,*addrs,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n,m; - if ( vals == 0 ) - return(clonestr("{\"error\":\"null valsobj\"}")); - //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) - // return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); - //if ( coin == 0 ) - { - if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) - coin = iguana_coinfind(symbol); - } - if ( jobj(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - txid = jbits256(vals,"txid"); - vout = jint(vals,"vout"); - if ( coin != 0 ) - { - if ( coin->FULLNODE < 0 ) - { - if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) - { - if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) - { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddstr(retjson,"address",coinaddr); - jadd64bits(retjson,"satoshis",value); - jaddnum(retjson,"value",dstr(value)); - jaddnum(retjson,"amount",dstr(value)); - height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); - jaddnum(retjson,"height",height); - jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); - jaddbits256(retjson,"txid",txid); - jaddnum(retjson,"vout",vout); - jaddstr(retjson,"coin",coin->symbol); - } - else - { - free_json(txoutjson); - return(clonestr("{\"error\":\"return from gettxout missing fields\"}")); - } - free_json(txoutjson); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"null return from gettxout\"}")); - } - if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) - basilisktag = rand(); - if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) - timeoutmillis = BASILISK_TIMEOUT; - if ( coin->FULLNODE > 0 && (ptr= basilisk_bitcoinvalue(&Lptr,myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals)) != 0 ) - { - retstr = ptr->retstr, ptr->retstr = 0; - ptr->finished = OS_milliseconds() + 10000; - return(retstr); - } - } - if ( myinfo->reqsock >= 0 ) - { - if ( (retstr= _dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) - { - if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) - { - //printf("TX.(%s)\n",jprint(txoutjson,0)); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddnum(retjson,"numconfirms",jint(txoutjson,"confirmations")); - if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) - { - //printf("txjson.(%s)\n",jprint(txjson,0)); - if ( (value= jdouble(txjson,"value") * SATOSHIDEN) != 0 ) - { - if ( (sobj= jobj(txjson,"scriptPubKey")) != 0 && (addrs= jarray(&m,sobj,"addresses")) != 0 && (coinaddr= jstri(addrs,0)) != 0 ) - jaddstr(retjson,"address",coinaddr); - jadd64bits(retjson,"satoshis",value); - jaddnum(retjson,"value",dstr(value)); - if ( (infostr= _dex_getinfo(myinfo,symbol)) != 0 ) - { - if ( (info= cJSON_Parse(infostr)) != 0 ) - { - if ( (height= jint(info,"blocks")) > 0 ) - { - height -= jint(txoutjson,"confirmations"); - jaddnum(retjson,"height",height); - } - free_json(info); - } - free(infostr); - } - jaddbits256(retjson,"txid",txid); - jaddnum(retjson,"vout",vout); - jaddstr(retjson,"coin",symbol); - free(retstr); - free_json(txoutjson); - return(jprint(retjson,1)); - } - } - free_json(txoutjson); - return(jprint(retjson,1)); - } - return(retstr); - } - } - return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); -} - -HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) -{ - char *retstr=0,*symbol; uint32_t basilisktag; int32_t timeoutmillis,i,retval = -1; uint64_t amount,txfee; cJSON *retarray; - if ( vals == 0 ) - return(clonestr("{\"error\":\"null valsobj\"}")); - //if ( coin == 0 ) - { - if ( (symbol= jstr(vals,"symbol")) != 0 || (symbol= jstr(vals,"coin")) != 0 ) - coin = iguana_coinfind(symbol); - } - if ( jobj(vals,"numrequired") == 0 ) - jaddnum(vals,"numrequired",MIN(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - if ( jobj(vals,"fanout") == 0 ) - jaddnum(vals,"fanout",MAX(3,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); - if ( coin != 0 ) - { - //if ( juint(vals,"burn") == 0 ) - // jaddnum(vals,"burn",0.0001); - if ( (basilisktag= juint(vals,"basilisktag")) == 0 ) - basilisktag = rand(); - if ( (timeoutmillis= juint(vals,"timeout")) <= 0 ) - timeoutmillis = BASILISK_TIMEOUT; - if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals,0)) != 0 ) - { - printf("rawtx.(%s)\n",retstr); - if ( (amount= j64bits(vals,"satoshis")) == 0 ) - amount = jdouble(vals,"value") * SATOSHIDEN; - if ( (txfee= j64bits(vals,"txfee")) == 0 ) - txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; - retval = -1; - if ( (retarray= cJSON_Parse(retstr)) != 0 ) - { - if ( is_cJSON_Array(retarray) != 0 ) - { - for (i=0; iFULLNODE >= 0 ) - return(clonestr("{\"error\":\"no passphrase or no native komodod\"}")); - else - { - safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); - myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); - bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); - if ( coin->FULLNODE < 0 ) - jumblr_importprivkey(myinfo,coin,wifstr); - jaddstr(retjson,"KMDdeposit",KMDaddr); - jaddstr(retjson,"BTCdeposit",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - { - bitcoin_priv2wif(wifstr,privkey,coinbtc->chain->wiftype); - if ( coinbtc->FULLNODE < 0 ) - jumblr_importprivkey(myinfo,coinbtc,wifstr); - jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - } - privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); - myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); - jaddstr(retjson,"KMDjumblr",KMDaddr); - jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - return(jprint(retjson,1)); - } -} - -ZERO_ARGS(jumblr,status) -{ - cJSON *retjson; char KMDaddr[64],BTCaddr[64]; struct jumblr_item *ptr,*tmp; struct iguana_info *coinbtc; int64_t received,deposited,jumblred,step_t2z,step_z2z,step_z2t,finished,pending,maxval,minval; - if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 && myinfo->jumblr_passphrase[0] != 0 ) - { - jumblr_opidsupdate(myinfo,coin); - retjson = cJSON_CreateObject(); - step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; - jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); - jaddstr(retjson,"KMDdeposit",KMDaddr); - jaddstr(retjson,"BTCdeposit",BTCaddr); - if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) - jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - received = jumblr_receivedby(myinfo,coin,KMDaddr); - deposited = jumblr_balance(myinfo,coin,KMDaddr); - jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); - jaddstr(retjson,"KMDjumblr",KMDaddr); - jaddstr(retjson,"BTCjumblr",BTCaddr); - if ( coinbtc != 0 ) - jaddnum(retjson,"BTCjumbled",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); - finished = jumblr_receivedby(myinfo,coin,KMDaddr); - jumblred = jumblr_balance(myinfo,coin,KMDaddr); - HASH_ITER(hh,myinfo->jumblrs,ptr,tmp) - { - if ( strlen(ptr->src) >= 40 ) - { - if ( strlen(ptr->dest) >= 40 ) - step_z2z += ptr->amount; - else step_z2t += ptr->amount; - } else step_t2z += ptr->amount; - } - jaddstr(retjson,"result","success"); - jaddnum(retjson,"deposits",dstr(deposited)); - jaddnum(retjson,"t_to_z",dstr(step_t2z)); - jaddnum(retjson,"z_to_z",dstr(step_z2z)); - jaddnum(retjson,"z_to_t",dstr(step_z2t)); - maxval = MAX(step_t2z,MAX(step_z2z,step_z2t)); - minval = MIN(step_t2z,MIN(step_z2z,step_z2t)); - if ( maxval > minval ) - { - pending = (maxval - minval); - if ( pending < finished*.1 ) - pending = 0; - } - jaddnum(retjson,"pending",dstr(pending)); - jaddnum(retjson,"jumbled",dstr(jumblred)); - jaddnum(retjson,"received",dstr(received)); - jaddnum(retjson,"finished",dstr(finished)); - return(jprint(retjson,1)); - } - else - { - printf("(%s) (%s) %d\n",coin->symbol,myinfo->jumblr_passphrase,coin->FULLNODE); - return(clonestr("{\"error\":\"jumblr status no passphrase or no native komodod\"}")); - } -} - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/smartaddress.c b/basilisk/smartaddress.c index 95b15c6e9..ff9707b0c 100755 --- a/basilisk/smartaddress.c +++ b/basilisk/smartaddress.c @@ -88,8 +88,3 @@ int32_t smartaddress_pubkey33(struct supernet_info *myinfo,bits256 *privkeyp,uin return(0); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - - -#include "../includes/iguana_apiundefs.h" diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index c87cea550..9ce61549b 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -1238,4 +1238,94 @@ ZERO_ARGS(tradebot,openliquidity) return(jprint(array,1)); } +ZERO_ARGS(tradebot,allbalances) +{ + int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); + if ( myinfo->liquidity_currencies == 0 ) + myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); + if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) + { + for (i=0; iliquidity_currencies,i); + value = tradebot_balance(myinfo,base); + pending = tradebot_pending(myinfo,base); + item = cJSON_CreateObject(); + jaddnum(item,"value",value); + jaddnum(item,"pending",pending); + jadd(balances,base,item); + } + } + return(jprint(balances,1)); +} + +ZERO_ARGS(tradebot,anchor) +{ + FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; + if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) + { + if ( jobj(anchor,"error") == 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) + retval = 0; + fclose(fp); + } + } + } + free(anchorstr); + } + if ( retval == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); +} + +ZERO_ARGS(tradebot,portfolio) +{ + char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; + if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (current= cJSON_Parse(currentstr)) != 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) + { + anchor = cJSON_Parse(anchorstr); + free(anchorstr); + } + if ( anchor == 0 ) + anchor = cJSON_Parse("{}"); + portfolio = tradebot_balancesdiff(myinfo,current,anchor); + free_json(current); + } + free(currentstr); + } + if ( portfolio == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(jprint(portfolio,1)); +} + +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) +{ + static bits256 zero; char *targetcoin; int32_t i,n; + if ( currencies != 0 && vals != 0 ) + { + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume + n = cJSON_GetArraySize(currencies); + for (i=0; iliquidity_currencies == 0 ) - myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); - if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) - { - for (i=0; iliquidity_currencies,i); - value = tradebot_balance(myinfo,base); - pending = tradebot_pending(myinfo,base); - item = cJSON_CreateObject(); - jaddnum(item,"value",value); - jaddnum(item,"pending",pending); - jadd(balances,base,item); - } - } - return(jprint(balances,1)); -} - -ZERO_ARGS(tradebot,anchor) -{ - FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; - if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) - { - if ( jobj(anchor,"error") == 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) - retval = 0; - fclose(fp); - } - } - } - free(anchorstr); - } - if ( retval == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); -} - -ZERO_ARGS(tradebot,portfolio) -{ - char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; - if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (current= cJSON_Parse(currentstr)) != 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) - { - anchor = cJSON_Parse(anchorstr); - free(anchorstr); - } - if ( anchor == 0 ) - anchor = cJSON_Parse("{}"); - portfolio = tradebot_balancesdiff(myinfo,current,anchor); - free_json(current); - } - free(currentstr); - } - if ( portfolio == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(jprint(portfolio,1)); -} - -ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) -{ - static bits256 zero; char *targetcoin; int32_t i,n; - if ( currencies != 0 && vals != 0 ) - { - // init things so automatically updates refli.bid and refli.ask - // volume range with margin - // currency percentage value in BTC? target distribution, max percentage, min percentage` - // min price to sell, max price to buy, max volume - n = cJSON_GetArraySize(currencies); - for (i=0; iinternaladdr,remoteaddr,0,vals,0,0,hash,0)); - } else return(clonestr("{\"error\":\"geckoget needs virtualchain\"}")); - } - return(clonestr("{\"error\":\"geckoget needs BTCD\"}")); -} - -#include "../includes/iguana_apiundefs.h" diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 7ecab7989..31cbe6869 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -420,52 +420,4 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) return(coinargs); } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -TWO_STRINGS(SuperNET,decryptjson,password,permanentfile) -{ - char pass[8192],fname2[1023],destfname[1024]; cJSON *retjson; bits256 wallethash,wallet2priv; - safecopy(pass,password,sizeof(pass)); - safecopy(fname2,permanentfile,sizeof(fname2)); - wallethash = wallet2priv = GENESIS_PRIVKEY; - if ( strlen(pass) == sizeof(wallethash)*2 && is_hexstr(pass,(int32_t)sizeof(bits256)*2) > 0 ) - wallethash = bits256_conv(pass); - if ( strlen(fname2) == sizeof(wallet2priv)*2 && is_hexstr(fname2,(int32_t)sizeof(bits256)*2) > 0 ) - wallet2priv = bits256_conv(fname2); - if ( (retjson= SuperNET_decryptedjson(destfname,pass,sizeof(pass),wallethash,fname2,sizeof(fname2),wallet2priv)) != 0 ) - { - //printf("decrypt pass.(%s) fname2.(%s) -> destfname.(%s)\n",pass,fname2,destfname); - //obj = jduplicate(jobj(retjson,"payload")); - //jdelete(retjson,"payload"); - //jadd(retjson,"result",obj); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"couldnt decrypt json file\"}")); -} - -THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) -{ - char destfname[4096],pass[8192],fname2[1023]; cJSON *argjson,*retjson = cJSON_CreateObject(); - safecopy(pass,password,sizeof(pass)); - safecopy(fname2,permanentfile,sizeof(fname2)); - argjson = jduplicate(json); - //printf("argjson.(%s)\n",jprint(argjson,0)); - jdelete(argjson,"agent"); - jdelete(argjson,"method"); - jdelete(argjson,"password"); - jdelete(argjson,"permanentfile"); - jdelete(argjson,"timestamp"); - jdelete(argjson,"tag"); - if ( _SuperNET_encryptjson(myinfo,destfname,pass,sizeof(pass),fname2,sizeof(fname2),argjson) == 0 ) - { - jaddstr(retjson,"result","success"); - jaddstr(retjson,"filename",destfname); - } else jaddstr(retjson,"error","couldnt encrypt json file"); - free_json(argjson); - return(jprint(retjson,1)); -} - - -#include "../includes/iguana_apiundefs.h" - diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index ec1ce5484..89effe210 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -1162,42 +1162,3 @@ void iguana_bitmap(char *space,int32_t max,char *name) } } -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_AND_TWOINTS(mouse,change,name,x,y) -{ - printf("mouse (%s) x.%d y.%d\n",name,x,y); - return(clonestr("{\"result\":\"changed\"}")); -} - -STRING_ARG(mouse,leave,name) -{ - printf("mouse (%s) leave\n",name); - return(clonestr("{\"result\":\"left\"}")); -} - -STRING_AND_TWOINTS(mouse,click,name,x,y) -{ - printf("mouse (%s) x.%d y.%d click\n",name,x,y); - return(clonestr("{\"result\":\"click\"}")); -} - -STRING_AND_INT(keyboard,key,name,c) -{ - printf(" KEY.(%s) c.%d (%c)\n",name,c,c); - return(clonestr("{\"result\":\"key\"}")); -} - -STRING_AND_TWOINTS(mouse,image,name,x,y) -{ - printf("mouse CREATE (%s) x.%d y.%d\n",name,x,y); - return(clonestr("{\"result\":\"opened\"}")); -} - -STRING_ARG(mouse,close,name) -{ - printf("mouse CLOSE (%s)\n",name); - return(clonestr("{\"result\":\"closed\"}")); -} -#include "../includes/iguana_apiundefs.h" diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 5286d37ef..8e7aacf20 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -1685,4 +1685,99 @@ THREE_INTS(iguana,splitfunds,satoshis,duplicates,sendflag) return(jprint(retjson,1)); } +P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount,destaddress2,destamount2,M,N,pubA,wifA,pubB,wifB,pubC,wifC) +{ + struct vin_info V; uint8_t p2sh_rmd160[20],serialized[2096],spendscript[32],pubkeys[3][65],*pubkeyptrs[3]; int32_t spendlen,height = 0; + char msigaddr[64],*retstr; cJSON *retjson,*txobj; struct iguana_info *active; + bits256 signedtxid; char *signedtx; + struct iguana_msgtx msgtx; + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + if ( (active= iguana_coinfind(activecoin)) == 0 ) + return(clonestr("{\"error\":\"activecoin isnt active\"}")); + if ( M > N || N > 3 ) + return(clonestr("{\"error\":\"illegal M or N\"}")); + memset(&V,0,sizeof(V)); + txobj = bitcoin_txcreate(active->symbol,active->chain->isPoS,0,coin->chain->normal_txversion,0); + if ( destaddress[0] != 0 && destamount > 0. ) + bitcoin_txaddspend(active,txobj,destaddress,destamount * SATOSHIDEN); + if ( destaddress2[0] != 0 && destamount2 > 0. ) + bitcoin_txaddspend(active,txobj,destaddress2,destamount2 * SATOSHIDEN); + if ( pubA[0] != 0 && (retstr= _setVsigner(active,&V,0,pubA,wifA)) != 0 ) + return(retstr); + if ( N >= 2 && pubB[0] != 0 && (retstr= _setVsigner(active,&V,1,pubB,wifB)) != 0 ) + return(retstr); + if ( N == 3 && pubC[0] != 0 && (retstr= _setVsigner(active,&V,2,pubC,wifC)) != 0 ) + return(retstr); + V.M = M, V.N = N, V.type = IGUANA_SCRIPT_P2SH; + V.p2shlen = bitcoin_MofNspendscript(p2sh_rmd160,V.p2shscript,0,&V); + spendlen = bitcoin_p2shspend(spendscript,0,p2sh_rmd160); + if ( pubA[0] != 0 ) + { + decode_hex(pubkeys[0],(int32_t)strlen(pubA)>>1,pubA); + pubkeyptrs[0] = pubkeys[0]; + } + if ( pubB[0] != 0 ) + { + decode_hex(pubkeys[1],(int32_t)strlen(pubB)>>1,pubB); + pubkeyptrs[1] = pubkeys[1]; + } + if ( pubC[0] != 0 ) + { + decode_hex(pubkeys[2],(int32_t)strlen(pubC)>>1,pubC); + pubkeyptrs[2] = pubkeys[2]; + } + bitcoin_txinput(active,txobj,vintxid,vinvout,0xffffffff,spendscript,spendlen,V.p2shscript,V.p2shlen,pubkeyptrs,N,0,0); + bitcoin_address(msigaddr,active->chain->p2shtype,V.p2shscript,V.p2shlen); + retjson = cJSON_CreateObject(); + if ( bitcoin_verifyvins(active,height,&signedtxid,&signedtx,&msgtx,serialized,sizeof(serialized),&V,SIGHASH_ALL,1,V.suppress_pubkeys) == 0 ) + { + jaddstr(retjson,"result","msigtx"); + if ( signedtx != 0 ) + jaddstr(retjson,"signedtx",signedtx), free(signedtx); + jaddbits256(retjson,"txid",signedtxid); + } else jaddstr(retjson,"error","couldnt sign tx"); + jaddstr(retjson,"msigaddr",msigaddr); + return(jprint(retjson,1)); +} + +STRING_ARRAY_OBJ_STRING(bitcoinrpc,signrawtransaction,rawtx,vins,privkeys,sighash) +{ + char *signedtx = 0; struct vin_info *V; bits256 signedtxid; int32_t complete,numinputs = 1; struct iguana_msgtx msgtx; cJSON *retjson; int uselessbitcoin_error = 0; + retjson = cJSON_CreateObject(); + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + //printf("rawtx.(%s) vins.(%s) privkeys.(%s) sighash.(%s)\n",rawtx,jprint(vins,0),jprint(privkeys,0),sighash); + if ( sighash == 0 || sighash[0] == 0 ) + sighash = "ALL"; + if ( strcmp(sighash,"ALL") != 0 ) + jaddstr(retjson,"error","only sighash all (ALL) supported for now"); + if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) + { + V = calloc(numinputs,sizeof(*V)); + memset(&msgtx,0,sizeof(msgtx)); + if ( (complete= iguana_signrawtransaction(myinfo,coin,coin->blocks.hwmchain.height,&msgtx,&signedtx,&signedtxid,V,numinputs,rawtx,vins,privkeys)) >= 0 ) + { + if ( signedtx != 0 ) + { + jaddstr(retjson,"result",signedtx); + jadd(retjson,"complete",complete!=0?jtrue():jfalse()); + free(signedtx); + } else jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "no transaction from verifyvins"); + } + else if ( complete == -2 ) + jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "hex2json -> json2hex error"); + else if ( complete == -1 ) + jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "couldnt load serialized tx or mismatched numinputs"); + free(V); + //for (i=0; iexpiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - if ( (active= iguana_coinfind(activecoin)) == 0 ) - return(clonestr("{\"error\":\"activecoin isnt active\"}")); - if ( M > N || N > 3 ) - return(clonestr("{\"error\":\"illegal M or N\"}")); - memset(&V,0,sizeof(V)); - txobj = bitcoin_txcreate(active->symbol,active->chain->isPoS,0,coin->chain->normal_txversion,0); - if ( destaddress[0] != 0 && destamount > 0. ) - bitcoin_txaddspend(active,txobj,destaddress,destamount * SATOSHIDEN); - if ( destaddress2[0] != 0 && destamount2 > 0. ) - bitcoin_txaddspend(active,txobj,destaddress2,destamount2 * SATOSHIDEN); - if ( pubA[0] != 0 && (retstr= _setVsigner(active,&V,0,pubA,wifA)) != 0 ) - return(retstr); - if ( N >= 2 && pubB[0] != 0 && (retstr= _setVsigner(active,&V,1,pubB,wifB)) != 0 ) - return(retstr); - if ( N == 3 && pubC[0] != 0 && (retstr= _setVsigner(active,&V,2,pubC,wifC)) != 0 ) - return(retstr); - V.M = M, V.N = N, V.type = IGUANA_SCRIPT_P2SH; - V.p2shlen = bitcoin_MofNspendscript(p2sh_rmd160,V.p2shscript,0,&V); - spendlen = bitcoin_p2shspend(spendscript,0,p2sh_rmd160); - if ( pubA[0] != 0 ) - { - decode_hex(pubkeys[0],(int32_t)strlen(pubA)>>1,pubA); - pubkeyptrs[0] = pubkeys[0]; - } - if ( pubB[0] != 0 ) - { - decode_hex(pubkeys[1],(int32_t)strlen(pubB)>>1,pubB); - pubkeyptrs[1] = pubkeys[1]; - } - if ( pubC[0] != 0 ) - { - decode_hex(pubkeys[2],(int32_t)strlen(pubC)>>1,pubC); - pubkeyptrs[2] = pubkeys[2]; - } - bitcoin_txinput(active,txobj,vintxid,vinvout,0xffffffff,spendscript,spendlen,V.p2shscript,V.p2shlen,pubkeyptrs,N,0,0); - bitcoin_address(msigaddr,active->chain->p2shtype,V.p2shscript,V.p2shlen); - retjson = cJSON_CreateObject(); - if ( bitcoin_verifyvins(active,height,&signedtxid,&signedtx,&msgtx,serialized,sizeof(serialized),&V,SIGHASH_ALL,1,V.suppress_pubkeys) == 0 ) - { - jaddstr(retjson,"result","msigtx"); - if ( signedtx != 0 ) - jaddstr(retjson,"signedtx",signedtx), free(signedtx); - jaddbits256(retjson,"txid",signedtxid); - } else jaddstr(retjson,"error","couldnt sign tx"); - jaddstr(retjson,"msigaddr",msigaddr); - return(jprint(retjson,1)); -} - int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeysjson) { uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace,pubkeys[64][33]; int32_t finalized,i,len,n,z,plen,maxsize,complete = 0,extralen = 65536; char *privkeystr,*signedtx = 0; bits256 privkeys[64],privkey,txid; cJSON *item; cJSON *txobj = 0; @@ -1535,43 +1473,4 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(complete); } -STRING_ARRAY_OBJ_STRING(bitcoinrpc,signrawtransaction,rawtx,vins,privkeys,sighash) -{ - char *signedtx = 0; struct vin_info *V; bits256 signedtxid; int32_t complete,numinputs = 1; struct iguana_msgtx msgtx; cJSON *retjson; int uselessbitcoin_error = 0; - retjson = cJSON_CreateObject(); - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - if ( myinfo->expiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - //printf("rawtx.(%s) vins.(%s) privkeys.(%s) sighash.(%s)\n",rawtx,jprint(vins,0),jprint(privkeys,0),sighash); - if ( sighash == 0 || sighash[0] == 0 ) - sighash = "ALL"; - if ( strcmp(sighash,"ALL") != 0 ) - jaddstr(retjson,"error","only sighash all (ALL) supported for now"); - if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) - { - V = calloc(numinputs,sizeof(*V)); - memset(&msgtx,0,sizeof(msgtx)); - if ( (complete= iguana_signrawtransaction(myinfo,coin,coin->blocks.hwmchain.height,&msgtx,&signedtx,&signedtxid,V,numinputs,rawtx,vins,privkeys)) >= 0 ) - { - if ( signedtx != 0 ) - { - jaddstr(retjson,"result",signedtx); - jadd(retjson,"complete",complete!=0?jtrue():jfalse()); - free(signedtx); - } else jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "no transaction from verifyvins"); - } - else if ( complete == -2 ) - jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "hex2json -> json2hex error"); - else if ( complete == -1 ) - jaddstr(retjson,"error",uselessbitcoin_error != 0 ? "-22" : "couldnt load serialized tx or mismatched numinputs"); - free(V); - //for (i=0; iinternaladdr,remoteaddr,0,vals,0,0,hash,0)); + } else return(clonestr("{\"error\":\"geckoget needs virtualchain\"}")); + } + return(clonestr("{\"error\":\"geckoget needs BTCD\"}")); +} + +TWO_STRINGS(SuperNET,decryptjson,password,permanentfile) +{ + char pass[8192],fname2[1023],destfname[1024]; cJSON *retjson; bits256 wallethash,wallet2priv; + safecopy(pass,password,sizeof(pass)); + safecopy(fname2,permanentfile,sizeof(fname2)); + wallethash = wallet2priv = GENESIS_PRIVKEY; + if ( strlen(pass) == sizeof(wallethash)*2 && is_hexstr(pass,(int32_t)sizeof(bits256)*2) > 0 ) + wallethash = bits256_conv(pass); + if ( strlen(fname2) == sizeof(wallet2priv)*2 && is_hexstr(fname2,(int32_t)sizeof(bits256)*2) > 0 ) + wallet2priv = bits256_conv(fname2); + if ( (retjson= SuperNET_decryptedjson(destfname,pass,sizeof(pass),wallethash,fname2,sizeof(fname2),wallet2priv)) != 0 ) + { + //printf("decrypt pass.(%s) fname2.(%s) -> destfname.(%s)\n",pass,fname2,destfname); + //obj = jduplicate(jobj(retjson,"payload")); + //jdelete(retjson,"payload"); + //jadd(retjson,"result",obj); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"couldnt decrypt json file\"}")); +} + +THREE_STRINGS(SuperNET,encryptjson,password,permanentfile,payload) +{ + char destfname[4096],pass[8192],fname2[1023]; cJSON *argjson,*retjson = cJSON_CreateObject(); + safecopy(pass,password,sizeof(pass)); + safecopy(fname2,permanentfile,sizeof(fname2)); + argjson = jduplicate(json); + //printf("argjson.(%s)\n",jprint(argjson,0)); + jdelete(argjson,"agent"); + jdelete(argjson,"method"); + jdelete(argjson,"password"); + jdelete(argjson,"permanentfile"); + jdelete(argjson,"timestamp"); + jdelete(argjson,"tag"); + if ( _SuperNET_encryptjson(myinfo,destfname,pass,sizeof(pass),fname2,sizeof(fname2),argjson) == 0 ) + { + jaddstr(retjson,"result","success"); + jaddstr(retjson,"filename",destfname); + } else jaddstr(retjson,"error","couldnt encrypt json file"); + free_json(argjson); + return(jprint(retjson,1)); +} + STRING_ARG(SuperNET,addr2rmd160,address) { diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index f36ea10e4..0dec6a079 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -15,6 +15,8 @@ #ifndef H_IGUANAFUNCS_H #define H_IGUANAFUNCS_H +#define SIGHASH_ALL 1 + // peers int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize); int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin); @@ -316,6 +318,10 @@ int32_t bitcoin_changescript(struct iguana_info *coin,uint8_t *changescript,int3 //cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys); int32_t bitcoin_verifytx(struct iguana_info *coin,bits256 *signedtxidp,char **signedtx,char *rawtxstr,struct vin_info *V,int32_t numinputs); int32_t bitcoin_verify(void *ctx,uint8_t *sig,int32_t siglen,bits256 txhash2,uint8_t *pubkey,int32_t plen); +cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize,bits256 wallethash,char *fname2fa,int32_t fnamesize,bits256 wallet2priv); +int32_t bitcoin_txaddspend(struct iguana_info *coin,cJSON *txobj,char *destaddress,uint64_t satoshis); +char *_setVsigner(struct iguana_info *coin,struct vin_info *V,int32_t ind,char *pubstr,char *wifstr); + char *bitcoin_json2hex(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,cJSON *txjson,struct vin_info *V); int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr); char *issue_startForging(struct supernet_info *myinfo,char *secret); From 0a5c71ccc701e904f7e05e5f75cd9c0c5a6499bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Mar 2017 21:17:34 +0200 Subject: [PATCH 213/286] Test --- basilisk/basilisk.c | 116 ++++++++++++ basilisk/tradebots_liquidity.c | 122 ------------- iguana/main.c | 308 ++++++++++++++++++++++++++++++++ iguana/ramchain_api.c | 314 +-------------------------------- 4 files changed, 425 insertions(+), 435 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index b6ca2cf51..8610f2d66 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -954,6 +954,122 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +TWO_STRINGS(tradebot,gensvm,base,rel) +{ +#ifdef _WIN + return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); +#else + int32_t numfeatures = 317*61; + struct tradebot_arbpair *pair; + if ( base[0] != 0 && rel[0] != 0 && (pair= tradebots_arbpair_find(base,rel)) != 0 && pair->fp != 0 ) + { + tradebots_calcanswers(pair); + ocas_gen(pair->refc,numfeatures,0,(int32_t)(ftell(pair->fp) / sizeof(pair->rawfeatures))); + return(clonestr("{\"result\":\"success\"}")); + } else return(clonestr("{\"error\":\"cant find arbpair\"}")); +#endif +} + +ZERO_ARGS(tradebot,openliquidity) +{ + int32_t i; cJSON *array = cJSON_CreateArray(); + for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) + { + if ( myinfo->linfos[i].base[0] != 0 ) + jaddi(array,linfo_json(&myinfo->linfos[i])); + } + return(jprint(array,1)); +} + +ZERO_ARGS(tradebot,allbalances) +{ + int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); + if ( myinfo->liquidity_currencies == 0 ) + myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); + if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) + { + for (i=0; iliquidity_currencies,i); + value = tradebot_balance(myinfo,base); + pending = tradebot_pending(myinfo,base); + item = cJSON_CreateObject(); + jaddnum(item,"value",value); + jaddnum(item,"pending",pending); + jadd(balances,base,item); + } + } + return(jprint(balances,1)); +} + +ZERO_ARGS(tradebot,anchor) +{ + FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; + if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) + { + if ( jobj(anchor,"error") == 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) + retval = 0; + fclose(fp); + } + } + } + free(anchorstr); + } + if ( retval == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); +} + +ZERO_ARGS(tradebot,portfolio) +{ + char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; + if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) + { + if ( (current= cJSON_Parse(currentstr)) != 0 ) + { + sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) + { + anchor = cJSON_Parse(anchorstr); + free(anchorstr); + } + if ( anchor == 0 ) + anchor = cJSON_Parse("{}"); + portfolio = tradebot_balancesdiff(myinfo,current,anchor); + free_json(current); + } + free(currentstr); + } + if ( portfolio == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(jprint(portfolio,1)); +} + +ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) +{ + static bits256 zero; char *targetcoin; int32_t i,n; + if ( currencies != 0 && vals != 0 ) + { + // init things so automatically updates refli.bid and refli.ask + // volume range with margin + // currency percentage value in BTC? target distribution, max percentage, min percentage` + // min price to sell, max price to buy, max volume + n = cJSON_GetArraySize(currencies); + for (i=0; ifp != 0 ) - { - tradebots_calcanswers(pair); - ocas_gen(pair->refc,numfeatures,0,(int32_t)(ftell(pair->fp) / sizeof(pair->rawfeatures))); - return(clonestr("{\"result\":\"success\"}")); - } else return(clonestr("{\"error\":\"cant find arbpair\"}")); -#endif -} - -ZERO_ARGS(tradebot,openliquidity) -{ - int32_t i; cJSON *array = cJSON_CreateArray(); - for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) - { - if ( myinfo->linfos[i].base[0] != 0 ) - jaddi(array,linfo_json(&myinfo->linfos[i])); - } - return(jprint(array,1)); -} - -ZERO_ARGS(tradebot,allbalances) -{ - int32_t i,n; double value,pending; char *base; cJSON *item,*balances = cJSON_CreateObject(); - if ( myinfo->liquidity_currencies == 0 ) - myinfo->liquidity_currencies = cJSON_Parse("[\"KMD\", \"BTC\"]"); - if ( myinfo->liquidity_currencies != 0 && (n= cJSON_GetArraySize(myinfo->liquidity_currencies)) > 0 ) - { - for (i=0; iliquidity_currencies,i); - value = tradebot_balance(myinfo,base); - pending = tradebot_pending(myinfo,base); - item = cJSON_CreateObject(); - jaddnum(item,"value",value); - jaddnum(item,"pending",pending); - jadd(balances,base,item); - } - } - return(jprint(balances,1)); -} - -ZERO_ARGS(tradebot,anchor) -{ - FILE *fp; char *anchorstr,fname[512]; cJSON *anchor; int32_t retval = -1; - if ( (anchorstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (anchor= cJSON_Parse(anchorstr)) != 0 ) - { - if ( jobj(anchor,"error") == 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - if ( fwrite(anchorstr,1,strlen(anchorstr)+1,fp) == strlen(anchorstr)+1 ) - retval = 0; - fclose(fp); - } - } - } - free(anchorstr); - } - if ( retval == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"couldnt make anchor file\"}")); -} - -ZERO_ARGS(tradebot,portfolio) -{ - char *currentstr,*anchorstr,fname[512]; long fsize; cJSON *current,*anchor=0,*portfolio=0; - if ( (currentstr= tradebot_allbalances(myinfo,0,0,0)) != 0 ) - { - if ( (current= cJSON_Parse(currentstr)) != 0 ) - { - sprintf(fname,"%s/anchor",GLOBAL_DBDIR), OS_compatible_path(fname); - if ( (anchorstr= OS_filestr(&fsize,fname)) != 0 ) - { - anchor = cJSON_Parse(anchorstr); - free(anchorstr); - } - if ( anchor == 0 ) - anchor = cJSON_Parse("{}"); - portfolio = tradebot_balancesdiff(myinfo,current,anchor); - free_json(current); - } - free(currentstr); - } - if ( portfolio == 0 ) - return(clonestr("{\"result\":\"success\"}")); - else return(jprint(portfolio,1)); -} - -ARRAY_OBJ_INT(tradebot,goals,currencies,vals,targettime) -{ - static bits256 zero; char *targetcoin; int32_t i,n; - if ( currencies != 0 && vals != 0 ) - { - // init things so automatically updates refli.bid and refli.ask - // volume range with margin - // currency percentage value in BTC? target distribution, max percentage, min percentage` - // min price to sell, max price to buy, max volume - n = cJSON_GetArraySize(currencies); - for (i=0; i 0 ) + jaddnum(retjson,"RTheight",coin->RTheight); + } + return(jprint(retjson,1)); +} + +STRING_ARG(iguana,validate,activecoin) +{ + int32_t i,total,validated; struct iguana_bundle *bp; cJSON *retjson; + if ( (coin= iguana_coinfind(activecoin)) != 0 ) + { + for (i=total=validated=0; ibundlescount; i++) + if ( (bp= coin->bundles[i]) != 0 ) + { + validated += iguana_bundlevalidate(myinfo,coin,bp,1); + total += bp->n; + } + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","validation run"); + jaddstr(retjson,"coin",coin->symbol); + jaddnum(retjson,"validated",validated); + jaddnum(retjson,"total",total); + jaddnum(retjson,"bundles",coin->bundlescount); + jaddnum(retjson,"accuracy",(double)validated/total); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"no active coin\"}")); +} + +STRING_ARG(iguana,removecoin,activecoin) +{ + struct iguana_bundle *bp; int32_t i,height; char fname[1024]; + if ( (coin= iguana_coinfind(activecoin)) != 0 ) + { + coin->active = 0; + coin->started = 0; + if ( (0) ) + { + for (i=0; isymbol,i), OS_removefile(fname,0); + sprintf(fname,"%s/%s/%04d.vins",coin->VALIDATEDIR,coin->symbol,i), OS_removefile(fname,0); + } + sprintf(fname,"%s/%s/vouts/*",GLOBAL_DBDIR,coin->symbol), OS_removefile(fname,0); + sprintf(fname,"%s/%s/*",coin->VALIDATEDIR,coin->symbol), OS_removefile(fname,0); + for (i=0; ibundlescount; i++) + { + sprintf(fname,"%s/%s/balancecrc.%d",GLOBAL_DBDIR,coin->symbol,i), OS_removefile(fname,0); + if ( (bp= coin->bundles[i]) != 0 ) + { + iguana_bundlepurgefiles(coin,bp); + iguana_bundleremove(coin,bp->hdrsi,1); + } + } + for (height=0; heightlongestchain; height+=IGUANA_SUBDIRDIVISOR) + { + sprintf(fname,"%s/%s/%d",GLOBAL_DBDIR,coin->symbol,height/IGUANA_SUBDIRDIVISOR); + OS_remove_directory(fname); + } + sprintf(fname,"%s/%s/*",GLOBAL_DBDIR,coin->symbol), OS_remove_directory(fname); + } + return(clonestr("{\"result\":\"success\"}")); + } + return(clonestr("{\"error\":\"no active coin\"}")); +} + +INT_ARG(bitcoinrpc,getblockhash,height) +{ + cJSON *retjson; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getblockhash(myinfo,coin->symbol,height)); + retjson = cJSON_CreateObject(); + jaddbits256(retjson,"result",iguana_blockhash(coin,height)); + return(jprint(retjson,1)); +} + +HASH_AND_TWOINTS(bitcoinrpc,getblock,blockhash,verbose,remoteonly) +{ + char *blockstr,*datastr; struct iguana_msgblock msg; struct iguana_block *block; cJSON *retjson; bits256 txid; int32_t len; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getblock(myinfo,coin->symbol,blockhash)); + retjson = cJSON_CreateObject(); + memset(&msg,0,sizeof(msg)); + if ( remoteonly == 0 && (block= iguana_blockfind("getblockRPC",coin,blockhash)) != 0 ) + { + if ( verbose != 0 ) + return(jprint(iguana_blockjson(myinfo,coin,block,1),1)); + else + { + if ( (len= iguana_peerblockrequest(myinfo,coin,coin->blockspace,coin->blockspacesize,0,blockhash,0)) > 0 ) + { + datastr = malloc(len*2 + 1); + init_hexbytes_noT(datastr,coin->blockspace,len); + jaddstr(retjson,"result",datastr); + free(datastr); + return(jprint(retjson,1)); + } + jaddstr(retjson,"error","error getting rawblock"); + } + } + else if ( coin->APIblockstr != 0 ) + jaddstr(retjson,"error","already have pending request"); + else + { + memset(txid.bytes,0,sizeof(txid)); + if ( (blockstr= iguana_APIrequest(coin,blockhash,txid,5)) != 0 ) + { + jaddstr(retjson,"result",blockstr); + free(blockstr); + } else jaddstr(retjson,"error","cant find blockhash"); + } + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,getbestblockhash) +{ + cJSON *retjson; + if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) + return(_dex_getbestblockhash(myinfo,coin->symbol)); + retjson = cJSON_CreateObject(); + char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,getblockcount) +{ + cJSON *retjson = cJSON_CreateObject(); + //printf("result %d\n",coin->blocks.hwmchain.height); + jaddnum(retjson,"result",coin->blocks.hwmchain.height); + return(jprint(retjson,1)); +} + +STRING_AND_INT(iguana,bundleaddresses,activecoin,height) +{ + struct iguana_info *ptr; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + return(iguana_bundleaddrs(ptr,height / coin->chain->bundlesize)); + else return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_AND_INT(iguana,PoSweights,activecoin,height) +{ + struct iguana_info *ptr; int32_t num,nonz,errs,bundleheight; struct iguana_pkhash *refP; uint64_t *weights,supply; cJSON *retjson; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + { + //for (bundleheight=coin->chain->bundlesize; bundleheightchain->bundlesize) + { + bundleheight = (height / ptr->chain->bundlesize) * ptr->chain->bundlesize; + if ( (weights= iguana_PoS_weights(myinfo,ptr,&refP,&supply,&num,&nonz,&errs,bundleheight)) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result",errs == 0 ? "success" : "error"); + jaddnum(retjson,"bundleheight",bundleheight); + jaddnum(retjson,"numaddresses",num); + jaddnum(retjson,"nonzero",nonz); + jaddnum(retjson,"errors",errs); + jaddnum(retjson,"supply",dstr(supply)); + free(weights); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"iguana_PoS_weights returned null\"}")); + } + } + return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_ARG(iguana,stakers,activecoin) +{ + struct iguana_info *ptr; int32_t i,datalen,pkind,hdrsi; bits256 hash2; struct iguana_bundle *bp; cJSON *retjson,*array; struct iguana_pkhash *refP; struct iguana_ramchaindata *rdata; char coinaddr[64]; uint8_t refrmd160[20]; bits256 *sortbuf; + if ( (ptr= iguana_coinfind(activecoin)) != 0 && ptr->RTheight > ptr->chain->bundlesize ) + { + hdrsi = (ptr->RTheight / ptr->chain->bundlesize) - 1; + if ( (bp= ptr->bundles[hdrsi]) != 0 && bp->weights != 0 && (rdata= bp->ramchain.H.data) != 0 && bp->weights != 0 ) + { + sortbuf = calloc(bp->numweights,2 * sizeof(*sortbuf)); + for (i=datalen=0; inumweights; i++) + datalen += iguana_rwnum(1,&((uint8_t *)sortbuf)[datalen],sizeof(bp->weights[i]),(void *)&bp->weights[i]); + hash2 = bits256_doublesha256(0,(uint8_t *)sortbuf,datalen); + refP = RAMCHAIN_PTR(rdata,Poffset); + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + memset(refrmd160,0,sizeof(refrmd160)); + for (i=0; ichain->bundlesize; i++) + { + if ( (pkind= iguana_staker_sort(ptr,&hash2,refrmd160,refP,bp->weights,bp->numweights,sortbuf)) > 0 ) + { + bitcoin_address(coinaddr,ptr->chain->pubtype,refP[pkind].rmd160,sizeof(refP[pkind].rmd160)); + jaddistr(array,coinaddr); + } else jaddistr(array,"error"); + } + jaddstr(retjson,"result","success"); + jadd(retjson,"stakers",array); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"iguana_stakers needs PoSweights and weights\"}")); + } + return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +STRING_AND_INT(iguana,bundlehashes,activecoin,height) +{ + struct iguana_info *ptr; struct iguana_bundle *bp; int32_t i,hdrsi; cJSON *retjson,*array; struct iguana_ramchaindata *rdata; + if ( (ptr= iguana_coinfind(activecoin)) != 0 ) + { + hdrsi = height / coin->chain->bundlesize; + if ( hdrsi < coin->bundlescount && hdrsi >= 0 && (bp= coin->bundles[hdrsi]) != 0 ) + { + if ( (rdata= bp->ramchain.H.data) != 0 ) + { + array = cJSON_CreateArray(); + for (i=0; ilhashes[i].txid); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + jaddbits256(retjson,"sha256",rdata->sha256); + jadd(retjson,"bundlehashes",array); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"ramchain not there\"}")); + } else return(clonestr("{\"error\":\"height is too big\"}")); + } else return(clonestr("{\"error\":\"activecoin is not active\"}")); +} + +// low priority RPC + +HASH_AND_TWOINTS(bitcoinrpc,listsinceblock,blockhash,target,flag) +{ + /*"transactions" : [ + { + "account" : "doc test", + "address" : "mmXgiR6KAhZCyQ8ndr2BCfEq1wNG2UnyG6", + "category" : "receive", + "amount" : 0.10000000, + "vout" : 0, + "confirmations" : 76478, + "blockhash" : "000000000017c84015f254498c62a7c884a51ccd75d4dd6dbdcb6434aa3bd44d", + "blockindex" : 1, + "blocktime" : 1399294967, + "txid" : "85a98fdf1529f7d5156483ad020a51b7f3340e47448cf932f470b72ff01a6821", + "walletconflicts" : [ + ], + "time" : 1399294967, + "timereceived" : 1418924714 + },*/ + cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"error","low priority RPC not implemented"); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,gettxoutsetinfo) +{ + cJSON *retjson = cJSON_CreateObject(); + jaddstr(retjson,"error","low priority RPC not implemented"); + return(jprint(retjson,1)); +} + +ZERO_ARGS(bitcoinrpc,listaddressgroupings) +{ + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + return(clonestr("{\"error\":\"low priority RPC not implemented\"}")); +} + +SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment) +{ + cJSON *retjson; + if ( remoteaddr != 0 ) + return(clonestr("{\"error\":\"no remote\"}")); + if ( myinfo->expiration == 0 ) + return(clonestr("{\"error\":\"need to unlock wallet\"}")); + retjson = cJSON_CreateObject(); + return(jprint(retjson,1)); +} + +ZERO_ARGS(pax,start) +{ + void PAX_init(); + PAX_init(); + return(clonestr("{\"result\":\"PAX_init called\"}")); +} + STRING_AND_TWOINTS(mouse,change,name,x,y) { printf("mouse (%s) x.%d y.%d\n",name,x,y); diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 7f4878d62..9c5c4cd2b 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -13,316 +13,4 @@ * * ******************************************************************************/ -#include "iguana777.h" -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_ARG(iguana,initfastfind,activecoin) -{ - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - iguana_fastfindcreate(coin); - return(clonestr("{\"result\":\"fast find initialized\"}")); - } else return(clonestr("{\"error\":\"no coin to initialize\"}")); -} - -TWO_STRINGS_AND_TWO_DOUBLES(iguana,balance,activecoin,address,lastheightd,minconfd) -{ - int32_t lastheight,minconf,maxconf=1<<30; cJSON *array,*retjson = cJSON_CreateObject(); - if ( activecoin != 0 && activecoin[0] != 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 ) - { - if ( (minconf= minconfd) <= 0 ) - minconf = 1; - lastheight = lastheightd; - jaddstr(retjson,"address",address); - if ( bitcoin_validaddress(coin,address) < 0 ) - { - jaddstr(retjson,"error","illegal address"); - return(jprint(retjson,1)); - } - jadd64bits(retjson,"RTbalance",iguana_RTbalance(coin,address)); - array = cJSON_CreateArray(); - jaddistr(array,address); - jadd(retjson,"unspents",iguana_RTlistunspent(myinfo,coin,array,minconf,maxconf,remoteaddr,1)); - free_json(array); - if ( lastheight > 0 ) - jaddnum(retjson,"RTheight",coin->RTheight); - } - return(jprint(retjson,1)); -} - -STRING_ARG(iguana,validate,activecoin) -{ - int32_t i,total,validated; struct iguana_bundle *bp; cJSON *retjson; - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - for (i=total=validated=0; ibundlescount; i++) - if ( (bp= coin->bundles[i]) != 0 ) - { - validated += iguana_bundlevalidate(myinfo,coin,bp,1); - total += bp->n; - } - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","validation run"); - jaddstr(retjson,"coin",coin->symbol); - jaddnum(retjson,"validated",validated); - jaddnum(retjson,"total",total); - jaddnum(retjson,"bundles",coin->bundlescount); - jaddnum(retjson,"accuracy",(double)validated/total); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"no active coin\"}")); -} - -STRING_ARG(iguana,removecoin,activecoin) -{ - struct iguana_bundle *bp; int32_t i,height; char fname[1024]; - if ( (coin= iguana_coinfind(activecoin)) != 0 ) - { - coin->active = 0; - coin->started = 0; - if ( (0) ) - { - for (i=0; isymbol,i), OS_removefile(fname,0); - sprintf(fname,"%s/%s/%04d.vins",coin->VALIDATEDIR,coin->symbol,i), OS_removefile(fname,0); - } - sprintf(fname,"%s/%s/vouts/*",GLOBAL_DBDIR,coin->symbol), OS_removefile(fname,0); - sprintf(fname,"%s/%s/*",coin->VALIDATEDIR,coin->symbol), OS_removefile(fname,0); - for (i=0; ibundlescount; i++) - { - sprintf(fname,"%s/%s/balancecrc.%d",GLOBAL_DBDIR,coin->symbol,i), OS_removefile(fname,0); - if ( (bp= coin->bundles[i]) != 0 ) - { - iguana_bundlepurgefiles(coin,bp); - iguana_bundleremove(coin,bp->hdrsi,1); - } - } - for (height=0; heightlongestchain; height+=IGUANA_SUBDIRDIVISOR) - { - sprintf(fname,"%s/%s/%d",GLOBAL_DBDIR,coin->symbol,height/IGUANA_SUBDIRDIVISOR); - OS_remove_directory(fname); - } - sprintf(fname,"%s/%s/*",GLOBAL_DBDIR,coin->symbol), OS_remove_directory(fname); - } - return(clonestr("{\"result\":\"success\"}")); - } - return(clonestr("{\"error\":\"no active coin\"}")); -} - -INT_ARG(bitcoinrpc,getblockhash,height) -{ - cJSON *retjson; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getblockhash(myinfo,coin->symbol,height)); - retjson = cJSON_CreateObject(); - jaddbits256(retjson,"result",iguana_blockhash(coin,height)); - return(jprint(retjson,1)); -} - -HASH_AND_TWOINTS(bitcoinrpc,getblock,blockhash,verbose,remoteonly) -{ - char *blockstr,*datastr; struct iguana_msgblock msg; struct iguana_block *block; cJSON *retjson; bits256 txid; int32_t len; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getblock(myinfo,coin->symbol,blockhash)); - retjson = cJSON_CreateObject(); - memset(&msg,0,sizeof(msg)); - if ( remoteonly == 0 && (block= iguana_blockfind("getblockRPC",coin,blockhash)) != 0 ) - { - if ( verbose != 0 ) - return(jprint(iguana_blockjson(myinfo,coin,block,1),1)); - else - { - if ( (len= iguana_peerblockrequest(myinfo,coin,coin->blockspace,coin->blockspacesize,0,blockhash,0)) > 0 ) - { - datastr = malloc(len*2 + 1); - init_hexbytes_noT(datastr,coin->blockspace,len); - jaddstr(retjson,"result",datastr); - free(datastr); - return(jprint(retjson,1)); - } - jaddstr(retjson,"error","error getting rawblock"); - } - } - else if ( coin->APIblockstr != 0 ) - jaddstr(retjson,"error","already have pending request"); - else - { - memset(txid.bytes,0,sizeof(txid)); - if ( (blockstr= iguana_APIrequest(coin,blockhash,txid,5)) != 0 ) - { - jaddstr(retjson,"result",blockstr); - free(blockstr); - } else jaddstr(retjson,"error","cant find blockhash"); - } - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,getbestblockhash) -{ - cJSON *retjson; - if ( coin->notarychain >= 0 && coin->FULLNODE == 0 ) - return(_dex_getbestblockhash(myinfo,coin->symbol)); - retjson = cJSON_CreateObject(); - char str[65]; jaddstr(retjson,"result",bits256_str(str,coin->blocks.hwmchain.RO.hash2)); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,getblockcount) -{ - cJSON *retjson = cJSON_CreateObject(); - //printf("result %d\n",coin->blocks.hwmchain.height); - jaddnum(retjson,"result",coin->blocks.hwmchain.height); - return(jprint(retjson,1)); -} - -STRING_AND_INT(iguana,bundleaddresses,activecoin,height) -{ - struct iguana_info *ptr; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - return(iguana_bundleaddrs(ptr,height / coin->chain->bundlesize)); - else return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_AND_INT(iguana,PoSweights,activecoin,height) -{ - struct iguana_info *ptr; int32_t num,nonz,errs,bundleheight; struct iguana_pkhash *refP; uint64_t *weights,supply; cJSON *retjson; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - { - //for (bundleheight=coin->chain->bundlesize; bundleheightchain->bundlesize) - { - bundleheight = (height / ptr->chain->bundlesize) * ptr->chain->bundlesize; - if ( (weights= iguana_PoS_weights(myinfo,ptr,&refP,&supply,&num,&nonz,&errs,bundleheight)) != 0 ) - { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result",errs == 0 ? "success" : "error"); - jaddnum(retjson,"bundleheight",bundleheight); - jaddnum(retjson,"numaddresses",num); - jaddnum(retjson,"nonzero",nonz); - jaddnum(retjson,"errors",errs); - jaddnum(retjson,"supply",dstr(supply)); - free(weights); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"iguana_PoS_weights returned null\"}")); - } - } - return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_ARG(iguana,stakers,activecoin) -{ - struct iguana_info *ptr; int32_t i,datalen,pkind,hdrsi; bits256 hash2; struct iguana_bundle *bp; cJSON *retjson,*array; struct iguana_pkhash *refP; struct iguana_ramchaindata *rdata; char coinaddr[64]; uint8_t refrmd160[20]; bits256 *sortbuf; - if ( (ptr= iguana_coinfind(activecoin)) != 0 && ptr->RTheight > ptr->chain->bundlesize ) - { - hdrsi = (ptr->RTheight / ptr->chain->bundlesize) - 1; - if ( (bp= ptr->bundles[hdrsi]) != 0 && bp->weights != 0 && (rdata= bp->ramchain.H.data) != 0 && bp->weights != 0 ) - { - sortbuf = calloc(bp->numweights,2 * sizeof(*sortbuf)); - for (i=datalen=0; inumweights; i++) - datalen += iguana_rwnum(1,&((uint8_t *)sortbuf)[datalen],sizeof(bp->weights[i]),(void *)&bp->weights[i]); - hash2 = bits256_doublesha256(0,(uint8_t *)sortbuf,datalen); - refP = RAMCHAIN_PTR(rdata,Poffset); - retjson = cJSON_CreateObject(); - array = cJSON_CreateArray(); - memset(refrmd160,0,sizeof(refrmd160)); - for (i=0; ichain->bundlesize; i++) - { - if ( (pkind= iguana_staker_sort(ptr,&hash2,refrmd160,refP,bp->weights,bp->numweights,sortbuf)) > 0 ) - { - bitcoin_address(coinaddr,ptr->chain->pubtype,refP[pkind].rmd160,sizeof(refP[pkind].rmd160)); - jaddistr(array,coinaddr); - } else jaddistr(array,"error"); - } - jaddstr(retjson,"result","success"); - jadd(retjson,"stakers",array); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"iguana_stakers needs PoSweights and weights\"}")); - } - return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -STRING_AND_INT(iguana,bundlehashes,activecoin,height) -{ - struct iguana_info *ptr; struct iguana_bundle *bp; int32_t i,hdrsi; cJSON *retjson,*array; struct iguana_ramchaindata *rdata; - if ( (ptr= iguana_coinfind(activecoin)) != 0 ) - { - hdrsi = height / coin->chain->bundlesize; - if ( hdrsi < coin->bundlescount && hdrsi >= 0 && (bp= coin->bundles[hdrsi]) != 0 ) - { - if ( (rdata= bp->ramchain.H.data) != 0 ) - { - array = cJSON_CreateArray(); - for (i=0; ilhashes[i].txid); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); - jaddbits256(retjson,"sha256",rdata->sha256); - jadd(retjson,"bundlehashes",array); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"ramchain not there\"}")); - } else return(clonestr("{\"error\":\"height is too big\"}")); - } else return(clonestr("{\"error\":\"activecoin is not active\"}")); -} - -// low priority RPC - -HASH_AND_TWOINTS(bitcoinrpc,listsinceblock,blockhash,target,flag) -{ - /*"transactions" : [ - { - "account" : "doc test", - "address" : "mmXgiR6KAhZCyQ8ndr2BCfEq1wNG2UnyG6", - "category" : "receive", - "amount" : 0.10000000, - "vout" : 0, - "confirmations" : 76478, - "blockhash" : "000000000017c84015f254498c62a7c884a51ccd75d4dd6dbdcb6434aa3bd44d", - "blockindex" : 1, - "blocktime" : 1399294967, - "txid" : "85a98fdf1529f7d5156483ad020a51b7f3340e47448cf932f470b72ff01a6821", - "walletconflicts" : [ - ], - "time" : 1399294967, - "timereceived" : 1418924714 - },*/ - cJSON *retjson = cJSON_CreateObject(); - jaddstr(retjson,"error","low priority RPC not implemented"); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,gettxoutsetinfo) -{ - cJSON *retjson = cJSON_CreateObject(); - jaddstr(retjson,"error","low priority RPC not implemented"); - return(jprint(retjson,1)); -} - -ZERO_ARGS(bitcoinrpc,listaddressgroupings) -{ - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - return(clonestr("{\"error\":\"low priority RPC not implemented\"}")); -} - -SS_D_I_S(bitcoinrpc,move,fromaccount,toaccount,amount,minconf,comment) -{ - cJSON *retjson; - if ( remoteaddr != 0 ) - return(clonestr("{\"error\":\"no remote\"}")); - if ( myinfo->expiration == 0 ) - return(clonestr("{\"error\":\"need to unlock wallet\"}")); - retjson = cJSON_CreateObject(); - return(jprint(retjson,1)); -} - -ZERO_ARGS(pax,start) -{ - void PAX_init(); - PAX_init(); - return(clonestr("{\"result\":\"PAX_init called\"}")); -} -#undef IGUANA_ARGS -#include "../includes/iguana_apiundefs.h" - +// deprecated From ea46b40241665241a0d182aafa2674a027ad1717 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:04:01 +0200 Subject: [PATCH 214/286] Rework include files --- iguana/iguana_json.c | 7 ++++++- includes/iguana_apideclares.h | 8 ++++++++ includes/iguana_apiundefs.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index e7febc655..38c6c5b98 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -191,7 +191,10 @@ cJSON *SuperNET_helpjson() #include "../includes/iguana_apideclares.h" +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" + if ( array != 0 ) jadd(json,"API",array); jadd(json,"agents",agents); @@ -907,6 +910,7 @@ TWO_STRINGS(SuperNET,html,agentform,htmlfile) } #undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) @@ -1025,8 +1029,9 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define STRING_ARRAY_OBJ_STRING IGUANA_DISPATCH_SAOS #include "../includes/iguana_apideclares.h" -//#undef IGUANA_ARGS +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char errstr[512]; sprintf(errstr,"{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}",agentstr,method); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index dc8f26e42..955acffe0 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -13,6 +13,12 @@ * * ******************************************************************************/ +#ifdef _IGUANA_APIDEC_H_ +emit compiler error if recursively being included +#endif +#ifndef _IGUANA_APIDEC_H_ +#define _IGUANA_APIDEC_H_ + STRING_ARG(dpow,pending,fiat); ZERO_ARGS(dpow,notarychains); STRING_ARG(dpow,active,maskhex); @@ -358,3 +364,5 @@ TWO_STRINGS(hmac,md4,message,passphrase); TWO_STRINGS(hmac,md5,message,passphrase); TWO_STRINGS(hmac,tiger192_3,message,passphrase); TWO_STRINGS(hmac,whirlpool,message,passphrase); + +#endif diff --git a/includes/iguana_apiundefs.h b/includes/iguana_apiundefs.h index 0b793ee2d..88156175d 100755 --- a/includes/iguana_apiundefs.h +++ b/includes/iguana_apiundefs.h @@ -49,3 +49,5 @@ #undef IGUANA_ARGS #undef IGUANA_CALLARGS +#undef _IGUANA_APIDEC_H_ + From bab313d965819eca508f57c2a5bf8503a28aee00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:16:01 +0200 Subject: [PATCH 215/286] Bigger split fund fees --- basilisk/basilisk_bitcoin.c | 2 +- iguana/dpow/dpow_fsm.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 3e5aae41b..a5450ea7a 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -585,7 +585,7 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - txfee = 10 * (coin->txfee + duplicates*coin->txfee/5); + txfee = 10 * (coin->txfee + duplicates*coin->txfee*2); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 4d563f9f1..18afb868b 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -126,8 +126,8 @@ int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_info *dp,struct int32_t haveutxo,completed,minutxo,n; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; if ( strcmp("BTC",coin->symbol) == 0 ) { - minutxo = 499; - n = 50; + minutxo = 199; + n = 10; } else { From d4e014ac261c521f80cd1e242f38d583cfcaf219 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:35:28 +0200 Subject: [PATCH 216/286] Test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 2feabf1cd..7d74315cf 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -395,7 +395,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha struct kmd_addresshh *addr; struct kmd_transactionhh *ptr=0,*spent,*prev=0; uint8_t type_rmd160[21]; int32_t i; char *retstr; cJSON *retjson; if ( array == 0 ) array = cJSON_CreateArray(); - printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); + //printf("%s listaddress.(%s)\n",coin->symbol,coinaddr); if ( (retstr= bitcoinrpc_validateaddress(myinfo,coin,0,0,coinaddr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) @@ -478,7 +478,7 @@ cJSON *kmd_listaddress(struct supernet_info *myinfo,struct iguana_info *coin,cha } ptr = prev; } - } else printf("no valid entry for (%s) %p %p\n",coinaddr,addr,ptr); + } //else printf("no valid entry for (%s) %p %p\n",coinaddr,addr,ptr); return(array); } From 856d63239857bb209e52447afbb597cd91c12430 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 10:54:20 +0200 Subject: [PATCH 217/286] Test --- basilisk/basilisk_bitcoin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index a5450ea7a..b779027bb 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -585,7 +585,7 @@ char *iguana_utxoduplicates(struct supernet_info *myinfo,struct iguana_info *coi if ( signedtxidp != 0 ) memset(signedtxidp,0,sizeof(*signedtxidp)); bitcoin_address(changeaddr,coin->chain->pubtype,myinfo->persistent_pubkey33,33); - txfee = 10 * (coin->txfee + duplicates*coin->txfee*2); + txfee = (coin->txfee + duplicates*coin->txfee*2); if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) From e3b2ebc844702c7fbfc4225bd56866e449605738 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 11:06:37 +0200 Subject: [PATCH 218/286] Test --- basilisk/jumblr.c | 2 +- iguana/kmd_lookup.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 36364026c..67b8c2306 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -407,7 +407,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch free(retstr); } // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" - } else printf("btcavail %.8f pending %.8f\n",btcavail,pending); + } //else printf("btcavail %.8f pending %.8f\n",btcavail,pending); } else printf("null kmdprice %.8f\n",kmdprice); } diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 7d74315cf..f3abf52d2 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -641,7 +641,7 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) while ( loadheight < height-lag ) { flag = 0; - //if ( (loadheight % 10000) == 0 ) + if ( (loadheight % 10000) == 0 ) printf("loading %s ht.%d vs height.%d - lag.%d kmdheight.%d\n",coin->symbol,loadheight,height,lag,coin->kmd_height);//,jprint(kmd_getbalance(coin,"*"),1)); if ( (blockjson= kmd_blockjson(&h,coin->symbol,coin->chain->serverport,coin->chain->userpass,0,loadheight)) != 0 ) { From 16527340d9d468e4cc5168076067decc00a9327f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 11:29:38 +0200 Subject: [PATCH 219/286] boost utxo to .0005 --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 278e7a2d8..b773104c8 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -23,7 +23,7 @@ //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) #define DPOW_VERSION 0x0781 -#define DPOW_UTXOSIZE 30000 +#define DPOW_UTXOSIZE 50000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 #define DPOW_RATIFYDURATION (3600 * 24) From d3a0e0dc2b2df6228d2a3ddbd4defe5b170401a7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:03:45 +0200 Subject: [PATCH 220/286] Test --- basilisk/basilisk.h | 5 +- basilisk/basilisk_swap.c | 136 ++++++++++++++++++++++++----------- basilisk/basilisk_tradebot.c | 4 +- 3 files changed, 98 insertions(+), 47 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index a7bb6be4d..c25f11236 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -46,7 +46,7 @@ struct basilisk_swap; struct basilisk_rawtxinfo { - char destaddr[64]; + char destaddr[64],coinstr[16]; bits256 txid,signedtxid,actualtxid; uint64_t amount,change,inputsum; int32_t redeemlen,datalen,completed,vintype,vouttype,numconfirms,spendlen,secretstart,suppress_pubkeys; @@ -60,8 +60,9 @@ struct basilisk_rawtx struct iguana_msgtx msgtx; struct basilisk_rawtxinfo I; struct iguana_info *coin; + char vinstr[4096]; cJSON *vins; - uint8_t *txbytes,spendscript[512],redeemscript[1024],extraspace[1024]; + uint8_t txbytes[8192],spendscript[512],redeemscript[1024],extraspace[1024]; }; struct basilisk_swapinfo diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 18e41e56f..0bf525368 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -382,8 +382,9 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ if ( signedtx != 0 || (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&dest->I.signedtxid,&dest->I.completed,vins,rawtxbytes,privkeys,V)) != 0 ) { dest->I.datalen = (int32_t)strlen(signedtx) >> 1; - dest->txbytes = calloc(1,dest->I.datalen); - decode_hex(dest->txbytes,dest->I.datalen,signedtx); + if ( dest->I.datalen <= sizeof(dest->txbytes) ) + decode_hex(dest->txbytes,dest->I.datalen,signedtx); + else printf("DEX tx is too big %d vs %d\n",dest->I.datalen,(int32_t)sizeof(dest->txbytes)); if ( signedtx != rawtxbytes ) free(signedtx); if ( dest->I.completed != 0 ) @@ -477,7 +478,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct } } rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; - rawtx->txbytes = calloc(1,rawtx->I.datalen); + //rawtx->txbytes = calloc(1,rawtx->I.datalen); decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); free(signedtx); @@ -490,7 +491,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { - char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; + char *retstr,*jsonstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); if ( rawtx->coin->changeaddr[0] == 0 ) { @@ -531,7 +532,10 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps { if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) { - rawtx->vins = jobj(jitem(retarray,i),"vins"); + rawtx->vins = jduplicate(jobj(jitem(retarray,i),"vins")); + jsonstr = jprint(rawtx->vins,0); + safecopy(rawtx->vinstr,jsonstr,sizeof(rawtx->vinstr)); + free(jsonstr); break; } } @@ -539,7 +543,10 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps else { retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); - rawtx->vins = jobj(retarray,"vins"); + rawtx->vins = jduplicate(jobj(retarray,"vins")); + jsonstr = jprint(rawtx->vins,0); + safecopy(rawtx->vinstr,jsonstr,sizeof(rawtx->vinstr)); + free(jsonstr); } free(retarray); } else printf("error parsing.(%s)\n",retstr); @@ -552,7 +559,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { - if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) + if ( rawtx->I.datalen != 0 && rawtx->I.datalen <= maxlen ) { memcpy(data,rawtx->txbytes,rawtx->I.datalen); return(rawtx); @@ -564,8 +571,9 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t { struct basilisk_swap *swap = ptr; // add verification and broadcast - swap->otherfee.txbytes = calloc(1,datalen); + //swap->otherfee.txbytes = calloc(1,datalen); memcpy(swap->otherfee.txbytes,data,datalen); + swap->otherfee.I.datalen = datalen; swap->otherfee.I.actualtxid = swap->otherfee.I.signedtxid = bits256_doublesha256(0,data,datalen); basilisk_txlog(myinfo,swap,&swap->otherfee,-1); return(0); @@ -583,9 +591,9 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str if ( rawtx->I.redeemlen > 0 && rawtx->I.redeemlen < 0x100 ) memcpy(rawtx->redeemscript,&data[datalen],rawtx->I.redeemlen); //printf("recvlen.%d datalen.%d redeemlen.%d\n",recvlen,datalen,rawtx->redeemlen); - if ( rawtx->txbytes == 0 ) + if ( rawtx->I.datalen == 0 ) { - rawtx->txbytes = calloc(1,datalen); + //rawtx->txbytes = calloc(1,datalen); memcpy(rawtx->txbytes,data,datalen); rawtx->I.datalen = datalen; } @@ -891,14 +899,14 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa //for (i=0; ibobpayment.redeemlen; i++) // printf("%02x",swap->bobpayment.redeemscript[i]); //printf(" <- bobpayment.%d\n",i); - if ( genflag != 0 && bits256_nonz(*(bits256 *)swap->I.secretBn256) != 0 && swap->bobpayment.txbytes == 0 ) + if ( genflag != 0 && bits256_nonz(*(bits256 *)swap->I.secretBn256) != 0 && swap->bobpayment.I.datalen == 0 ) { for (i=0; i<3; i++) { //if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 ) // break; basilisk_rawtx_gen("payment",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); - if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) + if ( swap->bobpayment.I.spendlen == 0 || swap->bobpayment.I.datalen == 0 ) { printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); sleep(DEX_SLEEP); @@ -924,14 +932,14 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa else { swap->bobdeposit.I.spendlen = basilisk_bobscript(swap->bobdeposit.I.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.I.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.I.locktime,&swap->bobdeposit.I.secretstart,&swap->I,1); - if ( genflag != 0 && (swap->bobdeposit.txbytes == 0 || swap->bobrefund.txbytes == 0) ) + if ( genflag != 0 && (swap->bobdeposit.I.datalen == 0 || swap->bobrefund.I.datalen == 0) ) { for (i=0; i<3; i++) { //if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 ) // break; basilisk_rawtx_gen("deposit",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); - if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) + if ( swap->bobdeposit.I.datalen == 0 || swap->bobdeposit.I.spendlen == 0 ) { printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); sleep(DEX_SLEEP); @@ -1220,7 +1228,7 @@ int32_t basilisk_privBn_extract(struct supernet_info *myinfo,struct basilisk_swa } if ( basilisk_swapget(myinfo,swap,0x40000000,data,maxlen,basilisk_verify_privi) == 0 ) { - if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.txbytes == 0 ) + if ( bits256_nonz(swap->I.privBn) != 0 && swap->alicereclaim.I.datalen == 0 ) { char str[65]; printf("have privBn.%s\n",bits256_str(str,swap->I.privBn)); return(basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim)); @@ -1235,7 +1243,7 @@ int32_t basilisk_privAm_extract(struct supernet_info *myinfo,struct basilisk_swa { } - if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.txbytes == 0 ) + if ( bits256_nonz(swap->I.privAm) != 0 && swap->bobspend.I.datalen == 0 ) { char str[65]; printf("have privAm.%s\n",bits256_str(str,swap->I.privAm)); return(basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend)); @@ -1312,6 +1320,7 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * { strcpy(rawtx->name,name); rawtx->coin = coin; + strcpy(rawtx->I.coinstr,coin->symbol); rawtx->I.numconfirms = numconfirms; if ( (rawtx->I.amount= satoshis) < 10000 ) rawtx->I.amount = 10000; @@ -1367,6 +1376,48 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu return(0); } +void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap *swap) +{ + FILE *fp; char fname[512]; + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(&swap->I,1,sizeof(swap->I),fp); + fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); + fwrite(&swap->bobpayment,1,sizeof(swap->bobpayment),fp); + fwrite(&swap->alicepayment,1,sizeof(swap->alicepayment),fp); + fwrite(&swap->myfee,1,sizeof(swap->myfee),fp); + fwrite(&swap->otherfee,1,sizeof(swap->otherfee),fp); + fwrite(&swap->aliceclaim,1,sizeof(swap->aliceclaim),fp); + fwrite(&swap->alicespend,1,sizeof(swap->alicespend),fp); + fwrite(&swap->bobreclaim,1,sizeof(swap->bobreclaim),fp); + fwrite(&swap->bobspend,1,sizeof(swap->bobspend),fp); + fwrite(&swap->bobrefund,1,sizeof(swap->bobrefund),fp); + fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp); + fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); + fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fwrite(swap->deck,1,sizeof(swap->deck),fp); + fclose(fp); + } +} + +int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoinstr,char *alicecoinstr) +{ + if ( fread(rawtx,1,sizeof(*rawtx),fp) == sizeof(*rawtx) ) + { + rawtx->coin = 0; + rawtx->vins = 0; + if ( strcmp(rawtx->I.coinstr,bobcoinstr) == 0 || strcmp(rawtx->I.coinstr,alicecoinstr) == 0 ) + { + rawtx->coin = iguana_coinfind(rawtx->I.coinstr); + if ( rawtx->vinstr[0] != 0 ) + rawtx->vins = cJSON_Parse(rawtx->vinstr); + return(0); + } + } + return(-1); +} + struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) { FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; @@ -1376,6 +1427,17 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); + basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); fread(swap->privkeys,1,sizeof(swap->privkeys),fp); fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fread(swap->deck,1,sizeof(swap->deck),fp); @@ -1474,8 +1536,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv void basilisk_rawtx_purge(struct basilisk_rawtx *rawtx) { - if ( rawtx->txbytes != 0 ) - free(rawtx->txbytes), rawtx->txbytes = 0; + if ( rawtx->vins != 0 ) + free_json(rawtx->vins); + //if ( rawtx->txbytes != 0 ) + // free(rawtx->txbytes), rawtx->txbytes = 0; } void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *swap) @@ -1488,11 +1552,12 @@ void basilisk_swap_finished(struct supernet_info *myinfo,struct basilisk_swap *s basilisk_rawtx_purge(&swap->alicepayment); basilisk_rawtx_purge(&swap->myfee); basilisk_rawtx_purge(&swap->otherfee); - basilisk_rawtx_purge(&swap->alicereclaim); + basilisk_rawtx_purge(&swap->aliceclaim); basilisk_rawtx_purge(&swap->alicespend); basilisk_rawtx_purge(&swap->bobreclaim); basilisk_rawtx_purge(&swap->bobspend); basilisk_rawtx_purge(&swap->bobrefund); + basilisk_rawtx_purge(&swap->alicereclaim); for (i=0; inummessages; i++) if ( swap->messages[i].data != 0 ) free(swap->messages[i].data), swap->messages[i].data = 0; @@ -2087,7 +2152,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; char fname[512]; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; FILE *fp; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2112,8 +2177,6 @@ void basilisk_swaploop(void *_swap) break; } sleep(DEX_SLEEP); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } if ( swap->connected == 0 ) { @@ -2134,8 +2197,6 @@ void basilisk_swaploop(void *_swap) break; } sleep(DEX_SLEEP + (swap->I.iambob == 0)*1); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } myinfo->DEXactive = swap->I.expiration; if ( time(NULL) >= expiration ) @@ -2144,27 +2205,17 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); - fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fwrite(swap->deck,1,sizeof(swap->deck),fp); - fclose(fp); - } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); //printf("sendstate.%x\n",swap->I.statebits); basilisk_sendstate(myinfo,swap,data,maxlen); //printf("swapget\n"); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); //printf("after swapget\n"); - if ( swap->myfee.txbytes == 0 ) + if ( swap->myfee.I.datalen == 0 ) { /*for (i=0; i<20; i++) printf("%02x",swap->secretAm[i]); @@ -2214,7 +2265,7 @@ void basilisk_swaploop(void *_swap) //if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen != 0 ) // break; basilisk_alicepayment(myinfo,swap,swap->alicepayment.coin,&swap->alicepayment,swap->I.pubAm,swap->I.pubBn); - if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.I.spendlen == 0 ) + if ( swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.I.spendlen); sleep(DEX_SLEEP); @@ -2242,7 +2293,7 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen > 0 ) + if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) break; } else @@ -2252,6 +2303,7 @@ void basilisk_swaploop(void *_swap) } } } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); @@ -2259,11 +2311,10 @@ void basilisk_swaploop(void *_swap) basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) break; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); } + basilisk_swap_saveupdate(myinfo,swap); printf("end of atomic swap\n"); - if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) + if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { sleep(300); // wait for confirm of msig printf("BOB reclaims refund\n"); @@ -2279,6 +2330,7 @@ void basilisk_swaploop(void *_swap) data[datalen++] = swap->I.privBn.bytes[j]; basilisk_swapsend(myinfo,swap,0x40000000,data,datalen,0x40000000,swap->I.crcs_mypriv); } + basilisk_swap_saveupdate(myinfo,swap); } if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { @@ -2334,8 +2386,6 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) { m = n = 0; - //dpow_nanomsg_update(myinfo); - //dex_updateclient(myinfo); sleep(DEX_SLEEP); printf("waiting for offer to be accepted\n"); channel = 'D' + ((uint32_t)'E' << 8) + ((uint32_t)'X' << 16); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 8b66ee5a8..5d16548dc 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -69,12 +69,12 @@ int32_t basilisk_txitem(struct supernet_info *myinfo,struct basilisk_swap *swap, decode_hex((void *)&rawtx->I,sizeof(rawtx->I),hexstr); if ( (hexstr= jstr(obj,"txbytes")) != 0 && strlen(hexstr) == rawtx->I.datalen*2 ) { - if ( rawtx->txbytes == 0 ) + /*if ( rawtx->txbytes == 0 ) { printf("free (%s) txbytes\n",name); free(rawtx->txbytes); } - rawtx->txbytes = calloc(1,rawtx->I.datalen); + rawtx->txbytes = calloc(1,rawtx->I.datalen);*/ decode_hex((void *)rawtx->txbytes,rawtx->I.datalen,hexstr); } printf("PROCESS.(%s)\n",jprint(obj,0)); From ec925bbd42caf2902d2494c3f7a72cf0b5bba973 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:11:45 +0200 Subject: [PATCH 221/286] Test --- iguana/dpow/dpow_network.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0bd18acf1..cadc11faa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -256,7 +256,7 @@ void dpow_psockloop(void *_ptr) ptr->lasttime = now; if ( (sentbytes= nn_send(ptr->pubsock,buf,size,0)) > 0 ) { - printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); + //printf("PSOCKS[%d] of %d (%u %u) -> %d/%d bytes\n",i,myinfo->numpsocks,ptr->pushport,ptr->subport,size,sentbytes); nonz++; } } From 2b44cc203e916d3ba6adaae2b14395d922bc8903 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:41:52 +0200 Subject: [PATCH 222/286] Test --- basilisk/basilisk_swap.c | 39 ++++++++++++++++++++++++--------------- iguana/iguana_json.c | 4 +++- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0bf525368..2ea0f4055 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1412,6 +1412,7 @@ int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoin rawtx->coin = iguana_coinfind(rawtx->I.coinstr); if ( rawtx->vinstr[0] != 0 ) rawtx->vins = cJSON_Parse(rawtx->vinstr); + printf("loaded.%s\n",rawtx->name); return(0); } } @@ -1427,20 +1428,27 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); - basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - fread(swap->privkeys,1,sizeof(swap->privkeys),fp); - fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fread(swap->deck,1,sizeof(swap->deck),fp); + if ( swap->bobcoin == 0 ) + swap->bobcoin = iguana_coinfind(swap->I.req.dest); + if ( swap->alicecoin == 0 ) + swap->alicecoin = iguana_coinfind(swap->I.req.src); + if ( swap->alicecoin != 0 && swap->bobcoin == 0 ) + { + basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->otherfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->aliceclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicespend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); + } else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin); fclose(fp); } } @@ -1723,7 +1731,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis } } return(nextbits); - } else printf("error from basilisk_swapdata_rawtx %p len.%d\n",rawtx->txbytes,rawtx->I.datalen); + } else printf("error from basilisk_swapdata_rawtx.%s %p len.%d\n",rawtx->name,rawtx->txbytes,rawtx->I.datalen); return(0); } @@ -2183,6 +2191,7 @@ void basilisk_swaploop(void *_swap) printf("couldnt establish connection\n"); retval = -1; } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { if ( swap->connected == 0 ) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 38c6c5b98..3918fb599 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -86,6 +86,7 @@ cJSON *SuperNET_helpjson() cJSON *array=0,*json,*agents; json = cJSON_CreateObject(); agents = cJSON_CreateArray(); +#ifndef WIN32 #define IGUANA_ARGS json,array,agents #define IGUANA_HELP0(agent,name) array = helpjson(IGUANA_ARGS,#agent,#name,0) #define IGUANA_HELP_S(agent,name,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#str,"string"))) @@ -194,7 +195,8 @@ cJSON *SuperNET_helpjson() #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" - +#endif + if ( array != 0 ) jadd(json,"API",array); jadd(json,"agents",agents); From 4e554026b6f121ac1c76dbeb1bd76b654316a40b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 13:46:36 +0200 Subject: [PATCH 223/286] Test --- iguana/iguana_json.c | 417 --------------------------------------- iguana/ramchain_api.c | 420 ++++++++++++++++++++++++++++++++++++++++ includes/iguana_funcs.h | 2 + 3 files changed, 422 insertions(+), 417 deletions(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 3918fb599..8002aa331 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -498,423 +498,6 @@ char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr) return(OS_filestr(&filesize,"index7778.html")); } -cJSON *iguana_peerjson(struct iguana_info *coin,struct iguana_peer *addr) -{ - cJSON *array,*json = cJSON_CreateObject(); - jaddstr(json,"ipaddr",addr->ipaddr); - if ( addr->supernet != 0 ) - jaddstr(json,"ipaddr",addr->ipaddr); - jaddstr(json,"supernet","yes"); - jaddnum(json,"protover",addr->protover); - jaddnum(json,"relay",addr->relayflag); - jaddnum(json,"height",addr->height); - jaddnum(json,"rank",addr->rank); - jaddnum(json,"usock",addr->usock); - if ( addr->dead != 0 ) - jaddnum(json,"dead",addr->dead); - jaddnum(json,"ready",addr->ready); - jaddnum(json,"recvblocks",addr->recvblocks); - jaddnum(json,"recvtotal",addr->recvtotal); - jaddnum(json,"lastcontact",addr->lastcontact); - if ( addr->numpings > 0 ) - jaddnum(json,"aveping",addr->pingsum/addr->numpings); - array = cJSON_CreateObject(); - jaddnum(array,"version",addr->msgcounts.version); - jaddnum(array,"verack",addr->msgcounts.verack); - jaddnum(array,"getaddr",addr->msgcounts.getaddr); - jaddnum(array,"addr",addr->msgcounts.addr); - jaddnum(array,"inv",addr->msgcounts.inv); - jaddnum(array,"getdata",addr->msgcounts.getdata); - jaddnum(array,"notfound",addr->msgcounts.notfound); - jaddnum(array,"getblocks",addr->msgcounts.getblocks); - jaddnum(array,"getheaders",addr->msgcounts.getheaders); - jaddnum(array,"headers",addr->msgcounts.headers); - jaddnum(array,"tx",addr->msgcounts.tx); - jaddnum(array,"block",addr->msgcounts.block); - jaddnum(array,"mempool",addr->msgcounts.mempool); - jaddnum(array,"ping",addr->msgcounts.ping); - jaddnum(array,"pong",addr->msgcounts.pong); - jaddnum(array,"reject",addr->msgcounts.reject); - jaddnum(array,"filterload",addr->msgcounts.filterload); - jaddnum(array,"filteradd",addr->msgcounts.filteradd); - jaddnum(array,"filterclear",addr->msgcounts.filterclear); - jaddnum(array,"merkleblock",addr->msgcounts.merkleblock); - jaddnum(array,"alert",addr->msgcounts.alert); - jadd(json,"msgcounts",array); - return(json); -} - -cJSON *iguana_peersjson(struct iguana_info *coin,int32_t addronly) -{ - cJSON *retjson,*array; int32_t i; struct iguana_peer *addr; - if ( coin == 0 || coin->peers == 0 ) - return(0); - array = cJSON_CreateArray(); - for (i=0; iMAXPEERS; i++) - { - addr = &coin->peers->active[i]; - if ( addr->usock >= 0 && addr->ipbits != 0 && addr->ipaddr[0] != 0 ) - { - if ( addronly != 0 ) - jaddistr(array,addr->ipaddr); - else jaddi(array,iguana_peerjson(coin,addr)); - } - } - if ( addronly == 0 ) - { - retjson = cJSON_CreateObject(); - jadd(retjson,"peers",array); - jaddnum(retjson,"maxpeers",coin->MAXPEERS); - jaddstr(retjson,"coin",coin->symbol); - return(retjson); - } - else return(array); -} - -#include "../includes/iguana_apidefs.h" -#include "../includes/iguana_apideclares.h" - -STRING_ARG(iguana,peers,activecoin) -{ - if ( coin != 0 ) - return(jprint(iguana_peersjson(coin,0),1)); - else return(clonestr("{\"error\":\"peers needs coin\"}")); -} - -STRING_ARG(iguana,getconnectioncount,activecoin) -{ - int32_t i,num = 0; char buf[512]; - if ( coin != 0 && coin->peers != 0 ) - { - for (i=0; ipeers->active)/sizeof(*coin->peers->active); i++) - if ( coin->peers->active[i].usock >= 0 ) - num++; - sprintf(buf,"{\"result\":\"%d\"}",num); - return(clonestr(buf)); - } else return(clonestr("{\"error\":\"getconnectioncount needs coin\"}")); -} - -ZERO_ARGS(bitcoinrpc,getdifficulty) -{ - char buf[512]; - if ( coin != 0 ) - { - sprintf(buf,"{\"result\":\"success\",\"proof-of-work\":\"%.8f\",\"search-interval\": 0}",PoW_from_compact(coin->blocks.hwmchain.RO.bits,coin->chain->unitval)); - return(clonestr(buf)); - } else return(clonestr("{\"error\":\"getdifficulty needs coin\"}")); -} - -STRING_ARG(iguana,addcoin,newcoin) -{ - char *symbol,*seedip; int32_t retval; - if ( (symbol= newcoin) == 0 && coin != 0 ) - symbol = coin->symbol; - if ( symbol != 0 ) - { - if ( (seedip= jstr(json,"seedipaddr")) != 0 ) - safecopy(myinfo->seedipaddr,seedip,sizeof(myinfo->seedipaddr)); - printf(">> addcoin.%s seedipaddr.%s\n",symbol,myinfo->seedipaddr); -#ifdef __PNACL__ -// if ( strcmp(symbol,"BTC") == 0 ) -// return(clonestr("{\"result\":\"BTC for chrome app is not yet\"}")); -#endif - if ( (retval= iguana_launchcoin(myinfo,symbol,json,0)) > 0 ) - { - if ( myinfo->rpcsymbol[0] == 0 ) - safecopy(myinfo->rpcsymbol,symbol,sizeof(myinfo->rpcsymbol)); - return(clonestr("{\"result\":\"coin added\"}")); - } - else if ( retval == 0 ) - return(clonestr("{\"result\":\"coin already there\"}")); - else return(clonestr("{\"error\":\"error adding coin\"}")); - } else return(clonestr("{\"error\":\"addcoin needs newcoin\"}")); -} - -STRING_ARG(iguana,startcoin,activecoin) -{ - if ( coin != 0 ) - { - coin->active = 1; - return(clonestr("{\"result\":\"coin started\"}")); - } else return(clonestr("{\"error\":\"startcoin needs coin\"}")); -} - -STRING_ARG(iguana,stopcoin,activecoin) -{ - if ( activecoin[0] != 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 ) - { - coin->active = 0; - //iguana_coinpurge(coin); - return(clonestr("{\"result\":\"coin stopped\"}")); - } else return(clonestr("{\"error\":\"stopcoin needs coin\"}")); -} - -STRING_ARG(iguana,pausecoin,activecoin) -{ - if ( coin != 0 ) - { - coin->active = 0; - return(clonestr("{\"result\":\"coin paused\"}")); - } else return(clonestr("{\"error\":\"pausecoin needs coin\"}")); -} - -TWO_STRINGS(iguana,addnode,activecoin,ipaddr) -{ - struct iguana_peer *addr; int32_t i,n; - if ( coin == 0 ) - coin = iguana_coinfind(activecoin); - if ( coin != 0 && strcmp(coin->symbol,"RELAY") == 0 ) - basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(ipaddr),GENESIS_PUBKEY); - printf("coin.%p.[%s] addnode.%s -> %s\n",coin,coin!=0?coin->symbol:"",activecoin,ipaddr); - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 && is_ipaddr(ipaddr) != 0 ) - { - //iguana_possible_peer(coin,ipaddr); - if ( (addr= iguana_peerslot(coin,(uint32_t)calc_ipbits(ipaddr),1)) != 0 ) - { - addr->supernet = 1; - if ( addr->usock >= 0 ) - { - if ( (n= coin->peers->numranked) != 0 ) - { - for (i=0; ipeers->ranked[i] ) - break; - } - if ( i == n ) - { - if ( i == IGUANA_MAXPEERS ) - i--; - else coin->peers->numranked = n+1; - coin->peers->ranked[i] = addr; - addr->recvblocks = coin->peers->ranked[0]->recvblocks + 100; - addr->recvtotal = coin->peers->ranked[0]->recvtotal*1.1 + 100; - printf("set (%s) -> slot.%d numranked.%d\n",ipaddr,i,coin->peers->numranked); - } else printf("(%s) is already peer.%d\n",ipaddr,i); - } - return(clonestr("{\"result\":\"peer was already connected\"}")); - } - if ( addr->pending == 0 ) - { - addr->pending = (uint32_t)time(NULL); - iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); - return(clonestr("{\"result\":\"addnode submitted\"}")); - } else return(clonestr("{\"result\":\"addnode connection was already pending\"}")); - } else return(clonestr("{\"result\":\"addnode cant find peer slot\"}")); - } - else if ( coin == 0 ) - return(clonestr("{\"error\":\"addnode needs active coin, do an addcoin first\"}")); - else return(clonestr("{\"error\":\"addnode needs ipaddr\"}")); -} - -TWO_STRINGS(iguana,persistent,activecoin,ipaddr) -{ - int32_t i; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) - { - coin->peers->active[i].persistent_peer = juint(json,"interval")+3; - return(clonestr("{\"result\":\"node marked as persistent\"}")); - } - } - return(clonestr("{\"result\":\"node wasnt active\"}")); - } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,removenode,activecoin,ipaddr) -{ - int32_t i; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) - { - coin->peers->active[i].rank = 0; - coin->peers->active[i].dead = (uint32_t)time(NULL); - return(clonestr("{\"result\":\"node marked as dead\"}")); - } - } - return(clonestr("{\"result\":\"node wasnt active\"}")); - } else return(clonestr("{\"error\":\"removenode needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,oneshot,activecoin,ipaddr) -{ - if ( coin != 0 && ipaddr != 0 ) - { - iguana_possible_peer(coin,ipaddr); - return(clonestr("{\"result\":\"addnode submitted\"}")); - } else return(clonestr("{\"error\":\"addnode needs coin and ipaddr\"}")); -} - -TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr) -{ - int32_t i; struct iguana_peer *addr; - if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) - { - for (i=0; iMAXPEERS; i++) - { - addr = &coin->peers->active[i]; - if ( strcmp(addr->ipaddr,ipaddr) == 0 ) - return(jprint(iguana_peerjson(coin,addr),1)); - } - return(clonestr("{\"result\":\"nodestatus couldnt find ipaddr\"}")); - } else return(clonestr("{\"error\":\"nodestatus needs ipaddr\"}")); -} - -STRING_AND_INT(iguana,maxpeers,activecoin,max) -{ - cJSON *retjson; int32_t i; struct iguana_peer *addr; - if ( coin != 0 && coin->peers != 0 ) - { - retjson = cJSON_CreateObject(); - if ( max > IGUANA_MAXPEERS ) - max = IGUANA_MAXPEERS; - if ( max > coin->MAXPEERS ) - { - for (i=max; iMAXPEERS; i++) - if ( (addr= coin->peers->ranked[i]) != 0 ) - addr->dead = 1; - } - coin->MAXPEERS = max; - jaddnum(retjson,"maxpeers",coin->MAXPEERS); - jaddstr(retjson,"coin",coin->symbol); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"maxpeers needs coin\"}")); -} - -char *hmac_dispatch(char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message),char *name,char *message,char *password) -{ - char hexstr[1025]; cJSON *json; - if ( message != 0 && password != 0 && message[0] != 0 && password[0] != 0 ) - { - memset(hexstr,0,sizeof(hexstr)); - (*hmacfunc)(hexstr,password,password==0?0:(int32_t)strlen(password),message); - json = cJSON_CreateObject(); - jaddstr(json,"result","hmac calculated"); - jaddstr(json,"message",message); - jaddstr(json,name,hexstr); - return(jprint(json,1)); - } else return(clonestr("{\"error\":\"hmac needs message and passphrase\"}")); -} - -char *hash_dispatch(void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len),char *name,char *message) -{ - char hexstr[65537]; uint8_t databuf[32768]; cJSON *json; - if ( message != 0 && message[0] != 0 ) - { - memset(hexstr,0,sizeof(hexstr)); - (*hashfunc)(hexstr,databuf,(uint8_t *)message,(int32_t)strlen(message)); - json = cJSON_CreateObject(); - jaddstr(json,"result","hash calculated"); - jaddstr(json,"message",message); - jaddstr(json,name,hexstr); - return(jprint(json,1)); - } else return(clonestr("{\"error\":\"hash needs message\"}")); -} - -TWO_HASHES(hash,curve25519_pair,element,scalar) -{ - cJSON *retjson = cJSON_CreateObject(); - jaddbits256(retjson,"result",curve25519(element,scalar)); - return(jprint(retjson,1)); -} - -STRING_ARG(hash,NXT,passphrase) { return(hash_dispatch(calc_NXTaddr,"NXT",passphrase)); } -STRING_ARG(hash,curve25519,pubkey) { return(hash_dispatch(calc_curve25519_str,"curve25519",pubkey)); } -STRING_ARG(hash,crc32,message) { return(hash_dispatch(calc_crc32str,"crc32",message)); } -STRING_ARG(hash,base64_encode,message) { return(hash_dispatch(calc_base64_encodestr,"base64_encode",message)); } -STRING_ARG(hash,base64_decode,message) { return(hash_dispatch(calc_base64_decodestr,"base64_decode",message)); } -STRING_ARG(hash,rmd160_sha256,message) { return(hash_dispatch(rmd160ofsha256,"rmd160_sha256",message)); } -STRING_ARG(hash,sha256_sha256,message) { return(hash_dispatch(sha256_sha256,"sha256_sha256",message)); } -STRING_ARG(hash,hex,message) { return(hash_dispatch(calc_hexstr,"hex",message)); } -STRING_ARG(hash,unhex,message) { return(hash_dispatch(calc_unhexstr,"unhex",message)); } - -STRING_ARG(hash,sha224,message) { return(hash_dispatch(calc_sha224,"sha224",message)); } -STRING_ARG(hash,sha256,message) { return(hash_dispatch(vcalc_sha256,"sha256",message)); } -STRING_ARG(hash,sha384,message) { return(hash_dispatch(calc_sha384,"sha384",message)); } -STRING_ARG(hash,sha512,message) { return(hash_dispatch(calc_sha512,"sha512",message)); } -STRING_ARG(hash,rmd128,message) { return(hash_dispatch(calc_rmd128,"rmd128",message)); } -STRING_ARG(hash,rmd160,message) { return(hash_dispatch(calc_rmd160,"rmd160",message)); } -STRING_ARG(hash,rmd256,message) { return(hash_dispatch(calc_rmd256,"rmd256",message)); } -STRING_ARG(hash,rmd320,message) { return(hash_dispatch(calc_rmd320,"rmd320",message)); } -STRING_ARG(hash,sha1,message) { return(hash_dispatch(calc_sha1,"sha1",message)); } -STRING_ARG(hash,md2,message) { return(hash_dispatch(calc_md2str,"md2",message)); } -STRING_ARG(hash,md4,message) { return(hash_dispatch(calc_md4str,"md4",message)); } -STRING_ARG(hash,md5,message) { return(hash_dispatch(calc_md5str,"md5",message)); } -STRING_ARG(hash,tiger192_3,message) { return(hash_dispatch(calc_tiger,"tiger",message)); } -STRING_ARG(hash,whirlpool,message) { return(hash_dispatch(calc_whirlpool,"whirlpool",message)); } -TWO_STRINGS(hmac,sha224,message,passphrase) { return(hmac_dispatch(hmac_sha224_str,"sha224",message,passphrase)); } -TWO_STRINGS(hmac,sha256,message,passphrase) { return(hmac_dispatch(hmac_sha256_str,"sha256",message,passphrase)); } -TWO_STRINGS(hmac,sha384,message,passphrase) { return(hmac_dispatch(hmac_sha384_str,"sha384",message,passphrase)); } -TWO_STRINGS(hmac,sha512,message,passphrase) { return(hmac_dispatch(hmac_sha512_str,"sha512",message,passphrase)); } -TWO_STRINGS(hmac,rmd128,message,passphrase) { return(hmac_dispatch(hmac_rmd128_str,"rmd128",message,passphrase)); } -TWO_STRINGS(hmac,rmd160,message,passphrase) { return(hmac_dispatch(hmac_rmd160_str,"rmd160",message,passphrase)); } -TWO_STRINGS(hmac,rmd256,message,passphrase) { return(hmac_dispatch(hmac_rmd256_str,"rmd256",message,passphrase)); } -TWO_STRINGS(hmac,rmd320,message,passphrase) { return(hmac_dispatch(hmac_rmd320_str,"rmd320",message,passphrase)); } -TWO_STRINGS(hmac,sha1,message,passphrase) { return(hmac_dispatch(hmac_sha1_str,"sha1",message,passphrase)); } -TWO_STRINGS(hmac,md2,message,passphrase) { return(hmac_dispatch(hmac_md2_str,"md2",message,passphrase)); } -TWO_STRINGS(hmac,md4,message,passphrase) { return(hmac_dispatch(hmac_md4_str,"md4",message,passphrase)); } -TWO_STRINGS(hmac,md5,message,passphrase) { return(hmac_dispatch(hmac_md5_str,"md5",message,passphrase)); } -TWO_STRINGS(hmac,tiger192_3,message,passphrase) { return(hmac_dispatch(hmac_tiger_str,"tiger",message,passphrase)); } -TWO_STRINGS(hmac,whirlpool,message,passphrase) { return(hmac_dispatch(hmac_whirlpool_str,"whirlpool",message,passphrase)); } - -STRING_ARG(SuperNET,bitcoinrpc,setcoin) -{ - char buf[1024]; - if ( setcoin != 0 && setcoin[0] != 0 ) - { - strcpy(myinfo->rpcsymbol,setcoin); - touppercase(myinfo->rpcsymbol); - printf("bitcoinrpc.%s\n",myinfo->rpcsymbol); - if ( iguana_launchcoin(myinfo,myinfo->rpcsymbol,json,0) < 0 ) - return(clonestr("{\"error\":\"error creating coin\"}")); - else - { - sprintf(buf,"{\"result\":\"success\",\"setcoin\":\"%s\"}",setcoin); - return(clonestr(buf)); - } - } else return(clonestr("{\"error\":\"bitcoinrpc needs setcoin value\"}")); -} - -ZERO_ARGS(SuperNET,help) -{ - cJSON *helpjson,*retjson; - if ( (helpjson= SuperNET_helpjson()) != 0 ) - { - retjson = cJSON_CreateObject(); - jadd(retjson,"result",helpjson); - return(jprint(retjson,1)); - } else return(clonestr("{\"error\":\"cant get helpjson\"}")); -} - -TWO_STRINGS(SuperNET,html,agentform,htmlfile) -{ - char *htmlstr; cJSON *retjson; int32_t max = 4*1024*1024; - if ( htmlfile == 0 || htmlfile[0] == 0 ) - htmlfile = "forms.html"; - //if ( (fp= fopen(htmlfile,"w")) == 0 ) - // printf("error opening htmlfile.(%s)\n",htmlfile); - htmlstr = malloc(max); - htmlstr = SuperNET_htmlstr(htmlfile,htmlstr,max,agentform); - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result",htmlstr); - free(htmlstr); - //if ( fp != 0 ) - // fclose(fp); - return(jprint(retjson,1)); -} - -#undef IGUANA_ARGS -#undef _IGUANA_APIDEC_H_ -#include "../includes/iguana_apiundefs.h" - char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) { char *coinstr; struct iguana_info *coin = 0; diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 9c5c4cd2b..267f17ffd 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -14,3 +14,423 @@ ******************************************************************************/ // deprecated +#include "iguana777.h" + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + + +STRING_ARG(iguana,peers,activecoin) +{ + if ( coin != 0 ) + return(jprint(iguana_peersjson(coin,0),1)); + else return(clonestr("{\"error\":\"peers needs coin\"}")); +} + +STRING_ARG(iguana,getconnectioncount,activecoin) +{ + int32_t i,num = 0; char buf[512]; + if ( coin != 0 && coin->peers != 0 ) + { + for (i=0; ipeers->active)/sizeof(*coin->peers->active); i++) + if ( coin->peers->active[i].usock >= 0 ) + num++; + sprintf(buf,"{\"result\":\"%d\"}",num); + return(clonestr(buf)); + } else return(clonestr("{\"error\":\"getconnectioncount needs coin\"}")); +} + +ZERO_ARGS(bitcoinrpc,getdifficulty) +{ + char buf[512]; + if ( coin != 0 ) + { + sprintf(buf,"{\"result\":\"success\",\"proof-of-work\":\"%.8f\",\"search-interval\": 0}",PoW_from_compact(coin->blocks.hwmchain.RO.bits,coin->chain->unitval)); + return(clonestr(buf)); + } else return(clonestr("{\"error\":\"getdifficulty needs coin\"}")); +} + +STRING_ARG(iguana,addcoin,newcoin) +{ + char *symbol,*seedip; int32_t retval; + if ( (symbol= newcoin) == 0 && coin != 0 ) + symbol = coin->symbol; + if ( symbol != 0 ) + { + if ( (seedip= jstr(json,"seedipaddr")) != 0 ) + safecopy(myinfo->seedipaddr,seedip,sizeof(myinfo->seedipaddr)); + printf(">> addcoin.%s seedipaddr.%s\n",symbol,myinfo->seedipaddr); +#ifdef __PNACL__ + // if ( strcmp(symbol,"BTC") == 0 ) + // return(clonestr("{\"result\":\"BTC for chrome app is not yet\"}")); +#endif + if ( (retval= iguana_launchcoin(myinfo,symbol,json,0)) > 0 ) + { + if ( myinfo->rpcsymbol[0] == 0 ) + safecopy(myinfo->rpcsymbol,symbol,sizeof(myinfo->rpcsymbol)); + return(clonestr("{\"result\":\"coin added\"}")); + } + else if ( retval == 0 ) + return(clonestr("{\"result\":\"coin already there\"}")); + else return(clonestr("{\"error\":\"error adding coin\"}")); + } else return(clonestr("{\"error\":\"addcoin needs newcoin\"}")); +} + +STRING_ARG(iguana,startcoin,activecoin) +{ + if ( coin != 0 ) + { + coin->active = 1; + return(clonestr("{\"result\":\"coin started\"}")); + } else return(clonestr("{\"error\":\"startcoin needs coin\"}")); +} + +STRING_ARG(iguana,stopcoin,activecoin) +{ + if ( activecoin[0] != 0 ) + coin = iguana_coinfind(activecoin); + if ( coin != 0 ) + { + coin->active = 0; + //iguana_coinpurge(coin); + return(clonestr("{\"result\":\"coin stopped\"}")); + } else return(clonestr("{\"error\":\"stopcoin needs coin\"}")); +} + +STRING_ARG(iguana,pausecoin,activecoin) +{ + if ( coin != 0 ) + { + coin->active = 0; + return(clonestr("{\"result\":\"coin paused\"}")); + } else return(clonestr("{\"error\":\"pausecoin needs coin\"}")); +} + +TWO_STRINGS(iguana,addnode,activecoin,ipaddr) +{ + struct iguana_peer *addr; int32_t i,n; + if ( coin == 0 ) + coin = iguana_coinfind(activecoin); + if ( coin != 0 && strcmp(coin->symbol,"RELAY") == 0 ) + basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(ipaddr),GENESIS_PUBKEY); + printf("coin.%p.[%s] addnode.%s -> %s\n",coin,coin!=0?coin->symbol:"",activecoin,ipaddr); + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 && is_ipaddr(ipaddr) != 0 ) + { + //iguana_possible_peer(coin,ipaddr); + if ( (addr= iguana_peerslot(coin,(uint32_t)calc_ipbits(ipaddr),1)) != 0 ) + { + addr->supernet = 1; + if ( addr->usock >= 0 ) + { + if ( (n= coin->peers->numranked) != 0 ) + { + for (i=0; ipeers->ranked[i] ) + break; + } + if ( i == n ) + { + if ( i == IGUANA_MAXPEERS ) + i--; + else coin->peers->numranked = n+1; + coin->peers->ranked[i] = addr; + addr->recvblocks = coin->peers->ranked[0]->recvblocks + 100; + addr->recvtotal = coin->peers->ranked[0]->recvtotal*1.1 + 100; + printf("set (%s) -> slot.%d numranked.%d\n",ipaddr,i,coin->peers->numranked); + } else printf("(%s) is already peer.%d\n",ipaddr,i); + } + return(clonestr("{\"result\":\"peer was already connected\"}")); + } + if ( addr->pending == 0 ) + { + addr->pending = (uint32_t)time(NULL); + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); + return(clonestr("{\"result\":\"addnode submitted\"}")); + } else return(clonestr("{\"result\":\"addnode connection was already pending\"}")); + } else return(clonestr("{\"result\":\"addnode cant find peer slot\"}")); + } + else if ( coin == 0 ) + return(clonestr("{\"error\":\"addnode needs active coin, do an addcoin first\"}")); + else return(clonestr("{\"error\":\"addnode needs ipaddr\"}")); +} + +TWO_STRINGS(iguana,persistent,activecoin,ipaddr) +{ + int32_t i; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) + { + coin->peers->active[i].persistent_peer = juint(json,"interval")+3; + return(clonestr("{\"result\":\"node marked as persistent\"}")); + } + } + return(clonestr("{\"result\":\"node wasnt active\"}")); + } else return(clonestr("{\"error\":\"persistent needs coin and ipaddr\"}")); +} + +TWO_STRINGS(iguana,removenode,activecoin,ipaddr) +{ + int32_t i; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; ipeers->active[i].ipaddr,ipaddr) == 0 ) + { + coin->peers->active[i].rank = 0; + coin->peers->active[i].dead = (uint32_t)time(NULL); + return(clonestr("{\"result\":\"node marked as dead\"}")); + } + } + return(clonestr("{\"result\":\"node wasnt active\"}")); + } else return(clonestr("{\"error\":\"removenode needs coin and ipaddr\"}")); +} + +TWO_STRINGS(iguana,oneshot,activecoin,ipaddr) +{ + if ( coin != 0 && ipaddr != 0 ) + { + iguana_possible_peer(coin,ipaddr); + return(clonestr("{\"result\":\"addnode submitted\"}")); + } else return(clonestr("{\"error\":\"addnode needs coin and ipaddr\"}")); +} + +cJSON *iguana_peerjson(struct iguana_info *coin,struct iguana_peer *addr) +{ + cJSON *array,*json = cJSON_CreateObject(); + jaddstr(json,"ipaddr",addr->ipaddr); + if ( addr->supernet != 0 ) + jaddstr(json,"ipaddr",addr->ipaddr); + jaddstr(json,"supernet","yes"); + jaddnum(json,"protover",addr->protover); + jaddnum(json,"relay",addr->relayflag); + jaddnum(json,"height",addr->height); + jaddnum(json,"rank",addr->rank); + jaddnum(json,"usock",addr->usock); + if ( addr->dead != 0 ) + jaddnum(json,"dead",addr->dead); + jaddnum(json,"ready",addr->ready); + jaddnum(json,"recvblocks",addr->recvblocks); + jaddnum(json,"recvtotal",addr->recvtotal); + jaddnum(json,"lastcontact",addr->lastcontact); + if ( addr->numpings > 0 ) + jaddnum(json,"aveping",addr->pingsum/addr->numpings); + array = cJSON_CreateObject(); + jaddnum(array,"version",addr->msgcounts.version); + jaddnum(array,"verack",addr->msgcounts.verack); + jaddnum(array,"getaddr",addr->msgcounts.getaddr); + jaddnum(array,"addr",addr->msgcounts.addr); + jaddnum(array,"inv",addr->msgcounts.inv); + jaddnum(array,"getdata",addr->msgcounts.getdata); + jaddnum(array,"notfound",addr->msgcounts.notfound); + jaddnum(array,"getblocks",addr->msgcounts.getblocks); + jaddnum(array,"getheaders",addr->msgcounts.getheaders); + jaddnum(array,"headers",addr->msgcounts.headers); + jaddnum(array,"tx",addr->msgcounts.tx); + jaddnum(array,"block",addr->msgcounts.block); + jaddnum(array,"mempool",addr->msgcounts.mempool); + jaddnum(array,"ping",addr->msgcounts.ping); + jaddnum(array,"pong",addr->msgcounts.pong); + jaddnum(array,"reject",addr->msgcounts.reject); + jaddnum(array,"filterload",addr->msgcounts.filterload); + jaddnum(array,"filteradd",addr->msgcounts.filteradd); + jaddnum(array,"filterclear",addr->msgcounts.filterclear); + jaddnum(array,"merkleblock",addr->msgcounts.merkleblock); + jaddnum(array,"alert",addr->msgcounts.alert); + jadd(json,"msgcounts",array); + return(json); +} + +cJSON *iguana_peersjson(struct iguana_info *coin,int32_t addronly) +{ + cJSON *retjson,*array; int32_t i; struct iguana_peer *addr; + if ( coin == 0 || coin->peers == 0 ) + return(0); + array = cJSON_CreateArray(); + for (i=0; iMAXPEERS; i++) + { + addr = &coin->peers->active[i]; + if ( addr->usock >= 0 && addr->ipbits != 0 && addr->ipaddr[0] != 0 ) + { + if ( addronly != 0 ) + jaddistr(array,addr->ipaddr); + else jaddi(array,iguana_peerjson(coin,addr)); + } + } + if ( addronly == 0 ) + { + retjson = cJSON_CreateObject(); + jadd(retjson,"peers",array); + jaddnum(retjson,"maxpeers",coin->MAXPEERS); + jaddstr(retjson,"coin",coin->symbol); + return(retjson); + } + else return(array); +} + +TWO_STRINGS(iguana,nodestatus,activecoin,ipaddr) +{ + int32_t i; struct iguana_peer *addr; + if ( coin != 0 && coin->peers != 0 && ipaddr != 0 ) + { + for (i=0; iMAXPEERS; i++) + { + addr = &coin->peers->active[i]; + if ( strcmp(addr->ipaddr,ipaddr) == 0 ) + return(jprint(iguana_peerjson(coin,addr),1)); + } + return(clonestr("{\"result\":\"nodestatus couldnt find ipaddr\"}")); + } else return(clonestr("{\"error\":\"nodestatus needs ipaddr\"}")); +} + +STRING_AND_INT(iguana,maxpeers,activecoin,max) +{ + cJSON *retjson; int32_t i; struct iguana_peer *addr; + if ( coin != 0 && coin->peers != 0 ) + { + retjson = cJSON_CreateObject(); + if ( max > IGUANA_MAXPEERS ) + max = IGUANA_MAXPEERS; + if ( max > coin->MAXPEERS ) + { + for (i=max; iMAXPEERS; i++) + if ( (addr= coin->peers->ranked[i]) != 0 ) + addr->dead = 1; + } + coin->MAXPEERS = max; + jaddnum(retjson,"maxpeers",coin->MAXPEERS); + jaddstr(retjson,"coin",coin->symbol); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"maxpeers needs coin\"}")); +} + +char *hmac_dispatch(char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message),char *name,char *message,char *password) +{ + char hexstr[1025]; cJSON *json; + if ( message != 0 && password != 0 && message[0] != 0 && password[0] != 0 ) + { + memset(hexstr,0,sizeof(hexstr)); + (*hmacfunc)(hexstr,password,password==0?0:(int32_t)strlen(password),message); + json = cJSON_CreateObject(); + jaddstr(json,"result","hmac calculated"); + jaddstr(json,"message",message); + jaddstr(json,name,hexstr); + return(jprint(json,1)); + } else return(clonestr("{\"error\":\"hmac needs message and passphrase\"}")); +} + +char *hash_dispatch(void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len),char *name,char *message) +{ + char hexstr[65537]; uint8_t databuf[32768]; cJSON *json; + if ( message != 0 && message[0] != 0 ) + { + memset(hexstr,0,sizeof(hexstr)); + (*hashfunc)(hexstr,databuf,(uint8_t *)message,(int32_t)strlen(message)); + json = cJSON_CreateObject(); + jaddstr(json,"result","hash calculated"); + jaddstr(json,"message",message); + jaddstr(json,name,hexstr); + return(jprint(json,1)); + } else return(clonestr("{\"error\":\"hash needs message\"}")); +} + +TWO_HASHES(hash,curve25519_pair,element,scalar) +{ + cJSON *retjson = cJSON_CreateObject(); + jaddbits256(retjson,"result",curve25519(element,scalar)); + return(jprint(retjson,1)); +} + +STRING_ARG(hash,NXT,passphrase) { return(hash_dispatch(calc_NXTaddr,"NXT",passphrase)); } +STRING_ARG(hash,curve25519,pubkey) { return(hash_dispatch(calc_curve25519_str,"curve25519",pubkey)); } +STRING_ARG(hash,crc32,message) { return(hash_dispatch(calc_crc32str,"crc32",message)); } +STRING_ARG(hash,base64_encode,message) { return(hash_dispatch(calc_base64_encodestr,"base64_encode",message)); } +STRING_ARG(hash,base64_decode,message) { return(hash_dispatch(calc_base64_decodestr,"base64_decode",message)); } +STRING_ARG(hash,rmd160_sha256,message) { return(hash_dispatch(rmd160ofsha256,"rmd160_sha256",message)); } +STRING_ARG(hash,sha256_sha256,message) { return(hash_dispatch(sha256_sha256,"sha256_sha256",message)); } +STRING_ARG(hash,hex,message) { return(hash_dispatch(calc_hexstr,"hex",message)); } +STRING_ARG(hash,unhex,message) { return(hash_dispatch(calc_unhexstr,"unhex",message)); } + +STRING_ARG(hash,sha224,message) { return(hash_dispatch(calc_sha224,"sha224",message)); } +STRING_ARG(hash,sha256,message) { return(hash_dispatch(vcalc_sha256,"sha256",message)); } +STRING_ARG(hash,sha384,message) { return(hash_dispatch(calc_sha384,"sha384",message)); } +STRING_ARG(hash,sha512,message) { return(hash_dispatch(calc_sha512,"sha512",message)); } +STRING_ARG(hash,rmd128,message) { return(hash_dispatch(calc_rmd128,"rmd128",message)); } +STRING_ARG(hash,rmd160,message) { return(hash_dispatch(calc_rmd160,"rmd160",message)); } +STRING_ARG(hash,rmd256,message) { return(hash_dispatch(calc_rmd256,"rmd256",message)); } +STRING_ARG(hash,rmd320,message) { return(hash_dispatch(calc_rmd320,"rmd320",message)); } +STRING_ARG(hash,sha1,message) { return(hash_dispatch(calc_sha1,"sha1",message)); } +STRING_ARG(hash,md2,message) { return(hash_dispatch(calc_md2str,"md2",message)); } +STRING_ARG(hash,md4,message) { return(hash_dispatch(calc_md4str,"md4",message)); } +STRING_ARG(hash,md5,message) { return(hash_dispatch(calc_md5str,"md5",message)); } +STRING_ARG(hash,tiger192_3,message) { return(hash_dispatch(calc_tiger,"tiger",message)); } +STRING_ARG(hash,whirlpool,message) { return(hash_dispatch(calc_whirlpool,"whirlpool",message)); } +TWO_STRINGS(hmac,sha224,message,passphrase) { return(hmac_dispatch(hmac_sha224_str,"sha224",message,passphrase)); } +TWO_STRINGS(hmac,sha256,message,passphrase) { return(hmac_dispatch(hmac_sha256_str,"sha256",message,passphrase)); } +TWO_STRINGS(hmac,sha384,message,passphrase) { return(hmac_dispatch(hmac_sha384_str,"sha384",message,passphrase)); } +TWO_STRINGS(hmac,sha512,message,passphrase) { return(hmac_dispatch(hmac_sha512_str,"sha512",message,passphrase)); } +TWO_STRINGS(hmac,rmd128,message,passphrase) { return(hmac_dispatch(hmac_rmd128_str,"rmd128",message,passphrase)); } +TWO_STRINGS(hmac,rmd160,message,passphrase) { return(hmac_dispatch(hmac_rmd160_str,"rmd160",message,passphrase)); } +TWO_STRINGS(hmac,rmd256,message,passphrase) { return(hmac_dispatch(hmac_rmd256_str,"rmd256",message,passphrase)); } +TWO_STRINGS(hmac,rmd320,message,passphrase) { return(hmac_dispatch(hmac_rmd320_str,"rmd320",message,passphrase)); } +TWO_STRINGS(hmac,sha1,message,passphrase) { return(hmac_dispatch(hmac_sha1_str,"sha1",message,passphrase)); } +TWO_STRINGS(hmac,md2,message,passphrase) { return(hmac_dispatch(hmac_md2_str,"md2",message,passphrase)); } +TWO_STRINGS(hmac,md4,message,passphrase) { return(hmac_dispatch(hmac_md4_str,"md4",message,passphrase)); } +TWO_STRINGS(hmac,md5,message,passphrase) { return(hmac_dispatch(hmac_md5_str,"md5",message,passphrase)); } +TWO_STRINGS(hmac,tiger192_3,message,passphrase) { return(hmac_dispatch(hmac_tiger_str,"tiger",message,passphrase)); } +TWO_STRINGS(hmac,whirlpool,message,passphrase) { return(hmac_dispatch(hmac_whirlpool_str,"whirlpool",message,passphrase)); } + +STRING_ARG(SuperNET,bitcoinrpc,setcoin) +{ + char buf[1024]; + if ( setcoin != 0 && setcoin[0] != 0 ) + { + strcpy(myinfo->rpcsymbol,setcoin); + touppercase(myinfo->rpcsymbol); + printf("bitcoinrpc.%s\n",myinfo->rpcsymbol); + if ( iguana_launchcoin(myinfo,myinfo->rpcsymbol,json,0) < 0 ) + return(clonestr("{\"error\":\"error creating coin\"}")); + else + { + sprintf(buf,"{\"result\":\"success\",\"setcoin\":\"%s\"}",setcoin); + return(clonestr(buf)); + } + } else return(clonestr("{\"error\":\"bitcoinrpc needs setcoin value\"}")); +} + +ZERO_ARGS(SuperNET,help) +{ + cJSON *helpjson,*retjson; + if ( (helpjson= SuperNET_helpjson()) != 0 ) + { + retjson = cJSON_CreateObject(); + jadd(retjson,"result",helpjson); + return(jprint(retjson,1)); + } else return(clonestr("{\"error\":\"cant get helpjson\"}")); +} + +TWO_STRINGS(SuperNET,html,agentform,htmlfile) +{ + char *htmlstr; cJSON *retjson; int32_t max = 4*1024*1024; + if ( htmlfile == 0 || htmlfile[0] == 0 ) + htmlfile = "forms.html"; + //if ( (fp= fopen(htmlfile,"w")) == 0 ) + // printf("error opening htmlfile.(%s)\n",htmlfile); + htmlstr = malloc(max); + htmlstr = SuperNET_htmlstr(htmlfile,htmlstr,max,agentform); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result",htmlstr); + free(htmlstr); + //if ( fp != 0 ) + // fclose(fp); + return(jprint(retjson,1)); +} + +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ +#include "../includes/iguana_apiundefs.h" + diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 0dec6a079..7496ccd4b 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -17,6 +17,8 @@ #define H_IGUANAFUNCS_H #define SIGHASH_ALL 1 +cJSON *SuperNET_helpjson(); + // peers int32_t iguana_verifypeer(struct iguana_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize); int32_t iguana_peermetrics(struct supernet_info *myinfo,struct iguana_info *coin); From 2cb9e4e81af8fff25c65c2a1525e69a54fe0fadd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:03:24 +0200 Subject: [PATCH 224/286] Test --- basilisk/tradebots_liquidity.c | 4 ++-- iguana/iguana777.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 3c4a9075f..7e21127aa 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -110,7 +110,7 @@ int32_t tradebots_calcrawfeatures(struct tradebot_arbpair *pair) } if ( n > sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures) ) { - printf("n.%d too many for rawfeatures %ld\n",n,sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)); + printf("n.%d too many for rawfeatures %d\n",n,(int32_t)(sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures))); exit(-1); } return(n); @@ -160,7 +160,7 @@ struct tradebot_arbpair *tradebots_arbpair_create(char *base,char *rel) pair->fp = OS_appendfile(fname); if ( (ftell(pair->fp) % sizeof(pair->rawfeatures)) != 0 ) { - printf("misalinged rawfeatures %ld %ld\n",ftell(pair->fp),(ftell(pair->fp) % sizeof(pair->rawfeatures))); + printf("misalinged rawfeatures %d %d\n",(uint32_t)ftell(pair->fp),(uint32_t)(ftell(pair->fp) % sizeof(pair->rawfeatures))); } fseek(pair->fp,(ftell(pair->fp) / sizeof(pair->rawfeatures)) * sizeof(pair->rawfeatures) - sizeof(pair->rawfeatures),SEEK_SET); if ( fread(pair->rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index d39f498b5..682d3da13 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -21,13 +21,17 @@ #define iguana777_net_h #if defined(_WIN32) || defined(_WIN64) +#ifndef WIN32 #define WIN32 #endif +#endif #if (defined(_WIN32) || defined(__WIN32__)) && \ !defined(WIN32) && !defined(__SYMBIAN32__) +#ifndef WIN32 #define WIN32 #endif +#endif #ifdef WIN32 #define __MINGW From bfeb428664c797440d283f0e937ea39d5ae598a0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:09:31 +0200 Subject: [PATCH 225/286] Test --- crypto777/curve25519.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto777/curve25519.c b/crypto777/curve25519.c index 5d2c24930..264d59952 100755 --- a/crypto777/curve25519.c +++ b/crypto777/curve25519.c @@ -1792,7 +1792,7 @@ void acct777_rwsig(int32_t rwflag,uint8_t *serialized,struct acct777_sig *sig) int32_t acct777_sigcheck(struct acct777_sig *sig) { #define IGUANA_GENESIS 1453075200 -#define IGUANA_MAXPACKETSIZE (1024 * 1024 * 2) +#define IGUANA_MAXPACKETSIZE (1024 * 1024 * 4) #define TEN_YEARS (10 * 365 * 24 * 3600) if ( sig->allocsize < sizeof(*sig) || sig->allocsize > IGUANA_MAXPACKETSIZE ) { From bc494ecabba23539951ed3621825c322857de49f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:23:44 +0200 Subject: [PATCH 226/286] Test --- basilisk/basilisk.h | 4 ++-- basilisk/basilisk_swap.c | 3 ++- iguana/DB/SWAPS/1978010631-1500406169 | Bin 0 -> 101405 bytes iguana/DB/SWAPS/1978010631-1500406169.swap | Bin 0 -> 233496 bytes 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 iguana/DB/SWAPS/1978010631-1500406169 create mode 100644 iguana/DB/SWAPS/1978010631-1500406169.swap diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index c25f11236..b15b9032f 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -60,9 +60,9 @@ struct basilisk_rawtx struct iguana_msgtx msgtx; struct basilisk_rawtxinfo I; struct iguana_info *coin; - char vinstr[4096]; + char vinstr[8192]; cJSON *vins; - uint8_t txbytes[8192],spendscript[512],redeemscript[1024],extraspace[1024]; + uint8_t txbytes[16384],spendscript[512],redeemscript[1024],extraspace[4096]; }; struct basilisk_swapinfo diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2ea0f4055..f4c24a2db 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -320,7 +320,7 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) { char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; - V = calloc(16,sizeof(*V)); + V = calloc(256,sizeof(*V)); V[0].signers[0].privkey = privkey; bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); privkeys = cJSON_CreateArray(); @@ -395,6 +395,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ } else printf("error making rawtx\n"); free_json(privkeys); free_json(txobj); + free(V); return(retval); } diff --git a/iguana/DB/SWAPS/1978010631-1500406169 b/iguana/DB/SWAPS/1978010631-1500406169 new file mode 100644 index 0000000000000000000000000000000000000000..70b880155b90d87cb3c2c0277979dafca04194b0 GIT binary patch literal 101405 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�OdgGilGQ5Qiy$D|zsXq?G~tPrMO!_e=TP;Nn!g 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�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 VbMrr-U*Jv60I!4Kj^BTv4*@nhP22zg literal 0 HcmV?d00001 diff --git a/iguana/DB/SWAPS/1978010631-1500406169.swap b/iguana/DB/SWAPS/1978010631-1500406169.swap new file mode 100644 index 0000000000000000000000000000000000000000..39f4c98d066ca6e86a43a9064007ebe440c7352d GIT binary patch literal 233496 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 literal 0 HcmV?d00001 From 3618a01fd71e8e20cae7bc423e3cf4d17210e300 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 14:24:09 +0200 Subject: [PATCH 227/286] Test --- iguana/DB/SWAPS/1978010631-1500406169 | Bin 101405 -> 0 bytes iguana/DB/SWAPS/1978010631-1500406169.swap | Bin 233496 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 iguana/DB/SWAPS/1978010631-1500406169 delete mode 100644 iguana/DB/SWAPS/1978010631-1500406169.swap diff --git a/iguana/DB/SWAPS/1978010631-1500406169 b/iguana/DB/SWAPS/1978010631-1500406169 deleted file mode 100644 index 70b880155b90d87cb3c2c0277979dafca04194b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101405 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�OdgGilGQ5Qiy$D|zsXq?G~tPrMO!_e=TP;Nn!g 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�!#sp2K0y6y5!x?9?>2&CY8tDTL%Ubs1zVN|fbw(>J{3R^p*vcbVO0obpr1GXTyI#dMlT`bw!wh|K-@~sM zVq2BT{w6|850#lDZtSc~7o{3`5Lxz&>5R*>gKqAbbu9fNEQAVz*LZ=8bGYOH#;WC7%132kZ7YvH_}<04usMvZ!(I#&Z( z>)0%V*tHsQ<~)KkbGH2zrjYO&iCN<8m}x=h*KoSl))1Ir(@e}|M~1719GT?2-mkUq zoyK^H+^%M|daieji(k_OF=qy9YPUFtz$7%o9PxiOb6l)>%A=4nm};wdKvLdHUf4SU)U0xaf4=C zZD_TD9S#plvqOG?ya7dkBN{gCG>*h8_(gy4v6R9;RI_ZZ7W6r9DXZ}bMCGB3;wD~7 ze8aSt;VrC%useKQWYhE8?I60F#oHggHqi=zi8@0ERy{;z(RLVfBG3d246t4(gVp;0 zv2s-`NYg2|<=-=u)_c}u53mPfiiPMVPqLwh_{;ChC)!-4)5<`xD586j*0WOCpwTLS z?R+C+%7R>rg$#`Xz#YL}M(C=zH3y#arQJ-IuB_E}``-2>7y4U7x14?3-RdVIoH-C0 zfC4vj$d8>#qTI`#m=>zJd?Z+wVE$5NX{pFiW`Xl>%ifLzI2bd}j9Dmi&D0~LGFJ`Y zHAF^W(^QMCP#e6o^yW^?47OCLlIZ9kxR~6YShB|uj1rB}^%!_dS)Y*e z+mYtN!@-ad9Q2Dpj}DDo!XEzn%wyy@7I^8h-6)?GyeN=9l+luV;_};_JQ$ch8o026Z2;;rS4iTI9_xAS zqj8`v+&wKbv2D%T?HpgaApyJ4fcHEVZOe{huj{8I;41?Yd^eI^fIq|GF08NXUg^)F zh;V&3dl28#%vT7(QL8s3d^!4$n8FPU$Une3U^O z@J8mtqrtjbk#eqs&dmE8V&vwPI8_#$3MrSadM2VS0@uyQRKfXv8aekRYW)Y2z`m}9|PYP$r$UJZ=bR6$a41!i8`P!d4qH-8U ziIn-l7HLnq`?IcRYyHO@eoNXOd$f8br=q}pt$*m#(D2SzU({5`#SFXs$oKXP+S@;E z3*R2&oK^&26f4%C+K}~J73TsH8|p1;_>2oOyxE0P$T9l8_Lz#GeueF5R!x)YMr3p3 z5(6P?y2ZmCs3-_56wyC46ZeeHOwMETEr9mP2M=D!aM3;I%6!T;ADb#Jt~+<+M`NuE z;+OO{TlRKKY4sO}j;8%WqiGZh+9y4*R{mWw!&0>s0sco_ITxs4XP)waFy*-HN*^Br zk#0k1_{_mZ{$RkeM8jT7WOti4TvOoMY0|lOnY9j*gQ+h(kNHNo5Vh; z9RN(|FF7}R<8L{7o*Og0VwgFz)-`B|{<@Qin37??cC<^0x4tM*%u3hJ+I*I*Bn3a% zf{=QcYqoJat?v*E%u3MV@j-rS{AN7fLjS>Gvy53#y!wPLz~htEsSOIaHejket9gUb#gdyZ(DM)hoGV#%nMVb z#lM5jsR7rTRhH3zQ*p6?&F6?lHXgUu%-*8Mj&oI;&gp0mT#v-QWpOK@aIU`gfu&bU zhHc6@_kd_k&W^W3$e!3_XWQM49}Tp5J&Kqwhp3`M(kH}fU^u$4WTFbRH=r^aCGD4m z&A5LouKxbws=)zVK7SgX^Qc(Vly7QF#7~Q+}o@I z7e~DK3*&TV`exBOq0?g2Freu^St1wu@7fIDlMRbAYx#JV8=H}8ji!08XwuNdqgAcD z5g0$WB(<{=tI&XWNopE_G^x0$k$H|3k>U`?S_P4emJ~^N_z!lRLn1bzN2IApcvIWC z&+Q>Wh|HEbkH_1=HCJ6I+w((de-k1b#Va5W)NyE26Ob>*zK-Km7`zxEW$0lHf-xF_ ztTcWuk3yDqf%SJw<9hy(Y_ZJ!=a0#IqkI6y5A9B+x->TY7$F^h#R35XE6B)0$p)MW zjs_>p*XnvcpL0ME#(Onk_~v!Usk}4$gi>$r(Z}1ih2^D^r9Kl^!Mj*eSFRyfT9fJ%vX4 zghQ|xgcv>nulikUm?n`7Lem0?^o%RHf>N&R`|wcYL(TEZPbAeR>rp>&oos|<|8->{PYl>1#E_08lLh3w5QwO z{M?XK`hSv7OkGn+lIBV?lON)zuFF8{BfG2YnQoOD;~owXc>_HMu48!%smAgT5OBw0d^& zFF#m{6`m3yZG%BP4@HFD4yP6uw2``cG+S8E#T_&C`*V%CamKazWEhjHL7);%45hPW z3*yqFG4u#~^z-!L*~f(wlsRVh*%!e~jJv2x3p5;5rT z7w6gMCn>vAGJs_{EGu+%F!06z!b67M`EW7iXWm$4!$m-y&B4D#)9vMV%{<1yPJ$x_ zk$rDQ_aB*%lG@y_i#_9^M@~J>*FJ9YUVsb5B6Plf>$cqTTbR=8&m+;&FEK)>9qC1z zMEJC=?z^LRRu{fa2knZ0D7K~!OhgB)30pa!y8;cVGv-$qP-L8$IU&_TUK28LxmGsi z)8B5p``KfJKg~*LR-m{^+ddzhs0YoqBxahNh%YkoJE^Y|Wi1&XJ`k^xdjSEHE{M>! zd64yq929#~T*7G^ypApJ`ctVR;M3T#;s^AB%8Wj`ELs39wt`86GeMJFp{)AITHir! zYv<%%RR|Sl;%}Q__K8;kOXby~sL<-!CG)KTgJTzYQz)J&s!txB6O2AAIUh+!LCw%; zVhu5aoYZ(usXfU@Rk~w=9#J?mvP*FSVnT>3!E9?m^;nUc= ze6&-setYE$+V`pL+xvvgYVzRAuC=(B|1rO;G`WnpGjX2t_Rl3ea$dz}sRkhZN}r=q zji)=>+q>*VJf%YvGdh%?d7ALfrH@Hlq7ng_CR=F>%Js8dq&OQ zuhj&(7J5g%S@<(cOC=v@I_h|O!U}$yz#Py(y`|8;DYjPgMvr|$1AC$PG7ifN5gDD> zJ%~eqLro9ecL`nGeXrW*6t`mVwft6o-fH{V0%~a-15nnGXA$duMq2CYB*Ba$2RLhq|?^BE^@`EO-;JJBv+ zgB(d#(wpU|hgxH-clrsLR-hu)!_f*-sla#F3$5y0W$zEmVS6T}-jL>kd7q(e3}9vW zO|_}$Ny^a~=YGGZsNdRIIco}g*s-E*fo+3ICWV#Wfajs%J9j^#eCZdk#E%RBf2C*t z{NW?pw06*Dg33^Sk`&WD7nO?Jn%<&!=;Is!sZLbldp@0YP2G*nF4Cm_oJeP)(?F=G ze;um3M5tNM%^oPYekpVMhP&I0GPd>&Z|G2s>@Li{@%6G`C8{KDWtWa4JJ#wk%@Br)0@-2qp7tSC7-s4Mp6b&y)M|O)wFmUZ5)C>kDo-$%QGJ%pavt0v9H2PrTMXeH7S&i zP{bQ<$_Wiv!}JCOdSytuJ!x`2G|C*s(}Hqf22@W{cvdJRY?Ca3PWwdP!;NN7$^p-3 z%LBmU{+7Mg`#p9iAXs6T#Ia?cM;C)o`jJUlz%r6 z_CJhZiM+l2qRMQ5ytJBVS9Q3O>XYFSBD-`$IUHL-c8G8PB%4{i?c+J+CXEsZK&+D1 z6Eq&b)#d;fIzQPXlw>betmhr zObU&(VKdK;7E0%uq<}&A?GXO?6VB0QZ(&v7MOLX4^H+|j_#UV3w|3&VKOh@-E6vt> zc`2rc6y5X|AxD_6(;*yaBjBffZi;-75KLjD_0wB#MD8#BEb?#Rr|6a0vYwS_t(-6$ z5hg11XHpY0z~5LMbl3iXCTS*1j4n_zszn5!fLJ*BYuKeQr_OBZ!%PKJZFn9Y$;ME} zxip+&4|l&% z#ip;Pfl+YNIRsX9nmTQJV9qd+-NL+w6k(~vr^XBPvpX=ZpH{~9&!FVILwKP!nDrjg zlhKXS4vCi+6;mDlO7&KVg0Db=)>}H!0oJSMv&z&taik1I;iC0k?Tc4=P844|4O5$N zk;T;s^yi42hA+l^Xl;fhopBe*c8q);%z1O$=T-;aQe6+lX<+Hg=E6UW+8YVE3;q-(3N4$i!Jm0>K0qpdO{|0LJ#5xhL`@8Muk9y zCXl%f1X!a^guWmt#^?~7hGm7R`OJ^r=yonSHr`xKKVA0298! z`-9#RxL4_Fw}~1K-YYm>VdgEgme^x^;-?yl2`>AD!o3zXWWX7#wb0y8VLYtOdL(L- z9tDG+5R57Z5>wB)2N*PN{BxDZoW@z)R5^07-7X!2-xe@hm=avos#&CS143^3L|yeh z469uIP;FaLZhpIuZxH*ZQ#)la^_7`Qy+Nr^xCptvr-1$}ky3~wqcE`V6S|Ayo+K)2 ziTeJ`Wl9<({Y?DzgC(h0jkp4De&V>K1g4eh%}tc7LD)<7cKb-3x#8!e48lR3QKYgN z??v7SKe?^|qEp>+O0K~Bq0Zdl=^lGLdidt!cscdxnCG~j?3HQ$P%E~~xFi;hTpSwu zC=&JIMy`f1bMFo7y}{0Nfh%2^JGc~jTU^3y7`Qi}4sey-l6vMrXtLzabwkOdyRnHw zzL8#T9_3n5F z52`A=6(jXzgX|Apeb&|DM^(faD8C&3@0Gp1j+LF)%u%|gZ3;8C_Y4`Ly-wO<`U#6J zUX79=Gn45#_TXlQ^nK;A17gR8qJ8{i@T}kd&Aab2sj`@oEN_kzR)B%yhGLC>2{LDm zwfcsk3R~F+B{o^K(Y0{469i)F)M@E5#-BTLY)DjMDPKA$oUwSOYVhVU@>SQ<&!A#91($U}6tBGuubl3aHj=soL1y zp8)-lL}-jC6S(U`B$05n^HOi-e9A;HQ&27pBx(mt)hg)B3O_0vheao-r?I6f*j+`a zObbQ`8fkSt>Wp$|_Z9bw3^%g25FWelJSF+QJX7R{S81gc!7ImN!65c>(QOFswvvPD z4W>I6?D?$J*X{sUUIH^1gg!GMr}`W)cn5hDjZhScvv00*>n2VByM2f0$Ak!xpKr5g zCNa1-Rh@6#6oznbCfz6_PWliR{8OK8+rK&wa?YssX*YbBB8raI89{!bo@9a_F*KPm z@{D4TRkE{TCHo|`{(50*kPKjgylEn{wY5P-jCcq}3%5*?PlrT~a|o6Z8b-Y~Iylkc z3M_EzTp75a1EsMUsT8mxtQ-a(Jp%8QMrzfEEX+XpxC)|djXUR& zC7B!7Xyb2gE8Q>19XNOxY|1@Lv@g@6v;&3vxwa84dBU|n6W~Os5$jl+H`G$b`DwLKv_f@!k0isCcS*=9Kj_^D zjoOn;XraY<{UDWa_iRHi2}KK^&D#ef}T$Z^l$_x*cFDusW#-kP# z!sLlZ{!5{1UZWwC8iJybsz^M`FiDXiI~oGVKB+d;;-P?mHN8MC-2YnUD!O{5TWh3+ zKq~PYm-KnRwL|dy%R0VAiS;B*LA7O(x5pys%2Db2n6)~0+Jf9a?5UDQ46hAP$T!1$ z!^1Yt#8~cBjkY+a&lel9LO_F(R< z!6sHUecSV!(X$f2JB)bKb;fW}?eu{aZf~4jiat2Op^x5FxigM)@_jJK@8rMmX5AF0 zUuse$1`Qe+{#8d7y6DsC(-em|;px8K^)<*=iqK*QYt&;iy~qOVR4R1*BLK+Uof!p$ z#WH3r0eJf{zJ1p9>^m}OIb&4O=jU`_V(Tc;6RoS_gGNff=Rae@+s@^GmJ~(U4{RJ= zihF`9NP?bXr^CHC+kuNmX1dtgI6V5^lEk5Jb)lFhTh9=&JXg3lBqZCd>FK9|@|Fok zrKHr>fPRx!ec*@XO+syMZE@Qwb+0Ln(rE2#_6H5?grdz@K25_gsnxa*x**5h$Y!j#vj9aG|b5ApBopO z0HGDjDzhyxBx>t@bh>o(O{ZHR;M+V)B|x40KH&I1$_Vn00eFU_udn~Gy{@?cvsV`~ z`ze8hO>}e3w&o$)yV?_tXF!P>G4MUT=YTI!Cm0-y-2}i?u4?4PZn|ie8q&ES7inGM z_2=qZZJJrFNJ%R&E^qxpArM$lS;8yKc6vUU2j)vt(vx%wBWYx}GZE7jGmT>c1BCGF z)rfN6$+MXfAp)z4Y?=dBIT7xFV-1&%^cHkk!~=55mfE3$t0m$*ec-N7mI_gyl3nPG zuiBXEq5>uHsY>sh4nW~0mzk>_48>7Z95k43K3IX+yS$+~+Rnbz(Wx}X#W}aQ$akSe zG@K^VZTKKm9<&24^tTazdn4#BG58hL00d`ozFk7gm6Io zP2u)ilM5T)iZs?2r_=1$R~ne9A15DBVisa*DAi3-c_mNPDL1njCy(YurN}qSDYx_L zuU6hHDDt>n*h~!g4_V$m!Mau(=u(IG9;wOOCo|en|E1h-Pjdo7AeOX5g zQ6J~QL74V|+_x8r3@^V+c1$>z&2e1FKDg_bPTmSpW2}ieG>&o>yYJn6mQ^m=Kd(~T zoQ8;|P`s}g`H44KgbgsRg*0KJ zONxcJ))CA>D@|A>srlAo1AEEN7O!QckCg#CpT%dgm22&W_=J42!x=}b3NDMtML_I2 z?WKa;3W7ZO77)93fSRD|({GzXfX)FvvMS)8PUucAJsQB|og}IH zG#M~GBmGAKul>1M-EZ9YKfc5W2Icq{_GTze_#cr7cLglw$4QRFQyv<|rgV?ge6u;gj<2P|iBlhMY)<_xU7IIdROCe~6WzIcM%W1L5@b zW+r$zDJXA}ep_^V9A_P;|Gh_?e-1fD5o+8!WNPIU_+$>aojXK^017_Kp`gXa~RF}OG$MQ z0b6;1@wM%{+k$-x=p0^Io;W7M5avND6miPZl>L34N++5*P$ksDG@)9Rw#7TyPLMkc z9PMPXMe@OE5QUE)NX}J)19ZxF>#V($0WyACxM&}nG70Ezrf1X@$O_0gdlp4#kbB=W z#VPF55G9q{h&~6LOOWWPn)OZT15VqP`;x?Y*!x}mYIw-T?rYzE*WUv7stjK1Zo=nB zAZ00Tn-Ex3 z>MH(u^k+VK{pJS5AV4wtr%cnBo&I+iUMuY(4A$8<{I|DY17E4IS-+T@mAgYeI#&Y& zV0Q(455anY)MAO5XUbvvgn&NVqz$wx5`mia;>4e!O0{KSIK7aE>NY~c5z{sK{DbT~p*uFCG&<0G=#cz9*BHZC&BYAte@WL-qY zFH!*CNNK5=Mm7Lk3#RjDlI@LA_fe{PDSr<3kZApFfhowW-7=hcDVG>@wf&6p;e?3I zG}vZ+7IFs=-R1O5t|m56N%)d14Zvw^D`x+of?t}Zj)`!#8Z`GYwDx|`=3T+rI_4%aoiocgvrlnfBU zS<)ZPthZ`Px6iwhKV@twTkv}nz!J)kflq@GF32b)id;TVh zk5U$X^>8LdIBvYB3oixwTQk#kUNQjIqO&;2wGvv~EV&ohL|m^tRUs`EE~y#Y7`*q` z%1s0AuXgE4*JYZs%c9ZW=LJt_jnwzt=RdhNGK|a4hZvmS`LF;|2=NIgKia-7dap@G zqrc0~7bSMWJU+&YlS@2Fe-Gq~%3XSSHHHTF08N9>f})@sgo>woeQmLB^TJHM35TTt zbhNQl=a|CV^h}wwB3a@>U+_k}7D}^$;rY$aTn+TA>hwpkMwJo|hqj7Im2} z*r0Nln|Fv~R$>4$%y*~8Hf_JCWIN(XFc2HF7bKv0i)LjEHeHNY`*{pqxHRCq6CTHJ z?rj9!x&Jp4SQ}PDqGm+KjLpyPtzRhC49xtWiG#=NVJOvW_Vme4TqN?p{xuYbbk zZ%!seyu+wrKa-wrvk=${{-?FtFW6zie}W?ZvwrFsOBvNSF-v2KB`FD-^eESQIsAPPhX@Df^>Cgb1G%KV6PJ8yfN=T`rzJD?Vv8PN4015*6Io#*>=5xxaYHwIx~ zt26s5ah!|wSNj>GJil)2r@~!E|6Ozd*pPqQ{+HE;l*~}VhgJUT>;I|q zuGR#gT4tp<%>q{s#E3PL|>fB0vPcuaoTx zVp|y4&xp2m@cViM*ng@eC{c8iF`f%m)7mBj5#Y69hzEri6zg|nFBWaGYrl%WF5yfP zjP1td=(s?6MEt`adSlayIFoE?XZU@~$ss%P4n(Q2YRaEI@3CO%nefXFr~g8t_G)m> z$1K!>Uv;{5GV&Q9zUo%*Vy-1Wjj|~gNp)2MBH(`g)wUDQ98i})AHbyMv5&bjtc<2H z=DUhb(~ajh?Dh|lJ``t(?+;flS3Y~k)K+&y+x^4bLk^zLM=Q75;q#)b{|iaH>(8|# z>hF@-QnBy3XMECGsOY%<5K&6`N@vZ&qFEgv0-z`@s(=egqM3d|de%?i5uO`H__*RX ze#{O}53*J5C+`Uq~J`pE>qV z^%1e-chKRHoRhH?NwNA5KseGq9OEow{24$5sEy*}VrciuxTJR3i`W4^SXLhj(%Xsp zw)U@U?SJ7i{vpx@&y3@^C3MT!kmRrXSrWAD7-m!hfT%VvD20loEa%(*Lh?R(Q7i1^ z|GP55ajLE45%@3w@Q8sD<(BvWoOz&ij{roV1#8a58>4pyx8sH%j5-8c^&M{N2|U3E z-vQ31RhqN<50PL7&hU#AOVJ6!b0vUp;B99iH^d%2|66nz4Ig1tFD%1t*>KA z!KpWzC<9%|{zImv5k^O{(yKMt0@jJlH3o=41CePt98r?W2&^-%V6pv!4-ZCpOMux1 z@qq!u{@h#sA0kauMtg=|WBuej3de5@j-@8Jh{IT}`%Km$na01h&ZPTqZkh|&*$oHd z*%zUAk{PGcZT-TSoyvCr-=#=>r(_k#iUK0Ay8-1!wMSdtksLc#yBW=BMwZjL5^xTg z`?^<|eP8AKhfL#RzKHjQU;TfBb2=BHo58YGa@2%L(p}il(m4#&7}@?CQ#B7I96l~*l`!W#h6SVCi5p7~(j{)b@TLYYb=}84fhoKF-}B{v%mk}~4%;G5 zkZ9)NqbUBp^$#_B3~GP(7rPVnTI4fRR-6N*U4epTai`FuOxEq#jG{euKAEm(m=BJaj#;}$C zLWd3j>)e>A(ssG(j0WP(IIM?rf*|Tam)V~cmnoa5gW(9TW8ArD>*m*;6+4l+uFa+p zJF%{|tczgXKV;hW7Qacw<wSNXR1aoL&4GYxZvG$a;57>xmL}l;U;F>a-9mJot6sv37yS$}A11P|<bwS;-PsyT4)iOS}$im9EL4v^jWd VbMrr-U*Jv60I!4Kj^BTv4*@nhP22zg diff --git a/iguana/DB/SWAPS/1978010631-1500406169.swap b/iguana/DB/SWAPS/1978010631-1500406169.swap deleted file mode 100644 index 39f4c98d066ca6e86a43a9064007ebe440c7352d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233496 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 From 555a37ab0fd45399e2c20b467192fcb3e5c6810d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:09:02 +0200 Subject: [PATCH 228/286] Test --- basilisk/basilisk_swap.c | 39 +++++++++++++++++++------------------- iguana/tests/cancelrefresh | 2 ++ 2 files changed, 22 insertions(+), 19 deletions(-) create mode 100755 iguana/tests/cancelrefresh diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f4c24a2db..e68ea0a39 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1082,7 +1082,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) { M.data = 0; - printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); + //printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); if ( M.datalen < 100000 ) { M.data = malloc(M.datalen); @@ -1381,10 +1381,10 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); - if ( (fp= fopen(fname,"wb")) != 0 ) + if ( 0 && (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); - fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); + /*fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); fwrite(&swap->bobpayment,1,sizeof(swap->bobpayment),fp); fwrite(&swap->alicepayment,1,sizeof(swap->alicepayment),fp); fwrite(&swap->myfee,1,sizeof(swap->myfee),fp); @@ -1394,7 +1394,7 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap fwrite(&swap->bobreclaim,1,sizeof(swap->bobreclaim),fp); fwrite(&swap->bobspend,1,sizeof(swap->bobspend),fp); fwrite(&swap->bobrefund,1,sizeof(swap->bobrefund),fp); - fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp); + fwrite(&swap->alicereclaim,1,sizeof(swap->alicereclaim),fp);*/ fwrite(swap->privkeys,1,sizeof(swap->privkeys),fp); fwrite(swap->otherdeck,1,sizeof(swap->otherdeck),fp); fwrite(swap->deck,1,sizeof(swap->deck),fp); @@ -1413,7 +1413,7 @@ int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoin rawtx->coin = iguana_coinfind(rawtx->I.coinstr); if ( rawtx->vinstr[0] != 0 ) rawtx->vins = cJSON_Parse(rawtx->vinstr); - printf("loaded.%s\n",rawtx->name); + printf("loaded.%s len.%d\n",rawtx->name,rawtx->I.datalen); return(0); } } @@ -1426,6 +1426,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv if ( reinit != 0 ) { sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + printf("reinit.(%s)\n",fname); if ( (fp= fopen(fname,"rb")) != 0 ) { fread(&swap->I,1,sizeof(swap->I),fp); @@ -1433,9 +1434,9 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->bobcoin = iguana_coinfind(swap->I.req.dest); if ( swap->alicecoin == 0 ) swap->alicecoin = iguana_coinfind(swap->I.req.src); - if ( swap->alicecoin != 0 && swap->bobcoin == 0 ) + if ( swap->alicecoin != 0 && swap->bobcoin != 0 ) { - basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); + /*basilisk_swap_loadtx(&swap->bobdeposit,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobpayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->alicepayment,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->myfee,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); @@ -1445,13 +1446,13 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv basilisk_swap_loadtx(&swap->bobreclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobspend,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); - fread(swap->privkeys,1,sizeof(swap->privkeys),fp); - fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); - fread(swap->deck,1,sizeof(swap->deck),fp); + basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol);*/ } else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin); + fread(swap->privkeys,1,sizeof(swap->privkeys),fp); + fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); + fread(swap->deck,1,sizeof(swap->deck),fp); fclose(fp); - } + } else printf("cant find.(%s)\n",fname); } else { @@ -1880,8 +1881,10 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( (swap->I.otherstatebits & 0x80) == 0 ) basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40,0); } + basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && time(NULL) < swap->I.expiration ) // both sides have setup required data and paid txfee { + basilisk_swap_saveupdate(myinfo,swap); if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); //if ( (rand() % 30) == 0 ) @@ -1919,7 +1922,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x8000,data,maxlen,&swap->bobpayment,0x4000,0); } // [BLOCKING: privM] Bob waits for privAm either from Alice or alice blockchain - else if ( (swap->I.statebits & 0x40000) == 0 ) + else if ( (swap->I.statebits & 0xc0000) != 0xc0000 ) { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { @@ -2192,7 +2195,6 @@ void basilisk_swaploop(void *_swap) printf("couldnt establish connection\n"); retval = -1; } - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { if ( swap->connected == 0 ) @@ -2215,7 +2217,6 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) @@ -2313,20 +2314,19 @@ void basilisk_swaploop(void *_swap) } } } - basilisk_swap_saveupdate(myinfo,swap); while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); + basilisk_swap_saveupdate(myinfo,swap); if ( time(NULL) > swap->I.expiration ) break; } - basilisk_swap_saveupdate(myinfo,swap); - printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { - sleep(300); // wait for confirm of msig + printf("BOB waiting for confirm\n"); + sleep(60); // wait for confirm/propagation of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobrefund,0x40000000,0) == 0 ) // use secretBn @@ -2342,6 +2342,7 @@ void basilisk_swaploop(void *_swap) } basilisk_swap_saveupdate(myinfo,swap); } + printf("end of atomic swap\n"); if ( swapcompleted(myinfo,swap) > 0 ) // only if swap completed { if ( swap->I.iambob != 0 ) diff --git a/iguana/tests/cancelrefresh b/iguana/tests/cancelrefresh new file mode 100755 index 000000000..35c27504d --- /dev/null +++ b/iguana/tests/cancelrefresh @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"cancelrefresh\"}" From 13e29b20ff5a7c8c6ca971a2b3c8ae682995cd3a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:17:59 +0200 Subject: [PATCH 229/286] Test --- basilisk/basilisk_swap.c | 2 +- iguana/iguana_payments.c | 4 ++-- iguana/iguana_sign.c | 8 ++++---- iguana/iguana_unspents.c | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e68ea0a39..d9f17db61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -352,7 +352,7 @@ int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_ needsig = 0; #endif } - printf("rawtx B\n"); + //printf("rawtx B\n"); if ( bits256_nonz(rawtx->I.actualtxid) != 0 ) jaddbits256(item,"txid",rawtx->I.actualtxid); else jaddbits256(item,"txid",rawtx->I.signedtxid); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 8e7aacf20..196c3a313 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) @@ -289,7 +289,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int if ( flag != 0 ) free_json(privkeys); } - char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); + //char str[65]; printf("completed.%d %s signed.(%s)\n",*completedp,bits256_str(str,*signedtxidp),signedtx!=0?signedtx:""); return(signedtx); } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index c502e1465..43afba477 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -687,7 +687,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ { iguana_vinobjset(&msg->vins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); - printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); + //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; @@ -1013,13 +1013,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - int32_t z; + /*int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ } } if ( numsigs >= vp->M ) @@ -1435,7 +1435,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } } - printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); + //printf("type.%d p2sh.[%d] -> %s M.%d N.%d\n",type,i,mvin.coinaddr,mvin.M,mvin.N); } } if ( i < V->N ) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 19db61d54..773f6f431 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -913,7 +913,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, { if ( firstslot >= 0 ) { - printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); + //printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; if ( (0) && coin->utxofp == 0 ) @@ -949,7 +949,7 @@ return; { if ( firstslot >= 0 ) { - char str[65]; printf("%s slot.[%d] <- %s/v%d\n",fname,firstslot,bits256_str(str,filetxid),filevout); + //char str[65]; printf("%s slot.[%d] <- %s/v%d\n",fname,firstslot,bits256_str(str,filetxid),filevout); coin->markedunspents[firstslot] = filetxid; coin->markedunspents[firstslot].ushorts[15] = filevout; } @@ -975,7 +975,7 @@ return; { if ( firstslot >= 0 ) { - char str[65]; printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,filetxid),filevout); + //char str[65]; printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,filetxid),filevout); coin->markedunspents[firstslot] = filetxid; coin->markedunspents[firstslot].ushorts[15] = filevout; } From c30351aa69ac66ccda8e40caf7a4ebd1cbf697f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 15:26:37 +0200 Subject: [PATCH 230/286] Test --- basilisk/basilisk_swap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d9f17db61..e8ee6438a 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1037,9 +1037,9 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) { - FILE *fp; char fname[512]; + FILE *fp=0; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); - if ( (fp= fopen(fname,"rb+")) == 0 ) + if ( 0 && (fp= fopen(fname,"rb+")) == 0 ) { if ( (fp= fopen(fname,"wb+")) != 0 ) { From 25dd833a1e5d03f247b0694677ae5f6dcd8ceb86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:13:03 +0200 Subject: [PATCH 231/286] Test --- basilisk/basilisk_swap.c | 57 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e8ee6438a..3daeb4acc 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1380,7 +1380,7 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap *swap) { FILE *fp; char fname[512]; - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); if ( 0 && (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); @@ -1425,7 +1425,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; if ( reinit != 0 ) { - sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid); + sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); printf("reinit.(%s)\n",fname); if ( (fp= fopen(fname,"rb")) != 0 ) { @@ -1699,9 +1699,32 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t return(errs); } +void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,int32_t locktime,bits256 triggertxid) +{ + // bobrefund, bobreclaim, alicereclaim + char fname[512],str[65]; FILE *fp; int32_t i; + sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + printf("{\"name\":\"%s\"",rawtx->name); + if ( rawtx->I.datalen > 0 ) + { + printf(",\"tx\":\""); + for (i=0; iI.datalen; i++) + printf("%02x",rawtx->txbytes[i]); + printf("\""); + } + printf(",\"lock\":%u",locktime); + if ( bits256_nonz(triggertxid) != 0 ) + printf(",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); + printf("}\n"); + fclose(fp); + } +} + uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx,uint32_t nextbits,int32_t suppress_swapsend) { - uint8_t sendbuf[32768]; int32_t sendlen; + uint8_t sendbuf[32768]; int32_t sendlen; bits256 triggertxid; if ( basilisk_swapdata_rawtx(myinfo,swap,data,maxlen,rawtx) != 0 ) { if ( bits256_nonz(rawtx->I.signedtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) @@ -1722,6 +1745,32 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis memcpy(&sendbuf[sendlen],rawtx->redeemscript,rawtx->I.redeemlen); sendlen += rawtx->I.redeemlen; } + memset(triggertxid.bytes,0,sizeof(triggertxid)); + if ( swap->I.iambob != 0 ) + { + if ( rawtx == &swap->bobdeposit ) + { + basilisk_dontforget(myinfo,swap,&swap->bobdeposit,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->bobrefund,0,triggertxid); + } + else if ( rawtx == &swap->bobpayment ) + { + basilisk_dontforget(myinfo,swap,&swap->bobpayment,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->bobreclaim,swap->bobpayment.I.locktime,triggertxid); + } + else if ( rawtx == &swap->bobspend ) + basilisk_dontforget(myinfo,swap,&swap->bobspend,0,triggertxid); + } + else + { + if ( rawtx == &swap->alicepayment ) + { + basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); + basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); + } + else if ( rawtx == &swap->alicespend ) + basilisk_dontforget(myinfo,swap,&swap->alicespend,0,triggertxid); + } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) return(basilisk_swapsend(myinfo,swap,msgbits,sendbuf,sendlen,nextbits,rawtx->I.crcs)); @@ -1926,7 +1975,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap { if ( basilisk_swapget(myinfo,swap,0x40000,data,maxlen,basilisk_verify_privi) == 0 || basilisk_privAm_extract(myinfo,swap) == 0 ) // divulges privAm { - printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); + //printf("got privi spend alicepayment, dont divulge privBn until bobspend propagated\n"); basilisk_alicepayment_spend(myinfo,swap,&swap->bobspend); if ( basilisk_swapdata_rawtxsend(myinfo,swap,0,data,maxlen,&swap->bobspend,0x40000,1) == 0 ) printf("Bob error spending alice payment\n"); From 81857192cd7b811ed2f2950f75099eb4489efbf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:19:24 +0200 Subject: [PATCH 232/286] Test --- basilisk/basilisk_swap.c | 14 +++++++------- iguana/iguana_sign.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 3daeb4acc..aad2bf050 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1706,18 +1706,18 @@ void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - printf("{\"name\":\"%s\"",rawtx->name); + fprintf(fp,"{\"name\":\"%s\"",rawtx->name); if ( rawtx->I.datalen > 0 ) { - printf(",\"tx\":\""); + fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) - printf("%02x",rawtx->txbytes[i]); - printf("\""); + fprintf(fp,"%02x",rawtx->txbytes[i]); + fprintf(fp,"\""); } - printf(",\"lock\":%u",locktime); + fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) - printf(",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); - printf("}\n"); + fprintf(fp,",\"trigger\":\"%s\"",bits256_str(str,triggertxid)); + fprintf(fp,"}\n"); fclose(fp); } } diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 43afba477..1c5b1efc9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1430,7 +1430,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf for (z=0; z<33; z++) V[i].signers[j].pubkey[z] = pubkeys[k][z]; } - printf("%s -> V[%d].signer.[%d] <- privkey.%d\n",mvin.signers[j].coinaddr,i,j,k); + //printf("%s -> V[%d].signer.[%d] <- privkey.%d\n",mvin.signers[j].coinaddr,i,j,k); break; } } From b97515840d2d67ecb64979a6f7110326ff7e26ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 17:34:57 +0200 Subject: [PATCH 233/286] Test --- basilisk/basilisk_swap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index aad2bf050..f3849c118 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1701,18 +1701,17 @@ int32_t basilisk_verify_privkeys(struct supernet_info *myinfo,void *ptr,uint8_t void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,int32_t locktime,bits256 triggertxid) { - // bobrefund, bobreclaim, alicereclaim char fname[512],str[65]; FILE *fp; int32_t i; sprintf(fname,"%s/SWAPS/%u-%u.%s",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid,rawtx->name), OS_compatible_path(fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - fprintf(fp,"{\"name\":\"%s\"",rawtx->name); + fprintf(fp,"{\"name\":\"%s\",\"coin\":\"%s\"",rawtx->name,rawtx->coin->symbol); if ( rawtx->I.datalen > 0 ) { fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) fprintf(fp,"%02x",rawtx->txbytes[i]); - fprintf(fp,"\""); + fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,rawtx->I.actualtxid)); } fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) @@ -1766,6 +1765,7 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis if ( rawtx == &swap->alicepayment ) { basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); + basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); } else if ( rawtx == &swap->alicespend ) From 989fae017a3743564e12af568951919e560d0aff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:01:59 +0200 Subject: [PATCH 234/286] Test --- basilisk/basilisk_swap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f3849c118..b7c1f3cbb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -582,7 +582,7 @@ int32_t basilisk_verify_otherfee(struct supernet_info *myinfo,void *ptr,uint8_t int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,struct basilisk_rawtx *rawtx,int32_t v,uint8_t *recvbuf,int32_t recvlen,int32_t suppress_pubkeys) { - int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; + int32_t datalen=0,retval=-1,hexlen,n; uint8_t *data; cJSON *txobj,*skey,*vouts,*vout; char *hexstr; bits256 txid; datalen = recvbuf[0]; datalen += (int32_t)recvbuf[1] << 8; if ( datalen > 65536 ) @@ -609,6 +609,10 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str printf("%s rawtx data compare error, len %d vs %d <<<<<<<<<< warning\n",rawtx->name,rawtx->I.datalen,datalen); return(-1); } + txid = bits256_doublesha256(0,data,datalen); + char str[65]; printf("rawtx.%s txid %s\n",rawtx->name,bits256_str(str,txid)); + if ( bits256_cmp(txid,rawtx->I.actualtxid) != 0 && bits256_nonz(rawtx->I.actualtxid) == 0 ) + rawtx->I.actualtxid = txid; if ( (txobj= bitcoin_data2json(rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->msgtx,rawtx->extraspace,sizeof(rawtx->extraspace),data,datalen,0,suppress_pubkeys)) != 0 ) { rawtx->I.actualtxid = rawtx->I.signedtxid; From 36835a39a1603ff7ef6275c4f70e9d55f54edf14 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:18:51 +0200 Subject: [PATCH 235/286] Test --- basilisk/basilisk_swap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b7c1f3cbb..f9fe50702 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1715,7 +1715,7 @@ void basilisk_dontforget(struct supernet_info *myinfo,struct basilisk_swap *swap fprintf(fp,",\"tx\":\""); for (i=0; iI.datalen; i++) fprintf(fp,"%02x",rawtx->txbytes[i]); - fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,rawtx->I.actualtxid)); + fprintf(fp,"\",\"txid\":\"%s\"",bits256_str(str,bits256_doublesha256(0,rawtx->txbytes,rawtx->I.datalen))); } fprintf(fp,",\"lock\":%u",locktime); if ( bits256_nonz(triggertxid) != 0 ) From dcdf55085878830a8cc5629d0339e62a0daebe27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 18:53:11 +0200 Subject: [PATCH 236/286] Test --- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_swap.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b779027bb..24d0c03d8 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -804,7 +804,7 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); printf("new txfee %.8f\n",dstr(txfee)); } - printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); + //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } if ( rawtx != 0 ) { diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f9fe50702..32b1c8144 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -499,8 +499,8 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } - //if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - // txfee = 0; + if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) + txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -732,7 +732,7 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * for (i=0; i<32; i++) revAm.bytes[i] = swap->I.privAm.bytes[31-i]; len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); - char str[65],str2[65]; printf("bobpaid.(%s) (%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); + char str[65],str2[65]; printf("bobpaid privAm.(%s) myprivs[0].(%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) { for (i=0; ibobpayment.I.datalen; i++) From 71bab9e379c0987c07cee976065e44a695b7156d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:02:15 +0200 Subject: [PATCH 237/286] Test --- basilisk/basilisk_bitcoin.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 24d0c03d8..9f1417484 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -758,9 +758,14 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( (amount= j64bits(valsobj,"satoshis")) == 0 ) amount = jdouble(valsobj,"value") * SATOSHIDEN; if ( (txfee= j64bits(valsobj,"txfee")) == 0 ) - txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; + { + if ( strcmp(coin->symbol,"BTC") != 0 ) + { + txfee = coin->chain->txfee; + if ( txfee == 0 ) + txfee = 10000; + } + } spendscriptstr = jstr(valsobj,"spendscript"); minconf = juint(valsobj,"minconf"); locktime = jint(valsobj,"locktime"); From edbfcf7dcbcba3d518541424fcbf9857b6a416a4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:10:29 +0200 Subject: [PATCH 238/286] Test --- basilisk/basilisk_bitcoin.c | 5 ++++- basilisk/basilisk_swap.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 9f1417484..3a174e3ac 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -806,8 +806,11 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); + free(rawtx); + if ( vins != 0 ) + free_json(vins), vins = 0; rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); - printf("new txfee %.8f\n",dstr(txfee)); + printf("new txfee %.8f (%s)\n",dstr(txfee),rawtx); } //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); } diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 32b1c8144..0aada0ba4 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -522,7 +522,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps V = calloc(256,sizeof(*V)); if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { - //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; if ( (retarray= cJSON_Parse(retstr)) != 0 ) { From 625ce9e41236774268bcbb0ae56bf7dc3f0ffaf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:17:56 +0200 Subject: [PATCH 239/286] Test --- basilisk/basilisk_bitcoin.c | 1 - 1 file changed, 1 deletion(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 3a174e3ac..375371d9e 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -806,7 +806,6 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); - free(rawtx); if ( vins != 0 ) free_json(vins), vins = 0; rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); From 35aac668096d366392fa78b2be03e601f7b763be Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:25:40 +0200 Subject: [PATCH 240/286] Test --- iguana/iguana_payments.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 196c3a313..e1b39644c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - //printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); + printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) From e4be264a0d480f19aa7213520429edd037e75d81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:39:39 +0200 Subject: [PATCH 241/286] Test --- basilisk/basilisk_swap.c | 2 +- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0aada0ba4..32b1c8144 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -522,7 +522,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps V = calloc(256,sizeof(*V)); if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) { - printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); + //printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr); flag = 0; if ( (retarray= cJSON_Parse(retstr)) != 0 ) { diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index e1b39644c..bd53b56a7 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx V.%p\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,V); + printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,rawtx); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1c5b1efc9..9777f18e9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -989,14 +989,14 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign bitcoin_pubkey33(coin->ctx,vp->signers[j].pubkey,vp->signers[j].privkey); sig[siglen++] = sighash; vp->signers[j].siglen = siglen; - /*char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); + char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); int32_t i; for (i=0; isigners[j].pubkey[i]); // s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1; - printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey));*/ + printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey)); } if ( sig == 0 || siglen == 0 ) { @@ -1013,13 +1013,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - /*int32_t z; + int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); } } if ( numsigs >= vp->M ) @@ -1458,7 +1458,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf int32_t tmp; char str[65]; if ( (tmp= iguana_interpreter(coin,0,iguana_lockval(finalized,jint(txobj,"locktime")),V,numinputs)) < 0 ) { - //printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); + printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); } From 624f9095d4d240a8f666fac9a5d84f503bd9a42d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:46:23 +0200 Subject: [PATCH 242/286] Test --- iguana/iguana_sign.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 9777f18e9..313e0d42e 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1361,14 +1361,14 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - //printf("back from bitcoin_hex2json\n"); + printf("back from bitcoin_hex2json\n"); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - //printf("back rwmsgtx vins.%p\n",msgtx->vins); + printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) @@ -1385,7 +1385,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - //printf("after privkeys tx_in.%d\n",msgtx->tx_in); + printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1453,6 +1453,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } finalized = iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V); + printf("finalized.%d\n",finalized); if ( (complete= bitcoin_verifyvins(coin,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; char str[65]; @@ -1461,7 +1462,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf printf("iguana_interpreter %d error.(%s)\n",tmp,signedtx); complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); - } + } else printf("complete.%d\n",complete); } } else fprintf(stderr,"no inputs in vins.(%s)\n",vins!=0?jprint(vins,0):"null"); free(extraspace); From a5ffea97741f20d14e1fbb043c927dd0721283e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 19:53:40 +0200 Subject: [PATCH 243/286] Test --- iguana/iguana_sign.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 313e0d42e..3a7cf2048 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1361,10 +1361,11 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json\n"); + printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { + printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { @@ -1463,7 +1464,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf complete = 0; } else printf("%s signed\n",bits256_str(str,*signedtxidp)); } else printf("complete.%d\n",complete); - } + } else printf("rwmsgtx error\n"); } else fprintf(stderr,"no inputs in vins.(%s)\n",vins!=0?jprint(vins,0):"null"); free(extraspace); free(serialized), free(serialized2), free(serialized3), free(serialized4); From 3daf63b56b26481a1cb6b3401a7d50bb55cd543a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:00:10 +0200 Subject: [PATCH 244/286] Test --- iguana/iguana_sign.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 3a7cf2048..1b221c6a0 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -833,6 +833,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, jaddstr(txobj,"error","couldnt decode transaction"); jaddstr(txobj,"coin",coin->symbol); } + printf("msgtx.(%s)\n",jprint(txobj,0)); if ( n != len ) { int32_t i; From b90bf2654aca41e5f96e69292faf7641724c2ff3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:08:45 +0200 Subject: [PATCH 245/286] Test --- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index bd53b56a7..71797bd53 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,rawtx); + printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1b221c6a0..75256fc29 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1368,7 +1368,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,0,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From 5d7c34efa08cf0d93ac2691bfcdc4f6d89447629 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:21:01 +0200 Subject: [PATCH 246/286] Test --- iguana/iguana_sign.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 75256fc29..193d8e3bd 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -568,6 +568,22 @@ void iguana_vinobjset(struct iguana_msgvin *vin,cJSON *item,uint8_t *spendscript } } +int32_t iguana_vinarray_check(cJSON *vinarray,bits256 txid) +{ + bits256 array_txid; cJSON *item; int32_t i,n = cJSON_GetArraySize(vinarray); + for (i=0; ivins[i],jitem(vins,i),spendscript,sizeof(spendscript)); sigtxid = bitcoin_sigtxid(coin,height,sigser,maxsize*2,msg,i,msg->vins[i].spendscript,msg->vins[i].spendlen,SIGHASH_ALL,vpnstr,suppress_pubkeys); //printf("after vini.%d vinscript.%p spendscript.%p spendlen.%d (%s)\n",i,msg->vins[i].vinscript,msg->vins[i].spendscript,msg->vins[i].spendlen,jprint(jitem(vins,i),0)); - jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); + if ( iguana_vinarray_check(vinarray,msg->vins[i].prev_hash) < 0 ) + jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); if ( msg->vins[i].spendscript == spendscript ) msg->vins[i].spendscript = 0; - } else jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); + } else if ( iguana_vinarray_check(vinarray,msg->vins[i].prev_hash) < 0 ) + jaddi(vinarray,iguana_vinjson(coin,&msg->vins[i],sigtxid)); } free(sigser); jadd(json,"vin",vinarray); @@ -1359,7 +1377,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); @@ -1368,7 +1386,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,0,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From f02da0c02ce0fd63b36f017cc68b2d38259a500a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:26:38 +0200 Subject: [PATCH 247/286] Test --- iguana/iguana_sign.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 193d8e3bd..310499e8f 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -713,6 +713,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ } free(sigser); jadd(json,"vin",vinarray); + msg->tx_in = cJSON_GetArraySize(vinarray); jaddnum(json,"numvins",msg->tx_in); } if ( voutarray != 0 ) From d3832ae69edb3aaa80cea7fe44ae9892246c8d7a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:32:01 +0200 Subject: [PATCH 248/286] Test --- iguana/iguana_sign.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 310499e8f..611b307c9 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -673,7 +673,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); - //printf("lock_time.%08x len.%d\n",msg->lock_time,len); +printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -727,7 +727,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - //printf("TX.(%s) %p\n",jprint(json,0),json); + printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -852,7 +852,7 @@ cJSON *bitcoin_data2json(struct iguana_info *coin,int32_t height,bits256 *txidp, jaddstr(txobj,"error","couldnt decode transaction"); jaddstr(txobj,"coin",coin->symbol); } - printf("msgtx.(%s)\n",jprint(txobj,0)); + //printf("msgtx.(%s)\n",jprint(txobj,0)); if ( n != len ) { int32_t i; @@ -1009,14 +1009,14 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign bitcoin_pubkey33(coin->ctx,vp->signers[j].pubkey,vp->signers[j].privkey); sig[siglen++] = sighash; vp->signers[j].siglen = siglen; - char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); + /*char str[65]; printf("SIGTXID.(%s) ",bits256_str(str,sigtxid)); int32_t i; for (i=0; isigners[j].pubkey[i]); // s2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1; - printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey)); + printf(" SIGNEDTX.[%02x] siglen.%d priv.%s\n",sig[siglen-1],siglen,bits256_str(str,vp->signers[j].privkey));*/ } if ( sig == 0 || siglen == 0 ) { @@ -1033,13 +1033,13 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,int32_t height,bits256 *sign { flag++; numsigs++; - int32_t z; + /*int32_t z; for (z=0; zsigners[j].pubkey[z]); - printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M); + printf(" <- pub, SIG.%d.%d VERIFIED numsigs.%d vs M.%d\n",vini,j,numsigs,vp->M);*/ } } if ( numsigs >= vp->M ) From d3506bbe939352a0ef055ee6852ba8d0d75212c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:39:44 +0200 Subject: [PATCH 249/286] Test --- iguana/iguana_sign.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 611b307c9..0642b54f5 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1387,7 +1387,8 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) + iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys); + if ( numinputs == msgtx->tx_in ) { printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); From 2816d159ce66f24ee17608f86ac1a92756fb7b78 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 20:58:41 +0200 Subject: [PATCH 250/286] Test --- basilisk/basilisk_swap.c | 22 +++++++++++++++++++--- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 6 ++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 32b1c8144..e06c8f96d 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -490,7 +490,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct return(retval); } -int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +int32_t _basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { char *retstr,*jsonstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; //bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33); @@ -499,8 +499,6 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); printf("set change address.(%s)\n",rawtx->coin->changeaddr); } - if ( strcmp(rawtx->coin->symbol,"BTC") == 0 ) - txfee = 0; init_hexbytes_noT(scriptstr,script,scriptlen); basilisktag = (uint32_t)rand(); valsobj = cJSON_CreateObject(); @@ -558,6 +556,24 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swaps return(retval); } +int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) +{ + int32_t retval,len; uint64_t newtxfee; struct iguana_info *coin; + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay); + if ( (coin= rawtx->coin) == 0 || strcmp(coin->symbol,"BTC") != 0 ) + return(retval); + len = rawtx->I.datalen; + if ( coin->estimatedfee == 0 ) + coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); + newtxfee = coin->estimatedfee * len; + if ( newtxfee > txfee ) + { + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,newtxfee,minconf,delay); + printf("txfee %.8f -> newtxfee %.8f\n",dstr(txfee),dstr(newtxfee)); + } + return(retval); +} + struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) { if ( rawtx->I.datalen != 0 && rawtx->I.datalen <= maxlen ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 71797bd53..8cdb158b9 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -274,7 +274,7 @@ char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int memset(&msgtx,0,sizeof(msgtx)); if ( V == 0 ) V = calloc(numinputs,sizeof(*V)), flagV = 1; - printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); + //printf("SIGN.(%s) priv.(%s) %llx %llx (%s)\n",jprint(vins,0),jprint(privkeys,0),(long long)V->signers[0].privkey.txid,(long long)V->signers[1].privkey.txid,vins!=0?jprint(vins,0):"no vins"); if ( V != 0 ) { if ( iguana_signrawtransaction(myinfo,coin,height,&msgtx,&signedtx,signedtxidp,V,numinputs,rawtx,vins,privkeys) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 0642b54f5..1076aee21 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1378,7 +1378,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf extraspace = malloc(extralen); memset(msgtx,0,sizeof(*msgtx)); decode_hex(serialized,len,rawtx); - printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); + //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); @@ -1387,10 +1387,8 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf { printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); - iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys); - if ( numinputs == msgtx->tx_in ) + if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { - printf("back rwmsgtx vins.%p\n",msgtx->vins); memset(pubkeys,0,sizeof(pubkeys)); memset(privkeys,0,sizeof(privkeys)); if ( (n= cJSON_GetArraySize(privkeysjson)) > 0 ) From 19768b1c08f6f3456dcaacac284b40be0ab853fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:08:55 +0200 Subject: [PATCH 251/286] Test --- basilisk/basilisk_swap.c | 6 +++--- iguana/iguana_sign.c | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index e06c8f96d..1d317ee60 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -481,7 +481,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; //rawtx->txbytes = calloc(1,rawtx->I.datalen); decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); - printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); + //printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); free(signedtx); retval = 0; } else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll @@ -559,9 +559,9 @@ int32_t _basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swap int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf,int32_t delay) { int32_t retval,len; uint64_t newtxfee; struct iguana_info *coin; - retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay); if ( (coin= rawtx->coin) == 0 || strcmp(coin->symbol,"BTC") != 0 ) - return(retval); + return(_basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,lockinputs,rawtx,locktime,script,scriptlen,txfee,minconf,delay)); + retval = _basilisk_rawtx_gen(str,myinfo,swapstarted,pubkey33,iambob,0,rawtx,locktime,script,scriptlen,txfee,minconf,delay); len = rawtx->I.datalen; if ( coin->estimatedfee == 0 ) coin->estimatedfee = iguana_getestimatedfee(myinfo,coin); diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 1076aee21..97b0b2006 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -673,7 +673,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t height,int32_t rwflag,cJ jaddi(voutarray,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->lock_time),&msg->lock_time); -printf("lock_time.%08x len.%d\n",msg->lock_time,len); +//printf("lock_time.%08x len.%d\n",msg->lock_time,len); if ( strcmp(coin->symbol,"VPN") == 0 ) { uint16_t ddosflag = 0; @@ -727,7 +727,7 @@ printf("lock_time.%08x len.%d\n",msg->lock_time,len); jaddnum(json,"locktime",msg->lock_time); jaddnum(json,"size",len); jaddbits256(json,"txid",*txidp); - printf("TX.(%s) %p\n",jprint(json,0),json); + //printf("TX.(%s) %p\n",jprint(json,0),json); } msg->allocsize = len; return(len); @@ -1381,11 +1381,11 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf //printf("call hex2json.(%s) vins.(%s)\n",rawtx,jprint(vins,0)); if ( (txobj= bitcoin_hex2json(coin,height,&txid,msgtx,rawtx,extraspace,extralen,serialized4,vins,V->suppress_pubkeys)) != 0 ) { - printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); + //printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); } else fprintf(stderr,"no txobj from bitcoin_hex2json\n"); if ( (numinputs= cJSON_GetArraySize(vins)) > 0 ) { - printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); + //printf("numinputs.%d msgtx.%d\n",numinputs,msgtx->tx_in); memset(msgtx,0,sizeof(*msgtx)); if ( iguana_rwmsgtx(coin,height,0,0,serialized,maxsize,msgtx,&txid,"",extraspace,65536,vins,V->suppress_pubkeys) > 0 && numinputs == msgtx->tx_in ) { @@ -1405,7 +1405,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf iguana_ensure_privkey(myinfo,coin,privkey); } } - printf("after privkeys tx_in.%d\n",msgtx->tx_in); + //printf("after privkeys tx_in.%d\n",msgtx->tx_in); for (i=0; itx_in; i++) { if ( msgtx->vins[i].p2shlen != 0 ) @@ -1473,7 +1473,7 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf } } finalized = iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V); - printf("finalized.%d\n",finalized); + //printf("finalized.%d\n",finalized); if ( (complete= bitcoin_verifyvins(coin,height,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1,V->suppress_pubkeys)) > 0 && signedtx != 0 ) { int32_t tmp; char str[65]; From 2ad48da3429b20b452aaf7d10ef85332e50a8861 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:15:26 +0200 Subject: [PATCH 252/286] Test --- basilisk/basilisk_bitcoin.c | 6 +++--- iguana/iguana_payments.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 375371d9e..22ec358d1 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -759,11 +759,11 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi amount = jdouble(valsobj,"value") * SATOSHIDEN; if ( (txfee= j64bits(valsobj,"txfee")) == 0 ) { - if ( strcmp(coin->symbol,"BTC") != 0 ) + //if ( strcmp(coin->symbol,"BTC") != 0 ) { txfee = coin->chain->txfee; - if ( txfee == 0 ) - txfee = 10000; + if ( txfee < 50000 ) + txfee = 50000; } } spendscriptstr = jstr(valsobj,"spendscript"); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 8cdb158b9..516bcaf0a 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j= satoshis+txfee ) { if ( (vins= iguana_RTinputsjson(myinfo,coin,&total,satoshis + txfee,unspents,num,maxmode)) != 0 ) From fae520745008782e07618441c50ca7efaf840e61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 21:47:39 +0200 Subject: [PATCH 253/286] Test --- basilisk/basilisk_swap.c | 14 +++++++------- iguana/iguana_payments.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1d317ee60..9eab58035 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1343,8 +1343,8 @@ void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx * rawtx->coin = coin; strcpy(rawtx->I.coinstr,coin->symbol); rawtx->I.numconfirms = numconfirms; - if ( (rawtx->I.amount= satoshis) < 10000 ) - rawtx->I.amount = 10000; + if ( (rawtx->I.amount= satoshis) < 50000 ) + rawtx->I.amount = 50000; rawtx->I.vintype = vintype; // 0 -> std, 2 -> 2of2, 3 -> spend bobpayment, 4 -> spend bobdeposit rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit if ( rawtx->I.vouttype == 0 ) @@ -1483,10 +1483,10 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv swap->I.callduration += optionduration; swap->I.bobsatoshis = swap->I.req.destamount; swap->I.alicesatoshis = swap->I.req.srcamount; - if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.bobinsurance = 10000; - if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 10000 ) - swap->I.aliceinsurance = 10000; + if ( (swap->I.bobinsurance= (swap->I.bobsatoshis / INSTANTDEX_INSURANCEDIV)) < 50000 ) + swap->I.bobinsurance = 50000; + if ( (swap->I.aliceinsurance= (swap->I.alicesatoshis / INSTANTDEX_INSURANCEDIV)) < 50000 ) + swap->I.aliceinsurance = 50000; strcpy(swap->I.bobstr,swap->I.req.dest); strcpy(swap->I.alicestr,swap->I.req.src); swap->I.started = (uint32_t)time(NULL); @@ -2353,7 +2353,7 @@ void basilisk_swaploop(void *_swap) else { retval = 0; - for (i=0; ialicepayment.I.spendlen; i++) + for (i=0; ialicepayment.I.datalen; i++) printf("%02x",swap->alicepayment.txbytes[i]); printf(" ALICE PAYMENT created\n"); iguana_unspents_mark(myinfo,swap->alicecoin,swap->alicepayment.vins); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 516bcaf0a..733a16fb3 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -426,7 +426,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS coinaddr = jstri(addresses,i); if ( (array= basilisk_unspents(myinfo,coin,coinaddr)) != 0 ) { - printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); + //printf("unspents.(%s) %s\n",coinaddr,jprint(array,0)); if ( (m= cJSON_GetArraySize(array)) > 0 ) { for (j=0; j Date: Sat, 11 Mar 2017 21:53:01 +0200 Subject: [PATCH 254/286] Test --- basilisk/basilisk_bitcoin.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 22ec358d1..8dec9ae69 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -802,13 +802,13 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi oplen = 0; } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); } - rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,1); if ( txfee == 0 ) { txfee = iguana_esttxfee(myinfo,coin,rawtx,0,vins != 0 ? cJSON_GetArraySize(vins): 0); if ( vins != 0 ) free_json(vins), vins = 0; - rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,0); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr,V,1); printf("new txfee %.8f (%s)\n",dstr(txfee),rawtx); } //printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); From 53904191a8f22f6e1382aa3508c89bd6066abedb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 11 Mar 2017 22:13:48 +0200 Subject: [PATCH 255/286] Test --- basilisk/basilisk_swap.c | 6 ++++-- iguana/iguana_payments.c | 2 +- iguana/iguana_unspents.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 9eab58035..b0159dcdb 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1785,11 +1785,13 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis if ( rawtx == &swap->alicepayment ) { basilisk_dontforget(myinfo,swap,&swap->alicepayment,0,triggertxid); - basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); - basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); } else if ( rawtx == &swap->alicespend ) + { basilisk_dontforget(myinfo,swap,&swap->alicespend,0,triggertxid); + //basilisk_alicepayment_spend(myinfo,swap,&swap->alicereclaim); + basilisk_dontforget(myinfo,swap,&swap->alicereclaim,0,swap->bobrefund.I.actualtxid); + } } //printf("sendlen.%d datalen.%d redeemlen.%d\n",sendlen,rawtx->datalen,rawtx->redeemlen); if ( suppress_swapsend == 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 733a16fb3..55f550354 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 773f6f431..b9d0a0ca0 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -913,7 +913,7 @@ void iguana_unspents_mark(struct supernet_info *myinfo,struct iguana_info *coin, { if ( firstslot >= 0 ) { - //printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); + printf("slot.[%d] <- %s/v%d\n",firstslot,bits256_str(str,txid),vout); coin->markedunspents[firstslot] = txid; coin->markedunspents[firstslot].ushorts[15] = vout; if ( (0) && coin->utxofp == 0 ) From 7e702281780b4bbb9eb1a18538faff94a5a5309c Mon Sep 17 00:00:00 2001 From: test1 Date: Sun, 12 Mar 2017 07:57:54 +0100 Subject: [PATCH 256/286] fix for msvs compiler bug for handling if-else-if, see: https://connect.microsoft.com/VisualStudio/feedback/details/1572286/program-too-complex-used-to-compile-with-vs-2013-but-not-anymore Signed-off-by: test1 --- basilisk/basilisk.c | 1 + iguana/iguana_exchanges.c | 1 + iguana/iguana_json.c | 28 +++++++++++++++++++++++++++- iguana/iguana_notary.c | 1 + iguana/iguana_payments.c | 1 + iguana/iguana_tradebots.c | 1 + iguana/iguana_unspents.c | 1 + iguana/iguana_wallet.c | 1 + iguana/main.c | 1 + iguana/ramchain_api.c | 1 + includes/iguana_apideclares.h | 4 ++++ includes/iguana_apideclares2.h | 31 +++++++++++++++++++++++++++++++ 12 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 includes/iguana_apideclares2.h diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 8610f2d66..de6ebd330 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -953,6 +953,7 @@ void basilisks_init(struct supernet_info *myinfo) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" TWO_STRINGS(tradebot,gensvm,base,rel) { diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 8be8d38c3..d7445f681 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -1176,6 +1176,7 @@ cJSON *iguana_pricesarray(struct supernet_info *myinfo,char *exchange,char *base #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfields,ignore) { diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 8002aa331..743ba3b0b 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -498,6 +498,14 @@ char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr) return(OS_filestr(&filesize,"index7778.html")); } +#ifdef WIN32 +/** +* workaround for MSVS compiler bug - +* instead of going on if-else-if block split the if-else-if into two function +*/ +char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *method, cJSON *json, char *remoteaddr); +#endif + char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr) { char *coinstr; struct iguana_info *coin = 0; @@ -614,13 +622,31 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define STRING_ARRAY_OBJ_STRING IGUANA_DISPATCH_SAOS #include "../includes/iguana_apideclares.h" - +#ifdef WIN32 +return SuperNET_parser2(myinfo, agentstr, method, json, remoteaddr); +#else #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" char errstr[512]; sprintf(errstr,"{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}",agentstr,method); return(clonestr(errstr)); +#endif } +#ifdef WIN32 +char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *method, cJSON *json, char *remoteaddr) { + char *coinstr; struct iguana_info *coin = 0; + if (remoteaddr != 0 && (remoteaddr[0] == 0 || strcmp(remoteaddr, "127.0.0.1") == 0)) + remoteaddr = 0; +#include "../includes/iguana_apideclares2.h" +#undef IGUANA_ARGS +#undef _IGUANA_APIDEC_H_ +#include "../includes/iguana_apiundefs.h" + char errstr[512]; + sprintf(errstr, "{\"error\":\"unsupported call\",\"agent\":\"%s\",\"method\":\"%s\"}", agentstr, method); + return(clonestr(errstr)); +} + +#endif \ No newline at end of file diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d4378efd6..dc4d436d8 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -224,6 +224,7 @@ void dpow_addresses() #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" TWO_STRINGS(iguana,dpow,symbol,pubkey) { diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 55f550354..1406a47d1 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -700,6 +700,7 @@ char *sendtoaddress(struct supernet_info *myinfo,struct iguana_info *coin,char * #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_AND_INT(bitcoinrpc,sendrawtransaction,rawtx,allowhighfees) { diff --git a/iguana/iguana_tradebots.c b/iguana/iguana_tradebots.c index 0ece4f0e3..c514ed4bd 100755 --- a/iguana/iguana_tradebots.c +++ b/iguana/iguana_tradebots.c @@ -221,6 +221,7 @@ char *tradebot_control(struct supernet_info *myinfo,char *exchangestr,char *boti #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin) { diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index b9d0a0ca0..6534c2431 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1799,6 +1799,7 @@ void iguana_utxoaddrs_purge(struct iguana_info *coin) #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_AND_INT(iguana,snapshot,symbol,height) { diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 90303ae80..c73259f29 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -995,6 +995,7 @@ cJSON *iguana_privkeysjson(struct supernet_info *myinfo,struct iguana_info *coin #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" int64_t iguana_addressreceived(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *json,char *remoteaddr,cJSON *txids,cJSON *vouts,cJSON *unspents,cJSON *spends,char *coinaddr,int32_t minconf,int32_t firstheight) { diff --git a/iguana/main.c b/iguana/main.c index fcde8209e..984f2c27a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1026,6 +1026,7 @@ void SuperNET_parsepeers(struct supernet_info *myinfo,cJSON *array,int32_t n,int #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_ARG(iguana,initfastfind,activecoin) { diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 267f17ffd..e28a106ff 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -18,6 +18,7 @@ #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" +#include "../includes/iguana_apideclares2.h" STRING_ARG(iguana,peers,activecoin) diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 955acffe0..048165ccd 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -335,6 +335,8 @@ STRING_ARG(hash,base64_decode,message); STRING_ARG(hash,rmd160_sha256,message); STRING_ARG(hash,sha256_sha256,message); +#ifndef WIN32 + STRING_ARG(hash,sha224,message); STRING_ARG(hash,sha256,message); STRING_ARG(hash,sha384,message); @@ -366,3 +368,5 @@ TWO_STRINGS(hmac,tiger192_3,message,passphrase); TWO_STRINGS(hmac,whirlpool,message,passphrase); #endif + +#endif diff --git a/includes/iguana_apideclares2.h b/includes/iguana_apideclares2.h new file mode 100644 index 000000000..952301d89 --- /dev/null +++ b/includes/iguana_apideclares2.h @@ -0,0 +1,31 @@ +#ifdef WIN32 +STRING_ARG(hash, sha224, message); +STRING_ARG(hash, sha256, message); +STRING_ARG(hash, sha384, message); +STRING_ARG(hash, sha512, message); +STRING_ARG(hash, rmd128, message); +STRING_ARG(hash, rmd160, message); +STRING_ARG(hash, rmd256, message); +STRING_ARG(hash, rmd320, message); +STRING_ARG(hash, sha1, message); +STRING_ARG(hash, md2, message); +STRING_ARG(hash, md4, message); +STRING_ARG(hash, md5, message); +STRING_ARG(hash, tiger192_3, message); +STRING_ARG(hash, whirlpool, message); + +TWO_STRINGS(hmac, sha224, message, passphrase); +TWO_STRINGS(hmac, sha256, message, passphrase); +TWO_STRINGS(hmac, sha384, message, passphrase); +TWO_STRINGS(hmac, sha512, message, passphrase); +TWO_STRINGS(hmac, rmd128, message, passphrase); +TWO_STRINGS(hmac, rmd160, message, passphrase); +TWO_STRINGS(hmac, rmd256, message, passphrase); +TWO_STRINGS(hmac, rmd320, message, passphrase); +TWO_STRINGS(hmac, sha1, message, passphrase); +TWO_STRINGS(hmac, md2, message, passphrase); +TWO_STRINGS(hmac, md4, message, passphrase); +TWO_STRINGS(hmac, md5, message, passphrase); +TWO_STRINGS(hmac, tiger192_3, message, passphrase); +TWO_STRINGS(hmac, whirlpool, message, passphrase); +#endif \ No newline at end of file From 3736a2f09f8589b5cbcca89db5ed1232b67f9fde Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 09:03:18 +0200 Subject: [PATCH 257/286] Test --- iguana/iguana_json.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 743ba3b0b..7e38b1ad7 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -86,7 +86,6 @@ cJSON *SuperNET_helpjson() cJSON *array=0,*json,*agents; json = cJSON_CreateObject(); agents = cJSON_CreateArray(); -#ifndef WIN32 #define IGUANA_ARGS json,array,agents #define IGUANA_HELP0(agent,name) array = helpjson(IGUANA_ARGS,#agent,#name,0) #define IGUANA_HELP_S(agent,name,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#str,"string"))) @@ -195,7 +194,6 @@ cJSON *SuperNET_helpjson() #undef IGUANA_ARGS #undef _IGUANA_APIDEC_H_ #include "../includes/iguana_apiundefs.h" -#endif if ( array != 0 ) jadd(json,"API",array); @@ -649,4 +647,4 @@ char *SuperNET_parser2(struct supernet_info *myinfo, char *agentstr, char *metho return(clonestr(errstr)); } -#endif \ No newline at end of file +#endif From be1309d7f39b400659da117ac8320957a6c912ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:19:24 +0200 Subject: [PATCH 258/286] swaplist API --- .gitignore | 12 +++++++++ basilisk/basilisk.c | 7 +++++ basilisk/basilisk_swap.c | 48 ++++++++++++++++++++++++++++++++--- iguana/tests/dexgetT | 2 +- iguana/tests/swaplist | 2 ++ includes/iguana_apideclares.h | 1 + includes/iguana_funcs.h | 1 + 7 files changed, 68 insertions(+), 5 deletions(-) create mode 100755 iguana/tests/swaplist diff --git a/.gitignore b/.gitignore index 89d21bd7a..11b713d22 100755 --- a/.gitignore +++ b/.gitignore @@ -184,3 +184,15 @@ iguana/DB/SWAPS/667293271-3414303895.swap iguana/DB/SWAPS/548227681-1452262678.swap iguana/DB/SWAPS/548227681-1452262678 + +*.bobdeposit + +*.bobpayment + +*.bobreclaim + +*.bobrefund + +*.swap + +iguana/DB/SWAPS/1268007736-526212866 diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index de6ebd330..ba880e2e6 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1857,4 +1857,11 @@ ZERO_ARGS(InstantDEX,init) return(clonestr("{\"result\":\"success\"}")); } +ZERO_ARGS(InstantDEX,getswaplist) +{ + return(basilisk_swaplist(myinfo)); +} + + + #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b0159dcdb..a267d5c61 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1059,7 +1059,7 @@ FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap { FILE *fp=0; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); - if ( 0 && (fp= fopen(fname,"rb+")) == 0 ) + if ( (fp= fopen(fname,"rb+")) == 0 ) { if ( (fp= fopen(fname,"wb+")) != 0 ) { @@ -1076,6 +1076,22 @@ FILE *basilisk_swap_save(struct supernet_info *myinfo,struct basilisk_swap *swap return(fp); } +int32_t basilisk_swap_load(uint32_t requestid,uint32_t quoteid,bits256 *privkeyp,struct basilisk_request *rp,uint32_t *statebitsp,int32_t *optiondurationp) +{ + FILE *fp=0; char fname[512]; int32_t retval = -1; + sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,requestid,quoteid), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb+")) != 0 ) + { + if ( fread(privkeyp,1,sizeof(*privkeyp),fp) == sizeof(*privkeyp) && + fread(rp,1,sizeof(*rp),fp) == sizeof(*rp) && + fread(statebitsp,1,sizeof(*statebitsp),fp) == sizeof(*statebitsp) && + fread(optiondurationp,1,sizeof(*optiondurationp),fp) == sizeof(*optiondurationp) ) + retval = 0; + fclose(fp); + } + return(retval); +} + struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit); void basilisk_swaps_init(struct supernet_info *myinfo) @@ -1091,7 +1107,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) if ( (fp= fopen(fname,"rb+")) != 0 ) // check to see if completed { memset(&M,0,sizeof(M)); - swapcompleted = 0; + swapcompleted = 1; for (iter=0; iter<2; iter++) { if ( fread(privkey.bytes,1,sizeof(privkey),fp) == sizeof(privkey) && @@ -1099,7 +1115,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo) fread(&statebits,1,sizeof(statebits),fp) == sizeof(statebits) && fread(&optionduration,1,sizeof(optionduration),fp) == sizeof(optionduration) ) { - while ( fread(&M,1,sizeof(M),fp) == sizeof(M) ) + while ( 0 && fread(&M,1,sizeof(M),fp) == sizeof(M) ) { M.data = 0; //printf("entry iter.%d crc32.%x datalen.%d\n",iter,M.crc32,M.datalen); @@ -1401,7 +1417,7 @@ void basilisk_swap_saveupdate(struct supernet_info *myinfo,struct basilisk_swap { FILE *fp; char fname[512]; sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); - if ( 0 && (fp= fopen(fname,"wb")) != 0 ) + if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(&swap->I,1,sizeof(swap->I),fp); /*fwrite(&swap->bobdeposit,1,sizeof(swap->bobdeposit),fp); @@ -2527,3 +2543,27 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 portable_mutex_unlock(&myinfo->DEX_swapmutex); return(swap); } + +char *basilisk_swaplist(struct supernet_info *myinfo) +{ + char fname[512]; FILE *fp; struct basilisk_request R; int32_t optionduration; uint32_t quoteid,requestid,statebits; cJSON *retjson,*array; bits256 privkey; + retjson = cJSON_CreateObject(); + array = cJSON_CreateArray(); + sprintf(fname,"%s/SWAPS/list",GLOBAL_DBDIR), OS_compatible_path(fname); + if ( (fp= fopen(fname,"rb")) != 0 ) + { + while ( fread(&requestid,1,sizeof(requestid),fp) == sizeof(requestid) && fread("eid,1,sizeof(quoteid),fp) == sizeof(quoteid) ) + { + if ( basilisk_swap_load(requestid,quoteid,&privkey,&R,&statebits,&optionduration) == 0 ) + { + jaddi(array,basilisk_requestjson(&R)); + } + } + fclose(fp); + } + jaddstr(retjson,"result","success"); + jadd(retjson,"swaps",array); + return(jprint(retjson,1)); +} + + diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT index 0cae93716..7483dbd01 100755 --- a/iguana/tests/dexgetT +++ b/iguana/tests/dexgetT @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"790211d19afd88f00537c2b847772cebe01853617528990e1c1f59eb45d2f1d9\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"3c00ee16d12c6aae81863d1da485cdd6cd2b73847f8ab93de3663adf6c285e3b\",\"symbol\":\"KMD\"}" diff --git a/iguana/tests/swaplist b/iguana/tests/swaplist new file mode 100755 index 000000000..2db29548e --- /dev/null +++ b/iguana/tests/swaplist @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"getswaplist\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 048165ccd..861e71444 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -224,6 +224,7 @@ ZERO_ARGS(InstantDEX,allexchanges); STRING_ARG(InstantDEX,allpairs,exchange); THREE_STRINGS(InstantDEX,supports,exchange,base,rel); ZERO_ARGS(InstantDEX,init); +ZERO_ARGS(InstantDEX,getswaplist); //THREE_STRINGS(atomic,approve,myorderid,otherid,txname); //THREE_STRINGS(atomic,claim,myorderid,otherid,txname); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 7496ccd4b..ac4487c49 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -526,6 +526,7 @@ int32_t iguana_unspentind2txid(struct supernet_info *myinfo,struct iguana_info * int32_t iguana_RTunspent_check(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_outpoint outpt); char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj,struct vin_info *V); int32_t iguana_markedunspents_find(struct iguana_info *coin,int32_t *firstslotp,bits256 txid,int32_t vout); +void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin); char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height,bits256 *signedtxidp,int32_t *completedp,cJSON *vins,char *rawtx,cJSON *privkey,struct vin_info *V); bits256 scrypt_blockhash(const void *input); From 9c2ec0856c6a5294b10ef04a8383d9160ab7fb2b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:34:29 +0200 Subject: [PATCH 259/286] Test --- basilisk/jumblr.c | 4 ++-- iguana/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 67b8c2306..c9a9985bb 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -417,10 +417,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -//r = 0; +r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey diff --git a/iguana/main.c b/iguana/main.c index 984f2c27a..64a0e2940 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -749,7 +749,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; printf("JUMBLR loop\n"); while ( 1 ) { From fc1f04594ece346f62694dcf208c3fb2549bb84f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:40:19 +0200 Subject: [PATCH 260/286] Test --- .gitignore | 2 ++ basilisk/jumblr.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 11b713d22..46e9a0028 100755 --- a/.gitignore +++ b/.gitignore @@ -196,3 +196,5 @@ iguana/DB/SWAPS/548227681-1452262678 *.swap iguana/DB/SWAPS/1268007736-526212866 + +iguana/DB/SWAPS/3111936786-3185288772 diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c9a9985bb..14acbb0f5 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -443,7 +443,7 @@ r = 0; free(zaddr); } else printf("no zaddr from jumblr_zgetnewaddress\n"); } - } //else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); + } else printf("%s total %.8f vs %.8f\n",KMDaddr,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); break; case 1: // z -> z jumblr_opidsupdate(myinfo,coin); From b6ff7cd69c267710f082d43e080cbfd457a495d3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:44:26 +0200 Subject: [PATCH 261/286] Test --- .gitignore | 2 ++ basilisk/jumblr.c | 1 + 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 46e9a0028..5ddf8df3e 100755 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,5 @@ iguana/DB/SWAPS/548227681-1452262678 iguana/DB/SWAPS/1268007736-526212866 iguana/DB/SWAPS/3111936786-3185288772 + +iguana/DB/SWAPS/3368214189-2405641584 diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index 14acbb0f5..c0c7defbb 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -424,6 +424,7 @@ r = 0; switch ( selector ) { case 0: // public -> z, need to importprivkey + jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { if ( (r & 1) == 0 ) From 0d519de47952f92c9f01d541d0e2b594ea27e309 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:45:36 +0200 Subject: [PATCH 262/286] Test --- basilisk/jumblr.c | 4 ++-- iguana/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/jumblr.c b/basilisk/jumblr.c index c0c7defbb..0710007c6 100755 --- a/basilisk/jumblr.c +++ b/basilisk/jumblr.c @@ -417,10 +417,10 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3 char BTCaddr[64],KMDaddr[64],*zaddr,*retstr; bits256 privkey; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); -r = 0; +//r = 0; if ( strcmp(coin->symbol,"KMD") == 0 && coin->FULLNODE < 0 ) { - printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); + //printf("JUMBLR selector.%d modval.%d r.%d\n",selector,modval,r&7); switch ( selector ) { case 0: // public -> z, need to importprivkey diff --git a/iguana/main.c b/iguana/main.c index 64a0e2940..984f2c27a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -749,7 +749,7 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess void jumblr_loop(void *ptr) { - struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 1; + struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; printf("JUMBLR loop\n"); while ( 1 ) { From 30ba915e3c81adbff3b6cde6e48f6cb220676f8d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 17:57:54 +0200 Subject: [PATCH 263/286] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 8 ++++++-- iguana/iguana_payments.c | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 5ddf8df3e..0ef4f1eea 100755 --- a/.gitignore +++ b/.gitignore @@ -200,3 +200,5 @@ iguana/DB/SWAPS/1268007736-526212866 iguana/DB/SWAPS/3111936786-3185288772 iguana/DB/SWAPS/3368214189-2405641584 + +iguana/DB/SWAPS/1133671270-1840176506 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a267d5c61..d308fa770 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -948,7 +948,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(0); + return(-1); } else { @@ -981,7 +981,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(0); + return(-1); //for (i=0; ibobdeposit.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit.%d\n",i); @@ -2401,6 +2401,10 @@ void basilisk_swaploop(void *_swap) } } } + if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + retval = -7; + else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + retval = -7; while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 1406a47d1..0517b94a3 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -175,7 +175,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co } if ( iguana_RTunspent_check(myinfo,coin,unspents[i]) != 0 ) { - printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); + //printf("(%d u%d) %.8f already used\n",unspents[i].hdrsi,unspents[i].unspentind,dstr(atx_value)); continue; } if ( maxmode == 0 ) @@ -441,7 +441,7 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS } unspents = realloc(unspents,(1 + max) * sizeof(*unspents)); value = jdouble(item,"amount") * SATOSHIDEN; - if ( jdouble(item,"interest") != 0 ) + if ( (0) && jdouble(item,"interest") != 0 ) printf("utxo has interest of %.8f\n",jdouble(item,"interest")); iguana_outptset(myinfo,coin,&unspents[max++],jbits256(item,"txid"),jint(item,"vout"),value,spendscriptstr); avail += value; From f34ec10c5e1d62bba40a102d5202d1f5bff7c235 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:03:34 +0200 Subject: [PATCH 264/286] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 0ef4f1eea..a4577a1fb 100755 --- a/.gitignore +++ b/.gitignore @@ -202,3 +202,5 @@ iguana/DB/SWAPS/3111936786-3185288772 iguana/DB/SWAPS/3368214189-2405641584 iguana/DB/SWAPS/1133671270-1840176506 + +iguana/DB/SWAPS/467927158-3437055573 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index d308fa770..88b8e0ab1 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -948,7 +948,6 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(-1); } else { @@ -981,12 +980,11 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa } } } - return(-1); //for (i=0; ibobdeposit.redeemlen; i++) // printf("%02x",swap->bobdeposit.redeemscript[i]); //printf(" <- bobdeposit.%d\n",i); } - return(-1); + return(0); } int32_t basilisk_verify_privi(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) From 9ea07805b9cadf33dc4c5d2010e7cae564ca88a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:05:52 +0200 Subject: [PATCH 265/286] Test --- basilisk/basilisk_swap.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 88b8e0ab1..db02d82c1 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2302,7 +2302,7 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee + if ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); @@ -2351,7 +2351,7 @@ void basilisk_swaploop(void *_swap) { sleep(DEX_SLEEP); printf("bobscripts set error\n"); - continue; + //continue; } } else @@ -2389,8 +2389,8 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) - break; + //if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) + // break; } else { @@ -2399,10 +2399,15 @@ void basilisk_swaploop(void *_swap) } } } - if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) - retval = -7; - else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) - retval = -7; + if ( (swap->I.statebits & 0x40) == 0 ) + retval = -8; + if ( retval == 0 ) + { + if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + retval = -7; + else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + retval = -7; + } while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { sleep(DEX_SLEEP); From dd3203147d424c039ccd5fe64141018b5f9e64f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:12:46 +0200 Subject: [PATCH 266/286] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index a4577a1fb..ad22f0cd0 100755 --- a/.gitignore +++ b/.gitignore @@ -204,3 +204,5 @@ iguana/DB/SWAPS/3368214189-2405641584 iguana/DB/SWAPS/1133671270-1840176506 iguana/DB/SWAPS/467927158-3437055573 + +iguana/DB/SWAPS/270159951-1269722638 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index db02d82c1..0f46cf827 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2249,7 +2249,7 @@ void basilisk_psockinit(struct supernet_info *myinfo,struct basilisk_swap *swap, void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; uint32_t channel; int32_t retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; uint32_t expiration; uint32_t channel; int32_t iters,retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfoptr; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -2302,7 +2302,8 @@ void basilisk_swaploop(void *_swap) myinfo->DEXactive = 0; } printf("C r%u/q%u swapstate.%x retval.%d\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits,retval); - if ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee + iters = 0; + while ( retval == 0 && (swap->I.statebits & 0x40) == 0 && iters++ < 10 ) // send fee { if ( swap->connected == 0 ) basilisk_psockinit(myinfo,swap,swap->I.iambob != 0); @@ -2351,7 +2352,7 @@ void basilisk_swaploop(void *_swap) { sleep(DEX_SLEEP); printf("bobscripts set error\n"); - //continue; + continue; } } else @@ -2389,8 +2390,8 @@ void basilisk_swaploop(void *_swap) printf("%02x",swap->myfee.txbytes[i]); printf(" fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); swap->I.statebits |= 0x40; - //if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) - // break; + if ( swap->alicepayment.I.datalen != 0 && swap->alicepayment.I.spendlen > 0 ) + break; } else { From f41db06af7a50168e336a979e7b4b7c572c193a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Mar 2017 18:24:30 +0200 Subject: [PATCH 267/286] Test --- .gitignore | 2 ++ basilisk/basilisk_swap.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ad22f0cd0..593be70c7 100755 --- a/.gitignore +++ b/.gitignore @@ -206,3 +206,5 @@ iguana/DB/SWAPS/1133671270-1840176506 iguana/DB/SWAPS/467927158-3437055573 iguana/DB/SWAPS/270159951-1269722638 + +iguana/DB/SWAPS/244991424-1008712592 diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 0f46cf827..9b3abc4d5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -2401,13 +2401,22 @@ void basilisk_swaploop(void *_swap) } } if ( (swap->I.statebits & 0x40) == 0 ) + { + printf("couldnt send fee\n"); retval = -8; + } if ( retval == 0 ) { if ( swap->I.iambob == 0 && (swap->myfee.I.datalen == 0 || swap->alicepayment.I.datalen == 0 || swap->alicepayment.I.datalen == 0) ) + { + printf("ALICE's error %d %d %d\n",swap->myfee.I.datalen,swap->alicepayment.I.datalen,swap->alicepayment.I.datalen); retval = -7; + } else if ( swap->I.iambob != 0 && (swap->myfee.I.datalen == 0 || swap->bobpayment.I.datalen == 0 || swap->bobdeposit.I.datalen == 0) ) + { + printf("BOB's error %d %d %d\n",swap->myfee.I.datalen,swap->bobpayment.I.datalen,swap->bobdeposit.I.datalen); retval = -7; + } } while ( retval == 0 && basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { @@ -2420,7 +2429,7 @@ void basilisk_swaploop(void *_swap) } if ( swap->I.iambob != 0 && swap->bobdeposit.I.datalen != 0 ) { - printf("BOB waiting for confirm\n"); + printf("BOB waiting for confirm state.%x\n",swap->I.statebits); sleep(60); // wait for confirm/propagation of msig printf("BOB reclaims refund\n"); basilisk_bobdeposit_refund(myinfo,swap,0); @@ -2489,7 +2498,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 { starttime = (uint32_t)time(NULL); printf("statebits.%x m.%d n.%d\n",statebits,m,n); - while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+BASILISK_MSGDURATION ) + while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+2*BASILISK_MSGDURATION ) { m = n = 0; sleep(DEX_SLEEP); From 656bb007865314aa7a36c9004f121a9d8dfa1f1e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Mar 2017 20:08:09 +0200 Subject: [PATCH 268/286] Enable curl --- crypto777/bitcoind_RPC.c | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 18ebe16cc..e0d7fca85 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -14,6 +14,7 @@ ******************************************************************************/ #include "OS_portable.h" +#define LIQUIDITY_PROVIDER 1 #if LIQUIDITY_PROVIDER #ifdef _WIN32 From d4e01f4b8d1cedfa5f89877cb2dc55972707cd20 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 04:26:16 -0500 Subject: [PATCH 269/286] libcurl+openssl for x86 built (MSVC-14/VS2015), updated makefile and bitcoind_RPC for header/library Signed-off-by: fadedreamz --- OSlibs/win/libcrypto-1_1.dll | Bin 0 -> 2105856 bytes OSlibs/win/libcurl.dll | Bin 0 -> 320512 bytes OSlibs/win/libcurl.exp | Bin 0 -> 8337 bytes OSlibs/win/libcurl.lib | Bin 0 -> 14376 bytes OSlibs/win/libssl-1_1.dll | Bin 0 -> 430592 bytes crypto777/bitcoind_RPC.c | 5 - iguana.vcxproj | 8 +- includes/curl/.gitignore | 4 + includes/curl/Makefile.am | 53 + includes/curl/curl.h | 2551 +++++++++++++++++++++++++++++++ includes/curl/curlbuild.h.cmake | 197 +++ includes/curl/curlbuild.h.dist | 586 +++++++ includes/curl/curlbuild.h.in | 197 +++ includes/curl/curlrules.h | 262 ++++ includes/curl/curlver.h | 77 + includes/curl/easy.h | 102 ++ includes/curl/mprintf.h | 50 + includes/curl/multi.h | 439 ++++++ includes/curl/stdcheaders.h | 33 + includes/curl/typecheck-gcc.h | 624 ++++++++ 20 files changed, 5181 insertions(+), 7 deletions(-) create mode 100644 OSlibs/win/libcrypto-1_1.dll create mode 100644 OSlibs/win/libcurl.dll create mode 100644 OSlibs/win/libcurl.exp create mode 100644 OSlibs/win/libcurl.lib create mode 100644 OSlibs/win/libssl-1_1.dll create mode 100644 includes/curl/.gitignore create mode 100644 includes/curl/Makefile.am create mode 100644 includes/curl/curl.h create mode 100644 includes/curl/curlbuild.h.cmake create mode 100644 includes/curl/curlbuild.h.dist create mode 100644 includes/curl/curlbuild.h.in create mode 100644 includes/curl/curlrules.h create mode 100644 includes/curl/curlver.h create mode 100644 includes/curl/easy.h create mode 100644 includes/curl/mprintf.h create mode 100644 includes/curl/multi.h create mode 100644 includes/curl/stdcheaders.h create mode 100644 includes/curl/typecheck-gcc.h diff --git a/OSlibs/win/libcrypto-1_1.dll b/OSlibs/win/libcrypto-1_1.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b16b67beb62ca7cd458589d695c35515d73e4ef GIT binary patch literal 2105856 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 z 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˿|emJ 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�fP?c7=+wdUZ~%97Ktd5=Do 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\iG zK)krK*`qC%9hv5m&ba6?!&Y|zVAW7zSdDmV1)j3tL_#^fnPb zJxFh2SzgBI_IawOYtau1Zs;ikpkEk12U=bk}D>UoFtrOkJo& zpfCR7%j zb3`?zz%~^l7p1DRm8#l`JEsg%)s&LXwymkE5~^CsA@B5xDuHnvja!_mncx4|UfS^=6A9hJbE8f0Icu{Xs=Xk0)x|n!msCkCnYUIY z3CmM!DC{g{r)w(9dsc9`b6fVaLdc4ZL)D3m70*nS%PSx?eXVBy4VEDcxmIaw2DBx5 zmB!DLzeRKa=a}EWrIH;i%vZcgluF$RnqD?{I=|V-&u)BMR7)ReL%9o4YTgr}G1*F1Of+{W_*o*Q|F4UPXRKka&Fe~z9(CKYM}g}o`r z4Y4c{Yy1k_KQb{ z)O@7>ZnpA}Vhn3as#05NYt$?uYIKMwV~v{SMU9%DPODLKL$>&hnhiA@Rg2r*0EsW| zc~3^$Oze|i4v|{ylrfHV-&9s2Oad+@>Mw&yq%v#NY~RX_^B^0avKhf`f;A85=&#~S z-2UPs(}xl*A0W6XD@oRZ3vt8Gh7zN+ zGRmI{bN?pAjLf@OO$KTnWq?b?s3LgV#>!0h{ zDEc9EpRf*e(5yfj*yXvfEDqNXtN)zwY<9v_D*UJLqOK|NLrOC1rc&ev|K0YTz|wL< zS76iLP@>*SdGY9rI-9G+G@x7WNfU#S4;OFlI8P=QSN_8ZXF6NhfdOzsVS|wDrqhbw zbe{D8{7Gk}|K}@zi}fYsPo5~_4i54+nb$NxHkIH2K1Wlnc6rqZPj=_^6C5SIcS^y>>Z}xY5T_7_HhFGC>MRHvgHi+ z>`ZY#gxkfET)8v*@C>>$Jm%n(!x>OMV&<71NWTm+=8iZh+<*5-ne}?%tcAjM<)w)I zLVfW_6uO*KOUl>vz7#0`qa0xI)U00gqMv^?y}d7bYMyb{_P(@7&DupT6%=qT_~G9E zJ!&3y9w(B}$F~Y4?IY{@C3_qHYI=(wB4l-Mzqf|7Fj)@6)I39lH5`rEHkC6#r3D3> zdN=wO{bdtx<^3pcdN%?hbH$>UidT zsJv|~8lc7dtur=YzjYhS`!$EN#R0N{f}VnPuRCu$YZv_$x+$XpsPW3*So9Yub=_+= zO@I*RF-cuo(ED1jeBGkI6#!H3E4xd4j}Tn=u9lTR^G@&UrOxW|@bxVZh63pqPjcQ` z_gZ=Q-j)@ifb&#&xLe4OIu0PmqgrF>q8Ar3;~|1zxLQEvy|0u}*`vMvezNzzwwF_P zeamVH``3^64g|{U?rM3MYU;XM9-_oYNh0s7cz+C-@Bk$Ed7kcjWVCR;-iHt98r5|s zH}r_&Tg_kPiWHEw=$%fm=U=+YomI9W@f<1rkNg5Vbc;fNp>TjsUK;Wr@+OSjM#)

xL;*EZ~t;(4?~hH@1)PoRVNSXFESC?*>6R| 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%0DnA|6la{%b&+|%;giguWA6y4eeN;@QKId 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%0A$D~teF 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

4bWe?C8ej@d?k|Y!gH}!up9!cy_L=TpNrm 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�aP*i%edaEi<$%o9X z#l{ayAcXF(y*Yr6(@30rm9T+aH|t35HeanW3193s&I%L0N|~JUB4xMR91G4x*zQ#J zm16%b9@S6y>0M94-)1+qQuQSJo(bQBxDJ!HK^MbM!h~*V7fx7V(l!YX`*C@oX%BGC9*TAKYaM!1#wd>P@OC-#@K0A?4XsOTrCGN-X zs=U8R)PMX_pVSQPNkVgkZj5peu! zT4yt7j;lMbo~z_2yExvEhdDlp?}j+W@Qw=WX(YvGVb|J8=Gt~14Uw5vSDW=9-#Yr2 z0*vgRx55e#c}umzbURp^ux!Gd`?!e>$RkYlJ(IKoD|wE;vz3Qj66EtUc_o`uMT{9w ztb<20LsJXc)=Rla+Klpz7w-u>x{~zy%y#@;ybLb6<2zUdt@y;#&Uq8=`kXfDA}|Nv zGW$z9jqvfX6{dM}68>xb7oM(7ciSC--^{z{n-fO`VbSd0r_*&x^Tct?3&&~R9||$- zHdyeUCv0N28^=^H9Q8BYbV%MV-lblhbOaH0;A(e2VY3&GDB>kA{Tt7FVmlLuwEJg) z*Ku-}c=x5JR_$Tn7g4VzbhGK8kWJjcQG)zg%({77(1N} zrEv|FoyrvQ&e=Wnf0b9~GSjJ1`NdI`iJh}2NklJeuMPa?ViRYIHOD7aJ)0wAJZrbq zh+(m=&ZPc%5F8mu%8!!4F{QT)Bo=&Y9v6>S;4(hKe_ccGLE? zyG*;`4;a8$aUer^Wr5a=Q#Ti*C_xq%%$sl8jDn&bgY9ZpLZOYgBc*S;$vp;JB4<`@ zkHKQqd<;G~eA9{rwaSF24d#;R66zx_KrmWdF*DZ{&0STpy!R0H5iMc*IZ%CMnEUVr zO81pVwr7y(Zx!g4@XF{>Q;nK*HE1~XS!8hK)0lHnFfiP(u zKw%v5&SEJ5kFqFimD$ofw_kNZq3Rn?=lFU-pv=f1&T57ev5E8>9eh-EVR5yi)#rMI zzKuy)<$nu%x8R&ePx;Z1(&uuH{fVwfpG(4YpDSgmXMbr^u3IkzejD%JI9?*G7yTdI z=UVH9W1km}%KBW#fjLUQTH`q3h2sqI&hNhJ*ZBK=6KAL}ppS!8#PB9ddX9o-#ZGKyofJ^MET!{jawPB}%6?hAI-ob@Qm z&NZAcBE0sYE{Ia)|UG>dqD~ zbfvo~>dg+IZ^!H3r1KDD-_(`K2>m^0b$Qhuy+MH%uOu6~=JS$7@7HU)DJiCGxcRZ*-Z<5iCs95&bFn>H=)P`(H!uE1GQCMbM1qJ1M z?kz7iD~vFw{XI6_(`JPe@5JYP&dOjO178JwR{2m=FjBS*O-@OQfK!mJevuKCv`Lxb zP2v8gA8x@qzo)Gr`}Q(z&-K_`9k3<5ouAI*KS}3`XlLWlxb$7m$LV=Ehfk~RAH{r^ z%;~EnWAfQa1q;lFp?I+>Tde$MDKqnVQgkEP^pjQ3s!yPv*ptQWFDs_c3Z)N}d5wCG zlD({PY)U3Gr{9j{@Z=H9ev7PkEG*5&ZAtGDNa8cIxkm3zWV0Q zv1qqmjVLz$ma^!0ymHmMj`wMs^iTf^i_NnG&I{X5J14VRf^l0c#30%5^P?s6{i z!cn`#lUJ>H7kEi4Ke-1G=CpeUy>Nti;ZO?AT$kkr64;i3xGBk$NV}^aC{e zbu&sCF_uo6)elmD6Re2~=%JrgSj=vULRxlDY*7(jvetlAp-P;ss5aA$9upDgPHRFk zeg*{2g|=JK7)~sRPe_T4j8;jFf}$xIY+Py^7BgLbfskavC8aJ$&gNcwyhm$)Org&S9O+miEq2-YE_e!D zcGh}pPbr>Z&XOC(puV0urXrnx=Cts0-QaHLCs^O-|7p6aq!V3Wi(3!d;>=2(SC_Z& zE4|Ya69^XL)YLv$9vS{rv)Xt_h4k z&rv+r;yH-t7%ur%O6Ok4CAN^)N`EekrsY|K zXFYcrd#NDa`E7TM_u<$r8Nbmu$_bM`hRmG^9-(nLVUm}?2m>#G&#DUbev){}U;obX zUe__ko-)hRPSwBGecsY~;)Fl)YsHmK+`psI1&o{>1gIpS$OGsg;(L{YJAJaZyAU$^H-Y850G}YGx!Z&5bWv!57d46B{ir@+_TH zxfd5qXE4o8J9|f}Em*)|r<0>SZ=R z+%B~`R^=CKu|T}?6)g&3GK`{^?&g$&RZ;c^9+jgMnw&*5oLGn>8<*(@Y!y(?4~Jgm zYulUk^9_@tpY{4KVhw@b(_L{UiN#Jcb6msFJt>z8^J(*Q7(cQ;>uyjGhVi7sug(gx zZ|SRB_@%G%Y+DMen9=`fI;XAmyWZ-1f=b$uiaDOPR^n|UF7lvUx1yq>WavF@Omf8V zXcN%4%w;9h+{-sTu(@tD=~!)r3XS5!<@B+Pffn61NxKqA8nMm#*N^ve_=GsyqZlhp zSS1Bn?u8?T_$3ws$upbx-n3N`CTS$BgfQvnOPJ&@VGA5#(q2f|YQom@-7RI1ce&OR zCjOF=R@w^*+eX+!W6UsVyCiI%1D~|<5_X0#nXi_#wXLuVlGZW)dYJOmAx?e*<5%w4 zmb!S?=fFw*uD`*vK7)u?iT{UxWTa6aKa!9VBc5ey!L69!2(^!`X&Z5?wS$#Atzc%I~~Ore0Wapi=BY`sJ0&hZG`cEp5bIp6$d+4B3B^PVnj9^7-y|Lc#>!8p53Y`qT3~ z?elu#1y29O7Cq_c*9Q`>)jc5v1h$2x!V2Q8qni_D>?cvDmpnbDK;^MePPVh z?m1%lwwH6T0J9ML@|_*XEXFfUs(#M-G%LvXrR~M*V)=iW?u^yQT`a$fdpzq`)ACR5 zKIL?riF22g?^Vq&UM9&S@xc~;K@V3>L(KJ;DVfmivef_ah2|KNZkMH=F$0f?scj^v{G0%toeccMK!`oW;t$)V1e(67(OD;LwjFp#>_Of+7Fhp85 z{Fi-jR2wbu=7BeHd`y;dOrjgm9p^bJlxIN-9X`A$%(B<#m}6s{6Pi<|#+YU68hMbx zITauXtY6F$({_oR$WLTv!D6qq4!k>MCzUiBUee_8?$k%Yv4pTQd^c$MJMD#IE%B1} zVn4GCnl~m?Vp78R34EL~%&CUU3$ujfaf;(^hMTZzeWA%=6=0?{PZbmc=e4B5xY;Vu zVTUiKH*MuRTliIQIm5LsOIX}Zp1Lf2m}-S-KAff8PF^k`-igooY%QtOV}y>s6O^CAM7{~S4w^82J z_8*q|ePdNlF>4hZ=sX^S_O^`1Sl~o&VG&0Dd8+uj>7N)$}a|k4Q0=>7Bj_YYgF-c4)Bo>a9Z=QOd-m~J$jau zyadJymAqvz#fgNWC<_Dg@%gja&((ccZbtrW!`zcICy%yIk{bnC#Y{=suZB9qio?4& z{MLz9oioeXJktv;>{4Y?L*m~j^ZjBdWei39-NpY(?3}cB(w`Ao*ZnC#)X%q`Ak=DN zlPnmgpSTrde3oGNrJugIPG~qE{Kd@lTKHE1Bsy@MwP_l@visq0$VaY9ew|kNwnc%2 z3C&vfN>+N>kuc(&sPuXqt&egK2j>0pZXDaaa720GaN_fRzLu>8B}|WlCXZ(aOzVSL zj_X$M#G^Z7&0QLp8DdvAwUP7qZVH`@R$c`jnKKGhqm1tUgD;QE@^c*X)fcSJWcvBa zc_Mrz&gP zU~-h@<)L+ zY=q z?psP)D-06MrG5&v174%mcm>|pcMDF0$MQZhDRYLG*r(Ci^a{LEHFfr!RTwJ`!_geI z$3dMI+s(C)iDQxy6Oz@Au>vlzX*x_ca^NTXr{)&wJ#-|*48uQ7Z~ts$=F1+QA>7;> zy70mtpm-7ov(Tr6`OzXrBseSsXb0MJl=kkb76AfVYVPlpAyWV>2EvUauH@U?>->0y5}|TF32bLv4eS2u>>1b%%+Owu=J=GWKB! zmf8x*y@`%HoH8o%u&|XJ;_HS})#`zqQ&)4Q;1`&~frpN>5mdgiDOr)6f1%IhH8-DP z8`~)=UjFFqo|LaQ$1!+@DIZ}4tKqDp7p*hyRFsXwO{aMRo*C=T!*Upxvj;tJ<`zoJ zOed0D&k=DxjjF>2g4wpQ8n#;p$GupGT}rzGGSjk(;Y+UlV>`6&5%P&EQ0Ku^tR5P zDYY+}b0b2N4_12VFzW3rFNVVE1G#2R&B?b4YiDZ>1IdPiR^d(b>aT5NumElgA$!T` zGdeKqx;i|#aS<5$J*L;7#GB`1GR|b_tt+EwN~w1FRrzZeTZb*$e8L?{=2))fa_WYB z4>`9F?VMcK@IE7Q47+&c8M#KjF^zp9I`bCD-yqJ69B*_p1{f|Ye|;+jGS`@{Qsr>Z z;k|^v*+5P!TB@cJ>yfzEt3+vzasEEEpF#m#^p?FKA(+{Z?V7r(mR^jAmwJfem}X( zd_Ng!rIY*FzyA7Oh7Y(m>Sucih}%Y7szm;mzv?5}`K3Q;jZs&4@yRO5e~J21 zvP&Ge#DPm3xWs`=9Js`ROB}ewflC~?#DPm3xWs`=9Js`ROC0!roCD|jGwAaF^IuYO zRPvD#uT~j7=~T>JyP~`9dG@98GOWXSsj}RvICXLc>+#Zpf`U?`a*C&w6cna1^oyrY zUMe2Frl&xU;I!bLh1r?HO5x}=3{J@SOTQ>C!E@>7%YiSgIh9sp+p2Y%$C(b2 zYtwW7M(tnxjj4Uw8b>2oQ`-*z^bEuJr2})AU*i{wqus3joPUtWegwKO-%QAa;CguSN7g`aRd3ARL-^!A#zHvuyff}$A>9S=u%Df=)y4S;%qX$XpD~4* zAJ(ZFN$f=WP7-O`bLLJL!x+)VFuo2mjF&run|om(dkS!Efrc-^cc`sla0Y`hyCd^O zq<@|nDb^ty^LQ@f8b^MA0LxwlMo^|@6k)^I^l}7z`MiZ;JOkgh zh8YI?EgQyY!+5hV>sZ0Xx>MuR%kd=)f(H0BI>0cVV6qFpQ{zpZzai{)=zeX0VZ4`u zPhT(m#3|n^ggtW=Gy>a@JeE&1jJL?=AlLL5^5Xt3JdKGq49;vYeg<|k&mT8oO&IV2 zlqndv`{7r6+%s;R06)h;6KVPrHWC__knZy&=moZ-EBL7QA=JZ4p0j!GLb~sU7{)?q z`*|Qdg5LR*r5Z33srzez+rs7F@@isk1Y7cp=AAPwkI3gGe|$!Hf5OE&7?DHncX1V<7vJ$d6khJ43@?+%6}-QI{M>V;VeIEV4H}MY^#?*(XiC6w~P$NM^i8yq8f{}I~WqulIQX^exeD=5=J_;Mfh z-WYnkOBxXTP<2WhXT45#5?E%NydnD@ZLx=ADQYQva8dD#2b zID-6~?jZX?AeU_nHpZ=D{ECd698<+;4L>VJS26lbMlLAFf^cxOf}fQ6w=n2LKE6d} zqT$2U8OS;58%;EfXQ}g0Xd6aZ_fhZ1;onox@lK>+)b)cWl=lz#)w(ZwJCHm{69$c= zpyL+kKMMUL;6XR?c^kSKAX|??cO%Mk4RmZE{Xy#ad+P0J;@cr3ugV3?`{-pxFgyjv z!uF&i?~Twuhq88~Jab7mi}z>At7-x^3;O2vCx7T00In^-6vFe#$l6cvb}9OIGxZih zods~6gsv6P(3>4K;{c#XX9!xzyLg)X_%ryPWU`x`3DZn2L;C20vtF z#%6GC0{#K=yst6k=F0U$CI_G&l;gUV*nIMSk$QWXxIAFbgKq}+XW;qez|=(V!pP@t z(p?4KUyz+*c={lG>_9mm;aW$&k>u4Bnty|?Q`Ge#(o}(8!zoL%ZpfL?g$-#-KBwV% zDg3;H_=&{#quPw>2yaxH>SW$0x`!uOKL+N%xYO70B_pUyRc zYa6ug>0lUrxi5mIja<)9#2%8@aO%3nmDCw!na_17#W2Rg_g|plBhvJsJeP4jgS=&P z?}-f70jD4LgWUI0rXA4n8#1<+_no}A0bgD4-waJ(!?UlUr|US%F`hW^#=^q^l&L*e z5HeDax*SJ%FJxsb{JOdqb_{%PPh1U^1O znq+YABR-$^BZII(l<{Y9Hsbvxe0vt!2J(C-a(_2``#b}__Jm*LS%>QKou1u~;Tmj(OLtTy}zvoFa8Q!lLMjMGNJO%G&PQjj1r>D@JOzLlH z8^ah3z2l&%2>eN{C@W!0E~8J9j{WBOKo&9tU9V>%+daS;jBHVF+u(f^{98hOU4^_Y z=?D)9Ps0XHht5^tzYF@yxmO2wIL}W)*E#6#3GC(2`UAAqg>NglzsR+K>o0JPkHv;V z(_-rD2Jrud{2qqpZq!RP=vWDz`^O+lli8088M$L1az5XhdTUB&pGS?8w_jodP z4_Zf4=H>8f12~UmVZ$iv_oSHyjvImP09|9L$8Y+PCo<8Pu-kdg1NYh4Wz^R$u0hZ- z5u6W9LFVAyR_b##*Yn_yN8Wz9n(|N=X@f|^l}))<22zjEd;|PW;`wLNzec`aL2qyB z=L7f=0`7^>v$`|#%Dsf^F2cj%?T2IN+h$Y8)Z=98ArYM6z}?b}b^xA7@ZJe{e`tP( zG>Pf(8+?1<|24?RioW22*M2-VrJfGJqixW;cr@i9ZWJ^{J zeodawQ_jW6oA{PCCT)M@Z7DLejqooi%e~OB7<`$8b%L*_qUehNw|X3W8i0!UbzeC7(-AMQfpN5kEJJ8k!zLg?h>xsJ)I!J zkA`n^sM8-v*BV;ihPR!l$LFc@0LnX*utdr{qzif~a`8kJqbGLr!Ljr!$n#NPR zf%b2z7!_x#7_M)t7~$~pLGo=6pUc0mV$4HsW<%==u3??fBkJP^%8&x>eUO9aCQ*KH zT)?(00)GR_Ux&C+$XV@p^ay-In$U;feI{k>-jqHCv^@+T-$ZXFAxB5kX#XZ+58&sk zlsgQ%kHd>b)L%U1-5LNq$qHqXGCv<{&%Z=tZ6GY7HLfeF`1~fa@%L z%LFcjbkoQ$yE!@w9huZ!0eO}J_b9xqOgi=q&(~`Xtal(Yj__< ze($$Org%P2oiytNzgwd7l&2YSS5oHRz;~ACeB$0GE*`nu4Da6u#|Ol30B2Mbb)1T> z@m{?JyyyA50oWjTG$#^0gWr!(A02qUx<7n{f1i*?4QMGDM*V>+2pk8%dl%`8ke761 zcGV=>Hp&$5k4>XaU!**%Nk14q`bk-_A4{&HUco;b{cR8YQm&okb2mIa3{F=H^+fu^ z(7p`#Wax@RPHU2H6ycAIqn{1@EgeY%kGqFc7r?fK-dya?Ug(JfHWwbuCeItGyN}2( zhv(YlbpyDrBHfeJ!3UK4a%AY;LG%x~*T0fy>gz@5T?C$iLy;@O`XU1p$nytqJx4vi zO@681{F<=1Y}$4Bcr9^T+aT-h=`Vt>bpU%jB7gB$(0)vTUzFnlxL)l`zm+nib3Z+S z_Ocgt5q@?@e&2@w8=&uY=$n8(UI||V(&_gAdyw~Kr27Kg4T9h~_1^^^e@fllggv~U z>qGJ!91X9Lp>&?hq2;@l)CGL|6I}U}XBc((F?<+L+FpG~kE|`=-eWW}7>2x3*17O< zG4~blcouwkjQsmTM+tIw8}AjAbt?CA=w1X(A5!-nJJG+OoLQv(k$PN@yfhk4`$c(P z>w*m@@ArG7OUOh|WZ(mM(*iuRi9Zld-y8niNqkj!zn!u+4n!X)Q$`152;G=PJ`K4C zlI~9GpiNukfiw?7=X~hXFZb7LcI_;71PE5a$FzLWNUOS0vyorF0|hP z&AX|~iPX^&?zd4t(ePj-X>I|>lh77Oo?k-4Z{+dt)%4ro^-^$;gT6_bzySL!Jh=+k za>_TCdb<+-R0P9^-pDU?{OC~R6?|X8s}}|$6I=&K^JO-0lsDW(zm$9rLFeu1=nU{f zkf}6uHk)e{w6_HJ_?FZ$`45HO`B$NzgXnuxFSn0H*83oX$i^SU{Y)8uhn`QluWLp> zh&sO(+DAZJ&osVW`eEPTRZsGNt12Z}3)tn{ zZy$~>5cXmp>W2DQi_CsP*hysVNOS1p{xUZIMtJZbb$&JPOW@^)*!pIqPe8xRDC-XJ z-_E@nG&Vv9Z-b|M$iLboXlg^9!Oz!#=>-kn!NZ@)>(Ly(xyf&QZ}7s8J1JK&dB#9n zVkdNtx~)J~B9NP(;B}WEWSA=)zPv&meFk4|#+GzQrM`xsljM6N<#-UhN4OH;-Le+& zm%93xc48sd7k=;n+_~^OfwB}+zq`P(p)WLXm4Wwd@(4vnQlaBr;v0;IC*=Puv|m83 z_9Kt|sn0#c$8c{&y>}u1`?|wR;QE5U2l!tYhMrOnH&P!Bp}7%!egmG>0H&05Z&Nqf zSS6p&{W+1SK;N`!-cQyIF0uA5sT+ocR2OR#B;1Tb|;OGxuXJtSq zd=E=O$4I}OGR9#aekPx{fqMcvzktVesOSCg>NR-lN4_6`ht4t7>Ye7 z&jjS?GI)ArB=Xggz8my@$aO9e`X<0H;M1VvRm#+ly1Rw@Sgz;c`Ss}M{vOm5^sE7Q zWA0B9o{n7n1`Xk)-AnaqH1zYPX=2z7$a^+rAp z!-J>eNl&^CTq(#!OWzpF>za&#jUS8W6?; z;l*<9Uu9x%sFzU6oJiSU9SL1r19`pzp6ug(%`p0QJny88J&7wLEQY$T-xWJRdA~(& zSCRJ$==vI%e$?3$+_yvDKI-N;{I1#-dkn4jbG3&zvA{2f2kW5MpngAxM|tq=6twK+ zdEC{MfpTwv2i?hQ3cPC${y*V+J??Q_&B*%$%5~m_?QKQ7jST+*d@0YHNplZ$?cqKg z+3QT$On}=p^iWbn>QX_)k4u&U+)S&E%Iy zITj-`4{*PNs}VBjM_KP9ua7363&>no>Z5%WbwSu~k=S4GtfJiaa@|gSeHwzC4nc<~ zOY^?}7e)6S|5Nn_0Q~Mxkp}IeMMEhoGO|a62-$l@R#usnq-0f!2pJWTqEJdn14%T9(eKVlq3%lCxB!=hZu%O&LS=hc?&itPzx8}OU`TFtsm}5Q5``N(w-n8DPnZHo|G!|=P z-yL-P1?Lqo$CbMU7LI+mkvxd6qvPl5Z)+>-L*HH6sSULj>-$G-{c)@D>8p|N&or)j zh1}aOQseS**gPCIhC@}=h1bhmSJYU>>-#e`v$~CWlaIRMU#Y!(+JC;QXGV3f%Ju&m z$0pw$lE+88n0ue&OVyj4erMe0dR=GC&v9>MKc_jq$9%ue5$oj|<9byNW*S3Z>-GmZ z7@*zL&D{&;qqe%LVx9(wZjhQF(2e<|tb zO6_&gUWpFo|8{xPXHVBpyxHDwTnCJA-Cg#9JLTPXuekoATioyD?IN+Sl8-!Mzvyg# z9zi{0x=>rUYO{J>c@g9Og6;?M`>>q7q>lsQ`pxSmZG7yU>&5VPQ|sM1?}+nVbC};b zhs0P}pHG_02jzBUWA&!3M&dqjg?^3oFYWg&p-=Vvw)T5@?c%y?y1FN-#YEig#Fb^k2&4W4f5(grw9tmTQ_;j>F-akyF1B&JYQH{e3z?F zeK+yGh`#R=?*-a;T&%^ct<_?$-Pt;ns~?SRW)1ffd2OfvZ`vBCcJ`g?8tvBC?jpx; zFef*e-_$ve8|#1S=_$E9V(gEYk3QZPlIM@SmXf=tDysjg>QJqA)@NHW{h^PASIKD= zb>_OLf;v$@H(jINe127%UuokyxqhLNb+7N&jN=L8D0ijWG0&&8@r2yub1y`sj6@m*l9Owr-aHnQ}QqA3MfmK_%B;CTF|!-&;Fxx$dp=ozq-yd-{K zZt%Qntdq=p5&hRN)`8;Nso%-kKVLg1NZ$mt-tpYOGdSc+gLuZC_e zt`41FM*KVEV7Zt#cToq{XV1o-k+eBjjm_3~?;DNrQn@j{|D2m&9eiWn^J*)f@89$N zMXo*G*_^er?^z?i$J+<4{u^M9iwVFTw z(dJLu-`Pst7+-THRZx$Go$q)*bM>0{Uuo+%X-ndrP~Ui1T{Kr)aCNI;(39cNhO0@op9GfBJ1Ihb83wOmq5~WAzK#FP*=nllu{4^}A9I zu2vtF+S=>SwU_Ao40F>{To-xYL2mvL=Tzg}somjX3FZ49{nWU^G3#O!3ocf>@_(=M zhPbAj*sgAF≠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 Kz*gY9EASt4h;2#$ literal 0 HcmV?d00001 diff --git a/OSlibs/win/libcurl.dll b/OSlibs/win/libcurl.dll new file mode 100644 index 0000000000000000000000000000000000000000..8c80e23eb22667f7d5b517faa204f9c30d73a13c GIT binary patch literal 320512 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
R_ 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

lVAY&&AxLX&?GI{l=sbD%XWl8?o+Ju*YEb3){IK zqb}3YY7gx&leLhDWM5)vGh+{XMO3^3`}(VH;#%^N#E?;MY4i8=5SYEi$cSVIx8vbo z{A~7aqJf%PbY;x_cMQ9|V!_K(<{Ssita4c-v-2&yGI4La{oC(mhc9<5nmqP?>@Ifn zD;%YvOxzdUf!wy$KKCOu;v&<~yFdX41eRE1nlS@XQh=J(^x!MF0Al$v%BP@EVL4m! z<;2U$s`6%7H*XBWkd<GQxHt$^1jiF!f$YT1?0hWm&R+UwU;a^eK<^4_7_l$G4gE5KuE6wL zX}{Sw>f5T_BLq4(Wgah3d4F8vKR0WrZ{;%`Gp8=}t)5`?;kmz-C|0kcbA_!E<@Myb zBQ2Y}-yB})+bUs()VCg0mXB-ko`w8zNo>Zp%13`WU#;MsyGsgvUoyT5(_a=(Tji@i zMmI<2B4x6(9Gweu0g9t-k=m-HR<9DIOfodgm6E>+wfhNGi~{xg$L}Rhu0Xl)e`cg)&4~SfjH@gW^ zx|)bv!hC>a^M{mUtaiTnLWzj3%@`g#lMyL@fJrAn@&*Qvi*JnNP9L&fH}Ds%IuRx0 zZrNgNnaGEUTdA{OIFc%vxUPuxzPXRS!r4u#FgM#(aux_to92=%m@l_pJYiCXZ{5p1 z2Rjk5?&*0$Yl8~OUXb+P!iX-(Fk5-?8>vfxg?l3f&mouDi7QzKo+!ywA^Dp9A-{)C z${@91M#cnjdTw7uxRG!1YOcPMl-p|-%m!eeb=m)XrB`$xZ932#nYhnA$Htm( zVS=aW##r+jxg4#|v8{KL0_?l6>cuv0pu^ndO@+>MA|!XcMWE|0?#e>qBe!It`K=j= zQ=Ile0T_Zx^(L75S-l?P?lx}uOzD+79+=n@ zQaWx&o4#y$bg4E7zFRI*^rg9sQd#AR$l90c)$Nq*%<5R6vSqEAqlZyb9w%f4x*4Cr z`-j`DIt2U|cOa?^x~$D!t3>y6eU_x|h<)EvOj=xAHoD;79QJt>0sN~P(U#Fpx_!l} zsykvOwu3$7NNQ;OE3IcV`Ry!??mZVh1qMU=+qW8sHO;$@xShq(7ZhZFX~G}1DYjXn zFB$*4Cj7ZE$<^tNE}KnkD|=j_CJeX!Ni(=*(fgGFow?H9cd3Yl>Cw2Prp`pK^YV`TTr^hQ;(XEffYh4XR%f&xH;YPOa<=E3IdW`?f$M}FyPCeU4QP(1QwDQVq|Tj}qy2Z{ z$%>PKe)HnL1T+*hNf%yDda4NnpH!h6sHq>6!2WA|N`4K=;YI2ap)&8PuHZLpM?XX# zL^3x~pGr`2TC|qxw%PqPrcj;HlsY0Zxy-=gbx8A!GQX?C-v4nG6(ShvYxY>6>5KY- z-?f`R+cz^E{Hh3GCpb4bJ@z~tNMJGH7k1j$9!we<8_8U zIGZ>-7}DLAdSxMIF6?Pto1A}o{B!*`PWJCy=H2~EZm%Di@>16?huK9-{*E2#NGw+V|NJEi2b3A74V`_5Wsp?QKkjTRp2fG^y(6zy+G=S|KJU{tnxm zS1>CVR8c5;5#AR;xbJG|il$~H`Uu6e*-aNR)U6D!1hYd|kZE0Jyn#lcLQ9``ff!ao zik3+1ldoyNJ~B9rrw$iH58$Be3i}OZu{68_a?BA>YHg<6 zHi4?L)IKhy5=*IAAoHjO;mo5C@*DNeQ5{#x#HLxU2Zl=V9>0-d>V}b>)h_Ft4pLN( z*-og+lpiqJO7%5l%B=-)D+Lp6S4$PxIGhduY`^}6RK%}20nxPvh#y~&M>Mbmht3xu zFF_3C-2~^#Z180^1Tz}~tl^13yOzIVK&cccWO{M(m?u_sLe4jsobQ^*dFTS=`gw8% z#3m@Lo@`u_YoM6rg?ehFn01J7uqn-yDl!i*>!5BSQiAfsl$jr99#zBw;asODx`rYl z%2;?s^>O=GbEp#o9HW)LX9JNtTAeU^e_@DjO5=$Cj$@odH%aY(A(&*=;Z~)*g7ATs zNz}Tk_!zWWHS_nG^0xp4)L_z^QGh3uDfg-((5m$kY0*!P^t_B^Tao8aImnq6nJp)7 zZS_z1rHNiM7?e1N5y#(cZiScf;wGq1HFx+munnUXmxXOwA?U}5C@p{+vVngH7u5J5 zft^LsTk|NfUoH%On&5$}i;IuV{Jr!pdcOjK=_irFbtFjcK3@EMPCoa)lPAV+QKLb% zjnZOkTxMb6IkV0q+}Pt^lF~P`SK;$&3MMMk?$}L2Ut<>dc|gbKl8G_ZL=O_ZcvHAB zU2TZM$u*nAU09*CDgX$UtGGV->Pb!dW2|%MX<;`plVk3gwxTD8J;L?;T7S>qB51^m zMlC;Nnnuv`p~j|VvG|>(l2&_bHa`R6Lr#9sMtG*(CYD!W@BA8>IpcLBZ@R8e^dZXv zQHE}4qvv(hjwnw1c0O&_l^-*O%J@PJ)K)>~@Q@}0t_nLyPnv^&={jOTLV^?54Ot-R zDDgwI61bP42C7WbYiwpNWO=DmLLNVD{i5V z@e3h|Kpu6Xw;>Jec^_*O13{)Hbq6_|6kLCek@p+0A;gF(LSxUnA4ffw+ecue4*cJ= zt~Wx$l;;7f#RpUs^XJ_k+n#Buyt;vmZh!iOlC=jQ2~_8mY*L?sE^U&;s@v=~Qy&j^ z87GfrjKWjpz`D~u09YpeH~(d1#XeLBf338vYVFB6$o)Nkc6bEXm*l_uH++I?pP(3I zZHvg^urT!j<*qW}247i9cV5d-$@#FV)zMi)(u!SF#FhDx(~kpdw>PzPGGaU5@jqgZ zDQif`p_zE;>Q%($DQD28u~Ru zP8DjeRQ)4d5`4m%#PrAL{bbv2H{Gl}MR%oU{>}xu51N1raslz*M!#Wv%5y$3kJjzc zhmCJ$jZRYGpmb2VnF|EVg2u3TbBrt6Rw3dyNpbca2BS>0hDFM9Apj2JM% zQBN4w7MmYcC``n|?n3#!5Lu!z%sh91vuSzGWZiA@U=!zS%~Bjw_9HpZVZ8e%yeVJ& zQ#27a><>ZOH0$WVb?*KWPC8(w=MQKIlebxdGOhEVpM%B+!kjV`nikG7^sjl9S&a3g z^W1+<;+;A1&nDk5TEE7>6SQW^rCm!>DsbIEOA$k6z`s+KoACcge~TOL8|Z@(b_PZl zh0k{Nm-2BIG@i8^;cS^j?8XPAgcj&Oko(E!-`I4xxbm3#o(7rJT}=gUzR9V`3`(oyafFP3r$4vz=X`w7ufmN~@`D1M3|zvT z^S6vf;iy2$!&&W(OC;(rW0W_t%rH{1vJ^8VGjfQR+-OcbR!H6g{6W-9GFvvxh}f|& ztDU7rwJ7YN4y5+vTg^0!Qy%`tz7;%hA>5lznv-Nqz~jroGe__Q^y9$84KVgQ%)bht zu{_}uL^y*hp3U}jCqKzwFl*azmG_S6mMGBE=gkyluJX{vBguW46H9mGvAzy#8eL{# zC+mvb5d+R#p>I6atd8y?-Kr658hQK1n&Ej6PBW^z-VmXpx)}%j8v<)PdggcXg^UI0}E7u~!HkV+&=+qBH(d5N%f$aQ7RN4ShUs&~t9fx8Z-$!3@`Xn|UKgk%&d7-}clkI`nb&0x zK+~>u!wLW>3ik;LU*^M&@CjT2yWT0ypwhIJX=D@5QXzMlO2iHn#G9y}<|2WVC(KKl z{$6r03%kk_>N%`>+TWiHs^M#arlM=OGQ3*or+){5F2HF&1BK|@EY$m0JSz6Gl?(mRXpGnC0+ zKsWmdXKjRz#KnDZ@q!b1v3cU({-KhA>)&o3@ZB@exTGL7{u|aqGZI&X<5C9*HX|KP zeTe-9qf%SYq-Oqv$lrAV6N5sPk4y3Noa}iP#U+PdOCJ09hG}s9iZ2>+!&z2rxU;xI_Akqzb1x@ij&0|B^KS*1z0~HoxU+Vh$g&t~)W{^avbxo8WB<{xq|OxhtOgJ}F) zFO=WT#C9sJn>BeQpLdVX#5ehT(fAbJUBAi*tmi%B@6l4p=e^^9=AD>-5xpi5Zv@>H z3nR^B7+j`yvJaZ^&TIXM1<&G_)NdPJLcUe$zkUyu3=XPMrW_c5m`pm$7`2VQI3ZO4 zJm^ZW0eE2i9#c|aToQOHFrMUnWF%zHj6d1Lhkx;&DF@Pj)%ARWkMw82Mf#IRMm+J7 zuIDwCFse{N+#!abfrS|+gITR~p*>wEpap)UnK(@@mjn512XeuE*uZ^Q74ly{D!7I6 zW%eo)MJ?2`2CU#2z9xBmi+}4oluE7`f}lS>l{{AG-}*7UKyA%~2DOI_YQ0vQZ@_cS zfN#$j-3amKWlA^UC;mNt-idx%_>B8c^kZJ;8h?kMd|E0(#4)!C`Nc^gWSb2cJ1K+_ zE*qkws)f0onGeyel!YM_|vy1p0P)m)f?V! z-ez$DK^u(+M68nCPz4$WL=HP1yA}$ajD&NLc}5Q0==!$ z_>@#hcFLBnKe9U%^FF{Ftlg8YKDyhb+zwBKSNzc*$mRM+|MZe{=~(k&(L-{yB6%x^ zhzvRRJo&avjOri9CYMd|`+feYe*d(tLy!0i*V7O4Wp#&#dFfc#)4bcPhs~Sqw5P)_;DMlJ zpgX(*l4Ch%4t}ge_jyG`TNO(mVy&fy;c2pmFr~!2jFHC6oPGRlsFh8165pW2NLc;d zuj5C$B}ylIkEM-sViz-Dp%Sd^c&2pz?qTAviH%TNMwrrk>x4g{NE_O;g1S60ZZ3S`&>8L|X^ zWhJubTDp+6Y3~}w`=*}Eoo96YLZipgpC|WwQl!x7kylnKQ0bv|^*@ar)GZuaNG7-B zGFeI{h%(j6v2CqZ^#0>?zHG;&xPwuy* zv99vU8taBvqGVp9#K1f6TQdI{+sSu~ zA3Z?4Dlto8Ao;TE=ud@$adRjc+~6zu@TFRu%t#)ebl22DSyZUouYmNt!NU~)1QRhO zm%J~SeC=pz5v_OzDdH8@K6Ho)s?6zRGwU$zw7cuLmf26}$KSHM8p#2Ty^pB#lE2W- zU1jXdw$5`WP#!3u6A@}C&}o`^@!7OY<#zCS{Y1py0*#3zd}0p?)_4 z>I<_?hHnVUT}XKx?4Vcti{_NXaxxf>zd$>3{{9@wnRQ|@iNa!tRq66~x8rvL(3+w; zUB=mDHu$WOm{+={M?sg`@=3K}u0j2aZeXwc2F~GvHMI-xdA#(l(i^-!DS!W>=L~QI z_l5^yAi^ri!W%RPy_OA{8tZo~=I1f)RWR#lcBq(dh4)`5P{hx!(~KGyT{ zhF{;VUFn}|YC>ds9T_1~Vn<^s8H5KOH2GV5s%5ewQhcm<9~fePF&3o!3U7QW_YO`S zEvo&fiod>R|7L&naXzp4DE>#~N7OP!4aAF+Z%SSvVOS7pgl9)_%zgd0BvFiC0*Wtm z_9st7^yzele0wUPGN72)q_)nB(}5jDa#W{FcerDxozS!Xi*d~)q!yJuFUPKMV7RQU zvvz`7o*>fEY&*2YJe@1jMV%Wbg8zfy!6wKr+^~BC{DNx|C(1Av;u4gLW?**Wu73rXMOp7cE@B~X@ji*(kK&cb z&-f4dO1?QMxh5R+#Lfn~GuECIe@yYkx~?BQ2HjCm2GijKj@Zphu7jmrElQ1HpTeG+dsWK z+^%mD+|HW_1$L~=G|((!j3APF5xgdo z<^GC%OL_)XLU^sXw@k#H=ik{KZliG8de_B(;9oq}v%k;r8+h6T4LD%>7fa$9ga$pM zrPVEvAn#Di4zJ$lwFrr$r3ipGUbLVYa(P1PRQ`{lOyXsg&N{5N!+!A%2GAR{vC^E;gqHVf!LN9Bh0|lzhv%H^;PcKddMB{eZ?Kv%;^7U_F4CJcOWM}Vk+a4 zMhe8_o8f&-0x=jxk8Kk{U8*s=U=kBKon!Lp!vK2=&_0{9sO=_c5uGaeQJVv^{3j00=dm~Zs_sF~|_eu~$ zCQj<@DGV#wplt+o*v~O*kTQZt>JVSREBbT|TUzHa-s4Fcri=0FOnEo^H5{-eti%3@ zM76w%0Kkk0PP zW%bQmR^f{ct+V5v&8?o?rsZ;*M`-$y=q)El0@V|d)+v$|eemQ+jYOKB%jq#f$3LY` z&X@zxjQa}Q#Qs$zYAdjru+G^M_0A(s6(fFJCx=7J_>xY=L`|GC?83;;s~wDV9zj4r zH5ETX?lm-)CKO9E<#*%FY0y|ja#w;ja>e~m3K6iJTARTjJ=KiY`dovzMnug5*TOuz z`Bu|%U1H_g#8$2$_Ow{3t(UQQ_pXsW6|P5kx+(@)Cx?>QbC$7eVLf)UZtXGjXt{mR~UM z0&vv*O+|@%E)n5hTx2NMltfMvARQqWcPvJRocR^joJvtU`%Pl262avA%VM8okH~ZB z!Su)J#7#ZJTjahj;y}4`M!vQt&PRwdFNxa4S;>taSNwE<3)&0mx%jhO@{BcU-eZam zsWlM<9mIH4a@Rh2$Lj4@{|X%^hPuqZ-HlJ?-}?An9cbF;V_tGD5is9UW1KY>JCz*4izX2$T>kd1-iKmLGq;%IP~NvP0*5K!;Ug4T_~9 z54{ws1vL9tv)!EkkyC$GN#+qnaJJm65-Kp3kca-Xo0wy>U5A949Eb zv|Tmzi`eDA!LWCCSh;Wj&Q#!+Au(Jnn6MvVd;(NSEciS68dyAQT&uBEufDi%0~SwK zF6$|2S~98XevMD-ELnS5JHa0)2YzX*VV-W}%E z9e$AX(Fzl->dqWG;(x`dsVr3KdXv+Ni&UvsFVCUnBYBX@?{~BtIH@1=rM}}O9lvZ8 zSzAy}^Y?TinMhyv%q$8@&&^yGT}ok)dxd@M-S;!k)XKXY@2Z^lFXa6pyw#5!3Ycc< z>lrg`PKe8TmRZZaAUxYk?wX@ni%2+2&|QZVIzi8x8pwuFmY6-*K*^Nf0^l&^>5=HI z)UMtB3?)-&x*=1(k|1kQ*wa`PKWDe?MTvr=POB)?98Gz__L%}z#z?f=B)-Tb_GaNS z!}u!3zF&m}nTc4~g|W<~aV4uYv`>w>KVD)^T8*e&?k#4+7;@-(goa9WJwo)l;jykk z-ufHs3TE2}7q})We!_j$mG|@IUELKqry5xGpo~^?=bGDlVB}Tzrnal22bE z35q-3Y86`s603WfOJaH36`PZ^i()ewL*pNw@0k{_9rH|6sp$(W&oud-lk!YUpV<+8 z2hY|qC!I!fyO%i@2v+8-+1>F^6=n|X%KXF1e3r6VJfEZpFW1BWSOt^nafG0sal zZWX3&6H^%Zn8MD;7B=c>>3V+$mGR$w76Yg#X5X`?cT7(ikuroYI&A#T%=)!=9ap_M6H$wQ`qHlB z?>e9L`aG}exBw-zNuR;GBZG@@bRE~kf?KX2$B${iN*=#p%WP}jz>*6+XiCS=LsN*c zFZvpBm)qZcTg3-gjbs7-<wc@F;VW$MNu+=8H^q>0e9pA3aK%7KD;i&tqIJd z80{Ybhr)vhrJ_wLn7_b3dA#w-Ak1^Hk{@=5u;YoN-9C$45q4l2)0cd&*#E^xl*i6Z z)$jXvE~?g08|;#uB3FFM0wEiZT`_uO~PjIJuY%L zc6*%Fsw?pYj6L;y6<0Kb9oBaHW@7A8!_yGTq1)u(I|pS6y5w2(HBJjg518COpIXyS|o@f0<{+-trQ)|!eUwEhN z!%@Uy_gc64S{B`I61-p%1k7|fHqB^wx7&{!Pw&lY4A!MHALR~Ip6nKRZp++t6MmoM z`7F;m9#Ohu+uJdKP-@*TUS}?nlK7sF5uNo*(Ogh-P> zUie_uZKNRn1&V*R!h}Xehr@9?jgJm{8!ZF=bH}j$@Tk9D{8Nr!0H5 z6I~I+vg2c@E`EV*X&hyd_kZZ*gy)lxxYwJwLB-AWa`8L5Gk0zlS!PCPE!sxy-LX&U z=OY4soz=Z9SNp5wv3i+-Yxx*aMOrB*+#UuY)CN7Ki3Bs0;F1(Ev$442ln+v&O}fmW z!Q>+kdrK~Z9CX-^2EGE=!anQnUaz?PxGQ#7a=a*ZS#sPRUn5`eD&I5Y0mC=ZOcOa_ z6zuppWf!EVQi|ExP}53Iibzz|*f}f{#r}9c>xnewN^_YoOxAi4QS~+7#5cG$ zl_~JEiR9F40^KjbIDKO6K1ai*(}kMmX`1L+S9BIL71uOp6y}=gTN$3s^3}|g?#wTC zjxm;W*q8mu^lC z8lz&(9tV&FwPbJ1#3$n}H*Ae#0ZGBsslg-!prKB8WG!-l8hiE+T&^bCjrr&LD+tjx zfU4|@$Z)V`{FTL{k<6n?-fI5}HpRt}VW}@ketyP4B+zhl)7QptbLIwvmyyz#%4MQp z?amp^1%7x@<(Efg!;5!#`w8fCliHvCDnH?? z@`SIm%vZL^g3=GGbnQ;0l8*sk^|SE2)LblA{yR`aI>^TWv zPRm;tOAOF6eCPDctC6VM9(z!KFm2!I8Av{=JUZ+%q`!hNEcrO!)4{oY}d zdev&3$d^@O?0-%!oUeQN(nfEP_ds{}ZW^VnJ(}Rf3Y6WKN_*PHtU~2M1BbONeGg%o zRc*Fi{=@M1UQ^XxwFv6Cta;Qzkz%imtln`QRY6bMS(Kqt&x&Zd{kNYJsdh zW=&6iFC+8naHoLv?=z@f?`gvk}sSil61I+cNtf4`u1W-!oftmG5Q7Ut=&!yo1>vCp87S(t8u{Of@$N zQ3%3t*&46l%uZ^MxYnEF|E46)ZQsbuVizXgxnM(!<@pD*-WZNw(;C(4C8}wDcF}RU z!33pqYB`U;jHq72T0rdEdkdc-q>Hqlei`6Qru-K6|RNWJc zz2}r-e@PcTso05({x`*HHC9;c(hn$h(9m^ZZ9jKvu@f2nZ;I90udvuxP2-+e+l5C& zdxgcm1@cd-?L?VsQDPC>dWod(}tQgg|LsI&cHlMMqDNc*}wDofvys>6rbeZdH}fSDX-8|POJ^! zA$dg{r%nYgbs0+*f4K_O=CJCZZgEmQT2pTO{{TuJ403agC-`x4*CZ{y&T&KSuJjtm zEuNoV;kXe|yV6S?yf{9B$r)wR^Hiwgizi3g?>ygnGkxwdXJ}EETRstLFMrcvJ){vA zXkj3j3YHwDxPL_{4kmGicuMtq9fn1;+FR@_i-;FF*0ygP`I~204-KQo#k*n19r$;i z3wOB#EBJnh_YZjHfYm<}$IW{x&lx-mcr<_OIuwRTCgf=v8mw-k^#W7W(8GMC0v`>D z+M0VT+~jzMm@OgD(4-6xSBKzdFPv|qni0=m<8bNlrR;7nEph@x;GfTu8Xci zXm0<*bC8B}GKZUbTioOK(F)Ox1Vt14v^v*`{Pz1NSTm75A*0`=ZT5b0eAFGS!mJ4T z-c?4`*bB@dWc}0d(Lo}x$k7LsKm6U7l0;L-d5)kuQ(kLQ_!KsoFoJ3#(QeAdRUfgR zz7Bk_#bNeoeoRG`7tK^*A=rxrxygks@*?U!nY#OXIA7qh##jdUyJbz3X}!Pu{H&vA zD~@{55L-DPB*jAQ%j}!y5NWU1vM(JLf+kAubfuH*t_pf8VXo+7>P%E!`hqqMS)H0> z{A2VdPFyYE2HukSx1x#>%3OMKCZT*L)5%07UYc=g-02$kkwJTOyP9TC*nmdWw0@{z z(J;fEkM}xr!uII>iuZT4$ljR)yz4LOFmWAP17Fro%~W<-N~$XpQxo6*&}#{w^@f- zqqOs3SH}XEtJbyQmRK_m-IB#C1l1S~VTw@8ZY52meYyQBk08ekA~F#bPdogT{E_gS z?B5~(uS2}K_+;C}FFM=%e!9B zyKG#-_-OAT`C$ewAM{qw> zC!_^vCHB#RwCLh}`1y3U(b)j#6MQFm`513b@>)qPPx4Yl3cY;HO+8(^RjXX~SufQv z=jE~b<^f4zLcCPZyw{)zc4T`K@ZZd{jt7ekf%|yA#q%Q1(>%ZA`7@7e@=1U0$&-t6 zUd5hCI7{?dn)UOVp5gpZrgzeNnHRy|+5WBfLd@WA(Q^iWK3;@-P^U?ViUc2&#r}xF zoV-PIAK<;@gS|zX9}s)R2YZWv3u8-bwpPbW`5&nVBI2z!(Fv%E`a zLzlYgJQn9KCaWm_J_uHDvqK`(@RjSkR-f2u9@s3yfmZhO{EX*K zo}E19&$|O(=Uv6Sf#*7&Pw>Qep5XZb&+9x#dHyfYH+jmSlOo=&yw~!$%Cmo>L*txO zUQ+6vTvlE_#eDk8r%v++%BS-&V`lIKdNjlJK<}?JyP(J!{;k8*0SeSVo+r3HR`!RJSKAorr+p9*lp9}Q$JlFAjlIIm3m)oPiBJ;~nv8VV1d>|jqEe=!{ zNl9hTrK;Vk?O-rU$*$zGk9E@OXRwA8zUUyM6vcFGrBE2jE^E^Ueg z;ul9Bfnl}V&;3k`8t>R*)!a3B5kE%4#2zK$rA?DG_y$M1bV4i;|E$5NxkC6zQ&WIz zD_%00^f;LeN<*q3^%dFF$!*672;~4Rb)Y=5dR4Ym><&mZPX$iNCTaNj`irBUxj>kW zW6%EJGJcBvPC=L$(y>2gbCP>!OLC@jiJ{ZrCayslz1pR_IZ%yd0vhaSjaE@W=ah*3 z>phvwg$8xS2c$u#JA<%8V$fzEK_F$lnA{thFqL7MxYf@sD<0`UdqWXMl6!sCv__l@ zpWmf8HzwiNZqJ+2Fa9|d3~AYzy4htkLT6_IKdHSdCfZw~@o=#uLt*s`-5OFx1;0)1 zR__vOi!xd4;`zPejGN|gyU{!~=<%PbL4C%OzPXzw2wERAlPE60GLaKQSBhIGp($y$IXCrb8&IiIKB6pEL7g!ci$YZIw~6P$R0e=4@$BDt8Ci z^lR0Jsk_v9-hg)M>1jbD8)+WUV`XW@<=tI5k2p#e>-tm{py|#Ym&Q z=E|l2wSE1L=qb<4FZw>C` z&;fOUg+iKX)Y`531Hs4rICm`>8OU_qyncW*S5UMV-d&B%DhBle9LtUf8e9HD% zJlJl3wBG5K9@Eq4bVbJIb(U)}9(dSstQ}3<1CCwEZ;H{smmIo*f?-vA2zle1z}JON>ieeT#P^*%sTkKlCG^#5cGQKP{1awOXMv*p}Xli<{XQ z(2jLPBPRBrOl;1n$GC4|o$)&S>PZ=hU>hdYAXA8A+C+tmY%}FI7%2lAotgM)(R)qW z$4pvpuJF7{=Q6XoD+MohEiG#!^Y(!ak+Gy4`m^raq2E2>as(M>w-g~=WurUpwf=Q4 z7)lqjv5@%XMTxhI@cO^|9IxjxR&jFhA%KAgq1Uf8?4bsiEnD81X|p@PoY_~EfAY8| zenxcPrP?T-mW5J#s~UE1968df^4+n z2Lt9E_6s{C<&}7`=O(=88}#_QzfRgnTZjEUW<3gi*?-Rk1aFe+XHt6L>?-cDuJfF? zTSM%EWy>?`! zZ!t-mOwx*ir2ShpBCw$uKLMVPSht11Z^Q56o`&7As^l&Y5WC{%RKGfFAGXJLnB4yO zvdMiA)$c5At=SurtIpZOL6RC}c|P)6spfdvqg?0=YD@H3;Vn zefiA&@RM^Bgb~<Mm?*~+}YQ2aMN^jeP51EXbpyXq#G zmnZWY3?o={*CZX_hox(@2$zeQ2H}y@tS(ie?q&azzjLM7$u+?jp(}i@)urmpH{o$m z5-+PeNU#0UNXqlofolW)e|-*V>7JWLB*OM;&XJ=753_l?f4pebNNZb1v>u9K68W?a ztw_;(U`3IC5nDisE9UyU{|;y{mMEJkGErzEn9F|>S6pdb{4icIf9Kp*-Dgiy6Qa+8 z$dd+ExVb*=VB(5P;uj`1b1PjjM>O>{%h_+o?~=GbvAJk2_rH!7w-6LdW2EsD3|u#( zdq;lP=klLCs-y!vf4IZ$%QPOokC`8VP+Su}BxE?xX)R=2YF zTG?j*qO1sGZ_pz*<;}>NmybCp1E^dxUH%^V*eLYdZLGNlO><^tjQxgdEkZp zCv_OnenlJgt$TydS}~9+QH8F|HkXQ-eXTXL4{>xtDStjG>4mwN^GVieFmI&2&1&+n zwdcHMkC=C5V)GJL{Iu%!kP4dB9Oi6{mkH+&?%=jS2B%uHE?Jh@`5?Jx9v1;}-@%J; z6tECXzPBuP8~gkBTno#GxP$2u&X@CMkekvRj$gviHl?{Hetu_ZtNkKVHb}!6;9Q%h z+23iTJ2h`g-IpM5rB>yVUN>X=+WDr7$5;KkyN?qw-7m*)PJUCv?)${41V){)uOHj0 zp+;R(R}~qy8!o0loSoQp7l68A<R2R;ys5OGq#M3QfCakZvMK}tNM*H zQaG+u^Gb&wSWWYwkU0a~RV-V^70WtWnO9MFt_$(^+(7qd&upf@=hN&E2$iurK$y0p z*v-II5#ipbosT%^GD)O8QJ8i8{M&+C>NZW9e_LQfjk>>U^It0MH?*Zw8XBn?)?_uz zN)FZ&ml!?w@pb^q zk3mVil24i8Gd8>a9^sS=&d4JgsRga0y;^I#?fYIZ*tL=gSm~5xH@~8*TcNAuQ%gwX z7B^O0hOK^*C!f;#2D7%wr#5O<7e6brQ*&Ds0QqgTU;U$*mdLh+PI+f~1#04{CAeL& zdCAR7T^+Gmne{6&kJd0x>nv`y>z)$`L4w@zna1jJX8lS9oaqE4hK5P&ifuIHY&!1x zl^u5D#Q~B9$LzW^iTGwPxU!kNyOcLnu zT1|AR6Qy5K%rP%b9AdFnQj3co0-Kzyv%A|;cgBk+rzY7AY)w@gx?)U1A_jm z0WkPLadT*9d${2T{=0RT)RxH&%>n-x&E&Z`RNWjXCJx|L#J1$JT%QAMV}}6a>`1H$ zz=GNN6=svy2QuqDT)y+@I&e-9I*F4T zu`W@ry>@0GQxm()Qo`T;_i!U-0Hrx9G6gZIsEu=1dWU`RH|7YHD7%hH6ilzu+I@{# z&MeHWlHgc zwj6(!tfMaVTKl*AOufec9WSe-!Sq`8VVgY-rt5N%)U77oF5(Ffzn!b{0=XKYoxo%k zhRYm95JvAevA<@pmwPO!eG=(x*q_ekJmBO!!H>B(AU-R4 z%w!nJW_Wr*h7r5$LM?%Ph6FEh8fdV-AVy~q=cCD%q8sT24y1!#V&otSikG`{{M|5h zROTv{!Rf`@fm_R=pQ4Imcx|^Or5v-q;=)$k6QeWwcg}I}pa$d6CqEeoGD6eDu7`2cIgA8o zS2yk=Ynx`H@vD<}G9O)#{AaO&_r|s=41brs_QQ;$Et^tbPVkldwClZsd1*fyB2aX0 z0b(T!78$Y0YmK9pZFK4)hs;sX_pak0qStIB1tC@|IrbEdQcgln% zU&@M;(xv??!=b)P_f-oUUfuLJYLJHSaW${W+8TFSA+=34%p(g8SB#ZnPj?f_L$ss_ zq?`z5fJaP*GrNcIsOI6!H=I#N@!l{9($Ezj>i;qP^bL5;YZ#5r**#^tLx~0PKBQ#)1E4PUzYAUdTzqo>b?#=ZM}E?O z+C)IVU$(TJXyfdlT>b+j4mlhY${RL?D@-9Z{WB@#d{$KFPo$g3kAlin(DheS(km>m zBqR{X+|N{4?39VbDs=TKiai1MY6jIWfSvT)FObYz74=oW-Cs1Y7r|13uNP8dnsETv{f3sPVB`oX$0ir~W8Z}DPXi$Se zO&}yu5rZKctNgL8V;7x`eCMEv1S0YF*cM z7jRv(T374-eQ@O<4JQM-CqYHnUsFo@c3-odzsyY8@zo{|H9knGR=1?&pxeX-`y0R2 zV4=Bg(pRxC;5?kl#|-XAxoL|s&ab<*fkg=;GP!9L?)FrA^K@ts{#Lm**x&isrGU|b zu$_2YpUFPhI)MCdd*AJmqmN$PyHcvXizeabl269RD+&5@R=Vj;0v!G=xeiZN>-tyg z+3-{~XUKE2Qv$HgY`xh9z}nTMjO{2K6h#{>f!;dyiutwEd(6C+85_zlKX%zp`~`TT zU)=BqN6=Ol$Q+qjD1;xVzs@H zwlm9B*mtlYOyqp~*{{+1QLmC+^vtgOK9&ct!(-2qDdXe?xg|#%|{m8WR zrkjYxx9Ywrz3FCtgAGzm77`w9wR<#zq#6GJfqq)8X8h-HTkzcR zaPtATd1rnCZqr6)bm12G6u9NvOSWg&2F`ioS=yXA19AW|Pi6oT)$_TFkIMj)es}0A zbJjGP+e?p_k^>F)Y|s}J8G#(+-=J~9NT^~j_lJr{FSgg5e=L2_jDW1jC_4`=WqZ;M zAgf98M#eZ+5A470%?uQQ#w{4aEq#`z48CbzW#1Gk`2~07wTMrazr`lVc@cBkHBtva z;5H}Il)#dz#il6|sT%yvkB`+jkDD#@_+=W^@ryLd<0qNX{3kjd>~^HvVwaiv+%aJ0 zYr1We(7iX-RwWVB2WD4w1H+29On$_GR$C1NYietDYnFX*4#b+hO6|$#BB3QN7?sT1~B+*0JumH9K>9M zB-YL0{D%l!Luq?w|{r3`X0F{$Y}H zU8J%fu{hlD4#NcN)>;U9;wNdQfCc%XQth!1rPD&&!A|=$`y!f7TF}#g;5n8>5O4U3 zk%FFz1rdHuwEI}3S%Wr2b~0JHra@eTBhDk!C^Q-#8+vZ$A2As8Spe{incrZaU@*(y zYqAfu%xPlBei71)icY6F{pK9YC=oTK*JL$Ul(l?si>zKZa)#mW2wl%@cQ%>P6XK9^ z3FIUCfw8ZT&|cGH=K(UW9aoFO(4{+rU9XuEQg5ss*Z$Et(VB{RSy+vW2G&~#*akR< zc;p{i5#({_!GsjKNkbKBA-JJ&NP%A?kvz`H%evHRRs&IdtK>FlpTJak2RZ6$2X5gV z38kWX;iHAoF=wNuJp!V5>mTwi`9 z&-C@cOB7SFu2>7n2wp5EEdvAtKXDQTMw8g0M9IU*IXROkll22#PT~|Lj^=ea#7W&j zwiA>xitk8$fje#2n&<2Eypa^0m^3LjDW#f}shN~pm2y5QI)WIP+n*atEQ-j7eSn7ROSS&CN$3Z+3 zWRMTxC{qLrBH`aTOwd|=OvhLF0&McL;G(q%O1S9=4!6`J216nza3_d4cVm=m&BE!0wW(zLkxPSJ7G;?4s#RU7 zAGRM^6zsZ_L^2jUb3J@dT#9ssYyXQ*6;J0q9dGSx_ww0Urf4Z@6#$OEzazH1u=kmp zC{~5K`&a+%qGgzFWYG_1if(a>{_nR}I|w5Sot-Ik+5fV=*`Fxd-s^(muK#g+M}4Bu zZ)6H>|6jIO!j+MrsK^w(=6~E?*%lmG=60k8E$b zTWIo86^c~c#ozIlhN34Tu9&cPe%7T8?19I&dD)9aGV^SsLqozKX1LPHIbgdQtQw*oz5>cOPZK?yFmr z^*r>zlg=@DQxCPLZ)63R(|%XhrO}gOIo@XU{fw@KHq@7wzi+Y)d>KOAS9c?2I`>ON zq0?7H?rTq<6N$H{7e}sbPoEmOsy)3hdQm!u_A;^c(!_#>4f+fTxh1ALRgD{Js?*GY z@s!qyQr%_zLT%tbSl2m?K3^5RAPEOwAgfk=-MXP6Mo`n9J~x`*S9fmK^J1FQIXX@` z@C&HBJ}bBU{Q(vr2;N3Q3lqK>2n~G8!mY1m;PqO zxMRK4(pOWF&bstBcm6G%bF3FQ-o{Bl!89Z+cwYQJJ@5sSxF~WZo!5!(nbY1394;h5 zAD7PI{qx+cCj%;w%An`K86+Y-0ZfY*NtX8+Sm#B~B=Z^BJ^JS1tkCz4WQC@FoD~`a z+Fwlww*mm;-tU0meNcKNtyqW%+kYI;s0&zqgSH+u!nA%uTo5@ieP>NZl2cnl``y(# z4AY4GtWTuR&n#|M_C?k;p5RZ=`UWM6t@tjM*G%O_)&(1&4l=&!$4KTdLQ|0^9J0VbB8`23{$tV~!~)KBor5nL42xW;7|%^{+f-n=W=JJJ_Az zb&jO(@_R$+TGTD_@p5#>dBLr{4J|t$p~JLpqF-p$hIpC%ebh|=@Qs6TivAJbhtc2S zfdn{tQWu+o{A{v{^Jx|jevUF+VbvC7?~K=$@F9IQSsZt-^=W{+ABm?qZnRBQ%8)Fn zqHjtn`|o&ApdENzc&JA0qEQ1&0je`-#EkMrnHiy`g1KT^~`$9!mfPEmZ0Hm+m!RaJb8DDZ$to8wrh z0hOh72>Hk+1cv8|Hx--X(@*m;)-^@ec8O1NFXN3>kugY4CUcb4(;f}tv!3^26{iI| z(N|7W1D0Y9Y)00_whs@T4?QEte5f(h6ztl}llCKd!LBP!mI5JvSyQ~W(7w*;Jn*qg z?nH4Z6R-6TSY$I08XKJg4AmfFa)8n;PZ|uAe=8uUCVvImV%<|? zouqz`_2-y%7Ct#N3kBuqv(A_||Po;hCFGD)Avp=DdwzW_L9=wcUp`{$TF`hloO z+mQ&JQJe2#)xc*-OEdc)m-Q-=!A;{=vlb6wn3?1(Rq1F(RB@M|AMi!Jm%7YFoYZt8 zf^ljZ5qiOsI*kYo@uW^5qTDIHC5*y9&m13E{E5+0AWR>4joQq3)4;{Oo5n~|V`P@B zT^<4j9w!3oGZ7OJ;#cJ{`U|q>)HK-n8Xh}*|4K>Fg+gV3DqUH{;0?vA>BNF~ZD|Iz z7wEBzZdx>&ZoP&?cWiy0u|@d|uhu-%g{&V68r-TJ-&*iaW-#p1S+AlF6bC^4f{w$K z)*hj{P)B`LJ2%AQ4ZztYf(9Z3Z^6N|rw}lMX}1#}ctZ(%S?A7SPnz|lNUI~asbh$n zrv88@PE%1*B0kt$(^&JZMSQFJ!>xJXv&!a{)0-imHw-Ih-lvx%Y*Ke-$~j?JIakpN z)1C=~P9JyE>$}D+10MxGo#aEt!HDX2H&b=q?P%6oK3AI14od zV_?>&0oAzqB0E{(m&MMC9!*aUQIU?PIeClh-!UIjh=y(rVyV}2bO(G zEnUqd>Z>~EnFx#YeTVqGD(*7qB0V&^+01{zt}{(OMq`qE(76=EOi|tlI2Ae+T&t$=_mX&@7jF*mP`eu=`&~qhr@) zI`-SjGiPo+Q?Kfa*A`HWp(pn!r!!X$7JUn85ba>6tgNYy&c6{ExGt0RT+<5EXP0NP z?#g8CCz2_=DD%eU(YHx6JsQZQ6-E1;9^#3*Po%0Q>toR>=9@t#!JzZNFHP|@sU=g- z5~m)Gx{+Tt@FSiKgO(Ww-*R8;N)U0XrM~0)qs%_t0lVg&6--ZV{|wxid3^xuMoxF8 zUTB@#WXAyFh;D*Q>aPt*#sMSrb1zv5=HXPE**L;ZXs_F~*u zUHq>kVB=_$uLk!i$8z5^CTi#P7FG&uqQ((Fp3y{s}6GnbV8Tw%!oS z4|uT0>9N|y+FNB%Ll}fHEGX>le>aj_G6dqaV7LMP(2J^!KZq@djMt8DKfD}U$6A}F z#)h}jiCOK3&&AI1V#EmThgU>%$F`H0$|E&0YOJ2Go$qZwd{=Z-Y-d&KwD!YykfjPb zl0pXBNL)tsMrO}e9b_*Wne0>XBx8Mdc;Tbm!u^@THHZcaSA0bF9Jg@a$mCqNaPNrZ zEB);s-4*pA3F&SBC=$&X%aKG6(FH_3PBinC!)2v{*D&?9d~05fb%phP1Noo4D)>*d zW))^{!-e6jV!FYXy$#*{o_KAAHLG;^eVH|@Z20|5YgP%b)s|YbiiXnD7sqR-KfCPj z#%Mx8dh<@z;IY=M;p4krN@h_ew|b!jh5AQ0`o~c*qxRQdWl$t(4#4(?L7`PV)fmraSh`O~Y_0$gcYiOk zlm!*_PL|H>F6PfcDrU;GYN;?XLEFM9?0!)uQ~)Gmd)@Ui&OSRN$0WI^&b^teGV{9V z9j7nV3B&$cdRSE3VG0G4{njoyy5=}Xe10Ia`#16pjTd}oj9M{`Sz_*3Zz#DRK=mg5 z7wcMPu5-=xdUK7KtF1iiPbK?VgmVeygc*b@2*a9V_J8}U3f0#Bsxs%NNIz~fSfA5` z0&J`{N!5u)7d*sDeMaJTzqN;@xwL@sX4bD)&?jrrTqCAEA{QI^?a8A`kDd)ZE#Vyg ze0%1@X5)}0qz3+2Iw~nBnhiS&N4sy#izvTPj3Xapj)@&&o)q5*1fCf04Xq8fe^j<| zRQpFW+QzqkRIONTTdtIqMy)v6tdm2*M4DkywrKZn)mWQ9@GdE)(}SIVA=>9F z^OV2TYDDQe&(MH|iMTm%EzbG9aIusZrZ|k;h=t$Jc$q$i@^}W;5^ujEFIpCBEAm87 zkF^z}>0ZZEO_NmJ-?7i&2si&XJ+RPuldGrBY1hD&+*tEisuoqgwla?szP-zRRqMj#PLs=7d@3v zGU5(>Qf&#(GW@eXtBY(i$FgeWH}hS$JFmh9tReGE7?XB>tqz^;one5o@@o43r0kx! zNsIMlH>7_mC89xTNvfbF#ykDyx!xXB%aX{ZmI{O~@eaLYea&3sf;Jn7YkYY?qA1<2 zdl%BbQT<<20>`F0zpgv;YM;+5vv);l(<;jpVco0Zq=lNkS8rHr%{7w>-Uzt`=!!M! zjObbEpD9QBXL_&Id!60%&@ePdl~k)^D(N@HQMceH0s-Rq6vt{^d&#MH&YsT+hx zx^+Gvbt+vkHZpc*UL?c=Ay{gh`zH6)iwTA?FGg+>R0dvT@u#r`l$^1p8zG*%W4_2J zUk=`=Ddt8M|2CG&0y9vCJ%#;9p_zOP7dS__f?InK$e5#BhzjKPl=GhNQJY9Nf`G^e z@LBO3f^&SevG_R!F zh~{fgzGd2ppOiSOC=b++;RaIgojC&;SQ(2#U5*>HxLpmQ6$ysB59i@fXem`Aoc2cZd zQFZ&-91$byZ?rsAzMIY1!Y#t$=l6ZX=dsrBq`{=+m+zio;#Rwk=m)>Q9avQ#i=ik z*~a)R40gUw-4MWanxR(tQGL1hd16vM;o$7|#-Uf={TN?m#gNK0Bh@w$fox&`F% z^vgVGy1)Bj(iLmjNg{`Y3Qi$^U4!T?jfve==rMYA-s_s|FR}cljX!ykBIDnFnrm!T z19nBi=@nSA{te89)PDk~|BR&stE!ON=&F6O%hS>PC0%=y0@dPR&7MW*`GANzV4)r1 zbh|7znQ`Z&wXCmzU$V!tp+dI7Bhz|i5O)-ze}tlFWo(shD*98it=bx@95ti1Dsl-k zxWBKaI3VqnY^%1aC3J>YyK{k9PYZLYx;P_S5ZizA(0=_*z-t-w=~gMy+}eaoCqyT7=yWSvs8imv#>;O3dP#*9ohQVF zZ261&yjj`Dmom z?euEFe}XRfYQvub$7#t_xji^{m$f~W+(<%L4d^iK_L{ZzQc@UPDv!mXW_!K)L< z#mD4xWVJ<*c4-CuP5N}k>;=KDbwr$soeKH- zt0NFYt5aYZTfB|I(C&I#TKy}@;VfFV$mFXZE6UtQoqk5Gz`fb_dgiR5Hy z73_SHhPQ8t39gP~LF=jKh#Mb!6sawiQmfNc8t;5u(}7iEHNUHo8_K3Wg$@#vNKeL=?%ijO`>ecR=w4~u1jl#Cm?d{IF~D6RcYhDI-Fq6hs1bFPa&O&x4tMd6>B_nJ-t+V* z-cg|^DrdU$W|f|X?yYg|8n{zA3zV61Zc^@h7jhTxXi?71_uiyO@s3-~6R~Pm9tMs( zjGfGT-TSJU@eX6hF3-AGDt7S>W0jA)o6VgJ@{J__(*NAB3r$04q_3!oIn7rLkae2e z2>BrU=c2*tZD`H0e@kN-=x}G_`bX&)cU;Cxx!3H&V+;@;7ktHMAgw!t8$< z4AP7`X|BV1jJABml{{ZH6+aHje0;uo@~LR-KT8~&nIbxi*K=n%eh9jHPzZaNd--e7 zZ&NtI=CU;{IOl*>?USD2)1)H3h>2{mVU~m(ar9Vs-bl7p%}UPyY&&;WbqHEtx4i+$ zQld7LzP+HqE_#Jg-SsG+MMIdw*y{GAf4-4>@pysMIF|U%aoR~Wv^Jir1!1n4pi}u) zYz@WomOpm+lxQ{_a=BXjD2Xn%&E9O3Fi9BEBaZ$$FbTBcD=y2rq%}v7qd$rSU{0|Z z2;O~)>;AFXewNd|mCtSTtsrQ~kf|=!upfBRHIn{eD_C zgg-v+ux{w+D#l(gs9>EE?CdAK{RP=o@q{^-Z0^i#73}%}H<%SKP$SgddI-SQYeYKFt*;C7NjVEUfQK-eh&(N~YlE z%`N347Rl%;6AoMKG+#_j>?poXzfb=Db|vxLGoV{*QUh(l2TQforHj^Q z+QTb@U*I0rrC_J+ZN|Bn$3eWKtbbGt@DVXD5d zWtsV&N4kf>w?!z!q)Se6Se*Z(8n@nt0Zi%3vRB(ch)2W>CIZ6z(~aXh=@#X zxvsSr4dy=KKh3QdF|35~T3{69g8h7+C=9m9$5(yXZONsL}y*n^ygrS1@F!OLGi;but>3>7Q$k!4?sc{Q!{SOrJM8 zuaC(=I>#l0jcDXM@f7m8>rqDleaoovAZt5;OXtj{>;64`mftY1u_IZ?m#p3aEowNy z@f6R0={`S)_6$gOTh`((_-E55d*E;IWiLobmKE|as;m-+mbCgRR;zB1*Ed|s>Htd$TiyKH_D$Jd#-!uE7p3iL1w!*^4W zkBXo-9JPLsG8hf{^oqy6=NJIr^e{=c^w=O6B^vU_4>`BxK4 z8d`YwK^idAP+m4b4NKe5+>$iyc;a3&Ez$~B*|cNjkDPWmUn_rP$X>1Oj9^6Su>)Cj zO}^*(T-s)>`?io*L%P4yL^X09)2)fC@*5L@`@_}+dWrS2bye`(0pYU}X^gwE#@9YPX13h46h<IazHc{x!JX3M!e|$6 zf^(zeof0ITEutR_Q(L));$>Jp=2rrcOAv&X##Wi#0OJKBI<5T$XE)%qzHSp~XtwVk z!)Gz~16b&$*%82M&u4mh6wxD?39GJRetLzoEg<7=BTsi5`Ky3W2m1Lw{RZd&)_KdA z_vsLyyN=FfuFb5Y3p4BJh~Md*RJP?~LX3>LtR8GfME_FC`_nA-1eS@saqrq~w9ui# ztsz%k8=~Pub2Up6WOSJ^O59%^Fij95dHSo>43BwgRSg~URljnI)p7o7)oEe8%B&;9 z?tbhFl)xjOCwU1fOqG{Jr^It5O^(<3Qfy=TU47V80megB>pVXysI`r3f0JbM4)8-=WfHTEs(eYG|4iSLsH2e8JoVqZZ@eR4d{ z{WimV@%Hq#IN%8n*AE4MrpERZpuR&1yxu2f#-qG>y?hOy8OkKa z=lMzJVDD8Ko%4op5q*jnU;Cfkd!5UeVSFZLrvDGkSO^Tki5mIhmz z&QNAhBQIT-Z|MxhjlF|&q@NnQ*lm=YRrmjH1LL+C47%?hfmmR{qg2Nf1M*WSmKgbkVSMa z(uQ=cYj0Z##IaM^Sss>qL-w7BDul1TxbLS{Zfxe0p2(Qm%D=Dt?P9igZ|nu{id}!L zR_;6yVEU7GOt0jcFBH2Z(-FT*Bd>8uU%#eUPk$ZLgiFv6HuVm_=hg-8a11i*0|u~+ zgGO>VHIGO%)`pd$OCZqA)>lH6uirDR(K<1aZyEalmN&+3dR}#GJJ#k`{xvnu@>x*H zTE7PeED97cgvV$IPw%iU1_Ea| z^<8ew_UmzBdWAo|!j~Ds;~bRP=MEYx*9@ki^-w&^rSkpNhQ?>c4PEI=j+*31d*DsV z_m&?_1TMwQV%-r&(IjhU;<~JD`$pAfZwqd{DqX&<^26n+^4%XoryK*i!+}Q}H1UTk z!IfyUNIMiZ6dUj@XSS%!iH3kutj|Zn9e;^^^l{|ewcbl}qUXgvIvP1`?X0XzIkA3f z?4x6mNo!|$FRk@PWtAi1Upp)N(%Ni9$(m{wvz8mS-EZ(eFi1^=@~Ea6k`L4;HfW+_ zx)zjt&IB4hZtC<6FHQdG4X0++Rat8upuVn`?#{951KWP&hoi1}L0Sus@ zcHoviF}v9|dzJ+qN2_K9Ju4?xcf79%8B8WUidABLEA~~NC$c)C-Q>60AESv6F*+W~3~d81LtmP$Z0oKnhO@E$mLJ!kJeH2sG@0EdJY9de zzR6zBlp(zBiA=Mu#hXARlwKA{uPDO&T)JFJsQFHA-Y!6me~X=u=U9GV7*li)kJL!48uIXu5IE}ksAMFUuG~An8ARmaTx!)rW*s+ zhiJ;Zyu_M_nfD2ctp-t^ zpPLc*bLF!qEE54Lga9$)3|jqi=ZD0SmPUKoiO^q{FTN4UKwWPOY*~09QeVS437Ukdpvw>#`=9vQ6*%PEAxvqkC`_@HzhH6{e%&f=+ zyAZNQU!T@rJCk})$Tup0IXv}5$0q7ZNf$bx^PZ?{ab{GAC>MN78j6w!^x`LR$9=W{y{y=D4Gd*Iv(Y;9x z>%k%h;ct_gf&V+in;nkQX45t8G*|@crO4?3C0;FcE;6N;Ay_;c!kyl%Tl;cjWj&Cn zt7ltrKKKUE8tk1|sDTKq$hWut#gKy)1@_a#tQ9^jlnzEJ8-cgiIyuUz@QSd#2S2ya z$^P03%0v@(rui`z6rF@B{g?$xKZk5e8|*(qToT4Ms!ocOVBaRu{UmvG*9w6g6cJ!s z25=hA$^m0+e`!V-jr0p>mc?*3Gq<=(f+z&dK20bUq8e3VQbIz;3I|Jl#H}hH(1+4G z3y5%Y>nKM^ZO=yBxs@CewCVVtCZY25dK@Tr9YFbgV);wRW~Nw?=ZX`veKX1;{_0qd zukz*P9|-R&UycT2hpX;D7?|PrLDEl1z^ZuDbz@ z3m?!}$d6}ZO@R5=ERviGT0h%z zKLgr+z;HAEUg?{Ln1FwiJSb*)Mk?Y?Y)Srt zk_zd^fYlg^kMBCTYILI=J6)gPTf!F@9fgcdRS8TO@L_|Sk#tI}AI7G zD6P(CjWe>yNWR37*9MyH*H1NlW@v^I;&py|i<5?bmQN+i^gRAuBsjQ+-sqU&kcw*c zOii)>vZ)aD;Qf!%$Y5tD*VrNds@ljUF*{o(&$1(vwY}c;M|}h+9PbblWNnuemK$+m znVagHGO>e#O zyLvAxW(RE5+{k6;7OKc1wQl^mUgFWKOmnIWGX+(b5KD9zf@@0o5Q0zlP>R#=r=5z< zJ&z(I=bbx71)eDV0spfwoP$m45KEsav}5D2n`+#ZI8=N1SP=z~{4T`g0>YVVf&HBm zDFiMBhGUi15PsWVWV+EjUi-7 z@}&KF_RS(EgqhQr&=7{%_ZHHQi-n~JqX!mu?Oipx*=}>nU4rtq`yl{G$UokhRHCDy zxxRsKb7aj>)L!)S%7*5rQgTA2iMy_Liv zU6^I@jt~ z^RtiQtLXj6MG4|wt#SSl=X zjJAMy1uT~TsmAmMhazsb4rql+t@1rv2vQbdUL#TZqDEGBD)>UwllYR~>PxKhpJD2M z_rpC?dp_I~+>B;>Y^SgNccCDg{o8{zJA<3wP?ERfk7{iuHO4n(EsbA$DEbuLSHKC- zgTj7C@<^2>>L{uBm(f)Ycc7m7{C#du%`L7l2;*ok%ypABmh>liTx*Wy?Q0inh0^N| z@YPx?^&N1tZl~p~j<5MZAAX^|-be^WOqXW;2yO%{P6t$uXD|3T0zm_z$Cd{HUH}>* zd7VuD_-D)yL{8#VW$f^Hc6F<(()A(B_st%5h4~h&4)1d1+>Onx{_?#pULMk?rXydX z5N8jfiB(pvR#>S3;T%Zv+7gnwpWMO3)BH zc1iSNSE(^l1tjugcU5_!mo?hx5oK0#(X*^dc598762!lf9Qv&T(5ztlJ&ai|we_>-Cm=Vbl-Yx2d@3SAlAxL_& zICBR-)0?$??C(~J{#>kGD69?j8{1_{jvbkTcjzN0qP214oT#`Y%rzNDcnDMZlCfZX zp+3e?6Y@l+gzXLQs)-^}d0jovNHroj=U3M1GQsw~QeCS8+0}taQTq#5ap#FnY2Rv` zQbotz*k1=@q*XiM?8U8vJ|xS29aHgEZM`#~#y2$E=fS=Lz5d#I7vFfxk_@4x-bjNV_?*!Tz#LAuiqv0fvY-~WPv|v#A8;Ba zzIsn{{~Yt&F2aii-)bxt8{r9EeBAIgY7jlx`I@2{zTUQ6#_&Df zxF3D)SkKYep)tX3*-+&)@HGu)qN^FoCqG#&y-mv~Qah2YTV= z1JvSYi?aqP>{=!tPuy>&k{N5)Gr_=EVP3Xo+lUhHE-V7lmCF#0==6;*-CBhsx{EFYtxZ!brUmO-RBIY{+n*5e!bc1z?rUL8aMtjs} z<+&$ppSx2FZl>^(R=DdIjM%EsS=rMZbd)ZMR`WC;jL*-Ks=-9LE9*D*)fvLLAh`rD zFTqG5?8E%O=(~VEHlWB(%KaCb6o%;Fu3&6`iD6Kx%J)*{XqiCF(`5_^9T}w9q;<{+^Si;)IPS zM_`wh!0w*a&I0ANH1)4GWw`qv1Fr?yzqrkxX!Em|PZ@{2ZKGp{Lcw*v;=$VLoBOJ7 z_An+!&$suOMTpPR242vtiiBjWikRbO;0EzZ(7-7nxb8CIv?Z9BZX*8R_j=^W1OU|l zp!;^2&Sme=_|J6Qr%Hdyyq=B5*(Rg&zDYXoV8vVo`_QXL)A&n0U_SY3OdH0~IQth+ zTF#L$>i;RPyy(1Ah_pX!7dWq^R#@Q%xy)MNxXij(URopRJC_|-!a^!tXvZi4xVnB? z!}gntOueZKKlPmjytBZ*cJLiJXbs!nH}4=?3yf|X&jBg?rM)NsXaQND)ta>hmKg1O z`x3KQ4h$S+k!~O{A=rKMI5T8h7J4bDw##9vA+GqUBNs(_BPSSnYo@=AfHu)-`dg^J z+@Y1Y4<7g@-e~oP?Ik496DO!UPHSM5{%4Hki&-y-9r;Z3LJ540V2}~l#RTY>$ z{7t_${bud?aPQQ;vETh6);o2efkM@sdVbTFgzZ^=q@iN`*~-Lf79TipE{~wIljYa0 zEs!1TEF@vWt1uNbT2p{1m!C9dl7XXW2+7y+%Hr{!$Qi0$NA;gW0SyEaj~4404GLY2 z!5aEy;0-Ah<;IdCJ6TbcKZ*@$5;wf%lux=T|1r{3{v#^CE#O1BM7ef3xnS%}u6x~F zEBLie(dO9D0j$_NWEy?|EB1sEI7jm!zs_MfEjJn(?M1H(YXaP9XW=ZcqA(6q$reUE zsMr^Km1q{uPVLA-p;KT6vY6<2x}%^0?D&Zh>tHCt0H6I0Mj`;6L2DvY$TVJ=&N+`3 zx^T{qpD!uSi+RSjDiGg7Y!Ha}Y@-2H1G1qv2&!Nw+Y)I95D9V*2gCrhUkGCA`COTU z8-6RdJ^3y8Pfuh<`CbZd1Y^5QFKDyOi){gl8HtJ<)FUlyAM3!n5(Lj6$|?NDk~Rf- zqk)PCAE8Jb#h66XiNVgJqfP56H3$3V+-%t6^pa-K0lX%taZ?at0){ttxF`w2Orf9; zcq(+%FRBF3Wa{Z~>H+i9v1iTJ9y5rCH}U;}AJR!=31F;E zg&%OTL3um_hd`LvkxPPI+qhGS=Fn5H^Jm=Z_=9M{{06$G&|}Yo4vWG;Ypp$|$5Nv; zI)mSY0bu@rK!Sbxbg9!9piI6eay{86!&yYeTYDIfu7lixu{6m!G#j=rUg^LL&70^u zwDVJG`%l|cxq7O6@4#+`gbJe(bMfUQt(Sobgv z?95m0Lr!jHSkJ&m@PM@UfnPd{7q*7BoTK#H)fgI~5Vn7Q&R_@ONR~&|eIGDOvX5o0 zK0st?a3W%%u9sHMHd+&xW!}V#tIF9V!h=@CriablgXS7AS6PU&``$R3ekiu1gpG$n zY|yalB54r6rPh5PJN0Nv!NXCeu43xC!qhcms4jhGdefs^Ro4^d?lE)qnX7iN?Hj0z zsvhE)^#ZfQQ%v_1fW?KYrm+ftDS8H8N=`NFaS=OUwv>T80%re&n0y9JU3mf)cy=zI zNDB%F#fTAn&1kqr3J#kR~{wk$GI5@vgj3GEl zOxP5Z`Y*Bf+#|Sgs_EeBL!cffS4b>pCB-mylDsCV%t?Z(O!Qz;?MOv*8f6&H;pgot zLTeHAB=o3XZP#2C z|MMU%h%TZ8c{^rVzx>Xj|(QuA_{iusvt5>4E_P zS`X(lJTGw5x|NnoQz-3%On**iWx%U7_TFD>#mqeNb+buS0FPC(Cx)4!9B0|wzE$(O z6bQCzA1fykq?w+`MKB5^ds3y`!np*2F7{GL)s_{~#SK2ViGdrLD8upd?K9psa4~rk zza@v*S~Zq7%ybv7b^}cjj!C?FZG(L(GI9n=9zVjvQiF#pw+Ih2UvV3Eu^j~fwcZn% z7CTbN)T8AnuYKdEdgOOLBBe%qqb!(TU1x@!8WLIj$p%yNEQeuAU24|D(;Mv1KoXor zouxINnLg|tn+=O8e&!LlOZja2nvpY!1yt$LtLcZCiFx_`S%AiaQhoe0eyb{fzFBb1 zaTdy!{o${tz90L;(b$XGyfgt0$L}y<*aI2H;TUlN-9IySl(}&ygO>%ojDRb&eiNs za{`EA7qEZw{86p{3X#QHha;LqOOW3e;=lN}&e$@WN`=mz(j=n~i~R0vhUVbL5=yCq zhJcLGtR^%;91UiwD1u(1(AJQcjW$TfTV_mX4cY?$tdfrBGg>u~vBSWE0iii&uB7wJ z4sJ)pVyzLfu~V8SLn^bt3zb}1q_B~EEMaRr=b;@<#7M_9efFR%9y}#lrJ{z+(s(*G3uTHkUl;5Q7`!AUB zsO@{m^c~I=~!EhC-PN}DcbLEfxo)5#vt0q|2hALlKc_AAWuLQr}!`{tVoK08}O0NjmqbNty zt6C;^COOV1(V;Tbe`!Mj(S8FPHzC0BN|8a6Omng|Pplzko-!>aXlDWLO z@58;;E3ucnr?WBjieWSkVvJ%Q(hSKUQeS3YtT5JFuL+S*tU4x}I!cgAd|QPdpj@^w zs#`r5VulScbtW+*xVWL_?TC1-6Vpe&`Sh1fzRc{~&) zy}W3?bkd8plyodyiY2P`)y1Si^Bz-)b~=G%5shUYn~vY?dWuS5Ig%PJ&JA{@+scr4 zRz^C@kXcmrulz>}D_|LQerdZ>?{qfOPP{`Dx}ukzOS-9;Ey!T!uPK$L7qVU}ZuJ4s z`3;mi-ToeA)SPmYyY8fuDgS3#*7XuneZ{iGsxUk+;j~cJofllVd(DF4i8JPSqGxj8 z{bz>}gDxnZ3a)qdSTTpI!Ac4y!mI9U%3yhhUQ1ns z6_E=J_^y(YZ4lE(fDa{G42?9-~)8O!OWyUH#8ia^CPjX(n#<`u@sC}YfZ7A z+3IxGMSKH2jO|{OU1_qvYxmvPSgS>BAV^d0nq=MAqxeg!#uyi84>E=$&!smB&>I3w zGI5i4L&!vx)mp8JT2Xw}c%jgFH5gh`foxXL=clYX$+|mKxm9^rPJl3&m>~{PjMVm$ z%PHO|88bE4#aAn{Q?OI4j(QK6bbn0ZcT(JNQe?~Smxx&bXqT?1baCKnVH*oST z@U&lh5X_X`5ej4J$XGNVcic9xM3S*<=fz63|A;$NJ`V2j^!u3=)DlseD z)EF?s_|1J?Ud~g@5=h6Tmy5T~pKn^M88_49|Hu2|tyxBWk@uZ<`MAM%_0i^ihIy{p zC8c_E`~=%PAz3^`r~}|bSQ19z1W7YZ;qU|m!FdocYL!xK&c~kWD-gFkOYQgmF7^f) zP?;xkF~)Fav`xSB)W-6??)k>rvh3al`w!?^)xiYCdTT1%rY|43F@0y*(BS=)nudn< z$PWm&BK95On>uo8Y@8Q9X};~*nqjoYjeLEWUW)mC(@I|i&!S!-O-*qKlfb@UH`|HY z1}j~PSC1S}A)nrhZ95jviG73vnO){-qKc<8+De06FLE!)=-=M>57o_agi@{He#D~} z#5HL@ws!`U%jl`M*0i!WIUQLTyOQ#p3f$tgW%0HOrm(w*UT`aaYOwMZ&FSJqgPNuC zBl8;Uhz^mn8fhyvRSXAbysgZni2^~YhsBM9Vtp^^7+$Ao@^0WX653kv1#jr*gd>Dp zDw{|M6EEhs)BSzj{r!{sYv7q!eOE2i#lC;EVU824JGos974i+NBx!K45utM5vw934 z=f{MMRgl!XqFuo`+go$OEf1u#L)m-m*)f;E+==&C>&g98 z@{F2hB@YmN_Ei|I=Zjdgq^4R=N>}h1)6%5O+B~~Q4?{f6h6~Bw&bP`o9me?_tQL%E z)HAz3#&qaGhY_*1VNbm)P1Zt1rO;DAzET|!n@9xfP<=He0XDg1l_|d$3L|fj)7w{` zKMo0I>lGliteZGgcVc)NhCFt%YhXWkwgFX&rC!EyxzR{4)}W^fbSe(IU8D&Bc>sk< zud9kssvG319Cr^7xwtMyYa>qx;s$0UD$47k^9!#|O#K8dQuT9BhCo}C%d zAr1~j?j8ChY;rgSx%3AO5A1$RB}@twgQv3w2kkI|7jEUu_Hq8QjCw3wpz{DQ!$~lJ zf`jifPl4O<%NtnfLC?@jlau7S~_Si=;df=#?^ty7`il3J=-wo=x4x2=rl!kmtKz8%=}j7WnKZ@eUzL}^J^H>Yow5BcWtic; z>ChjUbvXmGE|Fl%6=$iiTQ#b7rU$hW>^@qpFQ#CLrC4vc3D|3>!J&3jIJmVW0VJ47 z`t-%{4{(s3|FnaP)^XNM2hi`GsIZhAQph-bglF`x|DI~ij>n7!*9OI9ncS~CW% zpHpjN$9$_UH*`6bA3J(p^g{BTM`Gmc*;JM-#O-<5G&=esKQaKQg^cO4wb{Y(w0h>H(Wz@^XU(2@X=LIs{j}cyqy8)F zmBVY^Fv1&tHJ7ng4Q@T8U8Jvp;)z>}&uMO{=M!i1yjYQ8fQT+{Zdpi@9_e@Zqvlu| z|1yUtknhQ-q9U**e}=xd>k2n)UD3fDLY~*{`q7N?ey-Gb<}`Wx5Y-=Gb4d zqWgKXI2eM^2giHl>tqr3Gng}Ayq7L@fE!Dn7i~zi$;M+v<)IaGcwB@r=57|vpd%~b za_hr^uhK}9;Q;C;nIb8SQVk=SDRjJBD22>~AW|DOef$Ndrp&15*uM}MW|q92#n*Eu z6`ALXMW{OZdsv@foXEBG^K|htL3~fgu~5}AEO6jKe!>lNFi*fPbQP^?q2A1L;qVh<|zgktw8 zwnMQ_#okfuD~frpCALhlLdBLUHeIoWip^E*I>lNPt5>X3vC9>ESh4AfJ*}9$5GCJI ztVpo~icMB5&_FDpSg~SW#bzpY2q+{MDE4Q?S`_=eVx5Y;t=LAzb}9CpVttCerPy|w=jRqP4HKBw3&#jaP( zR&1VPp6iI!C|01@rHYj*R;E~$VrMG0P_aVAmMJztu{DbM72BxTF>oT;qnP%*l6w?; zPq71v?Ncn!NbHx2l`8hCVl|3wSL`OmguBU=iv3uzhZWnX*mH_~N3nMllTumIvw+xY z#R?Q#saT0(%N46pOw(<$MX|+-bt<+%u}2lVO0nk@t5WPO#V%It1I0=eJ8%s;Iv9Hn zV^EJV-`db%k2_TZQQBWOYLDh7j`pUZ4`>{45~sz3&=qgjOeT^Uj-w3gq9+`)G&i;8 zHS~2BLqo~(OIe_j*l!%P;-+caQLS2;joCm`;@E~yd7d@+TpV1eq2);$WvXtrzfxq{ zG@$+Hj$;$DM|)PC7#YVB?+eLg5ZHmWq$jU$B6hwA$LjY#K8U-#D_7Lwy6>(C3V+32 z3;0O}$dbA^S)!lwlU4dDNiNgRsmb;FIWf6WKNFMB=_iofrJqsB>GkLUAB>#YaqP@& zXhPRZ$Q!~fHV@qf{^}GpFqF!t=>Z2`XzNCdpEYH8?Jka!8{J4k<)aPt38 z83%dZM)(fzeL$!p6cEm&jQynV2X;%j*K z9ez(E&o77%Z}aeYK6#Slxr^VG{4OB;m~b)SKX`97zxVQN9pPI9y?Zmi9zqMx%D6w9 zFo$pn;c`MFVJ_hYg7SN^y#DNrk1XFPImY^*{pDt6D(9EE$(@TLEFbo;M#}H#Gm}&f z#`y0#Gd;-zVpUe$Q|Mq{dXmo|nos7@T%1c)n`dkd9D_B7-Gt3Jufa)cXl`inzz$`` zadc91bITqmf%Di7oMc9ub(scsYhJi-wZYOfOHk%#&N1(t_6zLFFwa?$U7?(%=2~yA?dJNZx%Qar2j*H-rJRm~r0Y%m zR&!lrt{ctuEpz?YTtn5SWOJQst~Z%$#9SXU*LTd-Kg;Aa*9GR#OGavAGt^ zR?Zr8z13XTnQPKq_nE7|MtSC%YrDB7&2?k0(qA=k+gw9)lu~c5cbV&x=GtSfd(8EK zx#rg@XQ{c?o9oTydY8GbGuIw--D9o?%r#V}x2BtGy}7oSYrDB_G}pJx)eli6r>;xa z?}&OsFB5hVeo1(T@E-)5@MppYgu?{SozMe94xxZ>GNG7o4xx;2F<~a*IdEzgzx9N9 z?)?IOZy?-6Sn8(T%I|VFeiy%OgigX*!g|8D2oDof-VgYFjPPUk{%QC3S$=y6eeV6M z{O%^~A-qd?k8psXG7j?lF~LiG93h`@BB6*-LHIq-F6Xy~a226}5GE`ne2&mUxQ!4Y z_z7Pjv=h!GtR|EaE+hmfXC1#^Cp<{_9$_QlM}#K{n+O@Iqw!e9slyeQF&Nk1&0wrC zUE>VNTTQ&vT%CdNpou?bu07_u%Un%Y22b(Kr-)|4BEshhw-CNeh!Va^=pbb3)~`bk z9Cu|O^US3MzAJ?vh2}clT%GFYn)otZm#*JM{$CQ_A^ZoyCj6OjeEFAsgho^F{x_gF z!Ok6ANA2GOl{@s=VD~SSwyE8BkKq&QSJHq^3U?T|2Ng36+(yL=1NWq2hJou*%rJ0o zDP|bB{fapZ+*QO316Qb+Vc;qhGYs4U#T*7sF~h*!rI=yh9#qUQa8D{`7`UB^83t~j zVupe9TutmWz93noSb<^{iitH#HYny(>?Xz7lJO)Xib;}_T&LI{72Bwo5$Zgr*lwl0 zs@P7&Y{j%jOnT-L)AmKOP%(*slVyrMs@P1$WVJ5Ypx8Rau2<|{#af7^zM72aCz4#F zpD!gJ(9hE36Z%<_d`>^tCwJ;+e)1jtT$S9fpV`Te^)oYB$TXF@C^=I<=Oq{F=d5!N z)3=eSIy@TGC0iB^p4Ov4a*cjQC2!@&NOUAu%WobwQTEkbo|b)+#l7q2e+6Hfgf9@j zOt_m6BP0mlCTt))PWU@ z@4Qh?MAw|$T>t32F@dq;f}!yfCgx9?Jf+}-6Q>rQbn+=hr=E6t@fl~HRdV)F_QBXW z(@Nd=xkDq0@#@F9pMfWaP*?9V!oTQebq-614qKb8%V%6$kL@RKYc~7g&JnisrXA!< zZ|dR7F8PW_oy`OzX^4(%vcr`|&b39t+}J8~RmSM$1LkGpLvYEW_Dt}4afN_(9J-c3(P5q;kok8fa zfA9@N$NgL(DGo&T^-^)>c9ln zSH>nnp=7T{|0H9t{pH9-SUoGgxTw3&y2!5ApZKfRrjj zEO-_`=~!v@wqm^0EQ^o@BgEm!rS21_&9VJ0L+!m8Xxu8DQ=GIkN_rf7C7r0352%pw zHkoM2O4Mg#HzV9EQJ)kN^A(ZbqXMVBiN>t0lIdC7U(io%U)CG%ZQGYkV>kJxS-*I5 z-{_hLimhJKS-TeN$)Ut-?;E!DdLmyE{}B1I-`r>YVzifI$Zy!nHyD?%{d1U4Igl}5qp?mTwk3?(w zaxSe+T`uvgVzG2ibSlb(Q!4)w?7T-XIXWtu*Ris=LT*|jx1}*j(voC7-a0Cb|01*2 z%|3u;gMZ}@RC<7tVIZQWu)Z9v@@u9YsI7duxRb(GTxIP7Y(=Q+ygco%$m{d4r?+PA z+-wSd;T_84I5kCn@P*@w4E&di92)Gz*xO0?it*wDER4BtNu~q3 zvFAgUXf@KA6=N))w0M2o_R_{NY$~}5PIQE?$!bATUwcokd8C82*0NB?i?`-7jNZj^ zQF`$;_wqZc+T94?oJbr@fszBX%UPvMBlZkA8H{hp9IXTQ6@LI3@e#X#)wL z&gpxmZToOfqAHd2FQrI_MSlgB%sB$e8z_L(`Gmqvtf{?f;LqcL9v5x)%Otl1Vba zzzh&1Le!{H1Br?RH6cL*?xh;hmz>1JK2{0T+>8)+GwXIffuf1)p zt(FF@NQ@?6(NeW7Ra@=X*GUIk)GFYE`F?Aib0!niUhn_@KXfu@_SuiM*Is+=wbx#I zE&fj7Q@ky|ZNxhaiW*yyP^vaeNGhaN2$DDwmDWo~Hf(uyX8U-lv2*9aOk!s|TE8R_PY2k`h&6!_X2dv;;>l zIkC}Ff@VsjnSnbgnf?_XjgHz&-iqNAn=9hz4v`@A)?9u1SEg0-k7xl}AXyeUb?X`- zvsFxyAH18v$NNH@6W^nPt*gyvL>uFag*(z>D!FM+HMFv3*0#np=I^J~mPdWH=f)~^ zE(w`cF(<#IMl-~F*`MdDdp%?clD zt9d=v()|PTCByv1k$?2OgBt~%l#FBH4SPZyIF|3VC-J~wV{_Dmpwv#MkUNtH{~a{9NIG4k26_W!W-_XbV`Sm<(VaNzQ301UNl`Bd!hRcQ;7G@9?lp9xz?+Y~!IL{bOl; z5{0TD+I}Gdf@UL#vLk{BJuVH;`Gifw@%K*)-gb)CHG&Jm@^Ex~@U{{1aI7YHTMiGv zQ4)WrHh9}xKu9;PqV`h0mnFA|%PXF)hpNJ1dbNPgTm>^(ruS>rQJ?t^eU4sPxew|I zHvGJ6-^QA5h-*`M&z&{zY&f6WEQi+)!YglFcm>@qymzoS)j8L5r|?hdA4pl1SnpdZ z5fE%!yERUx3}>_-Iu3~;p)1mLmR1NuyS-EnrT|%P8WakC_|`MqRsz7($-9+m9$bv} zyq2FLK1YKhU&d>nNXIU&tLa(&mYh(}=4CK(5r2)d&tbZ0>_^zeVhT!AaEuo(6IHuF z(cAUf#?jXF9fTm`Fdxk7y;VXuJk!$kS|oVoUYzPwroke9Zy~2C)RVZYbQ-8gJX~7E z2ojJKI4k!pPt5&Wz8UzN5MSpn06+NC1%LA$c_PI42Rk1jp=NKesYfy&dBQ`>(MfWO zA04@TNA=v!Y0*6FJy*X~(;piXPuHy(nIH|io6;nWzWqcfdNH|QijI-~R&VdD0stw} zyZViqUM^(5Tes${K;LUcxq_KSRR#E)z=vbB4DPIfZQofJ!eUv|LmzQMI?pLGJ zKSow!A`~^$e7{tV6N9%P{)yMuVovhwkQr+^hN)uLH|552hT@ymF$?9No|8d2F?_Cv zuT}0zy1sP@*}OxUF>`4TS*-&;xuRXc9R`Cfpx7YKI7#cU&s^e zs-(9w3ZWz0=Uvxpo5styI9PU&H87i8w5vuY)}f@_)wde>GM|YPold1 zrG>k5oVHaQl>|Hg#9!gLETnz;j|r(f>VaX1dmtjJy(2RJ95z@}FgSU7wiojpaTIhO z9Tcj>{l+`iLv}KLgGPl&7c$lKuV=EKx;%b~C+cmA_xa=YxO!vXH2VkU(6%!?%odp- zm^CqBzT21?z5T>rlxZ|Lf6MrV-H=_6hSnW2e;Fr#Ti0tFCTt3Fd@oz zRry+~z)3e5BwmACneQSkTq8?dYxP~F^(4gRikZlbXJwJu(#0csC4QcO0GK%nra;%r z;wePt#{F?J{Gmbmp&5YaRIb0JqeV=yfOYY9jY3%Dz#!Zp!mjLXM7PBD(rKWOg{MN0 zf0|ms(yJ-vvyzsuF>D@i@`>c}DV=Vk?fqu;BJ8BQDGa^*6ZozLARz@t!hRv| zXy6p^D%p1oZHQDsF6~W__QuhW1U!&gzm6%<57+$oG$UDke@$rAoP6R;V*tAgTrtLg+%+ ze9Me}TZJ!~(d4WeoX-n0^Eu?q=h$4G%drMv@^1>l!bac^kRce*dkoAvnZ?%RZ90SF z31;vw+!-8Vsl+)adCQ^Ou01#USqujLgAT?DD)$WB#RGIKlnd3s4JLz;3NC}6h4L0> zKr#w4N$EnkE!gn7HB!@~x$$RxLNe!Q_7>}HZn(&tjz8;nv$t4($RzrlQIsN+$si-o z9fdua3^{|PzL!bFJdkm%0yZZo(ZN}niJxDJijC$yPnDa?P6xTTK z@Cb>hnJ;V&kDBZm6F;>?&-Qj~7`Lj_GPBpjb@M?ANFx~5yxWaZVH1}({WnXVCJ?i* zH@;g=zCE#%QJfIubkKHqv!qk z^R*j0#(x*1*S~pz)CKfr)7;2%T(&MxXoQGL}*75alVBUgNi3S8p7I zbXd~M%Mp_F`@tkf&ZE0%-@>SUdF?A`;#8`GuioSFN!pe?PoYEJzCBIbZ}=~e%Sit0_m}@c4jnG zdu24Rv~P1Ia{$)31SPUOdhr|U+ReHE*jx1w^D)FpfqAN_D6|^D402BiZTB?@!EGus z_5)*!_2@}@k5WS@iatxt&xIA|hEo{L@E@_-#dGZwi06z zyw+6M-y|2~0aI%OaWf-UKEp^?K>J151#=&8q>c)|&yHW3%cah(4IV6K$7^d&o7^(7 zHe&D>f3n1>OZu2O2nk>w5M(ycqxMTYvB^?bo0a^EJ6!&y-JGm=mh@UDcL_s;oFC*O z6V%2ay4XU$#Atb9a_S-@Z*G;tFP{7ff459Bji2NQk_DM1Nh6{(4XB&E)0YZ8@`4+40LItaac4 z{Ti!XK$<}eLYMd=vEvp|M_GSIhRv{TPWpz|90) z=5fTphGR`N$Aj@Bk_{51ro!BQ^Y`ViwBWDH&dvxx6eF;K4kZJpmG|I>r&oW3y}7@s z`E_uMY>kN}`}ra9V4qFi+HBPF zGGg5^U&usSU9tjS@<>;X!a~fz#!=M_Vd}x#{>*rwEC_Cwvj{L!Y;F@4jNiuF?k1(# z@Gy*FBfwvyj6baj4RCH5G#-DlDD_Fz;bu-0Xr4^?i_0`$m(@HmiH&-xX_3@qm1-Tu z?T^irIUYMnF6(_+!05YkKG7O}#U_s~08|OXrK52$c*|;dBC`y(48iphHk9rf|5Swh zX^g-W(gjK;qGTW%-(9>+4L78}#!AV3yXM~cA-Rouef4#HN&{ldiD1UeIOXcs|d4OyAh57zO*gHRp%$q%7q_m=TUYfe>t?+O>f^!UA zW@K%fBKx1+Y|s$!)%=R&jKAZ%d5W6j2v9}{K{1bV~I);Khp}o<-60{v}$x)G`)`hSG8HE5@0H|_(NLE)J_z) zuyV3C>qm4sH6=Ogc&6=~aKuWz>rR%Ufg{kDaXEI*dZ=bxj!AH$1hNMtE9CEd*8fJ(E$MxUf4wa4J zpI%uP+( zBpa*3!Ml2r0r8IQNf6WXE?ZM8OV+~PFmaI;vId0=wSlC{Zn&{7(TG175rzK$19E)~ zc{StTs-Z ziS(hExzW))uuBhF@BhY?2imMpjuL7qRPU-Z(Ux8mTnu z@T7&k*z}D3I<}AyR_ZQnv3NH47Fv{l@k4W5X2iLlEj?XT`C8lKPr~7ZN{hPp^VI&R z%3gAT2wi3TXhCp`M1h53Z@)Vy1Y*IWpzsVq;Wx8Us3(N=@Q^dGeu+Oh$3a8;qsr(r zV;`N~SLe-<25%LbAo2mXl(znM$5{BU8zt3?%Exs`=`N)bL5SZW*;Y*=?m) z6^VGE`<@K%sOgWM>d4D7Ltesbg)1>%IzrJP>s97@6hT#4a~J}lnZH-sG~-YU*Ds?* z)_3u>W?HFBxN~lO!+xH+A{T$A_Vd|G?WtitHCWGgoO+CZ(kc9*4wrUC@LOOvM^kYp z3-jeE=E`RwYxy+sso~SY=WIUm&Yn5;Uqaup;bE_n{9GBzH{m&mF1D8zvk6i}T)t|9 zEGf9hu-#IvnaB%cM-_B8#j3SIakn46Eo{CQ<^7Z4#YP=^8vARskp;je9+D55SNKf1 z%UPKFW@6oxv3t8ey?pudBdNr^X{w^&fYv_CA*;JBfDz53dxh*lT zI5nThXeH`7YJ#@n1pkUZhsP`HTT^N0V5;CzIY7nB_7xtp!I%4U(Wi}lA~A1DqG_7b zVx}e9h;J&%y}6*jsYF;NKc;S!A5-~Zt}9XbO{QCmHIv!_Od*W`UKp^%&*& zBt=r>=7%vy7I4|TaGp6#nIpR$<0^Mq4_n=SO;wgD{IZD(!+fshb1k3j@rM1$eM@1K zy6IQz8`NWX6JkE4%~ON|n6v~Kd0x()*!2N&sOGcN&{*cxTsdX!_z$cywsdMX7T?Lx za<{8W?nmYpA?g>84g2gWYyP&OcvC(mI>l=X?dFg-K-}}xE;o72#wp;ayhjDyEPxf> zqjyPkYU%A}OU&O!{R`XVd5-?QO#fc4e~b06wA!me z4$FA&@*Ur$k{|NaTpa&monIr#f*hs^$SA>vVpLt}kbw8{k5u?3X%kC1HNE zv0p`r>k5$hRFrU*!c#@$2pdQBZEL=g*rOLyL_)}(AXu22!%(U#+Y7VLuupWAXJ)a_ zyME!a&o;}Wl@@BH>Ng0-2ZPhbw>;fgml~$qc$K%7IP%t3SMI9w=Kc!-WH~`-ylcnU zpw+107u^1JKod;rBAxiAK%KQzGk28qZ85Q2JEdaL*@PU@9cZv?ty2S&!h5TfH$7f^ zo!9JkLpSH+ST+><@et|jUm_{Eb+e#W>tIu`estT0^g8}u-)0TmqH=;Qdw#ea_?$k1ui^g0UhUer+9otGC=WWzlrGs>WAeWd3Z117wHUIuQK~z;7jqq+ zCseni>ppBihAK|+>g!Nl9s?rdX8)U4sJvMW{(+`@Rt=R zAEwkiy*YQ1?)05?gc_)EGb zL`>X?mHTSm41TKzjeN))o(Lwt;KLnTg6Q1Q%cy#qc~GKY7o=`A#i7)6^9un2(-v+z zU1HZB*)W3AG(_negC-%g{qgCZ#4J`t0(axo#xgwvR|_8oTD&KG!e`F$C0NE_lIr{k z+s4HN_=ZasIqM1i7u^+j2=xQD?0tLLgR^95NEz!TrZs8@)sF{o1X6QgLlM=5HeG0L zB$zG$?Wy^NdU(0taO4TXb?n(+PGy4Wun?0`u2+l0M53N|E(fF;tLi+Xs+sN(6Qt!W%Y4YQ7NK zPz}sq2-!|;&Smp&_Mx*+MEnfqC>au>FpWF}=`BrM9xz89=4oMKYU1+Hl3vK*EP8%< zsOH!PR`r@=TFH8x!ibB6#7R!D^Hi~!lgLj*eEqO!_PHaSSbX*=fQ(e4F~C>hQgIW~ z$Bsj?Iq@f1_9Nn}RaFltB&DD1GT>Uch)-{--!RLJh+~{h(=i~y=HsqC;PX7fB|n$# zbB2)WW(0ph_(sczG=(_wr4by6K_6|+NV52iQu`=%3s!SHio#XEWrW(K;OV#t1BZo) zSwyxEC1y!jb0O4%L=K!NF`9h%qt}rvG}|~|NQ~yp#;*3$*oK(%eCm`7_dS=(hzk9V zwqqt`>u<$Jg5zjHEkqC>aTBD8s*RmoD-twgCPg~yjE4wFUhmb1Vmr;B#Yn8Le=)x#^ZS4`q+ecqm< zet3Y^gsIipTNjm{6YP8i;B^5LqtRj<*8P61)TY+q!@EVRKk#XQLWtFn2_bfu0fYcS zB6|Rddf84M^HKz~FRZ9bItP4hR+Cl}AjD)&tje5+J@HH*t(Nhf$M+<@^ZB04cLCq! zl&qkqVI!=7`vE*P&Pl9fJ!#iu?{Qt%=qR0gVV(StxGX2P8u#n_KfJH+yM=HEeh6*K zWbP9~3*eiELG%#+8y&}RvEo@h+<1Y)1FOl7!YK?kreFv7r)s65q<8~(DO<&?2u$8M zEOv?c42UhG3UBuNE<&-+M}Lu@q2uRxGPOq8@`f-`eBQB;fAu|?y68vDa%qdlU=~>A+ z-%)Au2t7yhIqgBDNg+?$8I91WP^ht;LJ{jyMnujz`%l$2ICw77dO$1I`t_w3*xFH^ z&TrO)i}Y``{;drg_iHV~-ji`H(euiI-_UMw=f|zUbFF}}ml&X#3gphu$FE?kRo;m!TN zXuv4eHv?NFr^Iln&0FEYEwixCSst%1hot(P7PwV|breehx-7_}*(t^xibkyY?`W_N z^uy5e)uLQumMse7iP!Hz+D0Q+AsV?78W0Ma5%0;tKD8v+HHsAJ$~{u8(-r9n{zKK{ zuhW$sHh_PDEo)cqx4V)$>Z0V=yrC;689%e%{8HXjF^~g4;|<4m)}^!nP;h`8zUB&S z`*{VnWcqKCN9J-)uq(mpn10C&erqE-@?~!@DBP% zdPc@SmCuzejud4$yewHWsAViCB*B*Xz~30QYNy$&JzP8anH(0e!mW!cY8yED8%MU$ zEiwf4xle_yv35r3d~S+-W#LwNC3G)XSkBTSogf5XY%$VLMGYBaEo3ROaaAw5?$%Rn zSY_;d#Z#=zMoIKKv0|5DXaBpO-bbv~Bf@e*$%cY~S(GyF5S&bwCqte}c*5-bbeft5 zu)+2!519V`a$e<0CXYP5%hGEcl&9B4G7xj)M|tq*ik{~MDV&4LN`5JD&ZJXSEiwy8 zz*+7Ys@@C4d-Dd$7!-08hoRX+HqBPFS#N$;A!M2aJ2yIu{K=ZF%{pguW=x}b10B2t zP@$2|S@Nvr$ns09U|ILKm)=3OnE1`3PI8ur05-?RwfopCpuE)ks0gg)99IsgbL4=T zjvO${kppHYJ4K{ry(ITgs^X+Pk5`#ewNV_Xb%cu;Z6I=WGFn15jN!Il_c2I-QJm=2K zuoU_YV+#>px@|#eU2Sg6AKdw3ytg1Vyw7fQ(p8|IAu|(TaKibjzT@TdZ{T!9MfN}gI^thzyZJ(FI`+3vn^f?_ct zo^Bk4d{SpYDy7CAQ98YI}Y6tW|Fq_dl;;a7xxtK5aj zOB$n6Y@x>oyMDxICyl)LrXsk+ef(g9E9_5>qHCTC-ttAhSCkBKi-={k%rN80_3w)JtND4Q{u6UT}uw>c`7`gf3qgYBZQwcuP1Dw@!H z19X&VPp(@@Oa)1hF~@KqSpR!|^e`BLn~39zz3J`x`4u^a>D&u zbZ(2q#bIIC6|@P$iZ~n+-8{hr*A_h{Jln>22HpNtcO)yFQmOyc->JLVngkvbzXco$ z)lomSmMxVU?Fus^%vpk5y$<2w7uGCoNMK#R1i*w7=K<^Tky1c z7Qgt-{_&3sx>l5|@M3@DSaf1LfsbfhWAi2*1MqqWm9xQ+?Mu2X+fsA3Vpz=e6nR+Q zzp2Q(syO&~gFi9b*FW1&^Pa>_A#qPQj_b?>|Aey4n~J!R864f@*U%;M8;F~H%W*m{ zG`2iZz*Q(PusqR}BYF(FgvwaN87MMj`n=j32vCKt3dU#YLev%7{q!1#$T79Dl@k8c z@XWK1d2!aqn-G<6XX?zLULV?4lsSZYl;LCYC~iIzw{$PAb0yJf%>P2QA{f~FzZi0mLS&We*wC5h7#O@aO< zN##Vi&A&XcZa8|sra+r>hsPpLL%PL0Y(tW12@ROEN9adw~P;z<6rL>7NT?XX%52gwE1#zINTuG6AcWjo5yEGanZ4eDSDzY{mJ_(yQDZAD6Rm!zc*O?U5)Y3ycSWKOC_V z&#Rsv^wrS?(U6INxPjjle6LD&mfmG2UC(1Dk0O=VN>-jd;d}nn!-2jSfy#e5MmM$c z@_H6GLCG@7#J8c}oux8mr3vl}Y?UPb@iy$_p6mQpM3SYQ-w3IaWdmRGeUL`+E%8CPf4<*SqD52ou8w z8ppx=q9-+*BLz$5Wp(Laa*vO6K6S8z;*R4Ac45bHg*#w-oC|h|ixwtc1wH$>u_wk6VI=Yta%=dV%<$mR7`3CGU+zfyp2Y-54;zZPE)B7A*8%C3jF)3>% zuZrB=YUrWZcoA5*qgod1I>3{|U5We7KE5^wnUI!{6lIS z0>Z!+sj!|3Q$H}Kd`6nO-%_C6dZ{zDi)ur4dAnbr=p(Q42RG|D{W-uBA#=4p zKlM>n`=f>|j?sb@-huDPJg}KxSmPm=xc#euVoFz1xXpT%y`}ah*u|bemYF*Qsfo_g zyZMG2-p7|P%E2jMr^zfRgQQn@$@G0PP37otW1js)g1s?gQ*n`X~ zNZX?+`dUU?{(bZ!<7KUM826u`LT8crEsqYRGbE+q=ro|;7f9(Ys10uVf2Eq zv5cx(tXiBNIGODVhpb(8Eqch~WO7J&n+MIi&3WL(;}Xw~d2;5W)yJ zMF+%e$=t3`H*e!^Om;ntX$X0`VAl?yO9gAayYA!Rk#7Fr^1s=5L4jTe&{T*9=Q^WI zQ)1eL-)SOsp0QuYd5N8zDpL|gk+VUQn@ENZYh{l*bg@qkU3FC31FU-h*-`bpM8J-Y zCuJV$mWOJjj#^t>@JCy~zAz<3!A8P?5}#P!}r}xgJzw<5!%Yc^+Z*Rlc@c zq9vsAOso9wbu9PJ{u@}YOXMcQ8GXOM4o^zQ%AW{Z_bh@&XZ!GxPj(F{!Io5*|0 zfH?xb*BunN`lbug7uix3CJDCbgZq;RF(JW*E71iU`wQE^;GS2J%YkPi@N57>{dtlg z`TO%kWS6HwY-4{uL*K{dL7VUU64N*{vw zFtZ1BJ&|OOBrv~pEhlUe5&G~m9+gDPj(%qOjx-+c9aRD6B|g+hi%)FQSNV2ovfJ2X zR17}zjnp{wVCF9XbC|i;oQVpO#+p%R;7!j(tf)6a=0YDA%U+6oRjyfbJF(5W91PNu zn6vTQvHwtA#bE(J?LXQiIb@|pon;eIOoFdC8jS24o9=i|a`lTBnHzm}PHy_NLf$fI?OPHY7ZgTE%lZ3XxmL+IVwL4jU0Zd>C)p9luBl#9jJJX%ftbJQj+vxH z=h)w|K>wB!BuQBnQj-js)yXY#K}#=Ogsp3uV5g{wB=+?n3`P4NSBC#wiE>mc!SySD(Y=dSgYn zzws)>wzRbzCsPq?$872LbTyz5i^8jIYzU80i(#x#mzi5+-nP75SLcnM*1oZp3*NP{ zleit(X8qwPh}siO~5slJJ>R!7`c0_h0}DD+N_*e49hxJi-FI} zgW;fb-OBzZgN&JZzy;rx@>?dLORt>QmztLh-h1Dol(#2_O&CYaEHUl7#WKLtw|RrY zG`0QlsiKC7P3qV!_^1NAyUIT23w6KB6BZ+h&5|79Zo38uqNVf}xzJ)anl*wlpXlv) zS>6Ih;VKj|GV`AzN-a!O48ixg4l`?Vh9j znEH|+w}ccNE=fA`X^efbB7lbPiX71uhI+S+GJoABXJUV+SKBzXdt62x`-t{qi(Tr4(^LL`n-a)0=mrN_ueEfbKfU+iMxV2Tz{_Pgz)t*~_oL?# z9%p(J3ZJJm;du0vZL@QxH(`AsViQJ>(ZIIZxzn3+gI)KM&|W*KBw08q*d?YwoI#cM z0Z7X6*sq-XqZG6-QRkVV0%;8huyrs7?;F%`*=f8E%CQ{^7IMR#;wtc#N@_jA$vCB-7G7taH%Dlx;J@T{vIed>v zxhMZ;Z6&14{{Kmt=+(OpkpE+jL9~2u)O9ol{)B495R5Rsp9DMhxOBcka)#t51C>LE zV&d7$J0Y21*DiTFj+H_C&7Sh;1iaV@iQY?UcX^3RqPN>sxg>ftFFF|_WmP&zt4jCP zFMKrJyVI_G5QgPDu6+R`Lq1>oHGZ!7#O0gco;?0}b8`9XbC-zV?s_gP?Rh1Bbn&{; zOpNXJ#OUM;PsLOB$bF}q__2|X2d4Gm|9J6{@1%s6f4WQl@Z$2`al)(zXZ0GQ3~m={ zGv7%T=MOreBr;a{v6?s6RN?l~JXgFvhSR@NnJ;>}^1nu22Gu8|ogDjn&709_?U$6q z&Tpjd;$+3eHK}!Hw#|=Nzf@nhvN{$rKqb+FWJ3fR0ll3QT9r>J6 zy16%%w~KCi+Apa|Hgb5}r>86bZhmPR`Icf_b~4MsZrBxz#w)x|#Orur_Ry;({rW89 zjXXApMP`kCKh7+p4__9U#eBnjOz;@o$^F`uGH0Ij0rTaGui#E%Vur0&H<|H#BYM91 z?Aqb&8`I|}8}abCS5d#zSN?QM^ZZupnup|gP4>J&hEP``=hT#L1iN}@Nd~}tR&4Vw z1b7fO&K(j;bW4x57$Xzx97_&ufPHirH1&j=TdlW$?6eW=dO;xpAd$*?kfFyREL1v#Zifecz!z*&`HjB;WM_H5%_B`7rwnt)GvSDn*A;R=w08I}<4d zJI`oPmbLZ`{`C1V-_}Kb;YP)YCjY=A0B;D3)WWxB3ZE0-gddmFozkKea7yR()%$Uh zuf+qYjfQ`XQ+9rK+0cJmHk6uWgxsQVY{>=AUUFbHYh^~WiSteFPkWv?1aaPU`Gv8xnP)|d_cB^X15S~ z)g5)vnOqCyhoWE31?Hhuh<@H|Fc|I?3jemz(?gE*(CnQacGmknACMlZv6!LI6!VIe zR59seE_kt=hrDu;B)`2|q!&-rAF-b1JGDe*n`i*B;tJ}!4Ef|7gpN^ya>?{(piWhj zI-1mx)lEf`xQZ%LrDR7w!9&ZQ*zoG6KrGLB`)zrfAF(E@cq3c(7E^aI&R*|k_Ifw7 z*K3n)-CKVH8wlqCR5GVl6+|bj@DSg#ip05i6UGGb<|^LHe$NZ(7HzvVL9JW;wg5iJ zZQOXRqs$ILI@=|h9cLV3!_#d2VZZ9bb-pj@jqeio0iI1I8-~SqiAMnsS5898C%c`D zCzH6O7x;(={l=i?1jkns*?^h(E$IiPj`V|4yv?YkaKu{3khihNca$s4@YryBdx`3T zyPoV-KLBrAB)MBzv313D!ioK;T!TyPQWRpBr(w(knAB~a2gk+o%)-YPIZ7&T(Hzu)%BB}BZGUdi0^^P~9^a;C<_I-l@Kut1le((>$ z16ft=CiutOym5!({{kTUaQyqJ-kB+`DyNiIl~eruFVeL1XIXr=jD|1jbW9X!?U$mb z>sK~&2bvRGzv8vGeEplJIH31$u5zCGHeVr6)_>R?8pM)}x6B9|KVo`gUL5If49h08 zzY$M#Xu0lg#DJAI5o>1yPy83LiksZ0sk~(=sAJ);jd1$>f4C(cf3lV)CRgQ0&vq%C zXxgILqO_RzXf18lSKgL2s^kOO9rUH>O3jXXfNn|NDa%V;vhh@_sk3%hmbMEHPO)rSW-C|ix}J4<66V`DZ*|n(D$y?IFilHn{ z)=#a9*8TRCTl13SX5owkj`;Qx>4`ABCXf&)-^=PWkQ1A}G;yntf#}pe$ns{`a+t8Z z!%T-Z>*YS1MqQ3aRcdhQHyb?hW0P&m0DL)2V*<9Y`)E@!y9hBpP&+K@uN{dpXm~8> z$dA_2h4ALZy_)IGN_;$#aU2;(lW}D2@aV8@^%r}^o&H~muMsQhxTIyl%=y8tn;D;u zjlKm7=C;J5eO*F>-rOUpFU8X%V^dLREq(8i2LYG8nCY#_i8aT2eDNoI@f7-(=0=t661uq?BOSixlhcl3}6{K^Ef2ywP#S zUb+~zE`Q1%kve_TYW+?9D*7D%9?i12O}1ABiJ+j`a4Y~Hk^zdIE)xd-EwiKwM=wt` zo^H`QL8(_WGOfBFx+yx^mHFE*xd}}XFzY3Pk}z8x)Pvi_C>JXyu8jBK;H0#?j~Y2P z4c?Wctwxl|g}ob{iEvT$LLf5rR3NUGhdS>7 zAoHh(n6Nc(1)JW&UXpW%^U)nZ(xL?wEWJk_@0wNSGoxom%byiFCw|Zq#uP4M+^)3; zsomTnm9TZF>05i6d7H3+^1g7=cR{#0J?>#ny#RZXHk3Lut*U!h6!G;dKr{kZmrCRx z9IB}LGpk}#s@Ftg&R&2AZR^T?oyCvb(z--sWb9Gl1p_W3Ru z9%fVCY`xf{NF_lSc>L%*xrxmc131Le{*J-*+ZH;gg@`Hhq7%aMWCU#Zc0Qp5)h%2? zEb}>C8!S3xK^|&fOC2TZ(XF%%SEG-r1Y-)|0_N3BvOqXFGsh^Qm9RDX5^V$;!-42d zSyt_l!logFPg{P=KStF)D)uKdP0y|XNi1_;L28B)q?5s}XUJ@C3a&P9mC{Vkc{@Jl z#sK|Oy^`3^6nlPm0yzz>bs9>q~`gUTp%AEk&&^u+4U1<5qyY zSF6OV_h&lqt!=nzQmND}Im~%uT(1yK1|sS#Lx|Avpb4t~(}2@;)}MLkGwMry#&-A# z#C2?s;MK1r<@hUAmG8e?|CQ;$t6V8b)_NVK?WR9^PJEXzJ#Vzoc$KD_t=pWI z>d4$1wx;}3d%{zr-CN4r@rL4$s-%LM!1v_-X!22+ws13!EJdtrvBo**Sq#gPdlb=8 zZPq>KNEdxvIk>tv;`%Sug;}_Dn9C=d${2E_D{(Q^^&nLNs9a7DcD}$5SW4&DC2?L= zvYB`mf#8~^iQXWciL8QpDWjb2Fc}`E23yMLxgd^L0M| z!RLp3p5pThK9X+BlX|>~UVtNIcdw(KCOzpNiH54#%Dcx^5==lPL(V#G_8_otJi^MgQ z|07R^dFPxAyC=7f81|9pwPUF@NpL*pymk?)8qRBXyr<{22VQs2Yq^nxB)fAVB9`^) zSqOX9i}v!uR0t2A*ZzxR+UYMrVkaKc=1o#OeB?20hQZtCwQ}AZun(GJ_&upWv+)V{ zymppxXgmhQ(}u~m@_i)>k^akV;J~-1y0I!+?E0riMX|ygu{xO=AWcq*W2uOBVJU>a z_A2flE|3T3FqfIr-)K<7;5ljsQ(Y$Kz`c|JN*zB&2PY{VaXA4%HW8^0bCFwJolsQ8dR+$Xv zY|B9q_SFuH<<3gI$;FuDD%W4LV|diJL=^a(Z_Uj~&uKq4k~_Y~hDV3DA1jIGwI3T6 z%VUWDI48cxOHeysjxaWVLTpExxvtN3Ei~dtE`^oPwN<{fmHQ>;CGq~S9G=Q8>ta}} zXcg&zYT8Uyu59z=)(#JLc9Mv2KE3w5Xs}=R7Bc=C;544j!MH=yVDp~TO@r^_>D<`L zJ|r@4>Qii!D(yG4`N7V@h0F}xoY839(v(3#FvYhXUhLUyZg#L*C!yB_wlgM=z zGl=!VJFm_7Cu1bdAMDOFA6scYk40b6?3&*NZ#fLR7tUvD3-P0Qu}Rz~aZ7!hQh*%) z&-(%R_#jZC-MktP@rY6CTKVeU^1nsL(c9uyr@Mw-(%ef1l>b*}3rNf#@pR-Ts@3Xo z9n;Tkm_Ofju5>Q#aONZw6YrLVBPUkM#$ffB_UY%jdF*p8$%8kh$#wz!Ypg!KyIc;N z*&B`T{shU>XXTtwL~6=wpI#o7L#+(E*)P5{Fq7cYy!PSID(MlRSX z7%-o;&u>mVU4h67*-;REr=47$4?Sr4v~J(wQh2cXeNy*Mc>Ly|<<okUAjD!Txs|9WZ5!$b=X)$0&cgt=Sr( zxm3@GKYlVIjFn&|^!yqT{)&>^7p{DJc~< zw6Lv0G}e=+)tY#^wrXogRo%$;LDb-N^a1!&zqdQ;khJ4JI#QWVepB}7LY^&F{uPo* z)X0H^D#=8XBp!#w;N;BBLNR#4kUJeAq?kyH6=PWx!bFuD`?Sn9*_9NU{kDRJ?6RBI zX$T244yh+68jM&Cq8H#S7qyij`~lgjA$2G7Xq$Ohts)jVmuLQ-*usow-_>0 zTPnCqtUGv-ZxebuwmfzI=$XveJTW-RF?;6YEnT2c9a-4w)aF8|lB_Il4iQbl*0m=B zq?+v$JE-e>`)*gCtafM8CsFa6n?;p8sOYu@r~IpW8Glymk)qVwp^PZ(yi>r*e`4U zp}Q>oo{%m2y(cbL!l%7fSu|Yz-kgkn4=3+Ry+XtH=g5J^FYHr3w)v18zrSTu;h?tf z??1M;fHVW<@IFnL&Qfx<#L26_)omrjG| zFfKb3#&U->gmaIV|338`*n`p6E60yKOaHbNkIJJ<-XA;m)d7>;7V=j$jv? zhO~2zB=bf32q%aZ8$Tm^v-Qm%+4!tee9B8Y9h3jvX^_GovVL3{XxF|)4 z+pTN~x4yzKY+*wtaKB17@>E?FyUx`ysal*3%BEM)FX^m|qpjW(oz?!Ru3E8^(mO?= z1si@@oIcwtZ0!8>PMN`j`Y$a?-8AFszXmnXwsi&rpH1J6KIl6Seq8#_(AP<}`KkFe zrLUjkyvL?5?@YMzvGQlYM^QPRPVNA)^Q{JLz}8tPWr@6Wb^C^sk6#j-zgvbPIrBIg zzgg|Ir`ARb8fy-(ek*lh`LoFz(wLZ6G-qGkZ<5pGlUtL4Q?X2$eh9|iWI!T)zA{gI z-ZHtNTsX*6+xnZ7%l0?ftQA{U>kf_&KEPTPDqA0t(f3b^ciRe)ajFmrTN{5kNFPgj zBi0f<^YC$qn%rH=wAB-wVQ8xC>Zg9h3C;uza%Ho%p3RGMgk$~DuF9UpgG}$k$Ls9} zvc^kUj_omUv#jZQi0Jaxe~uO2`W^HWLwf87?xINO$o!$G zb7EnPmepkWy#1M(G=dlGKIL>u&lDjxGcqxSKyTZYQ# z)%WpX-P~p^5(Q4ZJiQ?boayo;R~u7PDEOUz4|Eh^S)1w`Ei@aK<+{Z$}0?fnb_#`wZCtj55C~yhwJ87xP`c zTQtyt7axd^U5)QrN`w^i?2$sh+i_sWZ# zv7jk2JH#?zM2A=jM91h(%T}L0PD`Ft$aq_pPgSU@crPdw?-Ik3vnPs8`_*y|$IaE2 z^iJ_*gS@HhSs@1oV((PwIGJD$aCJcfc~OENp_=~aNr~M)8Yw@T_~v^+mDug!S8AeF zJn{W>OJcL1Ux}{-_?zL5juE_ADOeF+s5qC7Iad|<)!!gA%*LU=LB2h9d!mn~S$E7j z4*ALDitwGKK7NT~&_cc=MA(#X;Q}^y?9267E5@RzYO3#VvM(0Y$C!})O;dJ+xGdB( zEtH2dnspUc;boMwE*UFWxI>|nqwj0Xd~>U4?AohAH^>SYUK$8nj{XT%Iuha|i#Ueo zx|(eXR0pv%WBYJM(xsNd7N_rwyvO=4{>X4|FAY%@%M(KPTAYD*JSjcPbkyna2lZFe zZT(fHtG}9@t-qR~^FpN7vG4%lC~}}>{RNT&!x1ZqMSgnif;KBUQy%Kv(LqmDN5(-t zm5XmgB{?5a-Bgxp>XddzHC3ppsju`){nBi)tC+eDNGM!HS8dhQ6I(|!S5&>CT2gE= zl?i|JKCg~iU4_>i_IW4EK5vBfP!wK+`#jNjol|v%Cwd0srTfcjf3&c9MY@@fEr;Is z8yO8f@g5>XX#d)G>1_$~g1!#>zQmOF-S&Nnb2@gZy+1_LeLsI5Im{o~^D07?U|R2! zI}@)m^muTYqdspqNYQzZVC&q*NN=|9Qo!-qj{9Xz$y3?imh87ebzo12o_FZCeE-k% zTeg3uP-}!GCL|+H;4#QrpSp}je*Z*(hXaWD*Rb}-P7+}$T5WjRH5GQER|VOA`#8o7 z@xl9W>|~>Ts_ZU*_n-CxJ&{7L=-fW8|1nA>>QI?01Y0TH%}nuNI+^UaV;$2Oq!s1% zV-500=aqA-shqpVz>s@XeRh|ZM`xyfV0dr1V7r&fetE!25_ryeA8@P&XoqYpCRiKexuRDm-j?Z z0ak4a_q1WlXSV}vG*ps%w1$h-(MixoVd5LoUg8@v6z=5oB_5ND8SDub+BhYn`B- zv5QD6e#pCYiM=7-hV7FCXNx?9R}_g3$NuvSy0|Zn?t(+{`W}Y7I6;2NxpYa!a{2@I z%60I#|Bv>{C4Us20N2XcD_2k%YP6==Iw3#GUKzWoj0v)%-x}4vOLq$97j^rQ-_JcI zkcoav)LUkUtlaqcZr^2_MUIZ^T5j7%l2hy$MQ&4Ue;gIqSx->wi7K$eL8-z2->JY{ z)~?@5FKz9+8|k?xx*)k*P=It(TBCKLi4+5)fM{{rtRK#jL@|-Mn9yq4HIuAKjsmAZfgI9%XTGF&iVcvf6`D&vJhVuK{dMTAL?N_@&k~RI z`;pRcR-M8ehjb|;&sV+%(_6_rC=hANY@Y)K087ZYUOMC+a;GM=SJj4N1*(4%$Ai4I z4sI2?^ovnpbdIc{X2)DD9lfmjTcU%F&a5hmqVS`SKauh6 z8`|m$u&Dj<1|9Kcv!MEZksmiSZSq&&FY@Ht8R;LX-RY0ym&TE@8fZiuv<9S0SP@Qe zD$e*u^Cuf7$`%fhQmsH}{2cO)ju@*1k=A`IF%(Z#w?>R^P5F0C38f_47>xGXHFblN zI=WTt_%!JTO~SXBW6tQbnauqZ670X!f1R4qf60@r|2oZmx`niC{nry2{nvkQulJW{Gt$dYa6ZhQO=ob} zdXCsH_GFy|4Q2FQ#Tk8X9AkNz4#dfV4L@j+e1XgD+2&6RMNjjJd4f^R4^7W$&n~ zboda_s`4XX4Z(n0R6=dbqdd^5k}*tM`?oP8NvMX0bwJ0M969qz+s*u*qwWz2=5TdnhWs}vpV64%f}HE&V^lRrXhuP*A? zQ0U#$l7`x+K`Q;Xs#CQ0+PTy{-EjI_nx)Ev=3&L&MQ{HCLV^rM2D8t)(0 z*RaHEt00R$po09At%76%6f<~*jA{uT40i4YeDfAtiD)05x;?$A{pLlU=qfe#Q%=`v zEoE{$-4Q9!=?<(>6p7LuRc#h+`)Hk}I90XEraRTBPBSDr&AFn}9GIna>xFAsf5JG0 z)!4gz+xFJr_h z-|mzbg0u~fG7IOwW^CuM^nC21wo_q=(i*uL{fb9Y5b#Ma#`rK~}@8;8=ml zJZq8}hgSSfR5^;OUZb7tHgB~LRIDE$84PJz>?yK^fDi5OA&8g$?!XZhg|iH;KK4R= z;fd|K3$?W8tO*^*UIrMhM>2mhqr%dp1U~hytqE)&S;ZG=TQ@%=SciK0-ucY`&`pJlkzN*mV>0 z8i`(7*Y!_Ub=3n3GjsHS3W1{s9N|J>(`;NcfzbQyQq3T}i;bW-N-SySHYQ;p(iP?*&4MDk?>1xXOypalS~Zg6;T%ftLcKX}y`WPCJx0X;$qmpM0bj}BKj^l{;Xrrie50knu*!5e$8oZmeVRUZjRz7$0 z`5~W4^mjMk&+vJfPm0ewe1?&py~HXly1s810NeaZPV4Mk`W^|~A2zQf0#mUWso=hR zV_|bR{bSJ$&$ph|g`g1Gauy-QguZL`Mu(O6;KW#}(ZFtwBNoS*hvT!uaphs%Q1E^_ z(THj!5h-<>&44I!z7wx~0lJP^6(0!M9{)m-XBT@g4<~qze+o2Ijy0JCMwOKgugkLc zw%*Uzwgy`QUSIsiA`d06U)-xUUm_@P4k$fJxPu|M`Aeim+BP&(GU zvI31lktrThOUyfTF~yD;55L8UGR9|GqAYg_D%J9hfsT!SPaO(}xZJ$l(fM4kb2ty; z9zI9tn($W9bFhoUbnvri;ka^=zKBX|?aen;;Wa9hI4|*8UurhvP!aBy+R7XKVR73# zt=W3|4&)I;<3fQg{(f_?^KQmP>W}kH1r;0!+}g^sWRT~}B%Qfc`I@(*9m115-bT3T z#?S3&YOfg{yS9DT9E2ZFbgT%uZMba_JH9V|S=eEr{> z(TS{k7#B2`>A0v z2DGxa3cHju+7jaN$8~xu`2UpHC9VyGtwX<5rb-jVSf|)=wusLL5TI@wT^OdsV7;c?Hv$ElslCecgU0Kmox~h z{L;-X)d}_j)+i{1Zo14GdIU6|5agT++poqXQ?Dmr){twiFH5f~O|L4k#{1q+6W(-H zE|jsC>&X2K!ky+(^TqOG6Mr9nY%k;FiE41j^n;x;Xb-mY*Ls!w6svZNbxB4kTHZ79 z*EKJ0$lv6zIl9JY_M6X($e~c-PsKh!Drqx6S7CMuPY`;rT4XW5LU?-R+e{T~Ww?rn zE+;m@xLXH$DxLz6nOqm~w9|{Sxzy7Vors&((nl>QkV0o}@YVFLIfYSJP+FQAhpV#X z!LhQVWsJ~m713C!T&A3jc@x#4FerEw7(A&q0#BiPnp}NxbR-f(O_Og;9^si%my$S+ zJI`ZIEO54rB83o1idy17Pj~Gzdr`Fp8=eoh%(osQJOTq`9t6lTPxQi8YjmM>K-5#g zg}cReYboZw=o~}6)>m=_lhjval^g6_4>O2Z>P(Bjn~s$j-8RJ(TIYXBQLtOIm1duu zH%MvDWkwJuwpBghn1>f;suiZl`Hn2sanZXvaI+q`A8gsduVS-~awi@&G^ z8B%V2M8_u96_+1QEX4uO!o<2Fup*stoq6>)6$()OO&sdWmqKry1xyP8ibbTYR7(i5 z_!mD^OSScojqD`rBe?y7daBGy{jQ_?C0Y;EB;V$(QN(%kE3(1t^LWk8Tahdv-?@od z%aSwG{j;u@T(X055yv;%c5-i){h}9N7r`x+$h&xBsX9G3^!R)0+2McUao>%6&3HUy ze-+EuMUR)t*ZGfE$XD6p)8y;)$Lr*4?BikkYngln9+!)jb_*E2jfkBgmIKLI1oH9P zwgWBJY>eIG_5lNIr50nGY4n7#C}Yl@d8CK^L^?XL&DcSO+)vvf7!P!d{UJv{c7ZAi z?7HeyHf~*ej05E3!fOkiFSfq(Z}u7^M+afJTNx2#W1p8b25T)(^#iq(j5ekpIt0J6 zM=J3>ecmZ=jF+j)x@E1XZ~$l;4co7!f^Sd(7h_z`SleqHQV7Q?gnorkF3t#u5|?3> z(VinWk;Vd2<#W3#zTkt{jBc+$`?Nqi%{q$H1tt>xo?X59E=DC5=_Kw|xuT7xNu{Y$ zr^M&o60tGWoBe{J;dV)xAl#*urM1OcxY_|W*tMEGW_-T@`p~QVC0~^pKWINq%W6tq z%D?#T0~8?!yK%e1nEs5^1&pzY>7DY*xLdmB*RJ^!aVdvnsozq*eRmAqWejrm}P4(vW>7J0*=lt!mu6H%2{PW~KqSJ2nDMf{zEfWZM1s*9*9%Ig*fwgS=^aXUHfkPVBk{oE24TeH;d|3-YToxJclZU(pZo4H;e{(Bi)(?Wd6E8 zQrDZir63Z*15(YIPjOi%R&MTIKof{wp=6tPTS1c=2)$GJT57brn%BBD^lMYJh5)@6KX$%xKg({5_3xPqPc}R^sSJ3Pb%hpW z1_rzC%M{Fwo#T{Qk|{IJC~?c2?3UrG>}CVBNfZR@9R+1k-{!I4&TEx^QXqmzWAnOR z+i(g&eA3bJZCtD4Eg&zlax)pu6Qy8s^FOIc_XyWpf90JRjY%Z+BBPFmBi2LPl!(lJ zcP@d6&dMH1W44x=PncI!jOd9z)QlIR z&-gLGu-+Q32;3!Nk*Nok1%)3D$jhB z$Wh?1xW(GNSg}m>u5@&+*|yA_2SrQfczQ(i%$i?DC*bK}gF?9`p*>XIrP452Vny*s z50jg~vdu=fW~Q2 zS!VXdf(borS(?aC&J;hvLPH6?vzx9=Klpusrch7Vy8TI>a-m;uzWFUV8J4M+8l@AE zWzf7+vtHE7HHBNhO{w-8{B?g-&~V%rymbo?!JTX#6#>DWpCMZP?A)F|`$t&G24BtL z4L3-1zA?;cdjS{AnKJ4w6h%(D{3*N#<{r-dU3`}gJ8s19IZBPkyWZaPRUAk|^2Q>j zMA*7}3)2LFsgDuNx>-yT%KpGWf9fFy})ajXVLeIROhd?5}gJ}UCa1m@Aq(qDL zhb}EKI3rj1+fr*$ zS5&Hh!BrRoh5^T=#K-x3R=mn*o9E-RdIL2AG~IbR{gC8rGm5mT2CXX8&HWfv-1nMC z?D%H*->iv_5r^@P-?vy^V^x04GXGxwk3rAa;5HH0mN`v^+t|`FZn@d5_kbCFN5kd) zOZ$9NK#RLQSABuKV>G9*m=+rC%Kd-Rsf;JtG+y-So7aP0#x~#Fyo#sv&T0IWa9J=# z)!@wFcZl$*_i5qvcH!>v+L>Ol#xuJ0&61&SmVS``2we&HlaD@+JNmldj5#aIEAgnZ zy_4@3dnJ@L%eeP%lc>!47wp3?;wp4?Y1j5@W-L+lY+LmtZr*3Oo zTP+4r2nG}U(U$(U#cj1~x9>FQV*OE6biU8mdB0~eLHpzL`S+VV=KbsbI``aj&pr3t zbI%n#B_Acr5LyLiIrH%ts>*T%A2d~hb-V{1H!55Ki>N+8gDj8)=sX?XK0i=%p|;s+ z&W{@+r9e-)Uje-zDXLjUm<~URTbSJDh-zXo`X7+}5pdmju1D{LwHGBXrBisI+3RKY z3Wny9ipV$on(a(D6J!Nl_@^SK4s$};H9?$*D|39CSqu5-LQCA*#%|~AiBZUDul`Wn!s zlfWz5i}7!BvlqY)`gEh9pK-W|%viGC@ZQ$;RV`xi?$aOgnfrR3R#agJgIAL4p>8j6 zl;Q51Bja{y-H(j@BkD4Yc(0`|Gf9;Z?hH6wPS16rFTe_d89=~DM{87b%p}Q?Bq=n} z?0yEnJif+4YeA8LRT<&d&!Nzzv z;O;qtAf#T2%FA1mS)iwSQHsYvH+$kX$fCgY50zP-dLI!`1OJ7TI!ZLG#Qi-b55fKr z6rWhJWzW^v&9YxNfYI#Sd(3E-mjONs0+`D&c+7dqea~o69&+yieUzD?F2d2YxJH60 zQ15&l%dwC$0=>PfD9h7LW$JG)?k&CDd0%gE6RltGbec6jk2RZ@#gFHA0?ADOB_&O` za~zACw6SJ&mE0RPf8}!k#ajhy8{w`?cmcc1=<~~3k`IIHR`*M^PIh~cGIJ~`I@GOK z{kdPkO{MI3!kxWn0+qHU`8?^|?W?5Ap%-e_og|ENPLl@-X>%Rs8ZD#qS*9G}u6xN4 zi6&9~0ySQ`Bgy=!Z#5UduTp2pJmgXw4mtO1+0yNSTweFkoqWT8{p`Xn9RBPcfzkQ6 zxgP7QMHLiod^FKl&qJG@lCKE9DS}TE9&Hzt6WhHE49RU2N$Mr;KY!533!03zB?F%( z!5`>ws*s&x{Ygc>4+V%to=xPg{vCUH?-Q`5-4PJX98BGGlI11}pW^FzCWHNi(;+Pp z*ss!?!Aq*R^90u#r$cHU(*`(?E(VM9A4~APsx4UxIL+?3RzXVDMZK6LxxTmKcL-K>dk=VqQzlCKP) ztY~w0nvo+CSGe<^2ynivwK5!2ipDesIU}G*+^q^^Mz?AO_W>mNHuw8SjsPM3k6l|N zL7&NWT%Z9DLr;e@6M6Aq_|pqC-EW{pkaZw@t9IJ~2W|cyp6JiDC`qZjSYiXemG0+1 zZB^$;+w`oi12<3F5Z;(|De{I1yLGER(A;K{Zz|sCK5~t*Mg$Yihen=bs3;#k;x%2@ zANVkf0>Za_SV2o@T&i%f7Aj<0a@(y`k*^hCuF|Wws_Hy?%#bRMZsyS}aVs*v%0i}< z;mw~V7eHr)@DAk%zK5xswzO+#z^=cjxs5Jk`nD%SZ@ljaGK;TmFe>{>|ORlh`Pa&udYEOxhj!VuN5 z>psB26so$vwp$Jk+c^HBMF-qByC1M9&_4PO&|S3a&;ngMh`(h%eh9*y^<*x;1S+Kc zxR#_F!Ww~NUEDvTMGyz!EEi|jJ`!xqeg>jQo!)*zOY#V@-2M3&t+^QgPK@-z7I*$q zaVC)m%;^v?ZOkgDnfZsw(y91T_j~lq=21?>*57dF`9zXrp;4uNpgr7T+9CJ)d`a`1 z+XPGAgyzQR;^fks)HiPUq_9yse2`!~Yt0Yi|Ic%)#a9}(g0`$2{t=UuSNSA(V8jZ)FL-@z;Yd#?*SrC#`;)3#RLOnvIm_l>Z=Du+_-)}!kn@h)ErUu%j z%!J!;=cBYjo4dG82(=ELBtq?`PZK@d`E>&CFJg2%e)vDsT0XdblwN^0ijEQ`zd-6NR5lSq(S7T!Uufd3jw|v16*W0)b05J91F=gJm+5}*yOfmbdHujCC2N^i zhOtme^-GLWqCQnWE-=LU{D3zx5lL>PA3s7>1FfjG%iRgrj-;~U%j&yNUiq^0cG@C-2y zavz?q2fo2qh`1016Bi@>*jiFvpcfLs3t!NHkD!u_=ispw&jB+v8M(OtmFvL^$ww|Il$6?w+X^J5F1WE3 zwc3h``bBxouR3?^REC>)h3Lt z$?SHCRGhBvz5h#ORPq-c1@fL&v}-m0s>H^v2d$$r#U`7Ta`ztYe1cRRyL(l3xbqQv zu^mm}ⅈ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 X`G6-JO)!vYDEuGx{`d8NXaxQj(%IsO literal 0 HcmV?d00001 diff --git a/OSlibs/win/libcurl.exp b/OSlibs/win/libcurl.exp new file mode 100644 index 0000000000000000000000000000000000000000..a2b9da9892721907d902a3dc7c86e7ec0ef9b217 GIT binary patch literal 8337 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⪼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

NIicB9=nAyUph2p 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 -#include -#else #include #include -#endif // return data from the server #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) diff --git a/iguana.vcxproj b/iguana.vcxproj index e7a0d7a57..16d1eced8 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,12 +73,16 @@ true + $(ProjectDir)\includes;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) true false + C:\Users\faded_000\Desktop\needupdate\includes;$(IncludePath) + C:\Users\faded_000\Desktop\needupdate\OSlibs\win;$(LibraryPath) false @@ -97,7 +101,7 @@ Console true - Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;libcurl.lib;%(AdditionalDependencies) .\iguana;.\OSlibs\win;%(AdditionalLibraryDirectories) @@ -133,7 +137,7 @@ true true true - Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;libcurl.lib;%(AdditionalDependencies) .\OSlibs\win\release;%(AdditionalLibraryDirectories) diff --git a/includes/curl/.gitignore b/includes/curl/.gitignore new file mode 100644 index 000000000..228a961fb --- /dev/null +++ b/includes/curl/.gitignore @@ -0,0 +1,4 @@ +curlbuild.h +curlver.h.dist +stamp-h2 +stamp-h3 diff --git a/includes/curl/Makefile.am b/includes/curl/Makefile.am new file mode 100644 index 000000000..7c924fcb5 --- /dev/null +++ b/includes/curl/Makefile.am @@ -0,0 +1,53 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### +pkginclude_HEADERS = \ + curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \ + typecheck-gcc.h curlbuild.h curlrules.h + +pkgincludedir= $(includedir)/curl + +# curlbuild.h does not exist in the git tree. When the original libcurl +# source code distribution archive file is created, curlbuild.h.dist is +# renamed to curlbuild.h and included in the tarball so that it can be +# used directly on non-configure systems. +# +# The distributed curlbuild.h will be overwritten on configure systems +# when the configure script runs, with one that is suitable and specific +# to the library being configured and built. +# +# curlbuild.h.in is the distributed template file from which the configure +# script creates curlbuild.h at library configuration time, overwiting the +# one included in the distribution archive. +# +# curlbuild.h.dist is not included in the source code distribution archive. + +EXTRA_DIST = curlbuild.h.in + +DISTCLEANFILES = curlbuild.h + +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -Wcurlbuild.h -D$(top_srcdir)/include/curl $(pkginclude_HEADERS) $(EXTRA_DIST) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/includes/curl/curl.h b/includes/curl/curl.h new file mode 100644 index 000000000..7c7d28d6a --- /dev/null +++ b/includes/curl/curl.h @@ -0,0 +1,2551 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * https://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +#ifdef CURL_NO_OLDIES +#define CURL_STRICTER +#endif + +#include "curlver.h" /* libcurl version defines */ +#include "curlbuild.h" /* libcurl build definitions */ +#include "curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +#if defined(__FreeBSD__) && (__FreeBSD__ >= 2) +/* Needed for __FreeBSD_version symbol definition */ +#include +#endif + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \ + defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#endif + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on systems that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version < 800000)) +#include +#endif + +#if !defined(WIN32) && !defined(_WIN32_WCE) +#include +#endif + +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_easy CURL; +typedef struct Curl_share CURLSH; +#else +typedef void CURL; +typedef void CURLSH; +#endif + +/* + * libcurl external API function linkage decorations. + */ + +#ifdef CURL_STATICLIB +# define CURL_EXTERN +#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) +# if defined(BUILDING_LIBCURL) +# define CURL_EXTERN __declspec(dllexport) +# else +# define CURL_EXTERN __declspec(dllimport) +# endif +#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS) +# define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +# define CURL_EXTERN +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H) +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field, see also + CURL_HTTPPOST_LARGE */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist *contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ + +/* specified content is a file name */ +#define CURL_HTTPPOST_FILENAME (1<<0) +/* specified content is a file name */ +#define CURL_HTTPPOST_READFILE (1<<1) +/* name is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRNAME (1<<2) +/* contents is only stored pointer do not free in formfree */ +#define CURL_HTTPPOST_PTRCONTENTS (1<<3) +/* upload file from buffer */ +#define CURL_HTTPPOST_BUFFER (1<<4) +/* upload file from pointer contents */ +#define CURL_HTTPPOST_PTRBUFFER (1<<5) +/* upload file contents by using the regular read callback to get the data and + pass the given pointer as custom pointer */ +#define CURL_HTTPPOST_CALLBACK (1<<6) +/* use size in 'contentlen', added in 7.46.0 */ +#define CURL_HTTPPOST_LARGE (1<<7) + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ + curl_off_t contentlen; /* alternative length of contents + field. Used if CURL_HTTPPOST_LARGE is + set. Added in 7.46.0 */ +}; + +/* This is the CURLOPT_PROGRESSFUNCTION callback proto. It is now considered + deprecated but was the only choice up until 7.31.0 */ +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +/* This is the CURLOPT_XFERINFOFUNCTION callback proto. It was introduced in + 7.32.0, it avoids floating point and provides more detailed information. */ +typedef int (*curl_xferinfo_callback)(void *clientp, + curl_off_t dltotal, + curl_off_t dlnow, + curl_off_t ultotal, + curl_off_t ulnow); + +#ifndef CURL_MAX_READ_SIZE + /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */ +#define CURL_MAX_READ_SIZE 524288 +#endif + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. The practical minimum is about + 400 bytes since libcurl uses a buffer of this size as a scratch area + (unrelated to network send operations). */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + + + +/* enumeration of file types */ +typedef enum { + CURLFILETYPE_FILE = 0, + CURLFILETYPE_DIRECTORY, + CURLFILETYPE_SYMLINK, + CURLFILETYPE_DEVICE_BLOCK, + CURLFILETYPE_DEVICE_CHAR, + CURLFILETYPE_NAMEDPIPE, + CURLFILETYPE_SOCKET, + CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */ + + CURLFILETYPE_UNKNOWN /* should never occur */ +} curlfiletype; + +#define CURLFINFOFLAG_KNOWN_FILENAME (1<<0) +#define CURLFINFOFLAG_KNOWN_FILETYPE (1<<1) +#define CURLFINFOFLAG_KNOWN_TIME (1<<2) +#define CURLFINFOFLAG_KNOWN_PERM (1<<3) +#define CURLFINFOFLAG_KNOWN_UID (1<<4) +#define CURLFINFOFLAG_KNOWN_GID (1<<5) +#define CURLFINFOFLAG_KNOWN_SIZE (1<<6) +#define CURLFINFOFLAG_KNOWN_HLINKCOUNT (1<<7) + +/* Content of this structure depends on information which is known and is + achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man + page for callbacks returning this structure -- some fields are mandatory, + some others are optional. The FLAG field has special meaning. */ +struct curl_fileinfo { + char *filename; + curlfiletype filetype; + time_t time; + unsigned int perm; + int uid; + int gid; + curl_off_t size; + long int hardlinks; + + struct { + /* If some of these fields is not NULL, it is a pointer to b_data. */ + char *time; + char *perm; + char *user; + char *group; + char *target; /* pointer to the target filename of a symlink */ + } strings; + + unsigned int flags; + + /* used internally */ + char *b_data; + size_t b_size; + size_t b_used; +}; + +/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */ +#define CURL_CHUNK_BGN_FUNC_OK 0 +#define CURL_CHUNK_BGN_FUNC_FAIL 1 /* tell the lib to end the task */ +#define CURL_CHUNK_BGN_FUNC_SKIP 2 /* skip this chunk over */ + +/* if splitting of data transfer is enabled, this callback is called before + download of an individual chunk started. Note that parameter "remains" works + only for FTP wildcard downloading (for now), otherwise is not used */ +typedef long (*curl_chunk_bgn_callback)(const void *transfer_info, + void *ptr, + int remains); + +/* return codes for CURLOPT_CHUNK_END_FUNCTION */ +#define CURL_CHUNK_END_FUNC_OK 0 +#define CURL_CHUNK_END_FUNC_FAIL 1 /* tell the lib to end the task */ + +/* If splitting of data transfer is enabled this callback is called after + download of an individual chunk finished. + Note! After this callback was set then it have to be called FOR ALL chunks. + Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC. + This is the reason why we don't need "transfer_info" parameter in this + callback and we are not interested in "remains" parameter too. */ +typedef long (*curl_chunk_end_callback)(void *ptr); + +/* return codes for FNMATCHFUNCTION */ +#define CURL_FNMATCHFUNC_MATCH 0 /* string corresponds to the pattern */ +#define CURL_FNMATCHFUNC_NOMATCH 1 /* pattern doesn't match the string */ +#define CURL_FNMATCHFUNC_FAIL 2 /* an error occurred */ + +/* callback type for wildcard downloading pattern matching. If the + string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */ +typedef int (*curl_fnmatch_callback)(void *ptr, + const char *pattern, + const char *string); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +typedef int +(*curl_closesocket_callback)(void *clientp, curl_socket_t item); + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +#define CURL_DID_MEMORY_FUNC_TYPEDEFS +#endif + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for + 7.17.0, reused in April 2011 for 7.21.5] */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for + 7.15.4, reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server + [was obsoleted in August 2007 for 7.17.0, + reused in Dec 2011 for 7.24.0]*/ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. + [was obsoleted in August 2007 for 7.17.0, + reused in July 2014 for 7.38.0] */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ + CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ + CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ + CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ + CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ + CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the + session will be queued */ + CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not + match */ + CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ + CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer + */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Previously obsolete error code re-used in 7.38.0 */ +#define CURLE_OBSOLETE16 CURLE_HTTP2 + +/* Previously obsolete error codes re-used in 7.24.0 */ +#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED +#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT + +/* compatibility with older names */ +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY + +/* The following were added in 7.21.5, April 2011 */ +#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +/* Provide defines for really old option names */ +#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */ +#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */ +#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA + +/* Since long deprecated options with no code in the lib that does anything + with them. */ +#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40 +#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +/* + * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options: + * + * CURLAUTH_NONE - No HTTP authentication + * CURLAUTH_BASIC - HTTP Basic authentication (default) + * CURLAUTH_DIGEST - HTTP Digest authentication + * CURLAUTH_NEGOTIATE - HTTP Negotiate (SPNEGO) authentication + * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated) + * CURLAUTH_NTLM - HTTP NTLM authentication + * CURLAUTH_DIGEST_IE - HTTP Digest authentication with IE flavour + * CURLAUTH_NTLM_WB - HTTP NTLM authentication delegated to winbind helper + * CURLAUTH_ONLY - Use together with a single other type to force no + * authentication or just that single type + * CURLAUTH_ANY - All fine types set + * CURLAUTH_ANYSAFE - All fine types except Basic + */ + +#define CURLAUTH_NONE ((unsigned long)0) +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST (((unsigned long)1)<<1) +#define CURLAUTH_NEGOTIATE (((unsigned long)1)<<2) +/* Deprecated since the advent of CURLAUTH_NEGOTIATE */ +#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE +#define CURLAUTH_NTLM (((unsigned long)1)<<3) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_NTLM_WB (((unsigned long)1)<<5) +#define CURLAUTH_ONLY (((unsigned long)1)<<31) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_AGENT (1<<4) /* agent (ssh-agent, pageant...) */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURLGSSAPI_DELEGATION_NONE 0 /* no delegation (default) */ +#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */ +#define CURLGSSAPI_DELEGATION_FLAG (1<<1) /* delegate always */ + +#define CURL_ERROR_SIZE 256 + +enum curl_khtype { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS +}; + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum curl_khtype keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */ + +/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the + name of improving interoperability with older servers. Some SSL libraries + have introduced work-arounds for this flaw but those work-arounds sometimes + make the SSL communication fail. To regain functionality with those broken + servers, a user can this way allow the vulnerability back. */ +#define CURLSSLOPT_ALLOW_BEAST (1<<0) + +/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those + SSL backends where such behavior is present. */ +#define CURLSSLOPT_NO_REVOKE (1<<1) + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* bitmask defines for CURLOPT_HEADEROPT */ +#define CURLHEADER_UNIFIED 0 +#define CURLHEADER_SEPARATE (1<<0) + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_IMAP (1<<12) +#define CURLPROTO_IMAPS (1<<13) +#define CURLPROTO_POP3 (1<<14) +#define CURLPROTO_POP3S (1<<15) +#define CURLPROTO_SMTP (1<<16) +#define CURLPROTO_SMTPS (1<<17) +#define CURLPROTO_RTSP (1<<18) +#define CURLPROTO_RTMP (1<<19) +#define CURLPROTO_RTMPT (1<<20) +#define CURLPROTO_RTMPE (1<<21) +#define CURLPROTO_RTMPTE (1<<22) +#define CURLPROTO_RTMPS (1<<23) +#define CURLPROTO_RTMPTS (1<<24) +#define CURLPROTO_GOPHER (1<<25) +#define CURLPROTO_SMB (1<<26) +#define CURLPROTO_SMBS (1<<27) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_STRINGPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the + string options from the header file */ + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define STRINGPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(WRITEDATA, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, STRINGPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, STRINGPOINT, 4), + + /* "user:password;options" to use when fetching. */ + CINIT(USERPWD, STRINGPOINT, 5), + + /* "user:password" to use with proxy. */ + CINIT(PROXYUSERPWD, STRINGPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, STRINGPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(READDATA, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, STRINGPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, STRINGPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, STRINGPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, STRINGPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind. This + list is also used for RTSP (in spite of its name) */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, STRINGPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, STRINGPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(HEADERDATA, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, STRINGPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, STRINGPOINT, 36), + + /* FILE handle to use instead of stderr */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */ + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 400 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* DEPRECATED + * Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION + callbacks */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), +#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, STRINGPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, STRINGPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, STRINGPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */ + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, STRINGPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, STRINGPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects are + OK within this time, then fine... This only aborts the connect phase. */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, STRINGPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, STRINGPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, STRINGPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, STRINGPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, STRINGPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, STRINGPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and + CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. Before 7.21.6, this was known as + CURLOPT_ENCODING */ + CINIT(ACCEPT_ENCODING, STRINGPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( + it also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), +#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, STRINGPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLUSESSL_TRY - try using SSL, proceed anyway otherwise + CURLUSESSL_CONTROL - SSL for the control connection or fail + CURLUSESSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, STRINGPOINT, 134), + + /* feed cookie into cookie engine */ + CINIT(COOKIELIST, STRINGPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, STRINGPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, STRINGPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, STRINGPOINT, 173), + CINIT(PASSWORD, STRINGPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, STRINGPOINT, 175), + CINIT(PROXYPASSWORD, STRINGPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, STRINGPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */ + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + /* set the SMTP mail originator */ + CINIT(MAIL_FROM, STRINGPOINT, 186), + + /* set the list of SMTP mail receiver(s) */ + CINIT(MAIL_RCPT, OBJECTPOINT, 187), + + /* FTP: send PRET before PASV */ + CINIT(FTP_USE_PRET, LONG, 188), + + /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */ + CINIT(RTSP_REQUEST, LONG, 189), + + /* The RTSP session identifier */ + CINIT(RTSP_SESSION_ID, STRINGPOINT, 190), + + /* The RTSP stream URI */ + CINIT(RTSP_STREAM_URI, STRINGPOINT, 191), + + /* The Transport: header to use in RTSP requests */ + CINIT(RTSP_TRANSPORT, STRINGPOINT, 192), + + /* Manually initialize the client RTSP CSeq for this handle */ + CINIT(RTSP_CLIENT_CSEQ, LONG, 193), + + /* Manually initialize the server RTSP CSeq for this handle */ + CINIT(RTSP_SERVER_CSEQ, LONG, 194), + + /* The stream to pass to INTERLEAVEFUNCTION. */ + CINIT(INTERLEAVEDATA, OBJECTPOINT, 195), + + /* Let the application define a custom write method for RTP data */ + CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196), + + /* Turn on wildcard matching */ + CINIT(WILDCARDMATCH, LONG, 197), + + /* Directory matching callback called before downloading of an + individual file (chunk) started */ + CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198), + + /* Directory matching callback called after the file (chunk) + was downloaded, or skipped */ + CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199), + + /* Change match (fnmatch-like) callback for wildcard matching */ + CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200), + + /* Let the application define custom chunk data pointer */ + CINIT(CHUNK_DATA, OBJECTPOINT, 201), + + /* FNMATCH_FUNCTION user pointer */ + CINIT(FNMATCH_DATA, OBJECTPOINT, 202), + + /* send linked-list of name:port:address sets */ + CINIT(RESOLVE, OBJECTPOINT, 203), + + /* Set a username for authenticated TLS */ + CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204), + + /* Set a password for authenticated TLS */ + CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205), + + /* Set authentication type for authenticated TLS */ + CINIT(TLSAUTH_TYPE, STRINGPOINT, 206), + + /* Set to 1 to enable the "TE:" header in HTTP requests to ask for + compressed transfer-encoded responses. Set to 0 to disable the use of TE: + in outgoing requests. The current default is 0, but it might change in a + future libcurl release. + + libcurl will ask for the compressed methods it knows of, and if that + isn't any, it will not ask for transfer-encoding at all even if this + option is set to 1. + + */ + CINIT(TRANSFER_ENCODING, LONG, 207), + + /* Callback function for closing socket (instead of close(2)). The callback + should have type curl_closesocket_callback */ + CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208), + CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209), + + /* allow GSSAPI credential delegation */ + CINIT(GSSAPI_DELEGATION, LONG, 210), + + /* Set the name servers to use for DNS resolution */ + CINIT(DNS_SERVERS, STRINGPOINT, 211), + + /* Time-out accept operations (currently for FTP only) after this amount + of miliseconds. */ + CINIT(ACCEPTTIMEOUT_MS, LONG, 212), + + /* Set TCP keepalive */ + CINIT(TCP_KEEPALIVE, LONG, 213), + + /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */ + CINIT(TCP_KEEPIDLE, LONG, 214), + CINIT(TCP_KEEPINTVL, LONG, 215), + + /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */ + CINIT(SSL_OPTIONS, LONG, 216), + + /* Set the SMTP auth originator */ + CINIT(MAIL_AUTH, STRINGPOINT, 217), + + /* Enable/disable SASL initial response */ + CINIT(SASL_IR, LONG, 218), + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_xferinfo_callback + * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */ + CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219), + + /* The XOAUTH2 bearer token */ + CINIT(XOAUTH2_BEARER, STRINGPOINT, 220), + + /* Set the interface string to use as outgoing network + * interface for DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_INTERFACE, STRINGPOINT, 221), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222), + + /* Set the local IPv4 address to use for outgoing DNS requests. + * Only supported by the c-ares DNS backend */ + CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223), + + /* Set authentication options directly */ + CINIT(LOGIN_OPTIONS, STRINGPOINT, 224), + + /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_NPN, LONG, 225), + + /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */ + CINIT(SSL_ENABLE_ALPN, LONG, 226), + + /* Time to wait for a response to a HTTP request containing an + * Expect: 100-continue header before sending the data anyway. */ + CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227), + + /* This points to a linked list of headers used for proxy requests only, + struct curl_slist kind */ + CINIT(PROXYHEADER, OBJECTPOINT, 228), + + /* Pass in a bitmask of "header options" */ + CINIT(HEADEROPT, LONG, 229), + + /* The public key in DER form used to validate the peer public key + this option is used only if SSL_VERIFYPEER is true */ + CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230), + + /* Path to Unix domain socket */ + CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231), + + /* Set if we should verify the certificate status. */ + CINIT(SSL_VERIFYSTATUS, LONG, 232), + + /* Set if we should enable TLS false start. */ + CINIT(SSL_FALSESTART, LONG, 233), + + /* Do not squash dot-dot sequences */ + CINIT(PATH_AS_IS, LONG, 234), + + /* Proxy Service Name */ + CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235), + + /* Service Name */ + CINIT(SERVICE_NAME, STRINGPOINT, 236), + + /* Wait/don't wait for pipe/mutex to clarify */ + CINIT(PIPEWAIT, LONG, 237), + + /* Set the protocol used when curl is given a URL without a protocol */ + CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238), + + /* Set stream weight, 1 - 256 (default is 16) */ + CINIT(STREAM_WEIGHT, LONG, 239), + + /* Set stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS, OBJECTPOINT, 240), + + /* Set E-xclusive stream dependency on another CURL handle */ + CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241), + + /* Do not send any tftp option requests to the server */ + CINIT(TFTP_NO_OPTIONS, LONG, 242), + + /* Linked-list of host:port:connect-to-host:connect-to-port, + overrides the URL's host:port (only for the network layer) */ + CINIT(CONNECT_TO, OBJECTPOINT, 243), + + /* Set TCP Fast Open */ + CINIT(TCP_FASTOPEN, LONG, 244), + + /* Continue to send data if the server responds early with an + * HTTP status code >= 300 */ + CINIT(KEEP_SENDING_ON_ERROR, LONG, 245), + + /* The CApath or CAfile used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAINFO, STRINGPOINT, 246), + + /* The CApath directory used to validate the proxy certificate + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_CAPATH, STRINGPOINT, 247), + + /* Set if we should verify the proxy in ssl handshake, + set 1 to verify. */ + CINIT(PROXY_SSL_VERIFYPEER, LONG, 248), + + /* Set if we should verify the Common name from the proxy certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches + * the provided hostname. */ + CINIT(PROXY_SSL_VERIFYHOST, LONG, 249), + + /* What version to specifically try to use for proxy. + See CURL_SSLVERSION defines below. */ + CINIT(PROXY_SSLVERSION, LONG, 250), + + /* Set a username for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251), + + /* Set a password for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252), + + /* Set authentication type for authenticated TLS for proxy */ + CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253), + + /* name of the file keeping your private SSL-certificate for proxy */ + CINIT(PROXY_SSLCERT, STRINGPOINT, 254), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255), + + /* name of the file keeping your private SSL-key for proxy */ + CINIT(PROXY_SSLKEY, STRINGPOINT, 256), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for + proxy */ + CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257), + + /* password for the SSL private key for proxy */ + CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258), + + /* Specify which SSL ciphers to use for proxy */ + CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259), + + /* CRL file for proxy */ + CINIT(PROXY_CRLFILE, STRINGPOINT, 260), + + /* Enable/disable specific SSL features with a bitmask for proxy, see + CURLSSLOPT_* */ + CINIT(PROXY_SSL_OPTIONS, LONG, 261), + + /* Name of pre proxy to use. */ + CINIT(PRE_PROXY, STRINGPOINT, 262), + + /* The public key in DER form used to validate the proxy public key + this option is used only if PROXY_SSL_VERIFYPEER is true */ + CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263), + + /* Path to an abstract Unix domain socket */ + CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264), + + /* Suppress proxy CONNECT response headers from user callbacks */ + CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to IPv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to IPv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ + CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ + CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 + Upgrade */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + +/* Convenience definition simple because the name of the version is HTTP/2 and + not 2.0. The 2_0 version of the enum name was set while the version was + still planned to be 2.0 and we stick to it for compatibility. */ +#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0 + +/* + * Public API enums for RTSP requests + */ +enum { + CURL_RTSPREQ_NONE, /* first in list */ + CURL_RTSPREQ_OPTIONS, + CURL_RTSPREQ_DESCRIBE, + CURL_RTSPREQ_ANNOUNCE, + CURL_RTSPREQ_SETUP, + CURL_RTSPREQ_PLAY, + CURL_RTSPREQ_PAUSE, + CURL_RTSPREQ_TEARDOWN, + CURL_RTSPREQ_GET_PARAMETER, + CURL_RTSPREQ_SET_PARAMETER, + CURL_RTSPREQ_RECORD, + CURL_RTSPREQ_RECEIVE, + CURL_RTSPREQ_LAST /* last in list */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, /* TLS 1.x */ + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + CURL_SSLVERSION_TLSv1_0, + CURL_SSLVERSION_TLSv1_1, + CURL_SSLVERSION_TLSv1_2, + CURL_SSLVERSION_TLSv1_3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +enum { + CURL_SSLVERSION_MAX_NONE = 0, + CURL_SSLVERSION_MAX_DEFAULT = (CURL_SSLVERSION_TLSv1 << 16), + CURL_SSLVERSION_MAX_TLSv1_0 = (CURL_SSLVERSION_TLSv1_0 << 16), + CURL_SSLVERSION_MAX_TLSv1_1 = (CURL_SSLVERSION_TLSv1_1 << 16), + CURL_SSLVERSION_MAX_TLSv1_2 = (CURL_SSLVERSION_TLSv1_2 << 16), + CURL_SSLVERSION_MAX_TLSv1_3 = (CURL_SSLVERSION_TLSv1_3 << 16), + + /* never use, keep last */ + CURL_SSLVERSION_MAX_LAST = (CURL_SSLVERSION_LAST << 16) +}; + +enum CURL_TLSAUTH { + CURL_TLSAUTH_NONE, + CURL_TLSAUTH_SRP, + CURL_TLSAUTH_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303 + can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302 + | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_303 4 +#define CURL_REDIR_POST_ALL \ + (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details + + !checksrc! disable SPACEBEFOREPAREN 2 +*/ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */ + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, + size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +/* enum for the different supported SSL backends */ +typedef enum { + CURLSSLBACKEND_NONE = 0, + CURLSSLBACKEND_OPENSSL = 1, + CURLSSLBACKEND_GNUTLS = 2, + CURLSSLBACKEND_NSS = 3, + CURLSSLBACKEND_OBSOLETE4 = 4, /* Was QSOSSL. */ + CURLSSLBACKEND_GSKIT = 5, + CURLSSLBACKEND_POLARSSL = 6, + CURLSSLBACKEND_CYASSL = 7, + CURLSSLBACKEND_SCHANNEL = 8, + CURLSSLBACKEND_DARWINSSL = 9, + CURLSSLBACKEND_AXTLS = 10, + CURLSSLBACKEND_MBEDTLS = 11 +} curl_sslbackend; + +/* aliases for library clones and renames */ +#define CURLSSLBACKEND_LIBRESSL 1 +#define CURLSSLBACKEND_BORINGSSL 1 +#define CURLSSLBACKEND_WOLFSSL 6 + +/* Information about the SSL library used and the respective internal SSL + handle, which can be used to obtain further information regarding the + connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */ +struct curl_tlssessioninfo { + curl_sslbackend backend; + void *internals; +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_SOCKET 0x500000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, + CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, + CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, + CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, + CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, + CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, + CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, + CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43, + CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, + CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, + CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, + CURLINFO_PROTOCOL = CURLINFO_LONG + 48, + CURLINFO_SCHEME = CURLINFO_STRING + 49, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 49 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL +#define CURL_GLOBAL_ACK_EINTR (1<<2) + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* 4 out of memory */ + CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* Kerberos V4 auth is supported + (deprecated) */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth is supported + (deprecated) */ +#define CURL_VERSION_DEBUG (1<<6) /* Built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* Asynchronous DNS resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth is supported */ +#define CURL_VERSION_LARGEFILE (1<<9) /* Supports files larger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* Internationized Domain Names are + supported */ +#define CURL_VERSION_SSPI (1<<11) /* Built against Windows SSPI */ +#define CURL_VERSION_CONV (1<<12) /* Character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* Debug memory tracking supported */ +#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */ +#define CURL_VERSION_NTLM_WB (1<<15) /* NTLM delegation to winbind helper + is suported */ +#define CURL_VERSION_HTTP2 (1<<16) /* HTTP2 support built-in */ +#define CURL_VERSION_GSSAPI (1<<17) /* Built against a GSS-API library */ +#define CURL_VERSION_KERBEROS5 (1<<18) /* Kerberos V5 auth is supported */ +#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */ +#define CURL_VERSION_PSL (1<<20) /* Mozilla's Public Suffix List, used + for cookie domain verification */ +#define CURL_VERSION_HTTPS_PROXY (1<<21) /* HTTPS-proxy support built-in */ + + /* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/includes/curl/curlbuild.h.cmake b/includes/curl/curlbuild.h.cmake new file mode 100644 index 000000000..bbb31a940 --- /dev/null +++ b/includes/curl/curlbuild.h.cmake @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#cmakedefine CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#cmakedefine CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#cmakedefine CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#cmakedefine CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#define CURL_SIZEOF_LONG ${CURL_SIZEOF_LONG} + +/* Integral data type used for curl_socklen_t. */ +#define CURL_TYPEOF_CURL_SOCKLEN_T ${CURL_TYPEOF_CURL_SOCKLEN_T} + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_SOCKLEN_T ${CURL_SIZEOF_CURL_SOCKLEN_T} + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#define CURL_TYPEOF_CURL_OFF_T ${CURL_TYPEOF_CURL_OFF_T} + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_T "${CURL_FORMAT_CURL_OFF_T}" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_TU "${CURL_FORMAT_CURL_OFF_TU}" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#define CURL_FORMAT_OFF_T "${CURL_FORMAT_OFF_T}" + +/* The size of `curl_off_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_OFF_T ${CURL_SIZEOF_CURL_OFF_T} + +/* curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_T ${CURL_SUFFIX_CURL_OFF_T} + +/* unsigned curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_TU ${CURL_SUFFIX_CURL_OFF_TU} + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlbuild.h.dist b/includes/curl/curlbuild.h.dist new file mode 100644 index 000000000..ae95095fa --- /dev/null +++ b/includes/curl/curlbuild.h.dist @@ -0,0 +1,586 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if !defined(__LP64__) && (defined(__ILP32__) || \ + defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__)) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlbuild.h.in b/includes/curl/curlbuild.h.in new file mode 100644 index 000000000..ffab35670 --- /dev/null +++ b/includes/curl/curlbuild.h.in @@ -0,0 +1,197 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +#error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +#error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +#error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +#error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +#error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +#error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +#error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +#error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +#error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +#error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +#undef CURL_PULL_WS2TCPIP_H +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#undef CURL_PULL_SYS_TYPES_H +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +#undef CURL_PULL_STDINT_H +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +#undef CURL_PULL_INTTYPES_H +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#undef CURL_PULL_SYS_SOCKET_H +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/poll.h must be included by the external interface. */ +#undef CURL_PULL_SYS_POLL_H +#ifdef CURL_PULL_SYS_POLL_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#undef CURL_SIZEOF_LONG + +/* Integral data type used for curl_socklen_t. */ +#undef CURL_TYPEOF_CURL_SOCKLEN_T + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_SOCKLEN_T + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#undef CURL_TYPEOF_CURL_OFF_T + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_T + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#undef CURL_FORMAT_CURL_OFF_TU + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#undef CURL_FORMAT_OFF_T + +/* The size of `curl_off_t', as computed by sizeof. */ +#undef CURL_SIZEOF_CURL_OFF_T + +/* curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_T + +/* unsigned curl_off_t constant suffix. */ +#undef CURL_SUFFIX_CURL_OFF_TU + +#endif /* __CURL_CURLBUILD_H */ diff --git a/includes/curl/curlrules.h b/includes/curl/curlrules.h new file mode 100644 index 000000000..55d21f68f --- /dev/null +++ b/includes/curl/curlrules.h @@ -0,0 +1,262 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * curl_setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551) +# define __CURL_OFF_T_C_HLPR2(x) x +# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \ + __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU) +#else +# ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix +# else +# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix +# endif +# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix) +# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T) +# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU) +#endif + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_SYS_POLL_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#ifdef CURL_NO_OLDIES +#undef CURL_FORMAT_OFF_T /* not required since 7.19.0 - obsoleted in 7.20.0 */ +#endif + +#endif /* __CURL_CURLRULES_H */ diff --git a/includes/curl/curlver.h b/includes/curl/curlver.h new file mode 100644 index 000000000..7beda3fa7 --- /dev/null +++ b/includes/curl/curlver.h @@ -0,0 +1,77 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2017 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.54.0-DEV" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 54 +#define LIBCURL_VERSION_PATCH 0 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. + + Note: This define is the full hex number and _does not_ use the + CURL_VERSION_BITS() macro since curl's own configure script greps for it + and needs it to contain the full number. +*/ +#define LIBCURL_VERSION_NUM 0x073600 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in git, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "DEV" + +#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z) +#define CURL_AT_LEAST_VERSION(x,y,z) \ + (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) + +#endif /* __CURL_CURLVER_H */ diff --git a/includes/curl/easy.h b/includes/curl/easy.h new file mode 100644 index 000000000..752c5049f --- /dev/null +++ b/includes/curl/easy.h @@ -0,0 +1,102 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistent connections cannot + * be transferred. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/includes/curl/mprintf.h b/includes/curl/mprintf.h new file mode 100644 index 000000000..e20f546e1 --- /dev/null +++ b/includes/curl/mprintf.h @@ -0,0 +1,50 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include +#include /* needed for FILE */ +#include "curl.h" /* for CURL_EXTERN */ + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/includes/curl/multi.h b/includes/curl/multi.h new file mode 100644 index 000000000..d1e00cc5d --- /dev/null +++ b/includes/curl/multi.h @@ -0,0 +1,439 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +typedef struct Curl_multi CURLM; +#else +typedef void CURLM; +#endif + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_ADDED_ALREADY, /* an easy handle already added to a multi handle was + attempted to get added - again */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +/* bitmask bits for CURLMOPT_PIPELINING */ +#define CURLPIPE_NOTHING 0L +#define CURLPIPE_HTTP1 1L +#define CURLPIPE_MULTIPLEX 2L + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* Based on poll(2) structure and values. + * We don't use pollfd and POLL* constants explicitly + * to cover platforms without poll(). */ +#define CURL_WAIT_POLLIN 0x0001 +#define CURL_WAIT_POLLPRI 0x0002 +#define CURL_WAIT_POLLOUT 0x0004 + +struct curl_waitfd { + curl_socket_t fd; + short events; + short revents; /* not supported yet */ +}; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + +/* + * Name: curl_multi_wait() + * + * Desc: Poll on all fds within a CURLM set as well as any + * additional fds passed to the function. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle, + struct curl_waitfd extra_fds[], + unsigned int extra_nfds, + int timeout_ms, + int *ret); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + /* maximum number of (pipelining) connections to one host */ + CINIT(MAX_HOST_CONNECTIONS, LONG, 7), + + /* maximum number of requests in a pipeline */ + CINIT(MAX_PIPELINE_LENGTH, LONG, 8), + + /* a connection with a content-length longer than this + will not be considered for pipelining */ + CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9), + + /* a connection with a chunk length longer than this + will not be considered for pipelining */ + CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10), + + /* a list of site names(+port) that are blacklisted from + pipelining */ + CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11), + + /* a list of server types that are blacklisted from + pipelining */ + CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12), + + /* maximum number of open connections in total */ + CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13), + + /* This is the server push callback function pointer */ + CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14), + + /* This is the argument passed to the server push callback */ + CINIT(PUSHDATA, OBJECTPOINT, 15), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + + +/* + * Name: curl_push_callback + * + * Desc: This callback gets called when a new stream is being pushed by the + * server. It approves or denies the new stream. + * + * Returns: CURL_PUSH_OK or CURL_PUSH_DENY. + */ +#define CURL_PUSH_OK 0 +#define CURL_PUSH_DENY 1 + +struct curl_pushheaders; /* forward declaration only */ + +CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h, + size_t num); +CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h, + const char *name); + +typedef int (*curl_push_callback)(CURL *parent, + CURL *easy, + size_t num_headers, + struct curl_pushheaders *headers, + void *userp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/includes/curl/stdcheaders.h b/includes/curl/stdcheaders.h new file mode 100644 index 000000000..027b6f421 --- /dev/null +++ b/includes/curl/stdcheaders.h @@ -0,0 +1,33 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#include + +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif /* __STDC_HEADERS_H */ diff --git a/includes/curl/typecheck-gcc.h b/includes/curl/typecheck-gcc.h new file mode 100644 index 000000000..3d683152b --- /dev/null +++ b/includes/curl/typecheck-gcc.h @@ -0,0 +1,624 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt)) + * if(!_curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * NOTE: We use two nested 'if' statements here instead of the && operator, in + * order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x + * when compiling with -Wlogical-op. + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__(option) _curl_opt = option; \ + if(__builtin_constant_p(_curl_opt)) { \ + if(_curl_is_long_option(_curl_opt)) \ + if(!_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if(_curl_is_off_t_option(_curl_opt)) \ + if(!_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if(_curl_is_string_option(_curl_opt)) \ + if(!_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if(_curl_is_write_cb_option(_curl_opt)) \ + if(!_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if((_curl_opt) == CURLOPT_READFUNCTION) \ + if(!_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if((_curl_opt) == CURLOPT_IOCTLFUNCTION) \ + if(!_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \ + if(!_curl_is_sockopt_cb(value)) \ + _curl_easy_setopt_err_sockopt_cb(); \ + if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \ + if(!_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \ + if(!_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if((_curl_opt) == CURLOPT_DEBUGFUNCTION) \ + if(!_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \ + if(!_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if(_curl_is_conv_cb_option(_curl_opt)) \ + if(!_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if((_curl_opt) == CURLOPT_SEEKFUNCTION) \ + if(!_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if(_curl_is_cb_data_option(_curl_opt)) \ + if(!_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if((_curl_opt) == CURLOPT_ERRORBUFFER) \ + if(!_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if((_curl_opt) == CURLOPT_STDERR) \ + if(!_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if(_curl_is_postfields_option(_curl_opt)) \ + if(!_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if((_curl_opt) == CURLOPT_HTTPPOST) \ + if(!_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if(_curl_is_slist_option(_curl_opt)) \ + if(!_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if((_curl_opt) == CURLOPT_SHARE) \ + if(!_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__(info) _curl_info = info; \ + if(__builtin_constant_p(_curl_info)) { \ + if(_curl_is_string_info(_curl_info)) \ + if(!_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if(_curl_is_long_info(_curl_info)) \ + if(!_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if(_curl_is_double_info(_curl_info)) \ + if(!_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if(_curl_is_slist_info(_curl_info)) \ + if(!_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((__warning__(message))) \ + __attribute__((__unused__)) __attribute__((__noinline__)) \ + id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a " + "string ('char *' or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a " + "curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a " + "private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a " + "char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a 'FILE *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a 'void *' or 'char *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a 'struct curl_httppost *' " + "argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a 'struct curl_slist *' argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to 'char *' for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET || \ + (option) == CURLOPT_ACCEPT_ENCODING || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_DEFAULT_PROTOCOL || \ + (option) == CURLOPT_DNS_INTERFACE || \ + (option) == CURLOPT_DNS_LOCAL_IP4 || \ + (option) == CURLOPT_DNS_LOCAL_IP6 || \ + (option) == CURLOPT_DNS_SERVERS || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_ISSUERCERT || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_LOGIN_OPTIONS || \ + (option) == CURLOPT_MAIL_AUTH || \ + (option) == CURLOPT_MAIL_FROM || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PINNEDPUBLICKEY || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXY_SERVICE_NAME || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_RTSP_SESSION_ID || \ + (option) == CURLOPT_RTSP_STREAM_URI || \ + (option) == CURLOPT_RTSP_TRANSPORT || \ + (option) == CURLOPT_SERVICE_NAME || \ + (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_KNOWNHOSTS || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_TLSAUTH_PASSWORD || \ + (option) == CURLOPT_TLSAUTH_TYPE || \ + (option) == CURLOPT_TLSAUTH_USERNAME || \ + (option) == CURLOPT_UNIX_SOCKET_PATH || \ + (option) == CURLOPT_URL || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_XOAUTH2_BEARER || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_CHUNK_DATA || \ + (option) == CURLOPT_CLOSESOCKETDATA || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_FNMATCH_DATA || \ + (option) == CURLOPT_HEADERDATA || \ + (option) == CURLOPT_INTERLEAVEDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PRIVATE || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_SSH_KEYDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_WRITEDATA || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_MAIL_RCPT || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_PROXYHEADER || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_RESOLVE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void *)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void *); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE *); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void *); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void *); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void *); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE *); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void *); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void *); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE *); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void *); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void *); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void *); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void *); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or + "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4) || \ + _curl_callback_compatible((expr), _curl_debug_callback5) || \ + _curl_callback_compatible((expr), _curl_debug_callback6) || \ + _curl_callback_compatible((expr), _curl_debug_callback7) || \ + _curl_callback_compatible((expr), _curl_debug_callback8)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); +typedef int (_curl_debug_callback5) (CURL *, + curl_infotype, unsigned char *, size_t, void *); +typedef int (_curl_debug_callback6) (CURL *, + curl_infotype, unsigned char *, size_t, const void *); +typedef int (_curl_debug_callback7) (CURL *, + curl_infotype, const unsigned char *, size_t, void *); +typedef int (_curl_debug_callback8) (CURL *, + curl_infotype, const unsigned char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, + const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ From 630415d0a01877efc6a26d309b190a875f56ad43 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 04:53:18 -0500 Subject: [PATCH 270/286] fixed an issue with fixed path location for include and library path in makefile Signed-off-by: fadedreamz --- iguana.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index 16d1eced8..32dc556d7 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -81,8 +81,8 @@ false - C:\Users\faded_000\Desktop\needupdate\includes;$(IncludePath) - C:\Users\faded_000\Desktop\needupdate\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) false From 0c479bce28499d7f89bef9a50957c061d1153033 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:10:40 -0500 Subject: [PATCH 271/286] added libcurl, openssl dll for x86, updated makefile and headerfiles Signed-off-by: fadedreamz --- iguana.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index 32dc556d7..ab0c9975d 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,16 +73,16 @@ true - $(ProjectDir)\includes;$(IncludePath) - $(ProjectDir)\OSlibs\win;$(LibraryPath) + .\includes;$(IncludePath) + .\OSlibs\win;$(LibraryPath) true false - $(ProjectDir)\includes;$(IncludePath) - $(ProjectDir)\OSlibs\win;$(LibraryPath) + .\includes;$(IncludePath) + .\OSlibs\win;$(LibraryPath) false From 667ea67a506667d759a0be758c3ea02b7e753263 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:15:03 -0500 Subject: [PATCH 272/286] updated makefile for msvs Signed-off-by: fadedreamz --- iguana.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index ab0c9975d..5a0050e59 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -73,16 +73,16 @@ true - .\includes;$(IncludePath) - .\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(ProjectDir)\includes\curl;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) true false - .\includes;$(IncludePath) - .\OSlibs\win;$(LibraryPath) + $(ProjectDir)\includes;$(ProjectDir)\includes\curl;$(IncludePath) + $(ProjectDir)\OSlibs\win;$(LibraryPath) false From 5d0170cfd4cd9b56e428d3ff64e4821ba7728a14 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 15 Mar 2017 05:18:28 -0500 Subject: [PATCH 273/286] added missing header file due to gitignore Signed-off-by: fadedreamz --- includes/curl/curlbuild.h | 586 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 586 insertions(+) create mode 100644 includes/curl/curlbuild.h diff --git a/includes/curl/curlbuild.h b/includes/curl/curlbuild.h new file mode 100644 index 000000000..ae95095fa --- /dev/null +++ b/includes/curl/curlbuild.h @@ -0,0 +1,586 @@ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * See file include/curl/curlbuild.h.in, run configure, and forget + * that this file exists it is only used for non-configure systems. + * But you can keep reading if you want ;-) + * + */ + +/* ================================================================ */ +/* NOTES FOR NON-CONFIGURE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: https://cool.haxx.se/mailman/listinfo/curl-library/ + * + * Try to keep one section per platform, compiler and architecture, + * otherwise, if an existing section is reused for a different one and + * later on the original is adjusted, probably the piggybacking one can + * be adversely changed. + * + * In order to differentiate between platforms/compilers/architectures + * use only compiler built in predefined preprocessor symbols. + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * For any given platform/compiler curl_off_t must be typedef'ed to a + * 64-bit wide signed integral data type. The width of this data type + * must remain constant and independent of any possible large file + * support settings. + * + * As an exception to the above, curl_off_t shall be typedef'ed to a + * 32-bit wide signed integral data type if there is no 64-bit type. + * + * As a general rule, curl_off_t shall not be mapped to off_t. This + * rule shall only be violated if off_t is the only 64-bit data type + * available and the size of off_t is independent of large file support + * settings. Keep your build on the safe side avoiding an off_t gating. + * If you have a 64-bit off_t then take for sure that another 64-bit + * data type exists, dig deeper and you will find it. + * + * NOTE 3: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.dist or + * at file include/curl/curlbuild.h, this is due to the following reason: + * file include/curl/curlbuild.h.dist is renamed to include/curl/curlbuild.h + * when the libcurl source code distribution archive file is created. + * + * File include/curl/curlbuild.h.dist is not included in the distribution + * archive. File include/curl/curlbuild.h is not present in the git tree. + * + * The distributed include/curl/curlbuild.h file is only intended to be used + * on systems which can not run the also distributed configure script. + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + * If you check out from git on a non-configure platform, you must run the + * appropriate buildconf* script to set up curlbuild.h and other local files. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ +/* ================================================================ */ + +#if defined(__DJGPP__) || defined(__GO32__) +# if defined(__DJGPP__) && (__DJGPP__ > 1) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SALFORDC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__BORLANDC__) +# if (__BORLANDC__ < 0x520) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__TURBOC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__WATCOMC__) +# if defined(__386__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__POCC__) +# if (__POCC__ < 280) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# elif defined(_MSC_VER) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__LCC__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__SYMBIAN32__) +# if defined(__EABI__) /* Treat all ARM compilers equally */ +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__CW32__) +# pragma longlong on +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__VC32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MWERKS__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(_WIN32_WCE) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__MINGW32__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__VMS) +# if defined(__VAX) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +#elif defined(__OS400__) +# if defined(__ILEC400__) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__MVS__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(__370__) +# if defined(__IBMC__) || defined(__IBMCPP__) +# if defined(_ILP32) +# define CURL_SIZEOF_LONG 4 +# elif defined(_LP64) +# define CURL_SIZEOF_LONG 8 +# endif +# if defined(_LONG_LONG) +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(_LP64) +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# else +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 +# endif + +#elif defined(TPF) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP MSVC THE PENULTIMATE ENTRY */ +/* ===================================== */ + +#elif defined(_MSC_VER) +# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T __int64 +# define CURL_FORMAT_CURL_OFF_T "I64d" +# define CURL_FORMAT_CURL_OFF_TU "I64u" +# define CURL_FORMAT_OFF_T "%I64d" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T i64 +# define CURL_SUFFIX_CURL_OFF_TU ui64 +# else +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 4 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T int +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* ===================================== */ +/* KEEP GENERIC GCC THE LAST ENTRY */ +/* ===================================== */ + +#elif defined(__GNUC__) +# if !defined(__LP64__) && (defined(__ILP32__) || \ + defined(__i386__) || defined(__ppc__) || defined(__arm__) || \ + defined(__sparc__) || defined(__mips__) || defined(__sh__)) +# define CURL_SIZEOF_LONG 4 +# define CURL_TYPEOF_CURL_OFF_T long long +# define CURL_FORMAT_CURL_OFF_T "lld" +# define CURL_FORMAT_CURL_OFF_TU "llu" +# define CURL_FORMAT_OFF_T "%lld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T LL +# define CURL_SUFFIX_CURL_OFF_TU ULL +# elif defined(__LP64__) || \ + defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) +# define CURL_SIZEOF_LONG 8 +# define CURL_TYPEOF_CURL_OFF_T long +# define CURL_FORMAT_CURL_OFF_T "ld" +# define CURL_FORMAT_CURL_OFF_TU "lu" +# define CURL_FORMAT_OFF_T "%ld" +# define CURL_SIZEOF_CURL_OFF_T 8 +# define CURL_SUFFIX_CURL_OFF_T L +# define CURL_SUFFIX_CURL_OFF_TU UL +# endif +# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t +# define CURL_SIZEOF_CURL_SOCKLEN_T 4 +# define CURL_PULL_SYS_TYPES_H 1 +# define CURL_PULL_SYS_SOCKET_H 1 + +#else +# error "Unknown non-configure build target!" + Error Compilation_aborted_Unknown_non_configure_build_target +#endif + +/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */ +/* sys/types.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ +/* sys/socket.h is required here to properly make type definitions below. */ +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* Data type definition of curl_socklen_t. */ + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T + typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; +#endif + +/* Data type definition of curl_off_t. */ + +#ifdef CURL_TYPEOF_CURL_OFF_T + typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; +#endif + +#endif /* __CURL_CURLBUILD_H */ From dddccd26fd6dcef53b5cb344e30b1e9f70a11be9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 14:50:51 +0200 Subject: [PATCH 274/286] Support null username in path creation --- basilisk/basilisk_MSG.c | 2 +- iguana/iguana_chains.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 6619c4db0..0fba54c91 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -98,7 +98,7 @@ char *basilisk_iterate_MSG(struct supernet_info *myinfo,uint32_t channel,uint32_ // char str[65],str2[65]; printf("MSGiterate (%s) -> (%s)\n",bits256_str(str,srchash),bits256_str(str2,desthash)); array = cJSON_CreateArray(); portable_mutex_lock(&myinfo->messagemutex); - printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); + //printf("iterate_MSG width.%d channel.%d msgid.%d src.%llx -> %llx\n",origwidth,channel,msgid,(long long)srchash.txid,(long long)desthash.txid); for (i=0; i Date: Wed, 15 Mar 2017 17:29:54 +0200 Subject: [PATCH 275/286] Make windows specific path --- iguana/iguana_chains.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 7b610fbea..4fc5a0b76 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -232,9 +232,12 @@ void set_coinconfname(char *fname,char *coinstr,char *userhome,char *coindir,cha sprintf(confname,"%s.conf",buf); } printf("userhome.(%s) coindir.(%s) confname.(%s)\n",userhome,coindir,confname); - if ( userhome != 0 && userhome[0] != 0 ) +#ifdef WIN32 + if ( userhome == 0 || userhome[0] == 0 ) + sprintf(fname,"%s/%s",coindir,confname); + else +#endif sprintf(fname,"%s/%s/%s",userhome,coindir,confname); - else sprintf(fname,"%s/%s",coindir,confname); } uint16_t extract_userpass(char *serverport,char *userpass,char *coinstr,char *userhome,char *coindir,char *confname) From 4fbdb279cb7c9488d722b9247a167a95a7714f6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 19:05:14 +0200 Subject: [PATCH 276/286] Test --- .gitignore | 2 ++ iguana/tests/crash | 6 ++++++ iguana/tests/test | 3 --- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100755 iguana/tests/crash delete mode 100755 iguana/tests/test diff --git a/.gitignore b/.gitignore index 593be70c7..f3176906f 100755 --- a/.gitignore +++ b/.gitignore @@ -208,3 +208,5 @@ iguana/DB/SWAPS/467927158-3437055573 iguana/DB/SWAPS/270159951-1269722638 iguana/DB/SWAPS/244991424-1008712592 + +iguana/confs/1cc0270abba7f4463a3dcb9908b9d875691a6773fe3cc1b4302233ed76665300 diff --git a/iguana/tests/crash b/iguana/tests/crash new file mode 100755 index 000000000..82a39bd5d --- /dev/null +++ b/iguana/tests/crash @@ -0,0 +1,6 @@ +coins/basilisk/kmd + +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"amount common obey erupt ensure salon shrug digital phone vacant provide word nurse legend shaft ritual strike black fiscal circle dove tone inmate plunge\",\"timeout\":864445678904}" + +curl --url "http://127.0.0.1:7778" --data "{\"symbol\":\"KMD\",\"agent\":\"basilisk\",\"method\":\"utxorawtx\",\"vals\":{\"timelock\":0,\"changeaddr\":\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\",\"destaddr\":\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\",\"txfee\":0,\"amount\":0.0001,\"sendflag\":0},\"utxos\":[{\"bestblock\":\"0000119186ecfaa8d72a7d3c62e78135043db220a6d29a9605f1fbe383bcedfb\",\"confirmations\":65549,\"value\":0.04900000,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 29a7bd36e6913b674bb2b5c65e61a6544426ddd7 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a91429a7bd36e6913b674bb2b5c65e61a6544426ddd788ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\"]},\"version\":1,\"coinbase\":false,\"randipbits\":579036043,\"coin\":\"KMD\",\"txid\":\"b32af9977bc8ed0e54631d27f490c79841a03bccce4d6b8181456657b06194ef\",\"vout\":0,\"amount\":0.04900000}, {\"bestblock\":\"0000119186ecfaa8d72a7d3c62e78135043db220a6d29a9605f1fbe383bcedfb\",\"confirmations\":65553,\"value\":1,\"scriptPubKey\":{\"asm\":\"OP_DUP OP_HASH160 29a7bd36e6913b674bb2b5c65e61a6544426ddd7 OP_EQUALVERIFY OP_CHECKSIG\",\"hex\":\"76a91429a7bd36e6913b674bb2b5c65e61a6544426ddd788ac\",\"reqSigs\":1,\"type\":\"pubkeyhash\",\"addresses\":[\"RD5Sj6igy53nscMiFS4ECXByfqVeyV9NdG\"]},\"version\":1,\"coinbase\":false,\"randipbits\":3795805790,\"coin\":\"KMD\",\"txid\":\"84ca2ba7f621c820ab642e358813fcc33171c9999a47bb99dcf3a309dc847419\",\"vout\":1,\"amount\":1}]}" + diff --git a/iguana/tests/test b/iguana/tests/test deleted file mode 100755 index 495928084..000000000 --- a/iguana/tests/test +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "{\"field\":\"requiredvalue\"}" > /tmp/foo -./jsoncmp /tmp/foo {\"fields\":[{\"field\":\"requiredvalue\"}]} From 7c7da1cf897c4084021ff18f76dd70e41c39bc8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 19:06:10 +0200 Subject: [PATCH 277/286] test --- iguana/tests/crash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/crash b/iguana/tests/crash index 82a39bd5d..33cf53106 100755 --- a/iguana/tests/crash +++ b/iguana/tests/crash @@ -1,4 +1,4 @@ -coins/basilisk/kmd +../coins/basilisk/kmd curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"walletpassphrase\",\"password\":\"amount common obey erupt ensure salon shrug digital phone vacant provide word nurse legend shaft ritual strike black fiscal circle dove tone inmate plunge\",\"timeout\":864445678904}" From 779732a8bae55cfe066c1e72ad4e84c98dfb2e16 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Mar 2017 20:46:02 +0200 Subject: [PATCH 278/286] support wifstr that encode to less than 38 bytes --- iguana/exchanges/bitcoin.c | 18 +++++++++++++++--- iguana/iguana_sign.c | 2 +- iguana/mini-gmp.c | 2 +- iguana/tests/KMD.batch13 | 1 + iguana/tests/crash | 1 + 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index bf37462f0..a40524d11 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -107,18 +107,30 @@ int32_t base58encode_checkbuf(uint8_t addrtype,uint8_t *data,int32_t data_len) int32_t bitcoin_wif2priv(uint8_t *addrtypep,bits256 *privkeyp,char *wifstr) { - int32_t len = -1; bits256 hash; uint8_t buf[64]; + int32_t len = -1; bits256 hash; uint8_t buf[256]; + memset(buf,0,sizeof(buf)); if ( (len= bitcoin_base58decode(buf,wifstr)) >= 4 ) { // validate with trailing hash, then remove hash + if ( len < 38 ) + len = 38; hash = bits256_doublesha256(0,buf,len - 4); *addrtypep = *buf; memcpy(privkeyp,buf+1,32); - if ( (buf[len - 4]&0xff) == hash.bytes[31] && (buf[len - 3]&0xff) == hash.bytes[30] &&(buf[len - 2]&0xff) == hash.bytes[29] &&(buf[len - 1]&0xff) == hash.bytes[28] ) + if ( (buf[len - 4]&0xff) == hash.bytes[31] && (buf[len - 3]&0xff) == hash.bytes[30] &&(buf[len - 2]&0xff) == hash.bytes[29] && (buf[len - 1]&0xff) == hash.bytes[28] ) { - //printf("coinaddr.(%s) valid checksum\n",coinaddr); + //int32_t i; for (i=0; isuppress_pubkeys)) != 0 ) { //printf("back from bitcoin_hex2json (%s)\n",jprint(vins,0)); diff --git a/iguana/mini-gmp.c b/iguana/mini-gmp.c index ef9e235df..c2c975f12 100644 --- a/iguana/mini-gmp.c +++ b/iguana/mini-gmp.c @@ -4394,7 +4394,7 @@ int32_t bitcoin_base58decode(uint8_t *data,char *coinaddr) //memset(data,0,be_sz); //for (i=0; i Date: Thu, 16 Mar 2017 20:06:18 +0200 Subject: [PATCH 279/286] 300000 planned upgrade Fix interest granularity for long term utxo. 1/10 of a year to 1/9 has same interest result. Change to new calculation of minutes / 3652460 directly instead of via intermediate denominator to eliminate integer clipping Will activate at 300000 planned upgrade, so not urgent to update --- iguana/iguana_payments.c | 10 ++++++++-- iguana/tests/dexgetT | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 0517b94a3..cdb27e36c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -346,18 +346,24 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u int32_t minutes; uint64_t numerator=0,denominator=0,interest = 0; if ( (minutes= ((uint32_t)time(NULL) - 60 - txlocktime) / 60) >= 60 ) { + if ( minutes > 365 * 24 * 60 ) + minutes = 365 * 24 * 60; denominator = (((uint64_t)365 * 24 * 60) / minutes); if ( denominator == 0 ) denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! if ( value > 25000LL*SATOSHIDEN && chainheight > 155949 ) { numerator = (value / 20); // assumes 5%! - interest = (numerator / denominator); + if ( chainheight < 300000 ) + interest = (numerator / denominator); + else interest = (numerator * minutes) / ((uint64_t)365 * 24 * 60); } else if ( value >= 10*SATOSHIDEN ) { numerator = (value * KOMODO_INTEREST); - interest = (numerator / denominator) / SATOSHIDEN; + if ( chainheight < 300000 || numerator * minutes < 365 * 24 * 60 ) + interest = (numerator / denominator) / SATOSHIDEN; + else interest = ((numerator * minutes) / ((uint64_t)365 * 24 * 60)) / SATOSHIDEN; } //fprintf(stderr,"komodo_interest.%d %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",chainheight,(long long)value,(double)value/SATOSHIDEN,txlocktime,now,minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); } diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT index 7483dbd01..18241a84d 100755 --- a/iguana/tests/dexgetT +++ b/iguana/tests/dexgetT @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"3c00ee16d12c6aae81863d1da485cdd6cd2b73847f8ab93de3663adf6c285e3b\",\"symbol\":\"KMD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"88794bbb699f130951c40dc99a27d2c7c7016e12824fd1040cbedf86980de04d\",\"symbol\":\"REVS\"}" From 1003e5b0d53627a875c1b14ab20c99a66e023e53 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 02:53:55 +0200 Subject: [PATCH 280/286] Print coin name in vin error --- iguana/kmd_lookup.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index f3abf52d2..0d6e2f2f9 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -117,7 +117,7 @@ int32_t kmd_transactionvin(struct iguana_info *coin,bits256 spendtxid,int32_t vi } return(0); } - char str[65]; printf("vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",bits256_str(str,txid),vout,ptr!=0?ptr->numvouts:-1,ptr,ptr!=0?ptr->numvouts:-1,spendptr); + char str[65]; printf("%s.vin error %s vout.%d of %d vs ptr %p [%d] spent.%p\n",coin->symbol,bits256_str(str,txid),vout,ptr!=0?ptr->numvouts:-1,ptr,ptr!=0?ptr->numvouts:-1,spendptr); return(-1); } From fe11ff854ff1a7f410035e433f675a9d94b2ac2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 06:20:17 +0200 Subject: [PATCH 281/286] Prevent 'A' qpreturn --- iguana/dpow/dpow_tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 194285053..fac9033af 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -224,7 +224,7 @@ int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,in } printf("numvouts.%d len.%d RATIFY vouts\n",numvouts,len); } - if ( (src_or_dest == 0 || strcmp(bp->destcoin->symbol,"BTC") != 0) && (n= dpow_paxpending(extras,&paxwdcrc)) > 0 ) + if ( 0 && (src_or_dest == 0 || strcmp(bp->destcoin->symbol,"BTC") != 0) && (n= dpow_paxpending(extras,&paxwdcrc)) > 0 ) { for (i=0; i Date: Fri, 17 Mar 2017 10:51:17 +0200 Subject: [PATCH 282/286] Test --- iguana/dpow/dpow_network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index cadc11faa..91a0d96a9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2138,11 +2138,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - //printf("send back[%ld]\n",strlen(retstr)+1); + printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 42c4174d9e137231b808f73b29ebe5630eeb8a96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Mar 2017 15:48:37 +0200 Subject: [PATCH 283/286] Test --- crypto777/OS_portable.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index 040436d1a..d687df9e0 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -18,7 +18,7 @@ // iguana_OS has functions that invoke system calls. Whenever possible stdio and similar functions are use and most functions are fully portable and in this file. For things that require OS specific, the call is routed to iguana_OS_portable_* Usually, all but one OS can be handled with the same code, so iguana_OS_portable.c has most of this shared logic and an #ifdef iguana_OS_nonportable.c #ifdef __APPLE__ -#define LIQUIDITY_PROVIDER 1 +//#define LIQUIDITY_PROVIDER 1 #endif #ifdef NATIVE_WINDOWS diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 91a0d96a9..cadc11faa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -2138,11 +2138,11 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (flags & 4) == 0 && (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num2++; - printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); + //printf("REP got %d crc.%08x\n",size,calc_crc32(0,(void *)dexp,size)); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { signed_nn_send(myinfo,myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); - printf("send back[%ld]\n",strlen(retstr)+1); + //printf("send back[%ld]\n",strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { From 2c551f0deac6fb419dee9a1057a9eb505e603828 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Mar 2017 13:52:52 +0200 Subject: [PATCH 284/286] Test --- iguana/kmd_lookup.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index 0d6e2f2f9..a07b5db29 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -694,9 +694,11 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],jstri(addresses,0)); kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); + fprintf(stderr,"%.8f ",jdouble(vout,"value")); } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } + fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); if ( coin->kmd_txidfp != 0 ) { ptr->fpos = ftell(coin->kmd_txidfp); From b3da8ebbf7be8392411cf3aeeefe03870b71c14e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Mar 2017 16:44:24 +0200 Subject: [PATCH 285/286] Test --- iguana/kmd_lookup.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/kmd_lookup.h b/iguana/kmd_lookup.h index a07b5db29..f44779156 100755 --- a/iguana/kmd_lookup.h +++ b/iguana/kmd_lookup.h @@ -694,11 +694,11 @@ int32_t _kmd_bitcoinscan(struct iguana_info *coin) { bitcoin_addr2rmd160(&type_rmd160[0],&type_rmd160[1],jstri(addresses,0)); kmd_transactionvout(coin,ptr,j,jdouble(vout,"value")*SATOSHIDEN,type_rmd160,zero,-1); - fprintf(stderr,"%.8f ",jdouble(vout,"value")); + //fprintf(stderr,"%.8f ",jdouble(vout,"value")); } // else printf("missing sobj.%p or addresses.%p (%s)\n",sobj,addresses,jprint(vout,0)); //likely OP_RETURN sobj = addresses = 0; } - fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); + //fprintf(stderr,"numvouts.%d ht.%d %s\n",numvouts,height,coin->symbol); if ( coin->kmd_txidfp != 0 ) { ptr->fpos = ftell(coin->kmd_txidfp); From 502492912b704745ebdaf819ead9fb2dd0b1c558 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 21 Mar 2017 21:58:12 +0200 Subject: [PATCH 286/286] Height 250000 update --- .gitignore | 6 ++++++ iguana/iguana_payments.c | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f3176906f..1d70ba0e5 100755 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,9 @@ iguana/DB/SWAPS/270159951-1269722638 iguana/DB/SWAPS/244991424-1008712592 iguana/confs/1cc0270abba7f4463a3dcb9908b9d875691a6773fe3cc1b4302233ed76665300 + +iguana/autoAPI.md + +iguana/confs/5228bcea7ae2515a29c3844673de6ee2acba53bf45724744a00ff4306f192912 + +iguana/confs/630929d976025fafde221c7358eb5805f4359bad3c6b8bd50ad3f6e0a9b5ce78 diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index cdb27e36c..842dd261c 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -348,20 +348,22 @@ uint64_t _iguana_interest(uint32_t now,int32_t chainheight,uint32_t txlocktime,u { if ( minutes > 365 * 24 * 60 ) minutes = 365 * 24 * 60; + if ( chainheight >= 250000 ) + minutes -= 59; denominator = (((uint64_t)365 * 24 * 60) / minutes); if ( denominator == 0 ) denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! if ( value > 25000LL*SATOSHIDEN && chainheight > 155949 ) { numerator = (value / 20); // assumes 5%! - if ( chainheight < 300000 ) + if ( chainheight < 250000 ) interest = (numerator / denominator); else interest = (numerator * minutes) / ((uint64_t)365 * 24 * 60); } else if ( value >= 10*SATOSHIDEN ) { numerator = (value * KOMODO_INTEREST); - if ( chainheight < 300000 || numerator * minutes < 365 * 24 * 60 ) + if ( chainheight < 250000 || numerator * minutes < 365 * 24 * 60 ) interest = (numerator / denominator) / SATOSHIDEN; else interest = ((numerator * minutes) / ((uint64_t)365 * 24 * 60)) / SATOSHIDEN; }

jq&F_vBpHyIHfqQGl)LKMJ1 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