From 8c8a4b70ff25b982e2ae4dcc423c7ec132d76b24 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 30 Nov 2016 04:35:45 -0500 Subject: [PATCH 001/432] updated solution file to successfully built for win32 and win64 Signed-off-by: fadedreamz --- iguana.vcxproj | 9 +++++++-- iguana.vcxproj.filters | 1 + iguana/iguana777.h | 3 ++- iguana/iguana_peers.c | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index f5333b0a0..53f641904 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -92,11 +92,13 @@ Disabled _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 1Byte + .\iguana;%(AdditionalIncludeDirectories) Console true - Ws2_32.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;%(AdditionalDependencies) + .\iguana;%(AdditionalLibraryDirectories) @@ -105,12 +107,14 @@ Level3 Disabled - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;NATIVE_WINDOWS;WIN32;%(PreprocessorDefinitions) 1Byte Console true + C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) @@ -260,6 +264,7 @@ + diff --git a/iguana.vcxproj.filters b/iguana.vcxproj.filters index 0f03de4bd..3aa3d0fc6 100644 --- a/iguana.vcxproj.filters +++ b/iguana.vcxproj.filters @@ -102,6 +102,7 @@ + diff --git a/iguana/iguana777.h b/iguana/iguana777.h index e63073fd6..e68eb7ec3 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -99,7 +99,8 @@ struct supernet_info struct dpow_info DPOWS[64]; int32_t numdpows,dpowsock; struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; - //struct peggy_info *PEGS; + // fadedreamz + struct peggy_info *PEGS; void *PAXDATA; struct liquidity_info linfos[64]; struct komodo_notaries NOTARY; diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index e5f1e9f15..f90ec2bf4 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -351,12 +351,15 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } + int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; + // fadedreamz - change + if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); hostent = gethostbyname(ipaddr); From 967b73e16068d878063f20f36ee1a1f833bb835d Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 1 Dec 2016 00:35:43 -0500 Subject: [PATCH 002/432] working 32bit solution, 64bit compiles, but crashes on runtime Signed-off-by: fadedreamz --- .gitignore | 2 +- OSlibs/win/mingw.h | 12 +++++++ crypto777/OS_nonportable.c | 19 ++++++++++- iguana.sln | 28 +++++++++++++++++ iguana.vcxproj | 2 +- iguana/iguana_accept.c | 34 ++++++++++++++++++++ iguana/iguana_init.c | 6 ++++ iguana/iguana_peers.c | 64 ++++++++++++++++++++++++++++++++++++-- includes/iguana_defines.h | 1 + 9 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 iguana.sln diff --git a/.gitignore b/.gitignore index 92b11bd00..d7f6bfab7 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +x64 *.o agents/iguana.exe Debug/* diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index a59a2305a..0ec007c21 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -34,11 +34,23 @@ #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ + + /** + * we want to use mingw provided pollfd if and only if we are compiling this + * in windows 32bit but exclude it when we are compiling it in win 64 + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if !defined(_M_X64) struct pollfd { SOCKET fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; +#endif + #define poll(x, y, z) win32_poll(x, y, z) /* These wrappers do nothing special except set the global errno variable if diff --git a/crypto777/OS_nonportable.c b/crypto777/OS_nonportable.c index 56a7a8258..52832bba9 100755 --- a/crypto777/OS_nonportable.c +++ b/crypto777/OS_nonportable.c @@ -13,7 +13,24 @@ * * ******************************************************************************/ - + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + * + * @remarks - we need this because in win64 we are using windows provided pollfd structure + * not from the mingw header, so we need to include the windows header + * if we are compiling in windows 64bit + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "OS_portable.h" diff --git a/iguana.sln b/iguana.sln new file mode 100644 index 000000000..621e199f3 --- /dev/null +++ b/iguana.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iguana", "iguana.vcxproj", "{80F58B93-D1FC-4FC4-A880-1F40A1FC851B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.ActiveCfg = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.Build.0 = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.ActiveCfg = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.Build.0 = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.ActiveCfg = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.Build.0 = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.ActiveCfg = Release|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/iguana.vcxproj b/iguana.vcxproj index 53f641904..4abd04777 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -113,7 +113,7 @@ Console true - C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + .\OSlibs\win\x64;%(AdditionalLibraryDirectories) pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 835e68828..63d69787e 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #include "exchanges777.h" @@ -20,10 +33,27 @@ struct iguana_accept { struct queueitem DL; char ipaddr[64]; uint32_t ipbits; in int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *accepts,int32_t num,int32_t timeout) { + /** + * This solution is for win64 + * 2^11*sizeof(struct fd) for win64 bit gives a very big number + * for that reason it cannot allocate memory from stack + * so the solution is to allocate memory from heap, instead of stack + */ +#if defined(_M_X64) + struct pollfd * fds; + int32_t i, j, n, r, nonz, flag; struct iguana_accept *ptr; + if (num == 0) + return(0);; + fds = (struct pollfd *) malloc(sizeof(struct pollfd) * IGUANA_MAXPEERS); + if (NULL == fds) + return -1; + memset(fds, 0, sizeof(struct pollfd) * IGUANA_MAXPEERS); +#else struct pollfd fds[IGUANA_MAXPEERS]; int32_t i,j,n,r,nonz,flag; struct iguana_accept *ptr; if ( num == 0 ) return(0);; memset(fds,0,sizeof(fds)); +#endif flag = 0; r = (rand() % num); for (j=n=nonz=0; jsymbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#else sprintf(fname,"%s/%s_%s%s.txt",GLOBAL_CONFSDIR,coin->symbol,j==0?"":"old",(iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#endif //sprintf(fname,"confs/%s_%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); //sprintf(fname,"tmp/%s/%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); OS_compatible_path(fname); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index f90ec2bf4..65049f9df 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #define _iguana_hashfind(coin,ipbits) _iguana_hashset(coin,ipbits,-1) @@ -351,29 +364,76 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } - int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; - // fadedreamz - change + + /** + * gethostbyname() is deprecated and cause crash on x64 windows + * the solution is to implement similar functionality by using getaddrinfo() + * it is standard posix function and is correctly supported in win32/win64/linux + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + struct addrinfo *addrresult = NULL; + struct addrinfo *returnptr = NULL; + struct addrinfo hints; + struct sockaddr_in * sockaddr_ipv4; + int retVal; + int found = 0; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; +#endif if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); + +#if defined(_M_X64) + retVal = getaddrinfo(ipaddr, NULL, &hints, &addrresult); + for (returnptr = addrresult; returnptr != NULL && found == 0; returnptr = returnptr->ai_next) { + switch (returnptr->ai_family) { + case AF_INET: + sockaddr_ipv4 = (struct sockaddr_in *) returnptr->ai_addr; + // we want to break from the loop after founding the first ipv4 address + found = 1; + break; + } + } + + // if we iterate through the loop and didn't find anything, + // that means we failed in the dns lookup + if (found == 0) { + printf("getaddrinfo(%s) returned error\n", hostname); + freeaddrinfo(addrresult); + return(-1); + } +#else hostent = gethostbyname(ipaddr); if ( hostent == NULL ) { printf("gethostbyname(%s) returned error: %d port.%d ipaddr.(%s)\n",hostname,errno,port,ipaddr); return(-1); } +#endif saddr.sin_family = AF_INET; saddr.sin_port = htons(port); //#ifdef WIN32 // saddr.sin_addr.s_addr = (uint32_t)calc_ipbits("127.0.0.1"); //#else + +#if defined(_M_X64) + saddr.sin_addr.s_addr = sockaddr_ipv4->sin_addr.s_addr; + // graceful cleanup + sockaddr_ipv4 = NULL; + freeaddrinfo(addrresult); +#else memcpy(&saddr.sin_addr.s_addr,hostent->h_addr_list[0],hostent->h_length); +#endif expand_ipbits(checkipaddr,saddr.sin_addr.s_addr); if ( strcmp(ipaddr,checkipaddr) != 0 ) printf("bindflag.%d iguana_socket mismatch (%s) -> (%s)?\n",bindflag,checkipaddr,ipaddr); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 451944593..7fbf0a817 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -58,6 +58,7 @@ #define IGUANA_MAXBUNDLES (50000000 / 500) #define IGUANA_MINPEERS 64 + #define IGUANA_LOG2MAXPEERS 11 // cant exceed 13 bits as ramchain unspents has bitfield #define IGUANA_MAXPEERS (1 << IGUANA_LOG2MAXPEERS) From 14243cca06d5160aa3161e428d1090cb7e33fb28 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Sun, 4 Dec 2016 21:06:09 -0500 Subject: [PATCH 003/432] fixed memory address access issue on win64 build Signed-off-by: fadedreamz --- OSlibs/win/mingw.h | 24 +++++++++++++++++++++++- crypto777/iguana_OS.c | 9 +++++++++ iguana/iguana_accept.c | 6 ++++++ iguana/iguana_blocks.c | 13 +++++++++++++ iguana/iguana_init.c | 5 ++++- iguana/iguana_peers.c | 3 ++- iguana/iguana_ramchain.c | 29 +++++++++++++++++++++++++++++ iguana/iguana_tx.c | 38 ++++++++++++++++++++++++++++++++++++-- iguana/iguana_txidfind.c | 10 ++++++++++ includes/iguana_funcs.h | 9 +++++++++ includes/iguana_structs.h | 20 ++++++++++++++++++++ 11 files changed, 161 insertions(+), 5 deletions(-) diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index 0ec007c21..6be81f99b 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -28,9 +28,22 @@ * are copied from linux man pages. A poll() macro is defined to * call the version in mingw.c. */ -#define POLLIN 0x0001 /* There is data to read */ + #define POLLPRI 0x0002 /* There is urgent data to read */ +#if defined(_M_X64) + /* + * when we are using WSAPoll() with window's struct pollfd struct + * we need to update the value for POLLIN and POLLOUT according to window's + * WSAPoll() return values + * @author - fadedreamz@gmail.com + */ +//TODO: need to update other values to match with WSAPoll() function +#define POLLIN POLLRDNORM | POLLRDBAND /* There is data to read */ +#define POLLOUT POLLWRNORM /* Writing now will not block */ +#else +#define POLLIN 0x0001 /* There is data to read */ #define POLLOUT 0x0004 /* Writing now will not block */ +#endif #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ @@ -51,7 +64,16 @@ struct pollfd { }; #endif +#if defined(_M_X64) +/* +* we want to use the window's poll function if poll() is invoked in win64 +* as we are using window's pollfd struct when we are using x64 +* @author - fadedreamz@gmail.com +*/ +#define poll(x, y, z) WSAPoll(x, y, z) +#else #define poll(x, y, z) win32_poll(x, y, z) +#endif /* These wrappers do nothing special except set the global errno variable if * an error occurs (winsock doesn't do this by default). They set errno diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index d53a0ccbd..0032a8886 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -446,7 +446,16 @@ void *iguana_memalloc(struct OS_memspace *mem,long size,int32_t clearflag) #endif if ( (mem->used + size) <= mem->totalsize ) { + /* + * solution to calculate memory address in a portable way + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ptr = (void *)((unsigned char *)mem->ptr + mem->used); +#else ptr = (void *)(long)(((long)mem->ptr + mem->used)); +#endif mem->used += size; if ( size*clearflag != 0 ) memset(ptr,0,size); diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 63d69787e..b3eaa07be 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -38,6 +38,7 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac * 2^11*sizeof(struct fd) for win64 bit gives a very big number * for that reason it cannot allocate memory from stack * so the solution is to allocate memory from heap, instead of stack + * @author - fadedreamz@gmail.com */ #if defined(_M_X64) struct pollfd * fds; @@ -89,6 +90,11 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac } } +/** +* graceful memory release, because we allocated memory on heap, +* so we are releasing it here +* @author - fadedreamz@gmail.com +*/ #if defined(_M_X64) free(fds); #endif diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 64bf189d2..8b179b2c1 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -313,8 +313,21 @@ int32_t iguana_blockROsize(uint8_t zcash) void *iguana_blockzcopyRO(uint8_t zcash,struct iguana_blockRO *dest,int32_t desti,struct iguana_blockRO *src,int32_t srci) { int32_t bROsize = iguana_blockROsize(zcash); +/** +* The memory address calculation was done in a non-portable way using +* long value which has 4 bytes in 64bit windows (causing invalide memory address) +* due to data truncation, +* the solution is to use portable way to calculate the address +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) + dest = (void *)((unsigned char *)dest + desti*bROsize); + src = (void *)((unsigned char *)src + srci*bROsize); +#else dest = (void *)((long)dest + desti*bROsize); src = (void *)((long)src + srci*bROsize); +#endif memcpy(dest,src,bROsize); return(src); } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index b18de05cc..5d07685ba 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -613,7 +613,10 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ for (j=0; j<2; j++) { - // fadedreamz@gmail.com + /** + * macro switch for easy debug from Visual Studio IDE + * @author-fadedreamz@gmail.com + */ #if defined(WIN32) && defined(_DEBUG) sprintf(fname, "%s/%s/%s_%s%s.txt", "iguana", GLOBAL_CONFSDIR, coin->symbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); #else diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 65049f9df..f981cc82d 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -1305,7 +1305,8 @@ void iguana_dedicatedloop(struct supernet_info *myinfo,struct iguana_info *coin, memset(&fds,0,sizeof(fds)); fds.fd = addr->usock; fds.events |= (POLLOUT | POLLIN); - if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) + + if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) { flag += iguana_pollsendQ(coin,addr); if ( addr->dead != 0 ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 024da170e..d94078751 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -1326,7 +1326,16 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha sprintf(fname,"%s/%s%s/spends/%s.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,bits256_str(str,bp->hashes[0]),bp->bundleheight); if ( (ptr= OS_mapfile(fname,&filesize,0)) != 0 ) { +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + ramchain->Xspendinds = (void *)((unsigned char *)ptr + sizeof(sha256)); +#else ramchain->Xspendinds = (void *)((long)ptr + sizeof(sha256)); +#endif if ( bp->Xvalid == 0 ) vcalc_sha256(0,sha256.bytes,(void *)ramchain->Xspendinds,(int32_t)(filesize - sizeof(sha256))); ramchain->from_roX = (iter == 0); @@ -1399,7 +1408,17 @@ struct iguana_ramchain *_iguana_ramchain_map(struct supernet_info *myinfo,struct if ( ramchain->fileptr != 0 && ramchain->filesize > 0 ) { // verify hashes + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ramchain->H.data = rdata = (void *)((unsigned char *)ramchain->fileptr + fpos); +#else ramchain->H.data = rdata = (void *)(long)((long)ramchain->fileptr + fpos); +#endif ramchain->H.ROflag = 1; ramchain->expanded = expanded; ramchain->numblocks = (bp == 0) ? 1 : bp->n; @@ -2421,7 +2440,17 @@ int32_t iguana_mapchaininit(char *fname,struct iguana_info *coin,struct iguana_r memset(mapchain,0,sizeof(*mapchain)); mapchain->fileptr = ptr; mapchain->filesize = filesize; + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + mapchain->H.data = (void *)((unsigned char *)ptr + block->fpos); +#else mapchain->H.data = (void *)(long)((long)ptr + block->fpos); +#endif mapchain->H.ROflag = 1; if ( ptr == 0 || block->fpos > filesize ) { diff --git a/iguana/iguana_tx.c b/iguana/iguana_tx.c index 3bfc95324..c58b7c56d 100755 --- a/iguana/iguana_tx.c +++ b/iguana/iguana_tx.c @@ -15,14 +15,28 @@ #include "iguana777.h" -int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ +int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,uint64_t fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#else +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen) +#endif { FILE *fp; long err; int32_t retval = scriptlen; #ifndef __PNACL__ if ( scriptpos < 0xffffffff ) { if ( fileptr[0] == 0 ) - fileptr[0] = (long)OS_mapfile(fname,&fileptr[1],0); +#if defined(_M_X64) + fileptr[0] = (uint64_t)OS_mapfile(fname,&fileptr[1],0); +#else + fileptr[0] = (long)OS_mapfile(fname, &fileptr[1], 0); +#endif if ( fileptr[0] != 0 ) { if ( (scriptpos + scriptlen) <= fileptr[1] ) @@ -249,7 +263,17 @@ int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t m int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *blockspace,int32_t max,struct iguana_peer *addr,bits256 hash2,int32_t validatesigs) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + struct iguana_txid *tx, T; bits256 checktxid; int32_t i, len, total, bundlei = -2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree, checkhash2, merkle_root; struct iguana_bundle *bp = 0; uint64_t tmp; char str[65]; struct iguana_ramchaindata *rdata; +#else struct iguana_txid *tx,T; bits256 checktxid; int32_t i,len,total,bundlei=-2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree,checkhash2,merkle_root; struct iguana_bundle *bp=0; long tmp; char str[65]; struct iguana_ramchaindata *rdata; +#endif if ( (bp= iguana_bundlefind(coin,&bp,&bundlei,hash2)) != 0 && bundlei >= 0 && bundlei < bp->n ) { if ( (rdata= bp->ramchain.H.data) == 0 )//&& bp == coin->current ) @@ -298,7 +322,17 @@ int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info } if ( i == block->RO.txn_count ) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + tmp = (uint64_t)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#else tmp = (long)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#endif tmp &= ~(sizeof(bits256) - 1); tree = (void *)tmp; for (i=0; iRO.txn_count; i++) diff --git a/iguana/iguana_txidfind.c b/iguana/iguana_txidfind.c index d8cec460f..cf49872ef 100755 --- a/iguana/iguana_txidfind.c +++ b/iguana/iguana_txidfind.c @@ -193,7 +193,17 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl // ramchain->sparsemax = i; return(setind); } + // fadedreamz@gmail.com +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + else if (x < maxitems && memcmp((void *)((unsigned char *)refdata + x*refsize), key, keylen) == 0) +#else else if ( x < maxitems && memcmp((void *)(long)((long)refdata + x*refsize),key,keylen) == 0 ) +#endif { if ( setind == 0 ) ramchain->sparsehits++; diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 96972ebdb..ff0e2bbdb 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -579,7 +579,16 @@ struct iguana_peer *iguana_peerfindipbits(struct iguana_info *coin,uint32_t ipbi //int32_t basilisk_relays_send(struct supernet_info *myinfo,struct iguana_peer *addr); int32_t basilisk_hashes_send(struct supernet_info *myinfo,struct iguana_info *virt,struct iguana_peer *addr,char *CMD,bits256 *txids,int32_t num); int32_t iguana_opreturn(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,int64_t crypto777_payment,int32_t height,uint64_t hdrsi_unspentind,int64_t payment,uint32_t fileid,uint64_t scriptpos,uint32_t scriptlen); +/* +* because the address passed in a non-portable way we defined uint64_t as parameter to +* allow the pass of 64bit memory address in windows 64 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, uint64_t fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen); +#else int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen); +#endif 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]); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 0ed6cbfe5..5817dccb9 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -301,7 +301,17 @@ struct iguana_txblock struct iguana_zblock zblock; }; +#if defined(_M_X64) +/* +* calculate the address in a portable manner +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#define RAMCHAIN_PTR(rdata,offset) ((void *)((unsigned char *)rdata + rdata->offset)) +#else #define RAMCHAIN_PTR(rdata,offset) ((void *)(long)((long)(rdata) + (long)(rdata)->offset)) +#endif + struct iguana_ramchaindata { bits256 sha256; @@ -461,7 +471,17 @@ struct iguana_info struct iguana_peers *peers; struct iguana_peer internaladdr; //basilisk_func basilisk_rawtx,basilisk_balances,basilisk_value; //basilisk_metricfunc basilisk_rawtxmetric,basilisk_balancesmetric,basilisk_valuemetric; +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + uint64_t vinptrs[IGUANA_MAXPEERS + 1][2], voutptrs[IGUANA_MAXPEERS + 1][2]; +#else long vinptrs[IGUANA_MAXPEERS+1][2],voutptrs[IGUANA_MAXPEERS+1][2]; +#endif uint32_t fastfind; FILE *fastfps[0x100]; uint8_t *fast[0x100]; int32_t *fasttables[0x100]; long fastsizes[0x100]; uint64_t instance_nonce,myservices,totalsize,totalrecv,totalpackets,sleeptime; int64_t mining,totalfees,TMPallocated,MAXRECVCACHE,MAXMEM,PREFETCHLAG,estsize,activebundles; From 4cfcd4dfc55d29df4d58ed437e8689ff7e4b9502 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 30 Nov 2016 04:35:45 -0500 Subject: [PATCH 004/432] updated solution file to successfully built for win32 and win64 Signed-off-by: fadedreamz --- iguana.vcxproj | 9 +++++++-- iguana.vcxproj.filters | 1 + iguana/iguana777.h | 3 ++- iguana/iguana_peers.c | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index f5333b0a0..53f641904 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -92,11 +92,13 @@ Disabled _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 1Byte + .\iguana;%(AdditionalIncludeDirectories) Console true - Ws2_32.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;%(AdditionalDependencies) + .\iguana;%(AdditionalLibraryDirectories) @@ -105,12 +107,14 @@ Level3 Disabled - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;NATIVE_WINDOWS;WIN32;%(PreprocessorDefinitions) 1Byte Console true + C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) @@ -260,6 +264,7 @@ + diff --git a/iguana.vcxproj.filters b/iguana.vcxproj.filters index 0f03de4bd..3aa3d0fc6 100644 --- a/iguana.vcxproj.filters +++ b/iguana.vcxproj.filters @@ -102,6 +102,7 @@ + diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 313046c03..fcefb7fb2 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -105,7 +105,8 @@ struct supernet_info struct dpow_info DPOWS[64]; int32_t numdpows,dpowsock,dexsock,pubsock,repsock,subsock,reqsock; struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; - //struct peggy_info *PEGS; + // fadedreamz + struct peggy_info *PEGS; void *PAXDATA; struct liquidity_info linfos[64]; struct komodo_notaries NOTARY; diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index e5f1e9f15..f90ec2bf4 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -351,12 +351,15 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } + int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; + // fadedreamz - change + if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); hostent = gethostbyname(ipaddr); From abea900b3512d632aeb1c41868980eb29ae2c624 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 1 Dec 2016 00:35:43 -0500 Subject: [PATCH 005/432] working 32bit solution, 64bit compiles, but crashes on runtime Signed-off-by: fadedreamz --- .gitignore | 2 +- OSlibs/win/mingw.h | 12 +++++++ crypto777/OS_nonportable.c | 19 ++++++++++- iguana.sln | 28 +++++++++++++++++ iguana.vcxproj | 2 +- iguana/iguana_accept.c | 34 ++++++++++++++++++++ iguana/iguana_init.c | 6 ++++ iguana/iguana_peers.c | 64 ++++++++++++++++++++++++++++++++++++-- includes/iguana_defines.h | 1 + 9 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 iguana.sln diff --git a/.gitignore b/.gitignore index 92b11bd00..d7f6bfab7 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +x64 *.o agents/iguana.exe Debug/* diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index a59a2305a..0ec007c21 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -34,11 +34,23 @@ #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ + + /** + * we want to use mingw provided pollfd if and only if we are compiling this + * in windows 32bit but exclude it when we are compiling it in win 64 + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if !defined(_M_X64) struct pollfd { SOCKET fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; +#endif + #define poll(x, y, z) win32_poll(x, y, z) /* These wrappers do nothing special except set the global errno variable if diff --git a/crypto777/OS_nonportable.c b/crypto777/OS_nonportable.c index 56a7a8258..52832bba9 100755 --- a/crypto777/OS_nonportable.c +++ b/crypto777/OS_nonportable.c @@ -13,7 +13,24 @@ * * ******************************************************************************/ - + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + * + * @remarks - we need this because in win64 we are using windows provided pollfd structure + * not from the mingw header, so we need to include the windows header + * if we are compiling in windows 64bit + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "OS_portable.h" diff --git a/iguana.sln b/iguana.sln new file mode 100644 index 000000000..621e199f3 --- /dev/null +++ b/iguana.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iguana", "iguana.vcxproj", "{80F58B93-D1FC-4FC4-A880-1F40A1FC851B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.ActiveCfg = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.Build.0 = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.ActiveCfg = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.Build.0 = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.ActiveCfg = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.Build.0 = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.ActiveCfg = Release|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/iguana.vcxproj b/iguana.vcxproj index 53f641904..4abd04777 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -113,7 +113,7 @@ Console true - C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + .\OSlibs\win\x64;%(AdditionalLibraryDirectories) pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 835e68828..63d69787e 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #include "exchanges777.h" @@ -20,10 +33,27 @@ struct iguana_accept { struct queueitem DL; char ipaddr[64]; uint32_t ipbits; in int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *accepts,int32_t num,int32_t timeout) { + /** + * This solution is for win64 + * 2^11*sizeof(struct fd) for win64 bit gives a very big number + * for that reason it cannot allocate memory from stack + * so the solution is to allocate memory from heap, instead of stack + */ +#if defined(_M_X64) + struct pollfd * fds; + int32_t i, j, n, r, nonz, flag; struct iguana_accept *ptr; + if (num == 0) + return(0);; + fds = (struct pollfd *) malloc(sizeof(struct pollfd) * IGUANA_MAXPEERS); + if (NULL == fds) + return -1; + memset(fds, 0, sizeof(struct pollfd) * IGUANA_MAXPEERS); +#else struct pollfd fds[IGUANA_MAXPEERS]; int32_t i,j,n,r,nonz,flag; struct iguana_accept *ptr; if ( num == 0 ) return(0);; memset(fds,0,sizeof(fds)); +#endif flag = 0; r = (rand() % num); for (j=n=nonz=0; jsymbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#else sprintf(fname,"%s/%s_%s%s.txt",GLOBAL_CONFSDIR,coin->symbol,j==0?"":"old",(iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#endif //sprintf(fname,"confs/%s_%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); //sprintf(fname,"tmp/%s/%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); OS_compatible_path(fname); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index f90ec2bf4..65049f9df 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #define _iguana_hashfind(coin,ipbits) _iguana_hashset(coin,ipbits,-1) @@ -351,29 +364,76 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } - int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; - // fadedreamz - change + + /** + * gethostbyname() is deprecated and cause crash on x64 windows + * the solution is to implement similar functionality by using getaddrinfo() + * it is standard posix function and is correctly supported in win32/win64/linux + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + struct addrinfo *addrresult = NULL; + struct addrinfo *returnptr = NULL; + struct addrinfo hints; + struct sockaddr_in * sockaddr_ipv4; + int retVal; + int found = 0; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; +#endif if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); + +#if defined(_M_X64) + retVal = getaddrinfo(ipaddr, NULL, &hints, &addrresult); + for (returnptr = addrresult; returnptr != NULL && found == 0; returnptr = returnptr->ai_next) { + switch (returnptr->ai_family) { + case AF_INET: + sockaddr_ipv4 = (struct sockaddr_in *) returnptr->ai_addr; + // we want to break from the loop after founding the first ipv4 address + found = 1; + break; + } + } + + // if we iterate through the loop and didn't find anything, + // that means we failed in the dns lookup + if (found == 0) { + printf("getaddrinfo(%s) returned error\n", hostname); + freeaddrinfo(addrresult); + return(-1); + } +#else hostent = gethostbyname(ipaddr); if ( hostent == NULL ) { printf("gethostbyname(%s) returned error: %d port.%d ipaddr.(%s)\n",hostname,errno,port,ipaddr); return(-1); } +#endif saddr.sin_family = AF_INET; saddr.sin_port = htons(port); //#ifdef WIN32 // saddr.sin_addr.s_addr = (uint32_t)calc_ipbits("127.0.0.1"); //#else + +#if defined(_M_X64) + saddr.sin_addr.s_addr = sockaddr_ipv4->sin_addr.s_addr; + // graceful cleanup + sockaddr_ipv4 = NULL; + freeaddrinfo(addrresult); +#else memcpy(&saddr.sin_addr.s_addr,hostent->h_addr_list[0],hostent->h_length); +#endif expand_ipbits(checkipaddr,saddr.sin_addr.s_addr); if ( strcmp(ipaddr,checkipaddr) != 0 ) printf("bindflag.%d iguana_socket mismatch (%s) -> (%s)?\n",bindflag,checkipaddr,ipaddr); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 451944593..7fbf0a817 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -58,6 +58,7 @@ #define IGUANA_MAXBUNDLES (50000000 / 500) #define IGUANA_MINPEERS 64 + #define IGUANA_LOG2MAXPEERS 11 // cant exceed 13 bits as ramchain unspents has bitfield #define IGUANA_MAXPEERS (1 << IGUANA_LOG2MAXPEERS) From 16e6fe593ba12c90170db4e0f1aa135c3bfbd43f Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Sun, 4 Dec 2016 21:06:09 -0500 Subject: [PATCH 006/432] fixed memory address access issue on win64 build Signed-off-by: fadedreamz --- OSlibs/win/mingw.h | 24 +++++++++++++++++++++++- crypto777/iguana_OS.c | 9 +++++++++ iguana/iguana_accept.c | 6 ++++++ iguana/iguana_blocks.c | 13 +++++++++++++ iguana/iguana_init.c | 5 ++++- iguana/iguana_peers.c | 3 ++- iguana/iguana_ramchain.c | 29 +++++++++++++++++++++++++++++ iguana/iguana_tx.c | 38 ++++++++++++++++++++++++++++++++++++-- iguana/iguana_txidfind.c | 10 ++++++++++ includes/iguana_funcs.h | 9 +++++++++ includes/iguana_structs.h | 20 ++++++++++++++++++++ 11 files changed, 161 insertions(+), 5 deletions(-) diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index 0ec007c21..6be81f99b 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -28,9 +28,22 @@ * are copied from linux man pages. A poll() macro is defined to * call the version in mingw.c. */ -#define POLLIN 0x0001 /* There is data to read */ + #define POLLPRI 0x0002 /* There is urgent data to read */ +#if defined(_M_X64) + /* + * when we are using WSAPoll() with window's struct pollfd struct + * we need to update the value for POLLIN and POLLOUT according to window's + * WSAPoll() return values + * @author - fadedreamz@gmail.com + */ +//TODO: need to update other values to match with WSAPoll() function +#define POLLIN POLLRDNORM | POLLRDBAND /* There is data to read */ +#define POLLOUT POLLWRNORM /* Writing now will not block */ +#else +#define POLLIN 0x0001 /* There is data to read */ #define POLLOUT 0x0004 /* Writing now will not block */ +#endif #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ @@ -51,7 +64,16 @@ struct pollfd { }; #endif +#if defined(_M_X64) +/* +* we want to use the window's poll function if poll() is invoked in win64 +* as we are using window's pollfd struct when we are using x64 +* @author - fadedreamz@gmail.com +*/ +#define poll(x, y, z) WSAPoll(x, y, z) +#else #define poll(x, y, z) win32_poll(x, y, z) +#endif /* These wrappers do nothing special except set the global errno variable if * an error occurs (winsock doesn't do this by default). They set errno diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index d53a0ccbd..0032a8886 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -446,7 +446,16 @@ void *iguana_memalloc(struct OS_memspace *mem,long size,int32_t clearflag) #endif if ( (mem->used + size) <= mem->totalsize ) { + /* + * solution to calculate memory address in a portable way + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ptr = (void *)((unsigned char *)mem->ptr + mem->used); +#else ptr = (void *)(long)(((long)mem->ptr + mem->used)); +#endif mem->used += size; if ( size*clearflag != 0 ) memset(ptr,0,size); diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 63d69787e..b3eaa07be 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -38,6 +38,7 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac * 2^11*sizeof(struct fd) for win64 bit gives a very big number * for that reason it cannot allocate memory from stack * so the solution is to allocate memory from heap, instead of stack + * @author - fadedreamz@gmail.com */ #if defined(_M_X64) struct pollfd * fds; @@ -89,6 +90,11 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac } } +/** +* graceful memory release, because we allocated memory on heap, +* so we are releasing it here +* @author - fadedreamz@gmail.com +*/ #if defined(_M_X64) free(fds); #endif diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 64bf189d2..8b179b2c1 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -313,8 +313,21 @@ int32_t iguana_blockROsize(uint8_t zcash) void *iguana_blockzcopyRO(uint8_t zcash,struct iguana_blockRO *dest,int32_t desti,struct iguana_blockRO *src,int32_t srci) { int32_t bROsize = iguana_blockROsize(zcash); +/** +* The memory address calculation was done in a non-portable way using +* long value which has 4 bytes in 64bit windows (causing invalide memory address) +* due to data truncation, +* the solution is to use portable way to calculate the address +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) + dest = (void *)((unsigned char *)dest + desti*bROsize); + src = (void *)((unsigned char *)src + srci*bROsize); +#else dest = (void *)((long)dest + desti*bROsize); src = (void *)((long)src + srci*bROsize); +#endif memcpy(dest,src,bROsize); return(src); } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index b18de05cc..5d07685ba 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -613,7 +613,10 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ for (j=0; j<2; j++) { - // fadedreamz@gmail.com + /** + * macro switch for easy debug from Visual Studio IDE + * @author-fadedreamz@gmail.com + */ #if defined(WIN32) && defined(_DEBUG) sprintf(fname, "%s/%s/%s_%s%s.txt", "iguana", GLOBAL_CONFSDIR, coin->symbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); #else diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 65049f9df..f981cc82d 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -1305,7 +1305,8 @@ void iguana_dedicatedloop(struct supernet_info *myinfo,struct iguana_info *coin, memset(&fds,0,sizeof(fds)); fds.fd = addr->usock; fds.events |= (POLLOUT | POLLIN); - if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) + + if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) { flag += iguana_pollsendQ(coin,addr); if ( addr->dead != 0 ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 024da170e..d94078751 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -1326,7 +1326,16 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha sprintf(fname,"%s/%s%s/spends/%s.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,bits256_str(str,bp->hashes[0]),bp->bundleheight); if ( (ptr= OS_mapfile(fname,&filesize,0)) != 0 ) { +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + ramchain->Xspendinds = (void *)((unsigned char *)ptr + sizeof(sha256)); +#else ramchain->Xspendinds = (void *)((long)ptr + sizeof(sha256)); +#endif if ( bp->Xvalid == 0 ) vcalc_sha256(0,sha256.bytes,(void *)ramchain->Xspendinds,(int32_t)(filesize - sizeof(sha256))); ramchain->from_roX = (iter == 0); @@ -1399,7 +1408,17 @@ struct iguana_ramchain *_iguana_ramchain_map(struct supernet_info *myinfo,struct if ( ramchain->fileptr != 0 && ramchain->filesize > 0 ) { // verify hashes + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ramchain->H.data = rdata = (void *)((unsigned char *)ramchain->fileptr + fpos); +#else ramchain->H.data = rdata = (void *)(long)((long)ramchain->fileptr + fpos); +#endif ramchain->H.ROflag = 1; ramchain->expanded = expanded; ramchain->numblocks = (bp == 0) ? 1 : bp->n; @@ -2421,7 +2440,17 @@ int32_t iguana_mapchaininit(char *fname,struct iguana_info *coin,struct iguana_r memset(mapchain,0,sizeof(*mapchain)); mapchain->fileptr = ptr; mapchain->filesize = filesize; + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + mapchain->H.data = (void *)((unsigned char *)ptr + block->fpos); +#else mapchain->H.data = (void *)(long)((long)ptr + block->fpos); +#endif mapchain->H.ROflag = 1; if ( ptr == 0 || block->fpos > filesize ) { diff --git a/iguana/iguana_tx.c b/iguana/iguana_tx.c index 3bfc95324..c58b7c56d 100755 --- a/iguana/iguana_tx.c +++ b/iguana/iguana_tx.c @@ -15,14 +15,28 @@ #include "iguana777.h" -int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ +int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,uint64_t fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#else +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen) +#endif { FILE *fp; long err; int32_t retval = scriptlen; #ifndef __PNACL__ if ( scriptpos < 0xffffffff ) { if ( fileptr[0] == 0 ) - fileptr[0] = (long)OS_mapfile(fname,&fileptr[1],0); +#if defined(_M_X64) + fileptr[0] = (uint64_t)OS_mapfile(fname,&fileptr[1],0); +#else + fileptr[0] = (long)OS_mapfile(fname, &fileptr[1], 0); +#endif if ( fileptr[0] != 0 ) { if ( (scriptpos + scriptlen) <= fileptr[1] ) @@ -249,7 +263,17 @@ int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t m int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *blockspace,int32_t max,struct iguana_peer *addr,bits256 hash2,int32_t validatesigs) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + struct iguana_txid *tx, T; bits256 checktxid; int32_t i, len, total, bundlei = -2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree, checkhash2, merkle_root; struct iguana_bundle *bp = 0; uint64_t tmp; char str[65]; struct iguana_ramchaindata *rdata; +#else struct iguana_txid *tx,T; bits256 checktxid; int32_t i,len,total,bundlei=-2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree,checkhash2,merkle_root; struct iguana_bundle *bp=0; long tmp; char str[65]; struct iguana_ramchaindata *rdata; +#endif if ( (bp= iguana_bundlefind(coin,&bp,&bundlei,hash2)) != 0 && bundlei >= 0 && bundlei < bp->n ) { if ( (rdata= bp->ramchain.H.data) == 0 )//&& bp == coin->current ) @@ -298,7 +322,17 @@ int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info } if ( i == block->RO.txn_count ) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + tmp = (uint64_t)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#else tmp = (long)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#endif tmp &= ~(sizeof(bits256) - 1); tree = (void *)tmp; for (i=0; iRO.txn_count; i++) diff --git a/iguana/iguana_txidfind.c b/iguana/iguana_txidfind.c index d8cec460f..cf49872ef 100755 --- a/iguana/iguana_txidfind.c +++ b/iguana/iguana_txidfind.c @@ -193,7 +193,17 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl // ramchain->sparsemax = i; return(setind); } + // fadedreamz@gmail.com +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + else if (x < maxitems && memcmp((void *)((unsigned char *)refdata + x*refsize), key, keylen) == 0) +#else else if ( x < maxitems && memcmp((void *)(long)((long)refdata + x*refsize),key,keylen) == 0 ) +#endif { if ( setind == 0 ) ramchain->sparsehits++; diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 10a2de86b..a90ca45b8 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -580,7 +580,16 @@ struct iguana_peer *iguana_peerfindipbits(struct iguana_info *coin,uint32_t ipbi //int32_t basilisk_relays_send(struct supernet_info *myinfo,struct iguana_peer *addr); int32_t basilisk_hashes_send(struct supernet_info *myinfo,struct iguana_info *virt,struct iguana_peer *addr,char *CMD,bits256 *txids,int32_t num); int32_t iguana_opreturn(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,int64_t crypto777_payment,int32_t height,uint64_t hdrsi_unspentind,int64_t payment,uint32_t fileid,uint64_t scriptpos,uint32_t scriptlen); +/* +* because the address passed in a non-portable way we defined uint64_t as parameter to +* allow the pass of 64bit memory address in windows 64 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, uint64_t fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen); +#else int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen); +#endif 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]); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 5ba718576..c2a9f86cd 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -301,7 +301,17 @@ struct iguana_txblock struct iguana_zblock zblock; }; +#if defined(_M_X64) +/* +* calculate the address in a portable manner +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#define RAMCHAIN_PTR(rdata,offset) ((void *)((unsigned char *)rdata + rdata->offset)) +#else #define RAMCHAIN_PTR(rdata,offset) ((void *)(long)((long)(rdata) + (long)(rdata)->offset)) +#endif + struct iguana_ramchaindata { bits256 sha256; @@ -461,7 +471,17 @@ struct iguana_info struct iguana_peers *peers; struct iguana_peer internaladdr; //basilisk_func basilisk_rawtx,basilisk_balances,basilisk_value; //basilisk_metricfunc basilisk_rawtxmetric,basilisk_balancesmetric,basilisk_valuemetric; +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + uint64_t vinptrs[IGUANA_MAXPEERS + 1][2], voutptrs[IGUANA_MAXPEERS + 1][2]; +#else long vinptrs[IGUANA_MAXPEERS+1][2],voutptrs[IGUANA_MAXPEERS+1][2]; +#endif uint32_t fastfind; FILE *fastfps[0x100]; uint8_t *fast[0x100]; int32_t *fasttables[0x100]; long fastsizes[0x100]; uint64_t instance_nonce,myservices,totalsize,totalrecv,totalpackets,sleeptime; int64_t mining,totalfees,TMPallocated,MAXRECVCACHE,MAXMEM,PREFETCHLAG,estsize,activebundles; From c8d898b1c242657e998c947ac1d33ae3dcacff44 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Dec 2016 12:41:14 -0300 Subject: [PATCH 007/432] 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 9c474c471..e8955e412 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -123,7 +123,7 @@ void dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) nn_freemsg(retptr); } free(dexp); - printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); + //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); } } From b6c149d9b263e748ab0073ca670b5ddbb93cf55d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 5 Dec 2016 20:48:40 +0200 Subject: [PATCH 008/432] test --- iguana/STEEM.c | 304 +++++++++++++++++++++++++++ iguana/dpow/dpow_network.c | 2 +- iguana/iguana_bitmap.c | 2 + iguana/steemit_parser.c | 384 ++++++++++++++++++++++++++++++++++ includes/iguana_apideclares.h | 8 +- 5 files changed, 695 insertions(+), 5 deletions(-) create mode 100644 iguana/STEEM.c create mode 100644 iguana/steemit_parser.c diff --git a/iguana/STEEM.c b/iguana/STEEM.c new file mode 100644 index 000000000..83b79f9f5 --- /dev/null +++ b/iguana/STEEM.c @@ -0,0 +1,304 @@ +/****************************************************************************** + * Copyright © 2016 jl777 * + * ALL RIGHTS RESERVED * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#ifndef __APPLE__ +#include "../iguana/iguana777.h" +#else +#include "iguana777.h" +#endif + +#define STEEMIT_PLANKTON 0 +#define STEEMIT_MINNOW_BALANCE 100 +#define STEEMIT_MINNOW 1 +#define STEEMIT_DOLPHIN_BALANCE 1000 +#define STEEMIT_DOLPHIN 2 +#define STEEMIT_WHALE_BALANCE 100000 +#define STEEMIT_WHALE 3 +#define STEEMIT_MEGAWHALE_BALANCE 1000000 +#define STEEMIT_MEGAWHALE 4 + +#include "postingkeys.c" +#define rand_account() postingkeys[rand() % (sizeof(postingkeys)/sizeof(*postingkeys))][0] + +struct vote_totals { char name[16]; uint32_t whale,nonwhale,whale_for_whale,whale_for_nonwhale,nonwhale_for_whale,nonwhale_for_nonwhale,whale_selfvote,nonwhale_selfvote; }; +struct steemit_word { UT_hash_handle hh; int score,ind; char wordpair[]; }; +struct steemit_vote { UT_hash_handle hh; double payout; char permlink[]; }; +struct steemit_whale { UT_hash_handle hh; double stake; char whale[]; }; +struct steemit_post { UT_hash_handle hh; double author_steempower,tallypower[STEEMIT_MEGAWHALE+1]; uint32_t height,author_type,tally[STEEMIT_MEGAWHALE+1]; char key[]; }; + +void steemit_vote(int32_t height,int32_t ind,int32_t j,cJSON *json); +void steemit_comment(int32_t height,int32_t ind,int32_t j,cJSON *json,int32_t activeflag); + +struct upvote_info +{ + char upvoter[64],*author,*permlink,*voters[1000]; + int32_t numvoters,whaleids[1000]; double weights[1000]; uint32_t starttime; +}; + +#define issue_IGUANA(url) bitcoind_RPC(0,"curl",url,0,0,0) +void *curl_post(void **cHandlep,char *url,char *userpass,char *postfields,char *hdr0,char *hdr1,char *hdr2,char *hdr3); +int32_t USE_JAY,Startheight; + +char *STEEM_getstate(char *category) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + if ( category == 0 ) + category = ""; + sprintf(url,"http://127.0.0.1:8090"); + sprintf(params,"{\"id\":%llu,\"method\":\"call\",\"params\":[\"database_api\", \"get_state\", [\"%s\"]]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),category); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + return(retstr); +} + +char *STEEM_getblock(int32_t height) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + sprintf(url,"http://127.0.0.1:8090"); + sprintf(params,"{\"id\":%llu,\"method\":\"call\",\"params\":[\"database_api\", \"get_block\", [%d]]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),height); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + return(retstr); +} + +char *STEEM_vote(char *voter,char *author,char *permalink,int8_t wt,int32_t forceflag) +{ + static void *cHandle; static portable_mutex_t mutex; + char params[1024],url[512],*retstr; + if ( cHandle == 0 ) + portable_mutex_init(&mutex); + if ( strcmp(voter,"jl777") != 0 && strcmp(voter,"taker") != 0 && strcmp(voter,"karen13") != 0 && strcmp(voter,"proto") != 0 && strcmp(voter,"yefet") != 0 ) + { + printf("OVERRIDE: only jl777 upvotes %s.(%s %s)\n",voter,author,permalink); + return(clonestr("{\"error\":\"override and dont vote\"}")); + } + if ( forceflag == 0 && strncmp(permalink,"re-",3) == 0 )//&& (strcmp(voter,"jl777") == 0 || strcmp(voter,"taker") == 0) ) + { + printf("OVERRIDE: no upvoting on comments.(%s %s)\n",author,permalink); + return(clonestr("{\"error\":\"override and dont vote\"}")); + } + portable_mutex_lock(&mutex); + if ( wt > 100 ) + wt = 100; + else if ( wt < -100 ) + wt = -100; + sprintf(url,"http://127.0.0.1:8091"); + sprintf(params,"{\"id\":%llu,\"method\":\"vote\",\"params\":[\"%s\", \"%s\", \"%s\", %d, true]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),voter,author,permalink,wt); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + portable_mutex_unlock(&mutex); + return(retstr); +} + +char *STEEM_getcontent(char *author,char *permalink) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + sprintf(url,"http://127.0.0.1:8090"); + sprintf(params,"{\"id\":%llu,\"method\":\"get_content\",\"params\":[\"%s\", \"%s\"]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),author,permalink); + //printf("(%s %s) -> (%s)\n",author,permalink,params); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + return(retstr); +} + +char *STEEM_getcomments(char *author,char *permalink) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + sprintf(url,"http://127.0.0.1:8090"); + sprintf(params,"{\"id\":%llu,\"method\":\"get_content_replies\",\"params\":[\"%s\", \"%s\"]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),author,permalink); + //printf("(%s %s) -> (%s)\n",author,permalink,params); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + return(retstr); +} + +char *STEEM_accountinfo(char *author) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + sprintf(url,"http://127.0.0.1:8091"); + sprintf(params,"{\"id\":%llu,\"method\":\"get_account\",\"params\":[\"%s\"]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),author); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + return(retstr); +} + +int32_t permalink_str(char *permalink,int32_t size,char *str) +{ + int32_t i,c; + for (i=0; str[i]!=0 && i= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ) + { + + } else c = '-'; + permalink[i] = tolower(c); + } + permalink[i] = 0; + return(i); +} + +char *STEEM_comment(char *author,char *usepermalink,char *parent,char *parentpermalink,char *title,char *body,char *tag) +{ + /*post_comment(string author, string permlink, string parent_author, string parent_permlink, string title, string body, string json, bool broadcast) + "parent_author": "", + "parent_permlink": "introduceyourself", + "author": "jl777", + "permlink": "steemit-is-crypto-s-first-mass-market-solution", + "title": "steemit is crypto's first mass market solution!", + "body": "test post" + "json_metadata": "{\"tags\":[\"introduceyourself\",\"blockchain\",\"bitcoin\",\"networking\",\"iguana\",\"supernet\",\"bitcoindark\",\"\"],\"links\":[\"https://bitco.in/forum/forums/iguana.23/\"]}" + curl --url "http://127.0.0.1:8091" --data "{\"id\":444,\"method\":\"post_comment\",\"params\":[\"taker\", \"test-title\", \"\", \"introduceyourself\", \"test title\", \"test body\", \"{\\\"tags\\\":[\\\"introduceyourself\\\", \\\"test\\\", \\\"\\\"]}\", true]}"*/ + static void *cHandle; + char *params,permalink[4096],url[512],*retstr; + params = malloc(1024*1024*10); + if ( parent != 0 && parent[0] != 0 && strlen(parentpermalink)+strlen(parent)+8 < sizeof(permalink) ) + { + if ( usepermalink != 0 ) + strcpy(permalink,usepermalink); + else sprintf(permalink,"re-%s-%s-r%d",parent,parentpermalink,rand() & 0x7fffffff); + } + else permalink_str(permalink,sizeof(permalink),title); + sprintf(url,"http://127.0.0.1:8091"); + if ( tag != 0 ) + sprintf(params,"{\"id\":%llu,\"method\":\"post_comment\",\"params\":[\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"{\\\"tags\\\":[\\\"%s\\\", \\\"steem\\\", \\\"steemit\\\", \\\"test\\\", \\\"\\\"]}\", true]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),author,permalink,parent,parentpermalink,title,body,tag); //\\\"introduceyourself\\\", + else sprintf(params,"{\"id\":%llu,\"method\":\"post_comment\",\"params\":[\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"{}\", true]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),author,permalink,parent,parentpermalink,title,body); + //printf("ABOUT TO POST.(%s)\n",params), getchar(); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + free(params); + //printf("got.(%s)\n",retstr); + return(retstr); +} + +char *STEEM_post(char *author,char *title,char *body,char *tag) +{ + return(STEEM_comment(author,0,"",tag!=0?tag:"steemit",title,body,tag)); +} + +char *STEEM_gethistory(char *account,int32_t firsti,int32_t num) +{ + static void *cHandle; + char params[1024],url[512],*retstr; + sprintf(url,"http://127.0.0.1:8090"); + sprintf(params,"{\"id\":%llu,\"method\":\"get_account_history\",\"params\":[\"%s\", %d, %d]}",(long long)(time(NULL)*1000 + ((int32_t)OS_milliseconds() % 1000)),account,firsti,num); + retstr = curl_post(&cHandle,url,"",params,0,0,0,0); + //printf("(%s) -> (%s)\n",params,retstr); + return(retstr); +} + +char *IGUANA_request(char *agent,char *method,cJSON *argjson) +{ + static void *cHandle; + char *argstr=0,*retstr,url[512]; + if ( argjson != 0 ) + argstr = jprint(argjson,0); + sprintf(url,"http://127.0.0.1:7778/api/%s/%s",agent,method); + retstr = curl_post(&cHandle,url,"",argstr,0,0,0,0); + if ( argstr != 0 ) + free(argstr); + return(retstr); +} + +int32_t special_account(char *account) +{ + int32_t i; + if ( strcmp("jl777",account) == 0 || strcmp("upvotes",account) == 0 || strcmp("taker",account) == 0 ) + return(1); + for (i=0; i (%s)\n",author,permlink,retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (result= jobj(retjson,"result")) != 0 ) + { + safecopy(author,jstr(result,"parent_author"),sizeof(author)); + safecopy(permlink,jstr(result,"parent_permlink"),sizeof(permlink)); + if ( author[0] != 0 ) + { + strcpy(_author,author); + strcpy(_permlink,permlink); + } + } else author[0] = 0; + free_json(retjson); + } + free(retstr); + } + } + return(depth); +} + +int32_t steemit_body(char *buf,int32_t size,char *author,char *permlink) +{ + char *retstr,*body; cJSON *retjson,*result; int32_t len = 0; + if ( (retstr= STEEM_getcomments(author,permlink)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (result= jobj(retjson,"result")) != 0 ) + { + if ( (body= jstr(result,"body")) != 0 ) + { + if ( (len= (int32_t)strlen(body)) > size ) + len = size; + strncpy(buf,body,len); + } + } + free_json(retjson); + } + free(retstr); + } + return(len); +} + +int32_t steemit_power(double *powerp,char *author) +{ + char *retstr; cJSON *retjson,*result; double steempower; int32_t retval = 0; + *powerp = 0.; + if ( (retstr= STEEM_accountinfo(author)) != 0 ) + { + //printf("power.(%s)\n",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (result= jobj(retjson,"result")) != 0 ) + { + *powerp = steempower = jdouble(result,"vesting_shares") * .001; + if ( steempower >= STEEMIT_MINNOW_BALANCE ) + { + if ( steempower >= STEEMIT_DOLPHIN_BALANCE ) + { + if ( steempower >= STEEMIT_WHALE_BALANCE ) + { + if ( steempower >= STEEMIT_MEGAWHALE_BALANCE ) + retval = STEEMIT_MEGAWHALE; + else retval = STEEMIT_WHALE; + } else retval = STEEMIT_DOLPHIN; + } else retval = STEEMIT_MINNOW; + } else retval = STEEMIT_PLANKTON; + //printf("%s type.%d %.3f\n",author,retval,steempower); + } else printf("(%s) -> no result.(%s)\n",author,retstr); + free_json(retjson); + } + free(retstr); + } + return(retval); +} diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9c474c471..e8955e412 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -123,7 +123,7 @@ void dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) nn_freemsg(retptr); } free(dexp); - printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); + //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); } } diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index 25413848f..94a63fc72 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -116,6 +116,7 @@ void gen_ppmfile(char *fname,int32_t binaryflag,uint8_t *bitmap,int32_t width,in void gen_jpegfile(char *fname,int32_t quality,uint8_t *bitmap,int32_t width,int32_t height) { +#ifdef later struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE * outfile; /* target file */ @@ -145,6 +146,7 @@ void gen_jpegfile(char *fname,int32_t quality,uint8_t *bitmap,int32_t width,int3 jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); +#endif } /* diff --git a/iguana/steemit_parser.c b/iguana/steemit_parser.c new file mode 100644 index 000000000..d3ddb74bd --- /dev/null +++ b/iguana/steemit_parser.c @@ -0,0 +1,384 @@ +/****************************************************************************** + * Copyright © 2016 jl777 * + * ALL RIGHTS RESERVED * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +int32_t init_startheight(int32_t startheight) +{ + long filesize; int32_t height; char *heightstr; + if ( (heightstr= OS_filestr(&filesize,TRADEBOT_NAME)) != 0 ) + { + height = atoi(heightstr); + free(heightstr); + if ( height > 0 && height < startheight ) + startheight = height; + } + return(startheight); +} + +void steemit_history_limitorder(int32_t ind,char *acount,cJSON *opitem) +{ + // hwm.12081 flag.1 limit_order_create ({"owner":"taker","orderid":1469136578,"amount_to_sell":"24.346 SBD","min_to_receive":"7.770 STEEM","fill_or_kill":false,"expiration":"2016-07-24T23:21:24"}) +} + +void steemit_update_inventory(double *SBD,double *SBDVOL,double *STEEMVOL,double *STEEM,double myvol,char *mycoin,char *other,double othervol,char *othercoin) +{ + if ( strcmp(mycoin,"SBD") == 0 && strcmp(othercoin,"STEEM") == 0 ) + { + *SBD -= myvol; + *SBDVOL += myvol; + *STEEM += othervol; + *STEEMVOL += othervol; + } + else if ( strcmp(mycoin,"STEEM") == 0 && strcmp(othercoin,"SBD") == 0 ) + { + *STEEM -= myvol; + *STEEMVOL += myvol; + *SBD += othervol; + *SBDVOL += othervol; + } else printf("steemit_update_inventory: unexpected pair (%s) (%s)\n",mycoin,othercoin); +} + +void steemit_history_fillorder(int32_t ind,char *account,cJSON *opitem) +{ + static double SBD,STEEM,SBDVOL,STEEMVOL; + char *taker,*maker,*takercoin,*makercoin; uint64_t openorderid,fillorderid; double takervol,makervol; + taker = jstr(opitem,"current_owner"); + fillorderid = j64bits(opitem,"current_orderid"); + takercoin = jstr(opitem,"current_pays"); + maker = jstr(opitem,"open_owner"); + openorderid = j64bits(opitem,"open_orderid"); + makercoin = jstr(opitem,"open_pays"); + if ( taker != 0 && maker != 0 && takercoin != 0 && makercoin != 0 && (strcmp(account,taker) == 0 || strcmp(maker,account) == 0) ) + { + takervol = atof(takercoin); + while ( *takercoin != 0 && *takercoin != ' ' ) + takercoin++; + makervol = atof(makercoin); + while ( *makercoin != 0 && *makercoin != ' ' ) + makercoin++; + if ( strcmp(taker,account) == 0 ) + { + steemit_update_inventory(&SBD,&SBDVOL,&STEEMVOL,&STEEM,takervol,takercoin+1,maker,makervol,makercoin+1); + printf("%6d %s.(%.6f%s) <-> %s.(%.6f%s) SBD %.6f STEEM %.6f | VOL SBD %.6f STEEM %.6f-> %.6f\n",ind,taker,takervol,takercoin,maker,makervol,makercoin,SBD,STEEM,SBDVOL,STEEMVOL,SBD/STEEM); + } + else + { + steemit_update_inventory(&SBD,&SBDVOL,&STEEMVOL,&STEEM,takervol,takercoin+1,maker,makervol,makercoin+1); + printf("%6d %s.(%.6f%s) <-> %s.(%.6f%s) SBD %.6f STEEM %.6f | VOL SBD %.6f STEEM %.6f-> %.6f\n",ind,maker,makervol,makercoin,taker,takervol,takercoin,SBD,STEEM,SBDVOL,STEEMVOL,SBD/STEEM); + } + } + //hwm.12077 flag.1 fill_order ({"current_owner":"enki","current_orderid":3402053187,"current_pays":"19.613 SBD","open_owner":"taker","open_orderid":1469136521,"open_pays":"5.792 STEEM"}) + +} + +void steemit_tradehistory(char *account) +{ + int32_t j,n,m,ind,flag = 1,hwm = 0; cJSON *retjson,*result,*item,*oparray,*opitem; char *opstr,*retstr; + while ( flag != 0 ) + { + flag = 0; + if ( (retstr= STEEM_gethistory(account,hwm+1,1)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (result= jarray(&n,retjson,"result")) != 0 ) + { + for (j=0; j %s",key,fname); + system(cmd); + if ( (str2= OS_filestr(&filesize,fname)) != 0 ) + { + if ( (json2= cJSON_Parse(str2)) != 0 ) + { + if ( (postingkey= jstr(json2,"result")) != 0 ) + { + //miner = ["supernet", "5J4gTpk4CMBdPzgaRj7yNXDZTzBBQ41bNyJTqHbBi7Ku6v75bXa"] + //fprintf(postingkeys,"miner = [\"%s\", \"%s\"]\n",name,postingkey); + fprintf(postingkeys,"witness = \"%s\"\n",name); + //fprintf(postingkeys,"{ \"%s\", \"%s\" },",name,postingkey); + } + else printf("no result in (%s)\n",jprint(json2,0)); + free_json(json2); + } else printf("couldnt parse (%s)\n",str2); + free(str2); + } else printf("couldnt load (%s)\n",fname); + } + } + } + } + fprintf(postingkeys,"\n};\n"); + fclose(postingkeys); + } + free_json(json); + } + free(str); + } +} + +void tradebots_LP(char *configjsonstr,char *arg) +{ + char *retstr,*cmdstr; int32_t i,tallymode=0,repeat,lastheight=0,j,n,one,height = -1; cJSON *obj,*json,*operations,*item,*retjson,*result,*props,*transactions; + if ( configjsonstr != 0 && (json= cJSON_Parse(configjsonstr)) != 0 ) + { + // process config + free_json(json); + } + strcpy(Articles.name,"Articles"); + strcpy(Comments.name,"Comments"); + strcpy(Votes.name,"Votes"); + if ( (retstr= STEEM_getstate(0)) == 0 ) + return; + for (i=0; i= 0 ) + { + if ( tallymode != 0 && height == Startheight ) + { + printf("reached Startheight.%d, getchar()\n",Startheight); + steemit_summary(Startheight); + getchar(); + exit(0); + } + if ( (retstr= STEEM_getblock(height)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (result= jobj(retjson,"result")) != 0 ) + { + if ( (transactions= jarray(&n,result,"transactions")) != 0 ) + { + if ( tallymode == 0 ) + printf("lag.%d ht.%d n.%d\n",height-Startheight,height,n); + for (i=0; i= Startheight) && strcmp("comment",cmdstr) == 0 ) + steemit_comment(height,i,j,obj,height >= Startheight); + else if ( height >= Startheight ) + { + if ( strcmp("limit_order_create",cmdstr) == 0 ) + steemit_limitorder(height,i,j,obj); + else if ( strcmp("convert",cmdstr) == 0 ) + steemit_convert(height,i,j,obj); + else if ( strcmp("custom_json",cmdstr) == 0 ) + steemit_customjson(height,i,j,obj); + else if ( strcmp("transfer_to_vesting",cmdstr) == 0 ) + steemit_powerup(height,i,j,obj); + else if ( strcmp("account_update",cmdstr) == 0 ) + steemit_accountupdate(height,i,j,obj); + else if ( strcmp("transfer",cmdstr) == 0 ) + steemit_transfer(height,i,j,obj); + else if ( strcmp("limit_order_cancel",cmdstr) == 0 ) + steemit_cancelorder(height,i,j,obj); + else if ( strcmp("delete_comment",cmdstr) == 0 ) + steemit_deletecomment(height,i,j,obj); + else if ( strcmp("pow",cmdstr) == 0 ) + steemit_pow(height,i,j,obj); + else if ( strcmp("feed_publish",cmdstr) == 0 ) + steemit_feedpublish(height,i,j,obj); + else if ( strcmp("withdraw_vesting",cmdstr) == 0 ) + steemit_powerdown(height,i,j,obj); + else if ( strcmp("account_witness_vote",cmdstr) == 0 ) + steemit_accountwitness(height,i,j,obj); + else printf("%d.%d.%d: %s.(%s)\n",height,i,j,cmdstr,jprint(obj,0)); + } + } else printf("%d.%d: unexpected paired item.(%s)\n",height,i,jprint(item,0)); + } else printf("%d.%d: unexpected unpaired item.(%s)\n",height,i,jprint(item,0)); + } + } + } + } else if ( is_cJSON_Null(result) == 0 && jstr(result,"previous") == 0 ) + printf("ht.%d no transactions in result.(%s)\n",height,jprint(result,0)); + if ( is_cJSON_Null(result) == 0 ) + { + FILE *fp; + if ( (fp= fopen(TRADEBOT_NAME,"wb")) != 0 ) + { + // printf("startheight.%d for %s\n",height,TRADEBOT_NAME); + fprintf(fp,"%d\n",height); + fclose(fp); + } else printf("error saving startheight.%d for %s\n",height,TRADEBOT_NAME); + height++, repeat = 0; + if ( 0 && tallymode != 0 && (height % 1000) == 0 ) + disp_vote_totals(height); + } + } else printf("ht.%d no result in (%s)\n",height,jprint(retjson,0)); + //printf("ht.%d blockstr.(%s)\n",height,retstr); + free_json(retjson); + } else printf("ht.%d couldnt parse.(%s)\n",height,retstr); + free(retstr); + } else printf("error getting ht.%d\n",height); + if ( height >= Startheight ) + sleep(1); + if ( height == lastheight && ++repeat > 3 ) + height++, repeat = 0, lastheight = height; +#ifdef __APPLE__ + continue; +#endif + } + printf("done whale watching, hope you enjoyed the show\n"); +} diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index fe267a9d5..0bc2c0e5b 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -64,14 +64,14 @@ HASH_ARRAY_STRING(basilisk,subscribe,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,forward,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,mailbox,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,VPNcreate,hash,vals,hexstr); +/*HASH_ARRAY_STRING(basilisk,VPNcreate,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,VPNjoin,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,VPNmessage,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,VPNbroadcast,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,VPNreceive,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,VPNlogout,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,vote,hash,vals,hexstr); +HASH_ARRAY_STRING(basilisk,vote,hash,vals,hexstr);*/ ZERO_ARGS(bitcoinrpc,getinfo); ZERO_ARGS(bitcoinrpc,getblockcount); @@ -208,7 +208,7 @@ TWO_STRINGS(tradebot,stop,exchange,botid); TWO_STRINGS(tradebot,resume,exchange,botid); #ifndef WIN32 -HASH_ARG(pangea,call,tablehash); +/*HASH_ARG(pangea,call,tablehash); HASH_AND_INT(pangea,raise,tablehash,numchips); HASH_AND_INT(pangea,bet,tablehash,numchips); HASH_ARG(pangea,check,tablehash); @@ -222,7 +222,7 @@ INT_AND_ARRAY(pangea,host,minplayers,params); ZERO_ARGS(pangea,lobby); HASH_AND_STRING(pangea,join,tablehash,handle); HASH_AND_INT(pangea,buyin,tablehash,numchips); -HASH_ARG(pangea,start,tablehash); +HASH_ARG(pangea,start,tablehash);*/ #endif ZERO_ARGS(SuperNET,help); From b10509c5bdd39935cdedd80aaf48d2a737d21260 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Mon, 5 Dec 2016 18:09:14 -0500 Subject: [PATCH 009/432] updated build with nanomsg library Signed-off-by: fadedreamz --- OSlibs/win/nanomsg.dll | Bin 0 -> 511488 bytes OSlibs/win/nanomsg.lib | Bin 0 -> 5708 bytes OSlibs/win/x64/nanomsg.dll | Bin 0 -> 609280 bytes OSlibs/win/x64/nanomsg.lib | Bin 0 -> 5594 bytes crypto777/nanosrc/nn_config.h | 2 ++ iguana.vcxproj | 6 +++--- 6 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 OSlibs/win/nanomsg.dll create mode 100644 OSlibs/win/nanomsg.lib create mode 100644 OSlibs/win/x64/nanomsg.dll create mode 100644 OSlibs/win/x64/nanomsg.lib diff --git a/OSlibs/win/nanomsg.dll b/OSlibs/win/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..4f454d25e0f7ba64066a1f13c0c7acff77d5c8a6 GIT binary patch literal 511488 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 literal 0 HcmV?d00001 diff --git a/OSlibs/win/x64/nanomsg.dll b/OSlibs/win/x64/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..b5c4e14008b3bb584994c9f7dbbb70c8031f66bf GIT binary patch literal 609280 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

u94{SHy2f??P-t#h$dzZH#C=5>I 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 #include #else +#if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 #define PNACL_message printf #include #include #endif +#endif /* Size of the buffer used for batch-reads of inbound data. To keep the performance optimal make sure that this value is larger than network MTU. */ diff --git a/iguana.vcxproj b/iguana.vcxproj index 4abd04777..9a8fc8140 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -97,8 +97,8 @@ Console true - Ws2_32.lib;pthreadVC2.lib;%(AdditionalDependencies) - .\iguana;%(AdditionalLibraryDirectories) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + .\iguana;.\OSlibs\win;%(AdditionalLibraryDirectories) @@ -114,7 +114,7 @@ Console true .\OSlibs\win\x64;%(AdditionalLibraryDirectories) - pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) + pthread_lib.lib;Ws2_32.lib;nanomsg.lib;%(AdditionalDependencies) From 74723e746255ef6a3ff52a254bcbccdcaa3d45c6 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 30 Nov 2016 04:35:45 -0500 Subject: [PATCH 010/432] updated solution file to successfully built for win32 and win64 Signed-off-by: fadedreamz --- iguana.vcxproj | 9 +++++++-- iguana.vcxproj.filters | 1 + iguana/iguana777.h | 3 ++- iguana/iguana_peers.c | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index f5333b0a0..53f641904 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -92,11 +92,13 @@ Disabled _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 1Byte + .\iguana;%(AdditionalIncludeDirectories) Console true - Ws2_32.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;%(AdditionalDependencies) + .\iguana;%(AdditionalLibraryDirectories) @@ -105,12 +107,14 @@ Level3 Disabled - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;NATIVE_WINDOWS;WIN32;%(PreprocessorDefinitions) 1Byte Console true + C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) @@ -260,6 +264,7 @@ + diff --git a/iguana.vcxproj.filters b/iguana.vcxproj.filters index 0f03de4bd..3aa3d0fc6 100644 --- a/iguana.vcxproj.filters +++ b/iguana.vcxproj.filters @@ -102,6 +102,7 @@ + diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 313046c03..fcefb7fb2 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -105,7 +105,8 @@ struct supernet_info struct dpow_info DPOWS[64]; int32_t numdpows,dpowsock,dexsock,pubsock,repsock,subsock,reqsock; struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; - //struct peggy_info *PEGS; + // fadedreamz + struct peggy_info *PEGS; void *PAXDATA; struct liquidity_info linfos[64]; struct komodo_notaries NOTARY; diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index e5f1e9f15..f90ec2bf4 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -351,12 +351,15 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } + int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; + // fadedreamz - change + if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); hostent = gethostbyname(ipaddr); From 9108bca15e8bc0944bd4fe3c9947d4d704ce1d40 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 1 Dec 2016 00:35:43 -0500 Subject: [PATCH 011/432] working 32bit solution, 64bit compiles, but crashes on runtime Signed-off-by: fadedreamz --- .gitignore | 2 +- OSlibs/win/mingw.h | 12 +++++++ crypto777/OS_nonportable.c | 19 ++++++++++- iguana.sln | 28 +++++++++++++++++ iguana.vcxproj | 2 +- iguana/iguana_accept.c | 34 ++++++++++++++++++++ iguana/iguana_init.c | 6 ++++ iguana/iguana_peers.c | 64 ++++++++++++++++++++++++++++++++++++-- includes/iguana_defines.h | 1 + 9 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 iguana.sln diff --git a/.gitignore b/.gitignore index 92b11bd00..d7f6bfab7 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ - +x64 *.o agents/iguana.exe Debug/* diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index a59a2305a..0ec007c21 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -34,11 +34,23 @@ #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ + + /** + * we want to use mingw provided pollfd if and only if we are compiling this + * in windows 32bit but exclude it when we are compiling it in win 64 + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if !defined(_M_X64) struct pollfd { SOCKET fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; +#endif + #define poll(x, y, z) win32_poll(x, y, z) /* These wrappers do nothing special except set the global errno variable if diff --git a/crypto777/OS_nonportable.c b/crypto777/OS_nonportable.c index 56a7a8258..52832bba9 100755 --- a/crypto777/OS_nonportable.c +++ b/crypto777/OS_nonportable.c @@ -13,7 +13,24 @@ * * ******************************************************************************/ - + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + * + * @remarks - we need this because in win64 we are using windows provided pollfd structure + * not from the mingw header, so we need to include the windows header + * if we are compiling in windows 64bit + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "OS_portable.h" diff --git a/iguana.sln b/iguana.sln new file mode 100644 index 000000000..621e199f3 --- /dev/null +++ b/iguana.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iguana", "iguana.vcxproj", "{80F58B93-D1FC-4FC4-A880-1F40A1FC851B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.ActiveCfg = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x64.Build.0 = Debug|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.ActiveCfg = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Debug|x86.Build.0 = Debug|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.ActiveCfg = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x64.Build.0 = Release|x64 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.ActiveCfg = Release|Win32 + {80F58B93-D1FC-4FC4-A880-1F40A1FC851B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/iguana.vcxproj b/iguana.vcxproj index 53f641904..4abd04777 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -113,7 +113,7 @@ Console true - C:\Users\faded_000\Desktop\New folder\SuperNET\OSlibs\win\x64;%(AdditionalLibraryDirectories) + .\OSlibs\win\x64;%(AdditionalLibraryDirectories) pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 835e68828..63d69787e 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #include "exchanges777.h" @@ -20,10 +33,27 @@ struct iguana_accept { struct queueitem DL; char ipaddr[64]; uint32_t ipbits; in int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *accepts,int32_t num,int32_t timeout) { + /** + * This solution is for win64 + * 2^11*sizeof(struct fd) for win64 bit gives a very big number + * for that reason it cannot allocate memory from stack + * so the solution is to allocate memory from heap, instead of stack + */ +#if defined(_M_X64) + struct pollfd * fds; + int32_t i, j, n, r, nonz, flag; struct iguana_accept *ptr; + if (num == 0) + return(0);; + fds = (struct pollfd *) malloc(sizeof(struct pollfd) * IGUANA_MAXPEERS); + if (NULL == fds) + return -1; + memset(fds, 0, sizeof(struct pollfd) * IGUANA_MAXPEERS); +#else struct pollfd fds[IGUANA_MAXPEERS]; int32_t i,j,n,r,nonz,flag; struct iguana_accept *ptr; if ( num == 0 ) return(0);; memset(fds,0,sizeof(fds)); +#endif flag = 0; r = (rand() % num); for (j=n=nonz=0; jsymbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#else sprintf(fname,"%s/%s_%s%s.txt",GLOBAL_CONFSDIR,coin->symbol,j==0?"":"old",(iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); +#endif //sprintf(fname,"confs/%s_%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); //sprintf(fname,"tmp/%s/%s.txt",coin->symbol,(iter == 0) ? "peers" : "hdrs"); OS_compatible_path(fname); diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index f90ec2bf4..65049f9df 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -13,6 +13,19 @@ * * ******************************************************************************/ + /** + * - we need to include WinSock2.h header to correctly use windows structure + * as the application is still using 32bit structure from mingw so, we need to + * add the include based on checking + * @author - fadedreamz@gmail.com + * @remarks - #if (defined(_M_X64) || defined(__amd64__)) && defined(WIN32) + * is equivalent to #if defined(_M_X64) as _M_X64 is defined for MSVC only + */ +#if defined(_M_X64) +#define WIN32_LEAN_AND_MEAN +#include +#endif + #include "iguana777.h" #define _iguana_hashfind(coin,ipbits) _iguana_hashset(coin,ipbits,-1) @@ -351,29 +364,76 @@ void iguana_iAkill(struct iguana_info *coin,struct iguana_peer *addr,int32_t mar // iguana_possible_peer(coin,ipaddr); } - int32_t iguana_socket(int32_t bindflag,char *hostname,uint16_t port) { int32_t opt,sock,result; char ipaddr[64],checkipaddr[64]; struct timeval timeout; struct sockaddr_in saddr; socklen_t addrlen,slen; addrlen = sizeof(saddr); struct hostent *hostent; - // fadedreamz - change + + /** + * gethostbyname() is deprecated and cause crash on x64 windows + * the solution is to implement similar functionality by using getaddrinfo() + * it is standard posix function and is correctly supported in win32/win64/linux + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + struct addrinfo *addrresult = NULL; + struct addrinfo *returnptr = NULL; + struct addrinfo hints; + struct sockaddr_in * sockaddr_ipv4; + int retVal; + int found = 0; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; +#endif if ( parse_ipaddr(ipaddr,hostname) != 0 ) port = parse_ipaddr(ipaddr,hostname); + +#if defined(_M_X64) + retVal = getaddrinfo(ipaddr, NULL, &hints, &addrresult); + for (returnptr = addrresult; returnptr != NULL && found == 0; returnptr = returnptr->ai_next) { + switch (returnptr->ai_family) { + case AF_INET: + sockaddr_ipv4 = (struct sockaddr_in *) returnptr->ai_addr; + // we want to break from the loop after founding the first ipv4 address + found = 1; + break; + } + } + + // if we iterate through the loop and didn't find anything, + // that means we failed in the dns lookup + if (found == 0) { + printf("getaddrinfo(%s) returned error\n", hostname); + freeaddrinfo(addrresult); + return(-1); + } +#else hostent = gethostbyname(ipaddr); if ( hostent == NULL ) { printf("gethostbyname(%s) returned error: %d port.%d ipaddr.(%s)\n",hostname,errno,port,ipaddr); return(-1); } +#endif saddr.sin_family = AF_INET; saddr.sin_port = htons(port); //#ifdef WIN32 // saddr.sin_addr.s_addr = (uint32_t)calc_ipbits("127.0.0.1"); //#else + +#if defined(_M_X64) + saddr.sin_addr.s_addr = sockaddr_ipv4->sin_addr.s_addr; + // graceful cleanup + sockaddr_ipv4 = NULL; + freeaddrinfo(addrresult); +#else memcpy(&saddr.sin_addr.s_addr,hostent->h_addr_list[0],hostent->h_length); +#endif expand_ipbits(checkipaddr,saddr.sin_addr.s_addr); if ( strcmp(ipaddr,checkipaddr) != 0 ) printf("bindflag.%d iguana_socket mismatch (%s) -> (%s)?\n",bindflag,checkipaddr,ipaddr); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 451944593..7fbf0a817 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -58,6 +58,7 @@ #define IGUANA_MAXBUNDLES (50000000 / 500) #define IGUANA_MINPEERS 64 + #define IGUANA_LOG2MAXPEERS 11 // cant exceed 13 bits as ramchain unspents has bitfield #define IGUANA_MAXPEERS (1 << IGUANA_LOG2MAXPEERS) From da056c3fdb7fd3b60ae99196742bfa44c6f64a6e Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Sun, 4 Dec 2016 21:06:09 -0500 Subject: [PATCH 012/432] fixed memory address access issue on win64 build Signed-off-by: fadedreamz --- OSlibs/win/mingw.h | 24 +++++++++++++++++++++++- crypto777/iguana_OS.c | 9 +++++++++ iguana/iguana_accept.c | 6 ++++++ iguana/iguana_blocks.c | 13 +++++++++++++ iguana/iguana_init.c | 5 ++++- iguana/iguana_peers.c | 3 ++- iguana/iguana_ramchain.c | 29 +++++++++++++++++++++++++++++ iguana/iguana_tx.c | 38 ++++++++++++++++++++++++++++++++++++-- iguana/iguana_txidfind.c | 10 ++++++++++ includes/iguana_funcs.h | 9 +++++++++ includes/iguana_structs.h | 20 ++++++++++++++++++++ 11 files changed, 161 insertions(+), 5 deletions(-) diff --git a/OSlibs/win/mingw.h b/OSlibs/win/mingw.h index 0ec007c21..6be81f99b 100755 --- a/OSlibs/win/mingw.h +++ b/OSlibs/win/mingw.h @@ -28,9 +28,22 @@ * are copied from linux man pages. A poll() macro is defined to * call the version in mingw.c. */ -#define POLLIN 0x0001 /* There is data to read */ + #define POLLPRI 0x0002 /* There is urgent data to read */ +#if defined(_M_X64) + /* + * when we are using WSAPoll() with window's struct pollfd struct + * we need to update the value for POLLIN and POLLOUT according to window's + * WSAPoll() return values + * @author - fadedreamz@gmail.com + */ +//TODO: need to update other values to match with WSAPoll() function +#define POLLIN POLLRDNORM | POLLRDBAND /* There is data to read */ +#define POLLOUT POLLWRNORM /* Writing now will not block */ +#else +#define POLLIN 0x0001 /* There is data to read */ #define POLLOUT 0x0004 /* Writing now will not block */ +#endif #define POLLERR 0x0008 /* Error condition */ #define POLLHUP 0x0010 /* Hung up */ #define POLLNVAL 0x0020 /* Invalid request: fd not open */ @@ -51,7 +64,16 @@ struct pollfd { }; #endif +#if defined(_M_X64) +/* +* we want to use the window's poll function if poll() is invoked in win64 +* as we are using window's pollfd struct when we are using x64 +* @author - fadedreamz@gmail.com +*/ +#define poll(x, y, z) WSAPoll(x, y, z) +#else #define poll(x, y, z) win32_poll(x, y, z) +#endif /* These wrappers do nothing special except set the global errno variable if * an error occurs (winsock doesn't do this by default). They set errno diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index d53a0ccbd..0032a8886 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -446,7 +446,16 @@ void *iguana_memalloc(struct OS_memspace *mem,long size,int32_t clearflag) #endif if ( (mem->used + size) <= mem->totalsize ) { + /* + * solution to calculate memory address in a portable way + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ptr = (void *)((unsigned char *)mem->ptr + mem->used); +#else ptr = (void *)(long)(((long)mem->ptr + mem->used)); +#endif mem->used += size; if ( size*clearflag != 0 ) memset(ptr,0,size); diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index 63d69787e..b3eaa07be 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -38,6 +38,7 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac * 2^11*sizeof(struct fd) for win64 bit gives a very big number * for that reason it cannot allocate memory from stack * so the solution is to allocate memory from heap, instead of stack + * @author - fadedreamz@gmail.com */ #if defined(_M_X64) struct pollfd * fds; @@ -89,6 +90,11 @@ int32_t iguana_acceptspoll(uint8_t *buf,int32_t bufsize,struct iguana_accept *ac } } +/** +* graceful memory release, because we allocated memory on heap, +* so we are releasing it here +* @author - fadedreamz@gmail.com +*/ #if defined(_M_X64) free(fds); #endif diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 64bf189d2..8b179b2c1 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -313,8 +313,21 @@ int32_t iguana_blockROsize(uint8_t zcash) void *iguana_blockzcopyRO(uint8_t zcash,struct iguana_blockRO *dest,int32_t desti,struct iguana_blockRO *src,int32_t srci) { int32_t bROsize = iguana_blockROsize(zcash); +/** +* The memory address calculation was done in a non-portable way using +* long value which has 4 bytes in 64bit windows (causing invalide memory address) +* due to data truncation, +* the solution is to use portable way to calculate the address +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) + dest = (void *)((unsigned char *)dest + desti*bROsize); + src = (void *)((unsigned char *)src + srci*bROsize); +#else dest = (void *)((long)dest + desti*bROsize); src = (void *)((long)src + srci*bROsize); +#endif memcpy(dest,src,bROsize); return(src); } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index b18de05cc..5d07685ba 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -613,7 +613,10 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ for (j=0; j<2; j++) { - // fadedreamz@gmail.com + /** + * macro switch for easy debug from Visual Studio IDE + * @author-fadedreamz@gmail.com + */ #if defined(WIN32) && defined(_DEBUG) sprintf(fname, "%s/%s/%s_%s%s.txt", "iguana", GLOBAL_CONFSDIR, coin->symbol, j == 0 ? "" : "old", (iter == 0) ? "peers" : "hdrs"), OS_compatible_path(fname); #else diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 65049f9df..f981cc82d 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -1305,7 +1305,8 @@ void iguana_dedicatedloop(struct supernet_info *myinfo,struct iguana_info *coin, memset(&fds,0,sizeof(fds)); fds.fd = addr->usock; fds.events |= (POLLOUT | POLLIN); - if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) + + if ( poll(&fds,1,timeout) > 0 && (fds.revents & POLLOUT) != 0 ) { flag += iguana_pollsendQ(coin,addr); if ( addr->dead != 0 ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 024da170e..d94078751 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -1326,7 +1326,16 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha sprintf(fname,"%s/%s%s/spends/%s.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,bits256_str(str,bp->hashes[0]),bp->bundleheight); if ( (ptr= OS_mapfile(fname,&filesize,0)) != 0 ) { +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + ramchain->Xspendinds = (void *)((unsigned char *)ptr + sizeof(sha256)); +#else ramchain->Xspendinds = (void *)((long)ptr + sizeof(sha256)); +#endif if ( bp->Xvalid == 0 ) vcalc_sha256(0,sha256.bytes,(void *)ramchain->Xspendinds,(int32_t)(filesize - sizeof(sha256))); ramchain->from_roX = (iter == 0); @@ -1399,7 +1408,17 @@ struct iguana_ramchain *_iguana_ramchain_map(struct supernet_info *myinfo,struct if ( ramchain->fileptr != 0 && ramchain->filesize > 0 ) { // verify hashes + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + ramchain->H.data = rdata = (void *)((unsigned char *)ramchain->fileptr + fpos); +#else ramchain->H.data = rdata = (void *)(long)((long)ramchain->fileptr + fpos); +#endif ramchain->H.ROflag = 1; ramchain->expanded = expanded; ramchain->numblocks = (bp == 0) ? 1 : bp->n; @@ -2421,7 +2440,17 @@ int32_t iguana_mapchaininit(char *fname,struct iguana_info *coin,struct iguana_r memset(mapchain,0,sizeof(*mapchain)); mapchain->fileptr = ptr; mapchain->filesize = filesize; + + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ +#if defined(_M_X64) + mapchain->H.data = (void *)((unsigned char *)ptr + block->fpos); +#else mapchain->H.data = (void *)(long)((long)ptr + block->fpos); +#endif mapchain->H.ROflag = 1; if ( ptr == 0 || block->fpos > filesize ) { diff --git a/iguana/iguana_tx.c b/iguana/iguana_tx.c index 3bfc95324..c58b7c56d 100755 --- a/iguana/iguana_tx.c +++ b/iguana/iguana_tx.c @@ -15,14 +15,28 @@ #include "iguana777.h" -int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ +int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,uint64_t fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen) +#else +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen) +#endif { FILE *fp; long err; int32_t retval = scriptlen; #ifndef __PNACL__ if ( scriptpos < 0xffffffff ) { if ( fileptr[0] == 0 ) - fileptr[0] = (long)OS_mapfile(fname,&fileptr[1],0); +#if defined(_M_X64) + fileptr[0] = (uint64_t)OS_mapfile(fname,&fileptr[1],0); +#else + fileptr[0] = (long)OS_mapfile(fname, &fileptr[1], 0); +#endif if ( fileptr[0] != 0 ) { if ( (scriptpos + scriptlen) <= fileptr[1] ) @@ -249,7 +263,17 @@ int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t m int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *blockspace,int32_t max,struct iguana_peer *addr,bits256 hash2,int32_t validatesigs) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + struct iguana_txid *tx, T; bits256 checktxid; int32_t i, len, total, bundlei = -2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree, checkhash2, merkle_root; struct iguana_bundle *bp = 0; uint64_t tmp; char str[65]; struct iguana_ramchaindata *rdata; +#else struct iguana_txid *tx,T; bits256 checktxid; int32_t i,len,total,bundlei=-2; struct iguana_block *block; struct iguana_msgzblock zmsgB; bits256 *tree,checkhash2,merkle_root; struct iguana_bundle *bp=0; long tmp; char str[65]; struct iguana_ramchaindata *rdata; +#endif if ( (bp= iguana_bundlefind(coin,&bp,&bundlei,hash2)) != 0 && bundlei >= 0 && bundlei < bp->n ) { if ( (rdata= bp->ramchain.H.data) == 0 )//&& bp == coin->current ) @@ -298,7 +322,17 @@ int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info } if ( i == block->RO.txn_count ) { +#if defined(_M_X64) + /* + * because we have no choice but to access the memory address + * we need 64bit to correctly hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + tmp = (uint64_t)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#else tmp = (long)&blockspace[sizeof(struct iguana_msghdr) + total + sizeof(bits256)]; +#endif tmp &= ~(sizeof(bits256) - 1); tree = (void *)tmp; for (i=0; iRO.txn_count; i++) diff --git a/iguana/iguana_txidfind.c b/iguana/iguana_txidfind.c index d8cec460f..cf49872ef 100755 --- a/iguana/iguana_txidfind.c +++ b/iguana/iguana_txidfind.c @@ -193,7 +193,17 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl // ramchain->sparsemax = i; return(setind); } + // fadedreamz@gmail.com +#if defined(_M_X64) + /* + * calculate the address in a portable manner + * in all platform sizeof(char) / sizeof(uchar) == 1 + * @author - fadedreamz@gmail.com + */ + else if (x < maxitems && memcmp((void *)((unsigned char *)refdata + x*refsize), key, keylen) == 0) +#else else if ( x < maxitems && memcmp((void *)(long)((long)refdata + x*refsize),key,keylen) == 0 ) +#endif { if ( setind == 0 ) ramchain->sparsehits++; diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 10a2de86b..a90ca45b8 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -580,7 +580,16 @@ struct iguana_peer *iguana_peerfindipbits(struct iguana_info *coin,uint32_t ipbi //int32_t basilisk_relays_send(struct supernet_info *myinfo,struct iguana_peer *addr); int32_t basilisk_hashes_send(struct supernet_info *myinfo,struct iguana_info *virt,struct iguana_peer *addr,char *CMD,bits256 *txids,int32_t num); int32_t iguana_opreturn(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,int64_t crypto777_payment,int32_t height,uint64_t hdrsi_unspentind,int64_t payment,uint32_t fileid,uint64_t scriptpos,uint32_t scriptlen); +/* +* because the address passed in a non-portable way we defined uint64_t as parameter to +* allow the pass of 64bit memory address in windows 64 +* @author - fadedreamz@gmail.com +*/ +#if defined(_M_X64) +int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, uint64_t fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen); +#else int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen); +#endif 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]); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 5ba718576..c2a9f86cd 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -301,7 +301,17 @@ struct iguana_txblock struct iguana_zblock zblock; }; +#if defined(_M_X64) +/* +* calculate the address in a portable manner +* in all platform sizeof(char) / sizeof(uchar) == 1 +* @author - fadedreamz@gmail.com +*/ +#define RAMCHAIN_PTR(rdata,offset) ((void *)((unsigned char *)rdata + rdata->offset)) +#else #define RAMCHAIN_PTR(rdata,offset) ((void *)(long)((long)(rdata) + (long)(rdata)->offset)) +#endif + struct iguana_ramchaindata { bits256 sha256; @@ -461,7 +471,17 @@ struct iguana_info struct iguana_peers *peers; struct iguana_peer internaladdr; //basilisk_func basilisk_rawtx,basilisk_balances,basilisk_value; //basilisk_metricfunc basilisk_rawtxmetric,basilisk_balancesmetric,basilisk_valuemetric; +#if defined(_M_X64) + /* + * because we have no choice but to pass the value as parameters + * we need 64bit to hold 64bit memory address, thus changing + * to uint64_t instead of long in win x64 + * @author - fadedreamz@gmail.com + */ + uint64_t vinptrs[IGUANA_MAXPEERS + 1][2], voutptrs[IGUANA_MAXPEERS + 1][2]; +#else long vinptrs[IGUANA_MAXPEERS+1][2],voutptrs[IGUANA_MAXPEERS+1][2]; +#endif uint32_t fastfind; FILE *fastfps[0x100]; uint8_t *fast[0x100]; int32_t *fasttables[0x100]; long fastsizes[0x100]; uint64_t instance_nonce,myservices,totalsize,totalrecv,totalpackets,sleeptime; int64_t mining,totalfees,TMPallocated,MAXRECVCACHE,MAXMEM,PREFETCHLAG,estsize,activebundles; From 35f552b693ea9ab40a2b854a48b07bb01f12c7db Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Mon, 5 Dec 2016 18:09:14 -0500 Subject: [PATCH 013/432] updated build with nanomsg library Signed-off-by: fadedreamz --- OSlibs/win/nanomsg.dll | Bin 0 -> 511488 bytes OSlibs/win/nanomsg.lib | Bin 0 -> 5708 bytes OSlibs/win/x64/nanomsg.dll | Bin 0 -> 609280 bytes OSlibs/win/x64/nanomsg.lib | Bin 0 -> 5594 bytes crypto777/nanosrc/nn_config.h | 2 ++ iguana.vcxproj | 6 +++--- 6 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 OSlibs/win/nanomsg.dll create mode 100644 OSlibs/win/nanomsg.lib create mode 100644 OSlibs/win/x64/nanomsg.dll create mode 100644 OSlibs/win/x64/nanomsg.lib diff --git a/OSlibs/win/nanomsg.dll b/OSlibs/win/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..4f454d25e0f7ba64066a1f13c0c7acff77d5c8a6 GIT binary patch literal 511488 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 literal 0 HcmV?d00001 diff --git a/OSlibs/win/x64/nanomsg.dll b/OSlibs/win/x64/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..b5c4e14008b3bb584994c9f7dbbb70c8031f66bf GIT binary patch literal 609280 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

u94{SHy2f??P-t#h$dzZH#C=5>I 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 #include #else +#if !defined(WIN32) //#define NN_ENABLE_EXTRA 1 #define PNACL_message printf #include #include #endif +#endif /* Size of the buffer used for batch-reads of inbound data. To keep the performance optimal make sure that this value is larger than network MTU. */ diff --git a/iguana.vcxproj b/iguana.vcxproj index 4abd04777..9a8fc8140 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -97,8 +97,8 @@ Console true - Ws2_32.lib;pthreadVC2.lib;%(AdditionalDependencies) - .\iguana;%(AdditionalLibraryDirectories) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + .\iguana;.\OSlibs\win;%(AdditionalLibraryDirectories) @@ -114,7 +114,7 @@ Console true .\OSlibs\win\x64;%(AdditionalLibraryDirectories) - pthread_lib.lib;Ws2_32.lib;%(AdditionalDependencies) + pthread_lib.lib;Ws2_32.lib;nanomsg.lib;%(AdditionalDependencies) From 11d6f64d32daced0ae3451e5d914f8cb5d9217ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Dec 2016 13:21:12 +0200 Subject: [PATCH 014/432] test --- {iguana => deprecated}/STEEM.c | 0 {iguana => deprecated}/steemit_parser.c | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {iguana => deprecated}/STEEM.c (100%) rename {iguana => deprecated}/steemit_parser.c (100%) diff --git a/iguana/STEEM.c b/deprecated/STEEM.c similarity index 100% rename from iguana/STEEM.c rename to deprecated/STEEM.c diff --git a/iguana/steemit_parser.c b/deprecated/steemit_parser.c similarity index 100% rename from iguana/steemit_parser.c rename to deprecated/steemit_parser.c From ed35d860a5dd30e73f74963e9984243c7355ab10 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Dec 2016 13:25:14 +0200 Subject: [PATCH 015/432] test --- iguana/dpow/dpow_rpc.c | 2 +- iguana/iguana_notary.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 684bc82cc..4c951879f 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -104,7 +104,7 @@ int32_t dpow_paxpending(uint8_t *hex) decode_hex(hex,n,hexstr); } free_json(retjson); - } + } else printf("dpow_paxpending: parse error.(%s)\n",retstr); free(retstr); } else printf("dpow_paxpending: paxwithdraw null return\n"); } else printf("dpow_paxpending: KMD FULLNODE.%d\n",coin->FULLNODE); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 117df13f3..54c203098 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -300,9 +300,9 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) if ( myinfo->numdpows++ == 0 ) portable_mutex_init(&dp->mutex); PAX_init(); - //printf(">>>>>>>>>>>>>>> call paxpending\n"); - //uint8_t buf[32768]; - //dpow_paxpending(buf); + printf(">>>>>>>>>>>>>>> call paxpending\n"); + uint8_t buf[32768]; + dpow_paxpending(buf); return(clonestr("{\"result\":\"success\"}")); } From c158ea2f4966911f717548490ad97013e67dea37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Dec 2016 13:41:44 +0200 Subject: [PATCH 016/432] test --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 4c951879f..5a923a7dc 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -100,7 +100,7 @@ int32_t dpow_paxpending(uint8_t *hex) if ( (hexstr= jstr(retjson,"withdraws")) != 0 && (n= is_hexstr(hexstr,0)) > 1 ) { n >>= 1; - printf("PAXPENDING.(%s)\n",retstr); + printf("PAXPENDING.(%s)\n",hexstr); decode_hex(hex,n,hexstr); } free_json(retjson); From 7c8ab60c518b56a4d7e69bd0be9f3be1085ba6f3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Dec 2016 14:02:11 +0200 Subject: [PATCH 017/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 20 ++++++++++++++------ iguana/dpow/dpow_tx.c | 6 +++--- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 8572f2393..e788d059c 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //((height < 90000) ? 7 : 11) //#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 0x0771 +#define DPOW_VERSION 0x0772 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 300 diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e8955e412..bf14d8b84 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -194,7 +194,7 @@ struct dpow_nanomsghdr { bits256 srchash,desthash; struct dpow_nanoutxo ratify,notarize; - uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[64]; + uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,paxwdcrc,ipbits[64]; char symbol[16]; uint8_t senderind,version0,version1,packet[]; } PACKED; @@ -545,7 +545,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } -void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN]) +void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { int32_t i,bestmatches = 0,matches = 0; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) @@ -556,6 +556,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].dest.prev_vout = destvout; bp->notaries[senderind].bestmask = bestmask; bp->notaries[senderind].recvmask = recvmask; + bp->notaries[senderind].paxwdcrc = paxwdcrc; if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) { if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) @@ -585,7 +586,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru if ( bp->bestk >= 0 && bp->notaries[i].bestk == bp->bestk && bp->notaries[i].bestmask == bp->bestmask ) { matches++; - if ( ((1LL << i) & bp->bestmask) != 0 ) + if ( ((1LL << i) & bp->bestmask) != 0 && bp->notaries[i].paxwdcrc == bp->notaries[i].paxwdcrc ) bestmatches++; } // else printf("mismatch.%d (%d %llx) ",i,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); } @@ -623,14 +624,14 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d } else { - dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs); + dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen) { - struct dpow_nanomsghdr *np; int32_t i,size,sentbytes = 0; uint32_t crc32; + struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32; uint8_t extras[10000]; crc32 = calc_crc32(0,data,datalen); //dp->crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); @@ -646,8 +647,11 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo // printf("%08x ",np->ipbits[i]); //printf(" dpow_send.(%d) size.%d numipbits.%d myind.%d\n",datalen,size,np->numipbits,bp->myind); if ( bp->isratify == 0 ) + { + extralen = dpow_paxpending(extras); + bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); dpow_nanoutxoset(&np->notarize,bp,0); - else dpow_nanoutxoset(&np->ratify,bp,1); + } else dpow_nanoutxoset(&np->ratify,bp,1); np->size = size; np->datalen = datalen; np->crc32 = crc32; @@ -663,6 +667,9 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo strcpy(np->symbol,dp->symbol); np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; + if ( extralen > 0 ) + np->paxwdcrc = calc_crc32(0,extra,extralen); + else np->paxwdcrc = 0; memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); @@ -878,6 +885,7 @@ int32_t dpow_rwopret(int32_t rwflag,uint8_t *opret,bits256 *hashmsg,int32_t *hei { memcpy(&opret[opretlen],extras,extralen); opretlen += extralen; + printf("added extra.%d opreturn for withdraws paxwdcrc.%08x\n",extralen,calc_crc32(0,extras,extralen)); } } else diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 18fea41e4..d3d1f094d 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -201,12 +201,12 @@ int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,in { for (i=0; ihashmsg,&bp->height,bp->srccoin->symbol,extras,n,bp,src_or_dest); + if ( bp->isratify != 0 ) + opretlen = dpow_rwopret(1,opret,&bp->hashmsg,&bp->height,bp->srccoin->symbol,0,0,bp,src_or_dest); else opretlen = dpow_rwopret(1,opret,&bp->hashmsg,&bp->height,bp->srccoin->symbol,extras,n,bp,src_or_dest); if ( opretlen < 0 ) { From d21540ed9e8fa85755b869c63e4d45eee38ea467 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Dec 2016 14:04:26 +0200 Subject: [PATCH 018/432] test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index e788d059c..b49622e4d 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -70,7 +70,7 @@ struct dpow_entry { bits256 commit,beacon,ratifysrcutxo,ratifydestutxo; uint64_t masks[2][DPOW_MAXRELAYS],recvmask,othermask,bestmask,ratifyrecvmask,ratifybestmask; - int32_t height; uint32_t pendingcrcs[2]; + int32_t height; uint32_t pendingcrcs[2],paxwdcrc; uint16_t ratifysrcvout,ratifydestvout; int8_t bestk,ratifybestk; uint8_t pubkey[33],ratifysigs[2][DPOW_MAXSIGLEN],ratifysiglens[2]; From f2579c2495f07ee08564934cdff3faf8a5c1f3cf Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Wed, 7 Dec 2016 22:39:50 -0500 Subject: [PATCH 019/432] fixed release build for win64 Signed-off-by: fadedreamz --- OSlibs/win/x64/release/nanomsg.dll | Bin 0 -> 201728 bytes OSlibs/win/x64/release/nanomsg.lib | Bin 0 -> 5594 bytes iguana.vcxproj | 3 ++- 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 OSlibs/win/x64/release/nanomsg.dll create mode 100644 OSlibs/win/x64/release/nanomsg.lib diff --git a/OSlibs/win/x64/release/nanomsg.dll b/OSlibs/win/x64/release/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..1a9074fedd693c913300ea8beed3f64756ab48c4 GIT binary patch literal 201728 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 true true - Ws2_32.lib;Advapi32.lib;$(SolutionDir)OSlibs\win\x64\pthread_lib.lib;%(AdditionalDependencies) + Ws2_32.lib;Advapi32.lib;$(SolutionDir)OSlibs\win\x64\pthread_lib.lib;nanomsg.lib;%(AdditionalDependencies) + .\OSlibs\win\x64\release;%(AdditionalLibraryDirectories) From 0770115f9f6f8943825a178c06b43f657fd40028 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 8 Dec 2016 01:33:42 -0500 Subject: [PATCH 020/432] fixed more win64 memory pointer access issues, updated release build for win32 bit Signed-off-by: fadedreamz --- OSlibs/win/release/nanomsg.dll | Bin 0 -> 144384 bytes OSlibs/win/release/nanomsg.lib | Bin 0 -> 5708 bytes OSlibs/win/release/pthreadVC2.lib | Bin 0 -> 28767 bytes OSlibs/win/release/pthreadvc2.dll | Bin 0 -> 86070 bytes crypto777/curve25519.c | 4 ++++ crypto777/iguana_OS.c | 8 ++++++++ iguana.vcxproj | 3 ++- iguana/iguana_bundles.c | 4 ++++ iguana/iguana_json.c | 4 ++++ iguana/iguana_mofn.c | 7 +++++++ iguana/iguana_unspents.c | 4 ++++ 11 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 OSlibs/win/release/nanomsg.dll create mode 100644 OSlibs/win/release/nanomsg.lib create mode 100644 OSlibs/win/release/pthreadVC2.lib create mode 100644 OSlibs/win/release/pthreadvc2.dll diff --git a/OSlibs/win/release/nanomsg.dll b/OSlibs/win/release/nanomsg.dll new file mode 100644 index 0000000000000000000000000000000000000000..5d5dc7e2037ee53d45e34e76fd6a9735e17d2c35 GIT binary patch literal 144384 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 literal 0 HcmV?d00001 diff --git a/OSlibs/win/release/nanomsg.lib b/OSlibs/win/release/nanomsg.lib new file mode 100644 index 0000000000000000000000000000000000000000..082e2cf03c9888c20f7439db215b2d80b75145d6 GIT binary patch literal 5708 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 bp?Q!!w{tB2m{FMe<)8nR+d|@274H858DB0j literal 0 HcmV?d00001 diff --git a/OSlibs/win/release/pthreadvc2.dll b/OSlibs/win/release/pthreadvc2.dll new file mode 100644 index 0000000000000000000000000000000000000000..93f562baa916c6a5aac9aa753069399e081b17ce GIT binary patch literal 86070 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 - sizeof(*sig)); checksig = *sig; +#if defined(_M_X64) + serialized = (uint8_t *)((unsigned char *)sig + sizeof(*sig)); +#else serialized = (uint8_t *)((long)sig + sizeof(*sig)); +#endif //{ int32_t i; for (i=0; itimestamp,serialized,datalen); if ( memcmp(checksig.sigbits.bytes,sig->sigbits.bytes,sizeof(checksig.sigbits)) != 0 ) diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index 0032a8886..425e65d73 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -217,10 +217,18 @@ static uint64_t _align16(uint64_t ptrval) { if ( (ptrval & 15) != 0 ) ptrval += void *myaligned_alloc(uint64_t allocsize) { void *ptr,*realptr; uint64_t tmp; +#if defined(_M_X64) + realptr = mycalloc('A', 1, (uint64_t)(allocsize + 16 + sizeof(realptr))); +#else realptr = mycalloc('A',1,(long)(allocsize + 16 + sizeof(realptr))); +#endif tmp = _align16((long)realptr + sizeof(ptr)); memcpy(&ptr,&tmp,sizeof(ptr)); +#if defined(_M_X64) + memcpy((void *)((unsigned char *)ptr - sizeof(realptr)), &realptr, sizeof(realptr)); +#else memcpy((void *)((long)ptr - sizeof(realptr)),&realptr,sizeof(realptr)); +#endif //printf("aligned_alloc(%llu) realptr.%p -> ptr.%p, diff.%ld\n",(long long)allocsize,realptr,ptr,((long)ptr - (long)realptr)); return(ptr); } diff --git a/iguana.vcxproj b/iguana.vcxproj index c56e2aa2e..4ac814ee1 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -132,7 +132,8 @@ true true true - Ws2_32.lib;%(AdditionalDependencies) + Ws2_32.lib;pthreadVC2.lib;nanomsg.lib;%(AdditionalDependencies) + .\OSlibs\win\release;%(AdditionalLibraryDirectories) diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index be66da25f..fb382e2cd 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -435,7 +435,11 @@ struct iguana_txid *iguana_bundletx(struct iguana_info *coin,struct iguana_bundl iguana_peerfname(coin,&hdrsi,iter==0?"DB/ro":"DB",fname,0,bp->hashes[0],zero,bp->n,1); if ( (fp= fopen(fname,"rb")) != 0 ) { +#if defined(_M_X64) + fseek(fp, (uint64_t)&rdata.Toffset - (uint64_t)&rdata, SEEK_SET); +#else fseek(fp,(long)&rdata.Toffset - (long)&rdata,SEEK_SET); +#endif if ( fread(&Toffset,1,sizeof(Toffset),fp) == sizeof(Toffset) ) { fseek(fp,Toffset + sizeof(struct iguana_txid) * txidind,SEEK_SET); diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 431e1954f..14471dbc1 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -263,7 +263,11 @@ int32_t template_emit(char *retbuf,int32_t maxsize,char *template,char *varname, varnamelen = (int32_t)strlen(varname); while ( (match= strstr(varname,&template[offset])) != 0 ) { +#if defined(_M_X64) + position = (int32_t)((uint64_t)match - (uint64_t)&template[offset]); +#else position = (int32_t)((long)match - (long)&template[offset]); +#endif printf("found match.(%s) at %d offset.%d\n",varname,position,offset); if ( size + (valuelen + position) > maxsize ) return(-1); diff --git a/iguana/iguana_mofn.c b/iguana/iguana_mofn.c index ab094bf5d..50d024457 100755 --- a/iguana/iguana_mofn.c +++ b/iguana/iguana_mofn.c @@ -563,10 +563,17 @@ int32_t test_mofn256(struct supernet_info *myinfo,int32_t M,int32_t N) if ( m >= M ) printf("%s %s error m.%d vs M.%d N.%d\n",bits256_str(str,secret),bits256_str(str2,recover),m,mofn->M,mofn->N); } +#if defined(_M_X64) + if (((uint64_t)mofn - (uint64_t)space) >= sizeof(space) || ((uint64_t)mofn - (uint64_t)space) < 0) + free(mofn); + if (((uint64_t)cmp - (uint64_t)space) >= sizeof(space) || ((uint64_t)cmp - (uint64_t)space) < 0) + free(cmp); +#else if ( ((long)mofn - (long)space) >= sizeof(space) || ((long)mofn - (long)space) < 0 ) free(mofn); if ( ((long)cmp - (long)space) >= sizeof(space) || ((long)cmp - (long)space) < 0 ) free(cmp); +#endif return(retval); } diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index fcbe8b8b6..759993e73 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1416,7 +1416,11 @@ int32_t iguana_utxoaddr_map(struct iguana_info *coin,char *fname) memcpy(&last,(void *)((long)coin->utxoaddrfileptr+sizeof(uint64_t)),sizeof(last)); memcpy(&coin->utxoaddrind,(void *)((long)coin->utxoaddrfileptr+sizeof(uint64_t)+sizeof(uint32_t)),sizeof(coin->utxoaddrind)); memcpy(&coin->utxoaddrhash.bytes,(void *)((long)coin->utxoaddrfileptr+sizeof(uint64_t)+2*sizeof(uint32_t)),sizeof(coin->utxoaddrhash)); +#if defined(_M_X64) + coin->utxoaddroffsets = (void *)((unsigned char *)coin->utxoaddrfileptr + sizeof(uint64_t) + 2 * sizeof(uint32_t) + sizeof(bits256)); +#else coin->utxoaddroffsets = (void *)((long)coin->utxoaddrfileptr + sizeof(uint64_t) + 2*sizeof(uint32_t) + sizeof(bits256)); +#endif for (ind=total=count=0; ind<0x10000; ind++) { if ( (offset= coin->utxoaddroffsets[ind]) != 0 ) From b014795ddeb5cc476316c22bb2de24ecec2020e5 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 8 Dec 2016 21:27:31 -0500 Subject: [PATCH 021/432] fixed wrong structure alignment build for win64 release Signed-off-by: fadedreamz --- iguana.vcxproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana.vcxproj b/iguana.vcxproj index 4ac814ee1..290de16b1 100644 --- a/iguana.vcxproj +++ b/iguana.vcxproj @@ -126,6 +126,7 @@ true true _CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions) + 1Byte Console @@ -145,7 +146,7 @@ true true WIN64;_WIN64;_CRT_SECURE_NO_WARNINGS;NATIVE_WINDOWS;WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions) - 8Bytes + 1Byte MultiThreaded From fd3250fc62539ce2e6201725d8b748874a299c90 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 14:12:54 +0200 Subject: [PATCH 022/432] 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 bf14d8b84..8e13c4e58 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -185,7 +185,7 @@ struct dpow_nanoutxo { bits256 srcutxo,destutxo; uint64_t bestmask,recvmask; - uint32_t pendingcrcs[2]; + uint32_t pendingcrcs[2],paxwdcrc; uint16_t srcvout,destvout; uint8_t sigs[2][DPOW_MAXSIGLEN],siglens[2],bestk,pad; } PACKED; @@ -194,7 +194,7 @@ struct dpow_nanomsghdr { bits256 srchash,desthash; struct dpow_nanoutxo ratify,notarize; - uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,paxwdcrc,ipbits[64]; + uint32_t channel,height,size,datalen,crc32,myipbits,numipbits,ipbits[64]; char symbol[16]; uint8_t senderind,version0,version1,packet[]; } PACKED; @@ -668,7 +668,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; if ( extralen > 0 ) - np->paxwdcrc = calc_crc32(0,extra,extralen); + np->paxwdcrc = calc_crc32(0,extras,extralen); else np->paxwdcrc = 0; memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); From b39355041c28ad2d6f79aa2832344ef0c045358a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 14:14:52 +0200 Subject: [PATCH 023/432] 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 8e13c4e58..99aa0e471 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -668,8 +668,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; if ( extralen > 0 ) - np->paxwdcrc = calc_crc32(0,extras,extralen); - else np->paxwdcrc = 0; + np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); + else np->notarize.paxwdcrc = 0; memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); From 9c3ea0308e3897ea2c7b603b174d6232ad8a8872 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 15:41:13 +0200 Subject: [PATCH 024/432] test --- iguana/dpow/dpow_network.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 99aa0e471..a6a05985d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -333,6 +333,8 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { int32_t i; + if ( bp->myind < 0 ) + return; if ( isratify != 0 ) { np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; @@ -374,6 +376,8 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; //char str[65],str2[65]; //printf("senderind.%d num.%d %s %s\n",senderind,bp->numnotaries,bits256_str(str,srcutxo),bits256_str(str2,destutxo)); + if ( bp->myind < 0 ) + return; if ( bp->isratify != 0 && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) { memset(masks,0,sizeof(masks)); @@ -548,6 +552,8 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { int32_t i,bestmatches = 0,matches = 0; + if ( bp->myind < 0 ) + return; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) { bp->notaries[senderind].src.prev_hash = srcutxo; @@ -632,6 +638,8 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen) { struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32; uint8_t extras[10000]; + if ( bp->myind < 0 ) + return; crc32 = calc_crc32(0,data,datalen); //dp->crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); @@ -749,7 +757,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) else { dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); - if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff ) + if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { if ( np->senderind >= 0 && np->senderind < bp->numnotaries && memcmp(bp-> notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) { @@ -937,6 +945,8 @@ int32_t dpow_rwsigentry(int32_t rwflag,uint8_t *data,struct dpow_sigentry *dsig) void dpow_sigsend(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,int32_t myind,int8_t bestk,uint64_t bestmask,bits256 srchash,uint32_t sigchannel) { struct dpow_sigentry dsig; int32_t i,len; uint8_t data[4096]; struct dpow_entry *ep; + if ( bp->myind < 0 ) + return; if ( ((1LL << myind) & bestmask) == 0 ) return; ep = &bp->notaries[myind]; From b24f0bfb42eadb03fd1ad3217a6fd08b43a0270b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 15:49:02 +0200 Subject: [PATCH 025/432] test --- iguana/dpow/dpow_network.c | 5 +++++ iguana/iguana777.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a6a05985d..dcab031cc 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -319,6 +319,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("DEXINIT dex.%d rep.%d\n",myinfo->dexsock,myinfo->repsock); + myinfo->nanoinit = (uint32_t)time(NULL); } } } @@ -640,6 +641,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32; uint8_t extras[10000]; if ( bp->myind < 0 ) return; + if ( time(NULL) < myinfo->nanoinit+5 ) + return; crc32 = calc_crc32(0,data,datalen); //dp->crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); @@ -729,6 +732,8 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * void dpow_nanomsg_update(struct supernet_info *myinfo) { int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; + if ( time(NULL) < myinfo->nanoinit+5 ) + return; while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index fcefb7fb2..6c2640990 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -89,7 +89,7 @@ struct supernet_info char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[1024]; char *decryptstr; int32_t maxdelay,IAMRELAY,IAMNOTARY,IAMLP,publicRPC,basilisk_busy,genesisresults,remoteorigin; - uint32_t expiration,dirty,DEXactive,DEXpoll,totalcoins,dexcrcs[1024]; + uint32_t expiration,dirty,DEXactive,DEXpoll,totalcoins,nanoinit,dexcrcs[1024]; uint16_t argport,rpcport; struct basilisk_info basilisks; struct exchange_info *tradingexchanges[SUPERNET_MAXEXCHANGES]; int32_t numexchanges; From d357b80f547e46ddab8ba517c7bcad54c94a6bc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 16:09:03 +0200 Subject: [PATCH 026/432] test --- iguana/tests/ratify | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/ratify b/iguana/tests/ratify index d00e7bdcd..cd376f0f2 100755 --- a/iguana/tests/ratify +++ b/iguana/tests/ratify @@ -1,2 +1,2 @@ #!/bin/bash -curl -s "http://komodonotary.com/notary.json" | curl "http://127.0.0.1:7776" -d @- +curl -s "https://komodonotary.com/notary.json" | curl "http://127.0.0.1:7776" -d @- From 51b6ce35c2bc6b049e6ef282cd38364fbe5177fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 16:12:20 +0200 Subject: [PATCH 027/432] test --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 5a923a7dc..17f15f1f4 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -100,7 +100,7 @@ int32_t dpow_paxpending(uint8_t *hex) if ( (hexstr= jstr(retjson,"withdraws")) != 0 && (n= is_hexstr(hexstr,0)) > 1 ) { n >>= 1; - printf("PAXPENDING.(%s)\n",hexstr); + //printf("PAXPENDING.(%s)\n",hexstr); decode_hex(hex,n,hexstr); } free_json(retjson); From 1baa6bd0e8d9841936f62c69d5a56328314bf18f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 9 Dec 2016 16:43:06 +0200 Subject: [PATCH 028/432] 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 54c203098..117df13f3 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -300,9 +300,9 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) if ( myinfo->numdpows++ == 0 ) portable_mutex_init(&dp->mutex); PAX_init(); - printf(">>>>>>>>>>>>>>> call paxpending\n"); - uint8_t buf[32768]; - dpow_paxpending(buf); + //printf(">>>>>>>>>>>>>>> call paxpending\n"); + //uint8_t buf[32768]; + //dpow_paxpending(buf); return(clonestr("{\"result\":\"success\"}")); } From 04f6584602791ed6f3c7e2216e5a3f42af22d08f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Dec 2016 09:52:48 +0200 Subject: [PATCH 029/432] test --- iguana/dPoW.h | 4 ++-- iguana/dpow/dpow_network.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index b49622e4d..1d126658d 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //((height < 90000) ? 7 : 11) //#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 0x0772 +#define DPOW_VERSION 0x0773 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 300 @@ -106,7 +106,7 @@ struct dpow_block uint64_t destsigsmasks[DPOW_MAXRELAYS],srcsigsmasks[DPOW_MAXRELAYS]; uint64_t recvmask,bestmask,ratifybestmask,ratifyrecvmask,pendingbestmask,pendingratifybestmask,ratifysigmasks[2]; struct dpow_entry notaries[DPOW_MAXRELAYS]; - uint32_t state,starttime,timestamp,waiting,sigcrcs[2],txidcrcs[2],utxocrcs[2],lastepoch; + uint32_t state,starttime,timestamp,waiting,sigcrcs[2],txidcrcs[2],utxocrcs[2],lastepoch,paxwdcrc; int32_t rawratifiedlens[2],height,numnotaries,numerrors,completed,minsigs,duration,numratified,isratify,require0,scores[DPOW_MAXRELAYS]; int8_t myind,bestk,ratifybestk,pendingbestk,pendingratifybestk; cJSON *ratified; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index dcab031cc..0e3299b5b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -593,7 +593,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru if ( bp->bestk >= 0 && bp->notaries[i].bestk == bp->bestk && bp->notaries[i].bestmask == bp->bestmask ) { matches++; - if ( ((1LL << i) & bp->bestmask) != 0 && bp->notaries[i].paxwdcrc == bp->notaries[i].paxwdcrc ) + if ( ((1LL << i) & bp->bestmask) != 0 && bp->paxwdcrc == bp->notaries[i].paxwdcrc ) bestmatches++; } // else printf("mismatch.%d (%d %llx) ",i,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); } @@ -619,7 +619,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } if ( (rand() % 100) == 0 ) - printf("[%d] ips.%d %s NOTARIZE.%d matches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x)\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0]); + printf("[%d] ips.%d %s NOTARIZE.%d matches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } @@ -679,8 +679,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; if ( extralen > 0 ) - np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); - else np->notarize.paxwdcrc = 0; + bp->paxwdcrc = np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); + else bp->paxwdcrc = np->notarize.paxwdcrc = 0; memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); From 7e0990e3719f8d18cc16bca93f072587ee9271ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 11 Dec 2016 10:17:09 +0200 Subject: [PATCH 030/432] test --- iguana/dpow/dpow_fsm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 031e5787c..5b45203fa 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -433,7 +433,7 @@ void dpow_statemachinestart(void *ptr) break; } } - printf("isratify.%d bestk.%d %llx sigs.%llx state machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx\n",bp->isratify,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask); + printf("isratify.%d bestk.%d %llx sigs.%llx state machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x\n",bp->isratify,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc); dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; free(ptr); From fca0479a5b563f0c028c25850ed44374665ba401 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Dec 2016 23:14:44 +0200 Subject: [PATCH 031/432] test --- iguana/dpow/dpow_network.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0e3299b5b..ccf525c76 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -254,7 +254,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) { - char str[512]; int32_t timeout,retval; + char str[512]; int32_t timeout,retval,maxsize; if ( myinfo->ipaddr[0] == 0 ) { printf("need to set ipaddr before nanomsg\n"); @@ -316,6 +316,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) myinfo->numdpowipbits = 1; timeout = 1000; nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + maxsize = 2048 * 1024; + printf("RCVMAX.%d ",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVMAXSIZE,&maxsize,sizeof(maxsize))); + printf("RCVTIMEO.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("DEXINIT dex.%d rep.%d\n",myinfo->dexsock,myinfo->repsock); From f6162372772faec8a85e403ab061bc56eeb31d13 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 12 Dec 2016 23:16:52 +0200 Subject: [PATCH 032/432] test --- iguana/dpow/dpow_network.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index ccf525c76..5a544c579 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -316,9 +316,8 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) myinfo->numdpowipbits = 1; timeout = 1000; nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - maxsize = 2048 * 1024; - printf("RCVMAX.%d ",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVMAXSIZE,&maxsize,sizeof(maxsize))); - printf("RCVTIMEO.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + maxsize = 1024 * 1024; + printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); printf("DEXINIT dex.%d rep.%d\n",myinfo->dexsock,myinfo->repsock); From 85e3319dcb1d11ef6bf5038ee020c8670f4c3565 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 10:40:09 +0200 Subject: [PATCH 033/432] 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 5a544c579..c706a8fd9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -662,7 +662,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo if ( bp->isratify == 0 ) { extralen = dpow_paxpending(extras); - bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); dpow_nanoutxoset(&np->notarize,bp,0); } else dpow_nanoutxoset(&np->ratify,bp,1); np->size = size; From 2847900c7e4829e68fbb628b2dc5085b43fd44b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 12:27:11 +0200 Subject: [PATCH 034/432] test --- iguana/dpow/dpow_fsm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 5b45203fa..21c8c0dd6 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -158,7 +158,7 @@ void dpow_statemachinestart(void *ptr) { void **ptrs = ptr; struct supernet_info *myinfo; struct dpow_info *dp; struct dpow_checkpoint checkpoint; - int32_t i,j,ht,destprevvout0,srcprevvout0,numratified=0,kmdheight,myind = -1; uint8_t pubkeys[64][33]; cJSON *ratified=0,*item; struct iguana_info *src,*dest; char *jsonstr,*handle,*hexstr,str[65],str2[65],srcaddr[64],destaddr[64]; bits256 zero,srchash,destprevtxid0,srcprevtxid0; struct dpow_block *bp; struct dpow_entry *ep = 0; uint32_t duration,minsigs,starttime,srctime; + int32_t i,j,ht,extralen,destprevvout0,srcprevvout0,numratified=0,kmdheight,myind = -1; uint8_t extras[10000],pubkeys[64][33]; cJSON *ratified=0,*item; struct iguana_info *src,*dest; char *jsonstr,*handle,*hexstr,str[65],str2[65],srcaddr[64],destaddr[64]; bits256 zero,srchash,destprevtxid0,srcprevtxid0; struct dpow_block *bp; struct dpow_entry *ep = 0; uint32_t duration,minsigs,starttime,srctime; memset(&zero,0,sizeof(zero)); srcprevtxid0 = destprevtxid0 = zero; srcprevvout0 = destprevvout0 = -1; @@ -387,9 +387,14 @@ void dpow_statemachinestart(void *ptr) } sleep(1); } - if ( bp->isratify == 0 || (starttime= checkpoint.timestamp) == 0 ) - bp->starttime = starttime = (uint32_t)time(NULL); - printf("myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u\n",bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),checkpoint.timestamp); + if ( bp->isratify == 0 ) + { + if ( (starttime= checkpoint.timestamp) == 0 ) + bp->starttime = starttime = (uint32_t)time(NULL); + extralen = dpow_paxpending(extras); + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + } + printf("PAXWDCRC.%x myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u\n",bp->paxwdcrc,bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),checkpoint.timestamp); for (i=0; iminerkey33[i+1]; //printf("start utxosync start.%u %u\n",starttime,(uint32_t)time(NULL)); From 077f62461456eae5d517bbf5d81501e67dd4fc51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 12:48:19 +0200 Subject: [PATCH 035/432] test --- iguana/dpow/dpow_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c706a8fd9..8205a1c48 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -316,11 +316,13 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) myinfo->numdpowipbits = 1; timeout = 1000; nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - maxsize = 1024 * 1024; - printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - printf("DEXINIT dex.%d rep.%d\n",myinfo->dexsock,myinfo->repsock); + maxsize = 1024 * 1024; + printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("RCVBUF.%d\n",nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("DEXINIT dpow.%d dex.%d rep.%d\n",myinfo->dpowsock,myinfo->dexsock,myinfo->repsock); myinfo->nanoinit = (uint32_t)time(NULL); } } From df69769818b5846bb82d5598eba4afec108769d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 13:27:55 +0200 Subject: [PATCH 036/432] test --- iguana/dpow/dpow_fsm.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 21c8c0dd6..97fb5483b 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -402,8 +402,13 @@ void dpow_statemachinestart(void *ptr) //printf("done utxosync start.%u %u\n",starttime,(uint32_t)time(NULL)); while ( time(NULL) < starttime+bp->duration && src != 0 && dest != 0 && bp->state != 0xffffffff ) { - if ( bp->isratify == 0 && myinfo->DPOWS[0].ratifying != 0 ) - break; + if ( bp->isratify == 0 ) + { + if ( myinfo->DPOWS[0].ratifying != 0 ) + break; + extralen = dpow_paxpending(extras); + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + } sleep(1); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { From 820ee0abe073e1bb83a190d58a300ee734bfd2f5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 13:54:24 +0200 Subject: [PATCH 037/432] test --- iguana/dpow/dpow_network.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8205a1c48..ddc967851 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -556,7 +556,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { - int32_t i,bestmatches = 0,matches = 0; + int32_t i,bestmatches = 0,matches = 0,paxmatches = 0; if ( bp->myind < 0 ) return; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) @@ -597,8 +597,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru if ( bp->bestk >= 0 && bp->notaries[i].bestk == bp->bestk && bp->notaries[i].bestmask == bp->bestmask ) { matches++; - if ( ((1LL << i) & bp->bestmask) != 0 && bp->paxwdcrc == bp->notaries[i].paxwdcrc ) - bestmatches++; + if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) + paxmatches++; + if ( ((1LL << i) & bp->bestmask) != 0 ) + bestmatches++; } // else printf("mismatch.%d (%d %llx) ",i,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); } if ( bestmatches >= bp->minsigs ) @@ -623,7 +625,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } if ( (rand() % 100) == 0 ) - printf("[%d] ips.%d %s NOTARIZE.%d matches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); + printf("[%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From a87772851a8b1225d958d961b17f4da60c1531de Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 14:03:50 +0200 Subject: [PATCH 038/432] 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 ddc967851..e9d0198cb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -666,7 +666,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo if ( bp->isratify == 0 ) { extralen = dpow_paxpending(extras); - bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); dpow_nanoutxoset(&np->notarize,bp,0); } else dpow_nanoutxoset(&np->ratify,bp,1); np->size = size; From 0282bb4c9d39b1916393db57b200550fa136ad94 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 13 Dec 2016 14:22:49 +0200 Subject: [PATCH 039/432] test --- iguana/dpow/dpow_network.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e9d0198cb..14e9d5234 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -567,7 +567,8 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].dest.prev_vout = destvout; bp->notaries[senderind].bestmask = bestmask; bp->notaries[senderind].recvmask = recvmask; - bp->notaries[senderind].paxwdcrc = paxwdcrc; + if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) + fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) { if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) From 3785de39363720fc8dab01c75599d187eaf638b9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Dec 2016 08:51:28 +0200 Subject: [PATCH 040/432] test --- iguana/dpow/dpow_fsm.c | 8 ++++---- iguana/dpow/dpow_network.c | 18 ++++++++++-------- iguana/dpow/dpow_rpc.c | 9 +++++++-- iguana/dpow/dpow_tx.c | 6 +++--- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 97fb5483b..9f258a446 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -391,8 +391,8 @@ void dpow_statemachinestart(void *ptr) { if ( (starttime= checkpoint.timestamp) == 0 ) bp->starttime = starttime = (uint32_t)time(NULL); - extralen = dpow_paxpending(extras); - bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + extralen = dpow_paxpending(extras,&bp->paxwdcrc); + bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } printf("PAXWDCRC.%x myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u\n",bp->paxwdcrc,bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),checkpoint.timestamp); for (i=0; iDPOWS[0].ratifying != 0 ) break; - extralen = dpow_paxpending(extras); - bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = calc_crc32(0,extras,extralen); + extralen = dpow_paxpending(extras,&bp->paxwdcrc); + bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } sleep(1); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 14e9d5234..100c47726 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -645,7 +645,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen) { - struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32; uint8_t extras[10000]; + struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32,paxwdcrc; uint8_t extras[10000]; if ( bp->myind < 0 ) return; if ( time(NULL) < myinfo->nanoinit+5 ) @@ -666,10 +666,15 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo //printf(" dpow_send.(%d) size.%d numipbits.%d myind.%d\n",datalen,size,np->numipbits,bp->myind); if ( bp->isratify == 0 ) { - extralen = dpow_paxpending(extras); - bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); + extralen = dpow_paxpending(extras,&paxwdcrc); + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; dpow_nanoutxoset(&np->notarize,bp,0); - } else dpow_nanoutxoset(&np->ratify,bp,1); + } + else + { + bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = 0; + dpow_nanoutxoset(&np->ratify,bp,1); + } np->size = size; np->datalen = datalen; np->crc32 = crc32; @@ -685,13 +690,10 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo strcpy(np->symbol,dp->symbol); np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; - if ( extralen > 0 ) - bp->paxwdcrc = np->notarize.paxwdcrc = calc_crc32(0,extras,extralen); - else bp->paxwdcrc = np->notarize.paxwdcrc = 0; memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); - //printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->crc32,datalen); + printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->paxwdcrc,datalen); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 17f15f1f4..533462913 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -86,9 +86,10 @@ bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *c return(blockhash); } -int32_t dpow_paxpending(uint8_t *hex) +int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp) { - struct iguana_info *coin; char *retstr,*hexstr; cJSON *retjson; int32_t n=0; + struct iguana_info *coin; char *retstr,*hexstr; cJSON *retjson; int32_t n=0; uint32_t paxwdcrc; + paxwdcrc = 0; if ( (coin= iguana_coinfind("KMD")) != 0 ) { if ( coin->FULLNODE < 0 ) @@ -102,6 +103,8 @@ int32_t dpow_paxpending(uint8_t *hex) n >>= 1; //printf("PAXPENDING.(%s)\n",hexstr); decode_hex(hex,n,hexstr); + paxwdcrc = calc_crc32(0,hex,n) & 0xffffff00; + paxwdcrc |= (n & 0xff); } free_json(retjson); } else printf("dpow_paxpending: parse error.(%s)\n",retstr); @@ -109,6 +112,8 @@ int32_t dpow_paxpending(uint8_t *hex) } else printf("dpow_paxpending: paxwithdraw null return\n"); } else printf("dpow_paxpending: KMD FULLNODE.%d\n",coin->FULLNODE); } else printf("dpow_paxpending: cant find KMD\n"); + if ( *paxwdcrcp != paxwdcrc ) + *paxwdcrcp = paxwdcrc; return(n); } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index d3d1f094d..8888b216c 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -165,7 +165,7 @@ struct dpow_block *dpow_heightfind(struct supernet_info *myinfo,struct dpow_info int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,int32_t src_or_dest,uint8_t pubkeys[][33],int32_t numratified) { - uint32_t locktime=0,numvouts; uint64_t satoshis,satoshisB; int32_t i,n=0,opretlen,len=0; uint8_t opret[16384],data[16384],extras[16384]; + uint32_t paxwdcrc=0,locktime=0,numvouts; uint64_t satoshis,satoshisB; int32_t i,n=0,opretlen,len=0; uint8_t opret[16384],data[16384],extras[16384]; numvouts = 2; if ( pubkeys == 0 || numratified <= 0 ) { @@ -197,11 +197,11 @@ 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)) > 0 ) + if ( (src_or_dest == 0 || strcmp(bp->destcoin->symbol,"BTC") != 0) && (n= dpow_paxpending(extras,&paxwdcrc)) > 0 ) { for (i=0; i Date: Wed, 14 Dec 2016 08:52:34 +0200 Subject: [PATCH 041/432] 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 100c47726..332a232f0 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -693,7 +693,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->paxwdcrc,datalen); + printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From e38e471eb6bf9fdba28b3f0e9615e371f30be909 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Dec 2016 09:04:33 +0200 Subject: [PATCH 042/432] test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 1d126658d..24296d59f 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //((height < 90000) ? 7 : 11) //#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 0x0773 +#define DPOW_VERSION 0x0774 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 300 From d358f3a253de48cd438cac87a90317ab776d9a6a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Dec 2016 09:12:32 +0200 Subject: [PATCH 043/432] 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 332a232f0..dac3e8d9e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -693,7 +693,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen); + //printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 49e11424a1b8712eae75044ec912ae472e38f3ca Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 14 Dec 2016 09:36:36 +0200 Subject: [PATCH 044/432] test --- iguana/dpow/dpow_fsm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 9f258a446..f83948c90 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -443,7 +443,7 @@ void dpow_statemachinestart(void *ptr) break; } } - printf("isratify.%d bestk.%d %llx sigs.%llx state machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x\n",bp->isratify,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc); + printf("isratify.%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; free(ptr); From 1691e143dafe151c1a5dc7379a6539782516b264 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 15 Dec 2016 00:07:31 +0200 Subject: [PATCH 045/432] test --- iguana/dpow/dpow_fsm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index f83948c90..1a3c7b07a 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -389,7 +389,7 @@ void dpow_statemachinestart(void *ptr) } if ( bp->isratify == 0 ) { - if ( (starttime= checkpoint.timestamp) == 0 ) + //if ( (starttime= checkpoint.timestamp) == 0 ) bp->starttime = starttime = (uint32_t)time(NULL); extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; @@ -405,7 +405,10 @@ void dpow_statemachinestart(void *ptr) if ( bp->isratify == 0 ) { if ( myinfo->DPOWS[0].ratifying != 0 ) + { + printf("break due to already ratifying\n"); break; + } extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } @@ -443,7 +446,7 @@ void dpow_statemachinestart(void *ptr) break; } } - printf("isratify.%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); + printf("isratify.%d:%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,dp->ratifying,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; free(ptr); From 47027776038753137bde231e446bba043dd9cc82 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 13:14:57 +0200 Subject: [PATCH 046/432] 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 dac3e8d9e..8a723b5f9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -602,7 +602,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru paxmatches++; if ( ((1LL << i) & bp->bestmask) != 0 ) bestmatches++; - } // else printf("mismatch.%d (%d %llx) ",i,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); + } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); } if ( bestmatches >= bp->minsigs ) { From 3bb8c988d53848ed4ea829a106f8cdbde4779b56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 14:37:39 +0200 Subject: [PATCH 047/432] 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 8a723b5f9..769b19267 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -588,6 +588,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; bp->notaries[bp->myind].bestk = bp->bestk; bp->notaries[bp->myind].bestmask = bp->bestmask; bp->notaries[bp->myind].recvmask = bp->recvmask; From c5c733779cb9589293ee3dfc893ca612a2504d93 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 14:41:08 +0200 Subject: [PATCH 048/432] 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 769b19267..3c9392782 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -605,6 +605,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bestmatches++; } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); } + printf("recv.%llx\n",(long long)bp->recvmask; if ( bestmatches >= bp->minsigs ) { if ( bp->pendingbestk != bp->bestk || bp->pendingbestmask != bp->bestmask ) From 9f0971fc5c6edaf0f68b7e022d99100d00ae2852 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 14:42:09 +0200 Subject: [PATCH 049/432] 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 3c9392782..a528c59f8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -605,7 +605,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bestmatches++; } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); } - printf("recv.%llx\n",(long long)bp->recvmask; + printf("recv.%llx best.(%d %llx) m.%d p.%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,bestmatches); if ( bestmatches >= bp->minsigs ) { if ( bp->pendingbestk != bp->bestk || bp->pendingbestmask != bp->bestmask ) From 7d0aadc84d8cceb7874b61a246609fcf8831b4fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 18:11:56 +0200 Subject: [PATCH 050/432] test --- iguana/dpow/dpow_network.c | 58 ++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a528c59f8..a70166c1d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -412,7 +412,8 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("RECV from %d best.(%d %llx) sigs.(%d %d) %llx %llx\n",senderind,bestk,(long long)bestmask,siglens[0],siglens[1],(long long)bp->ratifysigmasks[0],(long long)bp->ratifysigmasks[1]); - bp->ratifyrecvmask = 0;//|= (1LL << senderind) | (1LL << bp->myind); +// generalize for both paths + bp->ratifyrecvmask = 0; bp->ratifybestmask = 0; bp->ratifybestk = -1; for (numdiff=i=0; inumnotaries; i++) @@ -554,6 +555,52 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } +void dpow_bestconsensus(struct dpow_block *bp) +{ + int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; + memset(masks,0,sizeof(masks)); + memset(bestks,0xff,sizeof(bestks)); + memset(counts,0,sizeof(counts)); + bp->recvmask = 0; + bp->bestmask = 0; + bp->bestk = -1; + for (numdiff=i=0; inumnotaries; i++) + { + if ( bits256_nonz(bp->notaries[i].src.prev_hash) != 0 && bits256_nonz(bp->notaries[i].dest.prev_hash) != 0 ) + bp->recvmask |= (1LL << i); + if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 ) + continue; + if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) + continue; + for (j=0; jnotaries[i].bestk == bestks[j] && bp->notaries[i].bestmask == masks[j] ) + { + counts[j]++; + break; + } + if ( j == numdiff && bp->notaries[i].bestk >= 0 && bp->notaries[i].bestmask != 0 ) + { + masks[numdiff] = bp->notaries[i].bestmask; + bestks[numdiff] = bp->notaries[i].bestk; + counts[numdiff]++; + //printf("j.%d numdiff.%d (%d %llx).%d\n",j,numdiff,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,counts[numdiff]); + numdiff++; + } + } + besti = -1, best = 0; + for (i=0; i best ) + { + best = counts[i]; + besti = i; + } + } + if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->recvmask & masks[besti]) == masks[besti] ) + bp->bestmask = masks[besti], bp->bestk = bestks[besti]; +} + void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { int32_t i,bestmatches = 0,matches = 0,paxmatches = 0; @@ -586,8 +633,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru else bp->destsigsmasks[bestk] &= ~(1LL << senderind); } } - bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); - bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + dpow_bestconsensus(bp); + //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); + //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; bp->notaries[bp->myind].bestk = bp->bestk; bp->notaries[bp->myind].bestmask = bp->bestmask; @@ -596,11 +644,11 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { for (i=0; inumnotaries; i++) { + if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) + paxmatches++; if ( bp->bestk >= 0 && bp->notaries[i].bestk == bp->bestk && bp->notaries[i].bestmask == bp->bestmask ) { matches++; - if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) - paxmatches++; if ( ((1LL << i) & bp->bestmask) != 0 ) bestmatches++; } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); From 9429a214473c9fa9e42ce38de5b3bcf6fd34cc41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 18:48:13 +0200 Subject: [PATCH 051/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 24296d59f..e0b35d4e9 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -25,7 +25,7 @@ #define DPOW_VERSION 0x0774 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 -#define DPOW_DURATION 300 +#define DPOW_DURATION 600 #define DPOW_RATIFYDURATION (3600 * 24) //#define DPOW_ENTRIESCHANNEL ('e' | ('n' << 8) | ('t' << 16) | ('r' << 24)) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a70166c1d..acf991049 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -412,7 +412,6 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("RECV from %d best.(%d %llx) sigs.(%d %d) %llx %llx\n",senderind,bestk,(long long)bestmask,siglens[0],siglens[1],(long long)bp->ratifysigmasks[0],(long long)bp->ratifysigmasks[1]); -// generalize for both paths bp->ratifyrecvmask = 0; bp->ratifybestmask = 0; bp->ratifybestk = -1; @@ -599,6 +598,16 @@ void dpow_bestconsensus(struct dpow_block *bp) } if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->recvmask & masks[besti]) == masks[besti] ) bp->bestmask = masks[besti], bp->bestk = bestks[besti]; + if ( bp->bestmask == 0 || (time(NULL) / 100) != bp->lastepoch ) + { + bp->bestmask = dpow_ratifybest(bp->recvmask,bp,&bp->bestk); + if ( (time(NULL) / 60) != bp->lastepoch ) + { + bp->lastepoch = (uint32_t)(time(NULL) / 100); + printf("epoch %u\n",bp->lastepoch % bp->numnotaries); + sleep(2 + (rand() % 7)); + } + } } void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) From 1048f4a4aecfa22ee1e4b7cc3aa2b8614a5745fb Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 18:57:49 +0200 Subject: [PATCH 052/432] test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/dpow/dpow_tx.c | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index acf991049..8b617798a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -600,10 +600,10 @@ void dpow_bestconsensus(struct dpow_block *bp) bp->bestmask = masks[besti], bp->bestk = bestks[besti]; if ( bp->bestmask == 0 || (time(NULL) / 100) != bp->lastepoch ) { - bp->bestmask = dpow_ratifybest(bp->recvmask,bp,&bp->bestk); + bp->bestmask = dpow_notarybest(bp->recvmask,bp,&bp->bestk); if ( (time(NULL) / 60) != bp->lastepoch ) { - bp->lastepoch = (uint32_t)(time(NULL) / 100); + bp->lastepoch = (uint32_t)(time(NULL) / 60); printf("epoch %u\n",bp->lastepoch % bp->numnotaries); sleep(2 + (rand() % 7)); } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 8888b216c..906300dfc 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -99,6 +99,30 @@ uint64_t dpow_ratifybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) return(bestmask); } +uint64_t dpow_notarybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) +{ + int32_t m,j,k; uint64_t bestmask,mask = bp->require0; + bestmask = 0; + *lastkp = -1; + for (m=j=0; jnumnotaries; j++) + { + k = (j + ((uint32_t)time(NULL) / 60)) % bp->numnotaries; + if ( bp->require0 != 0 && k == 0 ) + continue; + if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) + { + mask |= (1LL << k); + if ( ++m == bp->minsigs-bp->require0 ) + { + *lastkp = k; + bestmask = mask | bp->require0; + //printf("m.%d == minsigs.%d (%d %llx)\n",m,bp->minsigs,k,(long long)bestmask); + } + } + } + return(bestmask); +} + uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) { int32_t j,m,k; uint64_t bestmask,mask = 0;//bp->require0; From 55d545976891186c4d6deb905c951d44b1dbd04f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 19:00:54 +0200 Subject: [PATCH 053/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/dpow/dpow_tx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8b617798a..ed5aed90b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -600,7 +600,7 @@ void dpow_bestconsensus(struct dpow_block *bp) bp->bestmask = masks[besti], bp->bestk = bestks[besti]; if ( bp->bestmask == 0 || (time(NULL) / 100) != bp->lastepoch ) { - bp->bestmask = dpow_notarybest(bp->recvmask,bp,&bp->bestk); + bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); if ( (time(NULL) / 60) != bp->lastepoch ) { bp->lastepoch = (uint32_t)(time(NULL) / 60); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 906300dfc..7d28e0b29 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -99,7 +99,7 @@ uint64_t dpow_ratifybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) return(bestmask); } -uint64_t dpow_notarybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) +uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) { int32_t m,j,k; uint64_t bestmask,mask = bp->require0; bestmask = 0; From 1c3574a82eb9b413e399a53e6dab9593583b1e65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 16 Dec 2016 19:02:06 +0200 Subject: [PATCH 054/432] test --- iguana/dPoW.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index e0b35d4e9..979389380 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -138,6 +138,7 @@ struct dpow_info uint32_t ipbits[64],numipbits; struct dpow_block **blocks; }; +uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); #endif From eef16ebd673e79a77251bfc146458adc2cf03a15 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 07:44:59 +0200 Subject: [PATCH 055/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- iguana/dpow/dpow_tx.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index ed5aed90b..b359b31fa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -598,14 +598,14 @@ void dpow_bestconsensus(struct dpow_block *bp) } if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->recvmask & masks[besti]) == masks[besti] ) bp->bestmask = masks[besti], bp->bestk = bestks[besti]; - if ( bp->bestmask == 0 || (time(NULL) / 100) != bp->lastepoch ) + if ( bp->bestmask == 0 || (time(NULL) / 180) != bp->lastepoch ) { bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); - if ( (time(NULL) / 60) != bp->lastepoch ) + if ( (time(NULL) / 180) != bp->lastepoch ) { - bp->lastepoch = (uint32_t)(time(NULL) / 60); + bp->lastepoch = (uint32_t)(time(NULL) / 180); printf("epoch %u\n",bp->lastepoch % bp->numnotaries); - sleep(2 + (rand() % 7)); + sleep(1 + (rand() % 3)); } } } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 7d28e0b29..8d555acc5 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -106,7 +106,7 @@ uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) *lastkp = -1; for (m=j=0; jnumnotaries; j++) { - k = (j + ((uint32_t)time(NULL) / 60)) % bp->numnotaries; + k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries; if ( bp->require0 != 0 && k == 0 ) continue; if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) From 438689738ced141f8eace3dffd87cdea6d3939c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 07:46:38 +0200 Subject: [PATCH 056/432] test --- iguana/dpow/dpow_network.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b359b31fa..43cfe7163 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -624,7 +624,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].bestmask = bestmask; bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) - fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); + { + //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); + } if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) { if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) @@ -684,7 +686,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } - if ( (rand() % 100) == 0 ) + if ( (rand() % 30) == 0 ) printf("[%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From a454fe954b1f1b3eb80a51595bc45c87cde67193 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 07:50:33 +0200 Subject: [PATCH 057/432] test --- iguana/dpow/dpow_network.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 43cfe7163..97b7c5073 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -612,7 +612,7 @@ void dpow_bestconsensus(struct dpow_block *bp) void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { - int32_t i,bestmatches = 0,matches = 0,paxmatches = 0; + int32_t i,bestmatches = 0,matches = 0,paxmatches = 0,paxbestmatches = 0; if ( bp->myind < 0 ) return; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) @@ -661,11 +661,17 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { matches++; if ( ((1LL << i) & bp->bestmask) != 0 ) - bestmatches++; + { + if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) + { + bestmatches++; + paxbestmatches++; + } + } } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); } - printf("recv.%llx best.(%d %llx) m.%d p.%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,bestmatches); - if ( bestmatches >= bp->minsigs ) + printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); + if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { if ( bp->pendingbestk != bp->bestk || bp->pendingbestmask != bp->bestmask ) { From 84da0ed884f43b856e56a935a2a1d612bedef017 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 07:52:55 +0200 Subject: [PATCH 058/432] test --- iguana/dPoW.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 979389380..8ae3d2b2d 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -19,10 +19,10 @@ #define DPOW_FIRSTRATIFY 1000 #define DPOW_CHECKPOINTFREQ 10 -#define DPOW_MINSIGS 17 //((height < 90000) ? 7 : 11) +#define DPOW_MINSIGS 11 //#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 0x0774 +#define DPOW_VERSION 0x0775 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 From 110de8b0100165fdc6741effd282acb775518ba1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 10:58:08 +0200 Subject: [PATCH 059/432] test --- iguana/iguana_msg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 5f9e5543e..3689a2a7f 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -209,8 +209,8 @@ int32_t iguana_rwblock(struct supernet_info *myinfo,char *symbol,uint8_t zcash,u if ( rwflag == 1 ) { if ( zcash == 0 ) - x = zmsg->txn_count; - else x = msg->txn_count; + x = msg->txn_count; + else x = zmsg->txn_count; } //char str[65],str2[65]; printf("zcash.%d len.%d: block version.%d timestamp.%u bits.%x nonce.%u prev.(%s) %llx hash2.%s zlen.%d\n",zcash,len,msg->H.version,msg->H.timestamp,msg->H.bits,msg->H.nonce,bits256_str(str,msg->H.prev_block),(long long)msg->H.merkle_root.txid,bits256_str(str2,*hash2p),(int32_t)sizeof(struct iguana_msgzblockhdr)); len += iguana_rwvarint(rwflag,&serialized[len],&x); From 96989d8a21c00cc0adeaaec5791889d689e30d54 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 17:43:58 +0200 Subject: [PATCH 060/432] test --- iguana/main.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 43d8cfd50..0ee7dd773 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1652,20 +1652,20 @@ void iguana_main(void *arg) } } else printf("couldnt parse.(%s)\n",jsonstr); } - if ( 0 ) + if ( 1 ) { int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); - char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies + char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "REVS" }; + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; uint8_t pubkeys[64][33]; char coinaddr[64]; int32_t i,j; double val = 0.01; - //n = komodo_notaries("KMD",pubkeys,0); -#include "notaries.h" - for (i=0; i<=32; i++) + int32_t n = komodo_notaries("KMD",pubkeys,0); +//#include "notaries.h" + for (i=0; i Date: Sat, 17 Dec 2016 17:45:00 +0200 Subject: [PATCH 061/432] test --- iguana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/main.c b/iguana/main.c index 0ee7dd773..7db8852eb 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1652,7 +1652,7 @@ void iguana_main(void *arg) } } else printf("couldnt parse.(%s)\n",jsonstr); } - if ( 1 ) + if ( 0 ) { int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies From 1d2746fc95de31afdfb4007cf53b3691c62b0278 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 17:53:26 +0200 Subject: [PATCH 062/432] test --- iguana/iguana_notary.c | 19 +++++++++++++++++++ iguana/main.c | 19 ------------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 117df13f3..fc16798e3 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -376,6 +376,25 @@ STRING_ARG(dpow,active,maskhex) { uint8_t data[8],revdata[8]; int32_t i,len; uint64_t mask; cJSON *retjson,*array = cJSON_CreateArray(); //return(clonestr("{\"error\":\"dpow active is deprecated for now\"}")); + if ( 1 ) + { + int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); + char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies + "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; + uint8_t pubkeys[64][33]; char coinaddr[64]; int32_t i,j; double val = 0.01; + int32_t n = komodo_notaries("KMD",pubkeys,114000); + //#include "notaries.h" + for (i=0; iDPOWS[0].lastrecvmask; diff --git a/iguana/main.c b/iguana/main.c index 7db8852eb..04785e933 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1652,25 +1652,6 @@ void iguana_main(void *arg) } } else printf("couldnt parse.(%s)\n",jsonstr); } - if ( 0 ) - { - int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); - char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies - "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; - uint8_t pubkeys[64][33]; char coinaddr[64]; int32_t i,j; double val = 0.01; - int32_t n = komodo_notaries("KMD",pubkeys,0); -//#include "notaries.h" - for (i=0; i Date: Sat, 17 Dec 2016 17:55:51 +0200 Subject: [PATCH 063/432] test --- iguana/tests/active_7776 | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 iguana/tests/active_7776 diff --git a/iguana/tests/active_7776 b/iguana/tests/active_7776 new file mode 100755 index 000000000..f6929bcbe --- /dev/null +++ b/iguana/tests/active_7776 @@ -0,0 +1,3 @@ +#!/bin/bash +source pubkey.txt +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"ffff\"}" From 6fcae2f40223af5d3ba65493177828613fd18fff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 17:58:00 +0200 Subject: [PATCH 064/432] test --- iguana/iguana_notary.c | 2 +- iguana/tests/fundnotaries | 2753 +++++++++++++++++++++++++++++++++++++ 2 files changed, 2754 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/fundnotaries diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index fc16798e3..bbc9abb93 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -376,7 +376,7 @@ STRING_ARG(dpow,active,maskhex) { uint8_t data[8],revdata[8]; int32_t i,len; uint64_t mask; cJSON *retjson,*array = cJSON_CreateArray(); //return(clonestr("{\"error\":\"dpow active is deprecated for now\"}")); - if ( 1 ) + if ( 0 ) { int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies diff --git a/iguana/tests/fundnotaries b/iguana/tests/fundnotaries new file mode 100755 index 000000000..6c76eb16d --- /dev/null +++ b/iguana/tests/fundnotaries @@ -0,0 +1,2753 @@ +./komodo-cli -ac_name=USD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=USD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=USD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=USD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=USD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=USD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=USD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=EUR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=JPY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=GBP sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=AUD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=CAD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=CHF sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=NZD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=CNY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=RUB sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=MXN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=BRL sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=INR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=INR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=INR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=INR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=INR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=INR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=HKD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=TRY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=ZAR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=PLN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=NOK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=SEK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=DKK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=CZK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=HUF sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=ILS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=KRW sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=MYR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=PHP sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=RON sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=RON sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=RON sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=RON sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=RON sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=RON sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=SGD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=THB sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=THB sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=THB sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=THB sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=THB sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=THB sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=BGN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=IDR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=HRK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=REVS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=SUPERNET sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=DEX sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=PANGEA sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=JUMBLR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=BET sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=BET sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=BET sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=BET sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=BET sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=BET sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=CRYPTO sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=HODL sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=SHARK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=BOTS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 +./komodo-cli -ac_name=MGW sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 + From 88f562a4417a4df67ea1b992334bdb13ea8f9b43 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 18:00:29 +0200 Subject: [PATCH 065/432] test --- iguana/tests/fundnotaries | 2048 ------------------------------------- 1 file changed, 2048 deletions(-) diff --git a/iguana/tests/fundnotaries b/iguana/tests/fundnotaries index 6c76eb16d..cd6841966 100755 --- a/iguana/tests/fundnotaries +++ b/iguana/tests/fundnotaries @@ -1,2051 +1,3 @@ -./komodo-cli -ac_name=USD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=USD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=USD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=USD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=USD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=USD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=USD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=EUR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=JPY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=GBP sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=AUD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=CAD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=CHF sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=NZD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=CNY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=RUB sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=MXN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=BRL sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=INR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=INR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=INR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=INR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=INR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=INR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=HKD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=TRY sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=ZAR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=PLN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=NOK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=SEK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=DKK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=CZK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=HUF sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=ILS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=KRW sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=MYR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=PHP sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=RON sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=RON sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=RON sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=RON sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=RON sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=RON sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=SGD sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=THB sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=THB sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=THB sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=THB sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=THB sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=THB sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=BGN sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=IDR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=HRK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 ./komodo-cli -ac_name=REVS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 ./komodo-cli -ac_name=REVS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 ./komodo-cli -ac_name=REVS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 From 60a7c98ac4153d85fdf80c13da83a5a0400055ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 17 Dec 2016 18:01:21 +0200 Subject: [PATCH 066/432] test --- iguana/tests/fundnotaries | 705 -------------------------------------- 1 file changed, 705 deletions(-) delete mode 100755 iguana/tests/fundnotaries diff --git a/iguana/tests/fundnotaries b/iguana/tests/fundnotaries deleted file mode 100755 index cd6841966..000000000 --- a/iguana/tests/fundnotaries +++ /dev/null @@ -1,705 +0,0 @@ -./komodo-cli -ac_name=REVS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=REVS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=SUPERNET sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=DEX sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=PANGEA sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=JUMBLR sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=BET sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=BET sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=BET sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=BET sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=BET sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=BET sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=CRYPTO sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=HODL sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=SHARK sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=BOTS sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RHPGxpiwRHP4dKZXjYPdpon1nCto7qVE8s 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RLQoAcs1RaqW1xfN2NJwoZWW5twexPhuGB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RXF3aHUaWDUY4fRRYmBNALoHWkgSQCiJ4f 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RL2SkPSCGMvcHqZ56ErfMxbQGdA4nk7MZp 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RFssbc211PJdVy1bvcvAG5X2N4ovPAoy5o 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RNoz2DKPZ2ppMxgYx5tce9sjZBHefvPvNB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RVxtoUT9CXbC1LdhztNAf9yR5ySnFnSPQh 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress R9XBrbj8iKkwy9M4erUqRaBinAiZSTXav3 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RSHdRnHHGdPtVej7fiehHBQ6dyTbEM1GHi 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDW8EDkCkzQ1LA4xbVUoAERsBVhhYRLXCr 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RAxQTHdsy89tfSXwoce2sHeWrYXmDsMXQq 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RT2k2voy9n8jwppeTTJMQAhvaqA9pc9jHh 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RRvaVyKS59NJWhPp8Pn7mVPGhMuhJJXrdh 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RBpp98VwHx7SFv7dNbw8NY65t14XFq9fVD 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RPjUmFNcWEW9Bu275kPxzRXyWDz6bfQpPD 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDY2CvzydimY2AtDqSjBAB1eCeogRE55DX 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RUgW6fLfVsLJ87Ng4zJTqNedJSKYQ9ToAf 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RUreYvNjhZYc1vP8cND9Cztpni1pYsigXb 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RHv3wyVnnanG2kSQmLNmjwAQeYRRAptxUy 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RLVwuTM5TitV4Gk79Rja731RwYkAzz7GWn 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RHbxwDa7JT1KJLHDKwb5n3gd8NREErqtQY 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RFDAZ1yCvKPmpqcgzg8r2qQJ8nPPgeoMrB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RHsZesZXMfkdrsSEper3JWUBKwk29JTFfT 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RPJjzoKPb8idoUCT9XLBkNojNgysjJ5qrE 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RFQNjTfcvSAmf8D83og1NrdHj1wH2fc5X4 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RPknkGAHMwUBvfKQfvw9FyatTZzicSiN4y 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RMqbQz4NPNbG15QBwy9EFvLn4NX5Fa7w5g 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RQipE6ycbVVb9vCkhqrK8PGZs2p5YmiBtg 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RCA8H1npFPW5pnJRzycF8tFEJmn6XZhD4j 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RJD5jRidYW9Cu8qxjg9HDCsx6J3A4wQ4LU 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RQMwcDYMVBx9f4QCFfFk31px8QZP4e8uhA 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RXzsovGBQ3W97xnVC6JnWxXsV4qb7p7iBi 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RLHr8gUm2MZ3EEgDU4EmK7bdn5ZsxLYmnt 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RFTsWSzgKRd5Xa7d287w9eRFeYefKBso6Z 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress REuQ7EoxKeMYk4EGptV6EwdfV9LZXuc44g 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RX1tP6ftwe96p6scgJn4dpgNdHDgyg9R87 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RERp696QtNTeWDfBy3x3QbRwPYN2NxwxfA 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RNZKqUgoAPwWd7wNtuSKP7k1HSJAyPeH4N 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress R9jhJCwgT78pyjnkNuxgH3CE8ekxgT8iwB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RSCQKVUhihKb13rb5VJwXsbSY6pdRPUZ6V 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDVqM6t5xZw9jbYXEw2CJgkiSbrHBHiKR3 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RSSNgf98kiMGUxs55DvhNnumyxVudd2KQQ 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RXqdRmv7n9hygf9C7f7vj4VQyNR9RvzXss 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RE3P8D8rcWZBeKmT8DURPdezW87MU5Ho3F 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RS3v2u6d4SJ1ujLz7CHNSFLSmxn6Tx6mJp 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RREc88bQzxHCvzqErPDnTQH2Qg5yUtjbyp 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RJ9wAk3ZNrFwdso1RVbwASiqqQaDNyKjd2 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RVKtRKozg8RKvEYCumMD43fCU6f212M5RD 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RCvsbvzCwA1AaxeoYVSL9Q3BdnybEWfXaH 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RXtADsErZLmsGhNyQdW2DekHMGZ23cLrav 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RYGrWs5b8CVFFpxGpjiBaMwfYV9X5UqFaB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RHASfhhM6bvDFakRDqkzA2wc3V4R4oNmXi 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RATaU3jjn4RwHK61YWoJ4eg7Eggk3puZW8 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RXbb9PkefXcsqq8wqiUZZUuq8e3p29mw1G 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDY9LJZTEJ9FsvugUuD69gceA98uqan5XL 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress R9tjkpdNbzw6mNfxorb5bvTPmsuon5aLrC 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RT2JyVts5tb1prC7KYykmznrqw7VXJo1HB 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RFHRWQ5pAXNfmudHfxdxw3Wo8yFGoeDn6z 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RTw3vi3dGa9n8LLbKvk7jDAwLdt3A5ET7a 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RQeuhk4KcPM3F5hefwTBWezDdcktSGQQSq 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress R9TGdzN25MgdRkYfsYfxZWzHCLVCyWFAei 0.010000 -./komodo-cli -ac_name=MGW sendtoaddress RDYsrWBZkYSWhRDupGRrfGqrVnFtK9hJGC 0.010000 - From 06d1938f2d45f6a3c4b9b94a077bfa244e99ea89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 10:19:07 +0200 Subject: [PATCH 067/432] test --- iguana/dpow/dpow_network.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 97b7c5073..12efa3694 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -668,7 +668,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru paxbestmatches++; } } - } else printf("%d.(%x %llx) ",i,bp->notaries[i].paxwdcrc,(long long)bp->notaries[i].bestmask); + } + if ( bp->notaries[i].paxwdcrc != 0 ) + printf("%d.(%x %d %llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); } printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) From d531aa641aec05b48c06bcc6dcce7d64de8803c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 10:33:02 +0200 Subject: [PATCH 068/432] test --- iguana/dpow/dpow_network.c | 13 ++++++++----- iguana/dpow/dpow_tx.c | 10 +++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 12efa3694..95bdf15cb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -569,8 +569,8 @@ void dpow_bestconsensus(struct dpow_block *bp) bp->recvmask |= (1LL << i); if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 ) continue; - if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) - continue; + //if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) + // continue; for (j=0; jnotaries[i].bestk == bestks[j] && bp->notaries[i].bestmask == masks[j] ) { @@ -621,14 +621,17 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - bp->notaries[senderind].bestmask = bestmask; - bp->notaries[senderind].recvmask = recvmask; + if ( bestmask != 0 ) + bp->notaries[senderind].bestmask = bestmask; + if ( recvmask != 0 ) + bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); } - if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) + if ( bestk >= 0 ) { + bp->notaries[senderind].bestk = bestk; if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) { memcpy(bp->notaries[senderind].src.sigs[bestk],sigs[0],siglens[0]); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 8d555acc5..77a5a627a 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -101,21 +101,21 @@ uint64_t dpow_ratifybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) { - int32_t m,j,k; uint64_t bestmask,mask = bp->require0; + int32_t m,j,k; uint64_t bestmask,mask = 0;//bp->require0; bestmask = 0; *lastkp = -1; for (m=j=0; jnumnotaries; j++) { k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries; - if ( bp->require0 != 0 && k == 0 ) - continue; + //if ( bp->require0 != 0 && k == 0 ) + // continue; if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) { mask |= (1LL << k); - if ( ++m == bp->minsigs-bp->require0 ) + if ( ++m == bp->minsigs )//-bp->require0 ) { *lastkp = k; - bestmask = mask | bp->require0; + bestmask = mask;// | bp->require0; //printf("m.%d == minsigs.%d (%d %llx)\n",m,bp->minsigs,k,(long long)bestmask); } } From a2ce1ab27329ccd133d213540c6d30307c304ba8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 10:36:29 +0200 Subject: [PATCH 069/432] test --- iguana/dpow/dpow_network.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 95bdf15cb..31e8a6d66 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -740,6 +740,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo { extralen = dpow_paxpending(extras,&paxwdcrc); bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; + dpow_bestconsensus(bp); dpow_nanoutxoset(&np->notarize,bp,0); } else @@ -765,7 +766,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); - //printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen); + printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 2be17f6f7a51cd92a6d78b7eedea28758d0f6402 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 10:56:55 +0200 Subject: [PATCH 070/432] test --- iguana/dpow/dpow_network.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 31e8a6d66..99a691c1f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -710,6 +710,8 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d } else { + if ( senderind <= 1 ) + printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask); dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); @@ -766,7 +768,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo memcpy(np->packet,data,datalen); sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From f652f4ef005ddb4e491cafd01b3d015b6a300db3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:00:39 +0200 Subject: [PATCH 071/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 ++++ iguana/dpow/dpow_rpc.c | 20 ++++++++++---------- iguana/iguana_notary.c | 6 +++++- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 8ae3d2b2d..21986aa01 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -134,7 +134,7 @@ struct dpow_info uint32_t SRCREALTIME,destupdated,srcconfirms,numdesttx,numsrctx,lastsplit,cancelratify; int32_t lastheight,maxblocks,SRCHEIGHT,SHORTFLAG,ratifying; struct pax_transaction *PAX; - portable_mutex_t mutex; + portable_mutex_t paxmutex,dpowmutex,dexmutex; uint32_t ipbits[64],numipbits; struct dpow_block **blocks; }; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 99a691c1f..78215fdab 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -766,7 +766,9 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); + portable_mutex_lock(&dp->dpowmutex); sentbytes = nn_send(myinfo->dpowsock,np,size,0); + portable_mutex_unlock(&dp->dpowmutex); free(np); printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); } @@ -818,6 +820,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 ) return; + portable_mutex_lock(&dp->dpowmutex); while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; @@ -868,6 +871,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( size == 0 || n++ > 100 ) break; } + portable_mutex_unlock(&dp->dpowmutex); if ( 0 && n != 0 ) printf("nanoupdates.%d\n",n); n = 0; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 533462913..48bf4be3b 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -617,7 +617,7 @@ cJSON *dpow_paxjson(struct pax_transaction *pax) uint64_t dpow_paxtotal(struct dpow_info *dp) { struct pax_transaction *pax,*tmp; uint64_t total = 0; - pthread_mutex_lock(&dp->mutex); + pthread_mutex_lock(&dp->paxmutex); /*if ( dp->PAX != 0 ) { tmp = 0; @@ -635,25 +635,25 @@ uint64_t dpow_paxtotal(struct dpow_info *dp) if ( pax->marked == 0 ) total += pax->komodoshis; } - pthread_mutex_unlock(&dp->mutex); + pthread_mutex_unlock(&dp->paxmutex); return(total); } struct pax_transaction *dpow_paxfind(struct dpow_info *dp,struct pax_transaction *space,bits256 txid,uint16_t vout) { struct pax_transaction *pax; - pthread_mutex_lock(&dp->mutex); + pthread_mutex_lock(&dp->paxmutex); HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax); if ( pax != 0 ) memcpy(space,pax,sizeof(*pax)); - pthread_mutex_unlock(&dp->mutex); + pthread_mutex_unlock(&dp->paxmutex); return(pax); } struct pax_transaction *dpow_paxmark(struct dpow_info *dp,struct pax_transaction *space,bits256 txid,uint16_t vout,int32_t mark) { struct pax_transaction *pax; - pthread_mutex_lock(&dp->mutex); + pthread_mutex_lock(&dp->paxmutex); HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax); if ( pax == 0 ) { @@ -670,14 +670,14 @@ struct pax_transaction *dpow_paxmark(struct dpow_info *dp,struct pax_transaction printf(" paxmark.ht %d vout%d\n",mark,vout); memcpy(space,pax,sizeof(*pax)); } - pthread_mutex_unlock(&dp->mutex); + pthread_mutex_unlock(&dp->paxmutex); return(pax); } cJSON *dpow_withdraws_pending(struct dpow_info *dp) { struct pax_transaction *pax,*tmp; cJSON *retjson = cJSON_CreateArray(); - pthread_mutex_lock(&dp->mutex); + pthread_mutex_lock(&dp->paxmutex); /*if ( dp->PAX != 0 ) { tmp = 0; @@ -695,14 +695,14 @@ cJSON *dpow_withdraws_pending(struct dpow_info *dp) if ( pax->marked == 0 ) jaddi(retjson,dpow_paxjson(pax)); } - pthread_mutex_unlock(&dp->mutex); + pthread_mutex_unlock(&dp->paxmutex); return(retjson); } void dpow_issuer_withdraw(struct dpow_info *dp,char *coinaddr,uint64_t fiatoshis,int32_t shortflag,char *symbol,uint64_t komodoshis,uint8_t *rmd160,bits256 txid,uint16_t vout,int32_t kmdheight,int32_t height) // assetchain context { struct pax_transaction *pax; - pthread_mutex_lock(&dp->mutex); + pthread_mutex_lock(&dp->paxmutex); HASH_FIND(hh,dp->PAX,&txid,sizeof(txid),pax); if ( pax == 0 ) { @@ -711,7 +711,7 @@ void dpow_issuer_withdraw(struct dpow_info *dp,char *coinaddr,uint64_t fiatoshis pax->vout = vout; HASH_ADD_KEYPTR(hh,dp->PAX,&pax->txid,sizeof(pax->txid),pax); } - pthread_mutex_unlock(&dp->mutex); + pthread_mutex_unlock(&dp->paxmutex); if ( coinaddr != 0 ) { strcpy(pax->coinaddr,coinaddr); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index bbc9abb93..14f480fc2 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -298,7 +298,11 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) dp->blocks = calloc(dp->maxblocks,sizeof(*dp->blocks)); } if ( myinfo->numdpows++ == 0 ) - portable_mutex_init(&dp->mutex); + { + portable_mutex_init(&dp->paxmutex); + portable_mutex_init(&dp->dexmutex); + portable_mutex_init(&dp->dpowmutex); + } PAX_init(); //printf(">>>>>>>>>>>>>>> call paxpending\n"); //uint8_t buf[32768]; From d89dbe15df5024bc28dffdb81563a5db3e148491 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:08:56 +0200 Subject: [PATCH 072/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- iguana/iguana_notary.c | 9 +++------ 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 21986aa01..0bcb9c7f7 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -134,7 +134,7 @@ struct dpow_info uint32_t SRCREALTIME,destupdated,srcconfirms,numdesttx,numsrctx,lastsplit,cancelratify; int32_t lastheight,maxblocks,SRCHEIGHT,SHORTFLAG,ratifying; struct pax_transaction *PAX; - portable_mutex_t paxmutex,dpowmutex,dexmutex; + portable_mutex_t paxmutex,dexmutex; uint32_t ipbits[64],numipbits; struct dpow_block **blocks; }; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 78215fdab..552ad0618 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -820,7 +820,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 ) return; - portable_mutex_lock(&dp->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; @@ -871,7 +871,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( size == 0 || n++ > 100 ) break; } - portable_mutex_unlock(&dp->dpowmutex); + portable_mutex_unlock(&myinfo->dpowmutex); if ( 0 && n != 0 ) printf("nanoupdates.%d\n",n); n = 0; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 14f480fc2..16fb5a21b 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -297,12 +297,9 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) dp->maxblocks = 100000; dp->blocks = calloc(dp->maxblocks,sizeof(*dp->blocks)); } - if ( myinfo->numdpows++ == 0 ) - { - portable_mutex_init(&dp->paxmutex); - portable_mutex_init(&dp->dexmutex); - portable_mutex_init(&dp->dpowmutex); - } + myinfo->numdpows++; + portable_mutex_init(&dp->paxmutex); + portable_mutex_init(&dp->dexmutex); PAX_init(); //printf(">>>>>>>>>>>>>>> call paxpending\n"); //uint8_t buf[32768]; From 9c9b33e8f154bb04427d6c90a6f5cfbd5363aa4f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:11:39 +0200 Subject: [PATCH 073/432] 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 552ad0618..d4578f269 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -766,9 +766,9 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); - portable_mutex_lock(&dp->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); sentbytes = nn_send(myinfo->dpowsock,np,size,0); - portable_mutex_unlock(&dp->dpowmutex); + portable_mutex_unlock(&myinfo->dpowmutex); free(np); printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); } From 7b861149699f3e986f8caf1f25155f568bab18dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:15:52 +0200 Subject: [PATCH 074/432] test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/iguana777.h | 2 +- iguana/main.c | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d4578f269..101f28dff 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -210,7 +210,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i char str[512]; uint32_t ipbits,*ptr; int32_t i,iter,n,retval = -1; if ( myinfo->dpowsock >= 0 ) { - portable_mutex_lock(&myinfo->dpowmutex); + portable_mutex_lock(&myinfo->notarymutex); ipbits = (uint32_t)calc_ipbits(ipaddr); for (iter=0; iter<2; iter++) { @@ -247,7 +247,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i if ( dp == 0 ) break; } - portable_mutex_unlock(&myinfo->dpowmutex); + portable_mutex_unlock(&myinfo->notarymutex); } return(retval); } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 6c2640990..f9e4c9ee5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -110,7 +110,7 @@ struct supernet_info void *PAXDATA; struct liquidity_info linfos[64]; struct komodo_notaries NOTARY; - char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t dpowmutex; + char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; char dexseed_ipaddr[64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; // compatibility bits256 pangea_category,instantdex_category; diff --git a/iguana/main.c b/iguana/main.c index 04785e933..1c998a61c 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1611,6 +1611,7 @@ void iguana_main(void *arg) strcpy(myinfo->rpcsymbol,"BTCD"); iguana_urlinit(myinfo,ismainnet,usessl); portable_mutex_init(&myinfo->dpowmutex); + portable_mutex_init(&myinfo->notarymutex); if ( myinfo->IAMNOTARY == 0 ) { #if LIQUIDITY_PROVIDER From 142763d946676cf4fe9e89fece309687743de882 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:21:30 +0200 Subject: [PATCH 075/432] test --- iguana/dpow/dpow_network.c | 20 ++++++++++++-------- iguana/iguana_notary.c | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 101f28dff..8953c5f57 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -364,9 +364,9 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; np->destvout = bp->notaries[bp->myind].dest.prev_vout; - np->bestmask = bp->bestmask; - np->recvmask = bp->recvmask; - if ( (np->bestk= bp->bestk) >= 0 ) + np->bestmask = bp->notaries[bp->myind].bestmask; + np->recvmask = bp->notaries[bp->myind].recvmask; + if ( (np->bestk= bp->notaries[bp->myind].bestk) >= 0 ) { if ( (np->siglens[0]= bp->notaries[bp->myind].src.siglens[bp->bestk]) > 0 ) memcpy(np->sigs[0],bp->notaries[bp->myind].src.sigs[bp->bestk],np->siglens[0]); @@ -650,10 +650,14 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru dpow_bestconsensus(bp); //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; - bp->notaries[bp->myind].bestk = bp->bestk; - bp->notaries[bp->myind].bestmask = bp->bestmask; - bp->notaries[bp->myind].recvmask = bp->recvmask; + if ( bp->paxwdcrc != 0 ) + bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; + if ( bp->bestk >= 0 ) + bp->notaries[bp->myind].bestk = bp->bestk; + if ( bp->bestmask != 0 ) + bp->notaries[bp->myind].bestmask = bp->bestmask; + if ( bp->recvmask != 0 ) + bp->notaries[bp->myind].recvmask = bp->recvmask; if ( bp->bestk >= 0 ) { for (i=0; inumnotaries; i++) @@ -770,7 +774,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask,bp->notaries[bp->myindo].bestk,(long long)bp->notaries[bp->myind].bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 16fb5a21b..d7734d11e 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -297,13 +297,13 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) dp->maxblocks = 100000; dp->blocks = calloc(dp->maxblocks,sizeof(*dp->blocks)); } - myinfo->numdpows++; portable_mutex_init(&dp->paxmutex); portable_mutex_init(&dp->dexmutex); PAX_init(); //printf(">>>>>>>>>>>>>>> call paxpending\n"); //uint8_t buf[32768]; //dpow_paxpending(buf); + myinfo->numdpows++; return(clonestr("{\"result\":\"success\"}")); } From 4382f7ae02a95c31ffda2b005b8b65df1d449281 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:24:02 +0200 Subject: [PATCH 076/432] test --- iguana/dpow/dpow_network.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8953c5f57..e23aeeeb5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -556,17 +556,15 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct void dpow_bestconsensus(struct dpow_block *bp) { - int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; + int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask,recvmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; memset(masks,0,sizeof(masks)); memset(bestks,0xff,sizeof(bestks)); memset(counts,0,sizeof(counts)); - bp->recvmask = 0; - bp->bestmask = 0; - bp->bestk = -1; + recvmask = 0; for (numdiff=i=0; inumnotaries; i++) { if ( bits256_nonz(bp->notaries[i].src.prev_hash) != 0 && bits256_nonz(bp->notaries[i].dest.prev_hash) != 0 ) - bp->recvmask |= (1LL << i); + recvmask |= (1LL << i); if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 ) continue; //if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) @@ -596,8 +594,12 @@ void dpow_bestconsensus(struct dpow_block *bp) besti = i; } } - if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->recvmask & masks[besti]) == masks[besti] ) - bp->bestmask = masks[besti], bp->bestk = bestks[besti]; + if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (recvmask & masks[besti]) == masks[besti] ) + { + bp->bestmask = masks[besti]; + bp->bestk = bestks[besti]; + bp->recvmask = recvmask; + } if ( bp->bestmask == 0 || (time(NULL) / 180) != bp->lastepoch ) { bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); From b4d36abd93911ca1a18096a5249374b9d3f5e604 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:25:46 +0200 Subject: [PATCH 077/432] 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 e23aeeeb5..660430f98 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -776,7 +776,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask,bp->notaries[bp->myindo].bestk,(long long)bp->notaries[bp->myind].bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 67b905af9adc646cefe0d6709c050f6d6bd68b6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 11:54:40 +0200 Subject: [PATCH 078/432] test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/dpow/dpow_tx.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 660430f98..631da41c3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -600,10 +600,10 @@ void dpow_bestconsensus(struct dpow_block *bp) bp->bestk = bestks[besti]; bp->recvmask = recvmask; } - if ( bp->bestmask == 0 || (time(NULL) / 180) != bp->lastepoch ) + if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) { bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); - if ( (time(NULL) / 180) != bp->lastepoch ) + if ( 0 && (time(NULL) / 180) != bp->lastepoch ) { bp->lastepoch = (uint32_t)(time(NULL) / 180); printf("epoch %u\n",bp->lastepoch % bp->numnotaries); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 77a5a627a..8e71a65ff 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -106,7 +106,8 @@ uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) *lastkp = -1; for (m=j=0; jnumnotaries; j++) { - k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries; + //k = (j + ((uint32_t)time(NULL) / 180)) % bp->numnotaries; + k = (j + (bp->height/DPOW_CHECKPOINTFREQ)) % bp->numnotaries; //if ( bp->require0 != 0 && k == 0 ) // continue; if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) From 0eab27fa474bd3d2522e98af732fdbe1ad215c30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 12:41:07 +0200 Subject: [PATCH 079/432] userpass --- iguana/coins/Agenbtcd | 2 ++ iguana/iguana_rpc.c | 33 +++++++++++++++++++++++---------- iguana/main.c | 14 ++++++++++---- iguana/tests/Alistunspent | 2 ++ 4 files changed, 37 insertions(+), 14 deletions(-) create mode 100755 iguana/coins/Agenbtcd create mode 100755 iguana/tests/Alistunspent diff --git a/iguana/coins/Agenbtcd b/iguana/coins/Agenbtcd new file mode 100755 index 000000000..f01315499 --- /dev/null +++ b/iguana/coins/Agenbtcd @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"userpass\":\"username@password\",\"prefetchlag\":11,\"poll\":50,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTCD\",\"startpend\":512,\"endpend\":512,\"services\":129,\"maxpeers\":512,\"RELAY\":1,\"VALIDATE\":1,\"portp2p\":14631,\"rpc\":14632,\"minconfirms\":5}" diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index bb7161f29..5d097392e 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -18,20 +18,22 @@ #include "iguana777.h" //#include "SuperNET.h" -#define RPCARGS struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,cJSON *params[],int32_t n,cJSON *json,char *remoteaddr,cJSON *array -#define GLUEARGS cJSON *json,struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,char *remoteaddr,cJSON *params[] +#define RPCARGS struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,cJSON *params[],int32_t n,cJSON *json,char *remoteaddr,cJSON *array,char *userpass +#define GLUEARGS cJSON *json,struct supernet_info *myinfo,uint16_t port,struct iguana_info *coin,char *remoteaddr,cJSON *params[],char *userpass -#define CALLGLUE myinfo,port,coin,remoteaddr,params +#define CALLGLUE myinfo,port,coin,remoteaddr,params,userpass char *sglue(GLUEARGS,char *agent,char *method) { char *retstr,*rpcretstr,*walletstr,checkstr[65],dcheckstr[65]; cJSON *retjson,*tmpjson,*result,*error,*wallet; int32_t i,j,len; int64_t val; double dval; if ( json == 0 ) json = cJSON_CreateObject(); - //printf("sglue.(%s)\n",jprint(json,0)); +//printf("userpass.(%s)\n",userpass); jaddstr(json,"agent",agent); jaddstr(json,"method",method); jaddstr(json,"coin",coin->symbol); + if ( userpass != 0 ) + jaddstr(json,"userpass",userpass); if ( myinfo->expiration != 0 && time(NULL) > myinfo->expiration ) iguana_walletlock(myinfo,0); if ( (retstr= SuperNET_JSON(myinfo,coin,json,remoteaddr,port)) != 0 ) @@ -667,7 +669,7 @@ char *iguana_bitcoinrpc(struct supernet_info *myinfo,uint16_t port,struct iguana for (i=0; irpcsymbol[0] == 0 ) strcpy(myinfo->rpcsymbol,symbol); @@ -842,8 +845,8 @@ cJSON *SuperNET_urlconv(char *value,int32_t bufsize,char *urlstr) char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsize,int32_t *jsonflagp,int32_t *postflagp,char *urlstr,char *remoteaddr,char *filetype,uint16_t port) { - cJSON *tokens,*argjson,*origargjson,*json = 0; long filesize; struct iguana_info *coin = 0; - char symbol[64],buf[4096],*originstr,*fieldstr,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,iter,num=0; + cJSON *tokens,*argjson,*origargjson,*tmpjson=0,*json = 0; long filesize; struct iguana_info *coin = 0; + char symbol[64],buf[4096],*originstr,*fieldstr,*userpass=0,urlmethod[16],*data,url[8192],furl[8192],*retstr,*filestr,*token = 0; int32_t i,j,n,iter,num=0; //printf("rpcparse.(%s)\n",urlstr); if ( myinfo->remoteorigin == 0 ) { @@ -965,13 +968,14 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz jaddstr(argjson,"agent",jstri(tokens,0)); if ( num > 1 ) jaddstr(argjson,"method",jstri(tokens,1)); - //printf("urlstr.(%s)\n",urlstr+n); if ( (json= SuperNET_urlconv(retbuf,bufsize,urlstr+n)) != 0 ) { jadd(json,"tokens",tokens); jaddstr(json,"urlmethod",urlmethod); if ( (data= jstr(json,"POST")) == 0 || (argjson= cJSON_Parse(data)) == 0 ) { + userpass = jstr(argjson,"userpass"); + printf("userpass.(%s)\n",userpass); if ( (n= cJSON_GetArraySize(tokens)) > 0 ) { if ( n > 1 ) @@ -1064,6 +1068,8 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz for (i=0; ichain->userpass[0] != 0 ) + { + if ( (userpass= jstr(json,"userpass")) == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) + { + printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass); + return(clonestr("{\"error\":\"authentication error\"}")); + } + } if ( (retstr= SuperNET_processJSON(myinfo,coin,json,remoteaddr,port)) == 0 ) printf("null retstr from SuperNET_JSON\n"); - if ( jsonstr != 0 ) - free(jsonstr); if ( autologin != 0 ) SuperNET_logout(myinfo,0,json,remoteaddr); return(retstr); diff --git a/iguana/tests/Alistunspent b/iguana/tests/Alistunspent new file mode 100755 index 000000000..07f23d560 --- /dev/null +++ b/iguana/tests/Alistunspent @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"userpass\":\"username@password\",\"coin\":\"BTCD\",\"method\":\"listunspent\",\"params\":[1, 9999999, []]}" From d50b93b593965f237396f7f37574a510368e37bb Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 12:50:26 +0200 Subject: [PATCH 080/432] test --- iguana/dpow/dpow_network.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 631da41c3..3dd5e61ed 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -623,17 +623,14 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - if ( bestmask != 0 ) - bp->notaries[senderind].bestmask = bestmask; - if ( recvmask != 0 ) - bp->notaries[senderind].recvmask = recvmask; + bp->notaries[senderind].bestmask = bestmask; + bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); } - if ( bestk >= 0 ) + if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) { - bp->notaries[senderind].bestk = bestk; if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) { memcpy(bp->notaries[senderind].src.sigs[bestk],sigs[0],siglens[0]); From c09bacf200c4b745da9d8a9eb11d37a1756aa87b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 12:55:59 +0200 Subject: [PATCH 081/432] test --- iguana/iguana_rpc.c | 10 ++++++++-- iguana/main.c | 10 +--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 5d097392e..a7ce5e14d 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -32,8 +32,14 @@ char *sglue(GLUEARGS,char *agent,char *method) jaddstr(json,"agent",agent); jaddstr(json,"method",method); jaddstr(json,"coin",coin->symbol); - if ( userpass != 0 ) - jaddstr(json,"userpass",userpass); + if ( coin != 0 && coin->chain->userpass[0] != 0 ) + { + if ( userpass == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) + { + printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass); + return(clonestr("{\"error\":\"authentication error\"}")); + } + } if ( myinfo->expiration != 0 && time(NULL) > myinfo->expiration ) iguana_walletlock(myinfo,0); if ( (retstr= SuperNET_JSON(myinfo,coin,json,remoteaddr,port)) != 0 ) diff --git a/iguana/main.c b/iguana/main.c index 10c1a4204..d9e0cb0ff 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -326,7 +326,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,struct iguana_info *coin char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *json,char *remoteaddr,uint16_t port) { - int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0,*userpass; uint64_t tag; + int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0; uint64_t tag; //printf("SuperNET_JSON.(%s)\n",jprint(json,0)); if ( remoteaddr != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 ) remoteaddr = 0; @@ -351,14 +351,6 @@ char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON OS_randombytes((uint8_t *)&tag,sizeof(tag)); jadd64bits(json,"tag",tag); } - if ( coin != 0 && coin->chain->userpass[0] != 0 ) - { - if ( (userpass= jstr(json,"userpass")) == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) - { - printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass); - return(clonestr("{\"error\":\"authentication error\"}")); - } - } if ( (retstr= SuperNET_processJSON(myinfo,coin,json,remoteaddr,port)) == 0 ) printf("null retstr from SuperNET_JSON\n"); if ( autologin != 0 ) From a15d8f107223b3a5098b86ec8ec83c686f941226 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 12:57:53 +0200 Subject: [PATCH 082/432] test --- iguana/iguana_rpc.c | 2 ++ iguana/main.c | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index a7ce5e14d..ca47d66ae 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -32,6 +32,8 @@ char *sglue(GLUEARGS,char *agent,char *method) jaddstr(json,"agent",agent); jaddstr(json,"method",method); jaddstr(json,"coin",coin->symbol); + if ( userpass != 0 ) + jaddstr(json,"userpass",userpass); if ( coin != 0 && coin->chain->userpass[0] != 0 ) { if ( userpass == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) diff --git a/iguana/main.c b/iguana/main.c index d9e0cb0ff..cd68ec531 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -326,7 +326,7 @@ char *SuperNET_processJSON(struct supernet_info *myinfo,struct iguana_info *coin char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *json,char *remoteaddr,uint16_t port) { - int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0; uint64_t tag; + int32_t autologin = 0; uint32_t timestamp; char *retstr=0,*agent=0,*method=0,*userpass; uint64_t tag; //printf("SuperNET_JSON.(%s)\n",jprint(json,0)); if ( remoteaddr != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 ) remoteaddr = 0; @@ -351,6 +351,14 @@ char *SuperNET_JSON(struct supernet_info *myinfo,struct iguana_info *coin,cJSON OS_randombytes((uint8_t *)&tag,sizeof(tag)); jadd64bits(json,"tag",tag); } + if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 ) + { + if ( (userpass= jstr(json,"userpass")) == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) + { + printf("iguana authentication error {%s} (%s) != (%s)\n",jprint(json,0),userpass,coin->chain->userpass); + return(clonestr("{\"error\":\"authentication error\"}")); + } + } if ( (retstr= SuperNET_processJSON(myinfo,coin,json,remoteaddr,port)) == 0 ) printf("null retstr from SuperNET_JSON\n"); if ( autologin != 0 ) From 86ca8e2e8f7a77318c64d1d0e4ab0b7e5ae72606 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 13:00:38 +0200 Subject: [PATCH 083/432] test --- iguana/iguana_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index ca47d66ae..b3d7cb8f1 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -34,7 +34,7 @@ char *sglue(GLUEARGS,char *agent,char *method) jaddstr(json,"coin",coin->symbol); if ( userpass != 0 ) jaddstr(json,"userpass",userpass); - if ( coin != 0 && coin->chain->userpass[0] != 0 ) + if ( coin != 0 && coin->FULLNODE >= 0 && coin->chain->userpass[0] != 0 ) { if ( userpass == 0 || strcmp(userpass,coin->chain->userpass) != 0 ) { From bc0a1f4f54235600aa268d0fef4dace43432a00d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 21:34:12 +0200 Subject: [PATCH 084/432] test --- iguana/dpow/dpow_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3dd5e61ed..5411abbdb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -623,13 +623,15 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - bp->notaries[senderind].bestmask = bestmask; - bp->notaries[senderind].recvmask = recvmask; + if ( bestmask != 0 ) + bp->notaries[senderind].bestmask = bestmask; + if ( recvmask != 0 ) + bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); } - if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) + if ( bestk >= 0 && (bp->notaries[senderind].bestk= bestk) >= 0 ) { if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) { From 9afeca3974ce2ee762c481f58f1793391c7a2896 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 21:55:36 +0200 Subject: [PATCH 085/432] 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 5411abbdb..398e66e15 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -775,7 +775,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,bp->bestk,(long long)bp->bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->bestk,(long long)np->bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 93b19fc9118c76bd936e90c70e2673f95ea62b36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 22:00:14 +0200 Subject: [PATCH 086/432] 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 398e66e15..8292de2c8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -775,7 +775,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->bestk,(long long)np->bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 5516be4dabe807bb5577a5ed08019ee320058164 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 18 Dec 2016 22:00:38 +0200 Subject: [PATCH 087/432] test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 0bcb9c7f7..92dd5fc28 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 11 //#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 0x0775 +#define DPOW_VERSION 0x0776 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 From d70ba724378bdfc0a2d9d77717785edfb1d61fd3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 10:49:48 +0200 Subject: [PATCH 088/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8292de2c8..c7607b0df 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -364,9 +364,9 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; np->destvout = bp->notaries[bp->myind].dest.prev_vout; - np->bestmask = bp->notaries[bp->myind].bestmask; + np->bestmask = bp->pendingbestmask;//notaries[bp->myind].bestmask; np->recvmask = bp->notaries[bp->myind].recvmask; - if ( (np->bestk= bp->notaries[bp->myind].bestk) >= 0 ) + if ( (np->bestk= bp->pendingbestk) >= 0 )//notaries[bp->myind].bestk) >= 0 ) { if ( (np->siglens[0]= bp->notaries[bp->myind].src.siglens[bp->bestk]) > 0 ) memcpy(np->sigs[0],bp->notaries[bp->myind].src.sigs[bp->bestk],np->siglens[0]); @@ -685,7 +685,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { if ( bp->pendingbestk != bp->bestk || bp->pendingbestmask != bp->bestmask ) { - //printf("new PENDING BESTK (%d %llx) state.%d\n",bp->bestk,(long long)bp->bestmask,bp->state); + printf("new PENDING BESTK (%d %llx) state.%d\n",bp->bestk,(long long)bp->bestmask,bp->state); bp->pendingbestk = bp->bestk; bp->pendingbestmask = bp->bestmask; dpow_signedtxgen(myinfo,dp,bp->destcoin,bp,bp->bestk,bp->bestmask,bp->myind,DPOW_SIGBTCCHANNEL,1,0); @@ -715,7 +715,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d } else { - if ( senderind <= 1 ) + //if ( senderind <= 1 ) printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask); dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); } From 11a74af2317b52639ba0ad8dd659c87de9e68418 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 10:54:07 +0200 Subject: [PATCH 089/432] 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 c7607b0df..c3e7d4f3e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -747,7 +747,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo { extralen = dpow_paxpending(extras,&paxwdcrc); bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); dpow_nanoutxoset(&np->notarize,bp,0); } else From 203f04e7aea89d5e1ab4accc360ec25bc41275be Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 11:10:17 +0200 Subject: [PATCH 090/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c3e7d4f3e..7216b926d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -716,7 +716,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { //if ( senderind <= 1 ) - printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask); + // printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask); dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); @@ -727,8 +727,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32,paxwdcrc; uint8_t extras[10000]; if ( bp->myind < 0 ) return; - if ( time(NULL) < myinfo->nanoinit+5 ) - return; + //if ( time(NULL) < myinfo->nanoinit+5 ) + // return; crc32 = calc_crc32(0,data,datalen); //dp->crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); @@ -873,7 +873,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - if ( size == 0 || n++ > 100 ) + if ( size == 0 || n++ > 10000 ) break; } portable_mutex_unlock(&myinfo->dpowmutex); @@ -891,7 +891,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; - if ( size == 0 || n++ > 100 ) + if ( size == 0 || n++ > 1000 ) break; } n = 0; From 1f6de80ea8d4d606df0f21c163fea5c205385c27 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 11:19:11 +0200 Subject: [PATCH 091/432] test --- basilisk/basilisk.c | 2 +- iguana/dpow/dpow_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index f5d1818b1..3440001d6 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -892,7 +892,7 @@ void basilisks_loop(void *arg) iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 200; + endmilli = startmilli + 10; } } else if ( myinfo->IAMLP != 0 ) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7216b926d..495a63826 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -873,7 +873,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - if ( size == 0 || n++ > 10000 ) + //if ( size == 0 || n++ > 10000 ) break; } portable_mutex_unlock(&myinfo->dpowmutex); From 3971f243dc0ef35b8db6d5940c02336c0bb4eaed Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 11:46:08 +0200 Subject: [PATCH 092/432] test --- iguana/dpow/dpow_network.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 495a63826..844f879fe 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -364,9 +364,15 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; np->destvout = bp->notaries[bp->myind].dest.prev_vout; - np->bestmask = bp->pendingbestmask;//notaries[bp->myind].bestmask; - np->recvmask = bp->notaries[bp->myind].recvmask; - if ( (np->bestk= bp->pendingbestk) >= 0 )//notaries[bp->myind].bestk) >= 0 ) + if ( (np->recvmask= bp->recvmask) == 0 ) + np->recvmask = bp->notaries[bp->myind].recvmask; + if ( (np->bestmask= bp->pendingbestmask) == 0 ) + { + if ( (np->bestmask= bp->notaries[bp->myind].bestmask) == 0 ) + np->bestmask = bp->bestmask, np->bestk = bp->bestk; + else np->bestk = bp->notaries[bp->myind].bestk; + } else np->bestk = bp->pendingbestk; + if ( np->bestk >= 0 ) { if ( (np->siglens[0]= bp->notaries[bp->myind].src.siglens[bp->bestk]) > 0 ) memcpy(np->sigs[0],bp->notaries[bp->myind].src.sigs[bp->bestk],np->siglens[0]); @@ -873,16 +879,13 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - //if ( size == 0 || n++ > 10000 ) + //if ( size == 0 || nun > 10000 ) break; } portable_mutex_unlock(&myinfo->dpowmutex); - if ( 0 && n != 0 ) - printf("nanoupdates.%d\n",n); n = 0; while ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { - num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("FROM BUS.%08x -> pub\n",dexp->crc32); @@ -894,12 +897,10 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( size == 0 || n++ > 1000 ) break; } - n = 0; - if ( num == 0 ) + if ( n == 0 ) { while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { - num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); From fda37056a6b13be2c64c4b06f200407cad1cf57d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:07:16 +0200 Subject: [PATCH 093/432] 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 844f879fe..4021cfddb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -187,7 +187,7 @@ struct dpow_nanoutxo uint64_t bestmask,recvmask; uint32_t pendingcrcs[2],paxwdcrc; uint16_t srcvout,destvout; - uint8_t sigs[2][DPOW_MAXSIGLEN],siglens[2],bestk,pad; + uint8_t sigs[2][DPOW_MAXSIGLEN],siglens[2],pad; int8_t bestk; } PACKED; struct dpow_nanomsghdr From ba6ae0c9df0fe46761d9a197471317c7402ad678 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:08:06 +0200 Subject: [PATCH 094/432] 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 4021cfddb..6983ab333 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -781,7 +781,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx)\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 96ed4171ee429fd1068fe82fc19526aa2def67db Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:33:57 +0200 Subject: [PATCH 095/432] 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 6983ab333..e01edce52 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -722,7 +722,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { //if ( senderind <= 1 ) - // printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,bp->bestk,(long long)np->bestmask); + printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask); dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); From 371d9c64951089a23396a96b147acb3fa1dec922 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:37:42 +0200 Subject: [PATCH 096/432] test --- iguana/dpow/dpow_network.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e01edce52..996190e72 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -721,9 +721,8 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d } else { - //if ( senderind <= 1 ) - printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask); dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); + printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } @@ -868,7 +867,6 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind); else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind); dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); - dex_reqsend(myinfo,np->packet,np->datalen); } } //dp->crcs[firstz] = crc32; From 28859465d3d8959fb8d40c02578d46e7a182f687 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:38:47 +0200 Subject: [PATCH 097/432] 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 996190e72..09ed72825 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -722,7 +722,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("RECV.%d %llx (%d %llx)\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask); + printf("RECV.%d %llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } From 971f40e4801e13613ad6a135eae787e61cbe36b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:52:23 +0200 Subject: [PATCH 098/432] test --- iguana/dpow/dpow_network.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 09ed72825..1cc068553 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -767,7 +767,6 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->ratify.pendingcrcs[i] = bp->pendingcrcs[i]; for (i=0; i<32; i++) np->srchash.bytes[i] = dp->minerkey33[i+1]; - //np->srchash = srchash; np->desthash = desthash; np->channel = channel; np->height = msgbits; @@ -861,18 +860,21 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { - if ( np->senderind >= 0 && np->senderind < bp->numnotaries && memcmp(bp-> notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { - if ( bp->isratify == 0 ) - dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind); - else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind); - dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); + if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) + { + if ( bp->isratify == 0 ) + dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind); + else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind); + dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); + } else printf("wrong senderind.%d\n",np->senderind); } } //dp->crcs[firstz] = crc32; } - } - } //else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); + } else printf("crc error %x vs %x or no dp.%p\n",crc32,np->crc32,dp); + } else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); } } if ( np != 0 ) From d184cc81638c28c1f41c63baf8cb4744816da5d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:53:31 +0200 Subject: [PATCH 099/432] 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 1cc068553..3ff4febaa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -879,7 +879,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - //if ( size == 0 || nun > 10000 ) + if ( size == 0 || num > 100 ) break; } portable_mutex_unlock(&myinfo->dpowmutex); From fba7fe2498cb139c7a245f6e9a8694e4b7abbbc8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:56:01 +0200 Subject: [PATCH 100/432] 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 3ff4febaa..de81334cf 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -879,7 +879,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - if ( size == 0 || num > 100 ) + //if ( size == 0 || num > 100 ) break; } portable_mutex_unlock(&myinfo->dpowmutex); From 34b90aeeb18b57480fa809903b5d6ce896ecd0c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 12:56:59 +0200 Subject: [PATCH 101/432] test --- iguana/dpow/dpow_network.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index de81334cf..acf9f285d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -830,7 +830,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( time(NULL) < myinfo->nanoinit+5 ) return; portable_mutex_lock(&myinfo->dpowmutex); - while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) + if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; if ( size >= 0 ) @@ -879,12 +879,10 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( np != 0 ) nn_freemsg(np), np = 0; - //if ( size == 0 || num > 100 ) - break; } portable_mutex_unlock(&myinfo->dpowmutex); n = 0; - while ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) + if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { @@ -894,29 +892,22 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; - if ( size == 0 || n++ > 1000 ) - break; } - if ( n == 0 ) + if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { - while ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + nn_send(myinfo->dexsock,dexp,size,0); + if ( (m= myinfo->numdpowipbits) > 0 ) { - nn_send(myinfo->dexsock,dexp,size,0); - if ( (m= myinfo->numdpowipbits) > 0 ) - { - r = myinfo->dpowipbits[rand() % m]; - nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x -> dexbus, rep.%08x",dexp->crc32,r); - } - dex_packet(myinfo,dexp,size); + r = myinfo->dpowipbits[rand() % m]; + nn_send(myinfo->repsock,&r,sizeof(r),0); + printf("REP.%08x -> dexbus, rep.%08x",dexp->crc32,r); } - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; - if ( size == 0 || n++ > 100 ) - break; + dex_packet(myinfo,dexp,size); } + if ( dexp != 0 ) + nn_freemsg(dexp), dexp = 0; } } #else From 196aeeb669a371981ba1b920a33976364d6f93e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 13:03:43 +0200 Subject: [PATCH 102/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index acf9f285d..546622a3c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -187,7 +187,7 @@ struct dpow_nanoutxo uint64_t bestmask,recvmask; uint32_t pendingcrcs[2],paxwdcrc; uint16_t srcvout,destvout; - uint8_t sigs[2][DPOW_MAXSIGLEN],siglens[2],pad; int8_t bestk; + uint8_t sigs[2][DPOW_MAXSIGLEN],siglens[2],pad,bestk; } PACKED; struct dpow_nanomsghdr @@ -372,7 +372,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr np->bestmask = bp->bestmask, np->bestk = bp->bestk; else np->bestk = bp->notaries[bp->myind].bestk; } else np->bestk = bp->pendingbestk; - if ( np->bestk >= 0 ) + if ( (int8_t)np->bestk >= 0 ) { if ( (np->siglens[0]= bp->notaries[bp->myind].src.siglens[bp->bestk]) > 0 ) memcpy(np->sigs[0],bp->notaries[bp->myind].src.sigs[bp->bestk],np->siglens[0]); @@ -717,12 +717,12 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d { if ( isratify != 0 ) { - dpow_ratify_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->pendingcrcs); + dpow_ratify_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->pendingcrcs); } else { - dpow_notarize_update(myinfo,dp,bp,senderind,np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("RECV.%d %llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); + dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); + printf("RECV.%d %llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } From 3904477077f377f47e559aa0fe5252b8beb92bdb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 13:08:52 +0200 Subject: [PATCH 103/432] test --- iguana/dpow/dpow_fsm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 1a3c7b07a..fac6fae56 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -439,6 +439,7 @@ void dpow_statemachinestart(void *ptr) if ( bp->state != 0xffffffff ) { dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); + dpow_nanomsg_update(myinfo); } if ( 0 && dp->cancelratify != 0 && bp->isratify != 0 ) { From ca675e32060e6cc8133b9e6626d86b59d52f0466 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 13:17:57 +0200 Subject: [PATCH 104/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 546622a3c..a683421df 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -873,13 +873,13 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } //dp->crcs[firstz] = crc32; } - } else printf("crc error %x vs %x or no dp.%p\n",crc32,np->crc32,dp); + } else printf("crc error %x vs %x or no dp.%p [%s]\n",crc32,np->crc32,dp,np->symbol); } else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); - } - } + } else printf("wrong version\n"); + } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; - } + } else printf("no packets\n"); portable_mutex_unlock(&myinfo->dpowmutex); n = 0; if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) From 0637b8c48472c8c6c95eff05e1a43767c481b1f8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 13:20:25 +0200 Subject: [PATCH 105/432] 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 a683421df..0d5e11952 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -875,7 +875,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } } else printf("crc error %x vs %x or no dp.%p [%s]\n",crc32,np->crc32,dp,np->symbol); } else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); - } else printf("wrong version\n"); + } else printf("wrong version %02x %02x\n",np->version0,np->version1); } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; From c24a1d7c7044dce59c9de0330cbc1fa949d00180 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 15:00:54 +0200 Subject: [PATCH 106/432] 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 0d5e11952..911916b6f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -873,9 +873,9 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } //dp->crcs[firstz] = crc32; } - } else printf("crc error %x vs %x or no dp.%p [%s]\n",crc32,np->crc32,dp,np->symbol); - } else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); - } else printf("wrong version %02x %02x\n",np->version0,np->version1); + } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } else printf("ignore.%d np->datalen.%d %d (size %d - %ld)\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); + } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; From e05b1c6474c81be54dd659a682c61362c85d08a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 19 Dec 2016 15:16:05 +0200 Subject: [PATCH 107/432] test --- iguana/dpow/dpow_network.c | 17 ++++++++++------- iguana/iguana_notary.c | 6 ++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 911916b6f..e036382db 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -242,7 +242,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i else dp->numipbits = n; //for (i=0; inumdpowipbits,dp!=0?dp->numipbits:-1,iter); + printf("addnotary.[%d] (%s) retval.%d (total %d %d) iter.%d\n",n,ipaddr,retval,myinfo->numdpowipbits,dp!=0?dp->numipbits:-1,iter); } if ( dp == 0 ) break; @@ -604,8 +604,8 @@ void dpow_bestconsensus(struct dpow_block *bp) { bp->bestmask = masks[besti]; bp->bestk = bestks[besti]; - bp->recvmask = recvmask; } + bp->recvmask = recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) { bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); @@ -779,7 +779,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); + printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) @@ -824,11 +824,11 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * //printf("recv numips.(%d %d)\n",myinfo->numdpowipbits,dp->numipbits); } -void dpow_nanomsg_update(struct supernet_info *myinfo) +int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 ) - return; + return(-1); portable_mutex_lock(&myinfo->dpowmutex); if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { @@ -874,7 +874,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) //dp->crcs[firstz] = crc32; } } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); - } else printf("ignore.%d np->datalen.%d %d (size %d - %ld)\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np)); + } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); if ( np != 0 ) @@ -884,6 +884,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) n = 0; if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { + num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("FROM BUS.%08x -> pub\n",dexp->crc32); @@ -895,6 +896,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) } if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { + num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); @@ -909,6 +911,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } + return(num); } #else @@ -919,7 +922,7 @@ uint32_t dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow return(0); } -void dpow_nanomsg_update(struct supernet_info *myinfo) { } +int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { return(0); } #endif diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d7734d11e..4afc005d7 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -142,8 +142,10 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { - int32_t height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - dpow_nanomsg_update(myinfo); + int32_t i,height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; + for (i=0; i<100; i++) + if ( dpow_nanomsg_update(myinfo) <= 0 ) + break; src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); From 9c5bb011b7e30d2b237aba1f1bd510f344e7cd85 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 13:26:59 +0200 Subject: [PATCH 108/432] test --- iguana/dpow/dpow_network.c | 3 ++- iguana/dpow/dpow_tx.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e036382db..36cd50ddf 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -604,6 +604,7 @@ void dpow_bestconsensus(struct dpow_block *bp) { bp->bestmask = masks[besti]; bp->bestk = bestks[besti]; + printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); } bp->recvmask = recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) @@ -657,7 +658,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru dpow_bestconsensus(bp); //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - if ( bp->paxwdcrc != 0 ) + //if ( bp->paxwdcrc != 0 ) bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 8e71a65ff..ccc1f736d 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -110,7 +110,7 @@ uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) k = (j + (bp->height/DPOW_CHECKPOINTFREQ)) % bp->numnotaries; //if ( bp->require0 != 0 && k == 0 ) // continue; - if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) + if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 && bp->paxwdcrc == bp->notaries[k].paxwdcrc ) { mask |= (1LL << k); if ( ++m == bp->minsigs )//-bp->require0 ) From 2ff8411b10786a6ef743de1c4df7c1888700844b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 13:52:03 +0200 Subject: [PATCH 109/432] 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 36cd50ddf..a3a27ef4b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -685,7 +685,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } if ( bp->notaries[i].paxwdcrc != 0 ) - printf("%d.(%x %d %llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask); + printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) From ba31e081034334f97a9265740652ac044b11158b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 13:53:52 +0200 Subject: [PATCH 110/432] test --- iguana/dpow/dpow_network.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a3a27ef4b..16d7c9725 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -360,6 +360,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { + dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; @@ -723,7 +724,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("RECV.%d %llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); + printf("RECV.%d r%llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } From d5569f6c8c46a607377dd1eba5f32640d3ad1848 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 13:54:31 +0200 Subject: [PATCH 111/432] 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 16d7c9725..a3c9efca5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -875,9 +875,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } //dp->crcs[firstz] = crc32; } - } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); - } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); - } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); + } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } //else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); + } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; From 023057cbc237bf8bacee23debb9b10fae95ef316 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 13:55:15 +0200 Subject: [PATCH 112/432] test --- iguana/dpow/dpow_network.c | 118 ++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a3c9efca5..2bd8eddeb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -335,6 +335,65 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) dpow_addnotary(myinfo,0,ipaddr); } +void dpow_bestconsensus(struct dpow_block *bp) +{ + int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask,recvmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; + memset(masks,0,sizeof(masks)); + memset(bestks,0xff,sizeof(bestks)); + memset(counts,0,sizeof(counts)); + recvmask = 0; + for (numdiff=i=0; inumnotaries; i++) + { + if ( bits256_nonz(bp->notaries[i].src.prev_hash) != 0 && bits256_nonz(bp->notaries[i].dest.prev_hash) != 0 ) + recvmask |= (1LL << i); + if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 ) + continue; + //if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) + // continue; + for (j=0; jnotaries[i].bestk == bestks[j] && bp->notaries[i].bestmask == masks[j] ) + { + counts[j]++; + break; + } + if ( j == numdiff && bp->notaries[i].bestk >= 0 && bp->notaries[i].bestmask != 0 ) + { + masks[numdiff] = bp->notaries[i].bestmask; + bestks[numdiff] = bp->notaries[i].bestk; + counts[numdiff]++; + //printf("j.%d numdiff.%d (%d %llx).%d\n",j,numdiff,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,counts[numdiff]); + numdiff++; + } + } + besti = -1, best = 0; + for (i=0; i best ) + { + best = counts[i]; + besti = i; + } + } + if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (recvmask & masks[besti]) == masks[besti] ) + { + bp->bestmask = masks[besti]; + bp->bestk = bestks[besti]; + printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); + } + bp->recvmask = recvmask; + if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) + { + bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); + if ( 0 && (time(NULL) / 180) != bp->lastepoch ) + { + bp->lastepoch = (uint32_t)(time(NULL) / 180); + printf("epoch %u\n",bp->lastepoch % bp->numnotaries); + sleep(1 + (rand() % 3)); + } + } +} + void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { int32_t i; @@ -561,65 +620,6 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } -void dpow_bestconsensus(struct dpow_block *bp) -{ - int8_t bestks[64]; int32_t counts[64],i,j,numcrcs=0,numdiff,besti,best,bestmatches = 0,matches = 0; uint64_t masks[64],matchesmask,recvmask; uint32_t crcval=0; char srcaddr[64],destaddr[64]; - memset(masks,0,sizeof(masks)); - memset(bestks,0xff,sizeof(bestks)); - memset(counts,0,sizeof(counts)); - recvmask = 0; - for (numdiff=i=0; inumnotaries; i++) - { - if ( bits256_nonz(bp->notaries[i].src.prev_hash) != 0 && bits256_nonz(bp->notaries[i].dest.prev_hash) != 0 ) - recvmask |= (1LL << i); - if ( bp->notaries[i].bestk < 0 || bp->notaries[i].bestmask == 0 ) - continue; - //if ( bp->require0 != 0 && (bp->notaries[i].bestmask & 1) == 0 ) - // continue; - for (j=0; jnotaries[i].bestk == bestks[j] && bp->notaries[i].bestmask == masks[j] ) - { - counts[j]++; - break; - } - if ( j == numdiff && bp->notaries[i].bestk >= 0 && bp->notaries[i].bestmask != 0 ) - { - masks[numdiff] = bp->notaries[i].bestmask; - bestks[numdiff] = bp->notaries[i].bestk; - counts[numdiff]++; - //printf("j.%d numdiff.%d (%d %llx).%d\n",j,numdiff,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,counts[numdiff]); - numdiff++; - } - } - besti = -1, best = 0; - for (i=0; i best ) - { - best = counts[i]; - besti = i; - } - } - if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (recvmask & masks[besti]) == masks[besti] ) - { - bp->bestmask = masks[besti]; - bp->bestk = bestks[besti]; - printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); - } - bp->recvmask = recvmask; - if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) - { - bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); - if ( 0 && (time(NULL) / 180) != bp->lastepoch ) - { - bp->lastepoch = (uint32_t)(time(NULL) / 180); - printf("epoch %u\n",bp->lastepoch % bp->numnotaries); - sleep(1 + (rand() % 3)); - } - } -} - void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { int32_t i,bestmatches = 0,matches = 0,paxmatches = 0,paxbestmatches = 0; From 474ecc08d66ec6d20970f04fa1c2bd85971c3674 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 14:32:03 +0200 Subject: [PATCH 113/432] test --- iguana/dpow/dpow_network.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2bd8eddeb..e906a3615 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -724,7 +724,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("RECV.%d r%llx (%d %llx) %llx/%llx\n",senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); + printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-np->channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } @@ -770,18 +770,30 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo for (i=0; i<32; i++) np->srchash.bytes[i] = dp->minerkey33[i+1]; np->desthash = desthash; - np->channel = channel; + if ( (np->channel= channel) == 0 ) + np->channel = (uint32_t)time(NULL); np->height = msgbits; np->myipbits = myinfo->myaddr.myipbits; strcpy(np->symbol,dp->symbol); np->version0 = DPOW_VERSION & 0xff; np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); + sentbytes = -1; portable_mutex_lock(&myinfo->dpowmutex); - sentbytes = nn_send(myinfo->dpowsock,np,size,0); + for (i=0; i<100; i++) + { + struct nn_pollfd pfd; + pfd.fd = myinfo->dpowsock; + pfd.events = NN_POLLOUT; + if ( nn_poll(&pfd,1,100) > 0 ) + { + sentbytes = nn_send(myinfo->dpowsock,np,size,0); + break; + } + } portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("NANOSEND ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); + printf("%d NANOSEND.%s ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 18f419b52c9a32b404b759e059f11c83ae666179 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 14:33:25 +0200 Subject: [PATCH 114/432] 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 e906a3615..a1ddb563c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -270,6 +270,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { + printf("NN_BIND to %s\n",str); if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(str,myinfo->ipaddr,DEX_SOCK)) < 0 ) From 1cbbdf121eaeb164b1fb2f9b2ccb67782770ba68 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 14:36:35 +0200 Subject: [PATCH 115/432] test --- iguana/dpow/dpow_network.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index a1ddb563c..88060ad6d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -233,6 +233,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i if ( iter == 0 && strcmp(ipaddr,myinfo->ipaddr) != 0 ) { retval = nn_connect(myinfo->dpowsock,nanomsg_tcpname(str,ipaddr,DPOW_SOCK)); + printf("NN_CONNECT to (%s)\n",str); retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); } n++; @@ -242,7 +243,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i else dp->numipbits = n; //for (i=0; inumdpowipbits,dp!=0?dp->numipbits:-1,iter); + //printf("addnotary.[%d] (%s) retval.%d (total %d %d) iter.%d\n",n,ipaddr,retval,myinfo->numdpowipbits,dp!=0?dp->numipbits:-1,iter); } if ( dp == 0 ) break; @@ -716,7 +717,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } -void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,struct dpow_nanoutxo *np,int32_t isratify,int8_t senderind) +void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,struct dpow_nanoutxo *np,int32_t isratify,int8_t senderind,uint32_t channel) { if ( isratify != 0 ) { @@ -725,7 +726,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-np->channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); + printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } @@ -794,7 +795,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo } portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("%d NANOSEND.%s ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); + printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) @@ -880,8 +881,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) { if ( bp->isratify == 0 ) - dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind); - else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind); + dpow_nanoutxoget(myinfo,dp,bp,&np->notarize,0,np->senderind,np->channel); + else dpow_nanoutxoget(myinfo,dp,bp,&np->ratify,1,np->senderind,np->channel); dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); } else printf("wrong senderind.%d\n",np->senderind); } From 0479c42f668f18ba18f1972a9fb84d8e2f49cd4d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 15:08:05 +0200 Subject: [PATCH 116/432] test --- iguana/dpow/dpow_network.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 88060ad6d..b157681f4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -234,7 +234,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i { retval = nn_connect(myinfo->dpowsock,nanomsg_tcpname(str,ipaddr,DPOW_SOCK)); printf("NN_CONNECT to (%s)\n",str); - retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); + //retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); } n++; qsort(ptr,n,sizeof(uint32_t),_increasing_ipbits); @@ -272,7 +272,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) else { printf("NN_BIND to %s\n",str); - if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + /*if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(str,myinfo->ipaddr,DEX_SOCK)) < 0 ) { @@ -314,14 +314,10 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); - myinfo->numdpowipbits = 1; timeout = 1000; - nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; - printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("RCVBUF.%d\n",nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("DEXINIT dpow.%d dex.%d rep.%d\n",myinfo->dpowsock,myinfo->dexsock,myinfo->repsock); @@ -331,7 +327,13 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } } } - } + }*/ + myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); + myinfo->numdpowipbits = 1; + timeout = 1000; + nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + maxsize = 1024 * 1024; + printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); } } dpow_addnotary(myinfo,0,ipaddr); From d6e560d0bb3693a44dc373ec89ea046545ab2fd7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 15:18:25 +0200 Subject: [PATCH 117/432] test --- iguana/dpow/dpow_network.c | 59 ++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b157681f4..ff1ea8690 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -335,7 +335,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); } - } + } else printf("error creating nanosocket\n"); dpow_addnotary(myinfo,0,ipaddr); } @@ -845,10 +845,18 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; - if ( time(NULL) < myinfo->nanoinit+5 ) + if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); - if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) + for (i=0; i<100; i++) + { + struct nn_pollfd pfd; + pfd.fd = myinfo->dpowsock; + pfd.events = NN_POLLIN; + if ( nn_poll(&pfd,1,100) > 0 ) + break; + } + if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; if ( size >= 0 ) @@ -900,34 +908,37 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } else printf("no packets\n"); portable_mutex_unlock(&myinfo->dpowmutex); n = 0; - if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) + if ( myinfo->dexsock >= 0 ) { - num++; - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { - printf("FROM BUS.%08x -> pub\n",dexp->crc32); - nn_send(myinfo->pubsock,dexp,size,0); - dex_packet(myinfo,dexp,size); + num++; + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + { + printf("FROM BUS.%08x -> pub\n",dexp->crc32); + nn_send(myinfo->pubsock,dexp,size,0); + dex_packet(myinfo,dexp,size); + } + if ( dexp != 0 ) + nn_freemsg(dexp), dexp = 0; } - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; - } - if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) - { - num++; - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { - nn_send(myinfo->dexsock,dexp,size,0); - if ( (m= myinfo->numdpowipbits) > 0 ) + num++; + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - r = myinfo->dpowipbits[rand() % m]; - nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x -> dexbus, rep.%08x",dexp->crc32,r); + nn_send(myinfo->dexsock,dexp,size,0); + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + nn_send(myinfo->repsock,&r,sizeof(r),0); + printf("REP.%08x -> dexbus, rep.%08x",dexp->crc32,r); + } + dex_packet(myinfo,dexp,size); } - dex_packet(myinfo,dexp,size); + if ( dexp != 0 ) + nn_freemsg(dexp), dexp = 0; } - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; } return(num); } From e6498ec0d5acefb37d3145fafd3ee01d7d10cd84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 15:22:50 +0200 Subject: [PATCH 118/432] 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 ff1ea8690..36c1ba6b8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -208,7 +208,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *ipaddr) { char str[512]; uint32_t ipbits,*ptr; int32_t i,iter,n,retval = -1; - if ( myinfo->dpowsock >= 0 ) + if ( myinfo->dpowsock >= 0 && myinfo->dexsock >= 0 ) { portable_mutex_lock(&myinfo->notarymutex); ipbits = (uint32_t)calc_ipbits(ipaddr); @@ -234,7 +234,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i { retval = nn_connect(myinfo->dpowsock,nanomsg_tcpname(str,ipaddr,DPOW_SOCK)); printf("NN_CONNECT to (%s)\n",str); - //retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); + retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); } n++; qsort(ptr,n,sizeof(uint32_t),_increasing_ipbits); @@ -272,7 +272,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) else { printf("NN_BIND to %s\n",str); - /*if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(str,myinfo->ipaddr,DEX_SOCK)) < 0 ) { @@ -321,19 +321,19 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("RCVBUF.%d\n",nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("DEXINIT dpow.%d dex.%d rep.%d\n",myinfo->dpowsock,myinfo->dexsock,myinfo->repsock); - myinfo->nanoinit = (uint32_t)time(NULL); } } } } } - }*/ + } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; timeout = 1000; nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + myinfo->nanoinit = (uint32_t)time(NULL); } } else printf("error creating nanosocket\n"); dpow_addnotary(myinfo,0,ipaddr); @@ -783,7 +783,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); sentbytes = -1; - portable_mutex_lock(&myinfo->dpowmutex); + //portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -795,7 +795,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo break; } } - portable_mutex_unlock(&myinfo->dpowmutex); + //portable_mutex_unlock(&myinfo->dpowmutex); free(np); printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } @@ -847,7 +847,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); - portable_mutex_lock(&myinfo->dpowmutex); + //portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -906,7 +906,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( np != 0 ) nn_freemsg(np), np = 0; } else printf("no packets\n"); - portable_mutex_unlock(&myinfo->dpowmutex); + //portable_mutex_unlock(&myinfo->dpowmutex); n = 0; if ( myinfo->dexsock >= 0 ) { From 312aa1e294e3e6ef6b7e63cb43ff9e383ade6708 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 15:24:55 +0200 Subject: [PATCH 119/432] test --- iguana/dpow/dpow_network.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 36c1ba6b8..37788ae27 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -689,10 +689,11 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } } - if ( bp->notaries[i].paxwdcrc != 0 ) + if ( bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); + if ( bp->myind <= 2 ) + printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { if ( bp->pendingbestk != bp->bestk || bp->pendingbestmask != bp->bestmask ) @@ -728,7 +729,8 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); + if ( bp->myind <= 2 ) + printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); } @@ -797,7 +799,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo } //portable_mutex_unlock(&myinfo->dpowmutex); free(np); - printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); + if ( bp->myind <= 2 ) + printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *ipbits,int32_t numipbits,int32_t fromid,uint32_t senderipbits) From 69fa01e2b54cad0ecffcf49d13c57ed59d035030 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 17:45:48 +0200 Subject: [PATCH 120/432] test --- iguana/dpow/dpow_network.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 37788ae27..051fb36ab 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -797,6 +797,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo break; } } + if ( myinfo->dexsock >= 0 ) + nn_send(myinfo->dexsock,np,size,0); //portable_mutex_unlock(&myinfo->dpowmutex); free(np); if ( bp->myind <= 2 ) @@ -916,12 +918,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { num++; - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + /*if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("FROM BUS.%08x -> pub\n",dexp->crc32); nn_send(myinfo->pubsock,dexp,size,0); dex_packet(myinfo,dexp,size); - } + }*/ + printf("GOT DEX PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } From b32e40efb2aeddcbf939adc2898323d103494f4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 18:09:34 +0200 Subject: [PATCH 121/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 051fb36ab..98664e321 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -785,7 +785,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); sentbytes = -1; - //portable_mutex_lock(&myinfo->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -799,7 +799,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo } if ( myinfo->dexsock >= 0 ) nn_send(myinfo->dexsock,np,size,0); - //portable_mutex_unlock(&myinfo->dpowmutex); + portable_mutex_unlock(&myinfo->dpowmutex); free(np); if ( bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); @@ -852,7 +852,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); - //portable_mutex_lock(&myinfo->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -911,7 +911,6 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( np != 0 ) nn_freemsg(np), np = 0; } else printf("no packets\n"); - //portable_mutex_unlock(&myinfo->dpowmutex); n = 0; if ( myinfo->dexsock >= 0 ) { @@ -946,6 +945,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(dexp), dexp = 0; } } + portable_mutex_unlock(&myinfo->dpowmutex); return(num); } #else From f7259c669fe14c38f416c8bc7dae0751e25e257a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 18:33:45 +0200 Subject: [PATCH 122/432] test --- iguana/dpow/dpow_network.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 98664e321..633769bf6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -798,7 +798,10 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo } } if ( myinfo->dexsock >= 0 ) + { + printf("SEND DEX PACKET\n"); nn_send(myinfo->dexsock,np,size,0); + } portable_mutex_unlock(&myinfo->dpowmutex); free(np); if ( bp->myind <= 2 ) @@ -927,6 +930,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } + } + if ( myinfo->repsock >= 0 ) + { if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { num++; From 337bbfb506f50040a15f380eb814ca67f4bec614 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 20 Dec 2016 23:31:34 +0200 Subject: [PATCH 123/432] test --- iguana/dpow/dpow_network.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 633769bf6..6564110c8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -77,7 +77,9 @@ void dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - timeout = 1000; + timeout = 100; + nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); @@ -314,7 +316,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 1000; + timeout = 100; + nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; From 75f1c789a57e964c756e5d0b545ec316c2f89202 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 00:54:32 +0200 Subject: [PATCH 124/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6564110c8..4b75f6f24 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -387,7 +387,7 @@ void dpow_bestconsensus(struct dpow_block *bp) { bp->bestmask = masks[besti]; bp->bestk = bestks[besti]; - printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); + //printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); } bp->recvmask = recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) @@ -733,7 +733,7 @@ void dpow_nanoutxoget(struct supernet_info *myinfo,struct dpow_info *dp,struct d else { dpow_notarize_update(myinfo,dp,bp,senderind,(int8_t)np->bestk,np->bestmask,np->recvmask,np->srcutxo,np->srcvout,np->destutxo,np->destvout,np->siglens,np->sigs,np->paxwdcrc); - if ( bp->myind <= 2 ) + if ( 0 && bp->myind <= 2 ) printf("lag.[%d] RECV.%d r%llx (%d %llx) %llx/%llx\n",(int32_t)(time(NULL)-channel),senderind,(long long)np->recvmask,(int8_t)np->bestk,(long long)np->bestmask,(long long)np->srcutxo.txid,(long long)np->destutxo.txid); } //dpow_bestmask_update(myinfo,dp,bp,nn_senderind,nn_bestk,nn_bestmask,nn_recvmask); @@ -801,14 +801,14 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo break; } } - if ( myinfo->dexsock >= 0 ) + /*if ( myinfo->dexsock >= 0 ) { printf("SEND DEX PACKET\n"); nn_send(myinfo->dexsock,np,size,0); - } + }*/ portable_mutex_unlock(&myinfo->dpowmutex); free(np); - if ( bp->myind <= 2 ) + if ( 0 && bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); } From 3aa0ee81925f209d971fed4e8a693e349849a495 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 01:07:08 +0200 Subject: [PATCH 125/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 4b75f6f24..75e559e51 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -919,23 +919,23 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(np), np = 0; } else printf("no packets\n"); n = 0; - if ( myinfo->dexsock >= 0 ) + if ( 0 && myinfo->dexsock >= 0 ) { if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { num++; - /*if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("FROM BUS.%08x -> pub\n",dexp->crc32); nn_send(myinfo->pubsock,dexp,size,0); dex_packet(myinfo,dexp,size); - }*/ + } printf("GOT DEX PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } } - if ( myinfo->repsock >= 0 ) + if ( 0 && myinfo->repsock >= 0 ) { if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { From de215bf3018effbb84e097e0e6c0a48948088eaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 15:30:00 +0200 Subject: [PATCH 126/432] test --- iguana/dpow/dpow_network.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 75e559e51..221672568 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -57,6 +57,8 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t void dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) { struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t crc32,*retptr,ipbits; +printf("dex_reqsend not active yet\n"); +return; if ( myinfo->reqsock < 0 && (myinfo->reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) @@ -166,6 +168,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp void dex_subsock_poll(struct supernet_info *myinfo) { int32_t size,n=0; struct dex_nanomsghdr *dexp; +printf("subsock poll not active yet\n"); while ( (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { n++; @@ -789,8 +792,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); sentbytes = -1; - portable_mutex_lock(&myinfo->dpowmutex); - for (i=0; i<100; i++) + //portable_mutex_lock(&myinfo->dpowmutex); + /*for (i=0; i<100; i++) { struct nn_pollfd pfd; pfd.fd = myinfo->dpowsock; @@ -800,13 +803,14 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); break; } - } + }*/ /*if ( myinfo->dexsock >= 0 ) { printf("SEND DEX PACKET\n"); nn_send(myinfo->dexsock,np,size,0); }*/ - portable_mutex_unlock(&myinfo->dpowmutex); + //portable_mutex_unlock(&myinfo->dpowmutex); + sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); if ( 0 && bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); @@ -859,7 +863,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); - portable_mutex_lock(&myinfo->dpowmutex); + /*portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -867,8 +871,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) pfd.events = NN_POLLIN; if ( nn_poll(&pfd,1,100) > 0 ) break; - } - if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) + }*/ + if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && { num++; if ( size >= 0 ) @@ -955,7 +959,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(dexp), dexp = 0; } } - portable_mutex_unlock(&myinfo->dpowmutex); + //portable_mutex_unlock(&myinfo->dpowmutex); return(num); } #else From 377515be59705f81d2a28949b3902caf91bad178 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 15:44:00 +0200 Subject: [PATCH 127/432] test --- iguana/dpow/dpow_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 221672568..d335eab5a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -213,9 +213,9 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *ipaddr) { char str[512]; uint32_t ipbits,*ptr; int32_t i,iter,n,retval = -1; + portable_mutex_lock(&myinfo->notarymutex); if ( myinfo->dpowsock >= 0 && myinfo->dexsock >= 0 ) { - portable_mutex_lock(&myinfo->notarymutex); ipbits = (uint32_t)calc_ipbits(ipaddr); for (iter=0; iter<2; iter++) { @@ -253,8 +253,8 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i if ( dp == 0 ) break; } - portable_mutex_unlock(&myinfo->notarymutex); } + portable_mutex_unlock(&myinfo->notarymutex); return(retval); } @@ -266,6 +266,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) printf("need to set ipaddr before nanomsg\n"); return; } + portable_mutex_lock(&myinfo->notarymutex); if ( myinfo->dpowsock < 0 && (myinfo->dpowsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { if ( nn_bind(myinfo->dpowsock,nanomsg_tcpname(str,myinfo->ipaddr,DPOW_SOCK)) < 0 ) @@ -342,7 +343,8 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); myinfo->nanoinit = (uint32_t)time(NULL); } - } else printf("error creating nanosocket\n"); + } //else printf("error creating nanosocket\n"); + portable_mutex_unlock(&myinfo->notarymutex); dpow_addnotary(myinfo,0,ipaddr); } From 557b544057e93ffe913779300a082b617bc6fd64 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 15:50:06 +0200 Subject: [PATCH 128/432] test --- iguana/dpow/dpow_network.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d335eab5a..892325b71 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -795,7 +795,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo memcpy(np->packet,data,datalen); sentbytes = -1; //portable_mutex_lock(&myinfo->dpowmutex); - /*for (i=0; i<100; i++) + for (i=0; i<100; i++) { struct nn_pollfd pfd; pfd.fd = myinfo->dpowsock; @@ -805,14 +805,13 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); break; } - }*/ + } /*if ( myinfo->dexsock >= 0 ) { printf("SEND DEX PACKET\n"); nn_send(myinfo->dexsock,np,size,0); }*/ //portable_mutex_unlock(&myinfo->dpowmutex); - sentbytes = nn_send(myinfo->dpowsock,np,size,0); free(np); if ( 0 && bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); @@ -865,7 +864,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); - /*portable_mutex_lock(&myinfo->dpowmutex); + //portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -873,8 +872,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) pfd.events = NN_POLLIN; if ( nn_poll(&pfd,1,100) > 0 ) break; - }*/ - if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && + } + if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; if ( size >= 0 ) From 2dd7aaab94b04620a010677a9a5081d13d4c911f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 16:20:21 +0200 Subject: [PATCH 129/432] test --- iguana/dpow/dpow_network.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 892325b71..5a2837a8e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -794,7 +794,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); sentbytes = -1; - //portable_mutex_lock(&myinfo->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -805,13 +805,9 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo sentbytes = nn_send(myinfo->dpowsock,np,size,0); break; } + usleep(1000); } - /*if ( myinfo->dexsock >= 0 ) - { - printf("SEND DEX PACKET\n"); - nn_send(myinfo->dexsock,np,size,0); - }*/ - //portable_mutex_unlock(&myinfo->dpowmutex); + portable_mutex_unlock(&myinfo->dpowmutex); free(np); if ( 0 && bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); @@ -864,7 +860,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) return(-1); - //portable_mutex_lock(&myinfo->dpowmutex); + portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -872,8 +868,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) pfd.events = NN_POLLIN; if ( nn_poll(&pfd,1,100) > 0 ) break; + usleep(1000); } - if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) + if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { num++; if ( size >= 0 ) @@ -960,7 +957,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(dexp), dexp = 0; } } - //portable_mutex_unlock(&myinfo->dpowmutex); + portable_mutex_unlock(&myinfo->dpowmutex); return(num); } #else From cdb33e40f26b126d46fa16bb37d0f888a4266ab6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 16:23:34 +0200 Subject: [PATCH 130/432] 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 5a2837a8e..74cf31637 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -392,7 +392,7 @@ void dpow_bestconsensus(struct dpow_block *bp) { bp->bestmask = masks[besti]; bp->bestk = bestks[besti]; - //printf("set best to (%d %llx) recv.%llx\n",bp->bestk,(long long)bp->bestmask,(long long)recvmask); + printf("set best.%d to (%d %llx) recv.%llx\n",best,bp->bestk,(long long)bp->bestmask,(long long)recvmask); } bp->recvmask = recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) @@ -769,7 +769,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo { extralen = dpow_paxpending(extras,&paxwdcrc); bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); dpow_nanoutxoset(&np->notarize,bp,0); } else From 30b642ab0b8bd3cd4956e74fbc3adc7dedbd4e03 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 16:36:55 +0200 Subject: [PATCH 131/432] 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 74cf31637..fa20ba71f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -432,7 +432,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; @@ -769,7 +769,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo { extralen = dpow_paxpending(extras,&paxwdcrc); bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); dpow_nanoutxoset(&np->notarize,bp,0); } else From 87f677d62288cf749688e42bd10ab65fb8e1bd21 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 16:41:23 +0200 Subject: [PATCH 132/432] 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 fa20ba71f..da1a7a74c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -749,8 +749,8 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo struct dpow_nanomsghdr *np; int32_t i,size,extralen=0,sentbytes = 0; uint32_t crc32,paxwdcrc; uint8_t extras[10000]; if ( bp->myind < 0 ) return; - //if ( time(NULL) < myinfo->nanoinit+5 ) - // return; + if ( time(NULL) < myinfo->nanoinit+5 ) + return; crc32 = calc_crc32(0,data,datalen); //dp->crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); From 356f8aa89ef2e24da57695adfdffdcb819bb3b12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 17:21:15 +0200 Subject: [PATCH 133/432] 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 da1a7a74c..c2f43fbbd 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -432,7 +432,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; @@ -669,7 +669,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru else bp->destsigsmasks[bestk] &= ~(1LL << senderind); } } - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); //if ( bp->paxwdcrc != 0 ) From 3dcea0d7d9a1119679a74dd98d23088407c8ef65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 18:39:35 +0200 Subject: [PATCH 134/432] 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 c2f43fbbd..f37636c24 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -669,7 +669,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru else bp->destsigsmasks[bestk] &= ~(1LL << senderind); } } - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); //if ( bp->paxwdcrc != 0 ) From 2f6912ea67f746bced79a3226e87377d5b71d4e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 18:40:47 +0200 Subject: [PATCH 135/432] 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 f37636c24..e96ea8933 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -390,9 +390,9 @@ void dpow_bestconsensus(struct dpow_block *bp) } if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (recvmask & masks[besti]) == masks[besti] ) { - bp->bestmask = masks[besti]; - bp->bestk = bestks[besti]; - printf("set best.%d to (%d %llx) recv.%llx\n",best,bp->bestk,(long long)bp->bestmask,(long long)recvmask); + bp->notaries[bp->myind].bestmask = bp->bestmask = masks[besti]; + bp->notaries[bp->myind].bestk = bp->bestk = bestks[besti]; + //printf("set best.%d to (%d %llx) recv.%llx\n",best,bp->bestk,(long long)bp->bestmask,(long long)recvmask); } bp->recvmask = recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) From 7c3f21809b0ac87e11d93ebf6f461660299011be Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 18:42:00 +0200 Subject: [PATCH 136/432] 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 e96ea8933..1d53c8f32 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -698,10 +698,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } } - if ( bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) + if ( 0 && bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( bp->myind <= 2 ) + if ( 0 && bp->myind <= 2 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From fb4453a03d4fe6d9d3e0079e71bc8f6abb77621d Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 18:46:26 +0200 Subject: [PATCH 137/432] 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 1d53c8f32..40b08ce0f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -24,6 +24,7 @@ struct dex_nanomsghdr void dex_init(struct supernet_info *myinfo) { + return; strcpy(myinfo->dexseed_ipaddr,"78.47.196.146"); myinfo->dexipbits[0] = (uint32_t)calc_ipbits(myinfo->dexseed_ipaddr); myinfo->numdexipbits = 1; From ab2c33db77f2d3c53561a94a8248fcb15de0290a Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 21:15:16 +0200 Subject: [PATCH 138/432] 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 40b08ce0f..69b8a2f8c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -920,7 +920,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; - } else printf("no packets\n"); + } //else printf("no packets\n"); n = 0; if ( 0 && myinfo->dexsock >= 0 ) { From d4492c91aaa17978ba4f5f195785abb67d3ac63e Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 21:35:26 +0200 Subject: [PATCH 139/432] 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 69b8a2f8c..1518100af 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -696,7 +696,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { bestmatches++; paxbestmatches++; - } + } else printf("?%x ",bp->notaries[i].paxwdcrc); } } if ( 0 && bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) @@ -725,7 +725,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } - if ( (rand() % 30) == 0 ) + //if ( (rand() % 30) == 0 ) printf("[%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From 468f29af2d6c003ece1f9b53bf084d01212f9a6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 21:38:55 +0200 Subject: [PATCH 140/432] 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 1518100af..35f0711fb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -696,7 +696,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { bestmatches++; paxbestmatches++; - } else printf("?%x ",bp->notaries[i].paxwdcrc); + } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } if ( 0 && bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) From 547dc3f47f0f5da18e722f02702e5991577ef50f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 21 Dec 2016 21:40:03 +0200 Subject: [PATCH 141/432] 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 35f0711fb..3e18c47ed 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -725,7 +725,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } - //if ( (rand() % 30) == 0 ) + if ( (rand() % 100) == 0 ) printf("[%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From 2901ce44e62d7985cfef3ed6789d42afc3524ff9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 09:57:57 +0200 Subject: [PATCH 142/432] test --- iguana/dpow/dpow_network.c | 40 ++++++++++++++++++++--------------- iguana/dpow/dpow_tx.c | 2 +- iguana/iguana777.h | 1 + iguana/iguana_notary.c | 15 +++++++++++++ includes/iguana_apideclares.h | 1 + 5 files changed, 41 insertions(+), 18 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3e18c47ed..1e2ecd453 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -31,8 +31,13 @@ void dex_init(struct supernet_info *myinfo) portable_mutex_init(&myinfo->dexmutex); } -char *nanomsg_tcpname(char *str,char *ipaddr,uint16_t port) +char *nanomsg_tcpname(struct supernet_info *myinfo,char *str,char *ipaddr,uint16_t port) { + if ( myinfo != 0 ) // bind path) + { + if ( myinfo->bindaddr[0] != 0 && strcmp(ipaddr,myinfo->ipaddr) == 0 ) + ipaddr = myinfo->bindaddr; + } sprintf(str,"tcp://%s:%u",ipaddr,port); return(str); } @@ -62,7 +67,7 @@ printf("dex_reqsend not active yet\n"); return; if ( myinfo->reqsock < 0 && (myinfo->reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { - if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) + if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) { nn_close(myinfo->reqsock); myinfo->reqsock = -1; @@ -71,7 +76,7 @@ return; { if ( myinfo->subsock < 0 && (myinfo->subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { - if ( nn_connect(myinfo->subsock,nanomsg_tcpname(str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) + if ( nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) { nn_close(myinfo->reqsock); myinfo->reqsock = -1; @@ -120,11 +125,11 @@ return; if ( (myinfo->numdexipbits= n) < 3 ) { if ( myinfo->subsock >= 0 ) - nn_connect(myinfo->subsock,nanomsg_tcpname(str,ipaddr,PUB_SOCK)); + nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); } } portable_mutex_unlock(&myinfo->dexmutex); - nn_connect(myinfo->reqsock,nanomsg_tcpname(str,ipaddr,REP_SOCK)); + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); nn_freemsg(retptr); } free(dexp); @@ -238,9 +243,9 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i ptr[n] = ipbits; if ( iter == 0 && strcmp(ipaddr,myinfo->ipaddr) != 0 ) { - retval = nn_connect(myinfo->dpowsock,nanomsg_tcpname(str,ipaddr,DPOW_SOCK)); + retval = nn_connect(myinfo->dpowsock,nanomsg_tcpname(0,str,ipaddr,DPOW_SOCK)); printf("NN_CONNECT to (%s)\n",str); - retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(str,ipaddr,DEX_SOCK)); + retval = nn_connect(myinfo->dexsock,nanomsg_tcpname(0,str,ipaddr,DEX_SOCK)); } n++; qsort(ptr,n,sizeof(uint32_t),_increasing_ipbits); @@ -270,9 +275,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) portable_mutex_lock(&myinfo->notarymutex); if ( myinfo->dpowsock < 0 && (myinfo->dpowsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - if ( nn_bind(myinfo->dpowsock,nanomsg_tcpname(str,myinfo->ipaddr,DPOW_SOCK)) < 0 ) + if ( nn_bind(myinfo->dpowsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DPOW_SOCK)) < 0 ) { - printf("error binding to dpowsock (%s)\n",nanomsg_tcpname(str,myinfo->ipaddr,DPOW_SOCK)); + printf("error binding to dpowsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DPOW_SOCK)); nn_close(myinfo->dpowsock); myinfo->dpowsock = -1; } @@ -281,9 +286,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) printf("NN_BIND to %s\n",str); if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(str,myinfo->ipaddr,DEX_SOCK)) < 0 ) + if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DEX_SOCK)) < 0 ) { - printf("error binding to dexsock (%s)\n",nanomsg_tcpname(str,myinfo->ipaddr,DEX_SOCK)); + printf("error binding to dexsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DEX_SOCK)); nn_close(myinfo->dexsock); myinfo->dexsock = -1; nn_close(myinfo->dpowsock); @@ -293,9 +298,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) { if ( myinfo->pubsock < 0 && (myinfo->pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { - if ( nn_bind(myinfo->pubsock,nanomsg_tcpname(str,myinfo->ipaddr,PUB_SOCK)) < 0 ) + if ( nn_bind(myinfo->pubsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,PUB_SOCK)) < 0 ) { - printf("error binding to pubsock (%s)\n",nanomsg_tcpname(str,myinfo->ipaddr,PUB_SOCK)); + printf("error binding to pubsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,PUB_SOCK)); nn_close(myinfo->pubsock); myinfo->pubsock = -1; nn_close(myinfo->dexsock); @@ -307,9 +312,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) { if ( myinfo->repsock < 0 && (myinfo->repsock= nn_socket(AF_SP,NN_REP)) >= 0 ) { - if ( nn_bind(myinfo->repsock,nanomsg_tcpname(str,myinfo->ipaddr,REP_SOCK)) < 0 ) + if ( nn_bind(myinfo->repsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,REP_SOCK)) < 0 ) { - printf("error binding to repsock (%s)\n",nanomsg_tcpname(str,myinfo->ipaddr,REP_SOCK)); + printf("error binding to repsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,REP_SOCK)); nn_close(myinfo->repsock); myinfo->repsock = -1; nn_close(myinfo->pubsock); @@ -712,6 +717,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->pendingbestk = bp->bestk; bp->pendingbestmask = bp->bestmask; dpow_signedtxgen(myinfo,dp,bp->destcoin,bp,bp->bestk,bp->bestmask,bp->myind,DPOW_SIGBTCCHANNEL,1,0); + printf("finished signing\n"); } if ( bp->destsigsmasks[bp->bestk] == bp->bestmask ) // have all sigs { @@ -795,7 +801,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->version1 = (DPOW_VERSION >> 8) & 0xff; memcpy(np->packet,data,datalen); sentbytes = -1; - portable_mutex_lock(&myinfo->dpowmutex); + // deadlocks! portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) { struct nn_pollfd pfd; @@ -808,7 +814,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo } usleep(1000); } - portable_mutex_unlock(&myinfo->dpowmutex); + //portable_mutex_unlock(&myinfo->dpowmutex); free(np); if ( 0 && bp->myind <= 2 ) printf("%d NANOSEND.%d ht.%d channel.%08x (%d) pax.%08x datalen.%d (%d %llx) (%d %llx) recv.%llx\n",i,sentbytes,np->height,np->channel,size,np->notarize.paxwdcrc,datalen,(int8_t)np->notarize.bestk,(long long)np->notarize.bestmask,bp->notaries[bp->myind].bestk,(long long)bp->notaries[bp->myind].bestmask,(long long)bp->recvmask); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index ccc1f736d..3f17aacad 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -436,7 +436,7 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct dpow_info *dp,struct igu vinitem = jitem(vins,j); if ( (sobj= jobj(item,"scriptSig")) != 0 && (sigstr= jstr(sobj,"hex")) != 0 && strlen(sigstr) > 32 ) { - valid = 1; + valid = 0; if ( dp->ratifying != 0 && j == 0 && bp->myind == 0 ) valid = 1; else if ( (pubstr= jstr(vinitem,"scriptPubKey")) != 0 && is_hexstr(pubstr,0) == 70 ) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f9e4c9ee5..77da1eaee 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -105,6 +105,7 @@ struct supernet_info struct dpow_info DPOWS[64]; int32_t numdpows,dpowsock,dexsock,pubsock,repsock,subsock,reqsock; struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; + char bindaddr[64]; // fadedreamz struct peggy_info *PEGS; void *PAXDATA; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 4afc005d7..3a3be5af6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -362,6 +362,21 @@ STRING_ARG(dpow,pending,fiat) return(clonestr("[]")); } +STRING_ARG(dpow,bindaddr,ipaddr) +{ + uint32_t ipbits; char checkbuf[64]; + if ( ipaddr != 0 && ipaddr[0] != 0 ) + { + ipbits = (uint32_t)calc_ipbits(ipaddr); + expand_ipbits(checkbuf,ipbits); + if ( strcmp(ipaddr,checkbuf) == 0 ) + { + strcpy(myinfo->bindaddr,ipaddr); + return(clonestr("{\"result\":\"success\"}")); + } else return(clonestr("{\"error\":\"invalid bind ipaddr\"}")); + } else return(clonestr("{\"error\":\"no bind ipaddr\"}")); +} + STRING_ARG(iguana,addnotary,ipaddr) { static int32_t didinit; diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 0bc2c0e5b..9cb4a8419 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -19,6 +19,7 @@ STRING_ARG(dpow,active,maskhex); TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); ZERO_ARGS(dpow,cancelratify); THREE_STRINGS(iguana,passthru,asset,function,hex); +STRING_ARG(dpow,bindaddr,ipaddr); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From b704bd8059a562bf6a89c223acf2d3b9d6394f87 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 10:49:03 +0200 Subject: [PATCH 143/432] test --- iguana/dpow/dpow_network.c | 28 +++++++++++++--------------- iguana/iguana_notary.c | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 1e2ecd453..f7aa97d03 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -24,7 +24,6 @@ struct dex_nanomsghdr void dex_init(struct supernet_info *myinfo) { - return; strcpy(myinfo->dexseed_ipaddr,"78.47.196.146"); myinfo->dexipbits[0] = (uint32_t)calc_ipbits(myinfo->dexseed_ipaddr); myinfo->numdexipbits = 1; @@ -60,11 +59,9 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t printf("DEX_PACKET.[%d]\n",size); } -void dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) +int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t crc32,*retptr,ipbits; -printf("dex_reqsend not active yet\n"); -return; + struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t crc32,*retptr,ipbits; if ( myinfo->reqsock < 0 && (myinfo->reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) @@ -127,14 +124,15 @@ return; if ( myinfo->subsock >= 0 ) nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); } + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); } portable_mutex_unlock(&myinfo->dexmutex); - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); nn_freemsg(retptr); - } + } else retval = -2; free(dexp); - //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); - } + printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); + } else retval = -1; + return(retval); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) @@ -174,7 +172,6 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp void dex_subsock_poll(struct supernet_info *myinfo) { int32_t size,n=0; struct dex_nanomsghdr *dexp; -printf("subsock poll not active yet\n"); while ( (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { n++; @@ -704,10 +701,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } - if ( 0 && bp->myind <= 2 && bp->notaries[i].paxwdcrc != 0 ) + if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( 0 && bp->myind <= 2 ) + if ( 1 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { @@ -928,7 +925,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(np), np = 0; } //else printf("no packets\n"); n = 0; - if ( 0 && myinfo->dexsock >= 0 ) + if ( myinfo->dexsock >= 0 ) { if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { @@ -939,12 +936,12 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_send(myinfo->pubsock,dexp,size,0); dex_packet(myinfo,dexp,size); } - printf("GOT DEX PACKET.%d\n",size); + printf("GOT DEX bus PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } } - if ( 0 && myinfo->repsock >= 0 ) + if ( myinfo->repsock >= 0 ) { if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { @@ -960,6 +957,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } dex_packet(myinfo,dexp,size); } + printf("GOT DEX rep PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3a3be5af6..8f8b8fd7d 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -344,6 +344,20 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) else return(clonestr("{\"error\":\"assetchain not active, start in bitcoind mode\"}")); } + +STRING_ARG(dex,send,hex) +{ + uint8_t data[8192]; int32_t datalen,retval; + if ( hex != 0 && (datalen= is_hexstr(hex,0)) > 0 && (datalen>>1) < sizeof(data) ) + { + datalen >>= 1; + decode_hex(data,datalen,hex); + if ( (retval= dex_reqsend(myinfo,data,datalen)) == 0 ) + return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"dex send: retval error\"}")); + } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); +} + STRING_ARG(dpow,pending,fiat) { struct dpow_info *dp; char base[64]; int32_t i; From 0f8de278d5c7232e85854e2457e2d41a2ed8f22f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 10:54:39 +0200 Subject: [PATCH 144/432] test --- iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 2 +- iguana/tests/dexsend | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/dexsend diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 92dd5fc28..f9978717f 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -139,6 +139,7 @@ struct dpow_info struct dpow_block **blocks; }; uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); +int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index f7aa97d03..9881cf675 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -936,7 +936,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_send(myinfo->pubsock,dexp,size,0); dex_packet(myinfo,dexp,size); } - printf("GOT DEX bus PACKET.%d\n",size); + //printf("GOT DEX bus PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } diff --git a/iguana/tests/dexsend b/iguana/tests/dexsend new file mode 100755 index 000000000..5e8d619ef --- /dev/null +++ b/iguana/tests/dexsend @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" From 95d5ad93afd4d1106562b9d659a8f7b058864e1a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 10:56:15 +0200 Subject: [PATCH 145/432] test --- iguana/tests/dexsend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/tests/dexsend b/iguana/tests/dexsend index 5e8d619ef..b43998bef 100755 --- a/iguana/tests/dexsend +++ b/iguana/tests/dexsend @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" From 58d8dcc9e89d035754cf9cab5b4aa4a51d327b08 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 10:57:01 +0200 Subject: [PATCH 146/432] test --- includes/iguana_apideclares.h | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 9cb4a8419..075b70ce8 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -20,6 +20,7 @@ TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); ZERO_ARGS(dpow,cancelratify); THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); +STRING_ARG(dex,send,hex); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From 4b581b0cce17297a9439f0b563ae5335e6ea116f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 11:26:51 +0200 Subject: [PATCH 147/432] test --- basilisk/basilisk.c | 15 ++++---- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 74 +++++++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 3440001d6..9ee041300 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -882,22 +882,23 @@ void basilisks_loop(void *arg) basilisk_ping_send(myinfo,relay); counter++; if ( (counter % 10) == 0 && myinfo->numdpows == 1 ) - { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 500; - } else if ( myinfo->numdpows > 1 ) { dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 10; } + endmilli = startmilli + 10; + } + else + { + dex_update(myinfo); + if ( myinfo->IAMLP != 0 ) + endmilli = startmilli + 1000; + else endmilli = startmilli + 2000; } - else if ( myinfo->IAMLP != 0 ) - endmilli = startmilli + 1000; - else endmilli = startmilli + 2000; //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index f9978717f..2f69039ad 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -140,6 +140,6 @@ struct dpow_info }; uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); - +void dex_update(struct supernet_info *myinfo); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9881cf675..42a79bc44 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -18,7 +18,7 @@ struct dex_nanomsghdr { - uint32_t size,datalen,crc32; + uint32_t size,datalen,crc32,timestamp; uint8_t version0,version1,packet[]; } PACKED; @@ -56,7 +56,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) { - printf("DEX_PACKET.[%d]\n",size); + printf("DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)dexp,size),(int32_t)(time(NULL)-dexp->timestamp)); } int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) @@ -71,7 +71,10 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - if ( myinfo->subsock < 0 && (myinfo->subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + timeout = 500; + nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + if ( myinfo->IAMNOTARY == 0 && myinfo->subsock < 0 && (myinfo->subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { if ( nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) { @@ -82,13 +85,10 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - timeout = 100; - nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - printf("DEXINIT req.%d sub.%d\n",myinfo->reqsock,myinfo->subsock); + printf("CLIENT sockets req.%d sub.%d\n",myinfo->reqsock,myinfo->subsock); } } } @@ -101,36 +101,44 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) dexp->size = size; dexp->datalen = datalen; dexp->crc32 = crc32; + dexp->timestamp = (uint32_t)time(NULL); dexp->version0 = DEX_VERSION & 0xff; dexp->version1 = (DEX_VERSION >> 8) & 0xff; memcpy(dexp->packet,data,datalen); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 ) { - portable_mutex_lock(&myinfo->dexmutex); ipbits = *retptr; expand_ipbits(ipaddr,ipbits); printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); - n = myinfo->numdexipbits; - for (i=0; idexipbits[i] ) - break; - if ( i == n && n < 64 ) + if ( myinfo->IAMNOTARY == 0 ) { - myinfo->dexipbits[n++] = ipbits; - qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); - if ( (myinfo->numdexipbits= n) < 3 ) + portable_mutex_lock(&myinfo->dexmutex); + n = myinfo->numdexipbits; + for (i=0; idexipbits[i] ) + break; + if ( i == n && n < 64 ) { - if ( myinfo->subsock >= 0 ) - nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); + myinfo->dexipbits[n++] = ipbits; + qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); + if ( (myinfo->numdexipbits= n) < 3 ) + { + if ( myinfo->subsock >= 0 ) + { + nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); + printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); + } + } + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + portable_mutex_unlock(&myinfo->dexmutex); } - portable_mutex_unlock(&myinfo->dexmutex); nn_freemsg(retptr); } else retval = -2; free(dexp); - printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d\n",size,dexp->crc32,datalen,sentbytes); + printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,dexp->timestamp); } else retval = -1; return(retval); } @@ -169,12 +177,11 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp return(-1); } -void dex_subsock_poll(struct supernet_info *myinfo) +int32_t dex_subsock_poll(struct supernet_info *myinfo) { - int32_t size,n=0; struct dex_nanomsghdr *dexp; - while ( (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) + int32_t size; struct dex_nanomsghdr *dexp; + if ( (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { - n++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("SUBSOCK.%08x",dexp->crc32); @@ -182,13 +189,19 @@ void dex_subsock_poll(struct supernet_info *myinfo) } if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; - if ( size == 0 || n++ > 100 ) - break; } + return(size); } -#if ISNOTARYNODE +void dex_update(struct supernet_info *myinfo) +{ + int32_t i; + for (i=0; i<100; i++) + if ( dex_subsock_poll(myinfo) <= 0 ) + break; +} +#if ISNOTARYNODE struct dpow_nanoutxo { bits256 srcutxo,destutxo; @@ -216,6 +229,8 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *ipaddr) { char str[512]; uint32_t ipbits,*ptr; int32_t i,iter,n,retval = -1; + if ( myinfo->IAMNOTARY == 0 ) + return(-1); portable_mutex_lock(&myinfo->notarymutex); if ( myinfo->dpowsock >= 0 && myinfo->dexsock >= 0 ) { @@ -269,6 +284,8 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) printf("need to set ipaddr before nanomsg\n"); return; } + if ( myinfo->IAMNOTARY == 0 ) + return; portable_mutex_lock(&myinfo->notarymutex); if ( myinfo->dpowsock < 0 && (myinfo->dpowsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { @@ -327,6 +344,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 500; nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); From 61305551a2281fa859a384435b40a386d6f52b80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 11:29:06 +0200 Subject: [PATCH 148/432] 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 42a79bc44..9ae76f0b5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -719,10 +719,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } - if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( 1 && bp->myind <= 1 ) + if ( 0 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From 9b7fdea50603c77452073c9b46c64d4b67a86d30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 11:37:15 +0200 Subject: [PATCH 149/432] test --- iguana/dpow/dpow_network.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 9ae76f0b5..701d3d3b5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -18,7 +18,7 @@ struct dex_nanomsghdr { - uint32_t size,datalen,crc32,timestamp; + uint32_t crc32,size,datalen,timestamp; uint8_t version0,version1,packet[]; } PACKED; @@ -56,12 +56,12 @@ static int _increasing_ipbits(const void *a,const void *b) void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t size) { - printf("DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)dexp,size),(int32_t)(time(NULL)-dexp->timestamp)); + printf("DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp)); } int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t crc32,*retptr,ipbits; + struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t *retptr,ipbits; if ( myinfo->reqsock < 0 && (myinfo->reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) @@ -95,16 +95,15 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } if ( myinfo->reqsock >= 0 ) { - crc32 = calc_crc32(0,data,datalen); size = (int32_t)(sizeof(*dexp) + datalen); dexp = calloc(1,size); // endian dependent! dexp->size = size; dexp->datalen = datalen; - dexp->crc32 = crc32; dexp->timestamp = (uint32_t)time(NULL); dexp->version0 = DEX_VERSION & 0xff; dexp->version1 = (DEX_VERSION >> 8) & 0xff; memcpy(dexp->packet,data,datalen); + dexp->crc32 = calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 ) { From e48f92db378c032f29dcea320a8b2ac246bcdb8a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:02:18 +0200 Subject: [PATCH 150/432] test --- iguana/dpow/dpow_fsm.c | 8 +++--- iguana/dpow/dpow_network.c | 54 ++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index fac6fae56..ab3b3c78e 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -89,7 +89,7 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc if ( bits256_cmp(txid,srchash) == 0 ) { //printf("verify (%s) it is properly signed! set ht.%d signedtxid to %s\n",coin->symbol,height,bits256_str(str,txid)); - if ( src_or_dest != 0 ) + if ( channel == DPOW_BTCTXIDCHANNEL ) { if ( bp->state < 1000 ) { @@ -104,9 +104,9 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc { if ( bp->state != 0xffffffff ) { - bp->srctxid = txid; - printf("set state elapsed %d COMPLETED %s.(%s) %s.(%s)\n",(int32_t)(time(NULL) - bp->starttime),dp->symbol,bits256_str(str,bp->desttxid),dp->dest,bits256_str(str2,txid)); - bp->state = 0xffffffff; + //bp->srctxid = txid; + //printf("set state elapsed %d COMPLETED %s.(%s) %s.(%s)\n",(int32_t)(time(NULL) - bp->starttime),dp->symbol,bits256_str(str,bp->desttxid),dp->dest,bits256_str(str2,txid)); + //bp->state = 0xffffffff; } } } diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 701d3d3b5..baa36b731 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -110,30 +110,27 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) ipbits = *retptr; expand_ipbits(ipaddr,ipbits); printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); - if ( myinfo->IAMNOTARY == 0 ) + portable_mutex_lock(&myinfo->dexmutex); + n = myinfo->numdexipbits; + for (i=0; idexipbits[i] ) + break; + if ( i == n && n < 64 ) { - portable_mutex_lock(&myinfo->dexmutex); - n = myinfo->numdexipbits; - for (i=0; idexipbits[i] ) - break; - if ( i == n && n < 64 ) + myinfo->dexipbits[n++] = ipbits; + qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); + if ( (myinfo->numdexipbits= n) < 3 ) { - myinfo->dexipbits[n++] = ipbits; - qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); - if ( (myinfo->numdexipbits= n) < 3 ) + if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 ) { - if ( myinfo->subsock >= 0 ) - { - nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); - printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); - } + nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); + printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); - printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } - portable_mutex_unlock(&myinfo->dexmutex); + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } + portable_mutex_unlock(&myinfo->dexmutex); nn_freemsg(retptr); } else retval = -2; free(dexp); @@ -806,8 +803,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo for (i=0; i<32; i++) np->srchash.bytes[i] = dp->minerkey33[i+1]; np->desthash = desthash; - if ( (np->channel= channel) == 0 ) - np->channel = (uint32_t)time(NULL); + np->channel = channel; np->height = msgbits; np->myipbits = myinfo->myaddr.myipbits; strcpy(np->symbol,dp->symbol); @@ -942,7 +938,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(np), np = 0; } //else printf("no packets\n"); n = 0; - if ( myinfo->dexsock >= 0 ) + if ( myinfo->dexsock >= 0 ) // from servers { if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) { @@ -958,20 +954,22 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) nn_freemsg(dexp), dexp = 0; } } - if ( myinfo->repsock >= 0 ) + if ( myinfo->repsock >= 0 ) // from clients { if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { num++; + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + nn_send(myinfo->repsock,&r,sizeof(r),0); + printf("REP.%08x <- rand ip m.%d %x",dexp->crc32,m,r); + } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); - if ( (m= myinfo->numdpowipbits) > 0 ) - { - r = myinfo->dpowipbits[rand() % m]; - nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x -> dexbus, rep.%08x",dexp->crc32,r); - } + nn_send(myinfo->pubsock,dexp,size,0); + printf("REP.%08x -> dexbus and pub, t.%d lag.%d",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); dex_packet(myinfo,dexp,size); } printf("GOT DEX rep PACKET.%d\n",size); From 6bc0c102034cb946b007fd87f7934054d518a83e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:13:13 +0200 Subject: [PATCH 151/432] test --- basilisk/basilisk.c | 3 +- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 146 +++++++++++++++++++++---------------- 3 files changed, 88 insertions(+), 63 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 9ee041300..4c56f977b 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -894,7 +894,8 @@ void basilisks_loop(void *arg) } else { - dex_update(myinfo); + if ( myinfo->IAMNOTARY == 0 ) + dex_updateclient(myinfo); if ( myinfo->IAMLP != 0 ) endmilli = startmilli + 1000; else endmilli = startmilli + 2000; diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 2f69039ad..43d85e8b1 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -140,6 +140,6 @@ struct dpow_info }; uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); -void dex_update(struct supernet_info *myinfo); +void dex_updateclient(struct supernet_info *myinfo); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index baa36b731..f6b751383 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -61,38 +61,46 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0; uint32_t *retptr,ipbits; - if ( myinfo->reqsock < 0 && (myinfo->reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) + struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; + portable_mutex_lock(&myinfo->dexmutex); + subsock = myinfo->subsock; + reqsock = myinfo->reqsock; + if ( reqsock < 0 && (reqsock= nn_socket(AF_SP,NN_REQ)) >= 0 ) { - if ( nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) + if ( nn_connect(reqsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,REP_SOCK)) < 0 ) { - nn_close(myinfo->reqsock); - myinfo->reqsock = -1; + nn_close(reqsock); + reqsock = -1; } else { timeout = 500; - nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - if ( myinfo->IAMNOTARY == 0 && myinfo->subsock < 0 && (myinfo->subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { - if ( nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) + if ( nn_connect(subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) { - nn_close(myinfo->reqsock); - myinfo->reqsock = -1; - nn_close(myinfo->subsock); - myinfo->subsock = -1; + nn_close(reqsock); + reqsock = -1; + nn_close(subsock); + subsock = -1; } else { - nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); - printf("CLIENT sockets req.%d sub.%d\n",myinfo->reqsock,myinfo->subsock); + nn_setsockopt(subsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); + printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); } } } } + if ( myinfo->subsock != subsock ) + myinfo->subsock = subsock; + if ( myinfo->reqsock != reqsock ) + myinfo->reqsock = reqsock; + portable_mutex_unlock(&myinfo->dexmutex); if ( myinfo->reqsock >= 0 ) { size = (int32_t)(sizeof(*dexp) + datalen); @@ -175,8 +183,8 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp int32_t dex_subsock_poll(struct supernet_info *myinfo) { - int32_t size; struct dex_nanomsghdr *dexp; - if ( (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) + int32_t size= -1; struct dex_nanomsghdr *dexp; + if ( myinfo->subsock >= 0 && (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { @@ -189,12 +197,15 @@ int32_t dex_subsock_poll(struct supernet_info *myinfo) return(size); } -void dex_update(struct supernet_info *myinfo) +void dex_updateclient(struct supernet_info *myinfo) { int32_t i; - for (i=0; i<100; i++) - if ( dex_subsock_poll(myinfo) <= 0 ) - break; + if ( myinfo->IAMNOTARY == 0 ) + { + for (i=0; i<100; i++) + if ( dex_subsock_poll(myinfo) <= 0 ) + break; + } } #if ISNOTARYNODE @@ -274,7 +285,7 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) { - char str[512]; int32_t timeout,retval,maxsize; + char str[512]; int32_t timeout,retval,maxsize,dpowsock,dexsock,repsock,pubsock; if ( myinfo->ipaddr[0] == 0 ) { printf("need to set ipaddr before nanomsg\n"); @@ -283,69 +294,73 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) if ( myinfo->IAMNOTARY == 0 ) return; portable_mutex_lock(&myinfo->notarymutex); - if ( myinfo->dpowsock < 0 && (myinfo->dpowsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + dpowsock = myinfo->dpowsock; + dexsock = myinfo->dexsock; + repsock = myinfo->repsock; + pubsock = myinfo->pubsock; + if ( dpowsock < 0 && (dpowsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - if ( nn_bind(myinfo->dpowsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DPOW_SOCK)) < 0 ) + if ( nn_bind(dpowsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DPOW_SOCK)) < 0 ) { printf("error binding to dpowsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DPOW_SOCK)); - nn_close(myinfo->dpowsock); - myinfo->dpowsock = -1; + nn_close(dpowsock); + dpowsock = -1; } else { printf("NN_BIND to %s\n",str); - if ( myinfo->dexsock < 0 && (myinfo->dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) + if ( dexsock < 0 && (dexsock= nn_socket(AF_SP,NN_BUS)) >= 0 ) { - if ( nn_bind(myinfo->dexsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DEX_SOCK)) < 0 ) + if ( nn_bind(dexsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DEX_SOCK)) < 0 ) { printf("error binding to dexsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,DEX_SOCK)); - nn_close(myinfo->dexsock); - myinfo->dexsock = -1; - nn_close(myinfo->dpowsock); - myinfo->dpowsock = -1; + nn_close(dexsock); + dexsock = -1; + nn_close(dpowsock); + dpowsock = -1; } else { - if ( myinfo->pubsock < 0 && (myinfo->pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) + if ( pubsock < 0 && (pubsock= nn_socket(AF_SP,NN_PUB)) >= 0 ) { - if ( nn_bind(myinfo->pubsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,PUB_SOCK)) < 0 ) + if ( nn_bind(pubsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,PUB_SOCK)) < 0 ) { printf("error binding to pubsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,PUB_SOCK)); - nn_close(myinfo->pubsock); - myinfo->pubsock = -1; - nn_close(myinfo->dexsock); - myinfo->dexsock = -1; - nn_close(myinfo->dpowsock); - myinfo->dpowsock = -1; + nn_close(pubsock); + pubsock = -1; + nn_close(dexsock); + dexsock = -1; + nn_close(dpowsock); + dpowsock = -1; } else { - if ( myinfo->repsock < 0 && (myinfo->repsock= nn_socket(AF_SP,NN_REP)) >= 0 ) + if ( repsock < 0 && (repsock= nn_socket(AF_SP,NN_REP)) >= 0 ) { - if ( nn_bind(myinfo->repsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,REP_SOCK)) < 0 ) + if ( nn_bind(repsock,nanomsg_tcpname(myinfo,str,myinfo->ipaddr,REP_SOCK)) < 0 ) { printf("error binding to repsock (%s)\n",nanomsg_tcpname(myinfo,str,myinfo->ipaddr,REP_SOCK)); - nn_close(myinfo->repsock); - myinfo->repsock = -1; - nn_close(myinfo->pubsock); - myinfo->pubsock = -1; - nn_close(myinfo->dexsock); - myinfo->dexsock = -1; - nn_close(myinfo->dpowsock); - myinfo->dpowsock = -1; + nn_close(repsock); + repsock = -1; + nn_close(pubsock); + pubsock = -1; + nn_close(dexsock); + dexsock = -1; + nn_close(dpowsock); + dpowsock = -1; } else { timeout = 100; - nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); timeout = 500; - nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; - printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); - printf("RCVBUF.%d\n",nn_setsockopt(myinfo->repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); - printf("DEXINIT dpow.%d dex.%d rep.%d\n",myinfo->dpowsock,myinfo->dexsock,myinfo->repsock); + printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("RCVBUF.%d\n",nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("DEXINIT dpow.%d dex.%d rep.%d\n",dpowsock,myinfo->dexsock,myinfo->repsock); } } } @@ -355,12 +370,21 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; timeout = 1000; - nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; - printf("RCVBUF.%d\n",nn_setsockopt(myinfo->dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); + myinfo->nanoinit = (uint32_t)time(NULL); } } //else printf("error creating nanosocket\n"); + if ( myinfo->dpowsock != dpowsock ) + myinfo->dpowsock = dpowsock; + if ( myinfo->dexsock != dexsock ) + myinfo->dexsock = dexsock; + if ( myinfo->repsock != repsock ) + myinfo->repsock = repsock; + if ( myinfo->pubsock != pubsock ) + myinfo->pubsock = pubsock; portable_mutex_unlock(&myinfo->notarymutex); dpow_addnotary(myinfo,0,ipaddr); } From cab016334b4b79e17b8f4ce1f89cf63a0cc04279 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:24:41 +0200 Subject: [PATCH 152/432] test --- iguana/dpow/dpow_network.c | 15 +++++++++++---- iguana/iguana777.h | 12 +++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index f6b751383..042029861 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -74,9 +74,11 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - timeout = 500; + timeout = 2500; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); + timeout = 500; + nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { if ( nn_connect(subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) @@ -140,9 +142,14 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } portable_mutex_unlock(&myinfo->dexmutex); nn_freemsg(retptr); - } else retval = -2; + } + else + { + retval = -2; + printf("no rep return? recvbytes.%d\n",recvbytes); + } + printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); free(dexp); - printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,dexp->timestamp); } else retval = -1; return(retval); } @@ -987,7 +994,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x <- rand ip m.%d %x",dexp->crc32,m,r); + printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 77da1eaee..408e15d57 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -51,13 +51,19 @@ #include "nn.h" #include "bus.h" #else*/ -//#if ISNOTARYNODE +#ifdef __APPLE__ #include "../crypto777/nanosrc/nn.h" #include "../crypto777/nanosrc/bus.h" #include "../crypto777/nanosrc/pubsub.h" #include "../crypto777/nanosrc/reqrep.h" -//#endif -//#endif +#include "../crypto777/nanosrc/tcp.h" +#else +#include "" +#include "" +#include "" +#include "" +#include "" +#endif struct supernet_info; struct exchange_info; From becb8c08068a35e4412f83d56b88f0dfdcdddd08 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:29:20 +0200 Subject: [PATCH 153/432] test --- iguana/iguana777.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 408e15d57..919362042 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -58,11 +58,11 @@ #include "../crypto777/nanosrc/reqrep.h" #include "../crypto777/nanosrc/tcp.h" #else -#include "" -#include "" -#include "" -#include "" -#include "" +#include "/usr/local/include/nanomsg/nn.h" +#include "/usr/local/include/bus.h" +#include "/usr/local/include/pubsub.h" +#include "/usr/local/include/reqrep.h" +#include "/usr/local/include/tcp.h" #endif struct supernet_info; From 3afd1362ac5f7d83312babdd70f211bf695289ae Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:29:58 +0200 Subject: [PATCH 154/432] test --- iguana/iguana777.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 919362042..e50b042b8 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -59,10 +59,10 @@ #include "../crypto777/nanosrc/tcp.h" #else #include "/usr/local/include/nanomsg/nn.h" -#include "/usr/local/include/bus.h" -#include "/usr/local/include/pubsub.h" -#include "/usr/local/include/reqrep.h" -#include "/usr/local/include/tcp.h" +#include "/usr/local/include/nanomsg/bus.h" +#include "/usr/local/include/nanomsg/pubsub.h" +#include "/usr/local/include/nanomsg/reqrep.h" +#include "/usr/local/include/nanomsg/tcp.h" #endif struct supernet_info; From 5f40c909002698bf12aadc7d6957f9afe3484579 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 12:46:00 +0200 Subject: [PATCH 155/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 43d85e8b1..350178645 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -45,7 +45,7 @@ #define DPOW_MAXRELAYS 64 #define DPOW_MAXSIGLEN 128 -#define DEX_VERSION 0x0101 +#define DEX_VERSION 0x0102 #define DPOW_SOCK 7775 #define DEX_SOCK 7774 #define PUB_SOCK 7773 diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 042029861..333d2fc38 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -180,7 +180,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); + crc32 = calc_crc32(0,(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); if ( dexp->crc32 == crc32 && (firstz= dex_crc32find(myinfo,crc32)) >= 0 ) return(0); } From 9ea8f391f8ca7972a3ab83b34add23fd3e80b5e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 13:32:03 +0200 Subject: [PATCH 156/432] test --- iguana/dpow/dpow_fsm.c | 8 ++++---- iguana/main.c | 2 +- iguana/tests/dexsend | 2 +- iguana/tests/dexsend_7776 | 2 ++ 4 files changed, 8 insertions(+), 6 deletions(-) create mode 100755 iguana/tests/dexsend_7776 diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index ab3b3c78e..a37eed594 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -93,10 +93,10 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc { if ( bp->state < 1000 ) { - bp->desttxid = txid; - bp->state = 1000; - dp->destupdated = 0; - dpow_signedtxgen(myinfo,dp,bp->srccoin,bp,bp->bestk,bp->bestmask,myind,DPOW_SIGCHANNEL,0,bp->isratify); + //bp->desttxid = txid; + //bp->state = 1000; + //dp->destupdated = 0; + //dpow_signedtxgen(myinfo,dp,bp->srccoin,bp,bp->bestk,bp->bestmask,myind,DPOW_SIGCHANNEL,0,bp->isratify); //dpow_sigscheck(myinfo,dp,bp,DPOW_SIGCHANNEL,myind,0); } } diff --git a/iguana/main.c b/iguana/main.c index cd68ec531..1ab88d59d 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1593,6 +1593,7 @@ void iguana_main(void *arg) libgfshare_init(myinfo,myinfo->logs,myinfo->exps); myinfo->rpcport = IGUANA_RPCPORT; myinfo->dpowsock = myinfo->dexsock = myinfo->pubsock = myinfo->subsock = myinfo->reqsock = myinfo->repsock = -1; + dex_init(myinfo); if ( arg != 0 ) { if ( strcmp((char *)arg,"OStests") == 0 ) @@ -1601,7 +1602,6 @@ void iguana_main(void *arg) { myinfo->rpcport = IGUANA_NOTARYPORT; myinfo->IAMNOTARY = 1; - dex_init(myinfo); } } #ifdef IGUANA_OSTESTS diff --git a/iguana/tests/dexsend b/iguana/tests/dexsend index b43998bef..5e8d619ef 100755 --- a/iguana/tests/dexsend +++ b/iguana/tests/dexsend @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" diff --git a/iguana/tests/dexsend_7776 b/iguana/tests/dexsend_7776 new file mode 100755 index 000000000..b43998bef --- /dev/null +++ b/iguana/tests/dexsend_7776 @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"dex\",\"method\":\"send\",\"hex\":\"deadbeef\"}" From f7a320f9d8efd9c5a493ae63e785cd9a51804ba0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 14:22:06 +0200 Subject: [PATCH 157/432] test --- iguana/dpow/dpow_fsm.c | 14 +++++++------- iguana/dpow/dpow_network.c | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index a37eed594..a0e4a1149 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -93,10 +93,10 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc { if ( bp->state < 1000 ) { - //bp->desttxid = txid; - //bp->state = 1000; - //dp->destupdated = 0; - //dpow_signedtxgen(myinfo,dp,bp->srccoin,bp,bp->bestk,bp->bestmask,myind,DPOW_SIGCHANNEL,0,bp->isratify); + bp->desttxid = txid; + bp->state = 1000; + dp->destupdated = 0; + dpow_signedtxgen(myinfo,dp,bp->srccoin,bp,bp->bestk,bp->bestmask,myind,DPOW_SIGCHANNEL,0,bp->isratify); //dpow_sigscheck(myinfo,dp,bp,DPOW_SIGCHANNEL,myind,0); } } @@ -104,9 +104,9 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc { if ( bp->state != 0xffffffff ) { - //bp->srctxid = txid; - //printf("set state elapsed %d COMPLETED %s.(%s) %s.(%s)\n",(int32_t)(time(NULL) - bp->starttime),dp->symbol,bits256_str(str,bp->desttxid),dp->dest,bits256_str(str2,txid)); - //bp->state = 0xffffffff; + bp->srctxid = txid; + printf("set state elapsed %d COMPLETED %s.(%s) %s.(%s)\n",(int32_t)(time(NULL) - bp->starttime),dp->symbol,bits256_str(str,bp->desttxid),dp->dest,bits256_str(str2,txid)); + bp->state = 0xffffffff; } } } diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 333d2fc38..78d7d0a97 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -74,11 +74,11 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - timeout = 2500; + timeout = 500; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 2000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 500; - nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); + //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) { if ( nn_connect(subsock,nanomsg_tcpname(0,str,myinfo->dexseed_ipaddr,PUB_SOCK)) < 0 ) @@ -90,7 +90,7 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) } else { - nn_setsockopt(subsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 100; nn_setsockopt(subsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(subsock,NN_SUB,NN_SUB_SUBSCRIBE,"",0); printf("CLIENT sockets req.%d sub.%d\n",reqsock,subsock); @@ -146,7 +146,7 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) else { retval = -2; - printf("no rep return? recvbytes.%d\n",recvbytes); + //printf("no rep return? recvbytes.%d\n",recvbytes); } printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); free(dexp); @@ -362,7 +362,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 500; + timeout = 200; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -376,7 +376,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 1000; + timeout = 300; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -773,7 +773,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } - if ( (rand() % 100) == 0 ) + if ( (rand() % 30) == 0 ) printf("[%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } @@ -1000,10 +1000,10 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { nn_send(myinfo->dexsock,dexp,size,0); nn_send(myinfo->pubsock,dexp,size,0); - printf("REP.%08x -> dexbus and pub, t.%d lag.%d",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + 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); } - printf("GOT DEX rep PACKET.%d\n",size); + //printf("GOT DEX rep PACKET.%d\n",size); if ( dexp != 0 ) nn_freemsg(dexp), dexp = 0; } From bd8da7e75ebaf50947df7a4d036c6def89d1f845 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 18:24:30 +0200 Subject: [PATCH 158/432] test --- iguana/dpow/dpow_fsm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index a0e4a1149..d75efe010 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -89,7 +89,7 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc if ( bits256_cmp(txid,srchash) == 0 ) { //printf("verify (%s) it is properly signed! set ht.%d signedtxid to %s\n",coin->symbol,height,bits256_str(str,txid)); - if ( channel == DPOW_BTCTXIDCHANNEL ) + /*if ( channel == DPOW_BTCTXIDCHANNEL ) { if ( bp->state < 1000 ) { @@ -108,7 +108,7 @@ int32_t dpow_datahandler(struct supernet_info *myinfo,struct dpow_info *dp,struc printf("set state elapsed %d COMPLETED %s.(%s) %s.(%s)\n",(int32_t)(time(NULL) - bp->starttime),dp->symbol,bits256_str(str,bp->desttxid),dp->dest,bits256_str(str2,txid)); bp->state = 0xffffffff; } - } + }*/ } else { From 0dd7082e3c369e7467d953ff41a6a16ffc099072 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 18:46:46 +0200 Subject: [PATCH 159/432] 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 78d7d0a97..54c25e815 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -746,10 +746,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } - if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( 0 && bp->myind <= 1 ) + if ( 1 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From ed85c7a92b7e4f2c4dd85239131b0810366e869d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 19:31:57 +0200 Subject: [PATCH 160/432] 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 54c25e815..78d7d0a97 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -746,10 +746,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } - if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( 1 && bp->myind <= 1 ) + if ( 0 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From 69b15388b4ba60afdfdd4a325a8b052e73d4670b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 21:07:28 +0200 Subject: [PATCH 161/432] 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 78d7d0a97..f106cb255 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -692,9 +692,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - if ( bestmask != 0 ) + //if ( bestmask != 0 ) bp->notaries[senderind].bestmask = bestmask; - if ( recvmask != 0 ) + //if ( recvmask != 0 ) bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { From 74f459e855c3b5a41b430c7028c17dd2323b0cc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 21:18:48 +0200 Subject: [PATCH 162/432] 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 f106cb255..10b10b445 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -480,7 +480,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; From f90569b637feeb1b4217de66679d49eab566f801 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 22 Dec 2016 21:40:36 +0200 Subject: [PATCH 163/432] Revert "test" This reverts commit 74f459e855c3b5a41b430c7028c17dd2323b0cc3. --- 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 10b10b445..f106cb255 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -480,7 +480,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; From 723f28cddb0fb6fe9c43407a0a992d3435d724c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 00:35:47 +0200 Subject: [PATCH 164/432] 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 f106cb255..78d7d0a97 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -692,9 +692,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - //if ( bestmask != 0 ) + if ( bestmask != 0 ) bp->notaries[senderind].bestmask = bestmask; - //if ( recvmask != 0 ) + if ( recvmask != 0 ) bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { From 753498d0e3eb96ef5a4cb3ec1995e20680062d59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 10:29:00 +0200 Subject: [PATCH 165/432] 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 78d7d0a97..b63a1a0dd 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -367,7 +367,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); printf("RCVBUF.%d\n",nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); - printf("DEXINIT dpow.%d dex.%d rep.%d\n",dpowsock,myinfo->dexsock,myinfo->repsock); + printf("DEXINIT dpow.%d dex.%d rep.%d\n",dpowsock,dexsock,repsock); } } } From 095a82018c428acb3b185d898ad801bae5367f59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 11:54:39 +0200 Subject: [PATCH 166/432] 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 b63a1a0dd..6f2895f6b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -480,7 +480,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; From 96c9b4dda70f3a763b88212c3bc139a9a9671057 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 12:39:47 +0200 Subject: [PATCH 167/432] test --- iguana/main.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 1ab88d59d..a6710261a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1618,21 +1618,21 @@ void iguana_main(void *arg) iguana_urlinit(myinfo,ismainnet,usessl); portable_mutex_init(&myinfo->dpowmutex); portable_mutex_init(&myinfo->notarymutex); - if ( myinfo->IAMNOTARY == 0 ) - { #if LIQUIDITY_PROVIDER - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("poloniex"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btc38"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("huobi"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("coinbase"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("lakebtc"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("quadriga"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("okcoin"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btce"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitstamp"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("poloniex"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btc38"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("huobi"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("coinbase"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("lakebtc"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("quadriga"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("okcoin"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btce"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitstamp"),0); #endif + if ( myinfo->IAMNOTARY == 0 ) + { if ( iguana_commandline(myinfo,arg) == 0 ) { iguana_helpinit(myinfo); From 7582dd3ecdf0d7117600ab58cd8d78946d8f18a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 12:50:15 +0200 Subject: [PATCH 168/432] test --- iguana/iguana_exchanges.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index dadfd3b59..899f3479f 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -100,7 +100,7 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s for (totalvol=pricesum=i=0; i Date: Fri, 23 Dec 2016 14:30:08 +0200 Subject: [PATCH 169/432] test --- iguana/exchanges/poloniex.c | 19 ++++++++++++++----- iguana/iguana_exchanges.c | 19 +++++++++++++------ iguana/tests/rate | 2 +- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/iguana/exchanges/poloniex.c b/iguana/exchanges/poloniex.c index ffcd1481a..0e4061d99 100755 --- a/iguana/exchanges/poloniex.c +++ b/iguana/exchanges/poloniex.c @@ -72,20 +72,29 @@ int32_t SUPPORTS(struct exchange_info *exchange,char *base,char *rel,cJSON *argj { //char *baserels[][2] = { {"btc","usd"} }; //return(baserel_polarity(baserels,(int32_t)(sizeof(baserels)/sizeof(*baserels)),base,rel)); - if ( strlen(base) > 5 || strlen(rel) > 5 || strcmp(rel,"CNY") == 0 || strcmp(base,"CNY") == 0 || strcmp(rel,"USD") == 0 || strcmp(base,"USD") == 0 ) + if ( strlen(base) > 5 || strlen(rel) > 5 || strcmp(rel,"CNY") == 0 || strcmp(base,"CNY") == 0 ) return(0); - if ( strcmp(rel,"BTC") == 0 ) + if ( strcmp(base,"BTC") == 0 && strcmp(rel,"USD") == 0 ) + return(1); + else if ( strcmp(rel,"BTC") == 0 && strcmp(base,"USD") == 0 ) + return(-1); + else if ( strcmp(rel,"BTC") == 0 ) return(1); else if ( strcmp(base,"BTC") == 0 ) return(-1); else return(0); } -double UPDATE(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *quotes,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert) +double UPDATE(struct exchange_info *exchange,char *_base,char *_rel,struct exchange_quote *quotes,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert) { - char market[128],url[1024]; - sprintf(market,"%s_%s",rel,base); + char market[128],url[1024],base[16],rel[16]; + strcpy(base,_base), touppercase(base); + strcpy(rel,_rel), touppercase(rel); + if ( strcmp(rel,"USD") == 0 ) + sprintf(market,"USDT_%s",base); + else sprintf(market,"%s_%s",rel,base); sprintf(url,"https://poloniex.com/public?command=returnOrderBook¤cyPair=%s&depth=%d",market,maxdepth); + //printf("URL.(%s)\n",url); return(exchanges777_standardprices(exchange,commission,base,rel,url,quotes,0,0,maxdepth,0,invert)); } diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 899f3479f..47384fbc2 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -25,7 +25,7 @@ int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_quote *sortbuf,int32_t n,int32_t max,int32_t ind,int32_t dir,struct exchange_quote *quotes,int32_t numquotes) { int32_t i; struct exchange_quote *quote; - //printf("instantdex_updatesources.%s update dir.%d numquotes.%d\n",exchange->name,dir,numquotes); + printf("instantdex_updatesources.%s update dir.%d numquotes.%d\n",exchange->name,dir,numquotes); for (i=0; inumbids > 0 && active[i]->numasks > 0 ) + { + + } + } for (i=n=0; inumbids > 0 ) @@ -93,19 +100,19 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s else if ( dir > 0 && active[i]->numasks > 0 ) n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,-1,&active[i]->bidasks[1],active[i]->numasks); } - //printf("numexchanges.%d dir.%d %s/%s numX.%d n.%d\n",myinfo->numexchanges,dir,base,rel,num,n); + printf("numexchanges.%d dir.%d %s/%s numX.%d n.%d\n",myinfo->numexchanges,dir,base,rel,num,n); if ( dir < 0 ) revsort64s(&sortbuf[0].satoshis,n,sizeof(*sortbuf)); else sort64s(&sortbuf[0].satoshis,n,sizeof(*sortbuf)); - for (totalvol=pricesum=i=0; iexchange->name,pricesum/totalvol,totalvol); + printf("dir.%d i.%d of %d %12.8f vol %.8f %s | aveprice %.8f total vol %.8f\n",dir,i,n,sortbuf[i].price,quote.volume,active[quote.val]->exchange->name,pricesum/totalvol,totalvol); } } if ( totalvol > 0. ) @@ -821,7 +828,7 @@ void exchanges777_loop(void *ptr) for (i=req->numasks=0; idepth; i++) if ( req->bidasks[(i << 1) + 1].price > SMALLVAL ) req->numasks++; - //printf("%-10s %s/%s numbids.%d numasks.%d\n",exchange->name,req->base,req->rel,req->numbids,req->numasks); +//printf("%-10s %s/%s numbids.%d numasks.%d\n",exchange->name,req->base,req->rel,req->numbids,req->numasks); prices777_processprice(exchange,req->base,req->rel,req->bidasks,req->depth); } queue_enqueue("pricesQ",&exchange->pricesQ,&req->DL); diff --git a/iguana/tests/rate b/iguana/tests/rate index 8692a94cc..99ea9f314 100755 --- a/iguana/tests/rate +++ b/iguana/tests/rate @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"iguana\",\"method\":\"rate\",\"base\":\"BTC\",\"rel\":\"USD\"}" From a3d045234a8e4e49985077319ccd6b7b7fdd4f5d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 15:15:03 +0200 Subject: [PATCH 170/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_exchanges.c | 50 ++++++++++++++++++++++++++++---------- iguana/main.c | 2 +- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6f2895f6b..7587de146 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -442,7 +442,7 @@ void dpow_bestconsensus(struct dpow_block *bp) bp->notaries[bp->myind].bestk = bp->bestk = bestks[besti]; //printf("set best.%d to (%d %llx) recv.%llx\n",best,bp->bestk,(long long)bp->bestmask,(long long)recvmask); } - bp->recvmask = recvmask; + bp->recvmask |= recvmask; if ( bp->bestmask == 0 )//|| (time(NULL) / 180) != bp->lastepoch ) { bp->bestmask = dpow_notarybestk(bp->recvmask,bp,&bp->bestk); diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 47384fbc2..697e45484 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -22,16 +22,18 @@ //char *Exchange_names[] = { "poloniex", "bittrex", "btc38", "huobi", "bitstamp", "bitfinex", "btce", "coinbase", "okcoin", "lakebtc", "quadriga", "truefx", "ecb", "instaforex", "fxcm", "yahoo" }; -int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_quote *sortbuf,int32_t n,int32_t max,int32_t ind,int32_t dir,struct exchange_quote *quotes,int32_t numquotes) +int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_quote *sortbuf,int32_t n,int32_t max,int32_t ind,int32_t dir,struct exchange_quote *quotes,int32_t numquotes,double offset) { int32_t i; struct exchange_quote *quote; - printf("instantdex_updatesources.%s update dir.%d numquotes.%d\n",exchange->name,dir,numquotes); + //printf("instantdex_updatesources.%s update dir.%d numquotes.%d offset %.6f\n",exchange->name,dir,numquotes,offset); for (i=0; iprice,quote->volume); if ( quote->price > SMALLVAL ) { + //printf("%s n.%d ind.%d i.%d dir.%d price %.8f vol %.8f offset %.6f\n",exchange->name,n,ind,i,dir,quote->price+offset,quote->volume,offset); + quote->price += offset; + quote->satoshis = quote->price * SATOSHIDEN; sortbuf[n] = *quote; sortbuf[n].val = ind; sortbuf[n].exchangebits = exchange->exchangebits; @@ -45,7 +47,7 @@ int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *sortbuf,int32_t max,double *totalvolp,char *base,char *rel,double basevolume,cJSON *argjson) { - char *str; double totalvol,pricesum; uint32_t timestamp; + char *str; double totalvol,pricesum,hblas[64][2],refbid,refask; uint32_t timestamp; struct exchange_quote quote; int32_t i,n,dir,num,depth = 100; struct exchange_info *exchange; struct exchange_request *req,*active[64]; if ( myinfo == 0 ) @@ -86,33 +88,55 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s } } } - for (i=0; inumbids > 0 && active[i]->numasks > 0 ) + for (i=0; inumbids > 0 && active[i]->numasks > 0 ) + { + hblas[i][0] = active[i]->bidasks[0].price; + hblas[i][1] = active[i]->bidasks[1].price; + if ( active[i]->exchange != 0 && strcmp("poloniex",active[i]->exchange->name) == 0 ) + refbid = active[i]->bidasks[0].price, refask = active[i]->bidasks[1].price; + //printf("(%6f %.6f) ",hblas[i][0],hblas[i][1]); + } } + //printf(" refbid %.6f refask %.7f\n",refbid,refask); + if ( refbid != 0. && refask != 0. ) + { + for (i=0; inumbids > 0 ) - n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,1,active[i]->bidasks,active[i]->numbids); + n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,1,active[i]->bidasks,active[i]->numbids,hblas[i][0]); else if ( dir > 0 && active[i]->numasks > 0 ) - n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,-1,&active[i]->bidasks[1],active[i]->numasks); + n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,-1,&active[i]->bidasks[1],active[i]->numasks,hblas[i][1]); } - printf("numexchanges.%d dir.%d %s/%s numX.%d n.%d\n",myinfo->numexchanges,dir,base,rel,num,n); + //printf("numexchanges.%d dir.%d %s/%s numX.%d n.%d\n",myinfo->numexchanges,dir,base,rel,num,n); if ( dir < 0 ) revsort64s(&sortbuf[0].satoshis,n,sizeof(*sortbuf)); else sort64s(&sortbuf[0].satoshis,n,sizeof(*sortbuf)); - for (totalvol=pricesum=i=0; iexchange->name,pricesum/totalvol,totalvol); + //printf("dir.%d i.%d of %d %12.8f vol %.8f %s | aveprice %.8f total vol %.8f\n",dir,i,n,sortbuf[i].price,quote.volume,active[quote.val]->exchange->name,pricesum/totalvol,totalvol); } } if ( totalvol > 0. ) diff --git a/iguana/main.c b/iguana/main.c index a6710261a..81d0500b0 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1627,7 +1627,7 @@ void iguana_main(void *arg) myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("coinbase"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("lakebtc"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("quadriga"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("okcoin"),0); + // prices reversed? myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("okcoin"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btce"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitstamp"),0); #endif From 31cd2079c503098de956b0b098acc4e221cf4fb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 15:38:35 +0200 Subject: [PATCH 171/432] test --- basilisk/basilisk.c | 1 + iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 14 ++++++++------ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 4c56f977b..75f3352a7 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -213,6 +213,7 @@ int32_t basilisk_sendcmd(struct supernet_info *myinfo,char *destipaddr,char *typ return(-1); } //portable_mutex_lock(&myinfo->allcoins_mutex); + dex_reqsend(myinfo,&data[-(int32_t)sizeof(struct iguana_msghdr)],datalen); alreadysent = calloc(IGUANA_MAXPEERS * IGUANA_MAXCOINS,sizeof(*alreadysent)); HASH_ITER(hh,myinfo->allcoins,coin,tmp) { diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 350178645..7ce7f1dcd 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -141,5 +141,6 @@ struct dpow_info uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); +int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7587de146..0c11ec713 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -56,7 +56,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) { - printf("DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp)); + printf("uniq DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp)); } int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) @@ -717,11 +717,13 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru else bp->destsigsmasks[bestk] &= ~(1LL << senderind); } } - dpow_bestconsensus(bp); - //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); - //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - //if ( bp->paxwdcrc != 0 ) - bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; + if ( (bp->notaries[bp->myind].paxwdcrc= bp->paxwdcrc) != 0 ) + dpow_bestconsensus(bp); + else + { + bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); + bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + } if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; if ( bp->bestmask != 0 ) From 316cb059b9762213472bb8b8a90c748d39bc460e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 16:07:35 +0200 Subject: [PATCH 172/432] test --- basilisk/basilisk.c | 7 +++---- basilisk/basilisk_MSG.c | 6 +++++- basilisk/basilisk_swap.c | 5 +++++ iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 14 +++++++++----- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 75f3352a7..6f20cabd6 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -213,7 +213,7 @@ int32_t basilisk_sendcmd(struct supernet_info *myinfo,char *destipaddr,char *typ return(-1); } //portable_mutex_lock(&myinfo->allcoins_mutex); - dex_reqsend(myinfo,&data[-(int32_t)sizeof(struct iguana_msghdr)],datalen); + //dex_reqsend(myinfo,&data[-(int32_t)sizeof(struct iguana_msghdr)],datalen); alreadysent = calloc(IGUANA_MAXPEERS * IGUANA_MAXCOINS,sizeof(*alreadysent)); HASH_ITER(hh,myinfo->allcoins,coin,tmp) { @@ -877,7 +877,7 @@ void basilisks_loop(void *arg) startmilli = OS_milliseconds(); basilisk_issued_purge(myinfo,600000); basilisk_p2pQ_process(myinfo,777); - if ( myinfo->NOTARY.RELAYID >= 0 ) + if ( myinfo->IAMNOTARY != 0 ) { if ( relay != 0 ) basilisk_ping_send(myinfo,relay); @@ -895,8 +895,7 @@ void basilisks_loop(void *arg) } else { - if ( myinfo->IAMNOTARY == 0 ) - dex_updateclient(myinfo); + dex_updateclient(myinfo); if ( myinfo->IAMLP != 0 ) endmilli = startmilli + 1000; else endmilli = startmilli + 2000; diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index ba6fd9739..c4e0bb4b1 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -291,10 +291,12 @@ HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],*data,*ptr = 0; char *retstr=0; + data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,hexstr); if ( 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= get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,space,sizeof(space),hexstr)) != 0 ) + memcpy(space,key,BASILISK_KEYSIZE); + if ( data != 0 ) { retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); } else printf("no get_dataptr\n"); @@ -305,6 +307,8 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) } 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 ( data != 0 && datalen != 0 ) + dex_reqsend(myinfo,space,datalen+BASILISK_KEYSIZE); return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } #include "../includes/iguana_apiundefs.h" diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 853206c50..7699bef8e 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -17,6 +17,11 @@ // mode to autocreate required outputs // more better LP commands +// depends on just three external functions: +// iguana_sendrawtransaction(myinfo,coin,signedtx); +// basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0) +// basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V) + // included from basilisk.c /* https://bitcointalk.org/index.php?topic=1340621.msg13828271#msg13828271 diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 7ce7f1dcd..4e0574bb7 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -142,5 +142,6 @@ uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen); +char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0c11ec713..e442898a4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -56,7 +56,10 @@ 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; printf("uniq DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp)); + if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) + free(retstr); } int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) @@ -692,15 +695,15 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[senderind].src.prev_vout = srcvout; bp->notaries[senderind].dest.prev_hash = destutxo; bp->notaries[senderind].dest.prev_vout = destvout; - if ( bestmask != 0 ) + //if ( bestmask != 0 ) bp->notaries[senderind].bestmask = bestmask; - if ( recvmask != 0 ) + //if ( recvmask != 0 ) bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); } - if ( bestk >= 0 && (bp->notaries[senderind].bestk= bestk) >= 0 ) + if ( (bp->notaries[senderind].bestk= bestk) >= 0 ) { if ( (bp->notaries[senderind].src.siglens[bestk]= siglens[0]) != 0 ) { @@ -721,8 +724,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru dpow_bestconsensus(bp); else { - bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); - bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); + //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + dpow_bestconsensus(bp); } if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; From 4e4c96eb179336a57bc4a70c1db2852e3df8e530 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 17:16:07 +0200 Subject: [PATCH 173/432] test --- basilisk/basilisk_bitcoin.c | 39 ++++++++++++++++++++++++++++++++----- basilisk/basilisk_swap.c | 4 ++-- iguana/dPoW.h | 3 +++ iguana/dpow/dpow_network.c | 31 ++++++++++++++++------------- iguana/dpow/dpow_rpc.c | 2 +- iguana/iguana_payments.c | 20 ++++++++++++++++++- 6 files changed, 77 insertions(+), 22 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b56a0e7fd..7c59c74c3 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -584,8 +584,8 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi 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 ) - return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); + //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) + // return(clonestr("{\"error\":\"special relays only do OUT and MSG\"}")); vins = 0; changeaddr = jstr(valsobj,"changeaddr"); if ( (amount= j64bits(valsobj,"satoshis")) == 0 ) @@ -882,11 +882,11 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) { - char *retstr=0,*symbol; uint32_t basilisktag; struct basilisk_item *ptr,Lptr; int32_t timeoutmillis; + char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height; 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 ( 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 ) @@ -896,6 +896,35 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) jaddnum(vals,"fanout",MAX(5,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+1)); if ( coin != 0 ) { + if ( coin->FULLNODE < 0 ) + { + txid = jbits256(vals,"txid"); + vout = jint(vals,"vout"); + 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)); + 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 ) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7699bef8e..48751990e 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -18,8 +18,8 @@ // more better LP commands // depends on just three external functions: -// iguana_sendrawtransaction(myinfo,coin,signedtx); -// basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0) +// - iguana_sendrawtransaction(myinfo,coin,signedtx); +// - basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0) // basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 4e0574bb7..f621e8eba 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -143,5 +143,8 @@ int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); +char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); +cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); +int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e442898a4..763a2831a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -483,7 +483,7 @@ void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isr } else { - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); np->srcutxo = bp->notaries[bp->myind].src.prev_hash; np->srcvout = bp->notaries[bp->myind].src.prev_vout; np->destutxo = bp->notaries[bp->myind].dest.prev_hash; @@ -691,13 +691,19 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru return; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) { - bp->notaries[senderind].src.prev_hash = srcutxo; - bp->notaries[senderind].src.prev_vout = srcvout; - bp->notaries[senderind].dest.prev_hash = destutxo; - bp->notaries[senderind].dest.prev_vout = destvout; - //if ( bestmask != 0 ) + if ( bits256_nonz(srcutxo) != 0 ) + { + bp->notaries[senderind].src.prev_hash = srcutxo; + bp->notaries[senderind].src.prev_vout = srcvout; + } + if ( bits256_nonz(destutxo) != 0 ) + { + bp->notaries[senderind].dest.prev_hash = destutxo; + bp->notaries[senderind].dest.prev_vout = destvout; + } + if ( bestmask != 0 ) bp->notaries[senderind].bestmask = bestmask; - //if ( recvmask != 0 ) + if ( recvmask != 0 ) bp->notaries[senderind].recvmask = recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { @@ -720,13 +726,12 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru else bp->destsigsmasks[bestk] &= ~(1LL << senderind); } } - if ( (bp->notaries[bp->myind].paxwdcrc= bp->paxwdcrc) != 0 ) - dpow_bestconsensus(bp); - else + bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; + if ( bp->bestmask == 0 ) { - //bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); - //bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - dpow_bestconsensus(bp); + bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); + bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); + //dpow_bestconsensus(bp); } if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 48bf4be3b..ec3356c98 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -405,7 +405,7 @@ int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32 coin->lastbestheight = height; if ( height > coin->longestchain ) coin->longestchain = height; - if ( (array= jarray(&n,json,"tx")) != 0 ) + if ( txs != 0 && numtxp != 0 && (array= jarray(&n,json,"tx")) != 0 ) { for (i=0; i> 1; serialized = calloc(1,sizeof(struct iguana_msghdr) + len); decode_hex(&serialized[sizeof(struct iguana_msghdr)],len,signedtx); txid = bits256_doublesha256(0,&serialized[sizeof(struct iguana_msghdr)],len); + if ( coin->FULLNODE < 0 ) + { + if ( (str= dpow_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) + { + if ( is_hexstr(str,0) == sizeof(checktxid)*2 ) + { + decode_hex(checktxid.bytes,sizeof(checktxid),str); + if ( bits256_cmp(txid,checktxid) == 0 ) + { + free(str); + return(txid); + } + } + free(str); + memset(txid.bytes,0,sizeof(txid)); + return(txid); + } + } if ( coin->peers != 0 && (n= coin->peers->numranked) > 0 ) { for (i=0; i<8 && i Date: Fri, 23 Dec 2016 17:37:13 +0200 Subject: [PATCH 174/432] 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 c4e0bb4b1..725378b0e 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -307,7 +307,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) } 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 ( data != 0 && datalen != 0 ) + if ( 0 && data != 0 && datalen != 0 ) dex_reqsend(myinfo,space,datalen+BASILISK_KEYSIZE); return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } From f787824c643fbd33dd48655f5970101dc48181d0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 17:45:19 +0200 Subject: [PATCH 175/432] test --- basilisk/basilisk_MSG.c | 2 +- iguana/dpow/dpow_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 725378b0e..c4e0bb4b1 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -307,7 +307,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) } 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 ( 0 && data != 0 && datalen != 0 ) + if ( data != 0 && datalen != 0 ) dex_reqsend(myinfo,space,datalen+BASILISK_KEYSIZE); return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 763a2831a..ebf33c8f1 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -731,7 +731,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - //dpow_bestconsensus(bp); + dpow_bestconsensus(bp); } if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; From 7d70069c36c8ceff3a12e8d5a8dbcd8d2d107b7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 17:49:57 +0200 Subject: [PATCH 176/432] test --- iguana/dpow/dpow_network.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index ebf33c8f1..3f3f0e2d6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -686,7 +686,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,uint8_t senderind,int8_t bestk,uint64_t bestmask,uint64_t recvmask,bits256 srcutxo,uint16_t srcvout,bits256 destutxo,uint16_t destvout,uint8_t siglens[2],uint8_t sigs[2][DPOW_MAXSIGLEN],uint32_t paxwdcrc) { - int32_t i,bestmatches = 0,matches = 0,paxmatches = 0,paxbestmatches = 0; + bits256 srchash; int32_t i,flag,bestmatches = 0,matches = 0,paxmatches = 0,paxbestmatches = 0; if ( bp->myind < 0 ) return; if ( bp->isratify == 0 && bp->state != 0xffffffff && senderind >= 0 && senderind < bp->numnotaries && bits256_nonz(srcutxo) != 0 && bits256_nonz(destutxo) != 0 ) @@ -741,7 +741,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[bp->myind].recvmask = bp->recvmask; if ( bp->bestk >= 0 ) { - for (i=0; inumnotaries; i++) + for (i=flag=0; inumnotaries; i++) { if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) paxmatches++; @@ -757,9 +757,18 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } + else if ( ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) + flag++; if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } + if ( flag != 0 ) + { + printf("flag.%d -> send\n",flag); + for (i=0; iminerkey33[i+1]; + dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); + } if ( 0 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) From f0c3d8e1c5087e1aeae1ce1f0ae6f027b4e07940 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 20:32:11 +0200 Subject: [PATCH 177/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/dpow/dpow_network.c | 13 +++++++------ iguana/dpow/dpow_tx.c | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index d75efe010..66c79c5dd 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -36,7 +36,7 @@ void dpow_utxo2entry(struct dpow_block *bp,struct dpow_entry *ep,struct dpow_utx bp->notaries[i].othermask |= up->othermasks[i]; ep->commit = up->commit; ep->height = up->height; - ep->recvmask = up->recvmask; + ep->recvmask |= up->recvmask; ep->bestk = up->bestk; ep->src.prev_hash = up->srchash; ep->dest.prev_hash = up->desthash; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3f3f0e2d6..3a6d526b5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -704,7 +704,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru if ( bestmask != 0 ) bp->notaries[senderind].bestmask = bestmask; if ( recvmask != 0 ) - bp->notaries[senderind].recvmask = recvmask; + bp->notaries[senderind].recvmask |= recvmask; if ( (bp->notaries[senderind].paxwdcrc= paxwdcrc) != 0 ) { //fprintf(stderr,"{%d %x} ",senderind,paxwdcrc); @@ -741,7 +741,8 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru bp->notaries[bp->myind].recvmask = bp->recvmask; if ( bp->bestk >= 0 ) { - for (i=flag=0; inumnotaries; i++) + flag = -1; + for (i=0; inumnotaries; i++) { if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) paxmatches++; @@ -757,12 +758,12 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("?%x ",bp->notaries[i].paxwdcrc); } } - else if ( ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) - flag++; + else if ( i == senderind && ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) + flag = senderind; if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } - if ( flag != 0 ) + if ( flag >= 0 ) { printf("flag.%d -> send\n",flag); for (i=0; imyind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); + printf("%p [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 3f17aacad..b1afd099e 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -22,7 +22,7 @@ void dpow_bestmask_update(struct supernet_info *myinfo,struct dpow_info *dp,stru return; bp->notaries[nn_senderind].bestk = nn_bestk; bp->notaries[nn_senderind].bestmask = nn_bestmask; - bp->notaries[nn_senderind].recvmask = nn_recvmask; + bp->notaries[nn_senderind].recvmask |= nn_recvmask; startscore = bp->scores[nn_senderind]; if ( bp->bestk >= 0 ) { From 75bf47403f649280694e26f75ec79e621602acc7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 20:45:08 +0200 Subject: [PATCH 178/432] test --- iguana/dPoW.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index f621e8eba..07530ab99 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -146,5 +146,6 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); +uint32_t dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); #endif From 98f1a31d7b7db510b2d56ad035eb7f54582b3dc1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 20:51:33 +0200 Subject: [PATCH 179/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 07530ab99..5b81f23e3 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -146,6 +146,6 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); -uint32_t dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); +void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3a6d526b5..282440b4c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1036,9 +1036,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) { } -uint32_t dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen) +void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen) { - return(0); + return; } int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { return(0); } From 447f6004391572cd4959c1ff3cc6c52bd3d3a270 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 21:01:59 +0200 Subject: [PATCH 180/432] 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 282440b4c..865c724aa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -765,7 +765,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } if ( flag >= 0 ) { - printf("flag.%d -> send\n",flag); + //printf("flag.%d -> send\n",flag); for (i=0; iminerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); From 88d6841584db76d5b14b6ed63148e3312bc8432c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 23 Dec 2016 21:45:37 +0200 Subject: [PATCH 181/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/dpow/dpow_network.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 66c79c5dd..eea35e7fa 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -447,7 +447,7 @@ void dpow_statemachinestart(void *ptr) break; } } - printf("isratify.%d:%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,dp->ratifying,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); + printf("END isratify.%d:%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,dp->ratifying,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; free(ptr); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 865c724aa..0e81fef94 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -795,7 +795,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } if ( (rand() % 30) == 0 ) - printf("%p [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); + printf("%p ht.%d [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->height,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From 2b1e7e25690723fabd58b2beb836dd522db47591 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Dec 2016 10:59:26 +0200 Subject: [PATCH 182/432] test --- iguana/dpow/dpow_fsm.c | 2 ++ iguana/dpow/dpow_tx.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index eea35e7fa..0d9c49c84 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -448,8 +448,10 @@ void dpow_statemachinestart(void *ptr) } } printf("END isratify.%d:%d bestk.%d %llx sigs.%llx state.%x machine ht.%d completed state.%x %s.%s %s.%s recvmask.%llx paxwdcrc.%x %p %p\n",bp->isratify,dp->ratifying,bp->bestk,(long long)bp->bestmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),bp->state,bp->height,bp->state,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid),(long long)bp->recvmask,bp->paxwdcrc,src,dest); + bp->state = 0xffffffff; dp->lastrecvmask = bp->recvmask; dp->ratifying -= bp->isratify; + dp->blocks[bp->height] = 0; free(ptr); } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index b1afd099e..09bb97d38 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -185,6 +185,8 @@ struct dpow_block *dpow_heightfind(struct supernet_info *myinfo,struct dpow_info return(bp); } } + if ( bp != 0 && bp->state == 0xffffffff ) + bp = 0; return(bp); } From c8e4c46543d54f32366a654dd1468a398dff5e2f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 24 Dec 2016 13:00:06 +0200 Subject: [PATCH 183/432] test --- iguana/iguana777.c | 2 +- iguana/iguana_blocks.c | 10 ++++++---- iguana/iguana_msg.c | 2 +- iguana/iguana_realtime.c | 2 +- iguana/iguana_recv.c | 2 +- iguana/tests/LPinit | 2 +- iguana/tests/LPinit0 | 2 ++ 7 files changed, 13 insertions(+), 9 deletions(-) create mode 100755 iguana/tests/LPinit0 diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 8f730bfa0..4d58b2f8c 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -1128,7 +1128,7 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers, if ( coin->MAXMEM == 0 ) coin->MAXMEM = IGUANA_DEFAULTRAM; coin->MAXMEM *= (1024L * 1024 * 1024); - coin->enableCACHE = 0;//(strcmp("BTC",coin->symbol) != 0); + coin->enableCACHE = 0;//(strcmp("BTCD",coin->symbol) == 0); if ( jobj(json,"cache") != 0 ) coin->enableCACHE = juint(json,"cache"); if ( (coin->polltimeout= juint(json,"poll")) <= 0 ) diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 8b179b2c1..7b70472c9 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -349,14 +349,14 @@ void iguana_blockzcopy(uint8_t zcash,struct iguana_block *dest,struct iguana_blo int32_t iguana_blockvalidate(struct supernet_info *myinfo,struct iguana_info *coin,int32_t *validp,struct iguana_block *block,int32_t dispflag) { - bits256 hash2; uint8_t serialized[sizeof(struct iguana_msgblock) + 4096]; + bits256 hash2; int32_t len; uint8_t serialized[sizeof(struct iguana_msgblock) + 32768]; if ( coin->chain->debug != 0 || coin->chain->zcash != 0 ) { *validp = 1; return(0); } *validp = 0; - if ( iguana_serialize_block(myinfo,coin->chain,&hash2,serialized,block) < 0 ) + if ( (len= iguana_serialize_block(myinfo,coin->chain,&hash2,serialized,block)) < 0 ) return(-1); *validp = (memcmp(hash2.bytes,block->RO.hash2.bytes,sizeof(hash2)) == 0); block->valid = *validp; @@ -367,8 +367,10 @@ int32_t iguana_blockvalidate(struct supernet_info *myinfo,struct iguana_info *co if ( dispflag != 0 ) { static uint32_t counter; - if ( (counter++ % 10000) == 9999 ) - printf("iguana_blockvalidate.%d: %s miscompare.%d (%s) vs (%s)\n",block->height,coin->symbol,counter,bits256_str(str,hash2),bits256_str(str2,block->RO.hash2)); + //for (i=0; iheight,coin->symbol,counter,bits256_str(str,hash2),bits256_str(str2,block->RO.hash2)); //getchar(); } return(-1); diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 3689a2a7f..2c67a3d59 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -242,7 +242,7 @@ int32_t iguana_serialize_block(struct supernet_info *myinfo,struct iguana_chain msg->H.bits = block->RO.bits; msg->H.nonce = block->RO.nonce; msg->txn_count = block->RO.txn_count; - len = iguana_rwblock(myinfo,chain->symbol,chain->zcash,chain->auxpow,chain->hashalgo,1,hash2p,serialized,&zmsg,IGUANA_MAXPACKETSIZE); + len = iguana_rwblock(myinfo,chain->symbol,chain->zcash,chain->auxpow,chain->hashalgo,1,hash2p,serialized,(void *)msg,IGUANA_MAXPACKETSIZE); } else { diff --git a/iguana/iguana_realtime.c b/iguana/iguana_realtime.c index cc97c39c6..b54a82e39 100755 --- a/iguana/iguana_realtime.c +++ b/iguana/iguana_realtime.c @@ -717,7 +717,7 @@ int32_t iguana_RTiterate(struct supernet_info *myinfo,struct iguana_info *coin,i if ( block->height > coin->maxRTheight ) { coin->maxRTheight = block->height; - printf("%s %.8f [%.8f %.8f] RTiterate.%lld %d tx.%d len.%d %s\n",coin->symbol,dstr(coin->histbalance)+dstr(coin->RTcredits)-dstr(coin->RTdebits),dstr(coin->RTcredits),dstr(coin->RTdebits),(long long)polarity,offset,coin->RTnumtx[offset],coin->RTrecvlens[offset],bits256_str(str,block->RO.hash2)); + printf("%s.%d %.8f [%.8f %.8f] RTiterate.%lld %d tx.%d len.%d %s\n",coin->symbol,block->height,dstr(coin->histbalance)+dstr(coin->RTcredits)-dstr(coin->RTdebits),dstr(coin->RTcredits),dstr(coin->RTdebits),(long long)polarity,offset,coin->RTnumtx[offset],coin->RTrecvlens[offset],bits256_str(str,block->RO.hash2)); } if ( coin->RTrawmem.ptr == 0 ) iguana_meminit(&coin->RTrawmem,"RTrawmem",0,IGUANA_MAXPACKETSIZE * 2,0); diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 5c7224e5e..f7bd3f598 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -823,7 +823,7 @@ void iguana_gotblockM(struct supernet_info *myinfo,struct iguana_info *coin,stru block->bundlei = bundlei; block->height = bp->hdrsi*coin->chain->bundlesize + bundlei; block->txvalid = block->valid = 1; - block->RO.txn_count = origtxdata->zblock.RO.txn_count; + block->RO = origtxdata->zblock.RO; if ( block->fpipbits != 0 && block->fpos >= 0 ) { static int32_t numredundant; static double redundantsize; static uint32_t lastdisp; diff --git a/iguana/tests/LPinit b/iguana/tests/LPinit index 513f39a9a..1f6f4ce29 100755 --- a/iguana/tests/LPinit +++ b/iguana/tests/LPinit @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTCD\",\"vals\":{\"profit\":0.01}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"KMD\",\"vals\":{\"profit\":0.01}}" diff --git a/iguana/tests/LPinit0 b/iguana/tests/LPinit0 new file mode 100755 index 000000000..513f39a9a --- /dev/null +++ b/iguana/tests/LPinit0 @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTCD\",\"vals\":{\"profit\":0.01}}" From f24922fb4afd62d906fd284d48153ad8864de4c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 05:13:01 +0200 Subject: [PATCH 184/432] test --- iguana/confs/BTCD_hdrs.txt | 332 ++++++++++++++++++++++++++++++++++++- iguana/iguana_blocks.c | 10 +- iguana/iguana_bundles.c | 2 +- iguana/tests/listunspentK | 2 + iguana/tests/requestK | 3 + 5 files changed, 342 insertions(+), 7 deletions(-) create mode 100755 iguana/tests/listunspentK create mode 100755 iguana/tests/requestK diff --git a/iguana/confs/BTCD_hdrs.txt b/iguana/confs/BTCD_hdrs.txt index 6ebde857b..20e1e85ee 100644 --- a/iguana/confs/BTCD_hdrs.txt +++ b/iguana/confs/BTCD_hdrs.txt @@ -1,4 +1,4 @@ -1287010 +1451505 0 0000044966f40703b516c5af180582d53f783bfd319bb045e2dc3e05ea695d46 a5d211145f8e6ba0920b2893d307c5d7c207ae0800a80955299678d1706ea8ac 000000000c4682089c916de89eb080a877566494d4009c0089baf35fe94de22f 500 000000000680a9a697eb71155b18a5827e0889fca28afb81fcbb46469ed7877e 79f80a8f54c6762d6408347c6dd7dfd2f8b8c191077c1d7881dfc5b7ec6a408e 0000000002b868fe717dc60b8d146de4d9aecf779b7314224908566e01847769 1000 0000000000000cf908c887020f8970b7fe952f8b81164d83a87621dfdb581d08 3356ec4296ff2f04281492b0dedbaed80edeb6dd9170b87230ff79f6b0daade7 0000000000001e7c6d28962a03b3d75ffa1355ecc6d3021893b2727a1ccfc669 @@ -2573,4 +2573,332 @@ 1285500 47d91223c2513842f9833d26630079872e58b3c29ab1c2860704513ff817a017 4c4befed95e81a843b315466a3c459b61de781f68a4eb3e545a1168779f84fc2 1c4f2e61bde40eddbc29137cf4aefeca2b1445dbed4b642fa778dd481d70a7f9 1286000 d68322938435a8915aaa0a1755c5ef11294bac81d64a76bc576424b373079ae1 010ae35ee9093052277dcba8a3456effe7a0eccbe26a32a8e3dbe41df5b02409 72ef60d505eeeb89e538c243b860d03597bbd75e972e698f1a604d4523cc20c3 1286500 b68cca2dcb4aed574ecfd888f2d87711b3939b05ab5798c5671395b6b032a90d a4037221fe0b9fe5c4611d77d50c661d2efc4038d983e17c463236ca0412896b 23910f32c4f9ed70129db37cdcd238c217b255c806cacacf196e3524f8b37850 -1287000 20df89c8172f75ebf33e232d4b3ad8b4e81039a413952c625b8e8d661ec3d0ff +1287000 20df89c8172f75ebf33e232d4b3ad8b4e81039a413952c625b8e8d661ec3d0ff 8c488d6d7f4bdbac9fc46816f60af17f6192c0af223ea293c8ce6f5443defc0f 23a71e064d939c75322e060ef79ca80ed814b78a81fc411ddb831d7f30c869e7 +1287500 ba6383af803394cf08e1cd1104707c48abfa7c12079da59d8998f93cd3acf79c 106ff3286b6b0bdc1db8b9d99adb149549277874bed76801c2bb7971dae9d38b 6dffd66cd2b09cff26e69109a163053215a62f5fabe761dcdc065453c03f3d5a +1288000 14aa18ac460dfa1e2c7d63f961b78a728ed23358291a5685cf6b913ff83c6dfc c08b9cdff419ba06b7479704401e9168eab444f5269d970662e166b50576b026 304bc518e958126f4f9ef6815d7dc801c9c88820b474f77e9ce65009ce7c0eac +1288500 7e4bd680e1b5f1f46ebe238d6d40a9e6631ff0edd83d6ef740928e60b1682912 4248a1181d9e69e912280901a4e43eed13c926e4944c0c734e42d94f35084fde d494a6f50cb58e4a1b9f79821b869c405c64db057408e1fcc596b4549e71982f +1289000 414548e45f36896f22ad5f1a23c7a9af321c3ec785e5a817400522d32ddd8369 4b4fa31252bb8a9c8d493b021af4d23f95ed0b07ee1f4bc5e050fc301fde9706 08d3045cfb01cc60dc74dcac89b3033369276c879693dde857848f58ee026e97 +1289500 0f88ab1ab8359bb519c6c97c83f804a47cc692d75b440b149eeab343704b0947 5e6206c6266227673705b62a30dd47e4a262ca15f1932d1624422d4fa45191b8 a61cabc51c8b4b1296611938b94c2c7152292b8387c2319cf8540ae0464d1cee +1290000 590a14803906c881f2a821244c8c915c19e82cb9f10a66bd9aca03f9a15e82c7 9e7713b23cdea50014758a591d7505d4e46d3d3433b7c132d7610bf5aa874577 d22750df151945df3a67df0ce9e0cbe39191d177b19f3e1880b64b076789f773 +1290500 7e3f8559269c2326e55031cc64a7f1064a84ba9e3c05d64f3dbb0c0cb8004fce bc1402ffb523e4f9662699fd8f4012575dce33fa26dee5f43b04aac5d62e2731 19e01298956e0f1d70006cc93a49359a8f89eece634f9d3e745d699f094dbfd9 +1291000 59331a51e1155078bce69ae690d3d493c0ecf90e83550a9b7fc4ad553fe54748 a2dc677b5280c47c6a5329f6eacc531c6964aff4644d84a800290f5e6043f5e8 4fbdec3dba88001029ddf27ed6379748d1c7d0b72bef5d87bb1d4dab6c1d834d +1291500 408c40000bef4884b1a9f5447595d3032bb195b64edde0a9e2d1d2d3284cde71 93b3285e4412f2336afab88386a2a81fad4a88a09888b6fe6fba3810ff150003 72d51de88e1660f36dc602ff134184ebae354912cbb9c9d64fc5a67283d0b987 +1292000 fcb637884d11db210119514106fdba725059b56450b583e65b86a21abc3995f5 60931ed48f92c6f113e333e6b0e60ea8693f327ac646ecfec72fd08d26584471 dce81ce44896536fd646ac60decaee751b873ea9d32af538979af093bc5cf2df +1292500 a984b66998705b6ab9b9b75fc29a3cbf7426a9e6822622e87f7ce74d413c222e 39a199cb7c9df33c96314f8aa273aecdfb5ea79ae07b8d37ff56ec97778409e7 eea61fbb9d9e5f8e06f0c129cd46a55bd42cee4e33909507f1178c30d99a814c +1293000 079c6fdc893771a52ef83ccb7446c211aee5a450123e437679950ec259a732f9 2e1ac92fce11ee935c98ab01436df599e6cd902216c23f0f82398d52f6daca79 893e2588ba973d110bf7988bb94e555367cc8ba1f1a74b043bb9358dde4044cd +1293500 b89511bac310039ffc518832850462b6b0764dfb630daa85081f52d75a994cc7 52be93d0aad438223bed937820346a0670cd739786600e326f8e2df40b760557 cde2bc01b1ffc4bfe0eac517a1628e0c34ca795df5f3c41279fc776c6fc9bdf6 +1294000 04f5665ba3873e3112e4781f97999de407450023f4d96f8f5202b2fe4ebb61cb 5c69030cb3331e78c3d8bb6ca1c2f6b4ca53ff58961ebb7113a128d520bc206a 0f3a01ad2fb0ef1efcf5e869bdbc7799abac0a6d889c00558c5bc18b84ddd64a +1294500 aec70de5b6147e90937f37e5c985cd012387634c21c9df9e2bf0e8f1d5d46c89 f1ae24ba5754969938b4b1b00cd1dbeb8cf70c9e111dd77cea76138999f89e23 43b746ba357d64a69e5da9f14ac9cd4e9e2ce559858fa44b4014e77ce86fa31e +1295000 c5c31da183bdfa79f4ac6da353fb240edc01cbf1a5633ba52350117899088ce5 4c167cca85f5a846f0eb52d54280ae75c8f5991feb1bc18fd8acfe1ac29a418c 447ec1bc8cc5124e741456a96f030d6e25dbe21affb832e5064bde5886fd45aa +1295500 1aaf95d33f9e1c29510b7b46fc3aa120f3fd630354a17c6f2f06b3eaa6a19ad2 6e0427850445a6c8ec8b1f1d48663dca8bef215c0e91c4cfaab80e8357414eb4 9860e48a6c7309574649a363503bbdcee0985e7dcfe8166a00317573e4cc33f5 +1296000 37e8f1eee5c54282f50afa8afa6d9206f3cf5089252ccceece2a59fc6e25706a 66e7a2bf7b271c4d84ee9b0e8a769895c61fbd4fec16eb51a0cbdf08b344541b 7eb6245bcc57ad780c342096fb6c94d8b7682bf38de939d35793a9ad700a5c63 +1296500 6adf2392e205cfed81fa3e098a3fe5259398448bae7eadfb8e8e8e99eb83641b ca615dfbb481679822d1ae3588eb721f9a8d2771ac6410710dc2d9f1e1fca013 9b1fa56e4fbea01f4c4b1d5cffa3db4441097249688191d4c0b10bf2df453bb1 +1297000 f50fb839a010fd4049a78d16dc18c02226277a1160d45a31b51a5d8193e5dad4 2e8cc7bb69ef19638e8b4de77421c159430bc9b2a96f05d4461a3125ad167cb3 6a361e4157603d6486d3aab9a6344dcafb281727536506566c276ee30ec690c9 +1297500 f2c47a4395bf9b340ec2f97ab2980577af9aecbfd4a6153151771a9bda66cb90 912ae9da2434b0fa6b9f3154878bd7fa44c0fe3391f4bf7737a6d6abd289822a 389b8e6174cab770924950a3877b7cde32007613b88da8e9136e2ffa4dea5f9b +1298000 12f1be10df5d692a1c9c81e85ef78b4e7d0b3761a065ee44dd3d50b67689d021 8ed9590b5443c0c71de752292718e65ddb576fe2d6a0c81a46796ff0def3d7a1 982bb4d013c7cc8e042f8d5e1378885e9aff4e2e9476c0f97033362934ad501f +1298500 62d27b59d6467a101fec17ec5220382907447e2f9710d0784ecf5b723a611119 9512d7719b4fae3864bf692ca783131982ce81007d629446ebbe2d63df498e49 9b1db3cad736a13ca4d230c98ae4ddccc68525758e946c4f1a521bd0442903ad +1299000 e92c71ba19c0389dea054dcefe7198c1520a8512f82363d2b76b546b813a2204 91cd66c70bba8b4acfd8cd5cb27a12413abaec59b24e8d41cfb3175721744b67 9afad7e1981157c5e51d98a2e283cbdfe8a3496f17a6e2f5b6cfd0b73e4f0f16 +1299500 96ed3b01ff2316b7f5cd27680ab31198a606f5f2f0fd129892a7f692a6194201 956530a5d468696a16f9d3add8dbb38a1d375fea904813548636dfb5f124cc44 e2499622eac5c0a34adc22101b2a4d4721238547244e63089b5ca8d389ef96ae +1300000 975f2e29856bf89e0e6c38dc07ba8a6bb1505207b34b31426f437ffb1f98a078 bd912634d61420201a2bb34510b63007832a1c425aa1ef6f01e02456c1eda5dd 5825db0c30276437b7b4438d3bb99a97af8f855441b4c34ac76ae83c94418b1e +1300500 0ad9cec502fd4412f65f2c555bc345201f6b1c820d7ace8c27e7b559aba11de2 4425c5cf8a79b1c6823450c5faaa47c343f08f4bbee24d0b0571c3dfeca1860c 0fafe1c3b2ef9a337438bfb895f5e570a26aca52abbcaf8a246798ce7c64095f +1301000 c887909db7b46234543b9f5fb1c06070dea7cfcb59057d8a74b7cdc20763b46e 0fddda8bfdf47a5983e1213d76e659f96ee5bfca21623edd63da9f5c3bbb2dcf dd9717832aeb0abfab6ef027456e5635c3c5fde7c66b984b770744590433a514 +1301500 b94b86acd563f315962e65c1a13707cb4f744f743079eb5ccd4129139aa29162 db9fd455d23b53b7ab9eb38b261465b065c92111cb07656dd6e59db22c9c704b 0e1a2d9de95d2a890d62a2fb61e0c734ece7793b25cf19732aa5712c082375da +1302000 bce64a2df75d334569a0628937524f39a402190f4569dbc60911b8ea255aafc4 558caaffac3aac7a431c8f4b601705f274b7528fa4852a3ed8ac9916e6092355 52561f009c829ba11e2a3a8d04b097fb5d3de02639a26334f8a15fa3d442e7d0 +1302500 fd4a1145282430b8e05e1ff7292ec164de8242dc3b3707b3f10bec0e77832cfc 608778e86dd856fce3798e29199f33ba5a8d6bc03e1497e8953beb362fce3e78 6579ec234c0cb3fd53d4577fc17117c74c30221dd5963ad9f0871b35d1f7e714 +1303000 8133e0dabaecb7f19f01f4327851017e9e2684ee9aa35d5cffc588335137f81d a24036231b2a49debfc0eda8eacfc830e74093867cf7f05b785c44efef62944c 5664f5880b5d2e30b49cb29261dc1487a247708b3a6eea78e65d5d785df33521 +1303500 fd6c9d4534017e075406060204204c0578cc30be43f4531ce4fb485659c9396d 3d442de6e2a9c4cd50210f7114350d1d273cb65f1ee2cedcd4aaa5faff39f5d8 fd2b378b189a4f8c5ddc5b5a947f84eed858a1f28576a058b4ff626956da3e27 +1304000 7112169cf4509aaa768268a78f3b1d259baa146ad5327bbe7e41e9069d57ed13 7107274326934e899f8d90ff49115e9ac3afe50cdd236881a718029d2104855c 661851b7a27c004fd2438d24f7464548e09b4118a42a64cbbe4425bf1e1c635b +1304500 b10032a87ad4981f82dc7750aa39e9d6799b06b5cb4e21c773e85d850bfa2791 0b1ecfe1187d61df67b3c1837814a7d765f8f0f9143872452c0afb10f9a8ea28 6d1b44bc28dc5af3f96c375b81a40e695cc1149c79a2b4ba6bf6cd4411d5ec06 +1305000 1a130cee1b0f87f045a7ddebe316794b0c832941303924e987e4cbaacbb36975 2dfe373eeb1d5a995e02ae71d12c467e91393766daa5a1648ab82670bcc0a532 ecb1537854454e0fc332cfbd7de48bf1db6ee99110117ca8b45c877a2f4f9790 +1305500 e17eba1cc1b45569a84728dea0389b055d8bb9afcb8777a92eade5386ad05e07 bbbd49c9ae9bd0c76b428771cb8d7648919c0e1ffa619d6277c9d50e6d8c0fa3 5f8d86d2b7c0e906ad6b345ff2099414685acb5f0928f7baf6382ddcf87e6de7 +1306000 baad770e63b8324815b19d55dd164cecdeab4495c7cf474dc9f8914e77bb52de 25ea3293542b46107b15e5359e012cb99173193a0f470422b4132eafd69be03f ed593c06fef7f72fcd109fa3cb64c78fca75fe66567672a0ce21b5a48004cc9c +1306500 dad1ccd7f76c94a4e7ea6c94b8ca0154037509d0dfb7d40ae4c0674868e46d35 358a55160879b82869315151511732e9f1c7ea6f8c6695d778dbc9c80fd2b526 b4a89042edb0b747355ac0811a41657a2ad0bd5d736a93e44a4e82800c78e091 +1307000 449a40c7924c308ea4435762e3eba07b53113ca0f79b0f6e8382f22450959f16 5016ed7b1d89d52c08275c349a1e49c48bc334402a32a54ea1ae750a82ff0159 25d6ab38024133145b61919bb886479b3a4b2f7470bdb0ada052f07846dbd85c +1307500 6f7d300cc13d074b861c61ded690581a3de387b329898923344badb9e0fba8e0 a9af85bcdacf3bfa1dd74c5ce6f98be902beac71b715c46f4ac2f73e22ea292f ba918cf157d001ece92cae5e85147ac9d254214dd748082619c35d58b66ea8f5 +1308000 f2d1363624c5b5a75c5e33ac6e554ecbd0879b7c2faf1fa92a826315571350ab f5dc1f1eaae9aef8380140100659784247c2de2984c65266aaa23bcd865d923a 7366e95913db545bc58789da558447dc4bcb608a6cbb7a22c2112d9d70c8f2dc +1308500 d0b9ffd1f4e1b370fd6331976bad8b91266139069b4acbeeec23c4f58d5b04ab b85a1c505058e2182246ac231258adfcd1cce01fa22d112408c05c547e228549 ea1b220abc0d48583df9a3dff8e42a22e372e68517a7f6d4c4c5b3f2e17a0920 +1309000 65651bfa77d5faf1693f27d68cec53be2f89cf4ce9db85085fc366b120b421df 00707fac0f8feff0e78210251a4828000c48f25ae7d7606b09412704e4c1dc32 f3c1e90de4bec64d70bb6b3eab484b29e0d7b3112d0a85979c1fd973ca38f2f3 +1309500 52843cee7c3f212e3a87dfa07cd83247d2d92ca6460ddc770711d704ca5144a2 1ba329b5f25a19880699de989b426d3e53c0d548b985076832b88af0989c996c dd88970433faa179f4ed7a0ee5b3ce2cbe8e03487e76f61382eab67ed08718a0 +1310000 35aa5778e094f3b24b1033bc92ac76da70426e80e0bb1188b8f2795ec4687cd5 215baa73a90b7ecbdbdbd2ac39f9947adb07f95b188fe4aa4e43e2c432bbe29c c6fa8bdd27d9509d89a2a45791d743b80fb69b1d2901ee7ac1bb27fbce523bae +1310500 a0994a46751b8d2be5162369643c9641ac99916a38be19e1b0278a4ebd771f97 d361196a389889a3cfc524a353efed28384202fd1359de3412f3606afdf5fc93 e08a070ce0b2d11d08d399a619cc6c2e0cc44e79ee92e68ee76ad8dbfaa9186b +1311000 20c091753902fc684bb9e78032e4456e20603f2aa3799ecdf38744c9e826c82e 988d02e5265ba09e8e2e4b5f3d4a3033c3f5eb5a7c5d9ab39b176d97bd4a833e 6a4d7f67be57377e310794a7014737d65539d1e03d2ecbd6b5434d2113b6f5f7 +1311500 675919e065fb57de407cbda5e767d1f054519cad55927b5d731f788f74095ce5 bc9dadd029a4f294fa9065067a5afa88f36d038e1443b807200e9dc60488ad64 25aa0485a49308b89374f9bd7b3b11718d3e3f809d1f193c9867a46f71057f96 +1312000 d33f0d925ab7efd733a8697a54bb2e84337e88c24f9c6f62f93e1f16938d760e 6904935251a3af06aa30221df6fd55baabd76eda2ec5d8939cbb0b880d476ddf ed9abdad6170f8113d0868a4bc25eb15036e9063ea7e81db0b183a6dd13a99c2 +1312500 0b7b8a2979f1c01826e26d88668fbf591ebcb151a61aa2aad2db9bc621735bd6 302a0336299e06d75ee605c34c3f66e41f74d0f0694dcddee098d4c2e2aaa034 143426b6666867255c27a7d96cf5a30d64b15e5ccd503d965568de72516dd137 +1313000 46970f602f34804cb206672df8da4b06695a717a760e0c3e38d81a1f687aa93a 15348af5abae92b1a07f1d5bb5e14a5d56237965040394f15dc28ff0b4ebd958 c453778ef2cb1bbe9e3ab5209928e15a7a15bc1df313640d3e29ee488595fbb0 +1313500 5788242cd701f3e2fd301e920fe0759e9e79f6ebf33e3af9f5f810df6e07eb48 fc3b0ec24934c266cc3f953af9d3e852cd76dff6e4aaf15436541a2f99000130 ba3f2e8116a1405aa63d707ec22d05a1e64bf90f5a8db2dc6fe011ea8d86d7ed +1314000 8e752044324f93c8bf6b92e6196be5a78e3e732ef8187ff0a625b70fb377d588 83da93b29fd11d169567a3ebe0e8b69eb983177585fb14b2288766d66e01b892 250ff4a03277dce320ec0606bb007395fccce3ad40310ae6bcd371c5f0130dc1 +1314500 50cb9a85c311762f226056c6e2d3fdad77c72cac9689521252f7118b3d7f80a5 6daec22c53b55b5880e0a4e12133b3206a56e3c54f0a625b099f80b79ea04846 a597acea03376c209fa38173208279ce0e5a724885e63aee6fb94332fcef5ef1 +1315000 04e6b39f6b1ed74aa5f480356c06978ef66e86d7dc8420b1de1bba5d17c2ef66 a8322867072074c4f43a561a23589aedcf1b9309ae43003764e7693df8c3506c 2b10fc30946bb56db5e420b01b1e8e00fd2b68144276620c7b602c99197481d1 +1315500 a6e5fc3d9533df21d75c6ef6842d1876620335fa10f2b6125a7806a9a5cd719a 21caa446c64c612bca85e84938dc755ba399addcdd0f35a9c33112fb98e5eef1 a106d66bc5085410c37c425744ceaecfa13c9a0e058c0750dd5318b715829cb0 +1316000 db2863ef1d165fe68b5f9709db05674b22ccfefffd954563dee741defadfd1ba 408dd02ab1084a6a76c8f85fb4f92ea3f676ecee8b94b4693ce275e2d09ef6f9 4b01c70ef24f30b7b8fdce145116ba725161339dca17c2daaff1009fc7e8c95e +1316500 eeec218c3c1f10186abe46729df60f9d72f3fadaa35ba3480a60b099e5f60b27 3d1348e98cc2fb807e6fb7f76da5e9cad8d8ab4d51ce89c7c6f41feee4bd6698 f5bd4a8b35b80fd82b57ec845dfe4dd136361147bc8fa2f4bc96a4b50fd569fd +1317000 215ef30ce534c60be9f76c9d0a585233c9628b916a200c4f9b065fc4ea5510d1 0d05ed5c7e89756edf08be777afbdafa26bc8701d10c332c3aed01f755b6774e d605dd429eea4baab063ab12dcfc21b6feacc73da0ad544b59559642699eb8c1 +1317500 ec723a7ca3506a64ae6f72efe7cd6bfc5ceaa1f37fb12800fb574b35036edbd7 d3370646e718e1b9492a552d41c8487686570fbb5ec7cc7ddbb0a6a3fdd8bd4b e718953aa8621a11084673972c3eb7edc93167deef1d903cbbdac60825fe27c4 +1318000 42f2cd60745a2f20f12b711f71751f335b4e45384ed0475d886ccd25a1a09ffa 8db54d2f981ca18996400b1a5606cb9d0caa27a2c90c40e5d07eabdd93a152e2 db0d5df009e9619a46cf5bd8b85a15b87950540dec20e4b67b6b9cfe3246a215 +1318500 bc9257f668c2403e605c2d561accd6d9fa80391c8900f0ded17ccc2bfcd38c2b ea38513fe09a249f346b98aadf558fee9bc08fee5d41cd3c8e0b734da6a2b55b eadee28d3e19873a8dc80d5855416f10b32a5ed0d0a7c8a2b4a1704aab799ba1 +1319000 88ca4eba8f35c423e9385e3f248a204695a3ca251cec76690ed1c4d422000540 60b5e9c72314a0553c63412b5464038b61fa73ce85a9e79ec4952ce4e6514452 cc07f20b1d6bbc525d9976eb613d62f4a5a23b820ed6ff8f67269fbd6e24c28a +1319500 5d4f85d56fbda084409f4fa380b68be94a16a5149cb04f3ceac7006de58021c1 95180988392c9484d337d4c1c657a55cc01d7beb998b7f8da3a0b8ae0db5509f f729b56095b5b0f49feae95f2cb0c72252c24ac49308c40a38a7ac7a34f27915 +1320000 a8e38e06d11cdc27f90d4b261fb356fd8faf78fecf0c0eada19b662f0d4fff8b 78c11c66b71c77f44e8444cb24e65e3e235a373272da8cb4a8dc89a328ba0ab5 4c05cec3108ad339b56766628c4f130f54d284b9c41197e7575662dee9632d14 +1320500 892e535c9829da5008a53e47ab6aeebaa5eb5cb9db69c60fbaff054929acd663 910275228fcce2fe3136aaf1b0a18a2b9b404e527ee0e1c891f5297da1f8a8d3 843582d1a96d117f087a59db1684e1edde124a3b7869e773783b00a6db15a7eb +1321000 0826d8a9d96cf570c4e866b89380424b7052396fe71e583e829cb29b01ae6c41 f0f0461f3471924f1150ed7295ce927d2f1ac46c5a677620804218953322c23e 9815fed0072234489345c10678a0b5575d7beb1e3ea25f16691fa1a50178526c +1321500 1445c93572d625333aad113e9bcc1ceaf433b3cb9755e21dffaf5af6237acb1d b5e483b2101bfbc3236528c141ca2a2003eb196807c9b7fac73377ba487797d5 c94810a72cb495fb592ead8ec0823e78363ba4000aaebed9ee704bc35ffc0c59 +1322000 ed72c3f182a1db940de93f1e22c0cfcb3ae32f6c803e265e9d889f5dcbffa0e5 e7ed683971217957874b78bedf43b5a83fd6a6de3d8ccdec564e4dbb556555d9 97f9ef26d07ce1b83906e8226dde743e06a0426d4529b365e9f75ca04f87b8ad +1322500 66584b90e56161ef1e9566af0bd72cefd3ddc7b93d6236677943a717cb3675e9 a8279af051f87774ad83b9e738026868649934c1428b7067cf8d531c8f6325cf 9e3f7186be531b2727daaeecac65eada5e7f82dc5bd162dc282b4f7e501190f5 +1323000 3ceb9d6191356079cd1c7cc4e3864626b68bbf1a69165b0ced2c8d9aeee636d0 756078fc653f2749d855c7998815c9679835b832b1cb65a1a2d0672d098941fb d2d31a6343ba89fdaa0fe25af7ace703373a66e8cb86f73115996f8728df8668 +1323500 084987c0eb445632b5947efdda82b5c495907bad65415bed6c1974f02e49883d a9246e5fc38ac01ed5ac7b59610331cc474ce7fc839eef50e8a46388a2613078 133e9f74cf623442a8de0443ba6644a2cc42b432ec5f5d4181df44aa6552091b +1324000 f6c06411dcaeb4e047ae00791ba5e7e66777cbdf966765ba2b11281a2d6a207d abe842024abd3c854c6789204aa707cead8c8f0ddd1c61bed5209e54569ce8b4 83be6c1870c4701577ed5439cb92ea8ff7336d33b65fc088f86ed866790da165 +1324500 af410bc94deb902ce6d4c36b7a90960202c64f8398afcaa9e8e68aa2f41e0820 2ac8b1f399bb19550535d1f215c347fb60a53887cd756577a8992c83f7d1c83a c25aff30d3a74b1764ab377e66e01ffb7dd8be9f78ec00ecdbfe44181331cf1b +1325000 cb5b9a6b345db9b1ec8abb1eeb3e5c9013197e90dd6bf7d40e60cf9935e4d604 80825b63c7d1cc826f7b82b1588773e75f4b71b3255f283d5c5a584b967b351e f03213e41e99be31ec5cb9a75e5bed355d95c893e20468d9e40116a9e61448ec +1325500 7e8bdb833d586a3615380e6555e54cc5c8e5978caa75e556b3bffc160b425e1c 0137351633adb5b9b72b7bb29c8a055bf5bc37dcd9f935be1c9421eb85578572 4a1117fc1d36a0877cb3b2f31e6ee576eb01923b6b974e6b073d86ac0b57343d +1326000 5abc0c39b0cf29ab0ea335bb8fb4c873e5b3009e73ead08aa642147241d0a0d1 db6fd87fcf7b90f42e8404dfe9af95ebaf7038ffdab95eb2f015a53589059303 43f2991b18845e8c2d96cbb96e3bafbaba7a1c9da9b2e8543cb2ef64e35ce88b +1326500 00c71e710514946ecd24a4cb2a85d1107e481dbce53a196d3494071924a038b8 7ca02c6d7f7576ab327f402febb03403f4292f9d0fa6ceeea1684e3958e1c3d9 d8499c58af0993c9c028ed0f5436b33312ef1688f62e90a1e19846a1322b1afa +1327000 03403267f98c67b1b66e4f701aa3cb0e8219230838f400b8b0b49b442e023857 a163a0818e4f64334ad046e72fbbe3c8161a0f5ff1bf52aa9a7a556dd46e1ac9 645edce616a09a96bbfd6cbbc0f65f2d9fc1fafb41f83ec530d64916600c92c2 +1327500 8142b7c78effb1d6f2fabcb07f4b0d6909d083d8fd3fe0966c566c90fb5cf51f b94321ee62c251845156b9302646f8c1801659dffd6d92bb483da0f648cc72c8 9cdb8d09a66f35044287aa3f7a2bf3e3c56a55bd8809e426a3ebefc4b9d2248a +1328000 9137f3fc100719789a871a7f10da24d3561f4241fa03a39431ed3c6479114d7b 66860913ea6a119f760c42682cd44edd51cec90e4acaf28c8f3ba74467057a5b 256c892718054b55dc43a3a3fa304093ca7587073519a6694adb91128975dfff +1328500 4ef04e76037c445c2196d56112ae5cafde52b1232828196e415642f7bd479c95 0b5a8707eb6cc1df15188dffc9be91563ea9db12c8922d65df8c795b744c864a a24f07bf3430dfce44efd11c24e609149c12b596142ed14524079c4d3c43fe95 +1329000 dfd2f9d946de44d5216e2798cea1a523124781f7fce4cb573f724c9dc254e568 4ba701061cc0ee9c912474c8b878f4af8bdf00e59738ceeeb8d88c1b83a431fa 4d7c6b3362c653cb0ac2abced3b471db8c5425dcbdbc7b9339a4d5deab0d95c7 +1329500 208c82ed9e60057ffcee35fa36dc71d4b33bfa2cdece6822be9e71e6f16fddbc 82088ff7f2e31da6b683d76637f6e3278ca54777b9fcadeff34f3f36729fa593 be4be507926c06262387fba500ef8cb90eac657690eade13c94c4085766ff475 +1330000 7931b7542a1cc3de43ce17b17f7d59195113727d8b265d08416a94477dd8afcb 6bbde859522632482ea09ff25feffbf908710c893a3b4e50f377cfd9d13c7534 356bee4ba090d6a8fa7f6e5e9a151c60322b0d67643497534646b61445ed300e +1330500 9ccd443e94d6b67c10b6cbd64c01012ea022d25b1313fd33e824a7dc60a74632 25514c86048597db2a6e09601dd58112f481e659737baa8b2d21b70d0f6af744 c2b40441f53cbaf079da3df183378a1db3e79e53226e793305c47754a9d653bd +1331000 83692b3b50593d27009f1761c6fc280f34d4e50c8c3b9420cfeab83efaa07c70 892b4a419efc44a4907fcad1ed2d425d55691cd391a72880eb521702379feba0 06287dff06e3444ff13ba7366d07a34e1c98e84ba335acc64c4f20086dda3717 +1331500 4bc03c77379554bbda564435370b1f1e2013db69e41f6d2756a2bc6d1e4b552f 4d93224a32c6e5e275fd72860d656812bedd7fc065f6bac5709415f9e2d48757 8b1e34cd77a5f1bee1f3585bbb79fd4c9cc392bb3ef78075fefa1c54605461c5 +1332000 63e6b1c164691b3f40f0f3a085371397b3ef13063a6ae524403c4bb22496a23c f809a554c01090a1605b51ded6089e45c72e60ee0677458a08b881ca86982055 76475962222b473f5a41394bc830c1cef400b2af7cc8c3f86b468a3cc1b6ae9f +1332500 d2916dd6fd1ef7e51dcd9eb9c0dd1cfdefe1f9c6c71c7ffce3e8c40d0059bec1 094a7e0239be65639ddac077b033d0f068d7ff604d0a05d80195de8ea9e49748 707c305ea934df80d08bed5e9811a2cd8120913a99783f8da3aa0285c1727e25 +1333000 bcecec51228434805c3810493cbf2e5e4f6cc95f776ae67ec820fcad91fc7b11 83810181c3782804b81858b1034d369526cdeabd8c24138982ecb160f73f6ca4 ff1b019400e7e567d8774351b169930bb9a423231795c47e77b88f76110fca08 +1333500 4343737d8353646b1d21c6de7f90cdb0b736fc19ff66832cf460f0b67236989c 39a8c5d182e4279d82d43eb73c4a47e42516e66b02e6004f5b4cefbf00e173a5 be6b7a4687271617c5910c385d00c2983f74e5f51925383d9812b0f0c3e6f068 +1334000 465b6da0599df8a9f78b6cf69289411e23267f511d158d5da255ec7b4591510d ddb07992fd7e9268f045be35c904924e0ec1095860c2b0d2b004b84ce0ef5b6a 1eca38511ee969a2b094a82bdf06cf6a2c7160dae270e9db2adebda0ce8528c0 +1334500 03c77f8b51bc341353fbe867cf57eedeeb34b31a59c0de413230c44e402550ef 2e915d480db74cdea0434864f187a7748ce3d9e7d89dae0b2bf10c11a88d8fb5 d7dd6273423176f9aa9f41caf7bea8c92ff636182f3a7725d9b6ab894a9aecd8 +1335000 6f402f769dbb32764a692949c5904ec18f10a9b71e4f60b0b4953c12376474b7 bdcbd3edc0af31690d7a021013fdfd08e1dec0a41cec4ddec465b71c551f7f15 2f30200c4a9c30d2bfb9008c51ef5179c8cddb732c48fd2f60c04200a5585693 +1335500 32f6550a807836772ca293673dbdacac959b394bde868045000d26c297ac53c8 45605d4d0627f37ecb3ec62478391a66283b83a39ea11fff8dfead6530f92c2a 8fd8ff109aa2dc7ea0949a76d18b561b27ba25c1cf50afdc4f198c21b65b0977 +1336000 578dd00128bd139aebc6c2224c83c7643ae19b80167496e84561b1619f77891a adeba86609a56fd103b941fe64504559fa177ea010dcc6f761f82dd48068cf8e ecc6bf8433d174e5a167f74eb7d52548de90cc3ca81ab21d670f2176d2cbdf16 +1336500 7e0df61b0c310d89c1c76fe3fbe714bf65b4baacb688290dd87dcc5b5ada1d20 72ff1e9dc301116571223c8412808c5f8cdb586f6de1329445bf737899a136dd 787ba6fc54114c4267c44c3a6c5d823594607a1acb047d7207fe43f28a25a167 +1337000 c3a0fd31732bc0f037d4f784fd020a81f6f6ab9fe202530e420156b316cf9559 08ce6cc295422a60e6ff656471f886900fc29b805d4db048b05419512b0156bc b2209d83bbd0894421480607fae5c3587edceb620985b0ad375a30f4d87589e5 +1337500 aa2d085c6e4294d127befa7be56f68f088049d4af00edcce6e30f5f3df86934f ba03fcd4c1bfc55e4b1c9ff967d4ba0e2010d49320f34672080e4d5f013670db 33dc86ef43bf0fa8b75ad4c8f4e9f6cf89654c6a9af39b881584ddc827d991eb +1338000 3a66c94aedd2834802ee3afe2094f49c258cf09f3a2721f6a35de414f296b32e 896d36cd5b88586454f7369c132a974e7397791ed02e0fa77c764f65e0439fa2 e07b793685a3b7aa47da0c6e33673ce97b4630e8cdcc1dac6c49decd157e60aa +1338500 69e34fd7bccb7be43b96f4dbe5292d8345fffa0388f0edd353ec94783d46bb51 6741d4dbef0c44af99f7a1b99e5b0e0caa3de0eb00602a234f9f6a4d2eb33c07 ada3b5c9b98f12809f1faad2adaefbbddf176f6ab5769a43389f95b2e16dcef0 +1339000 b99ec6c8a6494a9e7500f0c0b999aef622ed9382426b62fd3585e40dfd0cfd79 d361f46a241b89703103f94f73a0b4b91a9d342d8788e6e4c29a6d98337d09f1 b4bfcf2665d277e12a410c561bd3e7c6844c16b3a25ec56437d85d3d2d9ef082 +1339500 bb97eb3aba318a66070aae5324d5dc3f21aca39b9a82c998bc76ecaa416e4b88 babf3c9d2265a8fa3899876607394285b8f8a8dfa8b57bf4e9e13ec6d36fbe56 9b47a725ba5a739efe63b20c5b8165b7a33502bc5c7ae4696e02b6bf16651c3c +1340000 5de5017252d8efb1c59c52f3db4a1633fb66c6712ff0695566941a1e9016b212 4793b3012b17b17a37579191f895c2d568ebbeb1c6231d9740901e28e23fbcb2 1e4049f676a2f829204a97b19e50fc048e8e4cebb29dadb73a9ab545c6b8fa35 +1340500 a5bce6a83a1d962dcedbf6fd51cf24fc5f84f32a9f517923960ceca278788476 f4bfcdab61d47aa5d7c46dc1d96b7ca9124b1d4f82ea88c8e7658d84213eb3cf ab2452cbb75e3acbe3d31dd2ff29d9f5831f61519f5afc9aa9eea9f1d39ca30e +1341000 c3e046334951b94c0ca2fd19e4805ef8795f588c8de4ac499e3e7bf4c6fd85ca 0970b5988fee1058cb0773020662290639037d210bab1acdb56d854dda2d3b97 e357a7f7fb04031023e07631093cb1a207d32ffdefc790476c30dfe7222207ab +1341500 1c1bfb92ccf91a8eacb187c970b0496bf1d5290e6a62b7d8098211673fa31267 ed36fbe8eb96e02f66ec816a427aaca059d5fdb2eaffa64a2af563be2ca041f5 25e64d0c9f1654bb0ea0215f20b70192a35fcd68fbb8de9d9a99475a03101a08 +1342000 2814181378366f0196ad0ee1a410d11750ebcd6ce2254a6b74a0ee29da4c9975 641e40090520106202a8429dccf863eec821972b2424458e0cc904ca69e20c97 bd3746520e2515a4c5cf01f4ea23a7338d23bfd8f5023e120cecce52f6d03bb6 +1342500 b9a08e013fff192f3d6a4faa8b94c680ea52751a81bb1e2b1aba0e6e86b88c8e d34e93ba5132f902035bab2c0ffceb26c139e15052b3bb04d2c377caf7161104 9845659c71a5ea1c5d3f1814e488a956db158c0290ff83ce1c827117514d674a +1343000 038bbf00842f1181184292096407329b8ed19c4af0501984995f230ad8bace8e 3812d9c5db37593e056cff975628aed1e241d1025d29420625ff64c570163644 e0dbdac3fb868e20b1e0e47507d74277a1a13a731474ea422f70993eb950134f +1343500 4b0cf19d29d2b5cb53690dccacb7963e204a179a72764f937a68d07b05efad6f d8d521de3d55ecf1bcf28c1d3929274bf7e88c9ec6f658856f69c2f973967589 ac10a7c1f0dcde7dd3f08d311015a90716ceea651fe360a5380adac7c61b1926 +1344000 b4f96630643fc69b3c56d723bbce7c92e601aa689fd6aebe1cda67bc8f9de69c 1d0ecb44638da74996b9bf1849dd8e65b36c971c022b82e22e84372e19412404 c3ca81484544c59d0b39b2a820da9cd43c8c7a1dff32bfa1720a07f9c8c98c2b +1344500 83b6d7d700027d3d7c7d1fc86d2a01d641d25157f91be2ad2e39c956d0a7949a 0ad368d615509ac20334d6c452c258b33c26b47587680d55842db0e31f53bb2a f1873e24d3962de41f7f2c444b9a5d6d12b99c012a2bf543b0f3bcaa6b0bfc12 +1345000 3191480a871167a41c33a32d7ec66cf6a1dd480176780ab90e86748982c2a7d6 eda0236d99778a1b348e0c6b4c338c9c4438e25384bbb5a5643bcc1615358521 5b7c368737036c86b3a5a9d0e583ddb6e82f2c87634c617a24d177754e7f83d5 +1345500 a5e9a1bec9b5b9651758f0b4b7326d7e7ce3c92766e0b7d3674f59f2ee7a3671 09a045e962f6f00182cec714cd59bb0697f07d2a7db8926b795f4ddd8f39c9e3 eb5079862bc3f270524c4935b6787fb0de708bcb5c1d6176a87462b2453c51cf +1346000 4931aaf3cafc65dce5bebab637820ac8691232a085733186f22c7df832286e1c b9a7a73b558d6d83eeebe12e660caa1adb82384ec8538f9a62fa5b682baae34c 34a0813cf4b6772ab99acf563b1104aacae50220ee6e229c1eea14ad357d76dd +1346500 615caf3dc2d54de35b346c02ecdd15ff1dea2a33a2c2fe384b88bb1b4484e387 c9290dbe6050f045538d42036e9d8ba840894a7a36de663ec4873367b33a44b3 8ae0755f90a9b40929fed4376006ea4d276feeffe2e5525dc574ee3382b5146f +1347000 9f2141db8da06017719371aba61c2870bc8489a3851905fe0fb68ac3eb3ffa0c 5aa216cc7f49e2a7e44d0c0cae9943e09e327700c59d98681382bb64db222703 9a12df471c56b23a0f87fcb606fa76177a34cf9599beec6a377dacbe2cffc94e +1347500 8f954e694ad36d2aa241cb3639a905b0172a4e493d290472272b2c7843f90a6f d00663fd2d358b51566b4659a4256ac81a52116bdc7f79e6f8608f787cd2e63c 910c1d960537172a91361d0b36cbf7710b39dc40fe031062376962faf38ba2bd +1348000 7c63f265959ba36a180cbf78d0e28d98c85775ec652e960da7b88544d75ee269 703d5a7af24b1444fed1470ee43f54331c9d3c5cc425cc7713ab5084870fb776 5df018b23edc754d96a0fb9ce8eaaa17aee136ab3ba7ba40d713cbc49ef845b2 +1348500 c8aa5a7888dfc12d8ea909d16f8bc2f4cb75ac52f2c2cc9ad2a7204c4fe91ed6 2665d6210f6419872e8d804adff0e6bdfb643ea4aa4966d89998312ad432d712 41192bad31bab841232a6154927c1471839ba2bc0a5da7e06b368ad9450de0bb +1349000 f8276c6d70887b37fe6a5ddf66f60bd59ec9addd24538f7adcbfa2b4e57ea3e0 e846ba1f214b54b40efd980e675326874e07b9be698b0beebfcbda0bccf3a472 eab0e993ae3378f6a6ca2101c8067283ec4171f47cc1bf11c8bdd418df7d6b3a +1349500 26bfbc01f2afa9a8bc2f7b6d7d3ebf446a02e539dc916a9329583f85932a4e94 6fab66ed6ffa3b0b419bdbc9e1d57feb249bfa4d6dbee098c5b4bb48a0a49867 7f6f111a19cd4d2f6d61fd2f3fe0139358fd7685497885ea5521013e6d53d951 +1350000 db914330d42468be64206d8936bdfb3d4b03474caa621f72623256edf7f80d9f 58072362690fe06a7a7d0c539779962943e3acf31e8a51109efb7da246e821b1 cc86ff3980059557cd7f3b33f9f4890f1eee0eb33ebc725a6f73fc1cd4bdfd87 +1350500 6096e1312edea656dcb92f65c85ab5e5cdebf3933e8d2173647a45a9a3210e0b 8c65ecf92dbdaaa95533bc15cb23d9857da92cf2d3592d2a5ff22efdc8a3364b 26a6671485e4bb35b0795f1f51ee14ddedfb4eb80c75e06b557080ef5bdeac9c +1351000 53cb04dbcce650f8e79df3c448d04ac741505118f6c3591144684dfca03928c1 b5d14b77a20bf416bb74bced28b7294723584616f0180c6cd2d989775ccdf9c2 1a013bda8dabcca13e995ae1456347b39a03fde3e686ae1d391f9418a322282e +1351500 8e072be1bbb012abe8596d5e9894b71bf659fb9c9bc28aec90c53de3f3e02e0f 41c0d88ca37aedf56f2edf7e66eb43bd8037eacfd4952259806ff81e3a0fd5a8 2a7beeb90f62ca7e91bc5f79ecba75eac51a5bd220d953741b28fca1f6140b64 +1352000 5acd06bbf2e1ea14040216b37d79d2966d438b0d142b85db7e3843b003489c01 3da4f82cb1a6e6de3ebe4e3146876bb1cb2dadc7ee9eab406a05c853571181ec 5caea07fb0da33639f6b85779f36ac5c7105679a0ed3fa3aff2b14b5457a6f69 +1352500 f5d89b3f3cc3e9649eb3e8b36089563aa908aa0ff0e7e109a2e7649343f63b87 dd0be9b771517d97f968a0e5f54605d6a7c8ad897922924f8a1957aae892d915 b901e6e76ca9aabd558e9d868d635350720b76eba9bcc44af56d09b71d678c02 +1353000 5d49abadbf137574e895a0f8d60e940fcb87a7a9b3da6f8a733b6349ebfb0b9f ab12ddbea464538c319d247f73ab6fdebad036b66ed58da2db3b40f49b1d2d9b eb6d531a464b5e5105d4bf86c77ad2bb844dcf85e01f4b8210b4e2bff9fc06dc +1353500 5c8063450d2985664ca20eac74a82564f95cda9bef9ba9517aa862a34450b9ba 40cf73bb2e680b7eba044131f7b4c7980d36e33f9401f79477bd0dec157a1845 e50b7634c1fdd4ec5c8e458dcd1eff860e80c5c55c434c30c115a4e733cc5243 +1354000 2d4991e9cb142acfd096875eb2a464510296fce5e5a2b4f8047a1cb659d7e0ec 3b075d1b4f2a832e673690ab5ea2d2dc7b4d88e3e0c4074187ec63415daf97be 59b8b76f1f07860cc92ca7152cbd8414e547b3198d671985fe6e054ac2420cac +1354500 9157d2348ac1bb37476d739da5a0b03f4406803596a64496a2167cbe32de306b 3387bd949d44556b6f0614809ee00f0be526b2b64f3e2d46f7b0346b8ea109fa a89ccf40d942037b793d775dd08f04a4115a81afb86ae7195256182ade918776 +1355000 79462a5b2495a1324620807079f1f9dfb8a8cdb990993b3156ba6261110a2529 1910799f7e75fd4f2e56ebc68569894a8cb5a35b91494cd91320037b554c2f40 ee9968bda17d6e846b13d1678d1c7259d63173b45422c1da4f349ba121c3ea14 +1355500 ce4974c7891b61213cc77b84c242d53203b83429d64e79721cf9a41810dd2ab9 2e8b5509aafb907b63def57d173838f08f6ef047a29f66b41fe0c6d6c1370780 63ab847b7b5998a33134d68a3d9957a61badaa9210bf72d1fb9ecccf3e39640c +1356000 023395d95890029d9d8962aaf7279809a90150fe9d4f61c0316c3895d4bf7dfa e4b11f5730152d2d73fc58987229929d80336c130feb18fc15ba9f741d9426f4 8c97da0686c2d7a8cd8c9302fb058c0641c72ddaeafaa3adf5db4933077a9e69 +1356500 a050c1ea17c09980b6c7f00e2f55802bb3127f8657560bd1f238fb0251fbbdf5 6a333264bf3abac9c07d30462d06ac0aa64878ac5190b6f1ce056d607387989c 55dc870906bc9ac8b417a8be30d8fae472af0d4f0dc8a1eb07457d33e8799936 +1357000 21c4e9c4a5010af0ef328fd691469b50099cc16e1d914a1bf197638176c78a96 795814be162b58833d5303da87846ab1cd01f14a58206748c8470f4818f8a2a7 70f634630c10cf077c236c9d12ae6692005a637b9ea7da6a01fc10c37aa31e72 +1357500 db1a2290db3c8daf8e98628c40de320d54248c85f0a275d882d9fa0c077fe0ae 60975cc6af2a67be2fc1e1e2d996468795a6df77a40ec630b8b6137841f9bb8d 24d173110006536cfc9e9fc8cbb5057830af1faf7159272623e622e83d98613e +1358000 622659842782032726cb02029cc1b60a3238db2f760fd830f908797271e6da71 3ac95814d20086330bb18fdf045db19db8b98f888d56c971a6d83b07b1ed7545 73e71d4eb55e51b98862c1662bd61093249cc32d3b9d53b91327e45f0b207ec5 +1358500 c3870498c6e13d7378a9b2979afc44c86a658c6ed0fbadfc8d80d10321a04fd8 e2683c703f97dec1616d7fcf95c5f110742af2bee8820e107378d5f6be3693a7 b58b3be70c6c41bcd584e324e21010b0604d3dea3b4f5e294239e2f0d72cce88 +1359000 48bc6741c874c270c6506ea68e14f803842fc3a045adcf41aa70a7f952f748bc 9fe96bf9be9977cd7e1e844d796420e9038d72506a5fa8a63fefd68cc6e51724 71cd975cb68cde056c2171cecbb94a27ac08a68cd95cf02a17298923c95f101d +1359500 95d98e7ea281c485df5ebae662a340402dc8fce0f7a487c3c1616e52286c79d4 e152f7374181d4539302d8d5f3a96c87b73dde4de9fc7def90cd82a4efcd47ab 149c0bb73bc9cd66e393414c282a574da5ff4617a7591243969312e3b32c7067 +1360000 241fec07ceca251c63f9d42a7d1646f66df2ff3faa6c4421c35d874d673f33c2 fc79d7e5d2d9c034da4344d77169d651f881e523c013046060c940849b474cf0 0bdd64b0d55d1880d3e8b2e36bd5c8bc440f39027ac404fdc27ad1192354a269 +1360500 7bec5df362dda54fe40aae98d9442d978d5ced91cad5febeb88dc4f4950e4bdd 7e7080775fbb20f5701d23713e5d70b8a24ebad406de58aac3ba899d63c1635b 01500a609d11927cb2189d351bd7d899180a3069f4bee2216f796341df37b1a7 +1361000 87d2666d95d14e3beffbdd4de72e7ef6fe60b0363e4fac0316d5afe0ff70dee6 242b9b14e80c5d87ed423060bb6fc808c15bfc0db548fdef08f27c6477464941 321aa04ef491a9292d3650b58afacf92a9a08e751b1dcbf92b295a128afd212d +1361500 2bec2cbb01a7e84bce2d3436dd83e5a712175d115d6bf915b240fbb639d46078 10a016f5ffc99d3a7771f6d3b4a4f767752fa59736ba95547b1d044d7e4a8191 c46c364324e570a422aafa228b3c29243475e073f89ab6d0b3e991fed49a1e73 +1362000 efc9b1bd796a7bb73e188e64f19dec202b931120ec1f1de995e239c583016d68 42e109e011f018fc0e803523c87e396923d7d16817c8ef379960251ccecd15d7 8a8fae769c5e9a74ed2332f0994316c9c5048dec873b08661fa6f579e36cf0c1 +1362500 0d00ee09aa83572f4619cdfcae958f07cc5754d85aff7308bef545e31c0edebb 50a127a73348df1e9d1eddb21d40cb8d96053f45c63153075d765953a5e2a995 aa590f65fb07197eca278d885828a25184c5236d425764e7a2497e35c22b6415 +1363000 8ac5d4cb7ae609dfd5272341a74785d21a29282089f80e1eeab5d8837e158007 fdf588860fe92ea12accce443758ee8c000930eb3646e1cf6dd1f581ff87df47 76c13b9ce1d80e442619c3835145cb000051ac099dacbce02c084fd8981020b6 +1363500 2a5195f60d986b071d7db1ac3e8fd13bc0bbb71e1d0fab407b60cc5fe83bfd5f 283de2f90e81f2f5b1e532ae4dd1da1d78567ffddc28394f03568bbfff455178 a7413d18fdf8fa29e161700305ad0c92cc49150a3842e08d7e502d1f01afa467 +1364000 df9b9296cc777b283b5a036c3e556204c9fcb25ec05da8ec4dabde8c3d13d7ff 322738792414a245c0075e630cf15dfcd6426c2ee5db743d701e8c8314bf8399 6fd14c20efc93e4e3d29eac05d09fff67936cdf7227b69aee5dea8c3d847aa97 +1364500 0e040bb3819a52102bed2a02b2d916d3a4ca27ca70581fee51c23be143ad7230 e1367dc512b0346a68fabea62adbddc575e6f46864aab790663318b8920ab115 6a6399830a202eafc0830d664ceca07854a404608e238b52f19256d8775b798a +1365000 7b5defc26897749720c6df07cdac18c52790d3e13d3678698aa100975198cc3e 8f0c75756bb5f45da428b16f2155fe77b85f4a78cdff48572d7e9233bbb6993c d7d3f08ada41cfe67a839692ada105459068fda83185957846e82eda06bd7084 +1365500 bbaf0d42419a72d2c1da75b77c7ad79dad79e283b56f671ff235c7f715fec350 ba7960c169371a86cd27743a6b3b28497f9411d942ab265b0e624f1743a4747a 1416e954246cbce0f788fd78e27ac94da11144fbfa038e2e76476f1633fcfbc5 +1366000 0dd08869a4673ebc933367fc785064583b523886dc1bd080cb5721c6b65e723d f0c28af3463c49fed6fa0d56f3cffdaff119da024bb18de553dfa03e99dc8d30 ea7d879e825d9ee04f06c07923ee85364f9ee41261a499091b0c552787d57e34 +1366500 7809434f8bcf2bba7c2eca9669ed3e1689ecd89a99d8586c4aecd37c0975e173 8f2457fcbdabc3f312d6b6ab1fab4d609a5ccb891e3ee5cee03b688e9272e142 da19a3eec131221757c6842f77fec09b297346af66d8146351fd909d6fb3743f +1367000 962f40b77e22bfe25904095e6ea6394e12d7514de0477dce1d4addd1d6446751 cdd06a2200640f4f0c139903e97c69cdfcb27784d6527b6b2e61360fa6405f91 d67e4e7550776c748c563451bf98f23c7346efc77db14ac717415255ee424592 +1367500 3f0994031ed4168548003ae429ee8c852a35f6de73ba28b1d019ad0d30f1e98a ad884d324964b4071a890780e669a3958a8633c725ec047cf68c5aa9eccca305 e2883086e4efd4b01f8fd4a70cd5e6cce491f3fe14de80fe933ef3e993ca3719 +1368000 4be76ef559c9544e0668fabcc76d4af327efcda792b5540ad5f4d877a1278cae 4c28a50dc5f11ff56e50e1aae05fd64f351bcd58a8ad88d5fcad3a8ac98803f0 b7c73f488e38cee6084ae007214fc7af93be1c763f1ac00591d41d7e906d8777 +1368500 c76240472a4ac9920940353d65c5ebb4d61e349076179aa27d7867b683faf6de c8def91415ea539f8613635a8686bbb59defe4a49148dda8aa29dce7b9caccc7 bbc6c21b9be1e45ba32711470ad80d567be0732eca335eaeda406ab3950e1706 +1369000 3d5e5769fddbafb4fadb319338322cc8d21cf8f6008b3e1bfabb449d503b7681 596efc6d6c59be4ec01fc472d73ec88c727b7944afb9ef851ce1241fbbe29ca4 082ad282dbaac5719fae620d6f17bc23674fdd9cb173d6158e68a2aeddf4e2e3 +1369500 df3d052dd89cd6f13c76454a5dc501a304143b3cf865cbe660a1ada94b45fd09 9b16c27f1aa7a2bede65e22f052fe9a440412f78afa59abd2d74c459a7c0980f 214634977984294cfd9e53afdb66b02fa64c27b3075fb69a8d059218c0213977 +1370000 82901017ed0a3c9fd170b22c8a3787fed742171774ac09e7bf6e5cc89c4e102e 59f0aa8ded3f030973e9a2ec96e6adbd7be5277850a9de8fd2fccff3d9bb06f3 7afa0c1ff8e69ae738ecb851b7b2ac0dc8ca7288d22ef44d12cf618aab82b892 +1370500 fe11b801da5e7f428cd13df2f1f21a56de1cc0f6b147a0654561501409a24e53 2516fdb36080fcce7e2c1cfc41f72d8d953cb005c47a7086dd64eb5e8bb3b9ab b87df119c0f729d30ba2f47c8781ffa71375aada7676938352fad0e2a1060c58 +1371000 e42763989f9c35e4644db2f1dd3970b0409817a73cf511e19d81a1cd69da20f3 2dcc7126dc05d375064fb213ea7a4989a05c8af81105dbfa2d29a0f6d37ca511 f180fade9a2f89ec00ef9055eb7b2b8db05a1d9022e5f05a9a5fe0250bb517a9 +1371500 7ddcd3c33a18db03ed734c2b583cf6fdbb258987711f3abcf836c26cc5cf1b4c 8a14fc9e85a782911697ae37273b7f6dd97a6247e218e7bb3b7f24de39a05037 67b6dc3e02e509907cded6fa65b1666b7e47eca3da28429ea35591782cc34d3f +1372000 709c19f51d172d312c56ef54bc785e32b6737829fbaf445b704efd5763ee36ef 5b2b82d083154c4e8bda21f3cc331c00266e314a5843bd4507e901aca9be457b d034490e45370ad0949cb7161fa7674f90d155ab0ee751e5ad82813fc4f14a55 +1372500 6646e0b458172d85a703c69817185a9d4616f257d3e74ffe25294f48994981fe d91fb8487fd9f865d496efde1dd741295ee5895acd1ecfb8dbfcaccd7a754068 78e58797920bbbf46bc69ceddd3de83bfa0345347e0a034da8cb819054bc112d +1373000 2cd773b180fd742cc31b9ddf96cc0061d43610fd2949a77b9cd6a93f8459f36c 38361c67a77e27d29e85f02be732b5f41971807b8887641addde9c3459d7badc 6e670df912b6cb2ea6d1ba05ba0ef8d78034e431b7bbf18b55f0ab3ef10fe006 +1373500 003405687c50009893335067329eaa341b128dd41776915e15de96273c1c939e bd893a9459353ae34f98bb4ac5ada0fada86aa2b076f4a1b9dca2f7f1d55ca97 7bcc8ce71cdbc3e27f52f31dfb94b60191459b3c9327ceab796d0fda53d75324 +1374000 66ebab13c4df35b8b50a127e24a713532e065864d104628a89c821853fdc02ca 9f41f9a5c55a3b3a8943b95534a6e89a32bcf458c947ac42e49e90b7a31402d9 95f0fee55905997fd1ede6bfdcb4f589f658b5c07dc81a79ae2e6c5b087f22be +1374500 7c51fdfc1280a845d1c292586899486e8b9bd74ecfea6b0c7a8866ee4193d815 560ff2ac8636db352d1b203cb460b3d516c17a51596dc4f2fcf9b8b2fd58982d 4a7f37f746148e36dcf40393384a7b191b5af3b88abeddf905a99f8977f75946 +1375000 8c1c7ad4ddf661b6696f09c5a215fcf5fb580e6526fbcbb1d56993a05bd9b395 71fe38608859a86b870b47a8d491288fa7d3ad049f7dd2b08e6d8fe41ddba7a3 1cd49aedacddb002f579c4c63b1ed4269b1aebc57423f56db1cbfb9854a1d6be +1375500 131362b82730ed11258dc186a69fba50942190b0af2cc9916290ff03ea128415 fbbdb2968a466b45f38590430297f763b5788c1837b45a33f514da32df05233c 0a246ff865614f6b073f23fae939d0b33aa7e731cd305195302fb7b4f9d75f6c +1376000 3d0f47dde43a432a0ca6bca020e6464e47ce1e47f583089a22cffe57b8bf25b3 784b1707faabb0679553ca65133edb80cae4d0675673ed3aa64412610b5ee0f9 540ba1600bfed4230cec6d72386ced851b664893017bfc9a61cf95f324f27a76 +1376500 f7f6daa3a21379733c6db7a50ff0e50fb01be614e0104f7f7a245e74cb841409 a095a6b397eed365dd40f6630ee8ddb2861624fe9b09bf3a6c3b6ee3ebaab5bb a8d92aec31dcbcc781a5293048e73c10e66634ea9371741d86c11aee4ccd1119 +1377000 fdffe12f78dca9729fbce3738e670c5e06caba1297bb60433660bba40cfa536f 83617e218464a4e588996764943c7d99673c617749260fffe93390860b8be234 8f22f18117baf3525c8ee2e118f00baa91e9e8cdd5372bd88d65eeefaa1d71d1 +1377500 53677d3f2433ef6b8c7a21f8b5378c87477d077c50c5c98920fb8379e278b6ad 7a88f0a4d5b7f5603f7dc441006bf1d696d8f922ac99000311a6691f6b8c37ef 2403ea937f3d43de564ee2d47fac12d511c2bd3ffcf19ea450016f6c2c6cea42 +1378000 059ea3d05a44144a98f878fa6d96e7a42966e54decb823dcc8c831f959accc2c f9f079c101c061acd1e157da58643abc3f4c57f5f318add638f296959430aae1 7b7339aefba9d1b16985e38d6d2d79b9e7eb741178690d55938e86d4cd6efcc8 +1378500 757ccc07ff0cf1917930c240eb998b3e8639e3675d11d3145f8af10f8559c02c 16346ca8e19e8a8146d7a5f2e33137d537195cce9f93a7a3db1e8bef0ab99763 e951d445d1dac492035d383d6abe1d3e91398edd3a5dc5ba891236adea8092e5 +1379000 5b36b30e7b6e80a37a03ac28feb2737077d22d049662b2d9520450a0aea88b34 b2f38cf9fd0cb0120373171374eb1a73bae4759874a83c07dd93a3746f2da967 d05a569fcc9eff6131318eeee2a079baeeb3c5832031d50a6d02e9ce5ed4c462 +1379500 ca6e2ecaa74a026682548eb0391aa64a778898327d66daaa397e9309f0226e18 974cbb87f0ced5598f43b2b74627b970858f168782e911803e74b253f091833e c20182944b16fd862ea73ae4f2f01282ff9a9a6fbda4c9673ec3447f73697510 +1380000 29df1aa8089215d19e7f9d97af769a753de3a1927314a98e4b66849c0d85e441 824abc7c2328e5c6d673b61bd395ce6f08ad4d694dfaaf06f5a11f27eae48a5a 379223f228185396aabb01c490f627cf6760840c26ba08cffca50511be25ba97 +1380500 50ac8d86f2272a3e324f7cfc34431ce3b2408f1f10e1c9d6cd676926de65ed7f f328142c777c439f93a41ef439efc9c8171170a8cec2349edcb73be476b0ea49 6450fa80013359ebbcce87bae9e3fadb6e1d4c760c1290fd143e623a8b0e22b3 +1381000 7efbd8e797d71e40598cc589b6036119ae31cf3065aa9a50a2dc31505e954d44 2969968c2995555ea8cfecdbfeed2661178647474a419407431ec159c819e5b6 64f966553c9e861612487341b68befd2d76848746828d1200f3b5fb6c1a0abf6 +1381500 18f71582a3fbf581a54287cf034fcdc338b9919ea3dcaf1adca080536dd44518 52b1102780eb1580f8f95f23adbdc9ea1d6fcc59ea1c9a59b39bed8c9d3db2dc 65664d2641979bfd545273d4d87e977516fabc7656bf8e72c65def85786e60b4 +1382000 f04eae4da4c932919586b83073c6ae816396affb39fa3c9e7d711c477b0f4f01 352c6c912943151ef946d6a63dfd1b49b24723c2cb8546ae576825fa206eadf1 3b9f36f62b618c97b525902ce25c60b78f4001876ebb395f2837b6685d028875 +1382500 498442069527d31f5e1869dade38cfd68f4af9bee2a11e8fa5aac53876c68f5c 9bce2522d2b6d1842945b2540982b67bd25a37ff35254ef804762d0e8eda40d7 68804cb18adbfc571e404f00c6eee9bccd2d34d0fd18528e34473edfd1851444 +1383000 90bd1f97c316355252cd4617a74de440303a4b9ec1b43264f9cbf122af6da728 00c41045f4aed48883018d269d0bf9a0af83cbb2ec7dfadb4b14054b85620baa 4cfcb71d624a7c4ebd997a5085a5000f6037f0b789664ef389895c8d070d94b5 +1383500 b341652f777e89b7c10473ffa0edb6ef32b9db3a0cf5fe834d14d340c0f501f4 2928e5d89f96e6b0d8f72727f42c5f27d7ef64a642709cc077d3aed5f653c3d7 e902bc0795797ed241da559ce937080939a0b0a699c454fdb60027c560019fc2 +1384000 8e7d3bec636dc0efe2906d5b32b652f1b8c63e307cd1f8f9bb62dbc8d3f91482 393933a6071fd7fc1cd27036a6a0cf5d2c274c8d19288df155974c4d16e4d7c4 b348713e32486cf429016011cf9fec82b7d1b1cb9b7533eabc934b7436cd2c4b +1384500 2524e1055ccf52beb59f566a6df92967480b440e31c72cb595faf50aedeb7b4e 92721f11c246e0dc123708f3ea3386e2af7d658bed413ae18dc20ed071804cc5 1c32df272a02cd86a314c95e33cd42ce287ca839229e9d98341dc1549fef3a12 +1385000 a3949e937db9477b440924d17eabba6df130315abb48a1a0cf4c376520024d8e 8ba0b50839626f009457414e892b0ade6f6391330a7de3e52ee8cda8d4d14843 ad2a7b142901684c2cf34808fbc507938b8e94abe8d907d78f49f0fd04e65a45 +1385500 7aed6b2bbc64a420adb2f4a876d8700f95286ab556932625e2388c86f5e64ce1 5906e9327170b4d080f7da835c01da4b0dc4c3cdbcef6e15ce565eed5a34522e 325ae8524ae0a48f53e85e0a064e5877bd24c21b9d48eb2ae075c71b7506a91a +1386000 635e8e1abdf01c40c5f68d897dfbd5599ffd8b306f4f12582a8beec39bf72b69 e32c26f7f6b2fb6798e29dce76a3b4f7197929a52f79ed1bbe65a384d33619d3 71d2689f8a01b81b332a7ab5cc31f08de2abd433305793c7a47ec0d4e4ccb7b4 +1386500 637b7737e58ab3d29f10eab76a186e1885fd47a221989625b82a35e326d145a7 f577cd1255398c716ec49581577a4228b1605957efb97213fd72af29fdd05919 7eae923d32bb8c50cf56fc9b503146a4ae8a6c5428371892624ebbf6e7d32d29 +1387000 d5aefed45fc4bea9b4bcdda1e44860543a878c2543d6546aa00ac9f503a725dc bc5e3ffd23093b15117ae932b3ee507f0c3a028e35e13ee66a38a933cf14498c 43c30f22a4a4a3ab3cea65424552f1e0e5642cd27808a8ffbacd300d89e82e9e +1387500 c34f7f08569aa435eb7742511015f03b73013118df4829f69e61740d35243995 cb47363bf5ea2f8327beccd1736b90c6b6cd6edc33dc3711de07bdb729d8e364 3ed742a1c460bbbfad7c6a09f1ecd1eff9b5fc724be35e1296f847060472925a +1388000 ef335fce6c2bd02b80af60285b4f0831f36e4fc365cc99302e55255dcaa854db d1fafb75a76ee17caf145e0c95bbe1418d4beed03e25ead8a346b960db22273d daf51e1e81cf641f371d57dfd8ffd8cd178345b0c65a3e3fdc2a0be8e936cbb0 +1388500 44ba1206fad06ca8f55cbd10c9256901e0418c3fb0e0691f3e809ed7fa6a0df0 1edbb4bc57de9959ac04262c845d80861bc5610b2495964e10806b76eb42a4c4 4c24f229f4d38192fba827e16167eba98f68bba783e2bbe0ebbdb023370f41b0 +1389000 605b93d26d873156688df6136a526f83a8aeef557011bc8059f4d4879c1f23a1 3aecde0b1a819ce476e787e271da0ba15b709d796ea7b1142bb6a08db2f4fbc6 f3b27d8eb85235c72bbbcf400f90c90d9932e8f8a2e92c68328580711c140cfb +1389500 ac7c64616575385bd276448132d9695c124a046ed46135d75a8c40a2193f3f54 d0515e04bad6b365716fa2943bfab9c39f6def009b785ea3e996b2d2b505bf5d cc3911c857f4b72bc693a5f8829c7502e8d2073442b18a13136d25c9277953ec +1390000 a306ca12aacb491586e34c6aebbd4be0054b193feb7a4ff2151b702db8ca73db 20abab754673ebe7665ff38f05f18d1cffeba2850c0ecd83e3ea1aea1598eaa5 8e3920c5953f603d782d0eb27499b33d7d6875efff42ad5938f523e71a78a41d +1390500 9941411440c5ff87e6c55de41b31eefe027f9a0de2c62c0d0267c1e2932f1396 dfb99ce37b2622d27ca46bf59d5c5df6752bec6958a6c5d088e6058dbb2c1410 5f4b85e4ddac5bf1928937b28070a9e1e20d57637c8f6ceddb84303d92d3f6c1 +1391000 0245ba8f313f627ffa804e3f0a7033d04ddd6e5a67782f825995c501cda982cb 7c77580d8bbac2c9583f5efe19e99ed0f5ed5495f8a4133e73e4ee9e6e5b4d44 4aa2fc5935d2285aecd8df81f429793fd6e6daa948a976f704d9ce696de9f016 +1391500 f86d824dda22a04e699d8351ea69d65d2c22825d3629fa7646ab9012d7a4aed7 d45a8b92a0ef4d348df77c0d748602d8b22a719d292029ae58eefeb2416f1806 79abe2a4a8dfcb2db8de877ab501ec2b5f4b4f2830723f5583370522204e15c2 +1392000 8ed5a8b8af9cfe376e62999351b8b364f182fea13af8a76dc5ed2d9433a62fa3 108f435ae8ce87adee70709514a024f7837c4c761f8a21690217e62e7b202564 e5da41c595a5c816a7b071863aa4d9a8276b0a344941f9a22bc149a699c69027 +1392500 567a3b3aa608d68cb04e9556562ad795e8fed26e390093209a6df669534f7fb7 9d22a222c28182008061f428cf6fe962d1a2bb47b5dcfbcf6f6793f93f3bcece cd49f15edee14609f504a416effc63a067289d5162de1d6b3a86813535a89158 +1393000 cb4c92e31402a34d755675a2e0d7a09dbdf45d6dd47f058708a3f74f15c2c328 a8f0f8d9614f6800670cf397fbfaf554c6f5b942f42bfb302c2614098ebf2441 157ce92b0bc9acc24c4a3ef547ddb558a768d5fa337af39ff25c6a1b2ccfd47b +1393500 4ec601ffbbfbaf55fba1be3787ee263cd2bee49653e4de02c31a4c15889633b3 ef268c8cca69ac5e9e1305686d72771f9fce19b4d18fa03c8df99d59faeb30c2 0bd13f7369506d884ef9ab1dfe7759aacca5005d4ab72579edc4964682968e61 +1394000 8b3bdb74f77eba1248ea7114edd15905c94fd883f81e9fa04fa87397275a647b 0d6a3fa98c56d94f7ce4b9fdbd800eb1bca305c612b5a10f971e6b274bc74b3e e0f8c19673d7b17ab5048f23b66745090c10895df2c3b39a064c3c8cf813e91a +1394500 6b4df84282ece1bac75bc13315fc9c3dbb1695e387c5a6354cc1181e21a3b0a8 26682914b5c1209da74e2eb42fdf39f93d3d5e05aa6b100feba849058cdde53d 6e46726b2fe881bd18dea4409168ac89f1d74b890df19aee9eed0b47874f5745 +1395000 e8cc3d042762b0b1a346eb9fe5217d082f50bf0f9de1ec58a197ff0d2503c161 9fd20576f2944f88fb26dbf5cf55c2408b60cead32c5a221429c6a3c25f1d58a 0fd8b1278f5c6c080840196f61a8281866126cdd73ac79c4fa13e6ae5c69721d +1395500 ad149d110be0585f88ed92d43d37946a006138d06b3caaaca6408254df3ea6f2 7b21a1a28aeaf51ef91d60139b7563130b47a9c815e0215d2ebffdef229e4ff4 9a7a2ec4d702e6e72c014adf0d00079f2425777e9e3351fca969b86b791e0b0f +1396000 ddfed3648f113543a8121db4408a2ae06b31806b3b1523a8fa1e27f1b6d9b872 abd8bf2774c1e70f90cfeb2a3602ff36a44c309ae3909c23e6b3ef790309e95d 602aa3edd48c2bfa1a6fb1e1e3337f748601413b3898668b74d8a7179d488585 +1396500 57fbdc9b1f8ce051a992781530e611ac606bdbaa884c76a40ea57ca084513ece e296982a809ae0dfa2528a5f2d05ec4ffccf5714150f2b279450675f0cc86f5a bdd1b3ee9e2ad1e7ce39311a35ba3b4162671182037bd836a3a4d7db42d79739 +1397000 86c1e2ff806291362b658869da53158c1d0f4e2e6b3dceffbc3f1746e877cb99 014d2677e49ce0200f6ba92b6a3d56ccc13a99a7a590a1f2a4400aed20998ae0 59d8699c09d5a1c9a8fcc93d935d85926e5b7524d1c81649e5531bfa29ad6aaa +1397500 e2d2ef0136f84444717f9e4e7a3b957bd605d6d2329f39da9f33a28d2e32c5c4 949e57fe7f7f06eecb0a50a1768df42cdcae06cd04cb2a7a22ab7ee6ed22e487 8793ea706658d7d06b662eb120ee38cc24aedcbb5aa536949f02a03e6bb187d8 +1398000 1c988d716315f43304dfd76df87edd8deced32fac3a10acd11ff31af286becf0 159674f54b80192f4231ece388db32b22d9c01636d29176c9529c5db11f7c99d 9c1b0b608647218cc188ab844a03214e9798d2e6c56769b2e960c0ee77ebd5db +1398500 e9358d427737bf442b8817341cb966b25a4a65834137aeed9fef8ed02f4e51b5 573f6d20764b27ad008db0f5a5f4de00a111dec6a046131bcf69b79e537fd9b9 63d03eb324c79c1a4e76f59fbd08744c9ce1192cd7a5417f185c4b3bd37de377 +1399000 1a76362f98f4a65607bf15f39fdd95b32d8cb8cc8a997ac52c8684ccf4c01832 6453f54f195185f7b06bc9e13a7b9f01e1d75f892f4e36307e9bdb065a57f17e 7fcc1a4084174ef6344564982fe209cd1d4cf9832dabbe9312a94a922e271c7d +1399500 1d96abbd52955c2ab1c1958767b2f07c452e78f32410bbb91083adaa41a44137 27396fe948a950e7fafc692db367cd9f0fdd77a80658ca4fec9b119eff15fe3e d85d1108114f726d401d5767c674e3e82e5c7661b2013bbc1270767cee79369d +1400000 f9e26fb0dbd2829054b1ccc22440cafcbe5ccfc93dba5629205f4fc163ada5f9 ff79fdaf77303394988940c9a0e49609cd6387e091e72b5c957507940646b505 63b7fe7d2b95a1de8169326800f1b62698edddfc5c372a8895452a5f10e2fb55 +1400500 40f196700baa6bc6022a4682bd8d220ff56ecf6900b9bfecb3e1372488acf8b4 f2851b1b8e443a8e43e20f46c2cd211fc7efe7c75be4f5bd9a0cba95ed379abe 47f5e9bc99c0622e22be876d081eff785e177922ff7a84f3c73fdd3260844ade +1401000 e365daaba77c2ffb8d6b2e14061fff7615b5344763fae293d9333de96131b562 89ff19dfeef9bae3694f7e475d21d62956b9968ec33a17c4cedb62a099f70c4a 517c8829f83b7a935d2f274310a28a7cdd6c50b9f407d93f640f9e1d8fdeffa8 +1401500 6a560a76676d91c59aa21e2cf2d984f87101c3e60a2625eb7a438054f8f839b0 091bd3575a64bbee5da7a44c42ba2d46a82a48f712b456c6cefe57371331d695 ca8872683fbb0e8ba396f436d85faef6ff2cb9075b13e3c514adc6a9c3f72513 +1402000 62e2f52a35c69728af7b28d9557bd2dd10742589d8800847b3264d865017be1a 8973fe4e9b4b2bda7950877e0e3e67b03857f39c9c040fdd4cc81d32921cd137 8215ee6145bc1e07819afdf00c33927ec5d23003e5a2c04bd4889dd8dfd313e0 +1402500 895232cb5997e093c701c37b123c689b69ab4f90bec0a92cd810212abd856750 5ae61f6fab15fe5a11905e85e469899453cc648bf59f7d94e33f37e70301a155 23799703c4b59a07010cefb90742f7d80df6f6cfe7ccaa3c6124a4e1cb602515 +1403000 88b55cea21ec3cd62d61782950e5b3563f3ee616d01ac3f88b72d8e28034c958 5032567f685ec639b4023b1ffbb11017f4fcb4a0435fee1d36a7d56ce944f2fa 8a2a6bf7420ff1fd77c4ff5006523a2e402bd84582982b98ede9a9e98ac650d8 +1403500 24b8a5636840a8a983845a420a6cd9e395fc10e5793b207c6924bcda91e52528 a5dc1ba6b9ce7b9762bea6eb69ddeefff1c2dc424d95379e1571a41ae926cf80 88d951cf6b865204379cc18988e537398fd2a7ba99da71544d3c348ccfbcab1a +1404000 fec3f803dc9b2e03c87d0491ee33b5a66bf68de499315cbcdadbcd3dbb0dd8c9 4a3c99af482ac1e4be859e277af80a59761ecdabb83f2396dbc4a0c85defd4dd 1ae5689dff2aa1795687fd5c5b17dbaf26879b8c07b651b307c7e4088b13a8da +1404500 e6288b72c91e6c69455d9bc42dced7a8be3ca2ebd5eadfaf4aa5ae41d203be83 2265636b9463376bf3ffb01c926717b69d103bc74a96a716ddcd6b07403d41c8 53ea6c1b6a4c0e1f9b023ba942717e364e6d074edd677234d1b3cd81d2dd99eb +1405000 b03737f29024ddc3844e876205e984ce3a6bb2f00247804a9ce4fc0f6bfc9eec 12148c0a89728eefd046abb7037a1bb38db8237586b7ccfa3eff80f31af4e069 f135686b3992574c3756e92583e89bf5e91b93a1df5528eaf162d7c161d3b9d2 +1405500 747824fbee194e1a5b85c96bc65c7af925ba6f648333f009a189164cbc3e1e21 be50d9853853596f4ec24da4d34dab2b54a854e6fc2bdb59e2f2f24323eb6fb7 56b510a6f97907a7b69e4ef38aa15a1057f7ee16f98dcbee34ba767970474596 +1406000 f817422a5052185cb6730097d2bc8511663a4bdb8429a33ada551e5cfcc6c62e da2284709ea49063f615345094be82199fe4b8c5c942324f058d53d918b2016e ad689c928dcc83eb1605f449dff702f5fc2b0d0ded5a49ad95d766ffb7bf00c3 +1406500 e9644dd6a0c430ffd8d3b4399ddcc96c11c2cf26c14d6d7e4126bf57eb8b4e8b ec4febf2fc289f43698b54b761f90923e48824d74e7392341d2c1d9d9d6555f7 d5426f0fb9b399efc4b1624f336434738b0f91c4a9804b4de17515069eeed6de +1407000 eb6e504aedb8afc6bde01ad745859bf845792aa93114a3694938786281c0a500 86dab15c1c415b66950d165062e9c285fee733d56e83f698ed3b2861bff1924e c28159ccb54b33d975e30cc3aec2d9896a082606f9a848a56f6ecafa95269c10 +1407500 0f381161a4533d5aec9e9030344c9fe8e208d2a973e22e8f4d5c88337428cc26 302d82ba0dc4c30a5442924631dc900ac8d812b6f6d8a292b885c0154157a946 88256f854cf7a9dfb8e7c5a08da513966ad1912ff7a6da3f6f6277e1d1f00199 +1408000 16e77c5d52a0f98077a0926a49a7209609b5e455c3912c84dba8899cc6e1ba11 d1e0966c8061240fc3af36473e76607471783aeb352b8ef2191a7c3526b1b495 e06c478ab5ebf0e5322a40434dd97a686683bc3f207b0dd8d077169075d3b41e +1408500 fb89f173897a51df2495064e452be7e4d5c5ce41597fa36d4f9c72812bc29b7e e4142511b775d3f4ce513993ebe6239b9e9905e1844ff721f3c7d89887dde717 ab341240c5c3f5c28207afa6efcb87aff423913d9860da66de3b9aa2a11db40a +1409000 6b1e74580c47b859243cee2e2937b1e7402f13a5808005c1fa542e89c3fb4b91 4d87ecee76e5fd1e14eefb1696b61bda885bd8667f11d4ea8ccff4d0ca01b394 4ab7e430257185ebb78ba69baf775a69ac51e5c8644992963f866ff9859d621d +1409500 950fb96dad70cf53850d92f78249bee78e228bbd2b946690d627bced8564ea63 852846f21fbf8af1443d919fc7b2a1b30ead6aad18098111f2de2457492e91ca e62e4e3db06870261141ca32bfc2ab2ff37580027ce4b93f5ba4475f139c9fdb +1410000 5a9cc3ca5065fd7d7a4dd74a370b35b7a19a218f79a48e2ec4efe25da41e9925 7d6f9f6ba0ecec30d7f6c1a79e0e6878e420a7af8d13046c7076f4efd570f630 9d76d49243410e349c36b144db6ea0c20ec1fc5d6289581315d1d87a2992a7e5 +1410500 94e419b37a6248dc6582842f9b5066840f274bb1a370a4202a008feb2c194a9a 9db315b6c1da9d704471326fe74eff7cd2615ca7323e6d690ff6b67a4250c049 a1f9d451fcf5d461648072d745694da9ff7918361b61172294f8c5a6db744027 +1411000 cefd4f2796001b36486a7c34186b2d6571c8ed644b3a95bb860f4dfb7789e5ad d8b16beeb89ca63dbd7a1966e415c95b7c88e9b3f44d5bcce9901c7ec3e8d913 dc26017394cb7b7388b1164be63148ff523856abddf3fb07003ef0f4869046e1 +1411500 d78c92f93901fb5da49d5642f61939c6acf47ff7b85e46be897fef77639fb86e acb9740da61a9c14b0b2c05f24f9139c44b12038f01d6e21e7870d0d329076bc 496d9c617b149475b1582b9c72058d851fad2578db0b35bf10a68e205fb8ae19 +1412000 ccc9ca6a3820c60e954cf1ec056c081e1f7efa0c17e42b2b9b25ddfd1b49da99 a1b8b5ca39d4844d3fdf89a45b634b7843b5957d61e256a7c6875ff9baf24db5 e05296050ac70909e3752d134971600801a454040e898861c506eaa829fd4b1e +1412500 af71cffdf5d5119bf2aad25b61e190bd6caeafe6c1a8908a4bcb8bfbabc3163f a6e63bf39f1c63b10919b557ab99f83080e165e837678148f675516a499424e6 1e9ed36915ea31315e8091f2ab8ee7c106f325c998dc9b63eaa452f94104c47f +1413000 a4c932111c3231982f96578e64babf22180a76891fa27d130baf3306ccce2e9d d7dea9fc0df8fca7889f93b6cfa5c7e5997abbfabf6a9592cca2fbab986f67f6 670cf68ed5e622f8c272f3a970b0cafdce33819c7febd56716a40fe4667fc50a +1413500 b8684d7fc2520d819ff714d60bc508dacdaf09f9b1df2b7a84cc3f066465eb19 fc7a7ecb650810e8edd590838d9e1bd3006b4817aebcaceb810442614ab9d663 9cbf74c74b33e156ed3e82261cb5fec2d13d58be8ab256158d6c437f294b9071 +1414000 1edf1f7ede292d4585bcf50725138809a78702a84ab867625239733afd3fed7c ad1936ff92eacff610bf29052303e097c61dadc7d7726aae52ba1d47d4f47acb d4f7646d195d176ca2f3373098a8ac118863bd45b423aa055df8338d4d9ade6d +1414500 505fadec80815b314303496dd791667f44632831bd6b36b3bd2b1bad83c56032 1794a5aee791877596b08586bb535d9c15f497a5391b1c4c97e5727cad42496a 9a73c6f21dd4d555403fac0b8bfd984da7c31c9602049ac42c0ce9fbcfd8c3e3 +1415000 a252b0c5e93c5d276da13715f6f3f781b6dddfe7021feafd41eab649fb42b029 918f9133e6efa7d67505d9592bb494615d1626270faf69d3b1020fee3e5316ae aaf0ad1223cd5315052e97d5a616a8c9d4d4fe4862c3d2cf5233181c0fea9630 +1415500 28c3176d903b9a18b09ae776b9e3a4fa731651c94b70b5a7accae6be798f6560 9fc07a6757d65e9dc3d03ec1ac98d53b37e31b96e37975b75e5f4d2d63c1abfa f1219feb096074bb1f21218d2d93c62cad06c77a2a36a5566b860eb56a806541 +1416000 89ddd5196ddea6682607095e9be7db395712708721b99aa9fa1dcfbae4497656 4213cee15df015b0872f3df661dd6876d134d906c23b8a37642f6882559fbb69 be368631e8ada4a543872bc060ec25a1acd762313bfe89c9f954b322c00e0a0f +1416500 6b8637c56f7b9179dea71bad981de70b3e83e2fa4e73301a76abcd092917bbf0 dbd4a302d26e4914e315fab898a62914ea41c17a65197897be166eccebfad01e 15c11cefccccfdab1f43b5bf7aced83a73345e58a594f8b34fceff7c5d11dccb +1417000 69bfa2ab9d8ca6dbd25043fd101c11d900c938e8d6b3041e8a7fccf19afbc15c 840a4375bb66a8495b04942e4539c7ef95e1849a83bde1f92fc6509386d4e045 dc0c1d343a98607008f3662d4dddae0e8d98210014b9742ed5c83de7339d7948 +1417500 442c09939727b080b88068635a6a81a7bcb26c3ca250d2e3397e99078f1afb9d 00937dcce0bc05f7a1de57a00e51491c6c0679512c8b4f800d2cfc01e19d3f01 b7155d0f396bed1fc14d91d445f3e3e9ea83e0863d358412e000787c877952eb +1418000 3569f30d857762670186132c4413a10cfc60ba623849049211e2a926354bb510 abf06d2de34999ac9509a99ac90263fc90061b18b84d4b3fcc93cc9f8e9c3dbd 6e9b279abaa4a8e56f62d5ed4a20898fbedb27e6c7ab21d303ae01e6cf7bfd24 +1418500 9627283c27a400806e40514bc7e23d29d8275d3fe58b08443523762a0d75d2c0 ed6bfcf4f1e93f1dd55fbcfeb3d3079a468a0c0b8ad48cb6c0e3d9303b16cc43 d10994a1a559193ef8244104168322e8dc403fe5a8667266edeaedc162942844 +1419000 4087787e9d1dde73892bf97e57270c5a8e173032f61a12511245ff7206fc0702 6e7bdc5625ecd5216b0506975a7e01d4429a2ecabe8c4598e584604ca8ebd28b 6c2711691a6787aa296c9df32c3e8af8879fc47fd739e8b4337ecd9c3b2c812a +1419500 f7d5fb1fbb507e4d294633581498d65f40fb5f91f4cfa4652d6b6a6b4a525279 00dd4638b508372ace47a221cbcb2fd364526702149aabcb9ba3c295875145b3 d61825d60023b4e5945685999f9f8dfad60a10557c1fc67a08f872a67723bd1d +1420000 dd22761d1b73a565f4ca27ac4ab5099d79a76df4bf1a8e684fd52b2ba65c2ab7 63302b06b5813e334db870366e09531441d7b0c2be27865f0d7a8735e0c7a75b 86ec4604d63c57648ab1da44731bd053e9c05f42ab4a995171d2f640d34791ec +1420500 bda52e2e5ee20f4be4d26e13047069a73b8d4b1583aa841569950cdaff4c3936 0d952138c239850ef703db1b323c45383e7f749a794c4e14d7654823716d4f0d 499a6b254d6cb88388fbff81fbaf9f72f014292a70e3802151466df04e1de038 +1421000 b537cb8fca3b686801558e74a9567638b5d68a1a035466f25e4016d7c7b544f2 772f0d7b78f44b1fb9019d50ec5037dac9c2ca751f1cb1db01d6817cc06ff52a 1c698a663c6b60843483e128a56554b226a32afb45f10f576212590bb15ede26 +1421500 acbc5037dfc8634454305688ba48dd256bd01d03f664a2c012e790df38934582 03fdcc81a4f0c1f1632545bd9a0ed349722b7e1db9d4496323d5c458de313716 85e91d7e68bd175071158a40cff6e5f2e952e9f6293fc1a7665e9e2b748d8c9a +1422000 2a2404d5bf4ed7399be3ebf682dab483eb9a8a1c39bc5a21277d12c5358f79fa fcc0acfac4e6f308fcbfba4085d423d405219f6a2641aeda59280f83210b2bc0 920edc7892c4861d47e93111dcbe8b64738b8194c668d9780942b48dce4e55c4 +1422500 8bebad21e607fbe48f2b24901c751802990fb9d6a83819f271b9557e7df629c9 5cc828b84c48015a2c59f74e22197b5d5de858b3c5d91eec995765eebba8d9f3 2cf2007fd44150d4088dd1e795068294809325c177a3b102c9986379ce3c8759 +1423000 238f119f7d72b6ca3bf57a296f21c2682998a7f26becf810045a30ac622b8c88 f95609a5a5fa40b8249005e820a0ec5d9753849a1b27c30d357d91eacf28a225 277a573c93f775ddd2efe788e75bf7ddc9179bd292edaf5fb1a9ec16fa85ebd3 +1423500 e549e71c042568111b1dd26f0f4aa364089f58d9f7bc06bfc39080772164c1d7 fe38ba05da5aa2171c421da54c185ee1f385660f589aab5c7e37e53f742526a9 a8945d2b5df103ddc46663c5cdc76776870c82b60e55e3baf24a53692e0254d9 +1424000 908f2b84b09ffdc6d6059e1cc19426cf0cf04689da8e8fd616ddd8a500cb1a80 d06dc5ea71e6d1634bcc675cd0dc6e25cc87acee106c3979e42961174ce5ab45 60d07d83b9e22a6d42d5d7b18a3a831396c6d9e5abb65faed09db9189fb54e8c +1424500 0e57b99fd449d97a26bbd4d86741b2ab3dfda56b0f8cd089773925ca1709284b 28260dafb45e13b2603e4b75821417ff4bc65d3bc42447e448b7cace1c306826 a068ff4dec4c46024a1d0eeeb2b0f9def2ba7b64f5bb5c978c8d288ab6a14898 +1425000 f4c0f2b761f2883431ad0e7d460f02db2f4f2460506814e726a367f83e401cbd b4437ec16383d8477e0759b8b1c7dc2ebebbc42e5fdf95a2544913de2bdfd120 fcc245441110b6fd3ebd5079ed09a400e4b3c9fc48bd1cc60ebc66010c97aaaf +1425500 631484dc1954c331b630800232f61b9555ed3f6d728c8bc40972524c3a476fad edc69a1871d99dff0d288b5276bc83adf4fbe411c33069bab6e2793a6458a267 c5e736a3d2dfc69405420359022ba0970abc5d7bdacaaecb9ad000e5163f151f +1426000 2b0e0bd0a8be000bf4deeba707590b61cb35b7489cd0e1d9536e0954dd5d9d09 c7e70d1d5efb8fa65cd25cd6015287b0eab187787056ca4e61face96ea82897e e9260e6e7490492bf6ba1a0fbc0b9988ac68dce1e712d0c4906f401d02062ca3 +1426500 0e333061d2aed1ece13489f6d9576ca3fcde54fee3ec100ac9cfad5ea755a579 5d6b7abe437393d1de65d6121a11497001ad88a51169d8f4f8c14d64b0a5b0f1 e9edcdb83924a9ba6242692cad08c001b7956cb981930fb755be8e7ab1c08efb +1427000 155853390fdadb3016de47cec48b265e34dd05a0c231f23b8957f8691728957b be61378bfc79b53a70223b482da9dbb778639a7e02f50cb4fad9e2431b17f3a1 9ba287e29e162ac4ac07f20a0789bbf3a8f63d293264938225685990456aa086 +1427500 4ef233e91a68ec5e048effb6f789b38231f73d3715ad5b3450c4047579a266e8 bd4a7c513bf4cd6bc81aec7e54b79588e418c77c9f794ee2b73a73b4a78f54ea b37df2b891571415dbe28738935764d36aae84902f8509c24874fbb925b0c81a +1428000 c16cdcda8c2dd8040eee589ab330fa2c2e1b53b560e3398e673892635c0d1d11 e2062775b080da9730f358c9f01554bc963b567124bdbdbe6b41a490e0a4f1f0 de8799c48a3be8473ce5a7d89becbd4ce8807fb31776416b692d4fa3528f17c8 +1428500 6c6756c99c78d1254cb07f7742eb79572908a8883e214717ad966210db49d6f9 7aedd6635652bdf8e2dd73d0f22ecf59800b0d7b48ac591553138228ec9d0ad5 fab6fae81d00758862a7e1b4d6b7c5a8088913f497cedb04360a8793cf638dab +1429000 3deadca463352d194e0d69f188d2bd97f4eeac2675b25356c0825c984abbf550 966232fca020eac0b583094a12c3a4f95608a18b09aee7bba50ae5b6a9403632 a8186ab3bd4fafdafebb46ec641db4de1b581a6ada5165e132854119ec21b3c0 +1429500 cc8f4ae3179f3b115e958962937b28a8f4360790efee2f574f52af7dffb4c418 10ec6991867cdb513c13a54da1c2a315b69f794094a4aecc437bfb824e18fd46 7303c30bc8fcd995c301556ac3b73ce61ea3a50a01049f92782b033e404cacfb +1430000 8ccf175e4a6aea397173129a5425d59351353abfe8db7b11662f6a7dfbe1c43a ecae611f76dbafb22b0f2e2deedceaa174bdb9673a30b1e3642e31c90c8ff80f a3d3dfa82ce94c52a3688c6582dabb07c2d1cc6bfc52da07d8ff0e5ec60e8b2c +1430500 47bfab777e65563cfded0698b12217944fd76afae32091ce76fbbb4cc1acec9a 81448e099c4f58b623a7ac30b62fd7693a6784eaa79517bd9f184bd15df99149 fb911aec6fca2d836dbba88ebb36c2e8d5b622e5e2f44506b7cb91671b9f178c +1431000 c512baeaf05340a6901618ed5602d3ec17aa8780b74ef8b1d45ac5821fa62475 538652fef1ef20da1feb2a821ef4ce204d6b0b9733a58e984596d6357cad6bcb 701f198b89f486c82294cb166e5a97009c2f2169d57c144f1af008fd030475c0 +1431500 830980fbf385f62bb57e1a9497f814279e0a0fdac8d5d8ddeb6791700e0cef48 521a7a6b1b6fd9cced1c579438bf47b6cf1cb63560739bf93017b752b804213f 1f081b3ea0909343b5a817d0397871e93117cb7fc7051540f420aa7bd0c15872 +1432000 530123444b6f51b50756db5b7fb33256497933e6e8820995ffb67de6bf62d6da 62e70ab6087166fed055667144238499f945d41c0332badaaeb664283b095923 e2edcb575fdfb34de6fa7e32875631e7c403d85952b4983b41b383782227568b +1432500 89d4931de0cfd2a95cad523251f30a1119c354452d50a1cc2a9ba20db77a4979 3c2268583da5ab084ed2cb5ac325fb00ebdebdde211dcb1643f04c12186ba7a5 50f2f5e9e67d0c025b74f855ee884ac5f3fe36dfc278ac183fc2a3076fd738d1 +1433000 64607b1563371086ce294c3079272889817aa48f75e60a56a2fe987d8660c47d 6736f3c502573f24e85ab86858496947eb1aa33c5220961f89cafce5115a2287 e4ef314d31ebf61abe223d78a40e73e6bc3f2d9c15c9ee07dcec5dd6c3e2af02 +1433500 ba051e04a5321bdd8c93540faf1bff2e10fec58d60459789bb4c516fffa73bdd a3f9efee68212b2920d41620de824c04f6ffcd3ed0eedd689153be9df67b8a4f da056883a569cb9e125bb28c02d34fe6ac1e95e7a4899397fa10e616644da9e0 +1434000 06d79f02d0790839773b9e4c0716f15ab695f14acd6b519a6daed5edf6239952 6091477a4195e893fc4958bade0f6f968330d83372f830cdbf7fbbe985d7d776 7eda9f328814982eba286beb8ce74ae7030a21c9ff062d3167b33100302a10e6 +1434500 97a0f3b33bb2691273ebc383ff3ff941932dbda10ea0673b64ffa2937726634d ff189c9f7173979653713e349d4890fb93428a13d946ca1ae6f78e87558cd12d 7cbcad7555be6c90c84cccf4de96817d219196804249ba6fc2de203383a5493e +1435000 a181b6a8eb934eb8191934f31e056d1851e29d631f7ec4c1028d52a84e68f1d2 33f3ae459afc6dd97b9c4f8bb759645232b34ef70c98efce94f023700d719911 19745095f47fbced60c335d5261c22381a49cfb0d7aabc34bd804e137bd34893 +1435500 62d074eed0e303a37b9b105856ba523af05899dcc2bacbccfddde11313d14af9 ac6ec9a0fdaa1d86681be189d00352775dbf862c16fc704f7ee88827126e97b8 648eca2ee1947fead88e1be9a9fbe0da21a12876dd6ef02c2f0ea9fc20a29c0c +1436000 3a3fc0e3ad84356251c646cbee2f3074b655fa3abf86315aaa7e957e01eb89f8 aef0cf31d538101472dad0d9d27791344f6fff964c6e6480d950814ae67b32a1 2b450f2aa4ad70c885fb54e2a1ca7489944f52d8c76b554f5eb7ef17ae39e096 +1436500 67e97cfb940a36a8d0099609fc76c6e3267b8c078eb20f5db25cbec0a90470a8 8a8004e415d4716355706c61cc16a6d8647d3456af400986935d01c051af130f e66100c236f17ab8d55e39b33ad9d2e72c02f6b98f278022e421db158fbf8f30 +1437000 7a1eab23011cdf4750a2e244a4e112de8fbde5c8294aff77927bafc9bf0e1b79 4b453da7657190f4f8eaa6f6f0ac8f061f232c3dc05fbacaa6f89b66a451c337 ba736e7bf4e5de2580869df81b80b0565021b8fde6b774b0cd6c2cecd38ab648 +1437500 b4251d0bc343612d5c8d3cd638584d81ae0b7f925184d2d1150f535faa664a01 70f2dab5062ec44432eba338059c00b3bbc112519cc427724170334b767fb3b2 2f23c3887488d58b9d6456f5cb930ec0546e1c6dc4b1a803e979711df7b15931 +1438000 d4390d7f2f0ec4883d473767463864dd69c0bd8eaa7ca7cb18867b3923cacf18 d4e07f34a01d790b55f605abee418ea71aed892d8dc6cafdaf540a30c456f073 c43543a673936d6e692edf4c8b1cb01f00e7b73449981580146e082f5526c4a5 +1438500 8a85c0128674d310efc2a41d18ce8216e881e38616bca7afac034047ab93364a e9497b5258bdf85e9cf186abdf89c3a0dd8ddb9ae21f586ced31cd86015ee1fe f5f8a5d0ebd0234ba3ba7d2aa72372fefa75e6221ed6b64126cd250c729f53b7 +1439000 17a29d0b26aec774eb4b76dc893906dc377426c20effaea2f3b053918e5006ea 5e9f7e91ce552517c76b9113b4912f898df50351063ce75e61401f2e40a8269c fefeab92f5f7824c2311b2170e3ed9e6bcb8a870a8bff2cce14bc75c1f391b75 +1439500 7db69e969f50d9530c5462054cff19f5fe0991881004de027ab6a233e6ebcf1d a073c4981183fec6098f4801111ec36a3991e92776eca38b312d3b579b89bdf4 156df5bcb9a3cfbb679ae03f097631be75e149009482cf1f384f9edaae9a245d +1440000 a5d484ff4c1cec801c17584ca0b9d41aa2591c302084514dfbe451cafc35a0a6 59a3e81b5692b6dd36f753f79f5a15adced8547dcea91572314f55ce35b007ff 1927fe143d05851a9ab37ed19c58dfe24380912766bf037e13af87e16cd8b4dd +1440500 351d93c828ba55dc7ca9004f041b77e4651ffa8fb709f19674545f3decf1cb31 01d09cfff0d8638e380dd4712325b76f79c63baaf7188b3db65040ce759095c7 02bac99571a8609d39b19687ad7c6da67f61e7b8849b9901a6f020a794de0d8b +1441000 311c932f5138e514f2dc51aade69c1d0c149dba382662492286a52585fe50f40 fc2113148b992f7714e4c520b3ee8cecbe1e1ab98341b3ec4bcb9a149e3b8adf e8363da245c0edd77a2b8ed237b2fd3fecc6ba210d986d9639048f8ac3fdeb64 +1441500 938e5bfaeb448f696eeb3284099c7a35672c11b9ab0e6927d3e7c91b546c315a b3c64c8c9c06bec1c5e546d2a0ccd2b9e136f700e3cd0afd3c47494170869994 d3b346a8c5f39b0b7f6ed27b7bb768d2ccc39e5315c16b3dd5df42944c501538 +1442000 6ddfa0ce1b862746bbf7c5f360f15424f92473dd1d098d4d7134801fc524bebd e2dfe2d263eeb82f963e284ea5b2195be3cc6cf2f331adfeb93dd4cd5066103a 6378650456bc2bba3bbbcc80a2b948aed45b117f055acd9c77fe42a6cf843c92 +1442500 cec826c204c0605f364f60ec6dd2f70659a234a25865228ddf4aed06bca6a1cb 1307e0e6807f145440022ab47b15a96001dc9a8a7b20e33952e129295c20f64d 781ba7480b062d4fe959f33482aa087ab65c23a9bd5f2ba0b4694ec2d40c90d9 +1443000 dc5cdda49ad2d94cc9eca875b760d9cc8233fab867b980fa3ce87ee90fd1fe93 8ccb9f0fd3b4ef99e1795b68d6b5f73574a0d1ddde2dbb5ece5b7adb0539b4e7 bcb0780aacc7c1369fb4b1beccdd9e464aa5513148544221423d5e52ab0762be +1443500 cb846a0e2f0a0f9a69ef0c76ca60af5692af0d8328b43f22a87dcd37be25c2da c920304395e59e42024d17f7877ccfde35d8ce35f49f2ef4e3e985694d9cc32f b20a45f237ea4d47ded5d5dd63d93c3f675cae6de668c831bbd2d2ba9790e579 +1444000 aa3a8de70f1e4e852afb0e90352d6aefe5b42f3eac4ff4cfb71ca92d135648bd 43f5f5ad40ad815e9c798db6ccd1d8ea2bc94407cae7460c3fd0006693cdd386 babc698fbfa13248d167469f0086bb75a03defb83a71b2d6dd485096d2c9ec64 +1444500 0ff67b6e4e9d1c0bb33ca5f3a43f56a82b5f45973d0812322bf05acdd4e5604e 668d19fb710af5c8f13ef3ffd28edc631b2d7627173af78f115f86962706dbf3 c9e7111ff2e456b5e395d9679f90d207de4c3d7d7d9b01fe5df2d5354079182a +1445000 1930b895a740c93416b3c6d802965d5d0c9e4d44dd3ed0f31c5b810f4aa83488 8f9cf32c5da053670c0982865e492d4b56dc98060f1224737e392078b702946e 42d1f85c05c3d56382f56f2cf8aab1b3714b912f3d6d4b7ca373290cc7fff9e5 +1445500 135506a1ae975620e84a06a32b8c2f0bd00101301f547dfad1a3dbed4b794c06 c46ae77684802b14265a435e01a8815ef5f81d0fde51ba73853ad98082e50b7b acf00c3faa9095374e3d450b940f27d616baed7af45961565a769faed73fd1a0 +1446000 59b4c849d502a373134e553937eae7a06282fd430ef663f7c1c66338ddd68115 a48ff15ca965a7252a1c16e1b71a9a10e3e7b4cff8577c2baf1c3fac05ae421c 2235874e873e8990be9ad9a69df26072a590a7f59931075b195327d5cb20d88b +1446500 3a44611ab88a8e45c1e07228579459a85e88b20f04cdda43dc042525cdc5c21d 612c304274d04872a016d6427392b2e17772d15f0af3e123bff3657d0f6493bd 0d60f1452b342ff50c82c216edea74ee24fdf400e088f392de4cd40e4ad9712d +1447000 fa0e200d7f2face36826dd931290057922a3fae9e468cf4cfd59e43cef8fd97e 1c20b859faf1eb7c6f4549a1fa4cd1f0ebbf4c66c4e9fdb2c20e171e3a22a1f9 59230c440d0cea4c0621aa57629e289504b3b50bb6b5281cb9d70cef050217ed +1447500 892b8087a0af4907ce50e37290c902d3fd3c7f4453de8a5d842e57412852e6f1 bc3b1a6ed6db8dd325e00cb676731b6811a0f3358851002ffd1f9d5ed242a015 2cfeb723a4d05c20f38cccb137b5120cbb0e88948f9fb925f8da924b594701db +1448000 71725cab11e0a0e8c31b97a06609ff541322b0a8970f899ecd0718fdae8b52f9 3c0a8edb5ddda9d62807bd06a67de8d001a9c2485025ae2dd56720491145ea33 204bc388b8afd2acc05f1638c29cd5385aadfd45ec3776c0c3435ecd16f6282e +1448500 610d22cc89262dd749799c6999bcff9478e8edbb61902a88c7243da67fb5219e 8cc5a3b721e12c5d184ecdfe56ebe8e60ae72e827afafd3b6772f347904b5d40 d18d25311815106e8fd97e064ff1f60a9fb65117b401db354775ffdae9f03d77 +1449000 885c07a7d369e0a501ff5451c1cc22e514d8c5c7c2b629f0296d0de417112240 356d776ff481d2f667e2f90b07d81328fffe2934aefbe69c5156246b02eeeca6 42342ab0ca63305e2aeece9f93dc341b9f1b2f8a50c8e8fe48caab72823b45ad +1449500 9efe905ffde45ecf996158c405bde9466da88eea15031f63078b8d5308a5ad76 e6b77d33ca9cf3f31f71d4802e4f47f11bad18d8ba1567f581797e391faad29d 3b791ddbf51f3c726e36c6651dd07772cb8f17237e90d42c939f75f8e4a8a1d0 +1450000 2d032563393786ad62c94a24b0a53e98c5fcd91f01d6f386b2e5e0f5d6ba3d88 07b1e5181e550a276597d022bceb27ffa95920e1140d7b311cd134aa0155d938 a6148036f071a156c2ef7baef40eecaea74032b2e616991472351a7447858849 +1450500 c15c9b4a1421f05a82beefe9aedab9cfb439b3abca5234d541876599a6d36747 19bd9f655d61c83dfdf15f68cbc4839b84177fe77c798b8f9d69c5ea2a051fdf 3e46288a1040ea22328bac7a10ec33272a0acb23d713cd7f0c6cc9efef99bc29 +1451000 5f4e425cecead82f6dd0563c07eb341cca9471ef30a84b9a246b01294f10ea17 diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 7b70472c9..84bf9c914 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -703,7 +703,7 @@ struct iguana_block *_iguana_chainlink(struct supernet_info *myinfo,struct iguan bp->hashes[bundlei] = block->RO.hash2; iguana_bundlehash2add(coin,0,bp,bundlei,block->RO.hash2); } - if ( coin->started != 0 && bundlei == coin->minconfirms && (block->height > coin->longestchain-coin->chain->bundlesize*2 || ((block->height / coin->chain->bundlesize) % 100) == 9) ) + if ( coin->started != 0 && bundlei == coin->minconfirms && (block->height > coin->longestchain-coin->chain->bundlesize*2 || ((block->height / coin->chain->bundlesize) % 10) == 9) ) { //printf("savehdrs.[%d] ht.%d\n",bp->hdrsi,block->height); iguana_savehdrs(coin); @@ -724,9 +724,11 @@ struct iguana_block *_iguana_chainlink(struct supernet_info *myinfo,struct iguan iguana_RTnewblock(myinfo,coin,block); block->hdrsi = hdrsi; block->bundlei = bundlei; - bp = coin->bundles[hdrsi]; - if ( bp->blocks[bundlei] != block || bits256_cmp(bp->hashes[bundlei],block->RO.hash2) != 0 ) - printf("new hwm [%d:%d] mismatched bundle block\n",hdrsi,bundlei); + if ( 0 && (bp= coin->bundles[hdrsi]) != 0 ) + { + if ( bp->blocks[bundlei] != block || bits256_cmp(bp->hashes[bundlei],block->RO.hash2) != 0 ) + printf("new hwm [%d:%d] mismatched bundle block\n",hdrsi,bundlei); + } return(block); } } diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index fb382e2cd..0c9bba65f 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -271,7 +271,7 @@ int32_t iguana_bundlehash2add(struct iguana_info *coin,struct iguana_block **blo { if ( block->bundlei >= 0 && ((block->hdrsi != bp->hdrsi || block->bundlei != bundlei) && (block->hdrsi != 0 || block->bundlei != 0)) ) { - char str[65]; printf("blockadd warning: %d[%d] main.%d prevent <- %d[%d] %s\n",block->hdrsi,block->bundlei,block->mainchain,bp->hdrsi,bundlei,bits256_str(str,hash2)); + //char str[65]; printf("blockadd warning: %d[%d] main.%d prevent <- %d[%d] %s\n",block->hdrsi,block->bundlei,block->mainchain,bp->hdrsi,bundlei,bits256_str(str,hash2)); //iguana_blockunmark(coin,block,bp,bundlei,block->mainchain != 0); err |= 2; return(-1); diff --git a/iguana/tests/listunspentK b/iguana/tests/listunspentK new file mode 100755 index 000000000..bec4770b5 --- /dev/null +++ b/iguana/tests/listunspentK @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"KMD\",\"method\":\"listunspent\",\"params\":[1, 9999999, []]}" diff --git a/iguana/tests/requestK b/iguana/tests/requestK new file mode 100755 index 000000000..03ee29c1c --- /dev/null +++ b/iguana/tests/requestK @@ -0,0 +1,3 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"BTC\",\"amount\":0.0001,\"dest\":\"KMD\",\"minprice\":10000}}" + From b1474bae0b2aae833473b8a74204e4bb51b79674 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 05:34:16 +0200 Subject: [PATCH 185/432] test --- iguana/dpow/dpow_network.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0e81fef94..0925ef575 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -56,10 +56,15 @@ 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; - printf("uniq DEX_PACKET.[%d] crc.%x lag.%d\n",size,calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp)); - if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) - free(retstr); + char *retstr; int32_t i; + for (i=0; icrc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + if ( 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 ) + free(retstr); + } } int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) @@ -118,6 +123,9 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) memcpy(dexp->packet,data,datalen); dexp->crc32 = calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); + for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) { ipbits = *retptr; @@ -198,7 +206,7 @@ int32_t dex_subsock_poll(struct supernet_info *myinfo) { if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - printf("SUBSOCK.%08x",dexp->crc32); + printf("SUBSOCK.%08x ",dexp->crc32); dex_packet(myinfo,dexp,size); } if ( dexp != 0 ) From 597a48f437754b6b025a8edaa9902737899a9369 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 09:18:30 +0200 Subject: [PATCH 186/432] test --- basilisk/basilisk.c | 4 +++- basilisk/basilisk_DEX.c | 1 + basilisk/basilisk_MSG.c | 10 +++++----- basilisk/basilisk_tradebot.c | 2 +- iguana/iguana777.c | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 6f20cabd6..3d18f3b8f 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -209,7 +209,7 @@ int32_t basilisk_sendcmd(struct supernet_info *myinfo,char *destipaddr,char *typ } if ( basilisk_notarycmd(type) != 0 && myinfo->NOTARY.NUMRELAYS == 0 ) { - printf("no notary nodes to send (%s) to\n",type); + //printf("no notary nodes to send (%s) to\n",type); return(-1); } //portable_mutex_lock(&myinfo->allcoins_mutex); @@ -900,6 +900,8 @@ void basilisks_loop(void *arg) endmilli = startmilli + 1000; else endmilli = startmilli + 2000; } + //if ( myinfo->expiration != 0 && (myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) + // basilisk_requests_poll(myinfo); //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index d643c81ab..832a05cf2 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -216,6 +216,7 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 //if ( jstr(valsobj,"relay") != 0 ) // rp->relaybits = (uint32_t)calc_ipbits(jstr(valsobj,"relay")); rp->requestid = basilisk_requestid(rp); + printf("set requestid <- %u\n",rp->requestid); if ( rp->destamount != 0 && bits256_nonz(rp->desthash) != 0 ) { rp->quoteid = basilisk_quoteid(rp); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index c4e0bb4b1..1d192e2ed 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -216,9 +216,9 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 msg->expiration = (uint32_t)time(NULL) + duration; HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; - //int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); + int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); portable_mutex_unlock(&myinfo->messagemutex); //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); @@ -292,7 +292,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],*data,*ptr = 0; char *retstr=0; data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,hexstr); - if ( myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0 ) + //if ( myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0 ) { keylen = basilisk_messagekey(key,juint(vals,"channel"),juint(vals,"msgid"),jbits256(vals,"srchash"),jbits256(vals,"desthash")); memcpy(space,key,BASILISK_KEYSIZE); @@ -304,7 +304,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) free(ptr); if ( retstr != 0 ) free(retstr); - } else printf("not notary.%d relayid.%d\n",myinfo->IAMNOTARY,myinfo->NOTARY.RELAYID); + } //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 ( data != 0 && datalen != 0 ) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 8930d28bf..d67b7150d 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -410,7 +410,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } } else noquoteflag++; } - //printf("%s -> %s myrequest.%d pendingid.%u noquoteflag.%d havequoteflag.%d maxi.%d %.8f\n",list[0].src,list[0].dest,myrequest,pendingid,noquoteflag,havequoteflag,maxi,dstr(maxamount)); + printf("%s -> %s myrequest.%d pendingid.%u noquoteflag.%d havequoteflag.%d maxi.%d %.8f\n",list[0].src,list[0].dest,myrequest,pendingid,noquoteflag,havequoteflag,maxi,dstr(maxamount)); double retvals[4],refprice,profitmargin,aveprice; cJSON *retjson; char *retstr; if ( myinfo->IAMLP != 0 && myrequest == 0 && pendingid == 0 && noquoteflag != 0 && (profitmargin= tradebot_liquidity_active(myinfo,&refprice,list[0].src,list[0].dest)) > 0. ) { diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 4d58b2f8c..82c3830d6 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -893,11 +893,11 @@ void iguana_coinloop(void *arg) { if ( coin->FULLNODE < 0 ) continue; - if ( strcmp(coin->symbol,"RELAY") == 0 ) + /*if ( strcmp(coin->symbol,"RELAY") == 0 ) { if ( myinfo->expiration != 0 && (myinfo->IAMLP != 0 || myinfo->DEXactive > now) ) basilisk_requests_poll(myinfo); - } + }*/ if ( n > 1 && coin->RTheight > 0 && (rand() % 10) != 0 ) continue; if ( coin->peers == 0 ) From 6b787d9150b6b356c26c4920b5d4b77251e033c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 11:03:23 +0200 Subject: [PATCH 187/432] test --- basilisk/basilisk.c | 4 ++-- basilisk/basilisk_MSG.c | 4 ++-- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 +++- iguana/iguana_notary.c | 6 ++++-- includes/iguana_apideclares.h | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 3d18f3b8f..c76a94f0e 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -900,8 +900,8 @@ void basilisks_loop(void *arg) endmilli = startmilli + 1000; else endmilli = startmilli + 2000; } - //if ( myinfo->expiration != 0 && (myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) - // basilisk_requests_poll(myinfo); + if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) + basilisk_requests_poll(myinfo); //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 1d192e2ed..7b2eedf3c 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -277,7 +277,7 @@ HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) jdelete(vals,"msgid"); jaddnum(vals,"msgid",msgid); } - if ( myinfo->NOTARY.RELAYID >= 0 ) + if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 ) { channel = juint(vals,"channel"); width = juint(vals,"width"); @@ -308,7 +308,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) if ( vals != 0 && juint(vals,"fanout") == 0 ) jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); if ( data != 0 && datalen != 0 ) - dex_reqsend(myinfo,space,datalen+BASILISK_KEYSIZE); + dex_reqsend(myinfo,"DEX",space,datalen+BASILISK_KEYSIZE); return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 5b81f23e3..2a12f5e82 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -141,7 +141,7 @@ struct dpow_info uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); -int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen); +int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0925ef575..09bfa6f0b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -19,6 +19,7 @@ struct dex_nanomsghdr { uint32_t crc32,size,datalen,timestamp; + char handler[8]; uint8_t version0,version1,packet[]; } PACKED; @@ -67,7 +68,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t } } -int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) +int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) { struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; portable_mutex_lock(&myinfo->dexmutex); @@ -115,6 +116,7 @@ int32_t dex_reqsend(struct supernet_info *myinfo,uint8_t *data,int32_t datalen) { size = (int32_t)(sizeof(*dexp) + datalen); dexp = calloc(1,size); // endian dependent! + safecopy(dexp->handler,handler,sizeof(dexp->handler)); dexp->size = size; dexp->datalen = datalen; dexp->timestamp = (uint32_t)time(NULL); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 8f8b8fd7d..ebb52cd3f 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -345,14 +345,16 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) } -STRING_ARG(dex,send,hex) +TWO_STRINGS(dex,send,hex,handler) { uint8_t data[8192]; int32_t datalen,retval; if ( hex != 0 && (datalen= is_hexstr(hex,0)) > 0 && (datalen>>1) < sizeof(data) ) { datalen >>= 1; decode_hex(data,datalen,hex); - if ( (retval= dex_reqsend(myinfo,data,datalen)) == 0 ) + if ( handler == 0 || handler[0] == 0 ) + handler = "DEX"; + if ( (retval= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) return(clonestr("{\"result\":\"success\"}")); else return(clonestr("{\"error\":\"dex send: retval error\"}")); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 075b70ce8..b5e083a5c 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -20,7 +20,7 @@ TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); ZERO_ARGS(dpow,cancelratify); THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); -STRING_ARG(dex,send,hex); +TWO_STRINGS(dex,send,hex,handler); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From 851acf2e124a6684f47cf39b691441f3960689da Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 11:03:55 +0200 Subject: [PATCH 188/432] test --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 2a12f5e82..223d83fee 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -45,7 +45,7 @@ #define DPOW_MAXRELAYS 64 #define DPOW_MAXSIGLEN 128 -#define DEX_VERSION 0x0102 +#define DEX_VERSION 0x0103 #define DPOW_SOCK 7775 #define DEX_SOCK 7774 #define PUB_SOCK 7773 From 4f66144354b32aafbecaa07baf6ee3164e4415fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 11:31:47 +0200 Subject: [PATCH 189/432] test --- basilisk/basilisk_MSG.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 7b2eedf3c..514a08dac 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -216,9 +216,17 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 msg->expiration = (uint32_t)time(NULL) + duration; HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; - int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); + { + struct basilisk_request R; + int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); + } + portable_mutex_unlock(&myinfo->messagemutex); //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); @@ -292,7 +300,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],*data,*ptr = 0; char *retstr=0; data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,hexstr); - //if ( myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0 ) + if ( 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")); memcpy(space,key,BASILISK_KEYSIZE); From 8442c6a7f5c77bc1674448be4255a44cadbaa6bc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 12:53:28 +0200 Subject: [PATCH 190/432] test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 14 ++++++++------ iguana/dpow/dpow_network.c | 12 ++++++------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 832a05cf2..fc1873f18 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -117,9 +117,9 @@ int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_r memcpy(rp->dest,&serialized[len],sizeof(rp->dest)), len += sizeof(rp->dest); } if ( rp->quoteid != 0 && basilisk_quoteid(rp) != rp->quoteid ) - printf("basilisk_rwDEXquote.%d: quoteid.%u mismatch calc %u\n",rwflag,rp->quoteid,basilisk_quoteid(rp)); + printf(" basilisk_rwDEXquote.%d: quoteid.%u mismatch calc %u\n",rwflag,rp->quoteid,basilisk_quoteid(rp)); if ( basilisk_requestid(rp) != rp->requestid ) - printf("basilisk_rwDEXquote.%d: requestid.%u mismatch calc %u\n",rwflag,rp->requestid,basilisk_requestid(rp)); + printf(" basilisk_rwDEXquote.%d: requestid.%u mismatch calc %u\n",rwflag,rp->requestid,basilisk_requestid(rp)); return(len); } diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 514a08dac..b3c36ac55 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -218,11 +218,11 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 QUEUEITEMS++; { struct basilisk_request R; - int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); } @@ -298,12 +298,11 @@ HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { - int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],*data,*ptr = 0; char *retstr=0; + int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],space2[16384],*data,*ptr = 0; char *retstr=0; data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,hexstr); if ( 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")); - memcpy(space,key,BASILISK_KEYSIZE); if ( data != 0 ) { retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); @@ -316,7 +315,11 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) if ( vals != 0 && juint(vals,"fanout") == 0 ) jaddnum(vals,"fanout",MAX(8,(int32_t)sqrt(myinfo->NOTARY.NUMRELAYS)+2)); if ( data != 0 && datalen != 0 ) - dex_reqsend(myinfo,"DEX",space,datalen+BASILISK_KEYSIZE); + { + memcpy(space2,key,BASILISK_KEYSIZE); + memcpy(&space2[BASILISK_KEYSIZE],data,datalen); + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE); + } return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } #include "../includes/iguana_apiundefs.h" @@ -524,7 +527,6 @@ uint32_t basilisk_crcrecv(struct supernet_info *myinfo,int32_t width,uint8_t *ve } else printf("not keystr.%p or no data.%p or bad datalen.%d\n",keystr,hexstr,datalen); } } - printf("(%s).%d ",jprint(item,0),i); } //printf("n.%d maxlen.%d\n",n,maxlen); } diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 09bfa6f0b..c0c690099 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -60,7 +60,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; int32_t i; for (i=0; icrc32)),(int32_t)(size-sizeof(dexp->crc32))),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + printf(" uniq DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( 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 ) @@ -123,11 +123,11 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int dexp->version0 = DEX_VERSION & 0xff; dexp->version1 = (DEX_VERSION >> 8) & 0xff; memcpy(dexp->packet,data,datalen); - dexp->crc32 = calc_crc32(0,(void *)((long)dexp+sizeof(dexp->crc32)),(int32_t)(size-sizeof(dexp->crc32))); + dexp->crc32 = calc_crc32(0,data,datalen); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) { ipbits = *retptr; @@ -193,7 +193,7 @@ int32_t dex_packetcheck(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp { if ( dexp->datalen == (size - sizeof(*dexp)) ) { - crc32 = calc_crc32(0,(void *)((long)dexp + sizeof(dexp->crc32)),(int32_t)(size - sizeof(dexp->crc32))); + 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); } From 65ea597fcd529f610c363bade2635e080c04e8af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 14:12:12 +0200 Subject: [PATCH 191/432] test --- basilisk/basilisk_MSG.c | 7 ++++--- basilisk/basilisk_tradebot.c | 2 +- iguana/iguana_exchanges.c | 14 ++++++++++---- iguana/iguana_payments.c | 2 +- iguana/main.c | 2 +- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index b3c36ac55..764c27926 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -285,14 +285,15 @@ HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) jdelete(vals,"msgid"); jaddnum(vals,"msgid",msgid); } - if ( myinfo->NOTARY.RELAYID >= 0 || myinfo->dexsock >= 0 ) + 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\n",myinfo->NOTARY.RELAYID); + //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)); } @@ -300,7 +301,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],space2[16384],*data,*ptr = 0; char *retstr=0; data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,hexstr); - if ( myinfo->dexsock >= 0 || (myinfo->IAMNOTARY != 0 && myinfo->NOTARY.RELAYID >= 0) ) + 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 ) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index d67b7150d..f1fbda6ab 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -447,7 +447,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk { if ( minamount != 0 && maxamount > minamount && time(NULL) > BASILISK_DEXDURATION/2 ) { - printf("automatch quoteid.%u triggered %.8f > %.8f\n",list[maxi].quoteid,dstr(maxamount),dstr(minamount)); + printf("automatch[%d] quoteid.%u triggered %.8f > %.8f\n",maxi,list[maxi].quoteid,dstr(maxamount),dstr(minamount)); *issueR = list[maxi]; if ( minamount > 0 ) metric = (dstr(maxamount) / dstr(minamount)) - 1.; diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 697e45484..306d72315 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -22,7 +22,7 @@ //char *Exchange_names[] = { "poloniex", "bittrex", "btc38", "huobi", "bitstamp", "bitfinex", "btce", "coinbase", "okcoin", "lakebtc", "quadriga", "truefx", "ecb", "instaforex", "fxcm", "yahoo" }; -int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_quote *sortbuf,int32_t n,int32_t max,int32_t ind,int32_t dir,struct exchange_quote *quotes,int32_t numquotes,double offset) +int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_quote *sortbuf,int32_t n,int32_t max,int32_t ind,int32_t dir,struct exchange_quote *quotes,int32_t numquotes,double offset,double factor) { int32_t i; struct exchange_quote *quote; //printf("instantdex_updatesources.%s update dir.%d numquotes.%d offset %.6f\n",exchange->name,dir,numquotes,offset); @@ -33,6 +33,8 @@ int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_ { //printf("%s n.%d ind.%d i.%d dir.%d price %.8f vol %.8f offset %.6f\n",exchange->name,n,ind,i,dir,quote->price+offset,quote->volume,offset); quote->price += offset; + quote->price /= factor; + quote->volume *= factor; quote->satoshis = quote->price * SATOSHIDEN; sortbuf[n] = *quote; sortbuf[n].val = ind; @@ -47,7 +49,7 @@ int32_t instantdex_updatesources(struct exchange_info *exchange,struct exchange_ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *sortbuf,int32_t max,double *totalvolp,char *base,char *rel,double basevolume,cJSON *argjson) { - char *str; double totalvol,pricesum,hblas[64][2],refbid,refask; uint32_t timestamp; + char *str; double totalvol,pricesum,hblas[64][2],refbid,refask,factor = 1.; uint32_t timestamp; struct exchange_quote quote; int32_t i,n,dir,num,depth = 100; struct exchange_info *exchange; struct exchange_request *req,*active[64]; if ( myinfo == 0 ) @@ -66,6 +68,10 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s memset(sortbuf,0,sizeof(*sortbuf) * max); if ( base != 0 && rel != 0 && basevolume > SMALLVAL ) { + if ( strcmp(base,"KMD") == 0 ) + base = "BTCD", factor = 50; + else if ( strcmp(rel,"KMD") == 0 ) + rel = "BTCD", factor = 0.02; for (i=num=0; inumexchanges && num < sizeof(active)/sizeof(*active); i++) { if ( (exchange= myinfo->tradingexchanges[i]) != 0 ) @@ -117,9 +123,9 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s for (i=n=0; inumbids > 0 ) - n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,1,active[i]->bidasks,active[i]->numbids,hblas[i][0]); + n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,1,active[i]->bidasks,active[i]->numbids,hblas[i][0],factor); else if ( dir > 0 && active[i]->numasks > 0 ) - n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,-1,&active[i]->bidasks[1],active[i]->numasks,hblas[i][1]); + n = instantdex_updatesources(active[i]->exchange,sortbuf,n,max,i,-1,&active[i]->bidasks[1],active[i]->numasks,hblas[i][1],factor); } //printf("numexchanges.%d dir.%d %s/%s numX.%d n.%d\n",myinfo->numexchanges,dir,base,rel,num,n); if ( dir < 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 496ebbea6..046fbaff5 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -1256,7 +1256,7 @@ cJSON *iguana_listunspents(struct supernet_info *myinfo,struct iguana_info *coin { array = iguana_getaddressesbyaccount(myinfo,coin,"*"); flag = 1; - printf("listunspent.(%s)\n",jprint(array,0)); + //printf("listunspent.(%s)\n",jprint(array,0)); } if ( minconf == 0 ) minconf = 1; diff --git a/iguana/main.c b/iguana/main.c index 81d0500b0..fbbdf2a63 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1621,7 +1621,7 @@ void iguana_main(void *arg) #if LIQUIDITY_PROVIDER myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("poloniex"),0); - myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); + //myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btc38"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("huobi"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("coinbase"),0); From 79b3061551147d1360f6fcbf92a345201ac99e6f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 14:25:57 +0200 Subject: [PATCH 192/432] 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 fc1873f18..4f61d0253 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -666,9 +666,9 @@ TWO_INTS(InstantDEX,accept,requestid,quoteid) { cJSON *vals; char *retstr; myinfo->DEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; - //if ( myinfo->IAMLP != 0 ) - // return(basilisk_respond_accept(myinfo,requestid,quoteid)); - //else + if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) + return(basilisk_respond_accept(myinfo,requestid,quoteid)); + else { vals = cJSON_CreateObject(); jaddnum(vals,"quoteid",(uint32_t)quoteid); From d95aeff753387974712ff002acca22bfaad86520 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 14:35:49 +0200 Subject: [PATCH 193/432] test --- basilisk/basilisk_tradebot.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index f1fbda6ab..44ae55eff 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -447,8 +447,10 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk { if ( minamount != 0 && maxamount > minamount && time(NULL) > BASILISK_DEXDURATION/2 ) { - printf("automatch[%d] quoteid.%u triggered %.8f > %.8f\n",maxi,list[maxi].quoteid,dstr(maxamount),dstr(minamount)); *issueR = list[maxi]; + for (i=0; i %.8f\n",maxi,list[maxi].quoteid,dstr(maxamount),dstr(minamount)); if ( minamount > 0 ) metric = (dstr(maxamount) / dstr(minamount)) - 1.; else metric = 1.; From ee9be677f498b6ee8839a807e296f043f51cdcac Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 14:45:21 +0200 Subject: [PATCH 194/432] test --- basilisk/basilisk_tradebot.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 44ae55eff..ae6e64996 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -477,7 +477,7 @@ double basilisk_process_results(struct supernet_info *myinfo,struct basilisk_req { memset(&R,0,sizeof(R)); basilisk_rwDEXquote(0,hexdata,&R); - //printf("[%d].(%s)\n",i,jprint(basilisk_requestjson(&R),1)); + printf("[%d].(%s)\n",i,jprint(basilisk_requestjson(&R),1)); } } else basilisk_parsejson(&R,item); if ( nonz != 0 ) @@ -491,6 +491,7 @@ double basilisk_process_results(struct supernet_info *myinfo,struct basilisk_req *issueR = tmpR; hwm = metric; refR = tmpR; + printf("SET HWM\n"); } m = 0; } @@ -506,7 +507,10 @@ double basilisk_process_results(struct supernet_info *myinfo,struct basilisk_req //printf("process_results n.%d m.%d nonz.%d\n",n,m,nonz); if ( m > 0 && m < sizeof(list)/sizeof(*list) ) if ( (metric= basilisk_request_listprocess(myinfo,&tmpR,list,m)) > hwm ) + { *issueR = tmpR, hwm = metric; + printf("set hwm\n"); + } } return(hwm); } From 7c096b112648218546fd36f56f3f529b6d7c7d2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 15:14:51 +0200 Subject: [PATCH 195/432] test --- basilisk/basilisk_DEX.c | 24 +++++++++++++++++------- basilisk/basilisk_tradebot.c | 3 +++ iguana/iguana777.h | 1 + 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 4f61d0253..d57f98935 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -257,6 +257,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) return; lastpoll = (uint32_t)time(NULL); memset(&issueR,0,sizeof(issueR)); + memset(&myinfo->DEXaccept,0,sizeof(myinfo->DEXaccept)); //printf("Call incoming\n"); if ( (retstr= InstantDEX_incoming(myinfo,0,0,0,0)) != 0 ) { @@ -276,6 +277,10 @@ void basilisk_requests_poll(struct supernet_info *myinfo) if ( hwm > 0. ) { printf("hwm %f\n",hwm); + for (i=0; iDEXaccept = issueR; if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request { printf("my req hwm %f\n",hwm); @@ -362,14 +367,19 @@ static int _cmp_requests(const void *a,const void *b) #undef uint32_b } -struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,int32_t *nump,uint8_t *space,int32_t spacesize) +struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,int32_t *nump,uint8_t *space,int32_t spacesize,struct basilisk_request *refrp) { int32_t i,j,n,k,m; struct basilisk_relay *relay; struct basilisk_request *requests,*rp; - for (j=m=0; jNOTARY.NUMRELAYS; j++) + m = 0; + if ( refrp != 0 ) + m = 1; + for (j=0; jNOTARY.NUMRELAYS; j++) m += myinfo->NOTARY.RELAYS[j].numrequests; if ( m*sizeof(*requests) <= spacesize ) requests = (void *)space; else requests = calloc(m,sizeof(*requests)); + if ( refrp != 0 ) + requests[0] = *refrp; for (j=m=0; jNOTARY.NUMRELAYS; j++) { relay = &myinfo->NOTARY.RELAYS[j]; @@ -403,12 +413,12 @@ struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,in return(jprint(retjson,1)); }*/ -char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32_t requestid,uint32_t quoteid) +char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32_t requestid,uint32_t quoteid,struct basilisk_request *refrp) { int32_t i,qflag,num=0; cJSON *retjson,*array; struct basilisk_request *requests,*rp; uint8_t space[4096]; array = cJSON_CreateArray(); portable_mutex_lock(&myinfo->DEX_reqmutex); - if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space))) != 0 ) + if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { //printf("numrequests.%d r.%u q.%u\n",num,requestid,quoteid); for (i=0; iDEX_reqmutex); - if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space))) != 0 ) + if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { for (i=0; iDEXactive = (uint32_t)time(NULL) + INSTANTDEX_LOCKTIME; if ( myinfo->IAMLP != 0 || myinfo->dexsock >= 0 || myinfo->subsock >= 0 ) - return(basilisk_respond_accept(myinfo,requestid,quoteid)); + return(basilisk_respond_accept(myinfo,requestid,quoteid,&myinfo->DEXaccept)); else { vals = cJSON_CreateObject(); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index ae6e64996..8a85cc555 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -510,6 +510,9 @@ double basilisk_process_results(struct supernet_info *myinfo,struct basilisk_req { *issueR = tmpR, hwm = metric; printf("set hwm\n"); + for (i=0; i Date: Sun, 25 Dec 2016 15:21:30 +0200 Subject: [PATCH 196/432] test --- basilisk/basilisk_DEX.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index d57f98935..db580a623 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -379,7 +379,12 @@ struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,in requests = (void *)space; else requests = calloc(m,sizeof(*requests)); if ( refrp != 0 ) + { requests[0] = *refrp; + for (i=0; iNOTARY.NUMRELAYS; j++) { relay = &myinfo->NOTARY.RELAYS[j]; @@ -443,6 +448,7 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,ui { int32_t i,num=0; char *retstr=0; struct basilisk_request *requests,*rp; uint8_t space[4096]; portable_mutex_lock(&myinfo->DEX_reqmutex); + printf("respond accept\n"); if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { for (i=0; i Date: Sun, 25 Dec 2016 15:26:21 +0200 Subject: [PATCH 197/432] test --- basilisk/basilisk_DEX.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index db580a623..a68d87ae4 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -425,13 +425,16 @@ char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32 portable_mutex_lock(&myinfo->DEX_reqmutex); if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { - //printf("numrequests.%d r.%u q.%u\n",num,requestid,quoteid); + printf("numrequests.%d r.%u q.%u\n",num,requestid,quoteid); for (i=0; iquoteid && (bits256_cmp(hash,rp->srchash) == 0 || bits256_cmp(hash,rp->desthash) == 0)) ) qflag = 1; else qflag = 0; + int32_t j; for (j=0; jrequestid == requestid && qflag != 0) ) jaddi(array,basilisk_requestjson(rp)); } From 40a1d479aba625d1c8666a51afeae07383cc0dc3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 25 Dec 2016 15:30:58 +0200 Subject: [PATCH 198/432] test --- basilisk/basilisk_DEX.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index a68d87ae4..273ad6054 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -385,7 +385,10 @@ struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,in printf("%02x",((uint8_t *)refrp)[i]); printf(" uniq\n"); } - for (j=m=0; jNOTARY.NUMRELAYS; j++) + if ( refrp != 0 ) + m = 1; + else m = 0; + for (j=0; jNOTARY.NUMRELAYS; j++) { relay = &myinfo->NOTARY.RELAYS[j]; if ( (n= relay->numrequests) > 0 ) From 259a369a9b2fb5576e1a0ac4a28d477640eecb24 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 09:44:28 +0200 Subject: [PATCH 199/432] test --- basilisk/basilisk_DEX.c | 20 ++++++++++++-------- basilisk/basilisk_MSG.c | 2 +- iguana/dpow/dpow_fsm.c | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 273ad6054..bbbf8cab2 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -216,11 +216,11 @@ int32_t basilisk_request_create(struct basilisk_request *rp,cJSON *valsobj,bits2 //if ( jstr(valsobj,"relay") != 0 ) // rp->relaybits = (uint32_t)calc_ipbits(jstr(valsobj,"relay")); rp->requestid = basilisk_requestid(rp); - printf("set requestid <- %u\n",rp->requestid); + //printf("set requestid <- %u\n",rp->requestid); if ( rp->destamount != 0 && bits256_nonz(rp->desthash) != 0 ) { rp->quoteid = basilisk_quoteid(rp); - printf("set quoteid.%u\n",rp->quoteid); + //printf("set quoteid.%u\n",rp->quoteid); } //printf("create.%u calc.%u\n",rp->requestid,basilisk_requestid(rp)); return(0); @@ -252,7 +252,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *rp,ui void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; - char *retstr; uint8_t data[32768],buf[4096]; cJSON *outerarray,*retjson; uint32_t msgid,crcs[2],crc,channel; int32_t datalen,i,n,numiters; struct basilisk_request issueR; double hwm = 0.; + char *retstr; uint8_t data[32768],buf[4096],key[BASILISK_KEYSIZE]; cJSON *outerarray,*retjson; uint32_t msgid,crcs[2],crc,channel; int32_t datalen,i,n,keylen,numiters; struct basilisk_request issueR; double hwm = 0.; if ( time(NULL) < lastpoll+3 ) return; lastpoll = (uint32_t)time(NULL); @@ -281,6 +281,12 @@ void basilisk_requests_poll(struct supernet_info *myinfo) printf("%02x",((uint8_t *)&issueR)[i]); printf("\n"); myinfo->DEXaccept = 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("my req hwm %f\n",hwm); @@ -428,16 +434,15 @@ char *basilisk_respond_requests(struct supernet_info *myinfo,bits256 hash,uint32 portable_mutex_lock(&myinfo->DEX_reqmutex); if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { - printf("numrequests.%d r.%u q.%u\n",num,requestid,quoteid); for (i=0; iquoteid && (bits256_cmp(hash,rp->srchash) == 0 || bits256_cmp(hash,rp->desthash) == 0)) ) qflag = 1; else qflag = 0; - int32_t j; for (j=0; jrequestid == requestid && qflag != 0) ) jaddi(array,basilisk_requestjson(rp)); } @@ -454,7 +459,6 @@ char *basilisk_respond_accept(struct supernet_info *myinfo,uint32_t requestid,ui { int32_t i,num=0; char *retstr=0; struct basilisk_request *requests,*rp; uint8_t space[4096]; portable_mutex_lock(&myinfo->DEX_reqmutex); - printf("respond accept\n"); if ( (requests= _basilisk_requests_uniq(myinfo,&num,space,sizeof(space),refrp)) != 0 ) { for (i=0; i= 0 && n < 60 ) { - if ( msgid == keymsgid && keychannel == channel ) + if ( (keymsgid == 0 || msgid == keymsgid) && (keychannel == 0 || keychannel == channel) ) return(0); msgid--; n++; diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 0d9c49c84..d43987e43 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -412,7 +412,7 @@ void dpow_statemachinestart(void *ptr) extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } - sleep(1); + sleep(3); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { if ( bp->isratify == 0 ) From 25d72fa6016fc4369c7fb310583870b25d09560e Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 09:46:39 +0200 Subject: [PATCH 200/432] test --- iguana/dpowassets | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 iguana/dpowassets diff --git a/iguana/dpowassets b/iguana/dpowassets new file mode 100755 index 000000000..e0690e019 --- /dev/null +++ b/iguana/dpowassets @@ -0,0 +1,52 @@ +#!/bin/bash +set -x +source pubkey.txt +echo $pubkey + + +curl --url "http://127.0.0.1:7776" --data "{\"timeout\":60000,\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"REVS\",\"pubkey\":\"$pubkey\"}" + +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SUPERNET\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DEX\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PANGEA\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JUMBLR\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BET\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CRYPTO\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HODL\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SHARK\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BOTS\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGW\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}" + +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}" + From b61d1e9d6650c1266f055e2a74693309e41b9237 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 10:05:47 +0200 Subject: [PATCH 201/432] test --- basilisk/basilisk_DEX.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index bbbf8cab2..4f104b80d 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -228,11 +228,13 @@ 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,struct basilisk_request *_rp,uint32_t statebits,int32_t optionduration) { - cJSON *retjson; - if ( (bits256_cmp(rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(rp->desthash,myinfo->myaddr.persistent) == 0) ) + cJSON *retjson; struct basilisk_request *rp; + if ( (bits256_cmp(_rp->srchash,myinfo->myaddr.persistent) == 0 || bits256_cmp(_rp->desthash,myinfo->myaddr.persistent) == 0) ) { + rp = calloc(1,sizeof(*rp)); + *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); if ( basilisk_thread_start(myinfo,rp,statebits,optionduration) != 0 ) { @@ -276,10 +278,10 @@ void basilisk_requests_poll(struct supernet_info *myinfo) 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); @@ -303,6 +305,7 @@ void basilisk_requests_poll(struct supernet_info *myinfo) } 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"); From 1a667898c5e0be1c191d4ff7516ddeef4a5e2c93 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 10:16:50 +0200 Subject: [PATCH 202/432] test --- basilisk/basilisk_DEX.c | 9 +++++---- basilisk/basilisk_swap.c | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 4f104b80d..4a0bee906 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -34,7 +34,7 @@ int32_t basilisk_ping_processDEX(struct supernet_info *myinfo,uint32_t senderipb if ( relay->numrequests < relay->maxrequests ) { memcpy(serialized,&data[len],clen); - //printf("ping processDEX\n"); + printf("ping processDEX\n"); n = basilisk_rwDEXquote(0,serialized,&R); if ( n != clen ) printf("n.%d clen.%d\n",n,clen); @@ -126,6 +126,7 @@ int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_r uint32_t basilisk_request_enqueue(struct supernet_info *myinfo,struct basilisk_request *rp) { uint8_t serialized[256]; int32_t len; struct queueitem *item; + printf("basilisk_request_enqueue\n"); len = basilisk_rwDEXquote(1,serialized+1,rp); if ( (item= calloc(1,sizeof(*item) + len + 1)) != 0 ) { @@ -254,7 +255,7 @@ char *basilisk_start(struct supernet_info *myinfo,struct basilisk_request *_rp,u void basilisk_requests_poll(struct supernet_info *myinfo) { static uint32_t lastpoll; - char *retstr; uint8_t data[32768],buf[4096],key[BASILISK_KEYSIZE]; cJSON *outerarray,*retjson; uint32_t msgid,crcs[2],crc,channel; int32_t datalen,i,n,keylen,numiters; struct basilisk_request issueR; double hwm = 0.; + char *retstr; uint8_t data[32768],buf[4096]; cJSON *outerarray,*retjson; uint32_t msgid,crcs[2],crc,channel; int32_t datalen,i,n,numiters; struct basilisk_request issueR; double hwm = 0.; if ( time(NULL) < lastpoll+3 ) return; lastpoll = (uint32_t)time(NULL); @@ -283,12 +284,12 @@ void basilisk_requests_poll(struct supernet_info *myinfo) // printf("%02x",((uint8_t *)&issueR)[i]); //printf("\n"); myinfo->DEXaccept = issueR; - issueR.quoteid = basilisk_quoteid(&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); + free(retstr);*/ if ( bits256_cmp(myinfo->myaddr.persistent,issueR.srchash) == 0 ) // my request { printf("my req hwm %f\n",hwm); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 48751990e..f44f7d338 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1842,6 +1842,9 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,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; + for (i=0; iDEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1886,7 +1889,9 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct } if ( statebits != 0 || m > n/2 ) { - fprintf(stderr,"m.%d n.%d launch.%d %d\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps))); + for (i=0; iI.req); i++) + printf("%02x",((uint8_t *)&swap->I.req)[i]); + fprintf(stderr," m.%d n.%d launch.%d %d\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps))); if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { From 061eea05e930ec5c11a48f43d48423e646a043b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 10:27:16 +0200 Subject: [PATCH 203/432] test --- basilisk/basilisk_DEX.c | 6 +++--- basilisk/basilisk_swap.c | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 4a0bee906..efc5d1c13 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -117,16 +117,16 @@ int32_t basilisk_rwDEXquote(int32_t rwflag,uint8_t *serialized,struct basilisk_r memcpy(rp->dest,&serialized[len],sizeof(rp->dest)), len += sizeof(rp->dest); } if ( rp->quoteid != 0 && basilisk_quoteid(rp) != rp->quoteid ) - printf(" basilisk_rwDEXquote.%d: quoteid.%u mismatch calc %u\n",rwflag,rp->quoteid,basilisk_quoteid(rp)); + printf(" basilisk_rwDEXquote.%d: quoteid.%u mismatch calc %u rp.%p\n",rwflag,rp->quoteid,basilisk_quoteid(rp),rp); if ( basilisk_requestid(rp) != rp->requestid ) - printf(" basilisk_rwDEXquote.%d: requestid.%u mismatch calc %u\n",rwflag,rp->requestid,basilisk_requestid(rp)); + printf(" basilisk_rwDEXquote.%d: requestid.%u mismatch calc %u rp.%p\n",rwflag,rp->requestid,basilisk_requestid(rp),rp); return(len); } uint32_t basilisk_request_enqueue(struct supernet_info *myinfo,struct basilisk_request *rp) { uint8_t serialized[256]; int32_t len; struct queueitem *item; - printf("basilisk_request_enqueue\n"); + printf(" basilisk_request_enqueue\n"); len = basilisk_rwDEXquote(1,serialized+1,rp); if ( (item= calloc(1,sizeof(*item) + len + 1)) != 0 ) { diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f44f7d338..87f1d0876 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1844,7 +1844,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct int32_t i,m,n; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj; struct basilisk_swap *swap = 0; for (i=0; iDEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1858,7 +1858,9 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfo = myinfo; - printf("START swap requestid.%u\n",rp->requestid); + for (i=0; iI.req); i++) + fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); + fprintf(stderr,"START swap requestid.%u %p\n",rp->requestid,&swap->I.req); m = n = 0; if ( bitcoin_swapinit(myinfo,swap,optionduration) != 0 ) { @@ -1890,8 +1892,8 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct if ( statebits != 0 || m > n/2 ) { for (i=0; iI.req); i++) - printf("%02x",((uint8_t *)&swap->I.req)[i]); - fprintf(stderr," m.%d n.%d launch.%d %d\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps))); + 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 ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { From f2eb40c69792d6ccef01655d6a370a2a39005d70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 10:43:38 +0200 Subject: [PATCH 204/432] test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 17 ++--------------- iguana/dpow/dpow_network.c | 9 +++++---- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index efc5d1c13..1b8cf6d54 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -178,7 +178,7 @@ cJSON *basilisk_requestjson(struct basilisk_request *rp) { for (i=0; imyaddr.persistent,issueR.srchash) == 0 ) // my request { - printf("my req hwm %f\n",hwm); 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 = 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 ) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 19fc1bd24..d4a2c0c54 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -216,17 +216,6 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 msg->expiration = (uint32_t)time(NULL) + duration; HASH_ADD_KEYPTR(hh,myinfo->messagetable,msg->key,msg->keylen,msg); QUEUEITEMS++; - { - struct basilisk_request R; - /*int32_t i; for (i=0; iexpiration,msg,msg->hh.next,msg->hh.prev); - } - portable_mutex_unlock(&myinfo->messagemutex); //if ( myinfo->NOTARY.RELAYID >= 0 ) // dpow_handler(myinfo,msg); @@ -315,12 +304,10 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) } //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)); + memcpy(space2,key,BASILISK_KEYSIZE); if ( data != 0 && datalen != 0 ) - { - memcpy(space2,key,BASILISK_KEYSIZE); memcpy(&space2[BASILISK_KEYSIZE],data,datalen); - dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE); - } + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE); return(basilisk_standardservice("OUT",myinfo,0,jbits256(vals,"desthash"),vals,hexstr,0)); } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c0c690099..2856ad98e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -125,14 +125,14 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int memcpy(dexp->packet,data,datalen); dexp->crc32 = calc_crc32(0,data,datalen); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - //for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) { ipbits = *retptr; expand_ipbits(ipaddr,ipbits); - printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); + //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); portable_mutex_lock(&myinfo->dexmutex); n = myinfo->numdexipbits; for (i=0; isubsock >= 0 && (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { + printf("SUBSOCK.%08x recv.%d datalen.%d\n",dexp->crc32,size,dexp->datalen); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { printf("SUBSOCK.%08x ",dexp->crc32); From 4b9f2dcf9be5035064366f44596a08bd5f245406 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 10:57:33 +0200 Subject: [PATCH 205/432] test --- basilisk/basilisk_swap.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 87f1d0876..1311c0fab 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1842,9 +1842,6 @@ void basilisk_swaploop(void *_swap) struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,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; - for (i=0; iDEX_swapmutex); for (i=0; inumswaps; i++) if ( myinfo->swaps[i]->I.req.requestid == rp->requestid ) @@ -1858,9 +1855,6 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct vcalc_sha256(0,swap->I.orderhash.bytes,(uint8_t *)rp,sizeof(*rp)); swap->I.req = *rp; swap->myinfo = myinfo; - for (i=0; iI.req); i++) - fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]); - fprintf(stderr,"START swap requestid.%u %p\n",rp->requestid,&swap->I.req); m = n = 0; if ( bitcoin_swapinit(myinfo,swap,optionduration) != 0 ) { @@ -1868,8 +1862,9 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+300 ) { m = n = 0; - printf("waiting for offer to be accepted\n"); + dpow_nanomsg_update(myinfo); sleep(3); + 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 ) { @@ -1884,7 +1879,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct 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("msgobj.%p m.%d n.%d\n",msgobj,m,n); } } } else printf("no retarray\n"); From db08554c2f1a950ce25b70aa735ff2e9570adddb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:09:36 +0200 Subject: [PATCH 206/432] test --- basilisk/basilisk_swap.c | 3 ++- iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1311c0fab..be7a3b293 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1859,10 +1859,11 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct if ( bitcoin_swapinit(myinfo,swap,optionduration) != 0 ) { starttime = (uint32_t)time(NULL); - while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+300 ) + while ( statebits == 0 && m <= n/2 && time(NULL) < starttime+30 ) { m = n = 0; 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/iguana/dPoW.h b/iguana/dPoW.h index 223d83fee..2df40807a 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -147,5 +147,6 @@ char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *c cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); +int32_t dpow_nanomsg_update(struct supernet_info *myinfo); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2856ad98e..8ef852295 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -938,7 +938,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; - if ( time(NULL) < myinfo->nanoinit+5 || myinfo->dpowsock < 0 ) + if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); for (i=0; i<100; i++) From c94adb469c3a4ac793bb658fba7cbd88084259a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:15:31 +0200 Subject: [PATCH 207/432] test --- basilisk/basilisk_swap.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index be7a3b293..f3dfdf0be 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1715,6 +1715,8 @@ void basilisk_swaploop(void *_swap) if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; sleep(1); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { @@ -1726,6 +1728,8 @@ void basilisk_swaploop(void *_swap) break; } sleep(1);//3 + (swap->iambob == 0)*10); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1733,6 +1737,8 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( swap->myfee.txbytes == 0 ) @@ -1816,6 +1822,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); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) From 14051c54112cdaf6098c08e69b89538eb3ce13d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:27:05 +0200 Subject: [PATCH 208/432] test --- basilisk/basilisk_swap.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f3dfdf0be..a23ff71e0 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -866,12 +866,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]) { + 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); - //if ( basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2) == 0 ) - // return(nextbits); - //printf("ERROR basilisk_channelsend\n"); - return(0); + else return(0); } 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) @@ -1715,8 +1713,6 @@ void basilisk_swaploop(void *_swap) if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; sleep(1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { @@ -1728,8 +1724,6 @@ void basilisk_swaploop(void *_swap) break; } sleep(1);//3 + (swap->iambob == 0)*10); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1737,8 +1731,6 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( swap->myfee.txbytes == 0 ) @@ -1822,8 +1814,6 @@ 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); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) From c953e46409ba21de2bdf68a02824c9c0fe6570af Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:34:49 +0200 Subject: [PATCH 209/432] test --- basilisk/basilisk_MSG.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index d4a2c0c54..25b2d7b36 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -288,8 +288,10 @@ HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr) HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { - int32_t keylen,datalen; uint8_t key[BASILISK_KEYSIZE],space[16384],space2[16384],*data,*ptr = 0; char *retstr=0; - data = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,&space[BASILISK_KEYSIZE],sizeof(space)-BASILISK_KEYSIZE,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")); @@ -297,17 +299,22 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) { retstr = basilisk_respond_addmessage(myinfo,key,keylen,data,datalen,0,juint(vals,"duration")); } else printf("no get_dataptr\n"); - if ( ptr != 0 ) - free(ptr); 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)); - memcpy(space2,key,BASILISK_KEYSIZE); - if ( data != 0 && datalen != 0 ) - memcpy(&space2[BASILISK_KEYSIZE],data,datalen); - dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE); + 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); + } 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" From 40708bb6ffe2f3627a8b959b879498a8813058fa Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:41:39 +0200 Subject: [PATCH 210/432] test --- basilisk/basilisk_swap.c | 2 ++ iguana/dpow/dpow_network.c | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index a23ff71e0..1f1b9d3e7 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1713,6 +1713,8 @@ void basilisk_swaploop(void *_swap) if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; sleep(1); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8ef852295..d04c9f8ab 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -125,9 +125,9 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int memcpy(dexp->packet,data,datalen); dexp->crc32 = calc_crc32(0,data,datalen); sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) { ipbits = *retptr; From 6491b719cc6e19018c891cc41822cf519419668f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 11:48:37 +0200 Subject: [PATCH 211/432] test --- basilisk/basilisk_swap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 1f1b9d3e7..20f904791 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1726,6 +1726,8 @@ void basilisk_swaploop(void *_swap) break; } sleep(1);//3 + (swap->iambob == 0)*10); + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1733,6 +1735,8 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { + dpow_nanomsg_update(myinfo); + dex_updateclient(myinfo); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( swap->myfee.txbytes == 0 ) @@ -1816,6 +1820,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); } printf("end of atomic swap\n"); if ( swap->I.iambob != 0 && swap->bobdeposit.txbytes != 0 ) From 8300ada5d682c19e0f98b352d4cb2a94cdca1258 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:13:47 +0200 Subject: [PATCH 212/432] test --- basilisk/basilisk_MSG.c | 2 +- iguana/dpow/dpow_network.c | 20 ++++++++++---------- iguana/iguana_payments.c | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 25b2d7b36..22c9e662c 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -463,7 +463,7 @@ uint32_t basilisk_majority32(int32_t *datalenp,uint32_t rawcrcs[64],int32_t data numcandidates++; } } - printf("n.%d -> numcandidates.%d\n",i,numcandidates); + //printf("n.%d -> numcandidates.%d\n",i,numcandidates); if ( numcandidates > 0 ) { for (j=0; jpacket,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + char *retstr; + //for (i=0; ipacket,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( 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 ) @@ -161,7 +161,7 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int retval = -2; //printf("no rep return? recvbytes.%d\n",recvbytes); } - printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); + //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); free(dexp); } else retval = -1; return(retval); @@ -206,10 +206,10 @@ int32_t dex_subsock_poll(struct supernet_info *myinfo) int32_t size= -1; struct dex_nanomsghdr *dexp; if ( myinfo->subsock >= 0 && (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) { - printf("SUBSOCK.%08x recv.%d datalen.%d\n",dexp->crc32,size,dexp->datalen); + //printf("SUBSOCK.%08x recv.%d datalen.%d\n",dexp->crc32,size,dexp->datalen); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - printf("SUBSOCK.%08x ",dexp->crc32); + //printf("SUBSOCK.%08x ",dexp->crc32); dex_packet(myinfo,dexp,size); } if ( dexp != 0 ) @@ -1008,7 +1008,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - printf("FROM BUS.%08x -> pub\n",dexp->crc32); + //printf("FROM BUS.%08x -> pub\n",dexp->crc32); nn_send(myinfo->pubsock,dexp,size,0); dex_packet(myinfo,dexp,size); } @@ -1026,13 +1026,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); nn_send(myinfo->pubsock,dexp,size,0); - printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + //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); } //printf("GOT DEX rep PACKET.%d\n",size); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 046fbaff5..bb27f597a 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -172,7 +172,7 @@ int32_t iguana_RTbestunspent(struct supernet_info *myinfo,struct iguana_info *co continue; 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 ) From 81b415b40fd88f2a19566d53ea5bb1d2d48c7017 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:20:07 +0200 Subject: [PATCH 213/432] test --- basilisk/basilisk_swap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 20f904791..f6ee60065 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1695,16 +1695,18 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap void basilisk_swaploop(void *_swap) { - uint8_t *data; uint32_t expiration; 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 retval=0,i,j,datalen,maxlen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfo; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); data = malloc(maxlen); expiration = (uint32_t)time(NULL) + 600; myinfo->DEXactive = expiration; + 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); 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 @@ -1893,9 +1895,9 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,struct } if ( statebits != 0 || m > 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); + //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 ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) { From 4fe94fdc2d27053ccd117a127d133f1220ecd863 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:31:47 +0200 Subject: [PATCH 214/432] test --- basilisk/basilisk_DEX.c | 6 +++--- basilisk/basilisk_tradebot.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 1b8cf6d54..64e59f7dc 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -391,9 +391,9 @@ struct basilisk_request *_basilisk_requests_uniq(struct supernet_info *myinfo,in if ( refrp != 0 ) { requests[0] = *refrp; - for (i=0; i Date: Mon, 26 Dec 2016 12:38:49 +0200 Subject: [PATCH 215/432] test --- basilisk/basilisk_swap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index f6ee60065..33a1696c5 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1503,7 +1503,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(1);//3 + (swap->iambob == 0)*10); + sleep(3 + (swap->iambob == 0)*10); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) @@ -1686,7 +1686,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(1);//3 + (swap->iambob == 0)); + sleep(3 + (swap->iambob == 0)); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } @@ -1714,7 +1714,7 @@ void basilisk_swaploop(void *_swap) basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; - sleep(1); + sleep(3); dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); } @@ -1727,7 +1727,7 @@ void basilisk_swaploop(void *_swap) swap->I.statebits |= 0x20; break; } - sleep(1);//3 + (swap->iambob == 0)*10); + sleep(3 + (swap->iambob == 0)*10); dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); } @@ -1817,7 +1817,7 @@ void basilisk_swaploop(void *_swap) } while ( basilisk_swapiteration(myinfo,swap,data,maxlen) == 0 ) { - sleep(1); + sleep(3); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( time(NULL) > swap->I.expiration ) From e625a04e12f284931b86005e494ba2bea96e031d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:39:45 +0200 Subject: [PATCH 216/432] 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 33a1696c5..8ff43ed2e 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1503,7 +1503,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(3 + (swap->iambob == 0)*10); + sleep(3 + (swap->I.iambob == 0)*10); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); basilisk_sendstate(myinfo,swap,data,maxlen); if ( (swap->I.otherstatebits & 0x80) == 0 ) @@ -1686,7 +1686,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(3 + (swap->iambob == 0)); + sleep(3 + (swap->I.iambob == 0)); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); } @@ -1727,7 +1727,7 @@ void basilisk_swaploop(void *_swap) swap->I.statebits |= 0x20; break; } - sleep(3 + (swap->iambob == 0)*10); + sleep(3 + (swap->I.iambob == 0)*10); dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); } From daf3fa0e27e08896140a71822a095b499852e89d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:45:55 +0200 Subject: [PATCH 217/432] test --- basilisk/basilisk_swap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 8ff43ed2e..39b069197 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1721,6 +1721,8 @@ void basilisk_swaploop(void *_swap) 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 ) { From c0d3518ab995270e59b01589c6fb407562967aa4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 12:51:20 +0200 Subject: [PATCH 218/432] test --- basilisk/basilisk_swap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 39b069197..7887c7326 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1503,7 +1503,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(3 + (swap->I.iambob == 0)*10); + sleep(3 + (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 ) @@ -1714,9 +1714,9 @@ void basilisk_swaploop(void *_swap) basilisk_waitchoosei(myinfo,swap,data,maxlen); // wait for choosei 0x08 if ( (swap->I.statebits & (0x08|0x02)) == (0x08|0x02) ) break; - sleep(3); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + sleep(1); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } while ( (swap->I.statebits & 0x20) == 0 && time(NULL) < expiration ) { @@ -1729,7 +1729,7 @@ void basilisk_swaploop(void *_swap) swap->I.statebits |= 0x20; break; } - sleep(3 + (swap->I.iambob == 0)*10); + sleep(3 + (swap->I.iambob == 0)*1); dpow_nanomsg_update(myinfo); dex_updateclient(myinfo); } From 0972f2ee5cca4d07b2b35a23cec9184224d4ba51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 13:02:27 +0200 Subject: [PATCH 219/432] test --- basilisk/basilisk_swap.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7887c7326..bfa24b93b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -866,9 +866,12 @@ 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]) { - 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 ) + { + if ( (rand() % 10) == 0 ) + basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); return(nextbits); + } else return(0); } @@ -1730,8 +1733,8 @@ void basilisk_swaploop(void *_swap) break; } sleep(3 + (swap->I.iambob == 0)*1); - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); } if ( time(NULL) >= expiration ) retval = -1; @@ -1739,8 +1742,8 @@ void basilisk_swaploop(void *_swap) printf("C r%u/q%u swapstate.%x\n",swap->I.req.requestid,swap->I.req.quoteid,swap->I.statebits); while ( retval == 0 && (swap->I.statebits & 0x40) == 0 ) // send fee { - dpow_nanomsg_update(myinfo); - dex_updateclient(myinfo); + //dpow_nanomsg_update(myinfo); + //dex_updateclient(myinfo); basilisk_sendstate(myinfo,swap,data,maxlen); basilisk_swapget(myinfo,swap,0x80000000,data,maxlen,basilisk_verify_otherstatebits); if ( swap->myfee.txbytes == 0 ) @@ -1824,8 +1827,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 ) From 794108a472a4404b6fbfd5c921425ddf2e229a80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 13:06:43 +0200 Subject: [PATCH 220/432] test --- basilisk/basilisk_swap.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index bfa24b93b..af01d9432 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -866,12 +866,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 ) - { - if ( (rand() % 10) == 0 ) - basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); return(nextbits); - } else return(0); } From 868fd035c44b1baffbab106f124cbcf277285936 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 13:25:50 +0200 Subject: [PATCH 221/432] test --- basilisk/basilisk_DEX.c | 4 ++-- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_swap.c | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 64e59f7dc..9ba011a28 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -595,8 +595,8 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr) if ( (reqjson= basilisk_requestjson(&R)) != 0 ) free_json(reqjson); datalen = basilisk_rwDEXquote(1,serialized,&R); - int32_t i; 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); break; @@ -1810,6 +1812,9 @@ void basilisk_swaploop(void *_swap) 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(" alice fee %p\n",swap->myfee.txbytes); } else { From 87df986316b49207a8a82c22cf8b7de5997073cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 13:32:12 +0200 Subject: [PATCH 222/432] test --- basilisk/basilisk_swap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 37dc90e53..fc58ea46f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -866,11 +866,12 @@ 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 ) + //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); - else return(0); + basilisk_channelsend(myinfo,swap->I.myhash,swap->I.otherhash,swap->I.req.quoteid,msgbits,data,datalen,INSTANTDEX_LOCKTIME*2); + return(0); } 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) From baf23222d994c98aaf89650945da58b303662383 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 13:40:37 +0200 Subject: [PATCH 223/432] test --- basilisk/basilisk_swap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index fc58ea46f..37b0fd43f 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1815,7 +1815,10 @@ void basilisk_swaploop(void *_swap) basilisk_txlog(myinfo,swap,&swap->myfee,-1); for (i=0; imyfee.I.spendlen; i++) printf("%02x",swap->myfee.txbytes[i]); - printf(" alice fee %p\n",swap->myfee.txbytes); + printf(" alice fee %p %x\n",swap->myfee.txbytes,swap->I.statebits); + swap->I.statebits |= 0x40; + if ( swap->alicepayment.txbytes != 0 && swap->alicepayment.I.spendlen > 0 ) + break; } else { From 88d05f55cf661782b22cb751bcbf0d756c5662c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 15:30:56 +0200 Subject: [PATCH 224/432] test --- basilisk/basilisk_bitcoin.c | 39 ++++++++++- basilisk/basilisk_swap.c | 2 +- iguana/dPoW.h | 6 +- iguana/dpow/dpow_network.c | 130 +++++++++++++++++++++++++++--------- iguana/iguana_notary.c | 6 +- 5 files changed, 141 insertions(+), 42 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 7c59c74c3..e7813cc76 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -882,7 +882,7 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) { - char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height; + char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n; if ( vals == 0 ) return(clonestr("{\"error\":\"null valsobj\"}")); //if ( myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0 ) @@ -894,12 +894,12 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) } 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 ) { - txid = jbits256(vals,"txid"); - vout = jint(vals,"vout"); if ( (txoutjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) { if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= SATOSHIDEN*jdouble(txoutjson,"value")) != 0 ) @@ -936,6 +936,39 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) return(retstr); } } + if ( myinfo->reqsock >= 0 ) + { + if ( coin != 0 && (retstr= dex_getrawtransaction(myinfo,coin->symbol,txid)) != 0 ) + { + if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) + { + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); + printf("txjson.(%s)\n",jprint(txjson,0)); + if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= j64bits(txjson,"value") * SATOSHIDEN) != 0 ) + { + jaddstr(retjson,"address",coinaddr); + jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"value",dstr(value)); + //height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); + //jaddnum(retjson,"height",height); + jaddnum(retjson,"numconfirms",jint(txjson,"confirmations")); + + jaddbits256(retjson,"txid",txid); + jaddnum(retjson,"vout",vout); + jaddstr(retjson,"coin",coin->symbol); + free(retstr); + free_json(txoutjson); + return(jprint(retjson,1)); + } + } + free_json(txoutjson); + } + free(retstr); + } + } return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); } diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 37b0fd43f..31e3596b9 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -257,7 +257,7 @@ int32_t basilisk_numconfirms(struct supernet_info *myinfo,struct basilisk_rawtx jaddstr(argjson,"coin",rawtx->coin->symbol); if ( (valstr= basilisk_value(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,argjson,0)) != 0 ) { - //char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->actualtxid),valstr); + //char str[65]; printf("%s %s valstr.(%s)\n",rawtx->name,bits256_str(str,rawtx->I.actualtxid),valstr); if ( (valuearray= cJSON_Parse(valstr)) != 0 ) { if ( is_cJSON_Array(valuearray) != 0 ) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 2df40807a..eb94a0057 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 11 //#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 0x0776 +#define DPOW_VERSION 0x0777 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 @@ -141,12 +141,14 @@ struct dpow_info uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); -int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); int32_t dpow_nanomsg_update(struct supernet_info *myinfo); +char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); +cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c530659c1..1a57f9d61 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -68,9 +68,46 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t } } -int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) +struct dex_request { bits256 txid; char name[15]; uint8_t func; }; + +int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) +{ + int32_t len = 0; + len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->txid),dexreq->txid.bytes); + if ( rwflag != 0 ) + { + memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); + serialized[len++] = dexreq->func; + } + else + { + memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name); + dexreq->func = serialized[len++]; + } + return(len); +} + +char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) +{ + char *retstr = 0; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + if ( strcmp(dexp->handler,"request") == 0 ) + { + dex_rwrequest(0,dexp->packet,&dexreq); + if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) + { + if ( dexreq.func == 'T' ) + { + if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 ) + retstr = jprint(retjson,1); + } + } + } + return(retstr); +} + +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t retval=0,timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; + struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; @@ -130,41 +167,60 @@ int32_t dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int //printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 ) { - ipbits = *retptr; - expand_ipbits(ipaddr,ipbits); - //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); portable_mutex_lock(&myinfo->dexmutex); - n = myinfo->numdexipbits; - for (i=0; idexipbits[i] ) - break; - if ( i == n && n < 64 ) + if ( strcmp(handler,"DEX") == 0 ) { - myinfo->dexipbits[n++] = ipbits; - qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); - if ( (myinfo->numdexipbits= n) < 3 ) + ipbits = *retptr; + expand_ipbits(ipaddr,ipbits); + //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); + n = myinfo->numdexipbits; + for (i=0; idexipbits[i] ) + break; + if ( i == n && n < 64 ) { - if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 ) + myinfo->dexipbits[n++] = ipbits; + qsort(myinfo->dexipbits,n,sizeof(uint32_t),_increasing_ipbits); + if ( (myinfo->numdexipbits= n) < 3 ) { - nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); - printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); + if ( myinfo->IAMNOTARY == 0 && myinfo->subsock >= 0 ) + { + nn_connect(myinfo->subsock,nanomsg_tcpname(0,str,ipaddr,PUB_SOCK)); + printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); + } } + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); - printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); + nn_freemsg(retptr); + } + else + { + retstr = (char *)retptr; + printf("REQ got (%s)\n",retstr); } portable_mutex_unlock(&myinfo->dexmutex); - nn_freemsg(retptr); } else { - retval = -2; + //retval = -2; //printf("no rep return? recvbytes.%d\n",recvbytes); } //printf("DEXREQ.[%d] crc32.%08x datalen.%d sent.%d recv.%d timestamp.%u\n",size,dexp->crc32,datalen,sentbytes,recvbytes,dexp->timestamp); free(dexp); - } else retval = -1; - return(retval); + } //else retval = -1; + return(retstr); +} + +char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) +{ + struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.txid = txid; + dexreq.func = 'T'; + datalen = dex_rwrequest(1,packet,&dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) @@ -937,7 +993,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n=0,num=0,size,firstz = -1; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; + int32_t i,n=0,num=0,size,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); @@ -1022,18 +1078,26 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { num++; - if ( (m= myinfo->numdpowipbits) > 0 ) + if ( (retstr= dex_response(myinfo,dexp)) != 0 ) { - r = myinfo->dpowipbits[rand() % m]; - nn_send(myinfo->repsock,&r,sizeof(r),0); - //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); - } else printf("illegal state without dpowipbits?\n"); - if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); + free(retstr); + } + else { - nn_send(myinfo->dexsock,dexp,size,0); - nn_send(myinfo->pubsock,dexp,size,0); - //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); + if ( (m= myinfo->numdpowipbits) > 0 ) + { + r = myinfo->dpowipbits[rand() % m]; + nn_send(myinfo->repsock,&r,sizeof(r),0); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + } else printf("illegal state without dpowipbits?\n"); + if ( dex_packetcheck(myinfo,dexp,size) == 0 ) + { + nn_send(myinfo->dexsock,dexp,size,0); + nn_send(myinfo->pubsock,dexp,size,0); + //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); + } } //printf("GOT DEX rep PACKET.%d\n",size); if ( dexp != 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ebb52cd3f..2c177e665 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -347,16 +347,16 @@ THREE_STRINGS(iguana,passthru,asset,function,hex) TWO_STRINGS(dex,send,hex,handler) { - uint8_t data[8192]; int32_t datalen,retval; + uint8_t data[8192]; int32_t datalen; char *retstr; if ( hex != 0 && (datalen= is_hexstr(hex,0)) > 0 && (datalen>>1) < sizeof(data) ) { datalen >>= 1; decode_hex(data,datalen,hex); if ( handler == 0 || handler[0] == 0 ) handler = "DEX"; - if ( (retval= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) + if ( (retstr= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) return(clonestr("{\"result\":\"success\"}")); - else return(clonestr("{\"error\":\"dex send: retval error\"}")); + else return(retstr); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); } From 3ef32ef712bde6ab7e4a9f744a44f84c9d448191 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 15:41:57 +0200 Subject: [PATCH 225/432] test --- basilisk/basilisk_bitcoin.c | 3 ++- iguana/iguana_msg.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index e7813cc76..5a452141a 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -942,6 +942,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) { if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) { + printf("TX.(%s)\n",jprint(txoutjson,0)); if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) { retjson = cJSON_CreateObject(); @@ -966,7 +967,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) } free_json(txoutjson); } - free(retstr); + return(retstr); } } return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 2c67a3d59..f9a46eec0 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -325,7 +325,7 @@ int32_t iguana_rwmsgalert(struct iguana_info *coin,int32_t rwflag,uint8_t *seria printf("%02x",coin->chain->alertpubkey[i]); char str[65]; printf(" alertpubkey.%d, alerthash2.%s\n",plen,bits256_str(str,alerthash2)); } else msg->siglen = 0; - printf(" ALERT v.%d relay.%lld expires.%lld ID.%d cancel.%d numlist.%d minver.%d maxver.%d subver.(%s) priority.%d comment.(%s) STATUS.(%s) reserved.(%s)\n",msg->version,(long long)msg->relayuntil,(long long)msg->expiration,msg->ID,msg->cancel,msg->numcancellist,msg->minver,msg->maxver,msg->subver,msg->priority,msg->comment,msg->statusbar,msg->reserved); + //printf(" ALERT v.%d relay.%lld expires.%lld ID.%d cancel.%d numlist.%d minver.%d maxver.%d subver.(%s) priority.%d comment.(%s) STATUS.(%s) reserved.(%s)\n",msg->version,(long long)msg->relayuntil,(long long)msg->expiration,msg->ID,msg->cancel,msg->numcancellist,msg->minver,msg->maxver,msg->subver,msg->priority,msg->comment,msg->statusbar,msg->reserved); return(len); } @@ -1251,7 +1251,7 @@ int32_t iguana_msgparser(struct supernet_info *myinfo,struct iguana_info *coin,s //printf("error.(%s) (%s): len.%d != recvlen.%d\n",H->command,addr->ipaddr,len,recvlen); //for (i=0; icommand,"addr") != 0 && (coin->chain->auxpow == 0 || strcmp(H->command,"headers") != 0) ) + if ( len != 0 && strcmp(H->command,"addr") != 0 && (coin->chain->auxpow == 0 || strcmp(H->command,"headers") != 0) && strcmp(H->command,"alert") != 0 ) printf("%s %s.%s len mismatch %d != %d\n",coin->symbol,addr!=0?addr->ipaddr:"local",H->command,len,recvlen); } else if ( len != recvlen && recvlen > 1 ) From 2c2578017997dcafc854c0509e2044969f2b0fc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 15:52:02 +0200 Subject: [PATCH 226/432] test --- iguana/dpow/dpow_network.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 1a57f9d61..c8d8a544e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -95,12 +95,15 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) dex_rwrequest(0,dexp->packet,&dexreq); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { + printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( dexreq.func == 'T' ) { if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 ) retstr = jprint(retjson,1); } } + if ( retstr == 0 ) + return(clonestr("{\"error\":\"null return\"}")); } return(retstr); } @@ -197,7 +200,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 else { retstr = (char *)retptr; - printf("REQ got (%s)\n",retstr); + printf("REQ got.%d (%s)\n",recvbytes,retstr); } portable_mutex_unlock(&myinfo->dexmutex); } From 45ea6f3396c7766fe06629518d159622a001f346 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 16:00:31 +0200 Subject: [PATCH 227/432] 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 c8d8a544e..c7aabe834 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -195,13 +195,13 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } - nn_freemsg(retptr); } else { - retstr = (char *)retptr; + retstr = clonestr((char *)retptr); printf("REQ got.%d (%s)\n",recvbytes,retstr); } + nn_freemsg(retptr); portable_mutex_unlock(&myinfo->dexmutex); } else From 0ac56297795891f42d177f576bfb801edf17f50f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 16:05:34 +0200 Subject: [PATCH 228/432] 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 31e3596b9..7b1966bc9 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1064,7 +1064,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil { swap->bobcoin = iguana_coinfind("BTC"); swap->I.bobsatoshis = swap->I.req.srcamount; - swap->I.bobconfirms = (1 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + 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; @@ -1073,7 +1073,7 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,struct basil { swap->bobcoin = iguana_coinfind("BTC"); swap->I.bobsatoshis = swap->I.req.destamount; - swap->I.bobconfirms = (1 + sqrt(dstr(swap->I.bobsatoshis) * .1)); + 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; From f70bfc86596beac8abcb44144170dc5bd79a9166 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Dec 2016 16:13:07 +0200 Subject: [PATCH 229/432] test --- basilisk/basilisk.h | 2 +- basilisk/basilisk_bitcoin.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 2f8e95527..e4bd8c5ef 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -17,7 +17,7 @@ #define H_BASILISK_H //#define BASILISK_DISABLESENDTX -//#define BASILISK_DISABLEWAITTX +#define BASILISK_DISABLEWAITTX #include "../iguana/iguana777.h" diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 5a452141a..89a8d23d7 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -943,10 +943,10 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) { printf("TX.(%s)\n",jprint(txoutjson,0)); + retjson = cJSON_CreateObject(); + jaddstr(retjson,"result","success"); if ( (array= jarray(&n,txoutjson,"vout")) != 0 && vout < n && (txjson= jitem(array,vout)) != 0 ) { - retjson = cJSON_CreateObject(); - jaddstr(retjson,"result","success"); printf("txjson.(%s)\n",jprint(txjson,0)); if ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= j64bits(txjson,"value") * SATOSHIDEN) != 0 ) { @@ -965,7 +965,9 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) return(jprint(retjson,1)); } } + jaddnum(retjson,"numconfirms",0); free_json(txoutjson); + return(jprint(retjson,1)); } return(retstr); } From c999d54b90bf7e8b673057fc24997e3968282b13 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 08:48:05 +0200 Subject: [PATCH 230/432] test --- iguana/dpow/dpow_rpc.c | 13 +++++++++---- iguana/iguana_notary.c | 5 +++++ iguana/tests/dexgetT | 2 ++ includes/iguana_apideclares.h | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100755 iguana/tests/dexgetT diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index ec3356c98..708abb34f 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -254,14 +254,19 @@ char *dpow_decoderawtransaction(struct supernet_info *myinfo,struct iguana_info cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid) { - char buf[128],str[65],*retstr=0,*rawtx=0; cJSON *json = 0; + char buf[128],str[65],*retstr=0,*raw,*rawtx=0; cJSON *rawjson,*json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", 1]",bits256_str(str,txid)); - if ( (rawtx= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) + if ( (raw= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) { - retstr = dpow_decoderawtransaction(myinfo,coin,rawtx); - free(rawtx); + if ( (rawjson= cJSON_Parse(raw)) != 0 ) + { + if ( (rawtx= jstr(rawjson,"result")) != 0 ) + retstr = dpow_decoderawtransaction(myinfo,coin,rawtx); + free_json(rawjson); + } + free(raw); } usleep(10000); } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 2c177e665..13acf7414 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -502,6 +502,11 @@ TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified) } return(clonestr("{\"result\":\"started ratification\"}")); } + +HASH_AND_STRING(dex,gettransaction,txid,symbol) +{ + return(dex_getrawtransaction(myinfo,symbol,txid)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexgetT b/iguana/tests/dexgetT new file mode 100755 index 000000000..3b5689fc0 --- /dev/null +++ b/iguana/tests/dexgetT @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettransaction\",\"txid\":\"aa82ebd1c5bd2a9e19214cbc959df1745378676fddfd6f4903930ac16485c7ae\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index b5e083a5c..2c3ec351c 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -21,6 +21,7 @@ ZERO_ARGS(dpow,cancelratify); THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); TWO_STRINGS(dex,send,hex,handler); +HASH_AND_STRING(dex,gettransaction,txid,symbol); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From ddd581299ce5c0de18ad766e74f521441aeb92ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 08:50:53 +0200 Subject: [PATCH 231/432] test --- iguana/dpow/dpow_rpc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 708abb34f..837f30e5c 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -260,6 +260,7 @@ cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin sprintf(buf,"[\"%s\", 1]",bits256_str(str,txid)); if ( (raw= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) { + printf("RAW.(%s)\n",raw); if ( (rawjson= cJSON_Parse(raw)) != 0 ) { if ( (rawtx= jstr(rawjson,"result")) != 0 ) From 7ae7c2c456869aaab88c3e9a35d049e83f93e0e4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 08:53:34 +0200 Subject: [PATCH 232/432] test --- iguana/dpow/dpow_rpc.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 837f30e5c..a2c9fd3a1 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -254,20 +254,12 @@ char *dpow_decoderawtransaction(struct supernet_info *myinfo,struct iguana_info cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid) { - char buf[128],str[65],*retstr=0,*raw,*rawtx=0; cJSON *rawjson,*json = 0; + char buf[128],str[65],*retstr=0; cJSON *json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", 1]",bits256_str(str,txid)); - if ( (raw= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) + if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) { - printf("RAW.(%s)\n",raw); - if ( (rawjson= cJSON_Parse(raw)) != 0 ) - { - if ( (rawtx= jstr(rawjson,"result")) != 0 ) - retstr = dpow_decoderawtransaction(myinfo,coin,rawtx); - free_json(rawjson); - } - free(raw); } usleep(10000); } From a3fff757279ad595272d76af5d92aad35dec3e8b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 09:40:04 +0200 Subject: [PATCH 233/432] test --- basilisk/basilisk_bitcoin.c | 34 ++++++++++++++++++++++------------ iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 16 +++++++++++++++- iguana/dpow/dpow_rpc.c | 25 +++++++++++++++++++++++++ iguana/tests/value | 2 ++ 5 files changed, 65 insertions(+), 13 deletions(-) create mode 100755 iguana/tests/value diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 89a8d23d7..665f3c9d7 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -882,7 +882,7 @@ cJSON *BTC_makeclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) { - char *retstr=0,*symbol,*coinaddr; cJSON *retjson,*txoutjson,*txjson,*array; uint32_t basilisktag,blocktime; bits256 txid,blockhash; struct basilisk_item *ptr,Lptr; uint64_t value; int32_t timeoutmillis,vout,height,n; + 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 ) @@ -938,34 +938,44 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) } if ( myinfo->reqsock >= 0 ) { - if ( coin != 0 && (retstr= dex_getrawtransaction(myinfo,coin->symbol,txid)) != 0 ) + if ( (retstr= dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) { if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) { - printf("TX.(%s)\n",jprint(txoutjson,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 ( (coinaddr= jstr(txoutjson,"address")) != 0 && (value= j64bits(txjson,"value") * SATOSHIDEN) != 0 ) + //printf("txjson.(%s)\n",jprint(txjson,0)); + if ( (value= jdouble(txjson,"value") * SATOSHIDEN) != 0 ) { - jaddstr(retjson,"address",coinaddr); + 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)); - //height = dpow_getchaintip(myinfo,&blockhash,&blocktime,0,0,coin); - //jaddnum(retjson,"height",height); - jaddnum(retjson,"numconfirms",jint(txjson,"confirmations")); - + 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",coin->symbol); + jaddstr(retjson,"coin",symbol); free(retstr); free_json(txoutjson); return(jprint(retjson,1)); } } - jaddnum(retjson,"numconfirms",0); free_json(txoutjson); return(jprint(retjson,1)); } diff --git a/iguana/dPoW.h b/iguana/dPoW.h index eb94a0057..15a481784 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -150,5 +150,6 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo int32_t dpow_nanomsg_update(struct supernet_info *myinfo); char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); +char *dex_getinfo(struct supernet_info *myinfo,char *symbol); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c7aabe834..6c3c32814 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -101,6 +101,10 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 ) retstr = jprint(retjson,1); } + else if ( dexreq.func == 'I' ) + { + + } } if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); @@ -199,7 +203,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 else { retstr = clonestr((char *)retptr); - printf("REQ got.%d (%s)\n",recvbytes,retstr); + //printf("REQ got.%d (%s)\n",recvbytes,retstr); } nn_freemsg(retptr); portable_mutex_unlock(&myinfo->dexmutex); @@ -226,6 +230,16 @@ char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 tx return(dex_reqsend(myinfo,"request",packet,datalen)); } +char *dex_getinfo(struct supernet_info *myinfo,char *symbol) +{ + struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'I'; + datalen = dex_rwrequest(1,packet,&dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index a2c9fd3a1..2d32d6c34 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -146,6 +146,31 @@ bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin, return(blockhash); } +cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char buf[128],*retstr=0; cJSON *json = 0; + if ( coin->FULLNODE < 0 ) + { + buf[0] = 0; + retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getinfo",buf); + usleep(10000); + } + else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + { + retstr = bitcoinrpc_getinfo(myinfo,coin,0,0); + } + else + { + return(0); + } + if ( retstr != 0 ) + { + json = cJSON_Parse(retstr); + free(retstr); + } + return(json); +} + cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits256 blockhash) { char buf[128],str[65],*retstr=0; cJSON *json = 0; diff --git a/iguana/tests/value b/iguana/tests/value new file mode 100755 index 000000000..e6e38ee74 --- /dev/null +++ b/iguana/tests/value @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"value\",\"vals\":{\"vout\":0,\"txid\":\"aa82ebd1c5bd2a9e19214cbc959df1745378676fddfd6f4903930ac16485c7ae\",\"symbol\":\"BTC\"}}" From 85d483422628cdc8c3ee5a0799c79344d29d3229 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 09:43:15 +0200 Subject: [PATCH 234/432] test --- iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 15a481784..195597767 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -151,5 +151,6 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo); char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); char *dex_getinfo(struct supernet_info *myinfo,char *symbol); +cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6c3c32814..e1c104a17 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -103,7 +103,8 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) } else if ( dexreq.func == 'I' ) { - + if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) + retstr = jprint(retjson,1); } } if ( retstr == 0 ) From 55dbce717ce33509574008182df9b91222a30c59 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 09:46:25 +0200 Subject: [PATCH 235/432] 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 e1c104a17..84d81f721 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -93,9 +93,9 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) if ( strcmp(dexp->handler,"request") == 0 ) { dex_rwrequest(0,dexp->packet,&dexreq); + printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { - printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( dexreq.func == 'T' ) { if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 ) From e397b2d3677ce1165eab8564b58f40892308c41e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 10:00:40 +0200 Subject: [PATCH 236/432] test --- iguana/dpow/dpow_network.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 84d81f721..945219484 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -90,6 +90,8 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { char *retstr = 0; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + dex_rwrequest(0,dexp->packet,&dexreq); + printf("(%s) dex_response.%s (%c)\n",dexp->handler,dexreq.name,dexreq.func); if ( strcmp(dexp->handler,"request") == 0 ) { dex_rwrequest(0,dexp->packet,&dexreq); @@ -169,18 +171,29 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 dexp->version1 = (DEX_VERSION >> 8) & 0xff; memcpy(dexp->packet,data,datalen); dexp->crc32 = calc_crc32(0,data,datalen); - sentbytes = nn_send(myinfo->reqsock,dexp,size,0); + for (i=0; i<100; i++) + { + struct nn_pollfd pfd; + pfd.fd = myinfo->reqsock; + pfd.events = NN_POLLOUT; + if ( nn_poll(&pfd,1,100) > 0 ) + { + sentbytes = nn_send(myinfo->reqsock,dexp,size,0); + printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); + break; + } + usleep(1000); + } //for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) { + printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); if ( strcmp(handler,"DEX") == 0 ) { ipbits = *retptr; expand_ipbits(ipaddr,ipbits); - //printf("req returned.[%d] %08x %s\n",recvbytes,*retptr,ipaddr); n = myinfo->numdexipbits; for (i=0; idexipbits[i] ) @@ -1096,6 +1109,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { num++; + printf("REP got %d\n",size); if ( (retstr= dex_response(myinfo,dexp)) != 0 ) { nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); @@ -1107,7 +1121,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { From 4fb6af1a9c2e2747039c27a6988562049eba31fd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 10:06:23 +0200 Subject: [PATCH 237/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 945219484..6dbc62e9e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -179,7 +179,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 if ( nn_poll(&pfd,1,100) > 0 ) { sentbytes = nn_send(myinfo->reqsock,dexp,size,0); - printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); + //printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); break; } usleep(1000); @@ -188,7 +188,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 // printf("%02x",((uint8_t *)data)[i]); if ( (recvbytes= nn_recv(myinfo->reqsock,&retptr,NN_MSG,0)) >= 0 ) { - printf("req returned.[%d]\n",recvbytes); + //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); if ( strcmp(handler,"DEX") == 0 ) { @@ -210,7 +210,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); +//nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } } @@ -1109,7 +1109,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) { num++; - printf("REP got %d\n",size); + //printf("REP got %d\n",size); if ( (retstr= dex_response(myinfo,dexp)) != 0 ) { nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); @@ -1121,7 +1121,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { From 43235cf745fd57d83a1c202438af925b98d6f56a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 10:29:38 +0200 Subject: [PATCH 238/432] test --- basilisk/basilisk_bitcoin.c | 4 +- iguana/dPoW.h | 14 +++++-- iguana/dpow/dpow_network.c | 64 ++++++++++++++++++++++++++++---- iguana/iguana_notary.c | 25 ++++++++++++- iguana/tests/dexgetB | 2 + iguana/tests/dexgetH | 2 + iguana/tests/dexgetbestblockhash | 2 + iguana/tests/dexgetinfo | 2 + includes/iguana_apideclares.h | 4 ++ 9 files changed, 106 insertions(+), 13 deletions(-) create mode 100755 iguana/tests/dexgetB create mode 100755 iguana/tests/dexgetH create mode 100755 iguana/tests/dexgetbestblockhash create mode 100755 iguana/tests/dexgetinfo diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 665f3c9d7..dcc261f89 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -938,7 +938,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) } if ( myinfo->reqsock >= 0 ) { - if ( (retstr= dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) + if ( (retstr= _dex_getrawtransaction(myinfo,symbol,txid)) != 0 ) { if ( (txoutjson= cJSON_Parse(retstr)) != 0 ) { @@ -955,7 +955,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) jaddstr(retjson,"address",coinaddr); jadd64bits(retjson,"satoshis",value); jaddnum(retjson,"value",dstr(value)); - if ( (infostr= dex_getinfo(myinfo,symbol)) != 0 ) + if ( (infostr= _dex_getinfo(myinfo,symbol)) != 0 ) { if ( (info= cJSON_Parse(infostr)) != 0 ) { diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 195597767..63b9e2f2c 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -148,9 +148,17 @@ cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits2 int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); int32_t dpow_nanomsg_update(struct supernet_info *myinfo); -char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); -cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); -char *dex_getinfo(struct supernet_info *myinfo,char *symbol); + cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin); +cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); +cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits256 blockhash); +bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height); +bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); + +char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); +char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); +char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2); +char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height); +char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6dbc62e9e..119f36a6c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -68,12 +68,13 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t } } -struct dex_request { bits256 txid; char name[15]; uint8_t func; }; +struct dex_request { bits256 hash; int32_t height; char name[15]; uint8_t func; }; int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) { int32_t len = 0; - len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->txid),dexreq->txid.bytes); + len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->height),&dexreq->height); if ( rwflag != 0 ) { memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); @@ -89,7 +90,7 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { - char *retstr = 0; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + char buf[65],*retstr = 0; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; dex_rwrequest(0,dexp->packet,&dexreq); printf("(%s) dex_response.%s (%c)\n",dexp->handler,dexreq.name,dexreq.func); if ( strcmp(dexp->handler,"request") == 0 ) @@ -100,7 +101,18 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { if ( dexreq.func == 'T' ) { - if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.txid)) != 0 ) + if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) + retstr = jprint(retjson,1); + } + else if ( dexreq.func == 'H' ) + { + hash2 = dpow_getblockhash(myinfo,coin,dexreq.height); + bits256_str(buf,hash2); + retstr = clonestr(buf); + } + else if ( dexreq.func == 'B' ) + { + if ( (retjson= dpow_getblock(myinfo,coin,dexreq.hash)) != 0 ) retstr = jprint(retjson,1); } else if ( dexreq.func == 'I' ) @@ -108,6 +120,12 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) retstr = jprint(retjson,1); } + else if ( dexreq.func == 'P' ) + { + hash2 = dpow_getbestblockhash(myinfo,coin); + bits256_str(buf,hash2); + retstr = clonestr(buf); + } } if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); @@ -233,18 +251,18 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -char *dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) +char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) { struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.txid = txid; + dexreq.hash = txid; dexreq.func = 'T'; datalen = dex_rwrequest(1,packet,&dexreq); return(dex_reqsend(myinfo,"request",packet,datalen)); } -char *dex_getinfo(struct supernet_info *myinfo,char *symbol) +char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) { struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; memset(&dexreq,0,sizeof(dexreq)); @@ -254,6 +272,38 @@ char *dex_getinfo(struct supernet_info *myinfo,char *symbol) return(dex_reqsend(myinfo,"request",packet,datalen)); } +char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) +{ + struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.hash = hash2; + dexreq.func = 'B'; + datalen = dex_rwrequest(1,packet,&dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + +char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height) +{ + struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.height = height; + dexreq.func = 'H'; + datalen = dex_rwrequest(1,packet,&dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + +char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) +{ + struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'P'; + datalen = dex_rwrequest(1,packet,&dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 13acf7414..0a20a5356 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -505,8 +505,31 @@ TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified) HASH_AND_STRING(dex,gettransaction,txid,symbol) { - return(dex_getrawtransaction(myinfo,symbol,txid)); + return(_dex_getrawtransaction(myinfo,symbol,txid)); } + +STRING_ARG(dex,getinfo,symbol) +{ + return(_dex_getinfo(myinfo,symbol)); +} + +STRING_ARG(dex,getbestblockhash,symbol) +{ + return(_dex_getbestblockhash(myinfo,symbol)); +} + +STRING_AND_INT(dex,getblockhash,symbol,height) +{ + return(_dex_getblockhash(myinfo,symbol,height)); +} + +HASH_AND_STRING(dex,getblock,hash,symbol) +{ + return(_dex_getblock(myinfo,symbol,hash)); +} + + + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexgetB b/iguana/tests/dexgetB new file mode 100755 index 000000000..6de5f1e08 --- /dev/null +++ b/iguana/tests/dexgetB @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblock\",\"hash\":\"0000000000000000033245c0bd104a80c2a7ed7e04330e034d4833f9928d18e7\",\"symbol\":\"BTC\"}" diff --git a/iguana/tests/dexgetH b/iguana/tests/dexgetH new file mode 100755 index 000000000..8b1963442 --- /dev/null +++ b/iguana/tests/dexgetH @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"height\":400000,\"symbol\":\"BTC\"}" diff --git a/iguana/tests/dexgetbestblockhash b/iguana/tests/dexgetbestblockhash new file mode 100755 index 000000000..45b501dcc --- /dev/null +++ b/iguana/tests/dexgetbestblockhash @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getbestblockhash\",\"symbol\":\"BTC\"}" diff --git a/iguana/tests/dexgetinfo b/iguana/tests/dexgetinfo new file mode 100755 index 000000000..d31b736a6 --- /dev/null +++ b/iguana/tests/dexgetinfo @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getinfo\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 2c3ec351c..4e4ce4927 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -22,6 +22,10 @@ THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); +STRING_ARG(dex,getinfo,symbol); +STRING_ARG(dex,getbestblockhash,symbol); +STRING_AND_INT(dex,getblockhash,symbol,height); +HASH_AND_STRING(dex,getblock,hash,symbol); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From 592bf54ef2a775a94b2b7a862a8492ca92ddb6c6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 10:34:46 +0200 Subject: [PATCH 239/432] test --- iguana/dpow/dpow_network.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 119f36a6c..fd9fb177e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -91,12 +91,10 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { char buf[65],*retstr = 0; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; - dex_rwrequest(0,dexp->packet,&dexreq); - printf("(%s) dex_response.%s (%c)\n",dexp->handler,dexreq.name,dexreq.func); if ( strcmp(dexp->handler,"request") == 0 ) { dex_rwrequest(0,dexp->packet,&dexreq); - printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); + //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { if ( dexreq.func == 'T' ) From a2c1690791ef6e4fda63c01c71edbad2f9981c62 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 10:55:08 +0200 Subject: [PATCH 240/432] test --- iguana/dPoW.h | 3 ++- iguana/dpow/dpow_network.c | 17 +++++++++++++++++ iguana/iguana_notary.c | 5 ++++- iguana/tests/dexsendrawtransaction | 2 ++ includes/iguana_apideclares.h | 1 + 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 iguana/tests/dexsendrawtransaction diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 63b9e2f2c..4bee6b9f9 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -143,7 +143,6 @@ int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); -char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); @@ -154,11 +153,13 @@ cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits256 blockhash); bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height); bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); +char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2); char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height); char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); +char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index fd9fb177e..3b0e6943c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -124,6 +124,10 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) bits256_str(buf,hash2); retstr = clonestr(buf); } + else if ( dexreq.func == 'S' ) + { + retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[sizeof(dexreq)]); + } } if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); @@ -302,6 +306,19 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) return(dex_reqsend(myinfo,"request",packet,datalen)); } +char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) +{ + struct dex_request dexreq; uint8_t *packet; int32_t datalen; + packet = calloc(1,sizeof(dexreq)+strlen(signedtx)+1); + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'S'; + datalen = dex_rwrequest(1,packet,&dexreq); + strcpy((char *)&packet[sizeof(dexreq)],signedtx); + datalen += strlen(signedtx) + 1; + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 0a20a5356..4d0979140 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -528,7 +528,10 @@ HASH_AND_STRING(dex,getblock,hash,symbol) return(_dex_getblock(myinfo,symbol,hash)); } - +TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx) +{ + return(_dex_sendrawtransaction(myinfo,symbol,signedtx)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexsendrawtransaction b/iguana/tests/dexsendrawtransaction new file mode 100755 index 000000000..a5eb92cac --- /dev/null +++ b/iguana/tests/dexsendrawtransaction @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"sendrawtransaction\",\"signedtx\":\"aa82ebd1c5bd2a9e19214cbc959df1745378676fddfd6f4903930ac16485c7ae\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 4e4ce4927..05f28668e 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -26,6 +26,7 @@ STRING_ARG(dex,getinfo,symbol); STRING_ARG(dex,getbestblockhash,symbol); STRING_AND_INT(dex,getblockhash,symbol,height); HASH_AND_STRING(dex,getblock,hash,symbol); +TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From bd31bd4c0e6bd3f5fc08b828c6870a1f2a905315 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:06:50 +0200 Subject: [PATCH 241/432] test --- iguana/dpow/dpow_network.c | 142 +++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 69 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3b0e6943c..c7673a222 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -68,73 +68,6 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t } } -struct dex_request { bits256 hash; int32_t height; char name[15]; uint8_t func; }; - -int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) -{ - int32_t len = 0; - len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->height),&dexreq->height); - if ( rwflag != 0 ) - { - memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); - serialized[len++] = dexreq->func; - } - else - { - memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name); - dexreq->func = serialized[len++]; - } - return(len); -} - -char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) -{ - char buf[65],*retstr = 0; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; - if ( strcmp(dexp->handler,"request") == 0 ) - { - dex_rwrequest(0,dexp->packet,&dexreq); - //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); - if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) - { - if ( dexreq.func == 'T' ) - { - if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) - retstr = jprint(retjson,1); - } - else if ( dexreq.func == 'H' ) - { - hash2 = dpow_getblockhash(myinfo,coin,dexreq.height); - bits256_str(buf,hash2); - retstr = clonestr(buf); - } - else if ( dexreq.func == 'B' ) - { - if ( (retjson= dpow_getblock(myinfo,coin,dexreq.hash)) != 0 ) - retstr = jprint(retjson,1); - } - else if ( dexreq.func == 'I' ) - { - if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) - retstr = jprint(retjson,1); - } - else if ( dexreq.func == 'P' ) - { - hash2 = dpow_getbestblockhash(myinfo,coin); - bits256_str(buf,hash2); - retstr = clonestr(buf); - } - else if ( dexreq.func == 'S' ) - { - retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[sizeof(dexreq)]); - } - } - if ( retstr == 0 ) - return(clonestr("{\"error\":\"null return\"}")); - } - return(retstr); -} - char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) { struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; char *retstr = 0; @@ -253,6 +186,74 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } +struct dex_request { bits256 hash; int32_t height; char name[15]; uint8_t func; }; + +int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) +{ + int32_t len = 0; + len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->height),&dexreq->height); + if ( rwflag != 0 ) + { + memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); + serialized[len++] = dexreq->func; + } + else + { + memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name); + dexreq->func = serialized[len++]; + } + return(len); +} + +char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) +{ + char buf[65],*retstr = 0; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + if ( strcmp(dexp->handler,"request") == 0 ) + { + dex_rwrequest(0,dexp->packet,&dexreq); + //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); + if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) + { + if ( dexreq.func == 'T' ) + { + if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) + retstr = jprint(retjson,1); + } + else if ( dexreq.func == 'H' ) + { + hash2 = dpow_getblockhash(myinfo,coin,dexreq.height); + bits256_str(buf,hash2); + retstr = clonestr(buf); + } + else if ( dexreq.func == 'B' ) + { + if ( (retjson= dpow_getblock(myinfo,coin,dexreq.hash)) != 0 ) + retstr = jprint(retjson,1); + } + else if ( dexreq.func == 'I' ) + { + if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) + retstr = jprint(retjson,1); + } + else if ( dexreq.func == 'P' ) + { + hash2 = dpow_getbestblockhash(myinfo,coin); + bits256_str(buf,hash2); + retstr = clonestr(buf); + } + else if ( dexreq.func == 'S' ) + { + printf("SEND.(%s)\n",(char *)&dexp->packet[sizeof(dexreq)]); + retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[sizeof(dexreq)]); + } + } + if ( retstr == 0 ) + return(clonestr("{\"error\":\"null return\"}")); + } + return(retstr); +} + char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) { struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; @@ -308,7 +309,7 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) { - struct dex_request dexreq; uint8_t *packet; int32_t datalen; + struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; packet = calloc(1,sizeof(dexreq)+strlen(signedtx)+1); memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); @@ -316,7 +317,10 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si datalen = dex_rwrequest(1,packet,&dexreq); strcpy((char *)&packet[sizeof(dexreq)],signedtx); datalen += strlen(signedtx) + 1; - return(dex_reqsend(myinfo,"request",packet,datalen)); + printf("PACKET.(%s)\n",(char *)&packet[sizeof(dexreq)]); + retstr = dex_reqsend(myinfo,"request",packet,datalen); + free(packet); + return(retstr); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) From 3073d45d23da772c29d806db17f7dab2ee770f80 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:11:10 +0200 Subject: [PATCH 242/432] test --- iguana/dpow/dpow_network.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c7673a222..3c216108f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -208,10 +208,10 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { - char buf[65],*retstr = 0; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + char buf[65],*retstr = 0; int32_t datalen; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; if ( strcmp(dexp->handler,"request") == 0 ) { - dex_rwrequest(0,dexp->packet,&dexreq); + datalen = dex_rwrequest(0,dexp->packet,&dexreq); //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { @@ -244,8 +244,8 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) } else if ( dexreq.func == 'S' ) { - printf("SEND.(%s)\n",(char *)&dexp->packet[sizeof(dexreq)]); - retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[sizeof(dexreq)]); + printf("SEND.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); + retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); } } if ( retstr == 0 ) @@ -315,9 +315,9 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'S'; datalen = dex_rwrequest(1,packet,&dexreq); - strcpy((char *)&packet[sizeof(dexreq)],signedtx); + strcpy((char *)&packet[datalen],signedtx); + printf("PACKET.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(signedtx)); datalen += strlen(signedtx) + 1; - printf("PACKET.(%s)\n",(char *)&packet[sizeof(dexreq)]); retstr = dex_reqsend(myinfo,"request",packet,datalen); free(packet); return(retstr); From 47b838ac5a3c6a9e97d55219de179248fbe3970b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:28:30 +0200 Subject: [PATCH 243/432] test --- crypto777/bitcoind_RPC.c | 5 +++- iguana/dPoW.h | 3 ++- iguana/dpow/dpow_network.c | 50 ++++++++++++++++++++++++++------------ 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 75612a484..60a0fe1de 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -91,8 +91,11 @@ char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char * { if ( strcmp(command,"signrawtransaction") != 0 ) printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC (%s) error.%s\n",debugstr,command,rpcstr); + retstr = rpcstr; + rpcstr = 0; } - free(rpcstr); + if ( rpcstr != 0 ) + free(rpcstr); } else retstr = rpcstr; free_json(json); //fprintf(stderr,"<<<<<<<<<<< bitcoind_RPC: postprocess returns.(%s)\n",retstr); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 4bee6b9f9..11f545955 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -143,7 +143,6 @@ int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); -cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); int32_t dpow_nanomsg_update(struct supernet_info *myinfo); @@ -154,6 +153,7 @@ cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits2 bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin,int32_t height); bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); +cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -161,5 +161,6 @@ char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2); char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height); char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx); +char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 3c216108f..54bead88a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -186,7 +186,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -struct dex_request { bits256 hash; int32_t height; char name[15]; uint8_t func; }; +struct dex_request { bits256 hash; int32_t height; uint16_t vout; char name[15]; uint8_t func; }; int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) { @@ -220,6 +220,11 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) retstr = jprint(retjson,1); } + else if ( dexreq.func == 'O' ) + { + if ( (retjson= dpow_gettxout(myinfo,coin,dexreq.hash,dexreq.vout)) != 0 ) + retstr = jprint(retjson,1); + } else if ( dexreq.func == 'H' ) { hash2 = dpow_getblockhash(myinfo,coin,dexreq.height); @@ -254,57 +259,70 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) return(retstr); } +char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) +{ + uint8_t packet[sizeof(dexreq)]; int32_t datalen; + datalen = dex_rwrequest(1,packet,dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); +} + char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) { - struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; dexreq.func = 'T'; - datalen = dex_rwrequest(1,packet,&dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(_dex_sendrequest(myinfo,&dexreq)); +} + +char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.hash = txid; + dexreq.vout = vout; + dexreq.func = 'O'; + return(_dex_sendrequest(myinfo,&dexreq)); } char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) { - struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'I'; - datalen = dex_rwrequest(1,packet,&dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(_dex_sendrequest(myinfo,&dexreq)); } char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) { - struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = hash2; dexreq.func = 'B'; - datalen = dex_rwrequest(1,packet,&dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(_dex_sendrequest(myinfo,&dexreq)); } char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height) { - struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.height = height; dexreq.func = 'H'; - datalen = dex_rwrequest(1,packet,&dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(_dex_sendrequest(myinfo,&dexreq)); } char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) { - struct dex_request dexreq; uint8_t packet[sizeof(dexreq)]; int32_t datalen; + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'P'; - datalen = dex_rwrequest(1,packet,&dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(_dex_sendrequest(myinfo,&dexreq)); } char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) From 1790bb18064cc1cc09cf5f3e0b72fa97a28742b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:41:09 +0200 Subject: [PATCH 244/432] test --- iguana/dpow/dpow_network.c | 4 +++- iguana/iguana_json.c | 4 ++++ iguana/iguana_notary.c | 5 +++++ iguana/tests/dexgetO | 2 ++ includes/iguana_apideclares.h | 1 + includes/iguana_apidefs.h | 2 ++ includes/iguana_apiundefs.h | 1 + 7 files changed, 18 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/dexgetO diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 54bead88a..d7f78a5b1 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -193,6 +193,7 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex int32_t len = 0; len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->height),&dexreq->height); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->vout),&dexreq->vout); if ( rwflag != 0 ) { memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); @@ -261,7 +262,7 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) { - uint8_t packet[sizeof(dexreq)]; int32_t datalen; + uint8_t packet[sizeof(*dexreq)]; int32_t datalen; datalen = dex_rwrequest(1,packet,dexreq); return(dex_reqsend(myinfo,"request",packet,datalen)); } @@ -279,6 +280,7 @@ char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 t char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) { struct dex_request dexreq; + char str[65]; printf("gettxout(%s %s %d)\n",symbol,bits256_str(str,txid),vout); memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 14471dbc1..ca7a1fea3 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -128,6 +128,7 @@ cJSON *SuperNET_helpjson() #define IGUANA_HELP_HH(agent,name,hash,hash2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#hash2,"hash"))) #define IGUANA_HELP_HA(agent,name,hash,obj) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#obj,"array"))) #define IGUANA_HELP_HS(agent,name,hash,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#str,"str"))) +#define IGUANA_HELP_HSI(agent,name,hash,str,val) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#str,"str"),helpitem(#val,"int"))) #define IGUANA_HELP_HII(agent,name,hash,val,val2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#val,"int"),helpitem(#val2,"int"))) #define IGUANA_HELP_HHS(agent,name,hash,hash2,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#hash2,"hash"),helpitem(#str,"str"))) #define IGUANA_HELP_HAS(agent,name,hash,obj,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#hash,"hash"),helpitem(#obj,"array"),helpitem(#str,"str"))) @@ -152,6 +153,7 @@ cJSON *SuperNET_helpjson() #define STRING_AND_INT IGUANA_HELP_SI #define STRING_AND_TWOINTS IGUANA_HELP_SII #define HASH_AND_STRING IGUANA_HELP_HS +#define HASH_AND_STRING_AND_INT IGUANA_HELP_HSI #define HASH_AND_INT IGUANA_HELP_HI #define HASH_AND_TWOINTS IGUANA_HELP_HII #define DOUBLE_ARG IGUANA_HELP_D @@ -960,6 +962,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define IGUANA_DISPATCH_HH(agent,name,hash,hash2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jbits256(json,#hash2))) #define IGUANA_DISPATCH_HA(agent,name,hash,array) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jobj(json,#array))) #define IGUANA_DISPATCH_HS(agent,name,hash,str) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jstr(json,#str))) +#define IGUANA_DISPATCH_HSI(agent,name,hash,str,val) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jstr(json,#str),jint(json,#val))) #define IGUANA_DISPATCH_HII(agent,name,hash,val,val2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),juint(json,#val),juint(json,#val2))) #define IGUANA_DISPATCH_HHS(agent,name,hash,hash2,str) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jbits256(json,#hash2),jstr(json,#str))) #define IGUANA_DISPATCH_HAS(agent,name,hash,array,str) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jbits256(json,#hash),jobj(json,#array),jstr(json,#str))) @@ -985,6 +988,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define STRING_AND_TWOINTS IGUANA_DISPATCH_SII #define HASH_AND_INT IGUANA_DISPATCH_HI #define HASH_AND_STRING IGUANA_DISPATCH_HS +#define HASH_AND_STRING_AND_INT IGUANA_DISPATCH_HSI #define HASH_AND_TWOINTS IGUANA_DISPATCH_HII #define DOUBLE_ARG IGUANA_DISPATCH_D #define STRING_AND_ARRAY IGUANA_DISPATCH_SA diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 4d0979140..8a6bef6bd 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -508,6 +508,11 @@ HASH_AND_STRING(dex,gettransaction,txid,symbol) return(_dex_getrawtransaction(myinfo,symbol,txid)); } +HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout) +{ + return(_dex_gettxout(myinfo,symbol,txid,vout)); +} + STRING_ARG(dex,getinfo,symbol) { return(_dex_getinfo(myinfo,symbol)); diff --git a/iguana/tests/dexgetO b/iguana/tests/dexgetO new file mode 100755 index 000000000..6f87a475e --- /dev/null +++ b/iguana/tests/dexgetO @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":0,\"txid\":\"aa82ebd1c5bd2a9e19214cbc959df1745378676fddfd6f4903930ac16485c7ae\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 05f28668e..4f291ecd0 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -27,6 +27,7 @@ STRING_ARG(dex,getbestblockhash,symbol); STRING_AND_INT(dex,getblockhash,symbol,height); HASH_AND_STRING(dex,getblock,hash,symbol); TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); +HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); diff --git a/includes/iguana_apidefs.h b/includes/iguana_apidefs.h index 7668e1475..08013ef18 100755 --- a/includes/iguana_apidefs.h +++ b/includes/iguana_apidefs.h @@ -39,6 +39,7 @@ #define IGUANA_CFUNC_HI(agent,name,hash,val) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,int32_t val) #define IGUANA_CFUNC_H(agent,name,hash) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash) #define IGUANA_CFUNC_HS(agent,name,hash,str) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,char *str) +#define IGUANA_CFUNC_HSI(agent,name,hash,str,val) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,char *str,int32_t val) #define IGUANA_CFUNC_HA(agent,name,hash,array) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,cJSON *array) #define IGUANA_CFUNC_HH(agent,name,hash,hash2) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,bits256 hash2) #define IGUANA_CFUNC_HHS(agent,name,hash,hash2,str) char *agent ## _ ## name(IGUANA_ARGS,bits256 hash,bits256 hash2,char *str) @@ -65,6 +66,7 @@ #define STRING_AND_TWOINTS IGUANA_CFUNC_SII #define HASH_AND_INT IGUANA_CFUNC_HI #define HASH_AND_STRING IGUANA_CFUNC_HS +#define HASH_AND_STRING_AND_INT IGUANA_CFUNC_HSI #define TWOHASHES_AND_STRING IGUANA_CFUNC_HHS #define HASH_AND_TWOINTS IGUANA_CFUNC_HII #define DOUBLE_ARG IGUANA_CFUNC_D diff --git a/includes/iguana_apiundefs.h b/includes/iguana_apiundefs.h index 7f70ed381..0b793ee2d 100755 --- a/includes/iguana_apiundefs.h +++ b/includes/iguana_apiundefs.h @@ -12,6 +12,7 @@ #undef STRING_AND_INT #undef STRING_AND_TWOINTS #undef HASH_AND_STRING +#undef HASH_AND_STRING_AND_INT #undef HASH_AND_INT #undef HASH_AND_TWOINTS #undef DOUBLE_ARG From f4c1d7ceb43ab727538c5465cd67b8f1858c1b3a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:52:28 +0200 Subject: [PATCH 245/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 21 +++++++++++++++++++++ iguana/dpow/dpow_rpc.c | 12 ++++++++++++ iguana/iguana_notary.c | 4 ++++ iguana/tests/deximportaddress | 2 ++ includes/iguana_apideclares.h | 1 + 6 files changed, 42 insertions(+) create mode 100755 iguana/tests/deximportaddress diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 11f545955..1e9485558 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -154,6 +154,7 @@ bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin, bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -162,5 +163,6 @@ char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx); char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout); +char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d7f78a5b1..307745741 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -253,6 +253,11 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) printf("SEND.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); } + else if ( dexreq.func == 'A' ) + { + printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); + retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + } } if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); @@ -343,6 +348,22 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si return(retstr); } +char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) +{ + struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; + packet = calloc(1,sizeof(dexreq)+strlen(address)+1); + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'A'; + datalen = dex_rwrequest(1,packet,&dexreq); + strcpy((char *)&packet[datalen],address); + printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(address)); + datalen += strlen(address) + 1; + retstr = dex_reqsend(myinfo,"request",packet,datalen); + free(packet); + return(retstr); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 2d32d6c34..d4f285962 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -413,6 +413,18 @@ char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *c } } +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) +{ + char buf[128],*retstr; + if ( coin->FULLNODE < 0 ) + { + sprintf(buf,"[\"%s\"]",address); + retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); + return(retstr); + } + else return(0); +} + int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin) { int32_t n,i,height = -1,maxtx = *numtxp; bits256 besthash,oldhash; cJSON *array,*json; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 8a6bef6bd..aa43a3f38 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -538,6 +538,10 @@ TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx) return(_dex_sendrawtransaction(myinfo,symbol,signedtx)); } +TWO_STRINGS(dex,importaddress,symbol,address) +{ + return(_dex_importaddress(myinfo,symbol,address)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/deximportaddress b/iguana/tests/deximportaddress new file mode 100755 index 000000000..89fae29b4 --- /dev/null +++ b/iguana/tests/deximportaddress @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"1GxuYbLmMVoP4tCzm4s98Q6YU7H963W9kp\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 4f291ecd0..c46bc2f3f 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -28,6 +28,7 @@ STRING_AND_INT(dex,getblockhash,symbol,height); HASH_AND_STRING(dex,getblock,hash,symbol); TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); +TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From 2b532ae55da496b78d48df7051dcb55b5b606312 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 11:57:49 +0200 Subject: [PATCH 246/432] test --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index d4f285962..2bce78185 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -418,7 +418,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c char buf[128],*retstr; if ( coin->FULLNODE < 0 ) { - sprintf(buf,"[\"%s\"]",address); + sprintf(buf,"[\"%s\", \"\", 0]",address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); return(retstr); } From b19f2d3acfea037232581f0b136a34efcd114c70 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 12:03:50 +0200 Subject: [PATCH 247/432] test --- iguana/dpow/dpow_network.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 307745741..6c79023f3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -207,9 +207,10 @@ int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dex return(len); } -char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) +char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { char buf[65],*retstr = 0; int32_t datalen; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; + *broadcastflagp = 0; if ( strcmp(dexp->handler,"request") == 0 ) { datalen = dex_rwrequest(0,dexp->packet,&dexreq); @@ -257,6 +258,7 @@ char *dex_response(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + *broadcastflagp = 1; } } if ( retstr == 0 ) @@ -1134,7 +1136,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n=0,num=0,size,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; + int32_t i,n=0,num=0,size,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); @@ -1220,10 +1222,15 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { num++; //printf("REP got %d\n",size); - if ( (retstr= dex_response(myinfo,dexp)) != 0 ) + if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); free(retstr); + if ( broadcastflag != 0 ) + { + printf("BROADCAST dexp request.[%d]\n",size); + nn_send(myinfo->dexsock,dexp,size,0); + } } else { From 92bd78dbda52720707b5d3961da04d3e9970d460 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 12:20:58 +0200 Subject: [PATCH 248/432] test --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 2bce78185..b5e50305a 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -418,7 +418,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c char buf[128],*retstr; if ( coin->FULLNODE < 0 ) { - sprintf(buf,"[\"%s\", \"\", 0]",address); + sprintf(buf,"[\"%s\", \"%s\", 0]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); return(retstr); } From 276a9a84d757582e0c638183d56a412b58691ad6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 13:16:58 +0200 Subject: [PATCH 249/432] test --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index b5e50305a..f2638c758 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -418,7 +418,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c char buf[128],*retstr; if ( coin->FULLNODE < 0 ) { - sprintf(buf,"[\"%s\", \"%s\", 0]",address,address); + sprintf(buf,"[\"%s\", \"%s\", false]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); return(retstr); } From d90f4224eea5a1dcc9ed75873028c90726ddbfd8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 13:29:18 +0200 Subject: [PATCH 250/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 24 +++++++++++++++++++++++- iguana/dpow/dpow_rpc.c | 15 +++------------ iguana/iguana_notary.c | 27 ++++++++++++++++++++++++--- includes/iguana_apideclares.h | 1 + 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 1e9485558..5cb428525 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -155,6 +155,7 @@ bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *c char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); +char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -164,5 +165,6 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol); char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx); char *_dex_gettxout(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); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6c79023f3..5a1a24a2b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -256,9 +256,15 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'A' ) { - printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); *broadcastflagp = 1; + printf("address.(%s) datalen.%d strlen.%ld ->(%s)\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen]),retstr); + if ( retstr == 0 ) + retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + } + else if ( dexreq.func == 'V' ) + { + retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); } } if ( retstr == 0 ) @@ -366,6 +372,22 @@ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address return(retstr); } +char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address) +{ + struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; + packet = calloc(1,sizeof(dexreq)+strlen(address)+1); + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'V'; + datalen = dex_rwrequest(1,packet,&dexreq); + strcpy((char *)&packet[datalen],address); + printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(address)); + datalen += strlen(address) + 1; + retstr = dex_reqsend(myinfo,"request",packet,datalen); + free(packet); + return(retstr); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index f2638c758..255571671 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -198,9 +198,9 @@ cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits2 return(json); } -int32_t dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) +char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char buf[128],*retstr=0; cJSON *ismine,*json = 0; int32_t retval = -1; + char buf[128],*retstr=0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"\"%s\"",address); @@ -215,16 +215,7 @@ int32_t dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *co { return(0); } - if ( retstr != 0 ) - { - json = cJSON_Parse(retstr); - if ( (ismine= jobj(json,"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) - retval = 1; - else retval = 0; - free(retstr); - - } - return(retval); + return(retstr); } cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index aa43a3f38..3d873ca2a 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -215,7 +215,7 @@ void dpow_addresses() TWO_STRINGS(iguana,dpow,symbol,pubkey) { - char *retstr,srcaddr[64],destaddr[64]; struct iguana_info *src,*dest; int32_t i,srcvalid,destvalid; struct dpow_info *dp = &myinfo->DPOWS[myinfo->numdpows]; + char *retstr,srcaddr[64],destaddr[64]; struct iguana_info *src,*dest; cJSON *ismine; int32_t i,srcvalid,destvalid; struct dpow_info *dp = &myinfo->DPOWS[myinfo->numdpows]; if ( myinfo->NOTARY.RELAYID < 0 ) { if ( (retstr= basilisk_addrelay_info(myinfo,0,(uint32_t)calc_ipbits(myinfo->ipaddr),myinfo->myaddr.persistent)) != 0 ) @@ -278,9 +278,25 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) safecopy(tmp,pubkey,sizeof(tmp)); decode_hex(dp->minerkey33,33,tmp); bitcoin_address(srcaddr,src->chain->pubtype,dp->minerkey33,33); - srcvalid = dpow_validateaddress(myinfo,src,srcaddr); + if ( (retstr= dpow_validateaddress(myinfo,src,srcaddr)) != 0 ) + { + json = cJSON_Parse(retstr); + if ( (ismine= jobj(json,"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) + srcvalid = 1; + else srcvalid = 0; + free(retstr); + retstr = 0; + } bitcoin_address(destaddr,dest->chain->pubtype,dp->minerkey33,33); - destvalid = dpow_validateaddress(myinfo,dest,destaddr); + if ( (retstr= dpow_validateaddress(myinfo,src,destaddr)) != 0 ) + { + json = cJSON_Parse(retstr); + if ( (ismine= jobj(json,"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) + destvalid = 1; + else destvalid = 0; + free(retstr); + retstr = 0; + } for (i=0; i<33; i++) printf("%02x",dp->minerkey33[i]); printf(" DPOW with pubkey.(%s) %s.valid%d %s -> %s %s.valid%d\n",tmp,srcaddr,srcvalid,dp->symbol,dp->dest,destaddr,destvalid); @@ -542,6 +558,11 @@ TWO_STRINGS(dex,importaddress,symbol,address) { return(_dex_importaddress(myinfo,symbol,address)); } + +TWO_STRINGS(dex,validateaddress,symbol,address) +{ + return(_dex_validateaddress(myinfo,symbol,address)); +} #include "../includes/iguana_apiundefs.h" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index c46bc2f3f..2cd303632 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -29,6 +29,7 @@ HASH_AND_STRING(dex,getblock,hash,symbol); TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(dex,importaddress,symbol,address); +TWO_STRINGS(dex,validateaddress,symbol,address); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From b1a04e4a5df3ab18929a3f86efec6cda08f2b317 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 13:32:33 +0200 Subject: [PATCH 251/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3d873ca2a..6e446a828 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -288,7 +288,7 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) retstr = 0; } bitcoin_address(destaddr,dest->chain->pubtype,dp->minerkey33,33); - if ( (retstr= dpow_validateaddress(myinfo,src,destaddr)) != 0 ) + if ( (retstr= dpow_validateaddress(myinfo,dest,destaddr)) != 0 ) { json = cJSON_Parse(retstr); if ( (ismine= jobj(json,"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) From 99e4ed53a74379ea8298c4f030a04e527500955d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 13:44:03 +0200 Subject: [PATCH 252/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 60 +++++++++++++++++++---------------- iguana/dpow/dpow_rpc.c | 7 ++-- iguana/iguana_notary.c | 5 +++ iguana/tests/dexvalidate | 2 ++ includes/iguana_apideclares.h | 1 + 6 files changed, 48 insertions(+), 29 deletions(-) create mode 100755 iguana/tests/dexvalidate diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 5cb428525..3bb87f24c 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -156,6 +156,7 @@ char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *c cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); +cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -166,5 +167,6 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si char *_dex_gettxout(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_listunspent(struct supernet_info *myinfo,char *symbol,char *address); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5a1a24a2b..6a8a58748 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -243,6 +243,11 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) retstr = jprint(retjson,1); } + else if ( dexreq.func == 'U' ) + { + if ( (retjson= dpow_listunspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) + retstr = jprint(retjson,1); + } else if ( dexreq.func == 'P' ) { hash2 = dpow_getbestblockhash(myinfo,coin); @@ -280,6 +285,19 @@ char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) return(dex_reqsend(myinfo,"request",packet,datalen)); } +char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str) +{ + uint8_t *packet; int32_t datalen,slen; char *retstr; + slen = (int32_t)strlen(str)+1; + packet = calloc(1,sizeof(*dexreq)+slen); + datalen = dex_rwrequest(1,packet,dexreq); + strcpy((char *)&packet[datalen],str); + datalen += slen; + retstr = dex_reqsend(myinfo,"request",packet,datalen); + free(packet); + return(retstr); +} + char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) { struct dex_request dexreq; @@ -342,50 +360,38 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) { - struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; - packet = calloc(1,sizeof(dexreq)+strlen(signedtx)+1); + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'S'; - datalen = dex_rwrequest(1,packet,&dexreq); - strcpy((char *)&packet[datalen],signedtx); - printf("PACKET.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(signedtx)); - datalen += strlen(signedtx) + 1; - retstr = dex_reqsend(myinfo,"request",packet,datalen); - free(packet); - return(retstr); + return(_dex_sendrequeststr(myinfo,&dexreq,signedtx)); } char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) { - struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; - packet = calloc(1,sizeof(dexreq)+strlen(address)+1); + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'A'; - datalen = dex_rwrequest(1,packet,&dexreq); - strcpy((char *)&packet[datalen],address); - printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(address)); - datalen += strlen(address) + 1; - retstr = dex_reqsend(myinfo,"request",packet,datalen); - free(packet); - return(retstr); + return(_dex_sendrequeststr(myinfo,&dexreq,address)); } char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address) { - struct dex_request dexreq; uint8_t *packet; int32_t datalen; char *retstr; - packet = calloc(1,sizeof(dexreq)+strlen(address)+1); + struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'V'; - datalen = dex_rwrequest(1,packet,&dexreq); - strcpy((char *)&packet[datalen],address); - printf("address.(%s) datalen.%d strlen.%ld\n",(char *)&packet[datalen],datalen,strlen(address)); - datalen += strlen(address) + 1; - retstr = dex_reqsend(myinfo,"request",packet,datalen); - free(packet); - return(retstr); + return(_dex_sendrequeststr(myinfo,&dexreq,address)); +} + +char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'U'; + return(_dex_sendrequeststr(myinfo,&dexreq,address)); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 255571671..bfa6b4705 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -297,7 +297,7 @@ cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { - char buf[128],*retstr; cJSON *json = 0; + char buf[128],*retstr; cJSON *array,*json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"0, 99999999, [\"%s\"]",coinaddr); @@ -310,7 +310,10 @@ cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,ch } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { - json = iguana_listunspents(myinfo,coin,0,1,coin->longestchain,""); + array = cJSON_CreateArray(); + jaddistr(array,coinaddr); + json = iguana_listunspents(myinfo,coin,array,1,coin->longestchain,""); + free_json(array); } else { diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 6e446a828..c58c47c8a 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -563,6 +563,11 @@ TWO_STRINGS(dex,validateaddress,symbol,address) { return(_dex_validateaddress(myinfo,symbol,address)); } + +TWO_STRINGS(dex,listunspent,symbol,address) +{ + return(_dex_listunspent(myinfo,symbol,address)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexvalidate b/iguana/tests/dexvalidate new file mode 100755 index 000000000..66685816d --- /dev/null +++ b/iguana/tests/dexvalidate @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"validateaddress\",\"address\":\"1GxuYbLmMVoP4tCzm4s98Q6YU7H963W9kp\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 2cd303632..11a384076 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -30,6 +30,7 @@ TWO_STRINGS(dex,sendrawtransaction,symbol,signedtx); HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(dex,validateaddress,symbol,address); +TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From ccd5ac07eed0153c2758599531aec4f4e0e3a0db Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:02:30 +0200 Subject: [PATCH 253/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 32 +++++++++++++++++++++++--------- iguana/dpow/dpow_rpc.c | 18 ++++++++++++++++++ iguana/iguana_notary.c | 5 +++++ iguana/tests/dexlistunspent | 2 ++ includes/iguana_apideclares.h | 1 + 6 files changed, 51 insertions(+), 9 deletions(-) create mode 100755 iguana/tests/dexlistunspent diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 3bb87f24c..0140584b6 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -157,6 +157,7 @@ cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits2 char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); +cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -168,5 +169,6 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); +char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 6a8a58748..7ada37676 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -186,14 +186,14 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -struct dex_request { bits256 hash; int32_t height; uint16_t vout; char name[15]; uint8_t func; }; +struct dex_request { bits256 hash; int32_t intarg; uint16_t shortarg; char name[15]; uint8_t func; }; int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) { int32_t len = 0; len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->height),&dexreq->height); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->vout),&dexreq->vout); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->intarg),&dexreq->intarg); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->shortarg),&dexreq->shortarg); if ( rwflag != 0 ) { memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); @@ -224,12 +224,12 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'O' ) { - if ( (retjson= dpow_gettxout(myinfo,coin,dexreq.hash,dexreq.vout)) != 0 ) + if ( (retjson= dpow_gettxout(myinfo,coin,dexreq.hash,dexreq.shortarg)) != 0 ) retstr = jprint(retjson,1); } else if ( dexreq.func == 'H' ) { - hash2 = dpow_getblockhash(myinfo,coin,dexreq.height); + hash2 = dpow_getblockhash(myinfo,coin,dexreq.intarg); bits256_str(buf,hash2); retstr = clonestr(buf); } @@ -256,14 +256,17 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'S' ) { - printf("SEND.(%s) datalen.%d strlen.%ld\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen])); retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); } + else if ( dexreq.func == 'L' ) + { + if ( (retjson= dpow_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) + retstr = jprint(retjson,1); + } else if ( dexreq.func == 'A' ) { retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); *broadcastflagp = 1; - printf("address.(%s) datalen.%d strlen.%ld ->(%s)\n",(char *)&dexp->packet[datalen],datalen,strlen((char *)&dexp->packet[datalen]),retstr); if ( retstr == 0 ) retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); } @@ -315,7 +318,7 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; - dexreq.vout = vout; + dexreq.shortarg = vout; dexreq.func = 'O'; return(_dex_sendrequest(myinfo,&dexreq)); } @@ -344,7 +347,7 @@ char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height struct dex_request dexreq; memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); - dexreq.height = height; + dexreq.intarg = height; dexreq.func = 'H'; return(_dex_sendrequest(myinfo,&dexreq)); } @@ -394,6 +397,17 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) return(_dex_sendrequeststr(myinfo,&dexreq,address)); } +char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *address,int32_t count,int32_t skip) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.intarg = skip; + dexreq.shortarg = count; + dexreq.func = 'L'; + return(_dex_sendrequeststr(myinfo,&dexreq,address)); +} + int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) { int32_t i,firstz = -1; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index bfa6b4705..4d7bbcdee 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -322,6 +322,24 @@ cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,ch return(json); } +cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip) +{ + char buf[128],*retstr; cJSON *json = 0; + if ( coin->FULLNODE < 0 ) + { + if ( count == 0 ) + count = 100; + sprintf(buf,"[\"%s\", %d, %d, true]",coinaddr,count,skip); + if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listtransactions",buf)) != 0 ) + { + json = cJSON_Parse(retstr); + free(retstr); + return(json); + } else printf("%s null retstr from (%s)n",coin->symbol,buf); + } + return(0); +} + char *dpow_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,cJSON *vins) { cJSON *array,*privkeys,*item; char *wifstr,*str,*paramstr,*retstr; uint8_t script[256]; int32_t i,n,len,hashtype; struct vin_info V; struct iguana_waddress *waddr; struct iguana_waccount *wacct; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index c58c47c8a..79fed5f24 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -568,6 +568,11 @@ TWO_STRINGS(dex,listunspent,symbol,address) { return(_dex_listunspent(myinfo,symbol,address)); } + +TWO_STRINGS_AND_TWO_DOUBLES(dest,listtransactions,symbol,address,count,skip) +{ + return(_dex_listtransactions(myinfo,symbol,address,count,skip)); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent new file mode 100755 index 000000000..ac18edf80 --- /dev/null +++ b/iguana/tests/dexlistunspent @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"1E2ac2gxeFR2ir1H3vqETTperWkiXkwy99\",\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 11a384076..050a400fd 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -31,6 +31,7 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(dex,validateaddress,symbol,address); TWO_STRINGS(dex,listunspent,symbol,address); +TWO_STRINGS_AND_TWO_DOUBLES(dest,listtransactions,symbol,address,count,skip); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From d740a814b1e16bf73d26bd2599faf0a4adb8fc86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:05:03 +0200 Subject: [PATCH 254/432] test --- iguana/iguana_notary.c | 2 +- iguana/tests/dexlisttransactions | 2 ++ includes/iguana_apideclares.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100755 iguana/tests/dexlisttransactions diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 79fed5f24..625ed2942 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -569,7 +569,7 @@ TWO_STRINGS(dex,listunspent,symbol,address) return(_dex_listunspent(myinfo,symbol,address)); } -TWO_STRINGS_AND_TWO_DOUBLES(dest,listtransactions,symbol,address,count,skip) +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip) { return(_dex_listtransactions(myinfo,symbol,address,count,skip)); } diff --git a/iguana/tests/dexlisttransactions b/iguana/tests/dexlisttransactions new file mode 100755 index 000000000..2082d40ec --- /dev/null +++ b/iguana/tests/dexlisttransactions @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"1E2ac2gxeFR2ir1H3vqETTperWkiXkwy99\",\"count\":100,\"skip\":0,\"symbol\":\"BTC\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 050a400fd..21cf47bd3 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -31,7 +31,7 @@ HASH_AND_STRING_AND_INT(dex,gettxout,txid,symbol,vout); TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(dex,validateaddress,symbol,address); TWO_STRINGS(dex,listunspent,symbol,address); -TWO_STRINGS_AND_TWO_DOUBLES(dest,listtransactions,symbol,address,count,skip); +TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex); From bb2a74aa9707fa5194c43d840fea54b79d608085 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:08:29 +0200 Subject: [PATCH 255/432] test --- iguana/dpow/dpow_network.c | 1 + iguana/dpow/dpow_rpc.c | 1 + 2 files changed, 2 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7ada37676..c974fcebd 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -260,6 +260,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'L' ) { + printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); if ( (retjson= dpow_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) retstr = jprint(retjson,1); } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 4d7bbcdee..c5ec281c9 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -332,6 +332,7 @@ cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *co sprintf(buf,"[\"%s\", %d, %d, true]",coinaddr,count,skip); if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listtransactions",buf)) != 0 ) { + printf("LIST.(%s)\n",retstr); json = cJSON_Parse(retstr); free(retstr); return(json); From ebe96472b71b3c774a9c5da69a34789bf58d7ad8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:14:19 +0200 Subject: [PATCH 256/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/dpow/dpow_rpc.c | 2 +- iguana/tests/deximportaddress | 2 +- iguana/tests/dexlisttransactions | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c974fcebd..d6db57336 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -260,7 +260,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'L' ) { - printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); + //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); if ( (retjson= dpow_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) retstr = jprint(retjson,1); } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index c5ec281c9..7ea3b94b4 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -332,7 +332,7 @@ cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *co sprintf(buf,"[\"%s\", %d, %d, true]",coinaddr,count,skip); if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listtransactions",buf)) != 0 ) { - printf("LIST.(%s)\n",retstr); + //printf("LIST.(%s)\n",retstr); json = cJSON_Parse(retstr); free(retstr); return(json); diff --git a/iguana/tests/deximportaddress b/iguana/tests/deximportaddress index 89fae29b4..ae340b58e 100755 --- a/iguana/tests/deximportaddress +++ b/iguana/tests/deximportaddress @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"1GxuYbLmMVoP4tCzm4s98Q6YU7H963W9kp\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"15R3C2ZKmak5pCc4duLY2jLtFD3o1jaeNd\",\"symbol\":\"BTC\"}" diff --git a/iguana/tests/dexlisttransactions b/iguana/tests/dexlisttransactions index 2082d40ec..2db8fd18e 100755 --- a/iguana/tests/dexlisttransactions +++ b/iguana/tests/dexlisttransactions @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"1E2ac2gxeFR2ir1H3vqETTperWkiXkwy99\",\"count\":100,\"skip\":0,\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"15R3C2ZKmak5pCc4duLY2jLtFD3o1jaeNd\",\"count\":100,\"skip\":0,\"symbol\":\"BTC\"}" From 56292c034ecbb993e0e1bb754360bf07e5fc07fe Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:34:38 +0200 Subject: [PATCH 257/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 13 +++++++++++++ iguana/dpow/dpow_rpc.c | 35 ++++++++++++++++++++++++++++++++++- iguana/iguana_notary.c | 5 +++++ includes/iguana_apideclares.h | 1 + 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 0140584b6..1fa12cb3c 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -158,6 +158,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); +char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); @@ -170,5 +171,6 @@ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address); char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coinaddr,int32_t count,int32_t skip); +char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); #endif diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d6db57336..1e69478a0 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -258,6 +258,10 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); } + else if ( dexreq.func == '*' ) + { + retstr = dpow_alladdresses(myinfo,coin); + } else if ( dexreq.func == 'L' ) { //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); @@ -333,6 +337,15 @@ char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) return(_dex_sendrequest(myinfo,&dexreq)); } +char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = '*'; + return(_dex_sendrequest(myinfo,&dexreq)); +} + char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) { struct dex_request dexreq; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 7ea3b94b4..b8dc0670b 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -426,13 +426,46 @@ char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *c } } +char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *retstr,fname[1024]; long filesize; + sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); + retstr = OS_filestr(&filesize,fname); + return(retstr); +} + char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char buf[128],*retstr; + char buf[128],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson; int32_t i,n; FILE *fp; if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); + if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) + { + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; isymbol), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(outstr,1,strlen(outstr)+1,fp); + fclose(fp); + } + free(outstr); + } + } + free_json(alljson); + } + } return(retstr); } else return(0); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 625ed2942..3787ef58f 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -539,6 +539,11 @@ STRING_ARG(dex,getbestblockhash,symbol) return(_dex_getbestblockhash(myinfo,symbol)); } +STRING_ARG(dex,alladdresses,symbol) +{ + return(_dex_alladdresses(myinfo,symbol)); +} + STRING_AND_INT(dex,getblockhash,symbol,height) { return(_dex_getblockhash(myinfo,symbol,height)); diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 21cf47bd3..fc5bc5e6c 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -23,6 +23,7 @@ STRING_ARG(dpow,bindaddr,ipaddr); TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); STRING_ARG(dex,getinfo,symbol); +STRING_ARG(dex,alladdresses,symbol); STRING_ARG(dex,getbestblockhash,symbol); STRING_AND_INT(dex,getblockhash,symbol,height); HASH_AND_STRING(dex,getblock,hash,symbol); From 8d7d294d518f2195bc6f9e251a28ad59e4a2957a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:39:05 +0200 Subject: [PATCH 258/432] test --- iguana/dpow/dpow_rpc.c | 12 +++++++++++- iguana/tests/dexalladdresses | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100755 iguana/tests/dexalladdresses diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index b8dc0670b..72e4f96a1 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -436,7 +436,7 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char buf[128],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson; int32_t i,n; FILE *fp; + char buf[1024],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson; int32_t i,n; FILE *fp; if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); @@ -466,6 +466,16 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c free_json(alljson); } } + else + { + sprintf(buf,"[\"%s\"]",address); + sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(buf,1,strlen(buf)+1,fp); + fclose(fp); + } + } return(retstr); } else return(0); diff --git a/iguana/tests/dexalladdresses b/iguana/tests/dexalladdresses new file mode 100755 index 000000000..24feefa9c --- /dev/null +++ b/iguana/tests/dexalladdresses @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"BTC\"}" From 45c71e1cca5023afdb61e3877b9b37f8fb99b389 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 14:46:18 +0200 Subject: [PATCH 259/432] test --- iguana/dpow/dpow_rpc.c | 2 ++ iguana/iguana777.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 72e4f96a1..6094cebda 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -459,12 +459,14 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { fwrite(outstr,1,strlen(outstr)+1,fp); fclose(fp); + printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); } free(outstr); } } free_json(alljson); } + free(alladdresses); } else { diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 82c3830d6..46629cc75 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -839,7 +839,7 @@ void iguana_helper(void *arg) void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { - struct iguana_bundle *bp; struct iguana_peer *addr; int32_t bundlei; bits256 zero; char dirname[512],*symbol; + struct iguana_bundle *bp; struct iguana_peer *addr; int32_t i,n,bundlei; bits256 zero; char dirname[512],*symbol,*alladdresses,*retstr; cJSON *alljson; iguana_rwiAddrind(coin,0,0,0); //for (i=0; ichain); i++) // printf("%02x",((uint8_t *)coin->chain)[i]); @@ -872,6 +872,20 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) addr = &coin->peers->active[IGUANA_MAXPEERS-2]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); printf("SEED_IPADDR initpeer.(%s)\n",addr->ipaddr); + if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) + { + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; i Date: Tue, 27 Dec 2016 14:53:35 +0200 Subject: [PATCH 260/432] test --- iguana/iguana777.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 46629cc75..56259af43 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -839,7 +839,7 @@ void iguana_helper(void *arg) void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { - struct iguana_bundle *bp; struct iguana_peer *addr; int32_t i,n,bundlei; bits256 zero; char dirname[512],*symbol,*alladdresses,*retstr; cJSON *alljson; + struct iguana_bundle *bp; struct iguana_peer *addr; int32_t bundlei; bits256 zero; char dirname[512],*symbol; iguana_rwiAddrind(coin,0,0,0); //for (i=0; ichain); i++) // printf("%02x",((uint8_t *)coin->chain)[i]); @@ -872,6 +872,17 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) addr = &coin->peers->active[IGUANA_MAXPEERS-2]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); printf("SEED_IPADDR initpeer.(%s)\n",addr->ipaddr); + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); +} + +void iguana_coinloop(void *arg) +{ + struct supernet_info *myinfo; int32_t flag,i,j,n; cJSON *alljson; struct iguana_peer *addr; bits256 zero; uint32_t now; char *alladdresses,*retstr; struct iguana_info *coin,**coins = arg; + myinfo = SuperNET_MYINFO(0); + n = (int32_t)(long)coins[0]; + coins++; + coin = coins[0]; + printf("begin coinloop[%d] %s\n",n,coin->symbol); if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) { if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) @@ -886,17 +897,6 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) } free(alladdresses); } - iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); -} - -void iguana_coinloop(void *arg) -{ - struct supernet_info *myinfo; int32_t flag,i,j,n; struct iguana_peer *addr; bits256 zero; uint32_t now; struct iguana_info *coin,**coins = arg; - myinfo = SuperNET_MYINFO(0); - n = (int32_t)(long)coins[0]; - coins++; - coin = coins[0]; - printf("begin coinloop[%d] %s\n",n,coin->symbol); memset(zero.bytes,0,sizeof(zero)); while ( 1 ) { From 9f896315b753b63ff7268a7dcecd06622e2d2c9f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 15:15:44 +0200 Subject: [PATCH 261/432] test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/dpow/dpow_tx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 1e69478a0..d55560dba 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -993,11 +993,11 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; - if ( bp->bestmask == 0 ) + //if ( bp->bestmask == 0 ) { bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - dpow_bestconsensus(bp); + //dpow_bestconsensus(bp); } if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 09bb97d38..87ae7d6c2 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -135,7 +135,7 @@ uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) k = DPOW_MODIND(bp,j); //if ( (bp->require0 == 0 || k != 0) && bp->scores[k] < DPOW_BLACKLIST ) // continue; - if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) + if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 && bp->paxwdcrc == bp->notaries[k].paxwdcrc ) { mask |= (1LL << k); if ( ++m == bp->minsigs ) From b7a4dd67c4b21bf746a1f0028f15472c937fc51a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 15:37:25 +0200 Subject: [PATCH 262/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d55560dba..c3ccaf09c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -993,12 +993,12 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } } bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; - //if ( bp->bestmask == 0 ) + if ( bp->bestmask == 0 ) { bp->recvmask |= (1LL << senderind) | (1LL << bp->myind); bp->bestmask = dpow_maskmin(bp->recvmask,bp,&bp->bestk); - //dpow_bestconsensus(bp); } + dpow_bestconsensus(bp); if ( bp->bestk >= 0 ) bp->notaries[bp->myind].bestk = bp->bestk; if ( bp->bestmask != 0 ) @@ -1026,17 +1026,17 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } else if ( i == senderind && ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) flag = senderind; - if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } if ( flag >= 0 ) { - //printf("flag.%d -> send\n",flag); + printf("flag.%d -> send\n",flag); for (i=0; iminerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); } - if ( 0 && bp->myind <= 1 ) + if ( 1 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From a5c9d689ad071f40bc3cc3c6be8a753dcb0a415c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 15:40:37 +0200 Subject: [PATCH 263/432] 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 c3ccaf09c..774d1d5fa 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -627,7 +627,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 100; + timeout = 3000; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -645,7 +645,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 300; + timeout = 3000; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); From c597fda19dbe10d3515bcfef559008f359f743cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 15:54:34 +0200 Subject: [PATCH 264/432] 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 774d1d5fa..c7f1233e4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -627,11 +627,11 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 3000; + timeout = 2500; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); - timeout = 200; + timeout = 500; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -645,7 +645,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 3000; + timeout = 2500; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); From 0b131d8458978bba615f82087dada079231eea30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 16:12:52 +0200 Subject: [PATCH 265/432] test --- basilisk/basilisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index c76a94f0e..96bf3724f 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -891,7 +891,7 @@ void basilisks_loop(void *arg) if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); } - endmilli = startmilli + 10; + endmilli = startmilli + 500; } else { From ce0bc281ee545de992f3bc6815bd402fadfec3bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 16:17:48 +0200 Subject: [PATCH 266/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c7f1233e4..4d86a8d22 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1227,7 +1227,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( dp != 0 && crc32 == np->crc32 ) { - //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz); + char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz); if ( i == myinfo->numdpows ) printf("received nnpacket for (%s)\n",np->symbol); else @@ -1248,9 +1248,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } //dp->crcs[firstz] = crc32; } - } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); - } //else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); - } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); + } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); + } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); if ( np != 0 ) nn_freemsg(np), np = 0; From bc768406168b2534edcaca6ce00c342e60c3bde1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 16:20:18 +0200 Subject: [PATCH 267/432] test --- iguana/iguana_rpc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index b3d7cb8f1..70c072490 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -868,9 +868,11 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz originstr = &urlstr[i + strlen(fieldstr)]; if ( strncmp(originstr,"http://127.0.0.",strlen("http://127.0.0.")) == 0 ) originstr = "http://127.0.0.1:"; - if ( strncmp(originstr,"file://127.0.0.",strlen("file://127.0.0.")) == 0 ) + else if ( strncmp(originstr,"file://127.0.0.",strlen("file://127.0.0.")) == 0 ) originstr = "http://127.0.0.1:"; - if ( strncmp("null",originstr,strlen("null")) != 0 && strncmp("http://localhost:",originstr,strlen("http://localhost:")) != 0 && strncmp("http://127.0.0.1:",originstr,strlen("http://127.0.0.1:")) != 0 && strncmp("http://easydex.supernet.org",originstr,strlen("http://easydex.supernet.org")) != 0 ) + else if ( strncmp(originstr,"chrome-extension://",strlen("chrome-extension://")) == 0 ) + originstr = "http://127.0.0.1:"; + else if ( strncmp("null",originstr,strlen("null")) != 0 && strncmp("http://localhost:",originstr,strlen("http://localhost:")) != 0 && strncmp("http://127.0.0.1:",originstr,strlen("http://127.0.0.1:")) != 0 && strncmp("http://easydex.supernet.org",originstr,strlen("http://easydex.supernet.org")) != 0 ) { printf("remote %s REJECT.(%s)\n",fieldstr,urlstr); return(clonestr("{\"error\":\"remote origin not enabled\"}")); From ff3e546e7f4946261bb4eeb652bdf0ac6d7fa34b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 16:22:53 +0200 Subject: [PATCH 268/432] 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 4d86a8d22..f62951dd3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1227,7 +1227,6 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( dp != 0 && crc32 == np->crc32 ) { - char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz); if ( i == myinfo->numdpows ) printf("received nnpacket for (%s)\n",np->symbol); else @@ -1235,6 +1234,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { + char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind); if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) From 56373a08a8c452ed956f32f60c63409ee499f6c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 17:27:23 +0200 Subject: [PATCH 269/432] 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 f62951dd3..dbb08c92e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1245,7 +1245,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); } else printf("wrong senderind.%d\n",np->senderind); } - } + } else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); //dp->crcs[firstz] = crc32; } } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); From e7c9f2a9f77a25cf1db2a72093049d795668fe51 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 17:28:02 +0200 Subject: [PATCH 270/432] 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 dbb08c92e..463f05a7c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1122,7 +1122,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo np->srchash.bytes[i] = dp->minerkey33[i+1]; np->desthash = desthash; np->channel = channel; - np->height = msgbits; + np->height = bp->height;//msgbits; np->myipbits = myinfo->myaddr.myipbits; strcpy(np->symbol,dp->symbol); np->version0 = DPOW_VERSION & 0xff; From 55a9f2c7ab0783dedb2c57cf54ae47fb0e7e3946 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:02:07 +0200 Subject: [PATCH 271/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_notary.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 463f05a7c..56bdce965 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1234,7 +1234,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { - char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind); + char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3787ef58f..7c868dced 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -148,13 +148,13 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) break; src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { - //printf("%s %s height.%d vs last.%d\n",dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); + char str[65]; printf("%s %s height.%d vs last.%d\n",dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { printf("iguana_dPoWupdate dest.%s reorg detected %d vs %d\n",dp->dest,height,dp->destchaintip.blockhash.height); From f5a921196f2db80188cc6b90ea6160fdbe51b14c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:07:15 +0200 Subject: [PATCH 272/432] test --- basilisk/basilisk.c | 4 ++-- iguana/iguana_notary.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 96bf3724f..837d06f89 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -891,7 +891,7 @@ void basilisks_loop(void *arg) if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); } - endmilli = startmilli + 500; + endmilli = startmilli + 50; } else { @@ -902,7 +902,7 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); iter++; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 7c868dced..303b80638 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -143,7 +143,7 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t i,height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - for (i=0; i<100; i++) + for (i=0; i<1; i++) if ( dpow_nanomsg_update(myinfo) <= 0 ) break; src = iguana_coinfind(dp->symbol); From 3e0298aafa481191796a95331e1a5aa917b1c8f2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:12:41 +0200 Subject: [PATCH 273/432] test --- basilisk/basilisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 837d06f89..68bd4ace0 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -882,7 +882,7 @@ void basilisks_loop(void *arg) if ( relay != 0 ) basilisk_ping_send(myinfo,relay); counter++; - if ( (counter % 10) == 0 && myinfo->numdpows == 1 ) + if ( myinfo->numdpows == 1 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); else if ( myinfo->numdpows > 1 ) { From 6b65c9c0549501700253fad020bee7a30482651c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:13:31 +0200 Subject: [PATCH 274/432] 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 56bdce965..598860972 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -627,7 +627,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } else { - timeout = 2500; + timeout = 500; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -645,7 +645,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 2500; + timeout = 500; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); From 006544673d38d73f17078369013e2f6c32b2240d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:16:09 +0200 Subject: [PATCH 275/432] test --- basilisk/basilisk.c | 2 +- iguana/iguana_notary.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 68bd4ace0..aa4360df4 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -902,7 +902,7 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); iter++; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 303b80638..109a35163 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -143,7 +143,7 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t i,height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - for (i=0; i<1; i++) + for (i=0; i<10; i++) if ( dpow_nanomsg_update(myinfo) <= 0 ) break; src = iguana_coinfind(dp->symbol); From 0247af9fab62d70182831b3516cf38c687fdaa12 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:21:16 +0200 Subject: [PATCH 276/432] test --- iguana/dpow/dpow_network.c | 7 ++++--- iguana/iguana_notary.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 598860972..70cdc1eb1 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -628,8 +628,9 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) else { timeout = 500; - nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); nn_setsockopt(repsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); + timeout = 10; nn_setsockopt(dexsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); timeout = 500; nn_setsockopt(repsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -645,7 +646,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) } myinfo->dpowipbits[0] = (uint32_t)calc_ipbits(myinfo->ipaddr); myinfo->numdpowipbits = 1; - timeout = 500; + timeout = 10; nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); maxsize = 1024 * 1024; printf("RCVBUF.%d\n",nn_setsockopt(dpowsock,NN_SOL_SOCKET,NN_RCVBUF,&maxsize,sizeof(maxsize))); @@ -1245,7 +1246,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dpow_datahandler(myinfo,dp,bp,np->senderind,np->channel,np->height,np->packet,np->datalen); } else printf("wrong senderind.%d\n",np->senderind); } - } else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); + } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); //dp->crcs[firstz] = crc32; } } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 109a35163..d32895067 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -148,7 +148,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) break; src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From 43824c75e9675971434c8a62dd572d6656ee904e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:23:51 +0200 Subject: [PATCH 277/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_notary.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 70cdc1eb1..8481a952b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1249,7 +1249,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } //else printf("height.%d bp.%p state.%x senderind.%d\n",np->height,bp,bp!=0?bp->state:0,np->senderind); //dp->crcs[firstz] = crc32; } - } else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); + } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d32895067..b5bbcbe75 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -143,12 +143,12 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t i,height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - for (i=0; i<10; i++) + for (i=0; i<100; i++) if ( dpow_nanomsg_update(myinfo) <= 0 ) break; src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From c8d5439546557bab9cf866251852590dd17b4a0b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:28:21 +0200 Subject: [PATCH 278/432] test --- iguana/iguana_notary.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index b5bbcbe75..e5d117fd0 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -142,10 +142,13 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { - int32_t i,height; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; + int32_t i,height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; for (i=0; i<100; i++) - if ( dpow_nanomsg_update(myinfo) <= 0 ) + { + if ( (num= dpow_nanomsg_update(myinfo)) <= 0 ) break; + fprintf(stderr,"%d ",num); + } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); From 59fd33a4b158fcc1c4202add3ec770ac24464de8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:32:42 +0200 Subject: [PATCH 279/432] test --- iguana/dpow/dpow_network.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8481a952b..6280a8638 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -83,7 +83,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 } else { - timeout = 500; + timeout = 100; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); timeout = 2000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); @@ -1197,7 +1197,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); - for (i=0; i<100; i++) + /*for (i=0; i<100; i++) { struct nn_pollfd pfd; pfd.fd = myinfo->dpowsock; @@ -1205,12 +1205,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( nn_poll(&pfd,1,100) > 0 ) break; usleep(1000); - } + }*/ if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) { - num++; - if ( size >= 0 ) + if ( size > 0 ) { + fprintf(stderr,"%d ",size); + num++; if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) { //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); @@ -1259,8 +1260,9 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) n = 0; if ( myinfo->dexsock >= 0 ) // from servers { - if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) >= 0 ) + if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) > 0 ) { + fprintf(stderr,"%d ",size); num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { @@ -1275,9 +1277,10 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( myinfo->repsock >= 0 ) // from clients { - if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) >= 0 ) + if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; + fprintf(stderr,"%d ",size); //printf("REP got %d\n",size); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { From 1565f2a4571d3467031d3a2815398bebdf91ff18 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:33:12 +0200 Subject: [PATCH 280/432] 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 6280a8638..b3a3230c9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1206,7 +1206,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - if ( i < 100 && (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) + if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && { if ( size > 0 ) { From cdfdbddf4309f0b56507b53ba57a66dfb300068a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:35:53 +0200 Subject: [PATCH 281/432] test --- iguana/dpow/dpow_network.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b3a3230c9..2a5e67910 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1206,7 +1206,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && + if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && { if ( size > 0 ) { @@ -1257,6 +1257,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( np != 0 ) nn_freemsg(np), np = 0; } //else printf("no packets\n"); + if ( num != 0 ) + return(num); n = 0; if ( myinfo->dexsock >= 0 ) // from servers { From 72c63273f65bacc26366faaf5655b0e5c73e3efd Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:39:41 +0200 Subject: [PATCH 282/432] test --- iguana/dpow/dpow_network.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2a5e67910..62f5f45f9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1206,7 +1206,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - if ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 ) //i < 100 && + while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 && num < 100 ) { if ( size > 0 ) { @@ -1257,8 +1257,6 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( np != 0 ) nn_freemsg(np), np = 0; } //else printf("no packets\n"); - if ( num != 0 ) - return(num); n = 0; if ( myinfo->dexsock >= 0 ) // from servers { From 6b9408cf359217a008890b6eab551e955ee01f5a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:43:01 +0200 Subject: [PATCH 283/432] test --- iguana/dpow/dpow_network.c | 6 +++--- iguana/iguana_notary.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 62f5f45f9..74e716eb4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1210,7 +1210,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { if ( size > 0 ) { - fprintf(stderr,"%d ",size); + //fprintf(stderr,"%d ",size); num++; if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) { @@ -1262,7 +1262,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) > 0 ) { - fprintf(stderr,"%d ",size); + //fprintf(stderr,"%d ",size); num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { @@ -1280,7 +1280,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) { num++; - fprintf(stderr,"%d ",size); + //fprintf(stderr,"%d ",size); //printf("REP got %d\n",size); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index e5d117fd0..08fe9b811 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -143,11 +143,11 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t i,height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - for (i=0; i<100; i++) + for (i=0; i<3; i++) { if ( (num= dpow_nanomsg_update(myinfo)) <= 0 ) break; - fprintf(stderr,"%d ",num); + //fprintf(stderr,"%d ",num); } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); From 8d8a385fdd121481bf264a491f7bea8fa8c89eb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:45:17 +0200 Subject: [PATCH 284/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 08fe9b811..b9a05b8d0 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -147,7 +147,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { if ( (num= dpow_nanomsg_update(myinfo)) <= 0 ) break; - //fprintf(stderr,"%d ",num); + fprintf(stderr,"%d ",num); } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); From e1847457317d841b71ff3a93001cbdaaa7f27c9c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 18:45:54 +0200 Subject: [PATCH 285/432] test --- iguana/iguana_notary.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index b9a05b8d0..9f1a6b158 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -147,11 +147,11 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { if ( (num= dpow_nanomsg_update(myinfo)) <= 0 ) break; - fprintf(stderr,"%d ",num); + //fprintf(stderr,"%d ",num); } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + //fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From 4fce3290f5b2fc9b8dfe55721378663181f78dc4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 19:06:20 +0200 Subject: [PATCH 286/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/dpow/dpow_network.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index d43987e43..b65ec3a50 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -412,7 +412,7 @@ void dpow_statemachinestart(void *ptr) extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } - sleep(3); + sleep(5); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { if ( bp->isratify == 0 ) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 74e716eb4..512b8b01b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1027,7 +1027,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } else if ( i == senderind && ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) flag = senderind; - if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } if ( flag >= 0 ) @@ -1037,7 +1037,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru srchash.bytes[i] = dp->minerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); } - if ( 1 && bp->myind <= 1 ) + if ( 0 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { @@ -1236,7 +1236,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dpow_ipbitsadd(myinfo,dp,np->ipbits,np->numipbits,np->senderind,np->myipbits); if ( (bp= dpow_heightfind(myinfo,dp,np->height)) != 0 && bp->state != 0xffffffff && bp->myind >= 0 ) { - char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); + //char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d i.%d senderind.%d myind.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz,i,np->senderind,bp->myind); if ( np->senderind >= 0 && np->senderind < bp->numnotaries ) { if ( memcmp(bp->notaries[np->senderind].pubkey+1,np->srchash.bytes,32) == 0 && bits256_nonz(np->srchash) != 0 ) From 3b72db7cad34bf50e4ff034c3f8d2a205c106f29 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 19:49:45 +0200 Subject: [PATCH 287/432] 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 512b8b01b..4e5e51d29 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1032,7 +1032,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } if ( flag >= 0 ) { - printf("flag.%d -> send\n",flag); + //printf("flag.%d -> send\n",flag); for (i=0; iminerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); From f9ce94a4b3c7a3180f28d123886fc0e6705d8370 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 27 Dec 2016 19:57:12 +0200 Subject: [PATCH 288/432] 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 4e5e51d29..dfa572631 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1061,7 +1061,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } - if ( (rand() % 30) == 0 ) + if ( (rand() % 130) == 0 ) printf("%p ht.%d [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->height,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } } From 23febb4ffeea1ae3891d7256dfc19ccf580ada60 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 30 Dec 2016 11:31:59 +0200 Subject: [PATCH 289/432] test --- basilisk/basilisk.c | 2 +- basilisk/basilisk_DEX.c | 6 +++++- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_tradebot.c | 2 +- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 2 +- iguana/dpow/dpow_prices.c | 2 +- iguana/dpow/dpow_rpc.c | 28 +++++++++++++++++----------- iguana/iguana777.c | 26 +++++++++++++++++++++----- iguana/iguana_init.c | 2 ++ iguana/iguana_payments.c | 7 +++++-- iguana/iguana_unspents.c | 5 +++-- iguana/iguana_wallet.c | 13 +++++++++++-- includes/iguana_structs.h | 1 + 14 files changed, 71 insertions(+), 29 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index aa4360df4..4a2a714dc 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -954,7 +954,7 @@ HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr) timeoutmillis = BASILISK_TIMEOUT; if ( coin != 0 ) { - if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || coin->notarychain >= 0 ) { if ( (ptr= basilisk_bitcoinbalances(&Lptr,myinfo,coin,remoteaddr,basilisktag,timeoutmillis,vals)) != 0 ) { diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index 9ba011a28..badaee894 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -502,21 +502,25 @@ THREE_STRINGS_AND_DOUBLE(tradebot,aveprice,comment,base,rel,basevolume) ZERO_ARGS(InstantDEX,allcoins) { - struct iguana_info *tmp; cJSON *basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); + struct iguana_info *tmp; cJSON *notarychains,*basilisk,*virtual,*full,*retjson = cJSON_CreateObject(); full = cJSON_CreateArray(); basilisk = cJSON_CreateArray(); virtual = cJSON_CreateArray(); + notarychains = cJSON_CreateArray(); HASH_ITER(hh,myinfo->allcoins,coin,tmp) { if ( coin->virtualchain != 0 ) jaddistr(virtual,coin->symbol); 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,"basilisk",basilisk); jadd(retjson,"full",full); jadd(retjson,"virtual",virtual); + jadd(retjson,"notarychains",notarychains); return(jprint(retjson,1)); } diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index dcc261f89..014fc121e 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -447,7 +447,7 @@ void *basilisk_getinfo(struct basilisk_item *Lptr,struct supernet_info *myinfo,s return(clonestr("{\"error\":\"null valsobj\"}")); if ( (myinfo->IAMNOTARY != 0 || myinfo->NOTARY.RELAYID >= 0) && strcmp(coin->symbol,"RELAY") != 0 ) return(0); - if ( coin->VALIDATENODE > 0 || coin->FULLNODE > 0 ) + if ( coin->VALIDATENODE > 0 || coin->FULLNODE > 0 || coin->notarychain >= 0 ) { infojson = iguana_getinfo(myinfo,coin); Lptr->retstr = jprint(infojson,1); diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index ea80d7140..951aa5c74 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -410,7 +410,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } } else noquoteflag++; } - printf("%s -> %s myrequest.%d pendingid.%u noquoteflag.%d havequoteflag.%d maxi.%d %.8f\n",list[0].src,list[0].dest,myrequest,pendingid,noquoteflag,havequoteflag,maxi,dstr(maxamount)); + //printf("%s -> %s myrequest.%d pendingid.%u noquoteflag.%d havequoteflag.%d maxi.%d %.8f\n",list[0].src,list[0].dest,myrequest,pendingid,noquoteflag,havequoteflag,maxi,dstr(maxamount)); double retvals[4],refprice,profitmargin,aveprice; cJSON *retjson; char *retstr; if ( myinfo->IAMLP != 0 && myrequest == 0 && pendingid == 0 && noquoteflag != 0 && (profitmargin= tradebot_liquidity_active(myinfo,&refprice,list[0].src,list[0].dest)) > 0. ) { diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 1fa12cb3c..976c12e23 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -154,7 +154,7 @@ bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin, bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); -char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address,int32_t forceflag); char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index dfa572631..defa0f43d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -270,7 +270,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'A' ) { - retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen],0); *broadcastflagp = 1; if ( retstr == 0 ) retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index fe62ef314..3b942a953 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1462,7 +1462,7 @@ void PAX_update(struct PAX_data *dp,double *btcusdp,double *kmdbtcp) } else { - for (iter=0; iter<2; iter++) + for (iter=1; iter<2; iter++) { kmdhist = url_json(iter == 0 ? url : url2); //{"date":1406160000,"high":0.01,"low":0.00125,"open":0.01,"close":0.001375,"volume":1.50179994,"quoteVolume":903.58818412,"weightedAverage":0.00166204}, diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 6094cebda..1530fbb97 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -434,7 +434,7 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) return(retstr); } -char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address,int32_t forceflag) { char buf[1024],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson; int32_t i,n; FILE *fp; if ( coin->FULLNODE < 0 ) @@ -447,21 +447,27 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) { - for (i=0; isymbol), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) + if ( forceflag == 0 ) { - fwrite(outstr,1,strlen(outstr)+1,fp); - fclose(fp); - printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); + outstr = jprint(alljson,0); + sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(outstr,1,strlen(outstr)+1,fp); + fclose(fp); + printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); + } + free(outstr); } - free(outstr); } } free_json(alljson); diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 56259af43..3b471900f 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -839,7 +839,10 @@ void iguana_helper(void *arg) void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { - struct iguana_bundle *bp; struct iguana_peer *addr; int32_t bundlei; bits256 zero; char dirname[512],*symbol; + char NOTARYCHAINS[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies + "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", + "KMD", "BTC", "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; + struct iguana_bundle *bp; struct iguana_peer *addr; int32_t i,bundlei; bits256 zero; char dirname[512],*symbol; iguana_rwiAddrind(coin,0,0,0); //for (i=0; ichain); i++) // printf("%02x",((uint8_t *)coin->chain)[i]); @@ -869,10 +872,23 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) memset(zero.bytes,0,sizeof(zero)); if ( (bp= iguana_bundlecreate(coin,&bundlei,0,*(bits256 *)coin->chain->genesis_hashdata,zero,1)) != 0 ) bp->bundleheight = 0; + if ( coin->FULLNODE == 0 ) + { + coin->notarychain = -1; + for (i=0; isymbol,NOTARYCHAINS[i]) == 0 ) + { + coin->notarychain = i; + break; + } + } addr = &coin->peers->active[IGUANA_MAXPEERS-2]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); - printf("SEED_IPADDR initpeer.(%s)\n",addr->ipaddr); - iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); + printf("SEED_IPADDR initpeer.(%s) notarychain.%d\n",addr->ipaddr,coin->notarychain); + if ( coin->notarychain < 0 ) + { + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); + } } void iguana_coinloop(void *arg) @@ -890,7 +906,7 @@ void iguana_coinloop(void *arg) if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) { for (i=0; iFULLNODE < 0 ) + if ( coin->FULLNODE < 0 || coin->notarychain >= 0 ) continue; /*if ( strcmp(coin->symbol,"RELAY") == 0 ) { diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 5d07685ba..8d9ccacfd 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -564,6 +564,8 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ } } } + if ( coin->notarychain >= 0 ) + return(coin); //coin->firstblock = coin->blocks.parsedblocks + 1; iguana_genesis(myinfo,coin,coin->chain); int32_t bundlei = -2; diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index bb27f597a..db778a1f6 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -293,9 +293,12 @@ bits256 iguana_sendrawtransaction(struct supernet_info *myinfo,struct iguana_inf serialized = calloc(1,sizeof(struct iguana_msghdr) + len); decode_hex(&serialized[sizeof(struct iguana_msghdr)],len,signedtx); txid = bits256_doublesha256(0,&serialized[sizeof(struct iguana_msghdr)],len); - if ( coin->FULLNODE < 0 ) + if ( coin->FULLNODE < 0 || coin->notarychain >= 0 ) { - if ( (str= dpow_sendrawtransaction(myinfo,coin,signedtx)) != 0 ) + if ( coin->FULLNODE < 0 || coin->notarychain >= 0 ) + str = dpow_sendrawtransaction(myinfo,coin,signedtx); + else str = _dex_sendrawtransaction(myinfo,coin->symbol,signedtx); + if ( str != 0 ) { if ( is_hexstr(str,0) == sizeof(checktxid)*2 ) { diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 759993e73..ded00c7a8 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -585,6 +585,7 @@ int64_t iguana_RTpkhashbalance(struct supernet_info *myinfo,struct iguana_info * return(deposits - spent); } +// jl777: todo support notarychain iterate listunspent int32_t iguana_RTpkhasharray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,struct iguana_outpoint *unspents,int32_t *numunspentsp,int32_t maxunspents,char *remoteaddr,int32_t includespent) { int32_t i,n,m,numunspents; uint64_t spent,deposits,netbalance,total; struct iguana_outpoint lastpt; struct iguana_pkhash *p,_p; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; @@ -1071,7 +1072,7 @@ int32_t iguana_unspentfindjson(cJSON *destarray,cJSON *item) cJSON *iguana_RTlistunspent(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *argarray,int32_t minconf,int32_t maxconf,char *remoteaddr,int32_t includespends) { uint64_t total = 0; int32_t i,j,m,n,numrmds,numunspents=0; char *coinaddr,*retstr; uint8_t *rmdarray; cJSON *vals,*unspents,*item,*array,*retjson,*retarray; bits256 hash; - if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || coin->notarychain >= 0 ) { retjson = cJSON_CreateArray(); rmdarray = iguana_rmdarray(myinfo,coin,&numrmds,argarray,0); @@ -1168,7 +1169,7 @@ int32_t iguana_RTunspentslists(struct supernet_info *myinfo,struct iguana_info * } memset(pubkey,0,sizeof(pubkey)); //remains = required * 1.1 + coin->txfee; - if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || coin->notarychain >= 0 ) { for (i=numunspents=0; inotarychain >= 0 ) + { + if ( (retstr= _dex_getinfo(myinfo,coin->symbol)) != 0 ) + { + retjson = cJSON_Parse(retstr); + free(retstr); + return(retjson); + } else return(cJSON_Parse("{\"error\":\"null return\"}")); + } jaddstr(retjson,"result","success"); jaddnum(retjson,"protocolversion",PROTOCOL_VERSION); jaddnum(retjson,"kbfee",dstr(coin->txfee_perkb)); @@ -1146,7 +1155,7 @@ ZERO_ARGS(bitcoinrpc,getinfo) struct basilisk_item Lptr,*ptr; int32_t incr,i,j,m,n,longest; cJSON *valsobj,*getinfoobj=0,*array,*item,*fullnodes; if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); - if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) + if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || coin->notarychain >= 0 ) return(jprint(iguana_getinfo(myinfo,coin),1)); else { diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index c2a9f86cd..2d53fd9cc 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -517,6 +517,7 @@ struct iguana_info char lastdispstr[2048]; double txidfind_totalmillis,txidfind_num,spendtxid_totalmillis,spendtxid_num; struct iguana_monitorinfo monitoring[256]; + int32_t notarychain; struct datachain_info dPoW; struct iguana_zblock newblock; char *newblockstr; int32_t relay_RTheights[BASILISK_MAXRELAYS]; From 41f900faa5bee324484320f793e04a5ef1f3a8a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 30 Dec 2016 12:04:34 +0200 Subject: [PATCH 290/432] test --- iguana/dpow/dpow_tx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 87ae7d6c2..653e633c2 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -237,7 +237,7 @@ int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,in else opretlen = dpow_rwopret(1,opret,&bp->hashmsg,&bp->height,bp->srccoin->symbol,extras,n,bp,src_or_dest); if ( opretlen < 0 ) { - printf("negative opretlen src_or_dest.%d\n",src_or_dest); + printf("negative opretlen.%d src_or_dest.%d\n",opretlen,src_or_dest); return(-1); } opretlen = dpow_opreturnscript(data,opret,opretlen); @@ -571,7 +571,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo { if ( (retstr= dpow_sendrawtransaction(myinfo,coin,bp->signedtx)) != 0 ) { - printf("sendrawtransaction.(%s)\n",retstr); + //printf("sendrawtransaction.(%s)\n",retstr); if ( is_hexstr(retstr,0) == sizeof(txid)*2 ) { decode_hex(txid.bytes,sizeof(txid),retstr); From f3982630da2aacf790785b58d78353e137d7ff20 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 30 Dec 2016 16:58:59 +0200 Subject: [PATCH 291/432] test --- iguana/tests/assetchains | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100755 iguana/tests/assetchains diff --git a/iguana/tests/assetchains b/iguana/tests/assetchains deleted file mode 100755 index 3f52b6408..000000000 --- a/iguana/tests/assetchains +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -./assetchaind -ac_name=USD -addnode=78.47.196.146 & -./assetchaind -ac_name=EUR -addnode=78.47.196.146 & -./assetchaind -ac_name=JPY -addnode=78.47.196.146 & -./assetchaind -ac_name=GBP -addnode=78.47.196.146 & -./assetchaind -ac_name=AUD -addnode=78.47.196.146 & -./assetchaind -ac_name=CAD -addnode=78.47.196.146 & -./assetchaind -ac_name=CHF -addnode=78.47.196.146 & -./assetchaind -ac_name=NZD -addnode=78.47.196.146 & -./assetchaind -ac_name=CNY -addnode=78.47.196.146 & -./assetchaind -ac_name=RUB -addnode=78.47.196.146 & -./assetchaind -ac_name=MXN -addnode=78.47.196.146 & -./assetchaind -ac_name=RBL -addnode=78.47.196.146 & -./assetchaind -ac_name=INR -addnode=78.47.196.146 & -./assetchaind -ac_name=HKD -addnode=78.47.196.146 & -./assetchaind -ac_name=TRY -addnode=78.47.196.146 & -./assetchaind -ac_name=ZAR -addnode=78.47.196.146 & -./assetchaind -ac_name=PLN -addnode=78.47.196.146 & -./assetchaind -ac_name=NOK -addnode=78.47.196.146 & -./assetchaind -ac_name=SEK -addnode=78.47.196.146 & -./assetchaind -ac_name=DKK -addnode=78.47.196.146 & -./assetchaind -ac_name=CZK -addnode=78.47.196.146 & -./assetchaind -ac_name=HUF -addnode=78.47.196.146 & -./assetchaind -ac_name=ILS -addnode=78.47.196.146 & -./assetchaind -ac_name=KRW -addnode=78.47.196.146 & -./assetchaind -ac_name=MYR -addnode=78.47.196.146 & -./assetchaind -ac_name=PHP -addnode=78.47.196.146 & -./assetchaind -ac_name=RON -addnode=78.47.196.146 & -./assetchaind -ac_name=SGD -addnode=78.47.196.146 & -./assetchaind -ac_name=THB -addnode=78.47.196.146 & -./assetchaind -ac_name=BGN -addnode=78.47.196.146 & -./assetchaind -ac_name=IDR -addnode=78.47.196.146 & -./assetchaind -ac_name=HRK -addnode=78.47.196.146 & From 5552f9fb5ac3af0a5c80ae6696c2abeabc354a25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 10:24:41 +0200 Subject: [PATCH 292/432] filter unspendables from listunspent --- iguana/dpow/dpow_rpc.c | 2 ++ iguana/iguana_unspents.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 1530fbb97..8652eb232 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -560,6 +560,8 @@ int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits { i = (r + j) % n; item = jitem(unspents,i); + if ( is_cJSON_False(jobj(item,"spendable")) != 0 ) + continue; satoshis = SATOSHIDEN * jdouble(item,"amount"); if ( satoshis == DPOW_UTXOSIZE && (address= jstr(item,"address")) != 0 && strcmp(address,coinaddr) == 0 ) { diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index ded00c7a8..f9203d8a8 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1220,6 +1220,8 @@ int32_t iguana_RTunspentslists(struct supernet_info *myinfo,struct iguana_info * { for (i=0; i Date: Sun, 1 Jan 2017 10:26:00 +0200 Subject: [PATCH 293/432] 17 --- iguana/dPoW.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 976c12e23..4d1c27e4b 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -19,7 +19,7 @@ #define DPOW_FIRSTRATIFY 1000 #define DPOW_CHECKPOINTFREQ 10 -#define DPOW_MINSIGS 11 +#define DPOW_MINSIGS 17 //#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 0x0777 From 43247b41767fe7c2d9a31177aa9a1fc58b2fe75b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 15:00:59 +0200 Subject: [PATCH 294/432] fix getinfo --- iguana/iguana777.c | 41 +++++++++++++++++++++------------------ includes/iguana_structs.h | 2 +- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 3b471900f..6176e51b7 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -872,12 +872,13 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) memset(zero.bytes,0,sizeof(zero)); if ( (bp= iguana_bundlecreate(coin,&bundlei,0,*(bits256 *)coin->chain->genesis_hashdata,zero,1)) != 0 ) bp->bundleheight = 0; + coin->notarychain = -1; if ( coin->FULLNODE == 0 ) { - coin->notarychain = -1; for (i=0; isymbol,NOTARYCHAINS[i]) == 0 ) { + printf("SET NOTARYCHAIN.%d\n",i); coin->notarychain = i; break; } @@ -885,10 +886,7 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) addr = &coin->peers->active[IGUANA_MAXPEERS-2]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); printf("SEED_IPADDR initpeer.(%s) notarychain.%d\n",addr->ipaddr,coin->notarychain); - if ( coin->notarychain < 0 ) - { - iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); - } + iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD); } void iguana_coinloop(void *arg) @@ -899,20 +897,6 @@ void iguana_coinloop(void *arg) coins++; coin = coins[0]; printf("begin coinloop[%d] %s\n",n,coin->symbol); - if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) - { - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) - { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) - { - for (i=0; ididaddresses == 0 ) + { + coin->didaddresses = 1; + coin->notarychain = -1; + if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) + { + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; iFULLNODE < 0 || coin->notarychain >= 0 ) continue; /*if ( strcmp(coin->symbol,"RELAY") == 0 ) diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 2d53fd9cc..6cf3766a3 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -517,7 +517,7 @@ struct iguana_info char lastdispstr[2048]; double txidfind_totalmillis,txidfind_num,spendtxid_totalmillis,spendtxid_num; struct iguana_monitorinfo monitoring[256]; - int32_t notarychain; + int32_t notarychain,didaddresses; struct datachain_info dPoW; struct iguana_zblock newblock; char *newblockstr; int32_t relay_RTheights[BASILISK_MAXRELAYS]; From 8be6b10c5e810c4935e52e489947e1665644778b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 15:12:53 +0200 Subject: [PATCH 295/432] fundnotaries --- iguana/iguana_notary.c | 34 +++++++++++++++++++--------------- iguana/tests/fundnotaries | 2 ++ includes/iguana_apideclares.h | 2 ++ 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100755 iguana/tests/fundnotaries diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 9f1a6b158..fe831f8ef 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -425,29 +425,33 @@ STRING_ARG(iguana,addnotary,ipaddr) return(clonestr("{\"result\":\"notary node added\"}")); } -STRING_ARG(dpow,active,maskhex) -{ - uint8_t data[8],revdata[8]; int32_t i,len; uint64_t mask; cJSON *retjson,*array = cJSON_CreateArray(); - //return(clonestr("{\"error\":\"dpow active is deprecated for now\"}")); - if ( 0 ) +STRING_ARG(dpow,fundnotaries,symbol) +{ + int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); + char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies + "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; + uint8_t pubkeys[64][33]; char coinaddr[64],cmd[1024]; int32_t i,j; double val = 0.01; + int32_t n = komodo_notaries("KMD",pubkeys,114000); + for (i=0; iDPOWS[0].lastrecvmask; diff --git a/iguana/tests/fundnotaries b/iguana/tests/fundnotaries new file mode 100755 index 000000000..f36590638 --- /dev/null +++ b/iguana/tests/fundnotaries @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dpow\",\"method\":\"fundnotaries\",\"symbol\":\"$1\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index fc5bc5e6c..142b944fb 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -20,6 +20,8 @@ TWOINTS_AND_ARRAY(dpow,ratify,minsigs,timestamp,ratified); ZERO_ARGS(dpow,cancelratify); THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); +STRING_ARG(dpow,fundnotaries,symbol); + TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); STRING_ARG(dex,getinfo,symbol); From 96d6ecb8118d0753f8c4c63b3ac4b62e4f7bc240 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 15:19:19 +0200 Subject: [PATCH 296/432] test --- iguana/tests/fundassets | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100755 iguana/tests/fundassets diff --git a/iguana/tests/fundassets b/iguana/tests/fundassets new file mode 100755 index 000000000..06510c17e --- /dev/null +++ b/iguana/tests/fundassets @@ -0,0 +1,34 @@ +#!/bin/bash +set -x +./komodo-cli paxdeposit $1 1 aud +./komodo-cli paxdeposit $1 1 bgn +./komodo-cli paxdeposit $1 1 cad +./komodo-cli paxdeposit $1 1 chf +./komodo-cli paxdeposit $1 1 cny +./komodo-cli paxdeposit $1 1 czk +./komodo-cli paxdeposit $1 1 dkk +./komodo-cli paxdeposit $1 1 eur +./komodo-cli paxdeposit $1 1 gbp +./komodo-cli paxdeposit $1 1 hkd +./komodo-cli paxdeposit $1 1 hrk +./komodo-cli paxdeposit $1 1 huf +./komodo-cli paxdeposit $1 1 idr +./komodo-cli paxdeposit $1 1 ils +./komodo-cli paxdeposit $1 1 inr +./komodo-cli paxdeposit $1 1 jpy +./komodo-cli paxdeposit $1 1 krw +./komodo-cli paxdeposit $1 1 mxn +./komodo-cli paxdeposit $1 1 myr +./komodo-cli paxdeposit $1 1 nok +./komodo-cli paxdeposit $1 1 nzd +./komodo-cli paxdeposit $1 1 php +./komodo-cli paxdeposit $1 1 pln +./komodo-cli paxdeposit $1 1 brl +./komodo-cli paxdeposit $1 1 ron +./komodo-cli paxdeposit $1 1 rub +./komodo-cli paxdeposit $1 1 sek +./komodo-cli paxdeposit $1 1 sgd +./komodo-cli paxdeposit $1 1 thb +./komodo-cli paxdeposit $1 1 try +./komodo-cli paxdeposit $1 1 usd +./komodo-cli paxdeposit $1 1 zar From 901a2822c33fb5bb2e4e34c0879e4b6c19000af7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 15:21:33 +0200 Subject: [PATCH 297/432] fundassets --- iguana/tests/fundassets | 64 ++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/iguana/tests/fundassets b/iguana/tests/fundassets index 06510c17e..ff7637885 100755 --- a/iguana/tests/fundassets +++ b/iguana/tests/fundassets @@ -1,34 +1,34 @@ #!/bin/bash set -x -./komodo-cli paxdeposit $1 1 aud -./komodo-cli paxdeposit $1 1 bgn -./komodo-cli paxdeposit $1 1 cad -./komodo-cli paxdeposit $1 1 chf -./komodo-cli paxdeposit $1 1 cny -./komodo-cli paxdeposit $1 1 czk -./komodo-cli paxdeposit $1 1 dkk -./komodo-cli paxdeposit $1 1 eur -./komodo-cli paxdeposit $1 1 gbp -./komodo-cli paxdeposit $1 1 hkd -./komodo-cli paxdeposit $1 1 hrk -./komodo-cli paxdeposit $1 1 huf -./komodo-cli paxdeposit $1 1 idr -./komodo-cli paxdeposit $1 1 ils -./komodo-cli paxdeposit $1 1 inr -./komodo-cli paxdeposit $1 1 jpy -./komodo-cli paxdeposit $1 1 krw -./komodo-cli paxdeposit $1 1 mxn -./komodo-cli paxdeposit $1 1 myr -./komodo-cli paxdeposit $1 1 nok -./komodo-cli paxdeposit $1 1 nzd -./komodo-cli paxdeposit $1 1 php -./komodo-cli paxdeposit $1 1 pln -./komodo-cli paxdeposit $1 1 brl -./komodo-cli paxdeposit $1 1 ron -./komodo-cli paxdeposit $1 1 rub -./komodo-cli paxdeposit $1 1 sek -./komodo-cli paxdeposit $1 1 sgd -./komodo-cli paxdeposit $1 1 thb -./komodo-cli paxdeposit $1 1 try -./komodo-cli paxdeposit $1 1 usd -./komodo-cli paxdeposit $1 1 zar +~/komodo/src/komodo-cli paxdeposit $1 1 aud +~/komodo/src/komodo-cli paxdeposit $1 1 bgn +~/komodo/src/komodo-cli paxdeposit $1 1 cad +~/komodo/src/komodo-cli paxdeposit $1 1 chf +~/komodo/src/komodo-cli paxdeposit $1 1 cny +~/komodo/src/komodo-cli paxdeposit $1 1 czk +~/komodo/src/komodo-cli paxdeposit $1 1 dkk +~/komodo/src/komodo-cli paxdeposit $1 1 eur +~/komodo/src/komodo-cli paxdeposit $1 1 gbp +~/komodo/src/komodo-cli paxdeposit $1 1 hkd +~/komodo/src/komodo-cli paxdeposit $1 1 hrk +~/komodo/src/komodo-cli paxdeposit $1 1 huf +~/komodo/src/komodo-cli paxdeposit $1 1 idr +~/komodo/src/komodo-cli paxdeposit $1 1 ils +~/komodo/src/komodo-cli paxdeposit $1 1 inr +~/komodo/src/komodo-cli paxdeposit $1 1 jpy +~/komodo/src/komodo-cli paxdeposit $1 1 krw +~/komodo/src/komodo-cli paxdeposit $1 1 mxn +~/komodo/src/komodo-cli paxdeposit $1 1 myr +~/komodo/src/komodo-cli paxdeposit $1 1 nok +~/komodo/src/komodo-cli paxdeposit $1 1 nzd +~/komodo/src/komodo-cli paxdeposit $1 1 php +~/komodo/src/komodo-cli paxdeposit $1 1 pln +~/komodo/src/komodo-cli paxdeposit $1 1 brl +~/komodo/src/komodo-cli paxdeposit $1 1 ron +~/komodo/src/komodo-cli paxdeposit $1 1 rub +~/komodo/src/komodo-cli paxdeposit $1 1 sek +~/komodo/src/komodo-cli paxdeposit $1 1 sgd +~/komodo/src/komodo-cli paxdeposit $1 1 thb +~/komodo/src/komodo-cli paxdeposit $1 1 try +~/komodo/src/komodo-cli paxdeposit $1 1 usd +~/komodo/src/komodo-cli paxdeposit $1 1 zar From bed70a7e73b4532a2e390223c66e7f5933bad089 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 1 Jan 2017 22:47:40 +0200 Subject: [PATCH 298/432] test --- iguana/tests/{fundassets => fundfiats} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename iguana/tests/{fundassets => fundfiats} (100%) diff --git a/iguana/tests/fundassets b/iguana/tests/fundfiats similarity index 100% rename from iguana/tests/fundassets rename to iguana/tests/fundfiats From f9d05b76aefd29848ee85e36e661aa69351bd076 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 01:15:50 +0200 Subject: [PATCH 299/432] 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 defa0f43d..be5b16837 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -700,7 +700,7 @@ void dpow_bestconsensus(struct dpow_block *bp) for (i=0; i best ) + if ( counts[i] > best && bitweight(masks[i]) >= bp->minsigs ) { best = counts[i]; besti = i; From 264c3f0273f7d91af1f9f8c6fa66667a397e4c25 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 11:51:34 +0200 Subject: [PATCH 300/432] test --- iguana/iguana_unspents.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index f9203d8a8..97b7c890e 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1169,7 +1169,7 @@ int32_t iguana_RTunspentslists(struct supernet_info *myinfo,struct iguana_info * } memset(pubkey,0,sizeof(pubkey)); //remains = required * 1.1 + coin->txfee; - if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || coin->notarychain >= 0 ) + if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 || (coin->FULLNODE == 0 && coin->notarychain >= 0) ) { for (i=numunspents=0; i Date: Mon, 2 Jan 2017 11:59:20 +0200 Subject: [PATCH 301/432] test --- iguana/iguana_unspents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 97b7c890e..4d2581d69 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1223,7 +1223,7 @@ int32_t iguana_RTunspentslists(struct supernet_info *myinfo,struct iguana_info * item = jitem(array,i); if ( is_cJSON_False(jobj(item,"spendable")) != 0 ) { - printf("skip unspendable.(%s)\n",jprint(item,0)); + //printf("skip unspendable.(%s)\n",jprint(item,0)); continue; } if ( (spendscriptstr= jstr(item,"scriptPubKey")) == 0 ) From 4c557d3df36dc6b2370da66329f1a99be44eb13f Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 12:30:35 +0200 Subject: [PATCH 302/432] test --- iguana/iguana_notary.c | 49 +++++++++++++++++++++++++++++++++-- iguana/tests/fundBTC | 2 ++ includes/iguana_apideclares.h | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100755 iguana/tests/fundBTC diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index fe831f8ef..3ead36771 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -425,14 +425,59 @@ STRING_ARG(iguana,addnotary,ipaddr) return(clonestr("{\"result\":\"notary node added\"}")); } -STRING_ARG(dpow,fundnotaries,symbol) +STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) { int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; - uint8_t pubkeys[64][33]; char coinaddr[64],cmd[1024]; int32_t i,j; double val = 0.01; + uint8_t pubkeys[64][33]; cJSON *infojson; char coinaddr[64],cmd[1024]; uint64_t signedmask; int32_t i,j,sendflag=0,current=0,height; FILE *fp; double vals[64],sum,val = 0.01; int32_t n = komodo_notaries("KMD",pubkeys,114000); + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 ) + { + if ( numblocks == 0 ) + numblocks = 10000; + else sendflag = 1; + memset(vals,0,sizeof(vals)); + if ( (infojson= dpow_getinfo(myinfo,coin)) != 0 ) + { + current = jint(infojson,"blocks"); + free_json(infojson); + } else return(clonestr("{\"error\":\"cant get current height\"}")); + if ( (fp= fopen("signedmasks","rb")) != 0 ) + { + while ( 1 ) + { + if ( fread(&height,1,sizeof(height),fp) == sizeof(height) && fread(&signedmask,1,sizeof(signedmask),fp) == sizeof(signedmask) ) + { + if ( height > current - numblocks ) + { + for (j=0; j<64; j++) + if ( ((1LL << j) & signedmask) != 0 ) + vals[j] += (double)DPOW_UTXOSIZE / SATOSHIDEN; + } + } else break; + } + fclose(fp); + } + for (sum=j=0; j 0. ) + { + bitcoin_address(coinaddr,60,pubkeys[j],33); + sprintf(cmd,"bicoin-cli sendtoaddress %s %f\n",coinaddr,val); + if ( sendflag != 0 && system(cmd) != 0 ) + printf("ERROR with (%s)\n",cmd); + else + { + printf("(%d %f) ",j,val); + sum += val; + } + } + } + printf("%s sent %.8f BTC\n",sendflag!=0?"":"would have",sum); + return(clonestr("{\"result\":\"success\"}")); + } for (i=0; i Date: Mon, 2 Jan 2017 12:37:37 +0200 Subject: [PATCH 303/432] test --- iguana/iguana_notary.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3ead36771..8decab8a0 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -450,6 +450,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) { if ( fread(&height,1,sizeof(height),fp) == sizeof(height) && fread(&signedmask,1,sizeof(signedmask),fp) == sizeof(signedmask) ) { + printf("ht.%d %llx\n",height,(long long)signedmask); if ( height > current - numblocks ) { for (j=0; j<64; j++) @@ -459,7 +460,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) } else break; } fclose(fp); - } + } else return(clonestr("{\"error\":\"cant open signedmasks\"}")); for (sum=j=0; j 0. ) From caad143026cd7474199e8e1673d7c138145ca7b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 12:41:50 +0200 Subject: [PATCH 304/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 8decab8a0..0a7f35c94 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -450,7 +450,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) { if ( fread(&height,1,sizeof(height),fp) == sizeof(height) && fread(&signedmask,1,sizeof(signedmask),fp) == sizeof(signedmask) ) { - printf("ht.%d %llx\n",height,(long long)signedmask); + printf("ht.%d %llx vs current.%d - %d\n",height,(long long)signedmask,current,numblocks); if ( height > current - numblocks ) { for (j=0; j<64; j++) From 29cc54aae7669679067fab81d33419aae98119b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 12:45:20 +0200 Subject: [PATCH 305/432] test --- iguana/iguana_notary.c | 56 ++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 0a7f35c94..480ba5c48 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -433,7 +433,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; uint8_t pubkeys[64][33]; cJSON *infojson; char coinaddr[64],cmd[1024]; uint64_t signedmask; int32_t i,j,sendflag=0,current=0,height; FILE *fp; double vals[64],sum,val = 0.01; int32_t n = komodo_notaries("KMD",pubkeys,114000); - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("BTC")) != 0 ) + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("KMD")) != 0 ) { if ( numblocks == 0 ) numblocks = 10000; @@ -444,40 +444,44 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) current = jint(infojson,"blocks"); free_json(infojson); } else return(clonestr("{\"error\":\"cant get current height\"}")); - if ( (fp= fopen("signedmasks","rb")) != 0 ) + if ( (coin= iguana_coinfind("BTC")) != 0 ) { - while ( 1 ) + if ( (fp= fopen("signedmasks","rb")) != 0 ) { - if ( fread(&height,1,sizeof(height),fp) == sizeof(height) && fread(&signedmask,1,sizeof(signedmask),fp) == sizeof(signedmask) ) + while ( 1 ) { - printf("ht.%d %llx vs current.%d - %d\n",height,(long long)signedmask,current,numblocks); - if ( height > current - numblocks ) + if ( fread(&height,1,sizeof(height),fp) == sizeof(height) && fread(&signedmask,1,sizeof(signedmask),fp) == sizeof(signedmask) ) { - for (j=0; j<64; j++) - if ( ((1LL << j) & signedmask) != 0 ) - vals[j] += (double)DPOW_UTXOSIZE / SATOSHIDEN; - } - } else break; - } - fclose(fp); - } else return(clonestr("{\"error\":\"cant open signedmasks\"}")); - for (sum=j=0; j 0. ) + if ( height > current - numblocks ) + { + printf("ht.%d %llx vs current.%d - %d\n",height,(long long)signedmask,current,numblocks); + for (j=0; j<64; j++) + if ( ((1LL << j) & signedmask) != 0 ) + vals[j] += (double)DPOW_UTXOSIZE / SATOSHIDEN; + } + } else break; + } + fclose(fp); + } else return(clonestr("{\"error\":\"cant open signedmasks\"}")); + for (sum=j=0; j 0. ) { - printf("(%d %f) ",j,val); - sum += val; + bitcoin_address(coinaddr,60,pubkeys[j],33); + sprintf(cmd,"bicoin-cli sendtoaddress %s %f\n",coinaddr,val); + if ( sendflag != 0 && system(cmd) != 0 ) + printf("ERROR with (%s)\n",cmd); + else + { + printf("(%d %f) ",j,val); + sum += val; + } } } + printf("%s sent %.8f BTC\n",sendflag!=0?"":"would have",sum); + return(clonestr("{\"result\":\"success\"}")); } - printf("%s sent %.8f BTC\n",sendflag!=0?"":"would have",sum); - return(clonestr("{\"result\":\"success\"}")); + else return(clonestr("{\"error\":\"cant find BTC\"}")); } for (i=0; i Date: Mon, 2 Jan 2017 13:49:45 +0200 Subject: [PATCH 306/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 480ba5c48..ffac22ece 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -170,7 +170,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { if ( strcmp(dp->dest,"KMD") == 0 ) dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); - char str[65]; printf("%s %s height.%d vs last.%d\n",dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); + char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->dest,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); if ( dp->lastheight == 0 ) dp->lastheight = height-1; if ( height < dp->last.blockhash.height ) From af955b7562f175aa3a22110e6cf8ac7244e63444 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 14:22:25 +0200 Subject: [PATCH 307/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ffac22ece..03cf58c38 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -157,7 +157,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { - char str[65]; printf("%s %s height.%d vs last.%d\n",dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); + char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->symbol,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { printf("iguana_dPoWupdate dest.%s reorg detected %d vs %d\n",dp->dest,height,dp->destchaintip.blockhash.height); From 6aa6f2f48c6c832c03af197f53f738d7140fa2a7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 14:58:54 +0200 Subject: [PATCH 308/432] test --- basilisk/basilisk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 4a2a714dc..82803763a 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -883,15 +883,18 @@ void basilisks_loop(void *arg) basilisk_ping_send(myinfo,relay); counter++; if ( myinfo->numdpows == 1 ) + { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); + endmilli = startmilli + 50; + } else if ( myinfo->numdpows > 1 ) { dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); + endmilli = startmilli + 10; } - endmilli = startmilli + 50; } else { From f8ec6e274e1692ad90c4f2a5f4e38328b6e0abf9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 2 Jan 2017 19:14:38 +0200 Subject: [PATCH 309/432] test --- basilisk/basilisk_tradebot.c | 4 +++- iguana/iguana777.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 951aa5c74..ab606d6fb 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -343,7 +343,9 @@ void tradebot_liquidity_command(struct supernet_info *myinfo,char *base,bits256 { strcpy(li.base,refli.base); strcpy(li.rel,refli.rel); - li.refprice = (1. / li.refprice); + if ( fabs(li.refprice) > SMALLVAL ) + li.refprice = (1. / li.refprice); + else li.refprice = 0.; printf("Set rev linfo[%d] (%s/%s) %.6f %.8f\n",i,li.base,li.rel,li.profit,li.refprice); myinfo->linfos[i] = li; return; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 90126615d..52d136d2f 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -116,7 +116,7 @@ struct supernet_info // fadedreamz struct peggy_info *PEGS; void *PAXDATA; - struct liquidity_info linfos[64]; + struct liquidity_info linfos[512]; struct komodo_notaries NOTARY; char seedipaddr[64]; uint32_t dpowipbits[128]; int32_t numdpowipbits; portable_mutex_t notarymutex,dpowmutex; char dexseed_ipaddr[64]; uint32_t dexipbits[128]; int32_t numdexipbits; portable_mutex_t dexmutex; From 9651183dd424dc358e98651a7aab0f8d1bd9ad9e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 3 Jan 2017 11:44:45 +0200 Subject: [PATCH 310/432] test --- crypto777/bitcoind_RPC.c | 2 +- iguana/dpow/dpow_rpc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 60a0fe1de..ed69962c6 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -89,7 +89,7 @@ char *post_process_bitcoind_RPC(char *debugstr,char *command,char *rpcstr,char * } else if ( (error->type&0xff) != cJSON_NULL || (result->type&0xff) != cJSON_NULL ) { - if ( strcmp(command,"signrawtransaction") != 0 ) + if ( strcmp(command,"signrawtransaction") != 0 && strcmp(command,"sendrawtransaction") != 0 ) printf("<<<<<<<<<<< bitcoind_RPC: %s post_process_bitcoind_RPC (%s) error.%s\n",debugstr,command,rpcstr); retstr = rpcstr; rpcstr = 0; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 8652eb232..54924fc22 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -409,7 +409,7 @@ char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *c jaddistr(array,signedtx); paramstr = jprint(array,1); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"sendrawtransaction",paramstr); - printf(">>>>>>>>>>> %s sendrawtransaction.(%s) -> %s\n",coin->symbol,paramstr,retstr); + //printf(">>>>>>>>>>> %s sendrawtransaction.(%s) -> %s\n",coin->symbol,paramstr,retstr); free(paramstr); return(retstr); } From 692901a1871d55da9a8f0ef39c38d98115f2e767 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 17:29:29 +0200 Subject: [PATCH 311/432] initial tradebots --- basilisk/basilisk.c | 2 + basilisk/basilisk.h | 1 + basilisk/basilisk_swap.c | 4 +- basilisk/basilisk_tradebot.c | 108 +--- basilisk/tradebots_liquidity.c | 869 +++++++++++++++++++++++++++++++++ crypto777/OS_portable.c | 11 + crypto777/OS_portable.h | 1 + crypto777/bitcoind_RPC.c | 1 + crypto777/hmac_sha512.c | 2 +- crypto777/iguana_utils.c | 8 + iguana/dpow/dpow_tx.c | 12 +- iguana/exchanges/bittrex.c | 7 +- iguana/exchanges/poloniex.c | 5 +- iguana/exchanges777.h | 4 +- iguana/iguana777.h | 5 +- iguana/iguana_exchanges.c | 18 +- iguana/iguana_notary.c | 4 +- iguana/main.c | 5 +- iguana/tests/arbinit | 64 +++ iguana/tests/arbnxt | 26 + includes/iguana_funcs.h | 1 + 21 files changed, 1026 insertions(+), 132 deletions(-) create mode 100755 basilisk/tradebots_liquidity.c create mode 100755 iguana/tests/arbinit create mode 100755 iguana/tests/arbnxt diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 82803763a..7ab92ec0a 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -14,6 +14,7 @@ ******************************************************************************/ #include "../iguana/iguana777.h" +#include "exchanges777.h" typedef char *basilisk_servicefunc(struct supernet_info *myinfo,char *CMD,void *addr,char *remoteaddr,uint32_t basilisktag,cJSON *valsobj,uint8_t *data,int32_t datalen,bits256 hash,int32_t from_basilisk); @@ -482,6 +483,7 @@ int32_t basilisk_relayid(struct supernet_info *myinfo,uint32_t ipbits) #include "basilisk_lisk.c" #include "basilisk_MSG.c" +#include "tradebots_liquidity.c" #include "basilisk_tradebot.c" #include "basilisk_swap.c" #include "basilisk_DEX.c" diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index e4bd8c5ef..68da72a3c 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -79,6 +79,7 @@ struct basilisk_swapinfo 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]; diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 7b1966bc9..2e55bc46a 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1558,7 +1558,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap printf("Bob error spending alice payment\n"); else { - basilisk_swap_balancingtrade(myinfo,swap,1); + tradebot_swap_balancingtrade(myinfo,swap,1); printf("Bob spends alicepayment\n"); swap->I.statebits |= 0x40000; while ( basilisk_numconfirms(myinfo,&swap->bobspend) < swap->I.aliceconfirms ) @@ -1629,7 +1629,7 @@ int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap if ( basilisk_swapget(myinfo,swap,0x8000,data,maxlen,basilisk_verify_bobpaid) == 0 ) { printf("got bobpayment\n"); - basilisk_swap_balancingtrade(myinfo,swap,0); + tradebot_swap_balancingtrade(myinfo,swap,0); // verify payment and submit, set confirmed height swap->I.statebits |= 0x8000; } diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index ab606d6fb..23290c8d4 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -14,60 +14,6 @@ ******************************************************************************/ // included from basilisk.c -void basilisk_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) -{ - // update balance, compare to target balance, issue balancing trade via central exchanges, if needed - double price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; - srcamount = swap->I.req.srcamount; - destamount = swap->I.req.destamount; - profitmargin = (double)swap->I.req.profitmargin / 1000000.; - if ( srcamount <= SMALLVAL || destamount <= SMALLVAL ) - { - printf("illegal amount for balancing %f %f\n",srcamount,destamount); - return; - } - strcpy(rel,"BTC"); - if ( strcmp(swap->I.req.src,"BTC") == 0 ) - { - strcpy(base,swap->I.req.dest); - price = (srcamount / destamount); - volume = destamount / SATOSHIDEN; - dir = -1.; - } - else if ( strcmp(swap->I.req.dest,"BTC") == 0 ) - { - strcpy(base,swap->I.req.src); - price = (destamount / srcamount); - volume = srcamount / SATOSHIDEN; - dir = 1.; - } - else - { - printf("only BTC trades can be balanced, not (%s/%s)\n",swap->I.req.src,swap->I.req.dest); - return; - } - if ( iambob != 0 ) - { - if ( myinfo->IAMLP != 0 ) - { - printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); - if ( dir < 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - } - } - else - { - if ( myinfo->IAMLP != 0 ) - { - printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); - if ( dir > 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - } - } -} - cJSON *basilisk_rawtxobj(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx) { @@ -170,12 +116,13 @@ struct basilisk_swap *basilisk_swapstore(struct supernet_info *myinfo,struct bas struct basilisk_swap *basilisk_swapload(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t requestid,uint32_t quoteid) { - return(swap); + // set swap fields and return it if found + return(0); } void basilisk_swapstart(struct supernet_info *myinfo) // scan saved tmpswap, purge if complete, else Q { - + // for resuming pending swaps } void basilisk_txlog(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,int32_t delay) @@ -329,53 +276,6 @@ int32_t basilisk_request_cmpref(struct basilisk_request *ref,struct basilisk_req } else return(0); } -void tradebot_liquidity_command(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals) -{ - struct liquidity_info li,refli; int32_t i; - memset(&li,0,sizeof(li)); - strcpy(li.base,base), strcpy(li.rel,"BTC"); - li.profit = jdouble(vals,"profit"); - li.refprice = jdouble(vals,"refprice"); - for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) - { - refli = myinfo->linfos[i]; - if ( strcmp(li.rel,refli.base) == 0 && strcmp(li.base,refli.rel) == 0 ) - { - strcpy(li.base,refli.base); - strcpy(li.rel,refli.rel); - if ( fabs(li.refprice) > SMALLVAL ) - li.refprice = (1. / li.refprice); - else li.refprice = 0.; - printf("Set rev linfo[%d] (%s/%s) %.6f %.8f\n",i,li.base,li.rel,li.profit,li.refprice); - myinfo->linfos[i] = li; - return; - } - else if ( refli.base[0] == 0 || (strcmp(li.base,refli.base) == 0 && strcmp(li.rel,refli.rel) == 0) ) - { - myinfo->linfos[i] = li; - printf("Set linfo[%d] (%s/%s) %.6f %.8f\n",i,li.base,li.rel,li.profit,li.refprice); - return; - } - } - printf("ERROR: too many linfos %d\n",i); -} - -double tradebot_liquidity_active(struct supernet_info *myinfo,double *refpricep,char *base,char *rel) -{ - int32_t i; struct liquidity_info refli; - *refpricep = 0.; - for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) - { - refli = myinfo->linfos[i]; - if ( (strcmp(base,refli.base) == 0 && strcmp(rel,refli.rel) == 0) || (strcmp(rel,refli.base) == 0 && strcmp(base,refli.rel) == 0 )) - { - *refpricep = refli.refprice; - return(refli.profit); - } - } - return(0.); -} - 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.; @@ -414,7 +314,7 @@ double basilisk_request_listprocess(struct supernet_info *myinfo,struct basilisk } //printf("%s -> %s myrequest.%d pendingid.%u noquoteflag.%d havequoteflag.%d maxi.%d %.8f\n",list[0].src,list[0].dest,myrequest,pendingid,noquoteflag,havequoteflag,maxi,dstr(maxamount)); double retvals[4],refprice,profitmargin,aveprice; cJSON *retjson; char *retstr; - if ( myinfo->IAMLP != 0 && myrequest == 0 && pendingid == 0 && noquoteflag != 0 && (profitmargin= tradebot_liquidity_active(myinfo,&refprice,list[0].src,list[0].dest)) > 0. ) + if ( maxi >= 0 && myinfo->IAMLP != 0 && myrequest == 0 && pendingid == 0 && noquoteflag != 0 && (profitmargin= tradebot_liquidity_active(myinfo,&refprice,"DEX",list[maxi].src,list[maxi].dest,(double)maxamount/SATOSHIDEN)) > 0. ) { if ( (aveprice= instantdex_avehbla(myinfo,retvals,list[0].src,list[0].dest,1.3 * dstr(list[0].srcamount))) == 0. || refprice > aveprice ) aveprice = refprice; diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c new file mode 100755 index 000000000..28b551f61 --- /dev/null +++ b/basilisk/tradebots_liquidity.c @@ -0,0 +1,869 @@ +/****************************************************************************** + * Copyright © 2014-2016 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 +/* + In order to provide liquidity from central exchanges, we need to issue balancing trades, however to do this properly, we need to know what the desired balance is. If unspecified, then a neutral balance is assumed. + The liquidity_info interface is quite flexible, there is a single function liquidity_active() which returns non-zero if the LP node should respond. The model is that the liquidity_command() is used to configure the liquidity_active()'s response. + In order for dynamic adaptiveness to work, the liquidity_command/liquidity_active needs to interact with the balancing. + A simplistic default trio of functions are provided, but any level of complexity is possible with the liquidity interface. + */ + +#define TRADEBOTS_NUMANSWERS 8 +#define TRADEBOTS_NUMDECAYS 8 +#define TRADEBOTS_RAWFEATURESINCR 7 +#define TRADEBOTS_MAXPAIRS 1024 + +double Tradebots_decays[TRADEBOTS_NUMDECAYS] = { 0.5, 0.666, 0.8, 0.9, 0.95, 0.99, 0.995, 0.999 }; +int32_t Tradebots_answergaps[TRADEBOTS_NUMANSWERS] = { 5, 10, 15, 20, 30, 60, 120, 720 }; + +struct tradebot_arbentry +{ + char exchange[16]; + double price,volume,profitmargin; + uint32_t timestamp; +}; + +struct tradebot_arbexchange +{ + char name[16]; + struct tradebot_arbentry trades[2]; +}; + +struct tradebot_arbpair +{ + char base[32],rel[32]; + uint32_t lasttime,lastanswertime; FILE *fp; + int32_t numexchanges,counter,btccounter,usdcounter,cnycounter; + double highbid,lowask,hblavolume,btcbid,btcask,btcvol,usdbid,usdask,usdvol,cnybid,cnyask,cnyvol; + double bidaves[TRADEBOTS_NUMDECAYS],askaves[TRADEBOTS_NUMDECAYS]; + double bidslopes[TRADEBOTS_NUMDECAYS],askslopes[TRADEBOTS_NUMDECAYS]; + struct tradebot_arbexchange exchanges[16]; + uint8_t dirmasks[2],slopedirs[2]; + char *svmpairs[TRADEBOTS_MAXPAIRS][2]; + int32_t RTgood[TRADEBOTS_NUMANSWERS],RTbad[TRADEBOTS_NUMANSWERS],numrawfeatures,numsvmfeatures,numpairs; + float rawfeatures[TRADEBOTS_NUMANSWERS+64],prevrawfeatures[TRADEBOTS_NUMANSWERS+64],*svms; // svms is coeffs vector[TRADEBOTS_NUMANSWERS] + float RTpreds[TRADEBOTS_NUMANSWERS],svmpreds[TRADEBOTS_NUMANSWERS],answers[TRADEBOTS_NUMANSWERS]; +}; +struct tradebot_arbpair Arbpairs[TRADEBOTS_MAXPAIRS],*Pair_NXTBTC,*Pair_BTCUSD,*Pair_BTCCNY; +int32_t Tradebot_numarbpairs; + +struct tradebot_arbpair *tradebot_arbpair_find(char *base,char *rel) +{ + int32_t i; + for (i=0; irel,rel); + strcpy(pair->base,base); + if ( strcmp(base,"NXT") == 0 && strcmp(rel,"BTC") == 0 ) + Pair_NXTBTC = pair, printf("Pair_NXTBTC <- %p\n",pair); + else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"USD") == 0 ) + Pair_BTCUSD = pair; + else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"CNY") == 0 ) + Pair_BTCCNY = pair; + sprintf(fname,"SVM/rawfeatures/%s_%s",base,rel); + pair->fp = OS_appendfile(fname); + return(pair); + } else return(0); +} + +int32_t tradebots_calcrawfeatures(struct tradebot_arbpair *pair) +{ + int32_t starti,i,n = 0; double ave; uint32_t timestamp; + n = TRADEBOTS_NUMANSWERS; + memcpy(pair->prevrawfeatures,pair->rawfeatures,sizeof(pair->prevrawfeatures)); + memset(pair->rawfeatures,0,sizeof(pair->rawfeatures)); + if ( fabs(pair->highbid) < SMALLVAL || fabs(pair->lowask) < SMALLVAL ) + return(-1); + ave = _pairaved(pair->highbid,pair->lowask); + timestamp = (uint32_t)time(NULL); + n = TRADEBOTS_NUMANSWERS; + memcpy(&pair->rawfeatures[TRADEBOTS_NUMANSWERS],×tamp,sizeof(*pair->rawfeatures)), n++; + pair->rawfeatures[n++] = pair->highbid; + pair->rawfeatures[n++] = pair->lowask; + pair->rawfeatures[n++] = pair->hblavolume / ave; + n = TRADEBOTS_RAWFEATURESINCR + TRADEBOTS_NUMANSWERS; + for (i=0; ibidaves[i]) < SMALLVAL || fabs(pair->askaves[i]) < SMALLVAL ) + return(-1); + starti = n; + pair->rawfeatures[n++] = (pair->bidaves[i] / ave) - 1.; + pair->rawfeatures[n++] = (pair->askaves[i] / ave) - 1.; + pair->rawfeatures[n++] = 10000. * (pair->bidslopes[i] / ave); + pair->rawfeatures[n++] = 10000. * (pair->askslopes[i] / ave); + if ( n < starti+TRADEBOTS_RAWFEATURESINCR ) + n = starti+TRADEBOTS_RAWFEATURESINCR; + } + if ( pair->fp != 0 ) + { + if ( fwrite(pair->rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) != sizeof(pair->rawfeatures) ) + printf("fwrite error for %s/%s rawfeatures[%d]\n",pair->base,pair->rel,n); + else fflush(pair->fp); + } + if ( n > sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures) ) + { + printf("n.%d too many for rawfeatures %ld\n",n,sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)); + exit(-1); + } + return(n); +} + +uint32_t tradebots_featureset(double *highbidp,double *lowaskp,double *avep,double *volp,double *bidaves,double *askaves,double *bidslopes,double *askslopes,float *rawfeatures) +{ + uint32_t timestamp; int32_t i,n,starti; + memcpy(×tamp,&rawfeatures[TRADEBOTS_NUMANSWERS],sizeof(timestamp)); + n = TRADEBOTS_NUMANSWERS + 1; + *highbidp = rawfeatures[n++]; + *lowaskp = rawfeatures[n++]; + *avep = _pairaved(*highbidp,*lowaskp); + *volp = rawfeatures[n++]; + n = TRADEBOTS_RAWFEATURESINCR + TRADEBOTS_NUMANSWERS; + for (i=0; i= reftimestamp+60 ) + return(-1); + factor = sqrt(reftimestamp - timestamp); + if ( factor > 60. ) + factor = 60.; + else if ( factor < 1. ) + factor = 1.; + factor = 1. / factor; + if ( refhighbid == 0. || highbid == 0. || lowask == 0. || reflowask == 0. ) + return(-1); + svmfeatures[n++] = highbid; + svmfeatures[n++] = (highbid / ave) - 1.; + svmfeatures[n++] = lowask; + svmfeatures[n++] = (lowask / ave) - 1.; + svmfeatures[n++] = (lowask - highbid); + svmfeatures[n++] = (lowask - highbid) / ave; + svmfeatures[n++] = vol; + starti = n; + svmfeatures[n++] = refhighbid; + svmfeatures[n++] = (refhighbid / refave) - 1.; + svmfeatures[n++] = reflowask; + svmfeatures[n++] = (reflowask / refave) - 1.; + svmfeatures[n++] = (reflowask - refhighbid); + svmfeatures[n++] = (reflowask - refhighbid) / refave; + svmfeatures[n++] = refvol; + for (i=0; i SMALLVAL ) + { + for (i=starti; irawfeatures,sizeof(reftimestamp)); + if ( reftimestamp == 0 ) + return(-1); + numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,pair->rawfeatures,reftimestamp,pair->prevrawfeatures); + if ( pair->numsvmfeatures != (1+pair->numpairs)*n ) + { + for (i=0; inumpairs; i++) + { + flag = -1; + if ( (ptr= tradebot_arbpair_find(pair->svmpairs[i][0],pair->svmpairs[i][1])) != 0 ) + flag = tradebots_expandrawfeatures(&svmfeatures[n],ptr->rawfeatures,reftimestamp,pair->rawfeatures); + if ( flag < 0 ) + { + for (j=0; jnumsvmfeatures ) + { + printf("unexpected numsvmfeatures %d vs %d\n",n,pair->numsvmfeatures); + return(-1); + } + return(n); +} + +int32_t tradebots_calcpreds(float *RTpreds,struct tradebot_arbpair *pair,double *svmfeatures) +{ + int32_t i,j,n=0; double feature,preds[TRADEBOTS_NUMANSWERS]; + memset(preds,0,sizeof(preds)); + for (i=n=0; inumsvmfeatures; i++) + { + feature = svmfeatures[i]; + for (j=0; jsvms[n++]; + } + return(n); +} + +void tradebots_calcanswers(struct tradebot_arbpair *pair) +{ + double highbid,lowask,futurebid,futureask,ave,vol,bidaves[TRADEBOTS_NUMDECAYS],askaves[TRADEBOTS_NUMDECAYS],bidslopes[TRADEBOTS_NUMDECAYS],askslopes[TRADEBOTS_NUMDECAYS]; + float rawfeatures[sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)],futuremin,futuremax,minval,maxval,*hblas = 0; + uint32_t timestamp,firsttime = 0; long fpos,savepos; int32_t flag,i,iter,j,ind,maxi; + if ( pair->fp != 0 ) + { + for (iter=0; iter<2; iter++) + { + rewind(pair->fp); + fpos = 0; + while ( fread(rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) + { + savepos = ftell(pair->fp); + timestamp = tradebots_featureset(&highbid,&lowask,&ave,&vol,bidaves,askaves,bidslopes,askslopes,rawfeatures); + if ( firsttime == 0 ) + { + firsttime = timestamp; + maxi = (int32_t)((time(NULL) - firsttime) / 60 + 1); + hblas = calloc(maxi,sizeof(*hblas)*2); + } + if ( (i= (timestamp - firsttime)/60) >= 0 && i < maxi ) + { + if ( iter == 0 ) + { + _xblend(&hblas[i << 1],highbid,0.5); + _xblend(&hblas[(i << 1) + 1],lowask,0.5); + } + else + { + highbid = hblas[i << 1]; + lowask = hblas[(i << 1) + 1]; + if ( fabs(highbid) > SMALLVAL && fabs(lowask) > SMALLVAL ) + { + memset(pair->answers,0,sizeof(pair->answers)); + flag = 0; + for (j=0; j maxval ) + { + if ( futuremax < minval ) + printf("%s/%s A%d: highly volatile minmax.(%f %f) -> (%f %f) %d of %d\n",pair->base,pair->rel,j,minval,maxval,futuremin,futuremax,i,maxi); + else + { + pair->answers[j] = (futuremin - maxval); + flag++; + } + } + else if ( futuremax < minval ) + pair->answers[j] = (futuremax - minval), flag++; + } + if ( flag != 0 ) + { + fseek(pair->fp,fpos,SEEK_SET); + if ( fwrite(pair->answers,1,sizeof(pair->answers),pair->fp) != sizeof(pair->answers) ) + printf("error writing answers for %s/%s t%u i.%d of %d\n",pair->base,pair->rel,timestamp,i,maxi); + else + { + for (j=0; janswers[i]); + printf("%s/%s answers %d of %d\n",pair->base,pair->rel,i,maxi); + } + fseek(pair->fp,savepos,SEEK_SET); + } + } + } + } + fpos = ftell(pair->fp); + } + if ( iter == 0 ) + { + highbid = hblas[0]; + lowask = hblas[1]; + for (i=1; i SMALLVAL && fabs(hblas[(i << 1) + 1]) > SMALLVAL ) + { + highbid = hblas[i << 1]; + lowask = hblas[(i << 1) + 1]; + } + else + { + hblas[i << 1] = highbid; + hblas[(i << 1) + 1] = lowask; + } + } + } + } + if ( hblas != 0 ) + free(hblas); + } +} + +static char *assetids[][2] = +{ + { "12071612744977229797", "UNITY" }, + { "15344649963748848799", "DEX" }, + { "6883271355794806507", "PANGEA" }, + { "17911762572811467637", "JUMBLR" }, + { "17083334802666450484", "BET" }, + { "13476425053110940554", "CRYPTO" }, + { "6932037131189568014", "HODL" }, + { "3006420581923704757", "SHARK" }, + { "17571711292785902558", "BOTS" }, + { "10524562908394749924", "MGW" }, +}; + +uint64_t NXT_assetidfind(char *base) +{ + int32_t i; + for (i=0; iexchange[0] == 0 ) + strcpy(arb->exchange,exchange); + if ( strcmp(arb->exchange,exchange) == 0 ) + { + arb->price = price; + arb->volume = volume; + arb->timestamp = timestamp; + arb->profitmargin = profitmargin; + } else printf("mismatched arbexchange? (%s vs %s)\n",arb->exchange,exchange); +} + +struct tradebot_arbexchange *tradebot_arbexchange_find(struct tradebot_arbpair *pair,char *exchange) +{ + int32_t i; + for (i=0; inumexchanges; i++) + if ( strcmp(pair->exchanges[i].name,exchange) == 0 ) + return(&pair->exchanges[i]); + return(0); +} + +struct tradebot_arbexchange *tradebot_arbexchange_create(struct tradebot_arbpair *pair,char *exchange) +{ + if ( pair->numexchanges < sizeof(pair->exchanges)/sizeof(*pair->exchanges) ) + { + strcpy(pair->exchanges[pair->numexchanges].name,exchange); + return(&pair->exchanges[pair->numexchanges++]); + } else return(0); +} + +void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t tradedir,char *base,char *rel,double price,double volume,uint32_t timestamp,double profitmargin) +{ + int32_t i,offset,flag; double highbid,lowask,lastbid,lastask,arbval; + struct tradebot_arbentry *bid,*ask; struct tradebot_arbexchange *arbex; struct tradebot_arbpair *pair = 0; + if ( strcmp(rel,"BTC") != 0 && strcmp(rel,"NXT") != 0 && strcmp(rel,"USD") != 0 && strcmp(rel,"CNY") != 0 ) + { + printf("reject non-BTC arbcandidate (%s/%s)\n",base,rel); + return; + } + offset = (tradedir > 0) ? 0 : 1; + if ( (pair= tradebot_arbpair_find(base,rel)) == 0 ) + pair = tradebot_arbpair_create(base,rel); + if ( pair == 0 ) + { + printf("cant get pair for %s %s/%s\n",exchange,base,rel); + return; + } + if ( (arbex= tradebot_arbexchange_find(pair,exchange)) == 0 ) + arbex = tradebot_arbexchange_create(pair,exchange); + if ( arbex != 0 ) + { + //printf("cand.%d %16s %s %12.6f (%5s/%-5s) at %12.8f profit %.03f\n",pair->numexchanges,exchange,tradedir<0?"ask":"bid",volume,base,rel,price,profitmargin); + tradebot_arbentry(&arbex->trades[offset],exchange,price,volume,timestamp,profitmargin); + bid = ask = 0; + pair->highbid = pair->lowask = highbid = lowask = 0.; + //if ( pair->numexchanges >= 2 ) + { + for (i=0; inumexchanges; i++) + { + arbex = &pair->exchanges[i]; + if ( arbex->trades[0].price != 0. && (highbid == 0. || arbex->trades[0].price >= highbid) ) + { + bid = &arbex->trades[0]; + highbid = bid->price; + } + if ( arbex->trades[1].price != 0. && (lowask == 0. || arbex->trades[1].price <= lowask) ) + { + ask = &arbex->trades[1]; + lowask = ask->price; + } + //printf("%p %s %s %f %f -> %p %p %f %f (%f %f)\n",pair,pair->base,arbex->name,arbex->trades[0].price,arbex->trades[1].price,bid,ask,highbid,lowask,pair->highbid,pair->lowask); + } + flag = 0; + if ( Pair_NXTBTC != 0 && pair->btccounter != Pair_NXTBTC->counter ) + flag |= 1; + if ( Pair_BTCUSD != 0 && pair->usdcounter != Pair_BTCUSD->counter ) + flag |= 2; + if ( Pair_BTCCNY != 0 && pair->cnycounter != Pair_BTCCNY->counter ) + flag |= 4; + //printf("%s %s/%s flag.%d (%d %d) %p %p\n",exchange,base,rel,flag,pair->btccounter,Pair_NXTBTC!=0?Pair_NXTBTC->counter:-1,bid,ask); + if ( bid != 0 && ask != 0 && (fabs(bid->price - pair->highbid) > SMALLVAL || fabs(ask->price - pair->lowask) > SMALLVAL || (strcmp(pair->rel,"NXT") == 0 && flag != 0)) ) + { + pair->counter++; + pair->hblavolume = volume = MIN(bid->volume,ask->volume); + arbval = lastbid = lastask = 0.; + memset(pair->dirmasks,0,sizeof(pair->dirmasks)); + memset(pair->slopedirs,0,sizeof(pair->slopedirs)); + if ( strcmp(pair->rel,"NXT") == 0 ) + { + if ( Pair_NXTBTC != 0 && Pair_NXTBTC->highbid != 0. && Pair_NXTBTC->lowask != 0. ) + { + pair->btccounter = Pair_NXTBTC->counter; + pair->btcbid = highbid * Pair_NXTBTC->highbid; + pair->btcask = lowask * Pair_NXTBTC->lowask; + pair->btcvol = volume * _pairaved(pair->btcbid,pair->btcask); + } + } + else if ( strcmp(pair->rel,"BTC") == 0 ) + { + pair->btcbid = highbid; + pair->btcask = lowask; + pair->btcvol = volume; + } + if ( strcmp(pair->rel,"USD") == 0 ) + { + pair->usdbid = highbid; + pair->usdask = lowask; + pair->usdvol = volume; + } + if ( strcmp(pair->rel,"CNY") == 0 ) + { + pair->cnybid = highbid; + pair->cnyask = lowask; + pair->cnyvol = volume; + } + if ( pair->btcbid != 0. && pair->btcask != 0. ) + { + if ( strcmp(pair->rel,"USD") != 0 && Pair_BTCUSD != 0 && Pair_BTCUSD->highbid != 0. && Pair_BTCUSD->lowask != 0. ) + { + pair->usdcounter = Pair_BTCUSD->counter; + pair->usdbid = pair->btcbid * Pair_BTCUSD->highbid; + pair->usdask = pair->btcask * Pair_BTCUSD->lowask; + pair->usdvol = pair->btcvol * _pairaved(pair->usdbid,pair->usdask); + } + if ( strcmp(pair->rel,"CNY") != 0 && Pair_BTCCNY != 0 && Pair_BTCCNY->highbid != 0. && Pair_BTCCNY->lowask != 0. ) + { + pair->cnycounter = Pair_BTCCNY->counter; + pair->cnybid = pair->btcbid * Pair_BTCCNY->highbid; + pair->cnyask = pair->btcask * Pair_BTCCNY->lowask; + pair->cnyvol = pair->btcvol * _pairaved(pair->cnybid,pair->cnyask); + } + } + for (i=0; ibidslopes[i]= dxblend(&pair->bidaves[i],highbid,Tradebots_decays[i])) > 0. ) + pair->slopedirs[0] |= (1 << i); + if ( (pair->askslopes[i]= dxblend(&pair->askaves[i],lowask,Tradebots_decays[i])) > 0. ) + pair->slopedirs[1] |= (1 << i); + lastbid = pair->bidaves[i]; + lastask = pair->askaves[i]; + //printf("(%.8f %.8f) ",lastbid,lastask); + } + for (i=0; i lastbid ) + pair->dirmasks[0] |= (1 << i); + if ( lowask > lastask ) + pair->dirmasks[1] |= (1 << i); + } + else + { + if ( pair->bidaves[i-1] > lastbid ) + pair->dirmasks[0] |= (1 << i); + if ( pair->askaves[i-1] > lastask ) + pair->dirmasks[1] |= (1 << i); + } + } + printf("%12.6f %7s/%-3s %8s %14.8f %8s %14.8f spread %6.2f%% %02x:%02x %02x:%02x %d\n",volume,base,rel,bid->exchange,highbid,ask->exchange,lowask,100.*(lowask-highbid)/_pairaved(highbid,lowask),pair->dirmasks[0],pair->slopedirs[0],pair->dirmasks[1],pair->slopedirs[1],pair->counter); + //printf("BTC.(%.8f %.8f) %.8f %.8f USD.(%.4f %.4f) CNY.(%.3f %.3f)\n",pair->btcbid,pair->btcask,Pair_BTCUSD!=0?Pair_BTCUSD->highbid:0,Pair_BTCUSD!=0?Pair_BTCUSD->lowask:0,pair->usdbid,pair->usdask,pair->cnybid,pair->cnyask); + } + if ( highbid != 0 ) + pair->highbid = highbid; + if ( lowask != 0 ) + pair->lowask = lowask; + //printf(">>>>>>> %s (%s/%s) BTC %.8f %.8f v%f counter.%d btc.%d (%d)\n",exchange,pair->base,pair->rel,pair->btcbid,pair->btcask,pair->btcvol,pair->counter,pair->btccounter,Pair_NXTBTC!=0?Pair_NXTBTC->counter:-1); + if ( bid != 0 && ask != 0 && highbid > lowask && strcmp(bid->exchange,ask->exchange) != 0 && strcmp(rel,"BTC") == 0 ) + { + volume = MIN(bid->volume,ask->volume); + if ( volume*_pairaved(highbid,lowask) > 0.1 ) + volume = 0.1 / _pairaved(highbid,lowask); + if ( highbid * (1. - bid->profitmargin) > lowask * (1. + ask->profitmargin) ) + { + arbval = highbid * (1. - bid->profitmargin) - lowask * (1. + ask->profitmargin); + printf(">>>>>>>> FOUND ARB %s/%s highbid.%s %.8f lowask.%s %.8f volume %f (%.8f %.8f) %.4f%%\n",pair->base,pair->rel,bid->exchange,bid->price,ask->exchange,ask->price,volume,highbid,lowask,100.*(highbid-lowask)/_pairaved(highbid,lowask)); + InstantDEX_buy(myinfo,0,0,0,ask->exchange,pair->base,"BTC",ask->price,volume,1); + InstantDEX_sell(myinfo,0,0,0,bid->exchange,pair->base,"BTC",bid->price,volume,1); + printf("finished trades %s/%s volume %f\n",pair->base,pair->rel,volume); + } + } + if ( pair->counter > TRADEBOTS_NUMDECAYS ) + { + if ( pair->lasttime != time(NULL) ) + { + if ( (pair->numrawfeatures= tradebots_calcrawfeatures(pair)) > 0 ) + { + if ( pair->numsvmfeatures != 0 ) + { + if ( myinfo->svmfeatures == 0 ) + myinfo->svmfeatures = calloc(sizeof(*myinfo->svmfeatures),pair->numsvmfeatures); + if ( tradebots_calcsvmfeatures(myinfo->svmfeatures,pair) > 0 ) + tradebots_calcpreds(pair->RTpreds,pair,myinfo->svmfeatures); + } + } + pair->lasttime = (uint32_t)time(NULL); + } + if ( time(NULL) > pair->lastanswertime+3600 ) + { + tradebots_calcanswers(pair); + pair->lastanswertime = (uint32_t)time(NULL); + } + } + } + } +} + +void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) +{ + // update balance, compare to target balance, issue balancing trade via central exchanges, if needed + double price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; + srcamount = swap->I.req.srcamount; + destamount = swap->I.req.destamount; + profitmargin = (double)swap->I.req.profitmargin / 1000000.; + if ( srcamount <= SMALLVAL || destamount <= SMALLVAL ) + { + printf("illegal amount for balancing %f %f\n",srcamount,destamount); + return; + } + strcpy(rel,"BTC"); + if ( strcmp(swap->I.req.src,"BTC") == 0 ) + { + strcpy(base,swap->I.req.dest); + price = (srcamount / destamount); + volume = destamount / SATOSHIDEN; + dir = -1.; + } + else if ( strcmp(swap->I.req.dest,"BTC") == 0 ) + { + strcpy(base,swap->I.req.src); + price = (destamount / srcamount); + volume = srcamount / SATOSHIDEN; + dir = 1.; + } + else + { + printf("only BTC trades can be balanced, not (%s/%s)\n",swap->I.req.src,swap->I.req.dest); + return; + } + if ( iambob != 0 ) + { + if ( myinfo->IAMLP != 0 ) + { + printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); + if ( dir < 0. ) + InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + } + } + else + { + if ( myinfo->IAMLP != 0 ) + { + printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); + if ( dir > 0. ) + InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + } + } +} + +void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals) +{ + struct liquidity_info li,refli; int32_t i; char *exchange,*relstr,numstr[32]; + if ( (exchange= jstr(vals,"exchange")) == 0 ) + exchange = "DEX"; + else if ( strcmp(exchange,"*") == 0 ) + exchange = ""; + else if ( exchanges777_find(exchange) == 0 ) + { + printf("cant find exchange.(%s)\n",exchange); + return; + } + if ( (relstr= jstr(vals,"rel")) == 0 ) + relstr = "BTC"; + if ( base == 0 || base[0] == 0 ) + base = jstr(vals,"base"); + if ( base == 0 || base[0] == 0 ) + return; + memset(&li,0,sizeof(li)); + safecopy(li.base,base,sizeof(li.base)); + safecopy(li.rel,relstr,sizeof(li.rel)); + safecopy(li.exchange,exchange,sizeof(li.exchange)); + li.profit = jdouble(vals,"profit"); + li.refprice = jdouble(vals,"refprice"); + li.dir = jint(vals,"dir"); // positive -> buy, negative -> sell, 0 or missing -> both + // li.theoretical = ... dotproduct + // li.filter = ... + // li.trigger = ... + // PAX response + if ( strcmp("NXT",li.rel) == 0 ) + li.assetid = NXT_assetidfind(base); + else if ( strcmp("UNITY",base) == 0 ) + li.assetid = NXT_assetidfind(base); + if ( strcmp(li.base,"BTC") == 0 && strcmp("USD",li.rel) != 0 && strcmp("CNY",li.rel) != 0 ) + { + printf("unsupported base BTC (%s/%s)\n",li.base,li.rel); + return; + } + if ( strcmp(li.base,"BTC") != 0 && strcmp("BTC",li.rel) != 0 && + strcmp(li.base,"NXT") != 0 && strcmp("NXT",li.rel) != 0 && + strcmp(li.base,"USD") != 0 && strcmp("USD",li.rel) != 0 && + strcmp(li.base,"CNY") != 0 && strcmp("CNY",li.rel) != 0 && + strcmp(li.exchange,"DEX") != 0 ) // filter out most invalids + { + printf("unsupported base/rel %s/%s\n",li.base,li.rel); + return; + } + for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) + { + refli = myinfo->linfos[i]; + /*if ( strcmp(li.rel,refli.base) == 0 && strcmp(li.base,refli.rel) == 0 ) + { + li = refli; + strcpy(li.base,refli.base); + strcpy(li.rel,refli.rel); + if ( fabs(li.refprice) > SMALLVAL ) + li.refprice = (1. / li.refprice); + else li.refprice = 0.; + li.dir = -li.dir; + printf("Set rev linfo[%d] (%s/%s) %.6f %.8f\n",i,li.base,li.rel,li.profit,li.refprice); + myinfo->linfos[i] = li; + return; + } + else*/ if ( refli.base[0] == 0 || (strcmp(li.base,refli.base) == 0 && strcmp(li.rel,refli.rel) == 0 && strcmp(li.exchange,refli.exchange) == 0) ) + { + if ( refli.base[0] == 0 && li.exchange[0] != 0 && strcmp(li.exchange,"DEX") != 0 ) + { + if ( strcmp("NXT",li.rel) == 0 && li.assetid != 0 ) + { + sprintf(numstr,"%llu",(long long)li.assetid); + printf("monitor %s %s\n",li.rel,numstr); + tradebot_monitor(myinfo,0,0,0,li.exchange,numstr,li.rel,0.); + } else tradebot_monitor(myinfo,0,0,0,li.exchange,li.base,li.rel,0.); + } + myinfo->linfos[i] = li; + printf("Set linfo[%d] %s (%s/%s) %.6f %.8f\n",i,li.exchange,li.base,li.rel,li.profit,li.refprice); + return; + } + } + printf("ERROR: too many linfos %d\n",i); +} + +int32_t _default_volume_ok(struct supernet_info *myinfo,struct liquidity_info *li,int32_t dir,double volume) +{ + // check order exposure + // check cumulative exposure + return(0); +} + +double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep,char *exchange,char *base,char *rel,double volume) +{ + int32_t i,dir; struct liquidity_info refli; + *refpricep = 0.; + //printf("%s %s/%s\n",exchange,base,rel); + for (i=sizeof(myinfo->linfos)/sizeof(*myinfo->linfos)-1; i>=0; i--) + { + refli = myinfo->linfos[i]; + if ( refli.base[0] == 0 ) + continue; + if ( strcmp(base,refli.base) == 0 && strcmp(rel,refli.rel) == 0 ) + dir = 1; + else if ( strcmp(rel,refli.base) == 0 && strcmp(base,refli.rel) == 0 ) + dir = -1; + else dir = 0; + if ( exchange[0] != 0 && refli.exchange[0] != 0 && strcmp(exchange,refli.exchange) != 0 ) + { + //printf("continue %s %s/%s [%d] dir.%d refli.dir %d vs %s %s/%s\n",exchange,base,rel,i,dir,refli.dir,refli.exchange,refli.base,refli.rel); + continue; + } + //printf(">>>>>>>> %s %s/%s [%d] dir.%d refli.dir %d vs %s/%s\n",exchange,base,rel,i,dir,refli.dir,refli.base,refli.rel); + if ( dir != 0 && dir * refli.dir <= 0 ) + { + if ( _default_volume_ok(myinfo,&refli,dir,volume) == 0 ) + { + *refpricep = refli.refprice; + return(refli.profit); + } else break; + } + } + return(0.); +} + +void tradebot_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) +{ + if ( swap->balancingtrade == 0 ) + _default_swap_balancingtrade(myinfo,swap,iambob); + else (*swap->balancingtrade)(myinfo,swap,iambob); +} + +void tradebot_liquidity_command(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals) +{ + // processed in LIFO manner which allows to override existing command + if ( myinfo->liquidity_command == 0 ) + _default_liquidity_command(myinfo,base,hash,vals); + else (*myinfo->liquidity_command)(myinfo,base,hash,vals); +} + +double tradebot_liquidity_active(struct supernet_info *myinfo,double *refpricep,char *exchange,char *base,char *rel,double destvolume) +{ + if ( myinfo->liquidity_active == 0 ) + return(_default_liquidity_active(myinfo,refpricep,exchange,base,rel,destvolume)); + else return((*myinfo->liquidity_active)(myinfo,refpricep,exchange,base,rel,destvolume)); +} + +// struct exchange_quote { uint64_t satoshis,orderid,offerNXT,exchangebits; double price,volume; uint32_t timestamp,val; }; + +void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t numbids,int32_t numasks) +{ + double price,profitmargin,volume; struct tradebot_arbpair *pair; + if ( strcmp(rel,"NXT") == 0 && strcmp(base,"BTC") != 0 && (base= NXT_assetnamefind(base)) == 0 ) + { + //printf("reject %s %s/%s\n",exchange,base,rel); + return; + } + else if ( strcmp(base,"NXT") == 0 && strcmp(rel,"BTC") != 0 && (rel= NXT_assetnamefind(rel)) == 0 ) + { + //printf("reject %s %s/%s\n",exchange,base,rel); + return; + } + //printf("%s %s/%s bids.%d asks.%d\n",exchange->name,base,rel,numbids,numasks); + if ( numbids > 0 && (volume= bidasks[0].volume) > 0. && (profitmargin= + tradebot_liquidity_active(myinfo,&price,exchange->name,base,rel,volume)) > 0. ) + { + if ( price == 0. ) + price = bidasks[0].price; + tradebot_arbcandidate(myinfo,exchange->name,1,base,rel,price,volume,(uint32_t)time(NULL),profitmargin); + } + if ( numasks > 0 && (volume= bidasks[1].volume) > 0. && (profitmargin= + tradebot_liquidity_active(myinfo,&price,exchange->name,rel,base,volume)) > 0. ) + { + if ( price == 0. ) + price = bidasks[1].price; + tradebot_arbcandidate(myinfo,exchange->name,-1,base,rel,price,volume,(uint32_t)time(NULL),profitmargin); + } + if ( (pair= tradebot_arbpair_find(base,rel)) == 0 ) + pair = tradebot_arbpair_create(base,rel); + if ( pair != 0 ) + { + if ( strcmp(rel,"NXT") == 0 ) + { + if ( pair->btcbid != 0. && pair->btcask != 0. ) + { + tradebot_arbcandidate(myinfo,"arb",1,base,"BTC",pair->btcbid,pair->btcvol,(uint32_t)time(NULL),profitmargin); + tradebot_arbcandidate(myinfo,"arb",-1,base,"BTC",pair->btcask,pair->btcvol,(uint32_t)time(NULL),profitmargin); + } + } + if ( strcmp(rel,"USD") != 0 && pair->usdbid != 0. && pair->usdask != 0. ) + { + tradebot_arbcandidate(myinfo,"arb",1,base,"USD",pair->usdbid,pair->usdvol,(uint32_t)time(NULL),profitmargin); + tradebot_arbcandidate(myinfo,"arb",-1,base,"USD",pair->usdask,pair->usdvol,(uint32_t)time(NULL),profitmargin); + } + if ( strcmp(rel,"CNY") != 0 && pair->cnybid != 0. && pair->cnyask != 0. ) + { + tradebot_arbcandidate(myinfo,"arb",1,base,"CNY",pair->cnybid,pair->cnyvol,(uint32_t)time(NULL),profitmargin); + tradebot_arbcandidate(myinfo,"arb",-1,base,"CNY",pair->cnyask,pair->cnyvol,(uint32_t)time(NULL),profitmargin); + } + } +} diff --git a/crypto777/OS_portable.c b/crypto777/OS_portable.c index ff16d4a65..c06dfb545 100755 --- a/crypto777/OS_portable.c +++ b/crypto777/OS_portable.c @@ -94,6 +94,17 @@ char *OS_portable_path(char *str) #endif } +FILE *OS_appendfile(char *origfname) +{ + char fname[1024]; FILE *fp; + strcpy(fname,origfname); + OS_portable_path(fname); + if ( (fp= fopen(fname,"rb+")) == 0 ) + fp = fopen(fname,"wb"); + else fseek(fp,0,SEEK_END); + return(fp); +} + int32_t OS_portable_renamefile(char *fname,char *newfname) { #ifdef _WIN32 diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index f0d61365e..68a59b0a7 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -219,6 +219,7 @@ uint32_t OS_conv_datenum(int32_t datenum,int32_t hour,int32_t minute,int32_t sec int32_t OS_conv_unixtime(struct tai *t,int32_t *secondsp,time_t timestamp); char *OS_compatible_path(char *str); +FILE *OS_appendfile(char *origfname); int32_t OS_compare_files(char *fname,char *fname2); int64_t OS_copyfile(char *src,char *dest,int32_t cmpflag); diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index ed69962c6..5960a16c0 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -155,6 +155,7 @@ try_again: curl_easy_setopt(curl_handle,CURLOPT_WRITEDATA, &s); // we pass our 's' struct to the callback curl_easy_setopt(curl_handle,CURLOPT_NOSIGNAL, 1L); // supposed to fix "Alarm clock" and long jump crash curl_easy_setopt(curl_handle,CURLOPT_NOPROGRESS, 1L); // no progress callback + //curl_easy_setopt(curl_handle,CURLOPT_TIMEOUT, 60L); if ( strncmp(url,"https",5) == 0 ) { curl_easy_setopt(curl_handle,CURLOPT_SSL_VERIFYPEER,0); diff --git a/crypto777/hmac_sha512.c b/crypto777/hmac_sha512.c index 68c428189..e1fe4e523 100755 --- a/crypto777/hmac_sha512.c +++ b/crypto777/hmac_sha512.c @@ -506,7 +506,7 @@ char *hmac_sha512_str(char *dest,char *key,int32_t key_size,char *message) hmac_memory(&sha512_desc,(void *)key,key_size,(void *)message,strlen(message),checkbuf,&size); init_hexbytes_noT(dest,mac,SHA512_DIGEST_SIZE); init_hexbytes_noT(dest2,checkbuf,SHA512_DIGEST_SIZE); - //if ( memcmp(checkbuf,mac,SHA512_DIGEST_SIZE) != 0 ) + if ( memcmp(checkbuf,mac,SHA512_DIGEST_SIZE) != 0 ) printf("hmac_512 : %s vs %s\n",dest,dest2); return(dest); } diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index 700cd73cc..aa532d699 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -193,6 +193,14 @@ void calc_OP_HASH160(char hexstr[41],uint8_t rmd160[20],char *pubkey) init_hexbytes_noT(hexstr,rmd160,20); } +double _xblend(float *destp,double val,double decay) +{ + double oldval; + if ( (oldval = *destp) != 0. ) + return((oldval * decay) + ((1. - decay) * val)); + else return(val); +} + double _dxblend(double *destp,double val,double decay) { double oldval; diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 653e633c2..2b3b8b23b 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -558,7 +558,7 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct dpow_info *dp,struc void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,int32_t myind,int32_t src_or_dest,int8_t bestk,uint64_t bestmask,uint8_t pubkeys[64][33],int32_t numratified) { - bits256 txid,srchash,zero,signedtxid; struct iguana_info *coin; int32_t j,len,numsigs; char *retstr=0,str[65],str2[65]; uint8_t txdata[32768]; uint32_t channel; + bits256 txid,srchash,zero,signedtxid; struct iguana_info *coin; int32_t j,len,numsigs; char *retstr=0,str[65],str2[65]; uint8_t txdata[32768]; uint32_t channel,state; coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; memset(zero.bytes,0,sizeof(zero)); channel = (src_or_dest != 0) ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL; @@ -586,9 +586,13 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo decode_hex(txdata+32,len,bp->signedtx); for (j=0; jhashmsg,(src_or_dest != 0) ? DPOW_BTCTXIDCHANNEL : DPOW_TXIDCHANNEL,bp->height,txdata,len+32); - bp->state = src_or_dest != 0 ? 1000 : 0xffffffff; - printf("complete statemachine.%s ht.%d state.%d (%x %x)\n",coin->symbol,bp->height,bp->state,bp->hashmsg.uints[0],txid.uints[0]); + state = src_or_dest != 0 ? 1000 : 0xffffffff; + if ( bp->state < state ) + { + bp->state = state; + dpow_send(myinfo,dp,bp,txid,bp->hashmsg,(src_or_dest != 0) ? DPOW_BTCTXIDCHANNEL : DPOW_TXIDCHANNEL,bp->height,txdata,len+32); + printf("complete statemachine.%s ht.%d state.%d (%x %x)\n",coin->symbol,bp->height,bp->state,bp->hashmsg.uints[0],txid.uints[0]); + } } else printf("sendtxid mismatch got %s instead of %s\n",bits256_str(str,txid),bits256_str(str2,signedtxid)); } free(retstr); diff --git a/iguana/exchanges/bittrex.c b/iguana/exchanges/bittrex.c index f032b764b..4e1ee5c63 100755 --- a/iguana/exchanges/bittrex.c +++ b/iguana/exchanges/bittrex.c @@ -77,7 +77,7 @@ double UPDATE(struct exchange_info *exchange,char *base,char *rel,struct exchang { cJSON *json,*obj; char *jsonstr,market[128],url[1024]; double hbla = 0.; sprintf(market,"%s-%s",rel,base); - sprintf(url,"https://bittrex.com/api/v1.1/public/getorderbook?market=%s&type=both&depth=%d",market,maxdepth); + sprintf(url,"http://bittrex.com/api/v1.1/public/getorderbook?market=%s&type=both&depth=%d",market,maxdepth); jsonstr = issue_curl(url); if ( jsonstr != 0 ) { @@ -166,8 +166,11 @@ uint64_t TRADE(int32_t dotrade,char **retstrp,struct exchange_info *exchange,cha return(0); } sprintf(payload,"https://bittrex.com/api/v1.1/market/%slimit?apikey=%s&nonce=%llu&market=%s&rate=%.8f&quantity=%.8f",dir>0?"buy":"sell",exchange->apikey,(long long)exchange_nonce(exchange),pairstr,price,volume); - if ( CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume,argjson) == 0 && (json= SIGNPOST(&exchange->cHandle,dotrade,retstrp,exchange,payload,payload)) != 0 ) + if ( //CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume,argjson) == 0 && + (json= SIGNPOST(&exchange->cHandle,dotrade,retstrp,exchange,payload,payload)) != 0 ) { + if ( *retstrp != 0 ) + printf("SIGNPOST returned.(%s) %s\n",*retstrp,jprint(json,0)); if ( is_cJSON_True(cJSON_GetObjectItem(json,"success")) != 0 && (resultobj= cJSON_GetObjectItem(json,"result")) != 0 ) { copy_cJSON(&uuidstr,cJSON_GetObjectItem(resultobj,"uuid")); diff --git a/iguana/exchanges/poloniex.c b/iguana/exchanges/poloniex.c index 0e4061d99..037db3715 100755 --- a/iguana/exchanges/poloniex.c +++ b/iguana/exchanges/poloniex.c @@ -166,10 +166,11 @@ uint64_t TRADE(int32_t dotrade,char **retstrp,struct exchange_info *exchange,cha typestr = (dir > 0) ? "marginBuy":"marginSell"; else typestr = (dir > 0) ? "buy":"sell"; sprintf(payload,"command=%s&nonce=%lld¤cyPair=%s&rate=%.8f&amount=%.8f",typestr,(long long)nonce,pairstr,price,volume); - if ( CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume,argjson) == 0 && (json= SIGNPOST(&exchange->cHandle,dotrade,retstrp,exchange,EXCHANGE_AUTHURL,payload)) != 0 ) + if ( //CHECKBALANCE(retstrp,dotrade,exchange,dir,base,rel,price,volume,argjson) == 0 && + (json= SIGNPOST(&exchange->cHandle,dotrade,retstrp,exchange,EXCHANGE_AUTHURL,payload)) != 0 ) { txid = (get_API_nxt64bits(cJSON_GetObjectItem(json,"orderNumber")) << 32) | get_API_nxt64bits(cJSON_GetObjectItem(json,"tradeID")); - printf("poloniex.%llu (%s)\n",(long long)txid,jprint(json,0)); + printf("poloniex.%llu (%s) %s\n",(long long)txid,jprint(json,0),*retstrp!=0?*retstrp:""); free_json(json); } return(txid); diff --git a/iguana/exchanges777.h b/iguana/exchanges777.h index b1b632660..2d1ba66a7 100755 --- a/iguana/exchanges777.h +++ b/iguana/exchanges777.h @@ -46,7 +46,7 @@ #define EXCHANGES777_MINPOLLGAP 1 #define EXCHANGES777_MAXDEPTH 200 -#define EXCHANGES777_DEFAULT_TIMEOUT 30 +#define EXCHANGES777_DEFAULT_TIMEOUT 60 typedef void CURL; struct exchange_info; struct exchange_quote; @@ -179,7 +179,7 @@ char *exchanges777_Qtrade(struct exchange_info *exchange,char *base,char *rel,in struct exchange_request *exchanges777_baserelfind(struct exchange_info *exchange,char *base,char *rel,int32_t func); struct exchange_info *exchanges777_find(char *exchangestr); -void prices777_processprice(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth); +void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t numbids,int32_t numasks); double truefx_price(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert); double fxcm_price(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 52d136d2f..d5a8e6f32 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -84,7 +84,7 @@ struct supernet_address char NXTADDR[32],BTC[64],BTCD[64]; }; -struct liquidity_info { char base[64],rel[64]; double profit,refprice; }; +struct liquidity_info { char base[16],rel[16],exchange[16]; uint64_t assetid; double profit,refprice; int dir; }; struct message_info { int32_t msgcount; bits256 refhash,msghashes[64]; uint32_t timestamps[64]; }; struct supernet_info @@ -94,6 +94,8 @@ struct supernet_info uint8_t persistent_pubkey33[33]; char ipaddr[64],NXTAPIURL[512],secret[4096],password[4096],rpcsymbol[64],handle[1024],permanentfile[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); int32_t maxdelay,IAMRELAY,IAMNOTARY,IAMLP,publicRPC,basilisk_busy,genesisresults,remoteorigin; uint32_t expiration,dirty,DEXactive,DEXpoll,totalcoins,nanoinit,dexcrcs[1024]; uint16_t argport,rpcport; @@ -124,6 +126,7 @@ struct supernet_info bits256 pangea_category,instantdex_category; uint8_t logs[256],exps[510]; struct message_info msgids[8192]; + double *svmfeatures; }; #include "../includes/iguana_funcs.h" diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 306d72315..d6f7409cd 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -184,11 +184,6 @@ double instantdex_avehbla(struct supernet_info *myinfo,double retvals[4],char *_ else return(0); } -void prices777_processprice(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth) -{ - -} - cJSON *exchanges777_allpairs(char *baserels[][2],int32_t num) { int32_t i; char str[32]; cJSON *json,*item,*array = cJSON_CreateArray(); @@ -339,11 +334,11 @@ double exchange_setquote(struct exchange_quote *bidasks,int32_t *numbidsp,int32_ } if ( commission != 0. ) { - //printf("price %f fee %f -> ",price,prices->commission * price); + printf("price %f fee %f -> ",price,commission * price); if ( bidask == 0 ) price -= commission * price; else price += commission * price; - //printf("%f\n",price); + printf("%f\n",price); } quote = (bidask == 0) ? &bidasks[(*numbidsp)<<1] : &bidasks[((*numasksp)<<1) + 1]; quote->price = price, quote->volume = volume, quote->timestamp = timestamp, quote->orderid = orderid, quote->offerNXT = offerNXT; @@ -400,6 +395,7 @@ void exchanges777_json_quotes(struct exchange_info *exchange,double commission,c if ( strcmp(exchange->name,"kraken") == 0 ) timestamp = juint(jitem(item,2),0); else orderid = j64bits(jitem(item,2),0); + //printf("{%s} (%.8f %.8f) %f\n",jprint(item,0),price,volume,commission); } else { @@ -456,7 +452,7 @@ double exchanges777_standardprices(struct exchange_info *exchange,double commiss if ( (jsonstr= issue_curl(url)) != 0 ) { //if ( strcmp(exchangestr,"btc38") == 0 ) - //printf("(%s) -> (%s)\n",url,jsonstr); + //printf("%f (%s) -> (%s)\n",commission,url,jsonstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { hbla = exchanges777_json_orderbook(exchange,commission,base,rel,quotes,maxdepth,json,field,"bids","asks",price,volume,invert); @@ -859,7 +855,7 @@ void exchanges777_loop(void *ptr) if ( req->bidasks[(i << 1) + 1].price > SMALLVAL ) req->numasks++; //printf("%-10s %s/%s numbids.%d numasks.%d\n",exchange->name,req->base,req->rel,req->numbids,req->numasks); - prices777_processprice(exchange,req->base,req->rel,req->bidasks,req->depth); + tradebots_processprices(myinfo,exchange,req->base,req->rel,req->bidasks,req->numbids,req->numasks); } queue_enqueue("pricesQ",&exchange->pricesQ,&req->DL); } @@ -954,7 +950,7 @@ char *exchanges777_Qprices(struct exchange_info *exchange,char *base,char *rel,i } if ( base[0] == 0 || rel[0] == 0 || (polarity= (*exchange->issue.supports)(exchange,base,rel,argjson)) == 0 ) { - //printf("%s invalid (%s) or (%s)\n",exchange->name,base,rel); + printf("%s invalid (%s) or (%s)\n",exchange->name,base,rel); return(clonestr("{\"error\":\"invalid base or rel\"}")); } if ( depth <= 0 ) @@ -977,7 +973,7 @@ char *exchanges777_Qprices(struct exchange_info *exchange,char *base,char *rel,i req->commission = exchange->commission; if ( monitor == 0 ) { - printf("%s submit (%s) (%s)\n",exchange->name,base,rel); + //printf("%s submit (%s) (%s)\n",exchange->name,base,rel); return(exchanges777_submit(exchange,req,'Q',maxseconds)); } else diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 03cf58c38..ae4cffadb 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -71,9 +71,9 @@ void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t he else { freq = 1; - minsigs = 7;//(komodo_notaries(dp->symbol,pubkeys,height) >> 1) + 1; + //minsigs = 7;//(komodo_notaries(dp->symbol,pubkeys,height) >> 1) + 1; //if ( minsigs < DPOW_MINSIGS ) - // minsigs = DPOW_MINSIGS; + minsigs = DPOW_MINSIGS; } printf("%s/%s src ht.%d dest.%u nonz.%d %s minsigs.%d\n",dp->symbol,dp->dest,checkpoint.blockhash.height,dp->destupdated,bits256_nonz(checkpoint.blockhash.hash),bits256_str(str,dp->last.blockhash.hash),minsigs); dpow_fifoupdate(myinfo,dp->srcfifo,dp->last); diff --git a/iguana/main.c b/iguana/main.c index fbbdf2a63..15fe34b9f 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -676,6 +676,8 @@ void iguana_ensuredirs() sprintf(dirname,"%s/ECB",GLOBAL_DBDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/BTC",GLOBAL_VALIDATEDIR), OS_ensure_directory(dirname); sprintf(dirname,"%s/BTCD",GLOBAL_VALIDATEDIR), OS_ensure_directory(dirname); + sprintf(dirname,"SVM"), OS_ensure_directory(dirname); + sprintf(dirname,"SVM/rawfeatures"), OS_ensure_directory(dirname); } void iguana_Qinit() @@ -1619,9 +1621,10 @@ void iguana_main(void *arg) portable_mutex_init(&myinfo->dpowmutex); portable_mutex_init(&myinfo->notarymutex); #if LIQUIDITY_PROVIDER + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("nxtae"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bitcoin"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("poloniex"),0); - //myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); + myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("bittrex"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("btc38"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("huobi"),0); myinfo->tradingexchanges[myinfo->numexchanges++] = exchange_create(clonestr("coinbase"),0); diff --git a/iguana/tests/arbinit b/iguana/tests/arbinit new file mode 100755 index 000000000..428ea64d6 --- /dev/null +++ b/iguana/tests/arbinit @@ -0,0 +1,64 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTCD\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTCD\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"CLOAK\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"CLOAK\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SYS\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SYS\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"GAME\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"GAME\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XMR\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XMR\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ETH\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ETH\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ETC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ETC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"DASH\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"DASH\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ZEC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"ZEC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"FCT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"FCT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"STRAT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"STRAT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"DGD\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"DGD\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NAV\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NAV\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"LTC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"LTC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SDC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SDC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"STEEM\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"STEEM\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SBD\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SBD\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XRP\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XRP\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"LSK\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"LSK\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NXT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NXT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MAID\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MAID\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BLK\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BLK\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"POT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"POT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XEM\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"XEM\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"VRC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"VRC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"VTC\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"VTC\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTS\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTS\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NAUT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NAUT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"AUR\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"AUR\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"REP\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"REP\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"AMP\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"AMP\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" diff --git a/iguana/tests/arbnxt b/iguana/tests/arbnxt new file mode 100755 index 000000000..e63056d60 --- /dev/null +++ b/iguana/tests/arbnxt @@ -0,0 +1,26 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NXT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NXT\",\"vals\":{\"profit\":0.004,\"exchange\":\"bittrex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"UNITY\",\"vals\":{\"profit\":0.01,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"UNITY\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"DEX\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"PANGEA\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"JUMBLR\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BET\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"CRYPTO\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"HODL\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"SHARK\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BOTS\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MGW\",\"vals\":{\"rel\":\"NXT\",\"profit\":0.01,\"exchange\":\"nxtae\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"NXT\",\"vals\":{\"profit\":0.004,\"exchange\":\"poloniex\"}}" + +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"poloniex\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"coinbase\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"lakebtc\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"quadriga\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"btcd\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"USD\",\"profit\":0.004,\"exchange\":\"bitstamp\"}}" + +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"CNY\",\"profit\":0.004,\"exchange\":\"huobi\"}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"BTC\",\"vals\":{\"rel\":\"CNY\",\"profit\":0.004,\"exchange\":\"btc38\"}}" diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index a90ca45b8..5ed16af94 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -134,6 +134,7 @@ double PoW_from_compact(uint32_t nBits,uint8_t unitval); void calc_rmd160(char *hexstr,uint8_t buf[20],uint8_t *msg,int32_t len); void calc_OP_HASH160(char *hexstr,uint8_t hash160[20],char *msg); double dxblend(double *destp,double val,double decay); +double _xblend(float *destp,double val,double decay); // json int32_t iguana_processjsonQ(struct iguana_info *coin); // reentrant, can be called during any idletime From 8e9c5091abe208bbfccd6a5968d5eb01ba335f50 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 17:34:51 +0200 Subject: [PATCH 312/432] test --- basilisk/basilisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 7ab92ec0a..be45a7fbd 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -14,7 +14,7 @@ ******************************************************************************/ #include "../iguana/iguana777.h" -#include "exchanges777.h" +#include "../iguana/exchanges777.h" typedef char *basilisk_servicefunc(struct supernet_info *myinfo,char *CMD,void *addr,char *remoteaddr,uint32_t basilisktag,cJSON *valsobj,uint8_t *data,int32_t datalen,bits256 hash,int32_t from_basilisk); From 3ff174d9c96dacb2112616fecb6566cd1d9b4d07 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 17:36:56 +0200 Subject: [PATCH 313/432] test --- iguana/m_LP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/m_LP b/iguana/m_LP index fdd45659b..28ac1ba98 100755 --- a/iguana/m_LP +++ b/iguana/m_LP @@ -6,4 +6,4 @@ cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm +gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.so -lcurl -lssl -lcrypto -lpthread -lz -lm From 2010fa2cbc254f6993819187203dd8bd687869b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 17:49:54 +0200 Subject: [PATCH 314/432] test --- basilisk/tradebots_liquidity.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 28b551f61..4ecc5ba92 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -287,11 +287,15 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) { savepos = ftell(pair->fp); timestamp = tradebots_featureset(&highbid,&lowask,&ave,&vol,bidaves,askaves,bidslopes,askslopes,rawfeatures); + printf("timestamp.%u firsttime.%u\n",timestamp,firsttime); + if ( timestamp == 0 ) + continue; if ( firsttime == 0 ) { firsttime = timestamp; maxi = (int32_t)((time(NULL) - firsttime) / 60 + 1); hblas = calloc(maxi,sizeof(*hblas)*2); + printf("HBLAS[%d] allocated\n",maxi); } if ( (i= (timestamp - firsttime)/60) >= 0 && i < maxi ) { @@ -373,6 +377,8 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) if ( hblas != 0 ) free(hblas); } + if ( pair->fp != 0 && (ftell(pair->fp) % sizeof(pair->rawfeatures)) != 0 ) + printf("ERROR: %s/%s not on feature boundary\n",pair->base,pair->rel); } static char *assetids[][2] = From b53aabf8d45d955547d3bd4c90c4bcdf2cc61aa1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 18:07:55 +0200 Subject: [PATCH 315/432] test --- basilisk/tradebots_liquidity.c | 54 +++++++++++++++++++++------------- iguana/tests/arbinit | 11 +++++++ iguana/tests/arbnxt | 10 ------- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 4ecc5ba92..f732296c6 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -69,27 +69,6 @@ struct tradebot_arbpair *tradebot_arbpair_find(char *base,char *rel) return(0); } -struct tradebot_arbpair *tradebot_arbpair_create(char *base,char *rel) -{ - struct tradebot_arbpair *pair; char fname[1024]; - if ( Tradebot_numarbpairs < sizeof(Arbpairs)/sizeof(*Arbpairs) ) - { - printf("new pair.%d (%s/%s)\n",Tradebot_numarbpairs,base,rel); - pair = &Arbpairs[Tradebot_numarbpairs++]; - strcpy(pair->rel,rel); - strcpy(pair->base,base); - if ( strcmp(base,"NXT") == 0 && strcmp(rel,"BTC") == 0 ) - Pair_NXTBTC = pair, printf("Pair_NXTBTC <- %p\n",pair); - else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"USD") == 0 ) - Pair_BTCUSD = pair; - else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"CNY") == 0 ) - Pair_BTCCNY = pair; - sprintf(fname,"SVM/rawfeatures/%s_%s",base,rel); - pair->fp = OS_appendfile(fname); - return(pair); - } else return(0); -} - int32_t tradebots_calcrawfeatures(struct tradebot_arbpair *pair) { int32_t starti,i,n = 0; double ave; uint32_t timestamp; @@ -155,6 +134,37 @@ uint32_t tradebots_featureset(double *highbidp,double *lowaskp,double *avep,doub return(timestamp); } +struct tradebot_arbpair *tradebot_arbpair_create(char *base,char *rel) +{ + struct tradebot_arbpair *pair; char fname[1024]; double ave; + if ( Tradebot_numarbpairs < sizeof(Arbpairs)/sizeof(*Arbpairs) ) + { + printf("new pair.%d (%s/%s)\n",Tradebot_numarbpairs,base,rel); + pair = &Arbpairs[Tradebot_numarbpairs++]; + strcpy(pair->rel,rel); + strcpy(pair->base,base); + if ( strcmp(base,"NXT") == 0 && strcmp(rel,"BTC") == 0 ) + Pair_NXTBTC = pair, printf("Pair_NXTBTC <- %p\n",pair); + else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"USD") == 0 ) + Pair_BTCUSD = pair; + else if ( strcmp(base,"BTC") == 0 && strcmp(rel,"CNY") == 0 ) + Pair_BTCCNY = pair; + sprintf(fname,"SVM/rawfeatures/%s_%s",base,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))); + } + 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) ) + { + pair->lasttime = tradebots_featureset(&pair->highbid,&pair->lowask,&ave,&pair->hblavolume,pair->bidaves,pair->askaves,pair->bidslopes,pair->askslopes,pair->rawfeatures); + printf("%s/%s [%.8f %.8f] %u\n",pair->base,pair->rel,pair->highbid,pair->lowask,pair->lasttime); + } + return(pair); + } else return(0); +} + int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint32_t reftimestamp,float *refrawfeatures) { double factor,highbid,lowask,ave,vol,bidaves[TRADEBOTS_NUMDECAYS],askaves[TRADEBOTS_NUMDECAYS],bidslopes[TRADEBOTS_NUMDECAYS],askslopes[TRADEBOTS_NUMDECAYS]; @@ -357,6 +367,8 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) } if ( iter == 0 ) { + if ( hblas == 0 ) + break; highbid = hblas[0]; lowask = hblas[1]; for (i=1; i Date: Thu, 5 Jan 2017 23:12:05 +0200 Subject: [PATCH 316/432] test --- basilisk/basilisk.c | 2 +- basilisk/basilisk.h | 2 +- basilisk/basilisk_CMD.c | 2 +- basilisk/basilisk_DEX.c | 2 +- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_bitcoin.c | 2 +- basilisk/basilisk_ping.c | 2 +- basilisk/basilisk_swap.c | 2 +- basilisk/basilisk_tradebot.c | 2 +- basilisk/tradebots_SVM.h | 1271 ++++++++++++++++++++++++++ basilisk/tradebots_liquidity.c | 132 ++- crypto777/OS_nonportable.c | 2 +- crypto777/OS_portable.c | 2 +- crypto777/OS_portable.h | 2 +- crypto777/OS_time.c | 2 +- crypto777/SaM.c | 2 +- crypto777/bitcoind_RPC.c | 2 +- crypto777/cJSON.c | 2 +- crypto777/curve25519.c | 2 +- crypto777/iguana_OS.c | 2 +- crypto777/iguana_serdes.c | 2 +- crypto777/iguana_utils.c | 2 +- crypto777/ramcoder.c | 2 +- datachain/datachain.c | 2 +- deprecated/iguana_instantdex.c | 2 +- gecko/gecko.c | 2 +- iguana/SuperNET_keys.c | 2 +- iguana/dPoW.h | 2 +- iguana/dpow/dpow_fsm.c | 2 +- iguana/dpow/dpow_network.c | 2 +- iguana/dpow/dpow_prices.c | 2 +- iguana/dpow/dpow_rpc.c | 2 +- iguana/dpow/dpow_tx.c | 2 +- iguana/exchanges/bitcoin.c | 2 +- iguana/exchanges/bitcoin.h | 2 +- iguana/exchanges/bitfinex.c | 2 +- iguana/exchanges/bitstamp.c | 2 +- iguana/exchanges/bittrex.c | 2 +- iguana/exchanges/btc38.c | 2 +- iguana/exchanges/btce.c | 2 +- iguana/exchanges/coinbase.c | 2 +- iguana/exchanges/exchange_supports.h | 2 +- iguana/exchanges/exchange_undefs.h | 2 +- iguana/exchanges/fxcm.c | 2 +- iguana/exchanges/huobi.c | 2 +- iguana/exchanges/instaforex.c | 2 +- iguana/exchanges/jumblr.c | 2 +- iguana/exchanges/lakebtc.c | 2 +- iguana/exchanges/nxtae.c | 2 +- iguana/exchanges/okcoin.c | 2 +- iguana/exchanges/poloniex.c | 2 +- iguana/exchanges/quadriga.c | 2 +- iguana/exchanges/truefx.c | 2 +- iguana/exchanges/unconf.c | 2 +- iguana/exchanges777.h | 2 +- iguana/iguana777.c | 2 +- iguana/iguana777.h | 2 +- iguana/iguana_accept.c | 2 +- iguana/iguana_bitmap.c | 2 +- iguana/iguana_blocks.c | 2 +- iguana/iguana_bundles.c | 2 +- iguana/iguana_chains.c | 2 +- iguana/iguana_exchanges.c | 2 +- iguana/iguana_init.c | 2 +- iguana/iguana_interpreter.c | 2 +- iguana/iguana_json.c | 2 +- iguana/iguana_mofn.c | 2 +- iguana/iguana_msg.c | 2 +- iguana/iguana_notary.c | 2 +- iguana/iguana_payments.c | 2 +- iguana/iguana_peers.c | 2 +- iguana/iguana_ramchain.c | 2 +- iguana/iguana_realtime.c | 2 +- iguana/iguana_recv.c | 2 +- iguana/iguana_rpc.c | 2 +- iguana/iguana_scripts.c | 2 +- iguana/iguana_secp.c | 2 +- iguana/iguana_sign.c | 2 +- iguana/iguana_spendvectors.c | 2 +- iguana/iguana_tradebots.c | 2 +- iguana/iguana_tx.c | 2 +- iguana/iguana_txidfind.c | 2 +- iguana/iguana_unspents.c | 2 +- iguana/iguana_volatiles.c | 2 +- iguana/iguana_wallet.c | 2 +- iguana/main.c | 2 +- iguana/ramchain_api.c | 2 +- includes/iguana_apideclares.h | 3 +- includes/iguana_defines.h | 2 +- includes/iguana_funcs.h | 2 +- includes/iguana_globals.h | 2 +- includes/iguana_structs.h | 2 +- includes/iguana_types.h | 2 +- 93 files changed, 1467 insertions(+), 119 deletions(-) create mode 100755 basilisk/tradebots_SVM.h diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index be45a7fbd..e1b99e81e 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 68da72a3c..d90679ecd 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_CMD.c b/basilisk/basilisk_CMD.c index 858786d3c..5696addc9 100755 --- a/basilisk/basilisk_CMD.c +++ b/basilisk/basilisk_CMD.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_DEX.c b/basilisk/basilisk_DEX.c index badaee894..b47ac7c72 100755 --- a/basilisk/basilisk_DEX.c +++ b/basilisk/basilisk_DEX.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index e47c2d461..76e019031 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 014fc121e..4e5ff17cc 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_ping.c b/basilisk/basilisk_ping.c index c02e805f2..f5e6c30c7 100755 --- a/basilisk/basilisk_ping.c +++ b/basilisk/basilisk_ping.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index 2e55bc46a..b340b81ac 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/basilisk_tradebot.c b/basilisk/basilisk_tradebot.c index 23290c8d4..19e4401c2 100755 --- a/basilisk/basilisk_tradebot.c +++ b/basilisk/basilisk_tradebot.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h new file mode 100755 index 000000000..0171fcce8 --- /dev/null +++ b/basilisk/tradebots_SVM.h @@ -0,0 +1,1271 @@ +/****************************************************************************** + * 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. * + * * + ******************************************************************************/ + +/* + requires *vals and *vars to be initialized + external calls: OS_milliseconds(), get_jfp_features(), get_yval(), set_ocas_model(), update_ocas_preds(), ocasCL_glue() + */ +//#include + +typedef float svmtype; +typedef double double2 __attribute__((ext_vector_type(2))); +#define MAX_VECTORS (1440 * 365 * 5) +#define MAIN_MAXCORES 16 +#define c_to_refc(c) (c) +#define refc_to_c(refc) (refc) + +#define CONDITION(feature) (feature) +#define FEATURE_THRESHOLD 10. +#define HWMPERC_THRESHOLD 101 +#define HWMPERC_THRESHOLD0 HWMPERC_THRESHOLD + +#ifdef INSIDE_OPENCL +#pragma OPENCL EXTENSION cl_khr_fp64: enable +#define local_barrier() barrier(CLK_LOCAL_MEM_FENCE) +#define global_barrier() barrier(CLK_GLOBAL_MEM_FENCE) +#else +//double get_features(register struct ocas_ptrs *PTRS,register int c,register int weekind,register int numfeatures,register double *features,register double *model,register double *addptr,register struct baserel_info *BR,register double wt); +svmtype *get_jfp_features(register int selector,register int numfeatures,register int c,register int weekind); + +#endif + +#define OCAS_INFINITY (-log(0.0)) +#define OCAS_NEGINFINITY (log(0.0)) +#define OCAS_DECAY .1 +#define OCAS_BIAS 1. +#define OCAS_INDEX(ROW,COL,NUM_ROWS) ((COL)*(NUM_ROWS)+(ROW)) +#define QPSOLVER_MAXITER 1000000 +#define QPSOLVER_MINITER (QPSOLVER_MAXITER * .1) +//#define NUM_CUDA_GROUPS 14 +//#define NUM_BUNDLE_ANSWERS 64 +//#define NUM_TOPCOEFFIS 558 +//#define SMALLVAL .00000000000001 +//#define NUM_PRIMARY_FEATURES 4096 +#ifdef __APPLE__ +#define MAX_OCAS_LHS 512 +#else +#define MAX_OCAS_LHS 2000 +#endif +#define MAX_OCAS_FEATURES (1024 * 1024) + +struct ptrhdr { long allocsize; void *ptr; int devid; char str[64]; }; + +struct ocas_lhsbuffers +{ + double H[MAX_OCAS_LHS * MAX_OCAS_LHS]; + double alpha[MAX_OCAS_LHS],b[MAX_OCAS_LHS],diag_H[MAX_OCAS_LHS],A0[MAX_OCAS_LHS],d[MAX_OCAS_LHS]; + double full_A[]; +}; + +struct ocas_CLtmpspace +{ + double2 hpfb[MAX_VECTORS]; + int poslist[MAX_VECTORS],neglist[MAX_VECTORS]; +}; + +struct ocas_CLbuffers +{ + double output_pred[MAX_VECTORS],old_output[MAX_VECTORS]; + double W[MAX_OCAS_FEATURES+4],oldW[MAX_OCAS_FEATURES+4],new_a[MAX_OCAS_FEATURES+4]; +}; + +struct ocas_vars +{ + struct ptrhdr pH[256]; + double Q_P[TRADEBOTS_NUMANSWERS],Q_D[TRADEBOTS_NUMANSWERS]; + double netcuts[TRADEBOTS_NUMANSWERS],perc[TRADEBOTS_NUMANSWERS],hwmperc[TRADEBOTS_NUMANSWERS],lastmetrics[TRADEBOTS_NUMANSWERS][2]; + double learningrates[TRADEBOTS_NUMANSWERS][2],maxiters[TRADEBOTS_NUMANSWERS],dot_prod_WoldW[TRADEBOTS_NUMANSWERS],cutsum[TRADEBOTS_NUMANSWERS]; + double sq_norm_oldW[TRADEBOTS_NUMANSWERS],oldW0[TRADEBOTS_NUMANSWERS],W0[TRADEBOTS_NUMANSWERS],sq_norm_W[TRADEBOTS_NUMANSWERS]; + double predabs[TRADEBOTS_NUMANSWERS],predsum[TRADEBOTS_NUMANSWERS],dist[TRADEBOTS_NUMANSWERS]; + double xi[TRADEBOTS_NUMANSWERS],pratio[TRADEBOTS_NUMANSWERS],errperc[TRADEBOTS_NUMANSWERS],hwmdist[TRADEBOTS_NUMANSWERS]; + double answerabsaves[TRADEBOTS_NUMANSWERS],answeraves[TRADEBOTS_NUMANSWERS]; + int answercounts,firstweekinds[TRADEBOTS_NUMANSWERS]; + int posA[TRADEBOTS_NUMANSWERS],negA[TRADEBOTS_NUMANSWERS]; + int numIt[TRADEBOTS_NUMANSWERS],numlhs[TRADEBOTS_NUMANSWERS],nNZAlpha[TRADEBOTS_NUMANSWERS],trn_err[TRADEBOTS_NUMANSWERS]; + int qp_exitflag[TRADEBOTS_NUMANSWERS],exitflag[TRADEBOTS_NUMANSWERS],len[TRADEBOTS_NUMANSWERS]; + int have_pendingmodel[TRADEBOTS_NUMANSWERS],cutlen[TRADEBOTS_NUMANSWERS],good[TRADEBOTS_NUMANSWERS],bad[TRADEBOTS_NUMANSWERS]; + int nohwm[TRADEBOTS_NUMANSWERS],numposcuts[TRADEBOTS_NUMANSWERS],numnegcuts[TRADEBOTS_NUMANSWERS]; + struct ocas_CLbuffers *CLspaces[TRADEBOTS_NUMANSWERS]; + struct ocas_lhsbuffers *lhs[TRADEBOTS_NUMANSWERS]; + int *weekinds[TRADEBOTS_NUMANSWERS]; + float *answers,**features; + //unsigned long CLallocsize,tmpallocsize,tmpCLallocsize; + double C,TolRel,TolAbs,MaxTime,QPBound,QPSolverTolAbs,QPSolverTolRel; + double output_time,sort_time,add_time,w_time,qp_solver_time,ocas_time; // total time spent in svm_ocas_solver + int selector,numthreads,starti,modelind,c,refc,maxlen,numfeatures,firstweekind,startweekind,endweekind,numptrs,maxlhs; +}; + +/////////////////////////// Most of runtime is in the add/dot functions +#ifdef INSIDE_OPENCL +typedef double svmtype; + +// numCLthreads: NUM_CUDA_CORES, numgroups: (numdocs + NUM_CUDA_CORES-1)/NUM_CUDA_CORES +__kernel void dot_featuresCL(__local void *lp,__global double *preds,int numfeatures,__global double *W,double W0,__global svmtype *matrix,int numdocs) +{ + register int i,j,docid; + register double sum; + register __global svmtype *features; + if ( (docid = (int)get_global_id(0)) < numdocs ) + { + sum = 0.; + features = &matrix[docid * numfeatures]; + for (i=0; i>= 1; + if ( docid < numdocs ) + { + features = &matrix[docid * numfeatures]; + if ( dir == 0 ) + sum += CONDITION(features[j]); + else sum -= CONDITION(features[j]); + } + } + new_a[j] = sum; + } +} + +#else + +void ocas_purge(struct ocas_vars *vars) +{ + int32_t i; + free(vars->answers); + for (i=0; imaxlen; i++) + if ( vars->features[i] != 0 ) + free(vars->features[i]); + free(vars->features); + for (i=0; iCLspaces[i] != 0 ) + free(vars->CLspaces[i]); + if ( vars->lhs[i] != 0 ) + free(vars->lhs[i]); + if ( vars->weekinds[i] != 0 ) + free(vars->weekinds[i]); + } + free(vars); +} + +/*static inline double dot_expanded_features(register double *W,register int c,register int selector,register int numfeatures) + { + fatal("dot_expanded_features not implemented"); + return(0); + } + + static inline void add_expanded_features(register double *W,register double y,register int c,register int selector,register int numfeatures) + { + fatal("add_expanded_features not implemented"); + }*/ + +static inline double calc_ocas_output(register struct ocas_vars *vars,register int selector,register int c,register int weekind,register int answerind,register double *W,register double W0,register int numfeatures) +{ + register svmtype *features; + register double feature,y,sum = 0.; + register int coeffi; + if ( (y= vars->answers[(weekind-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) + { + if ( (features= vars->features[weekind-vars->starti]) != 0 )//get_jfp_features(vars->selector,numfeatures,c,weekind)) != 0 ) + { +#ifdef OCAS_USE_TOPCOEFFIS + for (int i=0; iselector,numfeatures); + sum = y * (W0 + sum); + } + // printf("%f ",sum); + return(sum); +} + +static inline void add_ocas_output(register double y,register struct ocas_vars *vars,register int selector,register int c,register int weekind,register int answerind,register double *W,register double *new_a,register int numfeatures) +{ + register int coeffi; + register svmtype *features,feature; + if ( y != 0 ) + { + if ( (features= vars->features[weekind-vars->starti]) != 0 )//get_jfp_features(vars->selector,numfeatures,c,weekind)) != 0 ) + { + //features = get_jfp_features(vars->selector,numfeatures,c,weekind); +#ifdef OCAS_USE_TOPCOEFFIS + int32_t i; + for (i=0; iselector,numfeatures); + } +} + +static inline void STocas_calc_outputs(register struct ocas_vars *vars,register int c,register int answerind,register double *output,register double *old_output,register double *W,register double W0,register int numfeatures,register int *weekinds,register int numdocs) +{ + register int i,j; + //printf("start STocas_calc_outputs.(%p %s.A%d %p) %p %p %p\n",vars,CONTRACTS[c],answerind,weekinds,output,old_output,W); + for (i=0; iselector,c,weekinds[i],answerind,W,W0,numfeatures); + if ( 1 && isnan(output[i]) != 0 ) + { + svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,c,weekinds[i]); + for (j=0; jc; + memset(new_a,0,sizeof(*new_a) * numfeatures); + //printf("STocas_add_newcuts numcuts.%d numfeatures.%d\n",numcuts,numfeatures); + for (i=0; i>= 1; + add_ocas_output(dir==0?1:-1,vars,vars->selector,c,weekind,answerind,W,new_a,numfeatures); + } +} +//////////////////////////// end of add/dot functions +static inline double _dbufave(register double *buf,register int len) +{ + register int i,n; + register double sum; + sum = 0.; + n = 0; + for (i=0; i 0.0000000001 ) + { + n++; + sum += buf[i]; + } + } + if ( n != 0 ) + sum /= n; + if ( fabs(sum) <= 0.0000000001 ) + sum = 0.; + return(sum); +} + +static inline void add_newcut_entry(register struct ocas_vars *vars,register int answerind,register int *new_cut,register int i,register int weekind,register double y) +{ + weekind <<= 1; + if ( y > 0 ) vars->numposcuts[answerind]++; + else if ( y < 0 ) vars->numnegcuts[answerind]++, weekind |= 1; + new_cut[vars->cutlen[answerind]++] = weekind; +} + +static inline double validate_ocas_model(register struct ocas_vars *vars,register int answerind,register double *output_pred,register double *old_output,register int *weekinds,register int numdocs,register double *W,register double W0,register int numfeatures,register int paranoid) +{ + register svmtype *features; + register double y,pred,perc,answer=0.,feature; + register int i,j,pos,neg,good,bad,oldcuts,training_errors,weekind,nonz,posA,negA; + for (i=pos=neg=good=bad=oldcuts=training_errors=posA=negA=0; ianswers[(weekind-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0. ) + { + if ( y > 0 ) posA++; + else if ( y < 0 ) negA++; + if ( paranoid != 0 ) + { + pred = 0.; + if ( (features= vars->features[weekind-vars->starti]) != 0 )//get_jfp_features(vars->selector,numfeatures,vars->c,weekind)) != 0 ) + { + for (j=nonz=0; j SMALLVAL ) + pred += W0; + } + else pred = 0;//dot_expanded_features(W,c,selector,numfeatures); + if ( output_pred[i] != 0 && fabs(pred - output_pred[i]) > .000001 ) + // if ( (rand() % 10000) == 0 ) + printf("i.%d A %9.6f pred %9.6f != output_pred %9.6f [%14.10f]\n",i,answer,pred,output_pred[i],pred-output_pred[i]); + } + else pred = output_pred[i], nonz = numfeatures; + if ( nonz != 0 ) + { + if ( pred > 0 ) pos++; + else if ( pred < 0 ) neg++; + if ( pred*y > 0 ) good++; + else if ( pred*y < 0 ) bad++; + } + if ( old_output[i] <= 1. ) + { + oldcuts++; + if ( old_output[i] <= 0. ) + training_errors++; + } + } + } + nonz = 0; + for (i=0; i>>>>> %d.A%02d.(+%-6d -%-6d oc.%-6d | good.%-6d bad.%-6d >>>>> %6.2f%% <<<<<).%-6d | W0 %9.6f W[%d] %9.6f | A +%-6d -%-6d | paranoid.%d numdocs.%d\n",c_to_refc(vars->c),answerind,pos,neg,oldcuts,good,bad,perc,training_errors,W0,nonz,_dbufave(W,numfeatures),posA,negA,paranoid,numdocs); + return(perc); +} + +static int _increasing_double(const void *a,const void *b) +{ +#define double_a (*(double *)a) +#define double_b (*(double *)b) + if ( double_b > double_a ) + return(-1); + else if ( double_b < double_a ) + return(1); + return(0); +#undef double_a +#undef double_b +} + +static inline void calc_ocas_strategy(register struct ocas_vars *vars,register int answerind,register double C,register int numfeatures,register int len,register int *weekinds,register int *new_cut,register double *W,register double *oldW,register double *output,register double *old_output,register double2 *hpfb) +{ + double answermag; + register int i,j,num_hp,good,bad,zero; + register double Bval,Cval,newoutput,W0,oldW0,sq_norm_W,A0val,B0,dist,GradVal,t,t1,t2,t_new,val,GradVal_new,y,starttime,*preds = output; + num_hp = 0; + W0 = vars->W0[answerind]; oldW0 = vars->oldW0[answerind]; + A0val = vars->sq_norm_W[answerind] - (2. * vars->dot_prod_WoldW[answerind]) + vars->sq_norm_oldW[answerind]; + B0 = (vars->dot_prod_WoldW[answerind] - vars->sq_norm_oldW[answerind]); + GradVal = B0; + for (i=0; ianswers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) + { + if ( 0 ) + { + double oldsum=oldW0,sum=W0; + svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,vars->c,weekinds[i]); + for (j=0; j .000001 ) + { + printf("A%d numIt.%d docid.%-6d sum %11.7f * y%2.0f %11.7f != %11.7f output [%11.7f] W0 %11.7f oldW0 %11.7f\n",answerind,vars->numIt[answerind],i,sum,y,sum*y,output[i],output[i]-sum*y,W0,oldW0); + //output[i] = sum*y; + } + if ( fabs(oldsum*y - old_output[i]) > .000001 ) + { + if ( old_output[i] != 0 && oldW0 != 0 && (rand() % 1000) == 0 ) + printf("A%d numIt.%d docid.%-6d oldsum %11.7f * y%2.0f %11.7f != %11.7f oldoutput [%11.7f] W0 %11.7f oldW0 %11.7f\n",answerind,vars->numIt[answerind],i,oldsum,y,oldsum*y,old_output[i],old_output[i]-oldsum*y,W0,oldW0); + old_output[i] = oldsum*y; + } + } + Cval = C * (1. - old_output[i]); + Bval = C * (old_output[i] - output[i]); + if ( Bval != 0 ) + val = -(Cval / Bval); + else val = OCAS_NEG_INF; + if ( val > 0 ) + { + hpfb[num_hp].y = Bval; + hpfb[num_hp].x = val; + num_hp++; + } + if ( (Bval < 0 && val > 0) || (Bval > 0 && val <= 0) ) + GradVal += Bval; + } + } + //printf("num_hp.%d\n",num_hp); + t = 0; + if ( GradVal < 0 ) + { + starttime = OS_milliseconds(); + qsort(hpfb,num_hp,sizeof(double2),_increasing_double); + //ocas_sort(hpfb,num_hp); + i = 0; + while ( GradVal < 0 && i < num_hp ) + { + t_new = hpfb[i].x; + GradVal_new = GradVal + fabs(hpfb[i].y) + A0val*(t_new - t); + if ( GradVal_new >= 0 ) + t = t + GradVal * (t - t_new) / (GradVal_new - GradVal); + else t = t_new, i++; + GradVal = GradVal_new; + } + vars->sort_time += OS_milliseconds() - starttime; + } + t = MAX(t,0.); // just sanity check; t < 0 should not occur + t1 = t; // new (best so far) W + t2 = t + OCAS_DECAY*(1. - t); // new cutting plane + W0 = oldW0 * (1. - t) + (t * W0); + sq_norm_W = W0 * W0; + for (j=0; jW0[answerind] = W0; vars->sq_norm_W[answerind] = sq_norm_W; + vars->trn_err[answerind] = 0; dist = 0.; + for (i=good=bad=zero=0; ianswers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) + { + answermag = fabs(y); // 1.; + if ( (old_output[i] * (1. - t2) + t2*output[i]) <= answermag ) //1. + add_newcut_entry(vars,answerind,new_cut,i,weekinds[i],y); + newoutput = (old_output[i] * (1. - t1)) + (t1 * output[i]); + if ( 0 ) // won't match unless old_output corresponds with features*oldW + { + double sum=W0; + svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,vars->c,weekinds[i]); + for (j=0; j .0000001 ) + printf("numIt.%d docid.%-6d w%-6d sum %11.7f * y%2.0f %11.7f != %11.7f newoutput [%11.7f] W0 %11.7f oldW0 %11.7f\n",vars->numIt[answerind],i,weekinds[i],sum,y,sum*y,newoutput,newoutput-sum*y,W0,oldW0); + newoutput = sum*y; + } + if ( newoutput <= answermag ) + { + vars->xi[answerind] += (answermag - newoutput); + if ( newoutput <= 0. ) + vars->trn_err[answerind]++; + } + preds[i] = y * newoutput; + dist += fabs(preds[i] - y); + old_output[i] = newoutput; + if ( newoutput > 0. ) good++; + else bad++; + } else zero++;//,printf("i.%d -> w%d | zeroes.%d good.%d bad.%d of len.%d\n",i,weekinds[i],zero,good,bad,len); + } + //printf("finished strategy\n"); + vars->good[answerind] = good; vars->bad[answerind] = bad; vars->dist[answerind] = dist / MAX(1,good+bad); + vars->perc[answerind] = (100. * (double)vars->good[answerind]) / MAX(1,good+bad); + if ( vars->perc[answerind] > vars->hwmperc[answerind] || (vars->perc[answerind] == vars->hwmperc[answerind] && (vars->hwmdist[answerind] == 0 || vars->dist[answerind] < vars->hwmdist[answerind])) ) + { + double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer); + vars->W0[answerind] = set_ocas_model(vars->refc,answerind,vars->CLspaces[answerind]->W,vars->W0[answerind],vars->numfeatures,vars->firstweekind,vars->len[answerind],vars->trn_err[answerind],vars->dist[answerind],vars->predabs[answerind],vars->posA[answerind],vars->negA[answerind],vars->answerabsaves[answerind],0.); + vars->nohwm[answerind] = 0; + vars->hwmperc[answerind] = vars->perc[answerind]; vars->hwmdist[answerind] = vars->dist[answerind]; + } + else vars->nohwm[answerind]++; + //printf("good.%d bad.%d zero.%d errors.%d | selector.%d\n",good,bad,zero,vars->trn_err[answerind],vars->selector); +} + +static inline double ocas_splx_solver(register int *nonzalphap,register int maxlhs,register double *d,register double *activeH,register double *diag_H,register double *f,register double C,register double *alpha,register int n,register int MaxIter,register double TolAbs,register double TolRel,register double QP_TH) +{ + register double *col_u,*col_v; + register double QP,QD,lastQD,tmp,diff,distA,distB,etaA,etaB,improv,tmp_num,delta,x_neq0,xval,dval,diagval,tmp_den,tau; + register int u=0,v=0,i,j,iter,nonzalpha,unlikely = 0; + QP = distA = distB = OCAS_PLUS_INF; lastQD = QD = OCAS_NEG_INF; + x_neq0 = C; + etaA = etaB = 0.; + for (i=0; i 0. ) + { + col_u = &activeH[maxlhs * i]; + for (j=0; j 10*(MaxIter-iter) && etaB > 10*(MaxIter-iter) ) + unlikely++; + else unlikely = 0; + } else unlikely = 0; + diff = (QP - QD); + if ( 0 && (diff <= fabs(QP)*TolRel || diff <= TolAbs || QP <= QP_TH || unlikely > 100) ) + { + if ( 0 ) + { + if ( diff <= fabs(QP)*TolRel ) + printf("caseA %f | ",diff - fabs(QP)*TolRel); + else if ( diff <= TolAbs ) + printf("caseB %f | ",diff - TolAbs); + else if ( etaA > 2*(MaxIter-iter) && etaB > 2*(MaxIter-iter) ) + printf("caseC etas %f %f | ",etaA,etaB); + printf("%d: QP %f QD %f diff %f n.%d d0 %9.6f dA %9.6f %9.6f dB %9.6f %9.6f\n",iter,QP,QD,QP-QD,n,d[0],distA,etaA,distB,etaB); + } + break; + } + distA = (diff - fabs(QP)*TolRel); + distB = (diff - TolAbs); + lastQD = QD; + if ( d[u] > 0 ) + u = -1; + else delta -= C * d[u]; + // if satisfied then k-th block of variables needs update + if ( delta > TolAbs && delta > (TolRel * fabs(QP)) ) + { + // for fixed u select v = argmax_{i in I_k} Improvement(i) + improv = OCAS_NEG_INF; + for (i=0; i<=n; i++) + { + if ( i == u || (xval = ((i 0 ) + { + tmp_num = xval * dval; + if ( tmp_num < tmp_den ) + tmp = tmp_num*tmp_num / tmp_den; + else tmp = tmp_num - .5 * tmp_den; + if ( 0 && i < n ) // jimbo tweak + { + tmp = alpha[i] * MIN(1.,tmp_num/tmp_den); + alpha[i] -= tmp; + if ( u == -1 ) + x_neq0 += tmp; + else alpha[u] += tmp; + } + if ( tmp > improv ) + { + improv = tmp; + tau = MIN(1.,tmp_num/tmp_den); + v = i; + } + } + } + // update d = H*x + f + if ( v < n ) + { + tau *= alpha[v]; + alpha[v] -= tau; + if ( u != -1 ) + { + alpha[u] += tau; + col_v = &activeH[maxlhs * v]; + for (i=0; isq_norm_oldW[answerind] = vars->sq_norm_W[answerind]; + oldW0 = vars->oldW0[answerind] = vars->W0[answerind]; + W0 = 0.; + for (i=0; ialpha[i]) > 0 ) + { + //printf("%9.6f ",alpha); + for (j=0; jfull_A[OCAS_INDEX(j,i,numfeatures)]; + W0 += lhs->A0[i] * alpha; + } + } + vars->W0[answerind] = W0; + sq_norm_W = W0 * W0; + dot_prod_WoldW = W0 * oldW0; + for (j=0; jalpha,numlhs),W0,sq_norm_W,answerind); + vars->dot_prod_WoldW[answerind] = dot_prod_WoldW; + vars->sq_norm_W[answerind] = sq_norm_W; +} + +static inline void ocas_update_Lspace(register struct ocas_vars *vars,register int answerind,register double netcuts,register double cut_length,register int numfeatures,register double C,register double QPSolverTolAbs,register double QPSolverTolRel) +{ + register struct ocas_CLbuffers *ptr = vars->CLspaces[answerind]; + register struct ocas_lhsbuffers *lhs = vars->lhs[answerind]; + register double *new_col_H; + register double sq_norm_a,maxiters,metric,tmp; + register int i,j,iters,numlhs,maxlhs = vars->maxlhs; + numlhs = vars->numlhs[answerind]; + new_col_H = &lhs->H[OCAS_INDEX(0,numlhs,maxlhs)]; + lhs->A0[numlhs] = netcuts; + lhs->b[numlhs] = -cut_length; + sq_norm_a = lhs->A0[numlhs] * lhs->A0[numlhs]; + for (j=0; jfull_A[OCAS_INDEX(j,numlhs,numfeatures)] = ptr->new_a[j]; + if ( fabs(ptr->new_a[j]) > 1000 ) + { + //printf("(%d %9.6f %f) ",j,ptr->new_a[j],sq_norm_a); + ptr->new_a[j] = 0.; + } + else + sq_norm_a += ptr->new_a[j] * ptr->new_a[j]; + ptr->oldW[j] = ptr->W[j]; ptr->W[j] = 0.; + } + new_col_H[numlhs] = sq_norm_a; + //printf("QPsolver.A%02d: ABS %f Rel %.11f numlhs.%d cutlen.%f netcuts.%f sq_norm_a %f netcuts.%f\n",answerind,QPSolverTolAbs,QPSolverTolRel,vars->numlhs[answerind],cut_length,lhs->A0[numlhs],sq_norm_a,netcuts); + for (i=0; iA0[numlhs] * lhs->A0[i]; + for (j=0; jnew_a[j] * lhs->full_A[OCAS_INDEX(j,i,numfeatures)]; + new_col_H[i] = tmp; + } + lhs->d[numlhs] = lhs->alpha[numlhs] = 0.; + lhs->diag_H[numlhs] = lhs->H[OCAS_INDEX(numlhs,numlhs,maxlhs)]; + for (i=0; i H[OCAS_INDEX(numlhs,i,maxlhs)] = lhs->H[OCAS_INDEX(i,numlhs,maxlhs)]; + numlhs = ++vars->numlhs[answerind]; + iters = vars->numIt[answerind]; + if ( vars->nohwm[answerind] > 3 ) + vars->maxiters[answerind] *= 1 + sqrt(vars->nohwm[answerind])/100; + else if ( vars->nohwm[answerind] == 0 ) + vars->maxiters[answerind] *= .5; + if ( vars->maxiters[answerind] > QPSOLVER_MAXITER ) + vars->maxiters[answerind] = QPSOLVER_MAXITER; + if ( vars->maxiters[answerind] < QPSOLVER_MINITER ) + vars->maxiters[answerind] = QPSOLVER_MINITER; + maxiters = MAX(QPSOLVER_MINITER,vars->maxiters[answerind]); + vars->Q_D[answerind] = ocas_splx_solver(&vars->nNZAlpha[answerind],maxlhs,lhs->d,lhs->H,lhs->diag_H,lhs->b,C,lhs->alpha,vars->numlhs[answerind],MIN(maxiters,QPSOLVER_MAXITER),QPSolverTolAbs,QPSolverTolRel,OCAS_NEG_INF); + metric = ((double)vars->len[answerind] / MAX(1,vars->trn_err[answerind])) / 1.; + vars->lastmetrics[answerind][iters & 1] = metric; + update_ocas_model(ptr->W,ptr->oldW,vars,numfeatures,answerind,lhs,numlhs); +} + +/*static inline int calc_thread_startendis(register int *startip,register int threadid,register int numthreads,register int n) +{ + register double incr; + incr = ((double)n / numthreads); + *startip = threadid * incr; + if ( threadid == numthreads-1 ) + return(n-1); + else return(((threadid+1) * incr) - 1); +} + +static inline int count_Numpending() +{ + int i,n=0; + for (i=0; inumdevs == 0 || numthreads == MAIN_MAXCORES ) + { + endi = calc_thread_startendis(&starti,threadid,numthreads,cutlen); + //printf("inside addnewcutglue.t%d\n",threadid); + for (i=starti; i<=endi; i++) + { + weekind = new_cut[i]; + dir = (weekind & 1); + weekind >>= 1; + add_ocas_output(dir==0?1.:-1.,vars,selector,c,weekind,answerind,W,private_newA,numfeatures); + } + //printf("end inside addnewcutglue.t%d\n",threadid); + } + else + { +#ifdef INSIDE_OPENCL + register void *krn; + int numgroups,docid,n,devid,localbufsize = sizeof(double); + devid = threadid; + printf("devid.%d %p %p %p A%02d t%d of %d: start.%d w%d to end.%d w%d\n",devid,PTRS->new_aCL[devid],PTRS->new_cutCL[devid],PTRS->featuresCL[devid],answerind,threadid,numthreads,starti,new_cut[starti],endi,new_cut[endi]); + for (i=n=0; i>= 1; + if ( (docid= PTRS->CLweekinds_map[devid][weekind]) >= 0 ) + { + if ( docid >= PTRS->numdocsCL[devid] ) + fatal("fatal docid >= PTRS->numdocsCL[devid]"); + //printf("i.%d weekind.%d n.%d docid.%d [%d]\n",i,weekind,n,docid,new_cut[i]&1); + PTRS->new_cutCL[devid][n++] = (docid<<1) | dir; + } + } + if ( n != 0 ) + { + _clmsync(devid,devcontext(devid),devid&1,PTRS->new_cutCL[devid],0,sizeof(int) * n,CL_MEM_DEVICE|CL_EVENT_WAIT|CL_EVENT_RELEASE); + krn = PTRS->krns[devid][1]; + clarg_set_local(krn,0,localbufsize); + clarg_set_global(krn,1,PTRS->new_aCL[devid]); + clarg_set(krn,2,numfeatures); + clarg_set_global(krn,3,PTRS->new_cutCL[devid]); + clarg_set(krn,4,n); + clarg_set_global(krn,5,PTRS->featuresCL[devid]); + clarg_set(krn,6,PTRS->numdocsCL[devid]); + numgroups = ((numfeatures + NUM_CUDA_CORES-1)/NUM_CUDA_CORES); + struct clndrange_struct ndr = { 1, {0,0,0,0}, {numgroups*NUM_CUDA_CORES,0,0,0}, {NUM_CUDA_CORES,0,0,0} }; + clfork(devid,devcontext(devid),devid&1,krn,&ndr,CL_FAST); + clmsync(devid,devcontext(devid),devid&1,PTRS->new_aCL[devid],CL_MEM_HOST|CL_EVENT_WAIT|CL_EVENT_RELEASE); + int good,errs,testmode = 0; + for (i=errs=good=0; inew_aCL[devid][i] < 0 ) + { + errs++, printf("i.%d ref %9.6f vs CL %9.6f [%.20f]\n",i,ref_new_a[i],PTRS->new_aCL[devid][i],ref_new_a[i]-PTRS->new_aCL[devid][i]); + //PTRS->new_aCL[devid][i] = ref_new_a[i]; + } else if ( ref_new_a[i] != 0. ) good++; + private_newA[i] = PTRS->new_aCL[devid][i]; + } + if ( testmode != 0 ) + printf("errs.%d good.%d | newA.%d cutlen.%d numgroups.%d ndrange.%d copied %9.6f | ref %9.6f\n",errs,good,devid,n,numgroups,numgroups*NUM_CUDA_CORES,_dbufave(PTRS->new_aCL[devid],numfeatures),_dbufave(ref_new_a,numfeatures)); + } +#endif + } + for (i=0; inumdevs == 0 || numthreads == MAIN_MAXCORES ) + { + endi = calc_thread_startendis(&starti,threadid,numthreads,numdocs); + for (i=starti; i<=endi; i++) + output[i] = calc_ocas_output(vars,selector,c,weekinds[i],answerind,W,W0,numfeatures); + } +#ifdef INSIDE_OPENCL + else + { + register void *krn; + double y; + int numgroups,weekind,outputi,devid,localbufsize = sizeof(double); + devid = threadid; + memcpy(PTRS->WCL[devid],W,sizeof(*W) * numfeatures); + clmsync(devid,devcontext(devid),devid&1,PTRS->WCL[devid],CL_MEM_DEVICE|CL_EVENT_WAIT|CL_EVENT_RELEASE); + krn = PTRS->krns[devid][0]; + clarg_set_local(krn,0,localbufsize); + clarg_set_global(krn,1,PTRS->predCL[devid]); + clarg_set(krn,2,numfeatures); + clarg_set_global(krn,3,PTRS->WCL[devid]); + clarg_set(krn,4,W0); + clarg_set_global(krn,5,PTRS->featuresCL[devid]); + clarg_set(krn,6,PTRS->numdocsCL[devid]); + numgroups = ((numdocs + NUM_CUDA_CORES-1)/NUM_CUDA_CORES); + struct clndrange_struct ndr = { 1, {0,0,0,0}, {numgroups*NUM_CUDA_CORES,0,0,0}, {NUM_CUDA_CORES,0,0,0} }; + printf("fork.%d dot numdocs.%d numgroups.%d\n",devid,numdocs,numgroups); + clfork(devid,devcontext(devid),devid&1,krn,&ndr,CL_FAST); + clmsync(devid,devcontext(devid),devid&1,PTRS->predCL[devid],CL_MEM_HOST|CL_EVENT_WAIT|CL_EVENT_RELEASE); + starti = PTRS->devstarti[devid]; + int errs,good,testmode = 0; + errs = good = 0; + for (i=0; inumdocsCL[devid]; i++) + { + weekind = PTRS->CLweekinds[devid][i]; + y = get_yval(0,selector,weekind,c,answerind); + outputi = PTRS->weekinds_maps[answerind][weekind]; + if ( outputi >= 0 ) + { + if ( testmode != 0 ) + { + if ( fabs(output[outputi] - PTRS->predCL[devid][i] * y) > .000001 || output[outputi] * PTRS->predCL[devid][i] * y < 0 ) + errs++, printf("i.%d starti.%d weekind.%d output[%d] %9.6f vs y.%.0f %9.6f CL [%13.10f] W0 %9.6f W0 %9.6f\n",i,starti,weekind,PTRS->weekinds_maps[answerind][weekind],output[PTRS->weekinds_maps[answerind][weekind]],y,PTRS->predCL[devid][i],output[PTRS->weekinds_maps[answerind][weekind]] - y*PTRS->predCL[devid][i],vars->W0[answerind],W0); + else good++; + } + else output[outputi] = PTRS->predCL[devid][i] * y; + } + } + if ( testmode != 0 ) + printf("errs.%d vs good.%d | devid.%d numdocs.%d numgroups.%d ndrange.%d copy %d to %d | preds %9.6f\n",errs,good,devid,numdocs,numgroups,numgroups*NUM_CUDA_CORES,starti,PTRS->devendi[devid],_dbufave(PTRS->predCL[devid],PTRS->numdocsCL[devid])); + } +#endif + decr_Numpending(threadid); +} + +static inline void lspaceglue(void *_args) +{ + long *args = _args; + double QPSolverTolRel,C,netcuts,cutlen; + int answerind,numfeatures; + struct ocas_vars *vars; + answerind = (int)args[0]; + numfeatures = (int)args[1]; + vars = (struct ocas_vars *)args[2]; + netcuts = *(double *)&args[3]; + cutlen = *(double *)&args[4]; + C = *(double *)&args[5]; + QPSolverTolRel = *(double *)&args[6]; + //printf("LSpace glue.A%d\n",answerind); + ocas_update_Lspace(vars,answerind,netcuts,cutlen,numfeatures,C,0.,QPSolverTolRel); + decr_Numpending(answerind); +} + +static inline void ocas_add_newcuts(register struct ocas_ptrs *PTRS,register int numthreads,register struct ocas_vars *vars,register int answerind,register int numfeatures,register int *weekinds,register int *new_cut,register int numcuts,register double *W,register double *new_a) +{ + STocas_add_newcuts(vars,answerind,numfeatures,weekinds,new_cut,numcuts,W,new_a); +} + +static inline void ocas_calc_outputs(register struct ocas_ptrs *PTRS,register int numthreads,register struct ocas_vars *vars,register int c,register int answerind,register double *output,register double *old_output,register double *W,register double W0,register int numfeatures,register int *weekinds,register int numdocs) +{ + long args[MAIN_MAXCORES][16]; + register int threadid; + register dispatch_group_t group; + if ( numthreads == 1 && PTRS->numdevs == 0 ) + { + STocas_calc_outputs(vars,c,answerind,output,old_output,W,W0,numfeatures,weekinds,numdocs); + return; + } + memset(args,0,sizeof(args)); + for (threadid=0; threadidselector; args[threadid][11] = (long)vars; + args[threadid][12] = (long)PTRS; args[threadid][13] = (long)old_output; + } + group = dispatch_group_create(); + for (threadid=0; threadidpratio[answerind] == 0. ) + vars->pratio[answerind] = vars->answerabsaves[answerind]; + vars->good[answerind] = -1; + vars->bad[answerind] = vars->trn_err[answerind] = vars->cutlen[answerind] = vars->numposcuts[answerind] = vars->numnegcuts[answerind] = 0; + vars->xi[answerind] = vars->predsum[answerind] = vars->dist[answerind] = vars->cutsum[answerind] = vars->netcuts[answerind] = 0.; +} + +static void ocas_print(struct ocas_vars *vars,int answerind,int ishwm,double C) +{ + int i; + double dispvals[4]; + //printf("ocas_print.A%d\n",answerind); + //printf("%s.A%02d %4d %8.2f | QP %9.3f QD %9.3f [%9.4f %7.3f] SV.%d %4d | M%9.6f (%9.6f max %8.1f %9.6f) %s.A%02d %9.6f%%\n", + dispvals[0] = vars->Q_P[answerind]/1000000000.; dispvals[1] = (C * vars->Q_D[answerind])/1000000000.; + dispvals[2] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / 1000000000; + dispvals[3] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / MAX(1,fabs(vars->Q_P[answerind])); + printf("%3d %d.A%02d",vars->nohwm[answerind],vars->refc,answerind); + printf(" %4d %8.2f |QP %9.3f QD %10.2f [%11.2f %9.1f] SV.%3d %3d |M%9.3f errs.%-6d %-8.0f %5.2f%% errs %6.5f A%9.6f W0%9.6f D%11.9f\n",//[%7.4f%%]\n", + vars->numIt[answerind],vars->ocas_time/1000,dispvals[0],dispvals[1],dispvals[2],dispvals[3], + vars->nNZAlpha[answerind], vars->numlhs[answerind], + // PTRS->lastmetrics[answerind],PTRS->learningrates[answerind][0],PTRS->maxiters[answerind],PTRS->learningrates[answerind][1], + vars->lastmetrics[answerind][0],vars->trn_err[answerind],vars->maxiters[answerind],vars->perc[answerind], + vars->errperc[answerind]/100,_dbufave(vars->CLspaces[answerind]->new_a,vars->numfeatures),vars->W0[answerind], + vars->dist[answerind]/vars->answerabsaves[answerind]);//_dbufave(vars->hwmperc,81));//,vars->errperc+vars->perc); + for (i=0; i<4; i++) + if ( isnan(dispvals[i]) != 0 ) + break; + if ( vars->lastmetrics[answerind][0] > 10 ) + usleep(vars->lastmetrics[answerind][0] * vars->lastmetrics[answerind][0]); + /*if ( 0 && i < 4 )//|| (vars->answerind >= 32 && fabs(vars->W0) > .9) ) + { + int save_model(int refc,int answerind,double *W,int numfeatures,double W0,double perc,int posA,int negA); + memset(&vars->CLspaces[answerind],0,sizeof(vars->CLspaces[answerind])); + vars->W0[answerind] = vars->oldW0[answerind] = 0.; + vars->numIt[answerind] = 0; + vars->perc[answerind] = vars->hwmperc[answerind] = 0.; + printf("reset model %s.A%02d\n",CONTRACTS[vars->selector!=3?vars->refc:NUM_COMBINED],answerind); + save_model(vars->refc,answerind,vars->CLspaces[answerind]->W,vars->numfeatures,vars->W0[answerind],vars->perc[answerind]); + }*/ +} + +static inline void finish_ocasiter(register int answerind,register struct ocas_vars *vars,register double C) +{ + register double den; + vars->have_pendingmodel[answerind] = 0; + if ( vars->good[answerind] == 0 && vars->bad[answerind] == 0 ) + { + vars->bad[answerind] = vars->trn_err[answerind]; + vars->good[answerind] = (vars->len[answerind] - vars->trn_err[answerind]); + } + den = MAX(1.,vars->good[answerind]+vars->bad[answerind]); + if ( (vars->predabs[answerind] = (vars->predsum[answerind] / den)) != 0. ) + vars->pratio[answerind] = (vars->answerabsaves[answerind] / vars->predabs[answerind]); + else vars->pratio[answerind] = 0.; + vars->dist[answerind] = sqrt(vars->dist[answerind] / den); + //printf("W0 %9.6f pred sum %f %f | pratio %f distsum %f (%f vs hwm %f)\n",vars->W0[answerind],vars->predsum[answerind],vars->predabs[answerind],vars->pratio[answerind],vars->dist[answerind],vars->perc[answerind],vars->hwmperc[answerind]); + vars->errperc[answerind] = (100 * (double)vars->trn_err[answerind])/(double)MAX(1,vars->len[answerind]); + vars->Q_P[answerind] = 0.5*vars->sq_norm_W[answerind] + (C * vars->xi[answerind]); + vars->ocas_time = (vars->output_time + vars->w_time + vars->add_time + vars->sort_time + vars->qp_solver_time); + ocas_print(vars,answerind,0,C); +} + +static inline int ocas_iter(struct ocas_vars *vars,int max_nohwm) +{ + int Method = 1; + int min_nohwm = 1; + int skipflags[84]; + static int new_cut[MAX_VECTORS]; + static double2 hpfb[MAX_VECTORS]; + int inactives[81]; + register struct ocas_CLbuffers *ptr; + register double netcuts,startmilli,y,psum,pcount,nosum; + register int i,numfeatures,cutlen,lastanswerind,lwm,numactive,numthreads,answerind,*weekinds; + numactive = 0; + if ( (numfeatures= vars->numfeatures) > MAX_OCAS_FEATURES ) + { + printf("numfeatures > MAX_OCAS_FEATURES\n"); + exit(-1); + } + psum = pcount = nosum = 0; + { + //printf("c.%d mask %lx %p\n",c,contractmask,PTRS->ocas[c]); + memset(inactives,0,sizeof(inactives)); + lastanswerind = TRADEBOTS_NUMANSWERS; + numfeatures = vars->numfeatures; + answerind = 0; + //printf("numIt.%d ocas iter.%s A.mask%lx len.%d CLspace.%p lhs.%p | vars.%p\n",vars->numIt[answerind],CONTRACTS[c_to_refc(c)],answerindmask,vars->len[answerind],vars->CLspaces[answerind],vars->lhs[answerind],vars); + memset(skipflags,0,sizeof(skipflags)); + for (answerind=0; answerindCLspaces[answerind],vars->weekinds[answerind],vars->nohwm[answerind],max_nohwm); + if ( vars->hwmperc[answerind] != 0 ) + { + nosum += vars->nohwm[answerind]; + pcount++, psum += vars->hwmperc[answerind]; + } + //printf("answerind.%d\n",answerind); + if ( vars->len[answerind] == 0 || vars->CLspaces[answerind] == 0 || (vars->nohwm[answerind] > min_nohwm && vars->hwmperc[answerind] > ((answerind==0) ? HWMPERC_THRESHOLD0 : HWMPERC_THRESHOLD)) ) + { + inactives[answerind] = 1; + continue; + } + if ( vars->nohwm[answerind] < max_nohwm ) + { + numactive++; + if ( vars->numIt[answerind]++ == 0 ) + { + for (i=0; iCLspaces[answerind]->W[i] != 0 ) + break; + if ( i == numfeatures ) + skipflags[answerind] = 1; + } + ptr = vars->CLspaces[answerind]; + weekinds = vars->weekinds[answerind]; + //printf("start iter %p %p\n",ptr,weekinds); + start_ocas_iter(vars,vars->c,answerind); + numthreads = vars->numthreads; + if ( skipflags[answerind] != 0 ) + { + for (i=0; ilen[answerind]; i++) + { + if ( (y= vars->answers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) + { + ptr->output_pred[i] = 0; + add_newcut_entry(vars,answerind,new_cut,i,weekinds[i],y); + } + } + fprintf(stderr,"skip %c.A%02d cuts +%d -%d, ",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind]); + } + else + { + startmilli = OS_milliseconds(); + //printf("%s ocas_calc_outputs.A%d len.%d | numthreads.%d\n",CONTRACTS[c_to_refc(c)],answerind,vars->len[answerind],numthreads); + STocas_calc_outputs(vars,vars->c,answerind,ptr->output_pred,ptr->old_output,ptr->W,vars->W0[answerind],numfeatures,weekinds,vars->len[answerind]); + //ocas_calc_outputs(PTRS,numthreads,vars,c,answerind,ptr->output_pred,ptr->old_output,ptr->W,vars->W0[answerind],numfeatures,weekinds,vars->len[answerind]); + vars->output_time += (OS_milliseconds() - startmilli); + if ( Method != 0 ) + { + startmilli = OS_milliseconds(); + printf("%d calc_ocas_strategy.A%d len.%d | numthreads.%d\n",c_to_refc(vars->c),answerind,vars->len[answerind],numthreads); + calc_ocas_strategy(vars,answerind,vars->C,numfeatures,vars->maxlen,weekinds,new_cut,ptr->W,ptr->oldW,ptr->output_pred,ptr->old_output,hpfb); + vars->w_time += (OS_milliseconds() - startmilli); + } + finish_ocasiter(answerind,vars,vars->C); + } + //printf("%s calc ocas_add_newcuts.A%d poscuts.%d negcuts.%d | numthreads.%d\n",CONTRACTS[c_to_refc(c)],answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind],vars->numthreads); + startmilli = OS_milliseconds(); + //if ( vars->nohwm[answerind] > 13 ) + // numthreads = vars->numthreads;///MAIN_MAXCORES; + memset(ptr->new_a,0,sizeof(ptr->new_a)); + //ocas_add_newcuts(PTRS,numthreads,vars,answerind,numfeatures,weekinds,new_cut,vars->numposcuts[answerind]+vars->numnegcuts[answerind],ptr->W,ptr->new_a); + STocas_add_newcuts(vars,answerind,numfeatures,weekinds,new_cut,vars->numposcuts[answerind]+vars->numnegcuts[answerind],ptr->W,ptr->new_a); + vars->add_time += (OS_milliseconds() - startmilli); +printf("done %d calc ocas_add_newcuts.A%d poscuts.%d negcuts.%d | numthreads.%d\n",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind],vars->numthreads); + } else inactives[answerind] = 1, printf("maxnohwm.%d\n",max_nohwm); + } + startmilli = OS_milliseconds(); + for (answerind=0; answerindnumposcuts[answerind] - vars->numnegcuts[answerind]); + cutlen = (vars->numposcuts[answerind] + vars->numnegcuts[answerind]); + if ( vars->nohwm[answerind] < lwm ) + lwm = vars->nohwm[answerind]; + ocas_update_Lspace(vars,answerind,netcuts,cutlen,numfeatures,vars->C,0.,vars->QPSolverTolRel); + } + vars->qp_solver_time += (OS_milliseconds() - startmilli); + } + if ( pcount != 0 ) + printf("numactive.%d %.0f | ave perf %f%% | ave nohwm %.1f\n",numactive,pcount,psum/pcount,nosum/pcount); + return(numactive); +} + +static inline int init_ocas_vars(int numthreads,int selector,long answerindmask,struct ocas_vars *vars,int c,double C,int numfeatures,int maxlhs,int maxlen,int len,double *answerabsave,int *posA,int *negA) +{ + int answerind,lastanswerind,retval = 0; + lastanswerind = TRADEBOTS_NUMANSWERS; + vars->maxlen = maxlen; + vars->numthreads = numthreads; + vars->selector = selector; + //printf("init_ocas_vars lastanswerind.%d\n",lastanswerind); + for (answerind=0; answerindlen[answerind]); + if ( vars->len[answerind] > 0 && (answerindmask == -1L || ((1L<refc = c_to_refc(c); vars->c = c; vars->C = C; + vars->numfeatures = numfeatures; vars->maxlhs = maxlhs; + if ( vars->CLspaces[answerind] == 0 ) + vars->CLspaces[answerind] = myaligned_alloc(sizeof(*vars->CLspaces[answerind])); + vars->answerabsaves[answerind] = answerabsave[answerind]; + vars->posA[answerind] = posA[answerind]; vars->negA[answerind] = negA[answerind]; + if ( vars->lhs[answerind] == 0 ) + vars->lhs[answerind] = myaligned_alloc(sizeof(*vars->lhs[answerind]) + numfeatures*maxlhs*sizeof(double)); + vars->maxiters[answerind] = QPSOLVER_MINITER; vars->trn_err[answerind] = vars->len[answerind]; vars->Q_P[answerind] = 0.5*vars->sq_norm_W[answerind] + C*vars->len[answerind]; + vars->perc[answerind] = vars->hwmperc[answerind] = vars->dist[answerind] = vars->hwmdist[answerind] = 0.; vars->numIt[answerind] = 0; + //printf("init.A%d %d | %p %p weekinds.%p\n",answerind,vars->len[answerind],vars->CLspaces[answerind],vars->lhs[answerind],vars->weekinds[answerind]); + } + } + //printf("mask.%lx init_ocas_vars selector.%d weekinds[0].%p\n",answerindmask,selector,vars->weekinds[0]); + return(retval); +} + +void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) +{ + struct ocas_CLbuffers *ptr; struct ocas_lhsbuffers *lhs; + int32_t nonz,weekind,answerind; double answer,y; + vars->maxlen = (endi - starti + 1); + vars->C = 1.0; + vars->c = c; + vars->TolRel = 0.01; + vars->TolAbs = 0.0; + vars->QPSolverTolRel = vars->TolRel*0.5; + vars->QPSolverTolAbs = vars->TolAbs*0.5; + vars->MaxTime = OCAS_INFINITY; + vars->QPBound = 0.0; + memset(vars->posA,0,sizeof(vars->posA)); + memset(vars->negA,0,sizeof(vars->negA)); + memset(vars->answeraves,0,sizeof(vars->answeraves)); + memset(vars->answerabsaves,0,sizeof(vars->answerabsaves)); + memset(vars->firstweekinds,0,sizeof(vars->firstweekinds)); + vars->starti = starti; + vars->answers = calloc(TRADEBOTS_NUMANSWERS,sizeof(vars->answers)*vars->maxlen); + vars->features = calloc(vars->maxlen,sizeof(*vars->features)); + for (answerind=0; answerindweekinds[answerind] = calloc(vars->maxlen,sizeof(*vars->weekinds[answerind])); + for (weekind=starti; weekind<=endi; weekind++) + { + vars->features[weekind - starti] = get_features(numfeatures,c,weekind); + for (answerind=0; answerindposA[answerind]+vars->negA[answerind]) >= vars->maxlen ) + continue; + if ( (y= get_yval(&answer,0,weekind,c,answerind)) != 0.f ) + { + vars->answers[(weekind-starti)*TRADEBOTS_NUMANSWERS + answerind] = y; + vars->weekinds[answerind][vars->len[answerind]++] = weekind; + if ( vars->posA[answerind]+vars->negA[answerind] == 0 ) + vars->firstweekinds[answerind] = weekind; + vars->answeraves[answerind] += answer; + if ( answer > 0 ) + { + vars->posA[answerind]++; + vars->answerabsaves[answerind] += answer; + } + else if ( answer < 0 ) + { + vars->negA[answerind]++; + vars->answerabsaves[answerind] -= answer; + } + } + } + } + for (answerind=0; answerindposA[answerind]+vars->negA[answerind])) != 0 ) + { + vars->answerabsaves[answerind] /= nonz; + vars->answeraves[answerind] /= nonz; + printf("A%02d.(%9.6f %d %d) ",answerind,vars->answerabsaves[answerind],vars->posA[answerind],vars->negA[answerind]); + } + init_ocas_vars(1,0,-1,vars,c,vars->C,numfeatures,MAX_OCAS_LHS,vars->maxlen,vars->maxlen,vars->answerabsaves,vars->posA,vars->negA); + for (answerind=0; answerindweekinds[0],numfeatures); + //if ( answerindmask != -1 && ((1L<len[answerind]); + lhs = vars->lhs[answerind]; + ptr = vars->CLspaces[answerind]; + vars->numlhs[answerind] = 0;//init_full_A(lhs->full_A,vars->numfeatures,c,answerind,models); + memset(ptr->W,0,sizeof(*ptr->W) * numfeatures); + memset(ptr->oldW,0,sizeof(*ptr->oldW) * numfeatures); + vars->W0[answerind] = vars->oldW0[answerind] = 0; +#ifdef ENABLE_EXISTINGMODEL + double init_model(double *percp,double *W,double *oldW,int c,int answerind,int numfeatures); + vars->W0[answerind] = init_model(&vars->hwmperc[answerind],ptr->W,ptr->oldW,c,answerind,vars->numfeatures); + if ( _dbufave(ptr->W,numfeatures) != 0 && bitweight(answerindmask) == 1 ) + validate_ocas_model(vars,answerind,ptr->output_pred,ptr->old_output,vars->weekinds[answerind],vars->len[answerind],ptr->W,vars->W0[answerind],numfeatures,1); +#endif + //printf("%s.A%d call init ocas vars weekinds[0] %p\n",CONTRACTS[c_to_refc(c)],answerind,vars->weekinds[0]); + } + vars->output_time = vars->sort_time = vars->w_time = vars->qp_solver_time = vars->ocas_time = vars->add_time = 0; + vars->startweekind = starti; vars->endweekind = endi; +} + +int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) +{ + int32_t i; struct ocas_vars *vars = calloc(1,sizeof(*vars)); + ocas_init(vars,c,numfeatures,starti,endi); + for (i=0; irefc = Tradebot_numarbpairs++; strcpy(pair->rel,rel); strcpy(pair->base,base); if ( strcmp(base,"NXT") == 0 && strcmp(rel,"BTC") == 0 ) @@ -240,20 +244,20 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 return(n); } -int32_t tradebots_calcsvmfeatures(double *svmfeatures,struct tradebot_arbpair *pair) +int32_t tradebots_calcsvmfeatures(double *svmfeatures,struct tradebot_arbpair *pair,float *rawfeatures,float *prevrawfeatures) { int32_t i,j,n,numpairfeatures,flag; struct tradebot_arbpair *ptr; uint32_t reftimestamp; - memcpy(&reftimestamp,pair->rawfeatures,sizeof(reftimestamp)); + memcpy(&reftimestamp,rawfeatures,sizeof(reftimestamp)); if ( reftimestamp == 0 ) return(-1); - numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,pair->rawfeatures,reftimestamp,pair->prevrawfeatures); - if ( pair->numsvmfeatures != (1+pair->numpairs)*n ) + numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,prevrawfeatures); + if ( 0 && pair->numsvmfeatures != (1+pair->numpairs)*n ) { - for (i=0; inumpairs; i++) + for (i=0; inumpairs; i++) // need to do lookups { flag = -1; - if ( (ptr= tradebot_arbpair_find(pair->svmpairs[i][0],pair->svmpairs[i][1])) != 0 ) - flag = tradebots_expandrawfeatures(&svmfeatures[n],ptr->rawfeatures,reftimestamp,pair->rawfeatures); + if ( (ptr= tradebots_arbpair_find(pair->svmpairs[i][0],pair->svmpairs[i][1])) != 0 ) + flag = tradebots_expandrawfeatures(&svmfeatures[n],ptr->rawfeatures,reftimestamp,rawfeatures); if ( flag < 0 ) { for (j=0; jnumsvmfeatures ) - { - printf("unexpected numsvmfeatures %d vs %d\n",n,pair->numsvmfeatures); - return(-1); - } return(n); } @@ -287,6 +286,7 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) double highbid,lowask,futurebid,futureask,ave,vol,bidaves[TRADEBOTS_NUMDECAYS],askaves[TRADEBOTS_NUMDECAYS],bidslopes[TRADEBOTS_NUMDECAYS],askslopes[TRADEBOTS_NUMDECAYS]; float rawfeatures[sizeof(pair->rawfeatures)/sizeof(*pair->rawfeatures)],futuremin,futuremax,minval,maxval,*hblas = 0; uint32_t timestamp,firsttime = 0; long fpos,savepos; int32_t flag,i,iter,j,ind,maxi; + OCAS_PLUS_INF = _OCAS_PLUS_INF; OCAS_NEG_INF = -_OCAS_PLUS_INF; if ( pair->fp != 0 ) { for (iter=0; iter<2; iter++) @@ -297,7 +297,7 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) { savepos = ftell(pair->fp); timestamp = tradebots_featureset(&highbid,&lowask,&ave,&vol,bidaves,askaves,bidslopes,askslopes,rawfeatures); - printf("timestamp.%u firsttime.%u\n",timestamp,firsttime); + //printf("timestamp.%u firsttime.%u\n",timestamp,firsttime); if ( timestamp == 0 ) continue; if ( firsttime == 0 ) @@ -393,6 +393,66 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) printf("ERROR: %s/%s not on feature boundary\n",pair->base,pair->rel); } +double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_t answerind) +{ + float answer; struct tradebot_arbpair *pair; long savepos; + pair = &Arbpairs[refc]; + if ( pair->fp != 0 ) + { + savepos = ftell(pair->fp); + fseek(pair->fp,ind*sizeof(pair->rawfeatures)+answerind*sizeof(*pair->rawfeatures),SEEK_SET); + if ( fread(&answer,1,sizeof(answer),pair->fp) != sizeof(answer) ) + answer = 0; + fseek(pair->fp,savepos,SEEK_SET); + if ( isnan(answer) != 0 ) + return(0); + if ( answer > .01 ) + answer = .01; + else if ( answer < -.01 ) + answer = -.01; + if ( answerp != 0 ) + *answerp = answer; + if ( answer > 0. ) + return(1.); + else if ( answer < 0. ) + return(-1.); + } + return(0.); +} + +float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) +{ + struct tradebot_arbpair *pair; long savepos; int32_t i,n; double svmfeatures[4096]; + float rawfeatures[sizeof(pair->rawfeatures)],prevrawfeatures[sizeof(pair->rawfeatures)],*svmf=0; + pair = &Arbpairs[refc]; + pair->numsvmfeatures = numfeatures; + if ( pair->fp != 0 && ind > 0 ) + { + savepos = ftell(pair->fp); + fseek(pair->fp,(ind-1)*sizeof(pair->rawfeatures),SEEK_SET); + if ( fread(&prevrawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) && fread(&rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) + { + n = tradebots_calcsvmfeatures(svmfeatures,pair,rawfeatures,prevrawfeatures); + if ( n != pair->numsvmfeatures ) + { + printf("unexpected numsvmfeatures %d vs %d\n",n,pair->numsvmfeatures); + //return(-1); + } + svmf = calloc(n,sizeof(*svmf)); + for (i=0; ifp,savepos,SEEK_SET); + } + return(svmf); +} + +double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) +{ + return(0.); +} +#include "tradebots_SVM.h" + static char *assetids[][2] = { { "12071612744977229797", "UNITY" }, @@ -438,7 +498,7 @@ void tradebot_arbentry(struct tradebot_arbentry *arb,char *exchange,double price } else printf("mismatched arbexchange? (%s vs %s)\n",arb->exchange,exchange); } -struct tradebot_arbexchange *tradebot_arbexchange_find(struct tradebot_arbpair *pair,char *exchange) +struct tradebot_arbexchange *tradebots_arbexchange_find(struct tradebot_arbpair *pair,char *exchange) { int32_t i; for (i=0; inumexchanges; i++) @@ -447,7 +507,7 @@ struct tradebot_arbexchange *tradebot_arbexchange_find(struct tradebot_arbpair * return(0); } -struct tradebot_arbexchange *tradebot_arbexchange_create(struct tradebot_arbpair *pair,char *exchange) +struct tradebot_arbexchange *tradebots_arbexchange_create(struct tradebot_arbpair *pair,char *exchange) { if ( pair->numexchanges < sizeof(pair->exchanges)/sizeof(*pair->exchanges) ) { @@ -466,15 +526,15 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t return; } offset = (tradedir > 0) ? 0 : 1; - if ( (pair= tradebot_arbpair_find(base,rel)) == 0 ) - pair = tradebot_arbpair_create(base,rel); + if ( (pair= tradebots_arbpair_find(base,rel)) == 0 ) + pair = tradebots_arbpair_create(base,rel); if ( pair == 0 ) { printf("cant get pair for %s %s/%s\n",exchange,base,rel); return; } - if ( (arbex= tradebot_arbexchange_find(pair,exchange)) == 0 ) - arbex = tradebot_arbexchange_create(pair,exchange); + if ( (arbex= tradebots_arbexchange_find(pair,exchange)) == 0 ) + arbex = tradebots_arbexchange_create(pair,exchange); if ( arbex != 0 ) { //printf("cand.%d %16s %s %12.6f (%5s/%-5s) at %12.8f profit %.03f\n",pair->numexchanges,exchange,tradedir<0?"ask":"bid",volume,base,rel,price,profitmargin); @@ -617,13 +677,13 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t { if ( myinfo->svmfeatures == 0 ) myinfo->svmfeatures = calloc(sizeof(*myinfo->svmfeatures),pair->numsvmfeatures); - if ( tradebots_calcsvmfeatures(myinfo->svmfeatures,pair) > 0 ) + if ( tradebots_calcsvmfeatures(myinfo->svmfeatures,pair,pair->rawfeatures,pair->prevrawfeatures) > 0 ) tradebots_calcpreds(pair->RTpreds,pair,myinfo->svmfeatures); } } pair->lasttime = (uint32_t)time(NULL); } - if ( time(NULL) > pair->lastanswertime+3600 ) + if ( 0 && time(NULL) > pair->lastanswertime+3600 ) { tradebots_calcanswers(pair); pair->lastanswertime = (uint32_t)time(NULL); @@ -861,8 +921,8 @@ void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info * price = bidasks[1].price; tradebot_arbcandidate(myinfo,exchange->name,-1,base,rel,price,volume,(uint32_t)time(NULL),profitmargin); } - if ( (pair= tradebot_arbpair_find(base,rel)) == 0 ) - pair = tradebot_arbpair_create(base,rel); + if ( (pair= tradebots_arbpair_find(base,rel)) == 0 ) + pair = tradebots_arbpair_create(base,rel); if ( pair != 0 ) { if ( strcmp(rel,"NXT") == 0 ) @@ -885,3 +945,19 @@ void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info * } } } + +#include "../includes/iguana_apidefs.h" +#include "../includes/iguana_apideclares.h" + +TWO_STRINGS(tradebots,gensvm,base,rel) +{ + int32_t numfeatures = 532; 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\"}")); +} + +#include "../includes/iguana_apiundefs.h" diff --git a/crypto777/OS_nonportable.c b/crypto777/OS_nonportable.c index 52832bba9..9e4e3f281 100755 --- a/crypto777/OS_nonportable.c +++ b/crypto777/OS_nonportable.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/OS_portable.c b/crypto777/OS_portable.c index c06dfb545..7f614b816 100755 --- a/crypto777/OS_portable.c +++ b/crypto777/OS_portable.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/OS_portable.h b/crypto777/OS_portable.h index 68a59b0a7..d1baed4e0 100755 --- a/crypto777/OS_portable.h +++ b/crypto777/OS_portable.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/OS_time.c b/crypto777/OS_time.c index e127ad7a5..245da6928 100755 --- a/crypto777/OS_time.c +++ b/crypto777/OS_time.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/SaM.c b/crypto777/SaM.c index 3f9c2d092..bfc97df59 100755 --- a/crypto777/SaM.c +++ b/crypto777/SaM.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/bitcoind_RPC.c b/crypto777/bitcoind_RPC.c index 5960a16c0..2d31acdd2 100755 --- a/crypto777/bitcoind_RPC.c +++ b/crypto777/bitcoind_RPC.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/cJSON.c b/crypto777/cJSON.c index d67dfa742..719c3eb8e 100755 --- a/crypto777/cJSON.c +++ b/crypto777/cJSON.c @@ -634,7 +634,7 @@ void cJSON_Minify(char *json) // the following written by jl777 /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/curve25519.c b/crypto777/curve25519.c index eae51aefc..5d2c24930 100755 --- a/crypto777/curve25519.c +++ b/crypto777/curve25519.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index 425e65d73..5363f2135 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/iguana_serdes.c b/crypto777/iguana_serdes.c index eff6f3e5f..996743c78 100755 --- a/crypto777/iguana_serdes.c +++ b/crypto777/iguana_serdes.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/iguana_utils.c b/crypto777/iguana_utils.c index aa532d699..cc058efd1 100755 --- a/crypto777/iguana_utils.c +++ b/crypto777/iguana_utils.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/crypto777/ramcoder.c b/crypto777/ramcoder.c index d495914de..86760289f 100755 --- a/crypto777/ramcoder.c +++ b/crypto777/ramcoder.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/datachain/datachain.c b/datachain/datachain.c index d0f661c79..9922e3f78 100755 --- a/datachain/datachain.c +++ b/datachain/datachain.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/deprecated/iguana_instantdex.c b/deprecated/iguana_instantdex.c index 85755175b..5baf88af0 100755 --- a/deprecated/iguana_instantdex.c +++ b/deprecated/iguana_instantdex.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/gecko/gecko.c b/gecko/gecko.c index cd7667089..5a0c2dbaa 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -1,6 +1,6 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index be283118e..577907b5f 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 4d1c27e4b..d9e3cb1f2 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index b65ec3a50..fc03913fa 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index be5b16837..758e0125d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index 3b942a953..cc2420201 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 54924fc22..8509397b5 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 2b3b8b23b..4c141cd5d 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index 90d4d4fef..5f8c3ec7b 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/bitcoin.h b/iguana/exchanges/bitcoin.h index 2a5cf651e..ad362a5a2 100755 --- a/iguana/exchanges/bitcoin.h +++ b/iguana/exchanges/bitcoin.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/bitfinex.c b/iguana/exchanges/bitfinex.c index 764167ca3..6643fff89 100755 --- a/iguana/exchanges/bitfinex.c +++ b/iguana/exchanges/bitfinex.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/bitstamp.c b/iguana/exchanges/bitstamp.c index 30c9b9a5a..36e928a34 100755 --- a/iguana/exchanges/bitstamp.c +++ b/iguana/exchanges/bitstamp.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/bittrex.c b/iguana/exchanges/bittrex.c index 4e1ee5c63..155de4cfa 100755 --- a/iguana/exchanges/bittrex.c +++ b/iguana/exchanges/bittrex.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/btc38.c b/iguana/exchanges/btc38.c index 268dce776..493d3fa0d 100755 --- a/iguana/exchanges/btc38.c +++ b/iguana/exchanges/btc38.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/btce.c b/iguana/exchanges/btce.c index c7a255b06..b1d5a1291 100755 --- a/iguana/exchanges/btce.c +++ b/iguana/exchanges/btce.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/coinbase.c b/iguana/exchanges/coinbase.c index 1a0fd190d..528df90a2 100755 --- a/iguana/exchanges/coinbase.c +++ b/iguana/exchanges/coinbase.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/exchange_supports.h b/iguana/exchanges/exchange_supports.h index 083630bc1..fc7c854d2 100755 --- a/iguana/exchanges/exchange_supports.h +++ b/iguana/exchanges/exchange_supports.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/exchange_undefs.h b/iguana/exchanges/exchange_undefs.h index 20862bce8..6d115147d 100755 --- a/iguana/exchanges/exchange_undefs.h +++ b/iguana/exchanges/exchange_undefs.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/fxcm.c b/iguana/exchanges/fxcm.c index 42807a46f..ac39cbbd1 100755 --- a/iguana/exchanges/fxcm.c +++ b/iguana/exchanges/fxcm.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/huobi.c b/iguana/exchanges/huobi.c index 402049a7c..02cc6f941 100755 --- a/iguana/exchanges/huobi.c +++ b/iguana/exchanges/huobi.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/instaforex.c b/iguana/exchanges/instaforex.c index 3efa2a0e4..babcec86f 100755 --- a/iguana/exchanges/instaforex.c +++ b/iguana/exchanges/instaforex.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/jumblr.c b/iguana/exchanges/jumblr.c index ba3cb4209..9803bbc05 100755 --- a/iguana/exchanges/jumblr.c +++ b/iguana/exchanges/jumblr.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/lakebtc.c b/iguana/exchanges/lakebtc.c index 992665a07..3542ac9ba 100755 --- a/iguana/exchanges/lakebtc.c +++ b/iguana/exchanges/lakebtc.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/nxtae.c b/iguana/exchanges/nxtae.c index 592532f30..03e2c1eee 100755 --- a/iguana/exchanges/nxtae.c +++ b/iguana/exchanges/nxtae.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/okcoin.c b/iguana/exchanges/okcoin.c index 793fa38e6..af2fe5184 100755 --- a/iguana/exchanges/okcoin.c +++ b/iguana/exchanges/okcoin.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/poloniex.c b/iguana/exchanges/poloniex.c index 037db3715..a45c3e343 100755 --- a/iguana/exchanges/poloniex.c +++ b/iguana/exchanges/poloniex.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/quadriga.c b/iguana/exchanges/quadriga.c index 6347c5118..e686c9787 100755 --- a/iguana/exchanges/quadriga.c +++ b/iguana/exchanges/quadriga.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/truefx.c b/iguana/exchanges/truefx.c index 331eb71d6..1d0049543 100755 --- a/iguana/exchanges/truefx.c +++ b/iguana/exchanges/truefx.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges/unconf.c b/iguana/exchanges/unconf.c index d0cea56ab..951b6419d 100755 --- a/iguana/exchanges/unconf.c +++ b/iguana/exchanges/unconf.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/exchanges777.h b/iguana/exchanges777.h index 2d1ba66a7..fdefd98b5 100755 --- a/iguana/exchanges777.h +++ b/iguana/exchanges777.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 6176e51b7..f8fc045ce 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana777.h b/iguana/iguana777.h index d5a8e6f32..cd2cdd931 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_accept.c b/iguana/iguana_accept.c index b3eaa07be..869d0f3bb 100755 --- a/iguana/iguana_accept.c +++ b/iguana/iguana_accept.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_bitmap.c b/iguana/iguana_bitmap.c index 94a63fc72..b690738b5 100755 --- a/iguana/iguana_bitmap.c +++ b/iguana/iguana_bitmap.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_blocks.c b/iguana/iguana_blocks.c index 84bf9c914..9d502494f 100755 --- a/iguana/iguana_blocks.c +++ b/iguana/iguana_blocks.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index 0c9bba65f..d4ad7a81e 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 7a2b1f370..927fc0752 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index d6f7409cd..d8d678004 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 8d9ccacfd..961996a23 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_interpreter.c b/iguana/iguana_interpreter.c index 4ed277649..d98ac46a8 100755 --- a/iguana/iguana_interpreter.c +++ b/iguana/iguana_interpreter.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index ca7a1fea3..6ca3c0074 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_mofn.c b/iguana/iguana_mofn.c index 50d024457..4cca28947 100755 --- a/iguana/iguana_mofn.c +++ b/iguana/iguana_mofn.c @@ -309,7 +309,7 @@ int maingen(int argc,char **argv) } /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index f9a46eec0..4b7a497d9 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ae4cffadb..f0466aea5 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index db778a1f6..1d23f1a48 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index f981cc82d..bedda833f 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index d94078751..7ed8867fc 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_realtime.c b/iguana/iguana_realtime.c index b54a82e39..bedc4b911 100755 --- a/iguana/iguana_realtime.c +++ b/iguana/iguana_realtime.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index f7bd3f598..c310b0a12 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 70c072490..cc5eaf831 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index 7a79fed39..4374c50ea 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_secp.c b/iguana/iguana_secp.c index b69929408..984379f3a 100755 --- a/iguana/iguana_secp.c +++ b/iguana/iguana_secp.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index 5f34def90..f8790f003 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_spendvectors.c b/iguana/iguana_spendvectors.c index 0667d429e..e1d9a9479 100755 --- a/iguana/iguana_spendvectors.c +++ b/iguana/iguana_spendvectors.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_tradebots.c b/iguana/iguana_tradebots.c index f6755e71d..8134c9125 100755 --- a/iguana/iguana_tradebots.c +++ b/iguana/iguana_tradebots.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_tx.c b/iguana/iguana_tx.c index c58b7c56d..36972a0c6 100755 --- a/iguana/iguana_tx.c +++ b/iguana/iguana_tx.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_txidfind.c b/iguana/iguana_txidfind.c index cf49872ef..6db6d03ed 100755 --- a/iguana/iguana_txidfind.c +++ b/iguana/iguana_txidfind.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 4d2581d69..5e53c357d 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_volatiles.c b/iguana/iguana_volatiles.c index 5ea221167..8bf4923f1 100755 --- a/iguana/iguana_volatiles.c +++ b/iguana/iguana_volatiles.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index f452e3695..cfa8a8d4e 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/main.c b/iguana/main.c index 15fe34b9f..5ee0dd9fe 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 59fe53824..e14d744d4 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index b3ff9e271..bf81a3f7b 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * @@ -43,6 +43,7 @@ ZERO_ARGS(pax,start); HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); ZERO_ARGS(tradebot,amlp); ZERO_ARGS(tradebot,notlp); +TWO_STRINGS(tradebots,gensvm,base,rel); INT_AND_ARRAY(iguana,rates,unused,quotes); TWO_STRINGS(iguana,rate,base,rel); diff --git a/includes/iguana_defines.h b/includes/iguana_defines.h index 7fbf0a817..942336699 100755 --- a/includes/iguana_defines.h +++ b/includes/iguana_defines.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 5ed16af94..efba8cba3 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/includes/iguana_globals.h b/includes/iguana_globals.h index 5d8c57f94..cc0a13359 100755 --- a/includes/iguana_globals.h +++ b/includes/iguana_globals.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 6cf3766a3..0552c6854 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * diff --git a/includes/iguana_types.h b/includes/iguana_types.h index 7b953cea1..4a1b4647e 100755 --- a/includes/iguana_types.h +++ b/includes/iguana_types.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright © 2014-2016 The SuperNET Developers. * + * 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 * From a65c312804f628f1e9ee36d7dec2ea4dd8e9f88d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 23:16:31 +0200 Subject: [PATCH 317/432] test --- iguana/m_LP | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/m_LP b/iguana/m_LP index 28ac1ba98..290693f08 100755 --- a/iguana/m_LP +++ b/iguana/m_LP @@ -4,6 +4,6 @@ rm -f ../agents/iguana *.o git pull cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c -gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.so -lcurl -lssl -lcrypto -lpthread -lz -lm +clang -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +clang -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c +clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.so -lcurl -lssl -lcrypto -lpthread -lz -lm From b53cfbad57cd232fbf138ae0f04df7148c20043e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 5 Jan 2017 23:23:02 +0200 Subject: [PATCH 318/432] test --- basilisk/tradebots_liquidity.c | 7 +++++++ iguana/m_LP | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 650190067..df11fabb8 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -451,7 +451,10 @@ double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures { return(0.); } + +#ifndef _WIN #include "tradebots_SVM.h" +#endif static char *assetids[][2] = { @@ -951,6 +954,9 @@ void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info * TWO_STRINGS(tradebots,gensvm,base,rel) { +#ifdef _WIN + return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); +#else int32_t numfeatures = 532; struct tradebot_arbpair *pair; if ( base[0] != 0 && rel[0] != 0 && (pair= tradebots_arbpair_find(base,rel)) != 0 && pair->fp != 0 ) { @@ -958,6 +964,7 @@ TWO_STRINGS(tradebots,gensvm,base,rel) 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 } #include "../includes/iguana_apiundefs.h" diff --git a/iguana/m_LP b/iguana/m_LP index 290693f08..d09ee9373 100755 --- a/iguana/m_LP +++ b/iguana/m_LP @@ -4,6 +4,6 @@ rm -f ../agents/iguana *.o git pull cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -clang -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c -clang -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c +clang -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +clang -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.so -lcurl -lssl -lcrypto -lpthread -lz -lm From f1c1148f247e7dd79ba29df804fbba84e4a7b5e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 00:52:19 +0200 Subject: [PATCH 319/432] test --- basilisk/tradebots_SVM.h | 275 ++++----------------------------- basilisk/tradebots_liquidity.c | 90 +++++++---- iguana/tests/gensvm | 3 + 3 files changed, 96 insertions(+), 272 deletions(-) create mode 100755 iguana/tests/gensvm diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index 0171fcce8..1be16dce2 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -169,9 +169,9 @@ void ocas_purge(struct ocas_vars *vars) for (i=0; iCLspaces[i] != 0 ) - free(vars->CLspaces[i]); + myaligned_free(vars->CLspaces[i],sizeof(*vars->CLspaces[i])); if ( vars->lhs[i] != 0 ) - free(vars->lhs[i]); + myaligned_free(vars->lhs[i],sizeof(*vars->lhs[i]) + vars->numfeatures*vars->maxlhs*sizeof(double)); if ( vars->weekinds[i] != 0 ) free(vars->weekinds[i]); } @@ -248,6 +248,7 @@ static inline void add_ocas_output(register double y,register struct ocas_vars * static inline void STocas_calc_outputs(register struct ocas_vars *vars,register int c,register int answerind,register double *output,register double *old_output,register double *W,register double W0,register int numfeatures,register int *weekinds,register int numdocs) { register int i,j; + //vars->good[answerind] = vars->bad[answerind] = 0; //printf("start STocas_calc_outputs.(%p %s.A%d %p) %p %p %p\n",vars,CONTRACTS[c],answerind,weekinds,output,old_output,W); for (i=0; ianswers[(i-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]*output[i] <= 0 ) + { + if ( vars->answers[(i-vars->starti)*TRADEBOTS_NUMANSWERS + answerind] != 0.f ) + printf("(%f %f) ",vars->answers[(i-vars->starti)*TRADEBOTS_NUMANSWERS + answerind],output[i]); + } + //printf("[%f %f] ",vars->answers[(i-vars->starti)*TRADEBOTS_NUMANSWERS + answerind],output[i]); + } } //printf("finish STocas_calc_outputs\n"); } @@ -468,7 +478,7 @@ static inline void calc_ocas_strategy(register struct ocas_vars *vars,register i { if ( (y= vars->answers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) { - answermag = fabs(y); // 1.; + answermag = 1.;//fabs(y); // 1.; if ( (old_output[i] * (1. - t2) + t2*output[i]) <= answermag ) //1. add_newcut_entry(vars,answerind,new_cut,i,weekinds[i],y); newoutput = (old_output[i] * (1. - t1)) + (t1 * output[i]); @@ -492,7 +502,11 @@ static inline void calc_ocas_strategy(register struct ocas_vars *vars,register i dist += fabs(preds[i] - y); old_output[i] = newoutput; if ( newoutput > 0. ) good++; - else bad++; + else if ( newoutput < 0. ) + { + bad++; + //printf("(%f %f) ",y,newoutput); + } } else zero++;//,printf("i.%d -> w%d | zeroes.%d good.%d bad.%d of len.%d\n",i,weekinds[i],zero,good,bad,len); } //printf("finished strategy\n"); @@ -736,239 +750,6 @@ static inline void ocas_update_Lspace(register struct ocas_vars *vars,register i update_ocas_model(ptr->W,ptr->oldW,vars,numfeatures,answerind,lhs,numlhs); } -/*static inline int calc_thread_startendis(register int *startip,register int threadid,register int numthreads,register int n) -{ - register double incr; - incr = ((double)n / numthreads); - *startip = threadid * incr; - if ( threadid == numthreads-1 ) - return(n-1); - else return(((threadid+1) * incr) - 1); -} - -static inline int count_Numpending() -{ - int i,n=0; - for (i=0; inumdevs == 0 || numthreads == MAIN_MAXCORES ) - { - endi = calc_thread_startendis(&starti,threadid,numthreads,cutlen); - //printf("inside addnewcutglue.t%d\n",threadid); - for (i=starti; i<=endi; i++) - { - weekind = new_cut[i]; - dir = (weekind & 1); - weekind >>= 1; - add_ocas_output(dir==0?1.:-1.,vars,selector,c,weekind,answerind,W,private_newA,numfeatures); - } - //printf("end inside addnewcutglue.t%d\n",threadid); - } - else - { -#ifdef INSIDE_OPENCL - register void *krn; - int numgroups,docid,n,devid,localbufsize = sizeof(double); - devid = threadid; - printf("devid.%d %p %p %p A%02d t%d of %d: start.%d w%d to end.%d w%d\n",devid,PTRS->new_aCL[devid],PTRS->new_cutCL[devid],PTRS->featuresCL[devid],answerind,threadid,numthreads,starti,new_cut[starti],endi,new_cut[endi]); - for (i=n=0; i>= 1; - if ( (docid= PTRS->CLweekinds_map[devid][weekind]) >= 0 ) - { - if ( docid >= PTRS->numdocsCL[devid] ) - fatal("fatal docid >= PTRS->numdocsCL[devid]"); - //printf("i.%d weekind.%d n.%d docid.%d [%d]\n",i,weekind,n,docid,new_cut[i]&1); - PTRS->new_cutCL[devid][n++] = (docid<<1) | dir; - } - } - if ( n != 0 ) - { - _clmsync(devid,devcontext(devid),devid&1,PTRS->new_cutCL[devid],0,sizeof(int) * n,CL_MEM_DEVICE|CL_EVENT_WAIT|CL_EVENT_RELEASE); - krn = PTRS->krns[devid][1]; - clarg_set_local(krn,0,localbufsize); - clarg_set_global(krn,1,PTRS->new_aCL[devid]); - clarg_set(krn,2,numfeatures); - clarg_set_global(krn,3,PTRS->new_cutCL[devid]); - clarg_set(krn,4,n); - clarg_set_global(krn,5,PTRS->featuresCL[devid]); - clarg_set(krn,6,PTRS->numdocsCL[devid]); - numgroups = ((numfeatures + NUM_CUDA_CORES-1)/NUM_CUDA_CORES); - struct clndrange_struct ndr = { 1, {0,0,0,0}, {numgroups*NUM_CUDA_CORES,0,0,0}, {NUM_CUDA_CORES,0,0,0} }; - clfork(devid,devcontext(devid),devid&1,krn,&ndr,CL_FAST); - clmsync(devid,devcontext(devid),devid&1,PTRS->new_aCL[devid],CL_MEM_HOST|CL_EVENT_WAIT|CL_EVENT_RELEASE); - int good,errs,testmode = 0; - for (i=errs=good=0; inew_aCL[devid][i] < 0 ) - { - errs++, printf("i.%d ref %9.6f vs CL %9.6f [%.20f]\n",i,ref_new_a[i],PTRS->new_aCL[devid][i],ref_new_a[i]-PTRS->new_aCL[devid][i]); - //PTRS->new_aCL[devid][i] = ref_new_a[i]; - } else if ( ref_new_a[i] != 0. ) good++; - private_newA[i] = PTRS->new_aCL[devid][i]; - } - if ( testmode != 0 ) - printf("errs.%d good.%d | newA.%d cutlen.%d numgroups.%d ndrange.%d copied %9.6f | ref %9.6f\n",errs,good,devid,n,numgroups,numgroups*NUM_CUDA_CORES,_dbufave(PTRS->new_aCL[devid],numfeatures),_dbufave(ref_new_a,numfeatures)); - } -#endif - } - for (i=0; inumdevs == 0 || numthreads == MAIN_MAXCORES ) - { - endi = calc_thread_startendis(&starti,threadid,numthreads,numdocs); - for (i=starti; i<=endi; i++) - output[i] = calc_ocas_output(vars,selector,c,weekinds[i],answerind,W,W0,numfeatures); - } -#ifdef INSIDE_OPENCL - else - { - register void *krn; - double y; - int numgroups,weekind,outputi,devid,localbufsize = sizeof(double); - devid = threadid; - memcpy(PTRS->WCL[devid],W,sizeof(*W) * numfeatures); - clmsync(devid,devcontext(devid),devid&1,PTRS->WCL[devid],CL_MEM_DEVICE|CL_EVENT_WAIT|CL_EVENT_RELEASE); - krn = PTRS->krns[devid][0]; - clarg_set_local(krn,0,localbufsize); - clarg_set_global(krn,1,PTRS->predCL[devid]); - clarg_set(krn,2,numfeatures); - clarg_set_global(krn,3,PTRS->WCL[devid]); - clarg_set(krn,4,W0); - clarg_set_global(krn,5,PTRS->featuresCL[devid]); - clarg_set(krn,6,PTRS->numdocsCL[devid]); - numgroups = ((numdocs + NUM_CUDA_CORES-1)/NUM_CUDA_CORES); - struct clndrange_struct ndr = { 1, {0,0,0,0}, {numgroups*NUM_CUDA_CORES,0,0,0}, {NUM_CUDA_CORES,0,0,0} }; - printf("fork.%d dot numdocs.%d numgroups.%d\n",devid,numdocs,numgroups); - clfork(devid,devcontext(devid),devid&1,krn,&ndr,CL_FAST); - clmsync(devid,devcontext(devid),devid&1,PTRS->predCL[devid],CL_MEM_HOST|CL_EVENT_WAIT|CL_EVENT_RELEASE); - starti = PTRS->devstarti[devid]; - int errs,good,testmode = 0; - errs = good = 0; - for (i=0; inumdocsCL[devid]; i++) - { - weekind = PTRS->CLweekinds[devid][i]; - y = get_yval(0,selector,weekind,c,answerind); - outputi = PTRS->weekinds_maps[answerind][weekind]; - if ( outputi >= 0 ) - { - if ( testmode != 0 ) - { - if ( fabs(output[outputi] - PTRS->predCL[devid][i] * y) > .000001 || output[outputi] * PTRS->predCL[devid][i] * y < 0 ) - errs++, printf("i.%d starti.%d weekind.%d output[%d] %9.6f vs y.%.0f %9.6f CL [%13.10f] W0 %9.6f W0 %9.6f\n",i,starti,weekind,PTRS->weekinds_maps[answerind][weekind],output[PTRS->weekinds_maps[answerind][weekind]],y,PTRS->predCL[devid][i],output[PTRS->weekinds_maps[answerind][weekind]] - y*PTRS->predCL[devid][i],vars->W0[answerind],W0); - else good++; - } - else output[outputi] = PTRS->predCL[devid][i] * y; - } - } - if ( testmode != 0 ) - printf("errs.%d vs good.%d | devid.%d numdocs.%d numgroups.%d ndrange.%d copy %d to %d | preds %9.6f\n",errs,good,devid,numdocs,numgroups,numgroups*NUM_CUDA_CORES,starti,PTRS->devendi[devid],_dbufave(PTRS->predCL[devid],PTRS->numdocsCL[devid])); - } -#endif - decr_Numpending(threadid); -} - -static inline void lspaceglue(void *_args) -{ - long *args = _args; - double QPSolverTolRel,C,netcuts,cutlen; - int answerind,numfeatures; - struct ocas_vars *vars; - answerind = (int)args[0]; - numfeatures = (int)args[1]; - vars = (struct ocas_vars *)args[2]; - netcuts = *(double *)&args[3]; - cutlen = *(double *)&args[4]; - C = *(double *)&args[5]; - QPSolverTolRel = *(double *)&args[6]; - //printf("LSpace glue.A%d\n",answerind); - ocas_update_Lspace(vars,answerind,netcuts,cutlen,numfeatures,C,0.,QPSolverTolRel); - decr_Numpending(answerind); -} - -static inline void ocas_add_newcuts(register struct ocas_ptrs *PTRS,register int numthreads,register struct ocas_vars *vars,register int answerind,register int numfeatures,register int *weekinds,register int *new_cut,register int numcuts,register double *W,register double *new_a) -{ - STocas_add_newcuts(vars,answerind,numfeatures,weekinds,new_cut,numcuts,W,new_a); -} - -static inline void ocas_calc_outputs(register struct ocas_ptrs *PTRS,register int numthreads,register struct ocas_vars *vars,register int c,register int answerind,register double *output,register double *old_output,register double *W,register double W0,register int numfeatures,register int *weekinds,register int numdocs) -{ - long args[MAIN_MAXCORES][16]; - register int threadid; - register dispatch_group_t group; - if ( numthreads == 1 && PTRS->numdevs == 0 ) - { - STocas_calc_outputs(vars,c,answerind,output,old_output,W,W0,numfeatures,weekinds,numdocs); - return; - } - memset(args,0,sizeof(args)); - for (threadid=0; threadidselector; args[threadid][11] = (long)vars; - args[threadid][12] = (long)PTRS; args[threadid][13] = (long)old_output; - } - group = dispatch_group_create(); - for (threadid=0; threadidpratio[answerind] == 0. ) @@ -987,7 +768,7 @@ static void ocas_print(struct ocas_vars *vars,int answerind,int ishwm,double C) dispvals[0] = vars->Q_P[answerind]/1000000000.; dispvals[1] = (C * vars->Q_D[answerind])/1000000000.; dispvals[2] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / 1000000000; dispvals[3] = (vars->Q_P[answerind]-C * vars->Q_D[answerind]) / MAX(1,fabs(vars->Q_P[answerind])); - printf("%3d %d.A%02d",vars->nohwm[answerind],vars->refc,answerind); + printf("%3d %d.A%02d +%d -%d",vars->nohwm[answerind],vars->refc,answerind,vars->good[answerind],vars->bad[answerind]); printf(" %4d %8.2f |QP %9.3f QD %10.2f [%11.2f %9.1f] SV.%3d %3d |M%9.3f errs.%-6d %-8.0f %5.2f%% errs %6.5f A%9.6f W0%9.6f D%11.9f\n",//[%7.4f%%]\n", vars->numIt[answerind],vars->ocas_time/1000,dispvals[0],dispvals[1],dispvals[2],dispvals[3], vars->nNZAlpha[answerind], vars->numlhs[answerind], @@ -1111,7 +892,7 @@ static inline int ocas_iter(struct ocas_vars *vars,int max_nohwm) if ( Method != 0 ) { startmilli = OS_milliseconds(); - printf("%d calc_ocas_strategy.A%d len.%d | numthreads.%d\n",c_to_refc(vars->c),answerind,vars->len[answerind],numthreads); + //printf("%d calc_ocas_strategy.A%d len.%d | numthreads.%d\n",c_to_refc(vars->c),answerind,vars->len[answerind],numthreads); calc_ocas_strategy(vars,answerind,vars->C,numfeatures,vars->maxlen,weekinds,new_cut,ptr->W,ptr->oldW,ptr->output_pred,ptr->old_output,hpfb); vars->w_time += (OS_milliseconds() - startmilli); } @@ -1125,7 +906,7 @@ static inline int ocas_iter(struct ocas_vars *vars,int max_nohwm) //ocas_add_newcuts(PTRS,numthreads,vars,answerind,numfeatures,weekinds,new_cut,vars->numposcuts[answerind]+vars->numnegcuts[answerind],ptr->W,ptr->new_a); STocas_add_newcuts(vars,answerind,numfeatures,weekinds,new_cut,vars->numposcuts[answerind]+vars->numnegcuts[answerind],ptr->W,ptr->new_a); vars->add_time += (OS_milliseconds() - startmilli); -printf("done %d calc ocas_add_newcuts.A%d poscuts.%d negcuts.%d | numthreads.%d\n",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind],vars->numthreads); +//printf("done %d calc ocas_add_newcuts.A%d poscuts.%d negcuts.%d | good.%d bad.%d\n",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind],vars->good[answerind],vars->bad[answerind]); } else inactives[answerind] = 1, printf("maxnohwm.%d\n",max_nohwm); } startmilli = OS_milliseconds(); @@ -1157,7 +938,7 @@ static inline int init_ocas_vars(int numthreads,int selector,long answerindmask, for (answerind=0; answerindlen[answerind]); - if ( vars->len[answerind] > 0 && (answerindmask == -1L || ((1L<len[answerind] > 0 )//&& (answerindmask == -1L || ((1L<refc = c_to_refc(c); vars->c = c; vars->C = C; vars->numfeatures = numfeatures; vars->maxlhs = maxlhs; @@ -1180,8 +961,12 @@ void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t star { struct ocas_CLbuffers *ptr; struct ocas_lhsbuffers *lhs; int32_t nonz,weekind,answerind; double answer,y; + if ( numfeatures < 0 ) + return; + vars->maxlhs = MAX_OCAS_LHS; + vars->numfeatures = numfeatures; vars->maxlen = (endi - starti + 1); - vars->C = 1.0; + vars->C = 1.; vars->c = c; vars->TolRel = 0.01; vars->TolAbs = 0.0; @@ -1236,12 +1021,14 @@ void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t star init_ocas_vars(1,0,-1,vars,c,vars->C,numfeatures,MAX_OCAS_LHS,vars->maxlen,vars->maxlen,vars->answerabsaves,vars->posA,vars->negA); for (answerind=0; answerindweekinds[0],numfeatures); //if ( answerindmask != -1 && ((1L<len[answerind]); lhs = vars->lhs[answerind]; ptr = vars->CLspaces[answerind]; + printf("%d.A%d call init ocas vars weekinds[0] %p numfeatures.%d (%p %p)\n",c_to_refc(vars->c),answerind,vars->weekinds[0],numfeatures,lhs,ptr); + if ( lhs == 0 || ptr == 0 ) + continue; vars->numlhs[answerind] = 0;//init_full_A(lhs->full_A,vars->numfeatures,c,answerind,models); memset(ptr->W,0,sizeof(*ptr->W) * numfeatures); memset(ptr->oldW,0,sizeof(*ptr->oldW) * numfeatures); @@ -1262,7 +1049,7 @@ int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) { int32_t i; struct ocas_vars *vars = calloc(1,sizeof(*vars)); ocas_init(vars,c,numfeatures,starti,endi); - for (i=0; i= reftimestamp+60 ) + { + printf("tradebots_expandrawfeatures: timestamp.%u vs reftimestamp.%u\n",timestamp,reftimestamp); return(-1); + } factor = sqrt(reftimestamp - timestamp); if ( factor > 60. ) factor = 60.; @@ -185,7 +189,10 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 factor = 1.; factor = 1. / factor; if ( refhighbid == 0. || highbid == 0. || lowask == 0. || reflowask == 0. ) + { + printf("tradebots_expandrawfeatures: (%f %f) ref (%f %f)\n",highbid,lowask,refhighbid,reflowask); return(-1); + } svmfeatures[n++] = highbid; svmfeatures[n++] = (highbid / ave) - 1.; svmfeatures[n++] = lowask; @@ -247,9 +254,12 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 int32_t tradebots_calcsvmfeatures(double *svmfeatures,struct tradebot_arbpair *pair,float *rawfeatures,float *prevrawfeatures) { int32_t i,j,n,numpairfeatures,flag; struct tradebot_arbpair *ptr; uint32_t reftimestamp; - memcpy(&reftimestamp,rawfeatures,sizeof(reftimestamp)); + memcpy(&reftimestamp,&rawfeatures[TRADEBOTS_NUMANSWERS],sizeof(reftimestamp)); if ( reftimestamp == 0 ) + { + printf("reftimestamp.%u is illegal\n",reftimestamp); return(-1); + } numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,prevrawfeatures); if ( 0 && pair->numsvmfeatures != (1+pair->numpairs)*n ) { @@ -272,11 +282,14 @@ int32_t tradebots_calcpreds(float *RTpreds,struct tradebot_arbpair *pair,double { int32_t i,j,n=0; double feature,preds[TRADEBOTS_NUMANSWERS]; memset(preds,0,sizeof(preds)); - for (i=n=0; inumsvmfeatures; i++) + if ( pair->svms != 0 ) { - feature = svmfeatures[i]; - for (j=0; jsvms[n++]; + for (i=n=0; inumsvmfeatures; i++) + { + feature = svmfeatures[i]; + for (j=0; jsvms[n++]; + } } return(n); } @@ -311,8 +324,16 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) { if ( iter == 0 ) { - _xblend(&hblas[i << 1],highbid,0.5); - _xblend(&hblas[(i << 1) + 1],lowask,0.5); + if ( hblas[i << 1] == 0 ) + { + hblas[i << 1] = highbid; + hblas[(i << 1) + 1] = lowask; + } + else + { + _xblend(&hblas[i << 1],highbid,0.5); + _xblend(&hblas[(i << 1) + 1],lowask,0.5); + } } else { @@ -329,33 +350,35 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) { futurebid = hblas[ind << 1]; futureask = hblas[(ind << 1) + 1]; - } - minval = MIN(highbid,lowask); - maxval = MAX(highbid,lowask); - futuremin = MIN(futurebid,futureask); - futuremax = MAX(futurebid,futureask); - if ( futuremin > maxval ) - { - if ( futuremax < minval ) - printf("%s/%s A%d: highly volatile minmax.(%f %f) -> (%f %f) %d of %d\n",pair->base,pair->rel,j,minval,maxval,futuremin,futuremax,i,maxi); - else + minval = MIN(highbid,lowask); + maxval = MAX(highbid,lowask); + futuremin = MIN(futurebid,futureask); + futuremax = MAX(futurebid,futureask); + if ( futuremin > maxval ) { - pair->answers[j] = (futuremin - maxval); - flag++; + if ( futuremax < minval ) + printf("%s/%s A%d: highly volatile minmax.(%f %f) -> (%f %f) %d of %d\n",pair->base,pair->rel,j,minval,maxval,futuremin,futuremax,i,maxi); + else + { + pair->answers[j] = (futuremin - maxval); + flag++; + } } + else if ( futuremax < minval ) + pair->answers[j] = (futuremax - minval), flag++; + pair->answers[j] = _pairaved(futuremax,futuremin) - _pairaved(minval,maxval); + //printf("i.%d j.%d gap.%d ind.%d answer %9.6f (%f %f) -> (%f %f)\n",i,j,Tradebots_answergaps[j],ind,pair->answers[j],minval,maxval,futuremin,futuremax); } - else if ( futuremax < minval ) - pair->answers[j] = (futuremax - minval), flag++; } if ( flag != 0 ) { fseek(pair->fp,fpos,SEEK_SET); if ( fwrite(pair->answers,1,sizeof(pair->answers),pair->fp) != sizeof(pair->answers) ) printf("error writing answers for %s/%s t%u i.%d of %d\n",pair->base,pair->rel,timestamp,i,maxi); - else + else if ( 0 ) { for (j=0; janswers[i]); + printf("%9.6f ",pair->answers[j]); printf("%s/%s answers %d of %d\n",pair->base,pair->rel,i,maxi); } fseek(pair->fp,savepos,SEEK_SET); @@ -383,7 +406,9 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) hblas[i << 1] = highbid; hblas[(i << 1) + 1] = lowask; } + printf("%9.6f ",_pairaved(highbid,lowask)); } + printf("maxi.%d\n",maxi); } } if ( hblas != 0 ) @@ -406,7 +431,8 @@ double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_ fseek(pair->fp,savepos,SEEK_SET); if ( isnan(answer) != 0 ) return(0); - if ( answer > .01 ) + answer /= 10.; + /*if ( answer > .01 ) answer = .01; else if ( answer < -.01 ) answer = -.01; @@ -415,7 +441,12 @@ double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_ if ( answer > 0. ) return(1.); else if ( answer < 0. ) - return(-1.); + return(-1.);*/ + if ( answer > 0. ) + answer = sqrt(answer); + else answer = -sqrt(-answer); + *answerp = answer; + return(answer); } return(0.); } @@ -432,10 +463,13 @@ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) fseek(pair->fp,(ind-1)*sizeof(pair->rawfeatures),SEEK_SET); if ( fread(&prevrawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) && fread(&rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) { + //for (i=0; i<72; i++) + // printf("%9.6f ",rawfeatures[i]); + //printf("rawfeatures[%d]\n",ind); n = tradebots_calcsvmfeatures(svmfeatures,pair,rawfeatures,prevrawfeatures); if ( n != pair->numsvmfeatures ) { - printf("unexpected numsvmfeatures %d vs %d\n",n,pair->numsvmfeatures); + printf("unexpected numsvmfeatures refc.%d ind.%d %d vs %d\n",refc,ind,n,pair->numsvmfeatures); //return(-1); } svmf = calloc(n,sizeof(*svmf)); @@ -648,7 +682,7 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t pair->dirmasks[1] |= (1 << i); } } - printf("%12.6f %7s/%-3s %8s %14.8f %8s %14.8f spread %6.2f%% %02x:%02x %02x:%02x %d\n",volume,base,rel,bid->exchange,highbid,ask->exchange,lowask,100.*(lowask-highbid)/_pairaved(highbid,lowask),pair->dirmasks[0],pair->slopedirs[0],pair->dirmasks[1],pair->slopedirs[1],pair->counter); + //printf("%12.6f %7s/%-3s %8s %14.8f %8s %14.8f spread %6.2f%% %02x:%02x %02x:%02x %d\n",volume,base,rel,bid->exchange,highbid,ask->exchange,lowask,100.*(lowask-highbid)/_pairaved(highbid,lowask),pair->dirmasks[0],pair->slopedirs[0],pair->dirmasks[1],pair->slopedirs[1],pair->counter); //printf("BTC.(%.8f %.8f) %.8f %.8f USD.(%.4f %.4f) CNY.(%.3f %.3f)\n",pair->btcbid,pair->btcask,Pair_BTCUSD!=0?Pair_BTCUSD->highbid:0,Pair_BTCUSD!=0?Pair_BTCUSD->lowask:0,pair->usdbid,pair->usdask,pair->cnybid,pair->cnyask); } if ( highbid != 0 ) @@ -957,7 +991,7 @@ TWO_STRINGS(tradebots,gensvm,base,rel) #ifdef _WIN return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); #else - int32_t numfeatures = 532; struct tradebot_arbpair *pair; + int32_t numfeatures = 317; struct tradebot_arbpair *pair; if ( base[0] != 0 && rel[0] != 0 && (pair= tradebots_arbpair_find(base,rel)) != 0 && pair->fp != 0 ) { tradebots_calcanswers(pair); diff --git a/iguana/tests/gensvm b/iguana/tests/gensvm new file mode 100755 index 000000000..bc78fa88e --- /dev/null +++ b/iguana/tests/gensvm @@ -0,0 +1,3 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTC\",\"rel\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" From 45dfb9a8c8283f79d2e566ab1ae3752ae310038c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 01:54:41 +0200 Subject: [PATCH 320/432] test --- basilisk/tradebots_SVM.h | 14 ++++---- basilisk/tradebots_liquidity.c | 60 +++++++++++++++++++++------------- iguana/tests/gensvm | 2 +- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index 1be16dce2..dadda0b9d 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -406,10 +406,11 @@ static inline void calc_ocas_strategy(register struct ocas_vars *vars,register i { if ( (y= vars->answers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) { - if ( 0 ) + svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,vars->c,weekinds[i]); + //printf("i.%d weekind.%d starti.%d y %f %p\n",i,weekinds[i],vars->starti,y,features); + if ( 0 && features != 0 ) { double oldsum=oldW0,sum=W0; - svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,vars->c,weekinds[i]); for (j=0; jnumposcuts[answerind]+vars->numnegcuts[answerind],ptr->W,ptr->new_a); vars->add_time += (OS_milliseconds() - startmilli); //printf("done %d calc ocas_add_newcuts.A%d poscuts.%d negcuts.%d | good.%d bad.%d\n",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind],vars->good[answerind],vars->bad[answerind]); - } else inactives[answerind] = 1, printf("maxnohwm.%d\n",max_nohwm); + } else inactives[answerind] = 1;//, printf("maxnohwm.%d\n",max_nohwm); } startmilli = OS_milliseconds(); for (answerind=0; answerindweekinds[answerind] = calloc(vars->maxlen,sizeof(*vars->weekinds[answerind])); for (weekind=starti; weekind<=endi; weekind++) { - vars->features[weekind - starti] = get_features(numfeatures,c,weekind); + if ( (vars->features[weekind - starti]= get_features(numfeatures,c,weekind)) == 0 ) + continue; for (answerind=0; answerindposA[answerind]+vars->negA[answerind]) >= vars->maxlen ) @@ -1049,8 +1051,8 @@ int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) { int32_t i; struct ocas_vars *vars = calloc(1,sizeof(*vars)); ocas_init(vars,c,numfeatures,starti,endi); - for (i=0; i<10; i++) - ocas_iter(vars,100); + for (i=0; i<100; i++) + ocas_iter(vars,10); ocas_purge(vars); return(0); } diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index b6d7bee94..cb8f4e9f6 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -57,7 +57,7 @@ struct tradebot_arbpair uint8_t dirmasks[2],slopedirs[2]; char *svmpairs[TRADEBOTS_MAXPAIRS][2]; int32_t RTgood[TRADEBOTS_NUMANSWERS],RTbad[TRADEBOTS_NUMANSWERS],numrawfeatures,numsvmfeatures,numpairs; - float rawfeatures[TRADEBOTS_NUMANSWERS+64],prevrawfeatures[TRADEBOTS_NUMANSWERS+64],*svms; // svms is coeffs vector[TRADEBOTS_NUMANSWERS] + float rawfeatures[TRADEBOTS_NUMANSWERS+64],prevrawfeatures[60 * TRADEBOTS_NUMANSWERS+64],*svms; // svms is coeffs vector[TRADEBOTS_NUMANSWERS] float RTpreds[TRADEBOTS_NUMANSWERS],svmpreds[TRADEBOTS_NUMANSWERS],answers[TRADEBOTS_NUMANSWERS]; }; struct tradebot_arbpair Arbpairs[TRADEBOTS_MAXPAIRS],*Pair_NXTBTC,*Pair_BTCUSD,*Pair_BTCCNY; @@ -76,7 +76,9 @@ int32_t tradebots_calcrawfeatures(struct tradebot_arbpair *pair) { int32_t starti,i,n = 0; double ave; uint32_t timestamp; n = TRADEBOTS_NUMANSWERS; - memcpy(pair->prevrawfeatures,pair->rawfeatures,sizeof(pair->prevrawfeatures)); + for (i=59; i>0; i--) + memcpy(&pair->prevrawfeatures[i*72],&pair->prevrawfeatures[(i-1)*72],sizeof(pair->rawfeatures)); + memcpy(pair->prevrawfeatures,pair->rawfeatures,sizeof(pair->rawfeatures)); memset(pair->rawfeatures,0,sizeof(pair->rawfeatures)); if ( fabs(pair->highbid) < SMALLVAL || fabs(pair->lowask) < SMALLVAL ) return(-1); @@ -179,7 +181,7 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 timestamp = tradebots_featureset(&highbid,&lowask,&ave,&vol,bidaves,askaves,bidslopes,askslopes,rawfeatures); if ( timestamp == 0 || reftimestamp == 0 || timestamp >= reftimestamp+60 ) { - printf("tradebots_expandrawfeatures: timestamp.%u vs reftimestamp.%u\n",timestamp,reftimestamp); + //printf("tradebots_expandrawfeatures: timestamp.%u vs reftimestamp.%u\n",timestamp,reftimestamp); return(-1); } factor = sqrt(reftimestamp - timestamp); @@ -190,7 +192,7 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 factor = 1. / factor; if ( refhighbid == 0. || highbid == 0. || lowask == 0. || reflowask == 0. ) { - printf("tradebots_expandrawfeatures: (%f %f) ref (%f %f)\n",highbid,lowask,refhighbid,reflowask); + //printf("tradebots_expandrawfeatures: (%f %f) ref (%f %f)\n",highbid,lowask,refhighbid,reflowask); return(-1); } svmfeatures[n++] = highbid; @@ -243,10 +245,16 @@ int32_t tradebots_expandrawfeatures(double *svmfeatures,float *rawfeatures,uint3 svmfeatures[n++] = (askslopes[i] - bidslopes[j]); } } - if ( fabs(factor - 1.) > SMALLVAL ) + //if ( fabs(factor - 1.) > SMALLVAL ) { for (i=starti; i 0. ) + svmfeatures[i] = cbrt(svmfeatures[i]); + else svmfeatures[i] = -cbrt(-svmfeatures[i]); + } } return(n); } @@ -261,6 +269,8 @@ int32_t tradebots_calcsvmfeatures(double *svmfeatures,struct tradebot_arbpair *p return(-1); } numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,prevrawfeatures); + for (i=0; i<60; i++,n+=numpairfeatures) + tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,&prevrawfeatures[i*72]); if ( 0 && pair->numsvmfeatures != (1+pair->numpairs)*n ) { for (i=0; inumpairs; i++) // need to do lookups @@ -366,7 +376,7 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) } else if ( futuremax < minval ) pair->answers[j] = (futuremax - minval), flag++; - pair->answers[j] = _pairaved(futuremax,futuremin) - _pairaved(minval,maxval); + //pair->answers[j] = _pairaved(futuremax,futuremin) - _pairaved(minval,maxval); //printf("i.%d j.%d gap.%d ind.%d answer %9.6f (%f %f) -> (%f %f)\n",i,j,Tradebots_answergaps[j],ind,pair->answers[j],minval,maxval,futuremin,futuremax); } } @@ -406,9 +416,9 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) hblas[i << 1] = highbid; hblas[(i << 1) + 1] = lowask; } - printf("%9.6f ",_pairaved(highbid,lowask)); + //printf("%9.6f ",_pairaved(highbid,lowask)); } - printf("maxi.%d\n",maxi); + //printf("maxi.%d\n",maxi); } } if ( hblas != 0 ) @@ -438,14 +448,15 @@ double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_ answer = -.01; if ( answerp != 0 ) *answerp = answer; + */ if ( answer > 0. ) + answer = cbrt(answer); + else answer = -cbrt(-answer); + *answerp = answer; + /*if ( answer > 0. ) return(1.); else if ( answer < 0. ) return(-1.);*/ - if ( answer > 0. ) - answer = sqrt(answer); - else answer = -sqrt(-answer); - *answerp = answer; return(answer); } return(0.); @@ -453,20 +464,20 @@ double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) { - struct tradebot_arbpair *pair; long savepos; int32_t i,n; double svmfeatures[4096]; - float rawfeatures[sizeof(pair->rawfeatures)],prevrawfeatures[sizeof(pair->rawfeatures)],*svmf=0; + struct tradebot_arbpair *pair; long savepos; int32_t i,n; double svmfeatures[32768]; + float rawfeatures[sizeof(pair->rawfeatures)],prevrawfeatures[60 * sizeof(pair->rawfeatures)],*svmf=0; pair = &Arbpairs[refc]; pair->numsvmfeatures = numfeatures; - if ( pair->fp != 0 && ind > 0 ) + if ( pair->fp != 0 && ind > 61 ) { savepos = ftell(pair->fp); - fseek(pair->fp,(ind-1)*sizeof(pair->rawfeatures),SEEK_SET); - if ( fread(&prevrawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) && fread(&rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) + fseek(pair->fp,(ind-60)*sizeof(pair->rawfeatures),SEEK_SET); + if ( fread(prevrawfeatures,60,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) && fread(&rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) { + n = tradebots_calcsvmfeatures(svmfeatures,pair,rawfeatures,prevrawfeatures); //for (i=0; i<72; i++) // printf("%9.6f ",rawfeatures[i]); - //printf("rawfeatures[%d]\n",ind); - n = tradebots_calcsvmfeatures(svmfeatures,pair,rawfeatures,prevrawfeatures); + //printf("rawfeatures[%d] -> %d\n",ind,n); if ( n != pair->numsvmfeatures ) { printf("unexpected numsvmfeatures refc.%d ind.%d %d vs %d\n",refc,ind,n,pair->numsvmfeatures); @@ -483,7 +494,12 @@ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) { - return(0.); + int32_t i,nonz=0; + for (i=0; ifp != 0 ) { tradebots_calcanswers(pair); diff --git a/iguana/tests/gensvm b/iguana/tests/gensvm index bc78fa88e..b5b6625a9 100755 --- a/iguana/tests/gensvm +++ b/iguana/tests/gensvm @@ -1,3 +1,3 @@ #!/bin/bash curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTC\",\"rel\":\"USD\"}" -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" +#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" From 4330f1e8e920669fb38657be0496bcf02b884257 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 15:33:12 +0200 Subject: [PATCH 321/432] test --- basilisk/tradebots_SVM.h | 30 ++++++++----- basilisk/tradebots_liquidity.c | 82 +++++++++++++++++++++------------- iguana/dpow/dpow_network.c | 2 +- iguana/iguana777.h | 4 +- iguana/iguana_payments.c | 47 +++++++++++++++++++ iguana/m_notary | 8 ++-- 6 files changed, 125 insertions(+), 48 deletions(-) diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index dadda0b9d..3e7b566cd 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -257,10 +257,13 @@ static inline void STocas_calc_outputs(register struct ocas_vars *vars,register if ( 1 && isnan(output[i]) != 0 ) { svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,c,weekinds[i]); - for (j=0; janswers[(weekinds[i]-vars->starti)*TRADEBOTS_NUMANSWERS + answerind]) != 0.f ) { - answermag = 1.;//fabs(y); // 1.; + answermag = fabs(y); // 1.; if ( (old_output[i] * (1. - t2) + t2*output[i]) <= answermag ) //1. add_newcut_entry(vars,answerind,new_cut,i,weekinds[i],y); newoutput = (old_output[i] * (1. - t1)) + (t1 * output[i]); @@ -487,11 +490,14 @@ static inline void calc_ocas_strategy(register struct ocas_vars *vars,register i { double sum=W0; svmtype *features = vars->features[weekinds[i]-vars->starti];//get_jfp_features(vars->selector,numfeatures,vars->c,weekinds[i]); - for (j=0; j .0000001 ) - printf("numIt.%d docid.%-6d w%-6d sum %11.7f * y%2.0f %11.7f != %11.7f newoutput [%11.7f] W0 %11.7f oldW0 %11.7f\n",vars->numIt[answerind],i,weekinds[i],sum,y,sum*y,newoutput,newoutput-sum*y,W0,oldW0); - newoutput = sum*y; + if ( features != 0 ) + { + for (j=0; j .0000001 ) + printf("numIt.%d docid.%-6d w%-6d sum %11.7f * y%2.0f %11.7f != %11.7f newoutput [%11.7f] W0 %11.7f oldW0 %11.7f\n",vars->numIt[answerind],i,weekinds[i],sum,y,sum*y,newoutput,newoutput-sum*y,W0,oldW0); + newoutput = sum*y; + } } if ( newoutput <= answermag ) { @@ -881,7 +887,7 @@ static inline int ocas_iter(struct ocas_vars *vars,int max_nohwm) add_newcut_entry(vars,answerind,new_cut,i,weekinds[i],y); } } - fprintf(stderr,"skip %c.A%02d cuts +%d -%d, ",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind]); + fprintf(stderr,"skip %d.A%02d cuts +%d -%d, ",c_to_refc(vars->c),answerind,vars->numposcuts[answerind],vars->numnegcuts[answerind]); } else { @@ -1028,7 +1034,7 @@ void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t star //printf("finish A%d len.%d\n",answerind,vars->len[answerind]); lhs = vars->lhs[answerind]; ptr = vars->CLspaces[answerind]; - printf("%d.A%d call init ocas vars weekinds[0] %p numfeatures.%d (%p %p)\n",c_to_refc(vars->c),answerind,vars->weekinds[0],numfeatures,lhs,ptr); + //printf("%d.A%d call init ocas vars weekinds[0] %p numfeatures.%d (%p %p)\n",c_to_refc(vars->c),answerind,vars->weekinds[0],numfeatures,lhs,ptr); if ( lhs == 0 || ptr == 0 ) continue; vars->numlhs[answerind] = 0;//init_full_A(lhs->full_A,vars->numfeatures,c,answerind,models); diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index cb8f4e9f6..12fb15932 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -30,7 +30,7 @@ double OCAS_PLUS_INF,OCAS_NEG_INF; double Tradebots_decays[TRADEBOTS_NUMDECAYS] = { 0.5, 0.666, 0.8, 0.9, 0.95, 0.99, 0.995, 0.999 }; -int32_t Tradebots_answergaps[TRADEBOTS_NUMANSWERS] = { 5, 10, 15, 20, 30, 60, 120, 720 }; +int32_t Tradebots_answergaps[TRADEBOTS_NUMANSWERS] = { 60, 60, 120, 120, 240, 240, 720, 720 }; struct tradebot_arbentry { @@ -268,9 +268,11 @@ int32_t tradebots_calcsvmfeatures(double *svmfeatures,struct tradebot_arbpair *p printf("reftimestamp.%u is illegal\n",reftimestamp); return(-1); } - numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,prevrawfeatures); + numpairfeatures = n = tradebots_expandrawfeatures(svmfeatures,prevrawfeatures,reftimestamp,rawfeatures); + if ( n <= 0 ) + return(-1); for (i=0; i<60; i++,n+=numpairfeatures) - tradebots_expandrawfeatures(svmfeatures,rawfeatures,reftimestamp,&prevrawfeatures[i*72]); + tradebots_expandrawfeatures(&svmfeatures[n],&prevrawfeatures[i*72],reftimestamp,rawfeatures); if ( 0 && pair->numsvmfeatures != (1+pair->numpairs)*n ) { for (i=0; inumpairs; i++) // need to do lookups @@ -358,26 +360,30 @@ void tradebots_calcanswers(struct tradebot_arbpair *pair) ind = i + Tradebots_answergaps[j]; if ( ind < maxi ) { - futurebid = hblas[ind << 1]; - futureask = hblas[(ind << 1) + 1]; - minval = MIN(highbid,lowask); - maxval = MAX(highbid,lowask); - futuremin = MIN(futurebid,futureask); - futuremax = MAX(futurebid,futureask); - if ( futuremin > maxval ) + if ( (j & 1) != 0 ) + pair->answers[j] = _pairaved(futuremax,futuremin) - _pairaved(minval,maxval); + else { - if ( futuremax < minval ) - printf("%s/%s A%d: highly volatile minmax.(%f %f) -> (%f %f) %d of %d\n",pair->base,pair->rel,j,minval,maxval,futuremin,futuremax,i,maxi); - else + futurebid = hblas[ind << 1]; + futureask = hblas[(ind << 1) + 1]; + minval = MIN(highbid,lowask); + maxval = MAX(highbid,lowask); + futuremin = MIN(futurebid,futureask); + futuremax = MAX(futurebid,futureask); + if ( futuremin > maxval ) { - pair->answers[j] = (futuremin - maxval); - flag++; + if ( futuremax < minval ) + printf("%s/%s A%d: highly volatile minmax.(%f %f) -> (%f %f) %d of %d\n",pair->base,pair->rel,j,minval,maxval,futuremin,futuremax,i,maxi); + else + { + pair->answers[j] = (futuremin - maxval); + flag++; + } } + else if ( futuremax < minval ) + pair->answers[j] = (futuremax - minval), flag++; + //printf("i.%d j.%d gap.%d ind.%d answer %9.6f (%f %f) -> (%f %f)\n",i,j,Tradebots_answergaps[j],ind,pair->answers[j],minval,maxval,futuremin,futuremax); } - else if ( futuremax < minval ) - pair->answers[j] = (futuremax - minval), flag++; - //pair->answers[j] = _pairaved(futuremax,futuremin) - _pairaved(minval,maxval); - //printf("i.%d j.%d gap.%d ind.%d answer %9.6f (%f %f) -> (%f %f)\n",i,j,Tradebots_answergaps[j],ind,pair->answers[j],minval,maxval,futuremin,futuremax); } } if ( flag != 0 ) @@ -450,8 +456,8 @@ double get_yval(double *answerp,int32_t selector,int32_t ind,int32_t refc,int32_ *answerp = answer; */ if ( answer > 0. ) - answer = cbrt(answer); - else answer = -cbrt(-answer); + answer = sqrt(answer); + else answer = -sqrt(-answer); *answerp = answer; /*if ( answer > 0. ) return(1.); @@ -475,13 +481,16 @@ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) if ( fread(prevrawfeatures,60,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) && fread(&rawfeatures,1,sizeof(pair->rawfeatures),pair->fp) == sizeof(pair->rawfeatures) ) { n = tradebots_calcsvmfeatures(svmfeatures,pair,rawfeatures,prevrawfeatures); - //for (i=0; i<72; i++) + //int32_t nonz; for (i=nonz=0; i %d\n",ind,n); if ( n != pair->numsvmfeatures ) { - printf("unexpected numsvmfeatures refc.%d ind.%d %d vs %d\n",refc,ind,n,pair->numsvmfeatures); - //return(-1); + //printf("unexpected numsvmfeatures refc.%d ind.%d %d vs %d\n",refc,ind,n,pair->numsvmfeatures); + return(0); } svmf = calloc(n,sizeof(*svmf)); for (i=0; inumexchanges > sizeof(pair->exchanges)/sizeof(*pair->exchanges) ) + { + printf("data corruption pair.%p %s %s/%s numexchanges.%d\n",pair,exchange,pair->base,pair->rel,pair->numexchanges); + return(0); + } for (i=0; inumexchanges; i++) if ( strcmp(pair->exchanges[i].name,exchange) == 0 ) return(&pair->exchanges[i]); @@ -571,7 +585,7 @@ struct tradebot_arbexchange *tradebots_arbexchange_create(struct tradebot_arbpai void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t tradedir,char *base,char *rel,double price,double volume,uint32_t timestamp,double profitmargin) { - int32_t i,offset,flag; double highbid,lowask,lastbid,lastask,arbval; + int32_t i,offset,flag; double highbid,lowask,lastbid,lastask,arbval; uint32_t now; struct tradebot_arbentry *bid,*ask; struct tradebot_arbexchange *arbex; struct tradebot_arbpair *pair = 0; if ( strcmp(rel,"BTC") != 0 && strcmp(rel,"NXT") != 0 && strcmp(rel,"USD") != 0 && strcmp(rel,"CNY") != 0 ) { @@ -594,6 +608,7 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t tradebot_arbentry(&arbex->trades[offset],exchange,price,volume,timestamp,profitmargin); bid = ask = 0; pair->highbid = pair->lowask = highbid = lowask = 0.; + now = (uint32_t)time(NULL); //if ( pair->numexchanges >= 2 ) { for (i=0; inumexchanges; i++) @@ -602,12 +617,16 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t if ( arbex->trades[0].price != 0. && (highbid == 0. || arbex->trades[0].price >= highbid) ) { bid = &arbex->trades[0]; - highbid = bid->price; + if ( now > bid->timestamp+30 ) + bid->price = 0.; + else highbid = bid->price; } if ( arbex->trades[1].price != 0. && (lowask == 0. || arbex->trades[1].price <= lowask) ) { ask = &arbex->trades[1]; - lowask = ask->price; + if ( now > ask->timestamp+30 ) + ask->price = 0.; + else lowask = ask->price; } //printf("%p %s %s %f %f -> %p %p %f %f (%f %f)\n",pair,pair->base,arbex->name,arbex->trades[0].price,arbex->trades[1].price,bid,ask,highbid,lowask,pair->highbid,pair->lowask); } @@ -619,7 +638,7 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t if ( Pair_BTCCNY != 0 && pair->cnycounter != Pair_BTCCNY->counter ) flag |= 4; //printf("%s %s/%s flag.%d (%d %d) %p %p\n",exchange,base,rel,flag,pair->btccounter,Pair_NXTBTC!=0?Pair_NXTBTC->counter:-1,bid,ask); - if ( bid != 0 && ask != 0 && (fabs(bid->price - pair->highbid) > SMALLVAL || fabs(ask->price - pair->lowask) > SMALLVAL || (strcmp(pair->rel,"NXT") == 0 && flag != 0)) ) + if ( bid != 0 && ask != 0 && bid->price != 0. && ask->price != 0 && (now - bid->timestamp) < 30 && (now - ask->timestamp) < 30 && (fabs(bid->price - pair->highbid) > SMALLVAL || fabs(ask->price - pair->lowask) > SMALLVAL || (strcmp(pair->rel,"NXT") == 0 && flag != 0)) ) { pair->counter++; pair->hblavolume = volume = MIN(bid->volume,ask->volume); @@ -706,7 +725,7 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t if ( lowask != 0 ) pair->lowask = lowask; //printf(">>>>>>> %s (%s/%s) BTC %.8f %.8f v%f counter.%d btc.%d (%d)\n",exchange,pair->base,pair->rel,pair->btcbid,pair->btcask,pair->btcvol,pair->counter,pair->btccounter,Pair_NXTBTC!=0?Pair_NXTBTC->counter:-1); - if ( bid != 0 && ask != 0 && highbid > lowask && strcmp(bid->exchange,ask->exchange) != 0 && strcmp(rel,"BTC") == 0 ) + if ( bid != 0 && ask != 0 && highbid != 0. && lowask != 0. && highbid > lowask && strcmp(bid->exchange,ask->exchange) != 0 && strcmp(rel,"BTC") == 0 ) { volume = MIN(bid->volume,ask->volume); if ( volume*_pairaved(highbid,lowask) > 0.1 ) @@ -1007,7 +1026,8 @@ TWO_STRINGS(tradebots,gensvm,base,rel) #ifdef _WIN return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); #else - int32_t numfeatures = 317*61; struct tradebot_arbpair *pair; + 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); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 758e0125d..c40d7605f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -163,7 +163,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } -//nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index cd2cdd931..6ce2429b9 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -51,7 +51,9 @@ #include "nn.h" #include "bus.h" #else*/ -#ifdef __APPLE__ +//#ifdef __APPLE__ +#if defined(__APPLE__) || defined(WIN32) + #include "../crypto777/nanosrc/nn.h" #include "../crypto777/nanosrc/bus.h" #include "../crypto777/nanosrc/pubsub.h" diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 1d23f1a48..607ddb24d 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -334,6 +334,51 @@ bits256 iguana_sendrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(txid); } +uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout) +{ + char *retstr; cJSON *retjson; uint64_t interest = 0; + if ( coin->FULLNODE < 0 ) // komodod is running + { + if ( (retjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) + { + interest = jdouble(retjson,"interest") * SATOSHIDEN; + free_json(retjson); + } + } + else if ( coin->FULLNODE == 0 ) // basilisk mode -> use DEX* API + { + if ( (retstr= _dex_gettxout(myinfo,coin->symbol,txid,vout)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + interest = jdouble(retjson,"interest") * SATOSHIDEN; + free_json(retjson); + } + free(retstr); + } + } + else // we have it local + { + + } + char str[65]; printf("interest for %s.v%d %.8f\n",bits256_str(str,txid),vout,dstr(interest)); + return(interest); +} + +uint64_t iguana_interests(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) +{ + int32_t i,n; cJSON *item; uint64_t interest = 0; + if ( is_cJSON_Array(vins) != 0 && (n= cJSON_GetArraySize(vins)) > 0 ) + { + for (i=0; isymbol,"KMD") == 0 ) + total += iguana_interests(myinfo,coin,vins); if ( total < (satoshis + txfee) ) { free_json(vins); diff --git a/iguana/m_notary b/iguana/m_notary index dd0794507..cf6fdaaf0 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -4,9 +4,11 @@ rm -f ../agents/iguana *.o git pull cd secp256k1; ./m_unix; cd .. cd ../crypto777; ./m_LP; cd ../iguana -gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c -gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c -gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm +#gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -O2 -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +clang -g -Wno-deprecated -c -O2 -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +#gcc -g -fno-aggressive-loop-optimizations -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c +clang -g -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c +clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm ../agents/iguana notary & #> iguana.log 2> error.log & From beca2040defb4275cdbbb04bfd51c21cf728ccbd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 16:20:28 +0200 Subject: [PATCH 322/432] test --- iguana/iguana777.h | 3 +++ iguana/iguana_payments.c | 22 +++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 6ce2429b9..adcb2db00 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -39,6 +39,9 @@ #endif #endif +#define LOCKTIME_THRESHOLD 500000000 +#define KOMODO_INTEREST ((uint64_t)(0.05 * SATOSHIDEN)) // 5% + //#define BTC2_VERSION #define BTC2_HARDFORK_HEIGHT 444444 #define BTC2_SIGHASH_FORKID 0xcf diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 607ddb24d..9aa807dc0 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -334,9 +334,10 @@ bits256 iguana_sendrawtransaction(struct supernet_info *myinfo,struct iguana_inf return(txid); } -uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout) +uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout,uint64_t value) { - char *retstr; cJSON *retjson; uint64_t interest = 0; + char *retstr; int32_t height; cJSON *retjson; struct iguana_txid T,*tx; + int32_t minutes; uint64_t numerator,denominator,interest = 0; if ( coin->FULLNODE < 0 ) // komodod is running { if ( (retjson= dpow_gettxout(myinfo,coin,txid,vout)) != 0 ) @@ -359,9 +360,20 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b } else // we have it local { - + if ( (tx= iguana_txidfind(coin,&height,&T,txid,coin->bundlescount)) != 0 && tx->locktime >LOCKTIME_THRESHOLD ) + { + if ( (minutes= ((uint32_t)time(NULL) - 60 - tx->locktime) / 60) >= 60 ) + { + numerator = (value * KOMODO_INTEREST); + denominator = (((uint64_t)365 * 24 * 60) / minutes); + if ( denominator == 0 ) + denominator = 1; // max KOMODO_INTEREST per transfer, do it at least annually! + interest = (numerator / denominator) / SATOSHIDEN; + fprintf(stderr,"komodo_interest %lld %.8f nLockTime.%u tiptime.%u minutes.%d interest %lld %.8f (%llu / %llu)\n",(long long)value,(double)value/SATOSHIDEN,tx->locktime,(uint32_t)time(NULL),minutes,(long long)interest,(double)interest/SATOSHIDEN,(long long)numerator,(long long)denominator); + } + } } - char str[65]; printf("interest for %s.v%d %.8f\n",bits256_str(str,txid),vout,dstr(interest)); + char str[65]; printf("interest for %s.v%d %.8f %.8f\n",bits256_str(str,txid),vout,dstr(value),dstr(interest)); return(interest); } @@ -373,7 +385,7 @@ uint64_t iguana_interests(struct supernet_info *myinfo,struct iguana_info *coin, for (i=0; i Date: Fri, 6 Jan 2017 17:00:09 +0200 Subject: [PATCH 323/432] test --- iguana/main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/iguana/main.c b/iguana/main.c index 5ee0dd9fe..eccec5306 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -1560,10 +1560,8 @@ FOUR_STRINGS(SuperNET,login,handle,password,permanentfile,passphrase) if ( (str= SuperNET_encryptjson(myinfo,coin,argjson,remoteaddr,password,myinfo->permanentfile,myinfo->decryptstr == 0 ? "" : myinfo->decryptstr)) != 0 ) free(str); myinfo->expiration = (uint32_t)(time(NULL) + 3600); - printf("(%s) logged into (%s) %s %s\n",password,myinfo->myaddr.NXTADDR,myinfo->myaddr.BTC,myinfo->myaddr.BTCD); return(SuperNET_activehandle(IGUANA_CALLARGS)); } else return(clonestr("{\"error\":\"need passphrase\"}")); - printf("(%s) logged into (%s) %s %s\n",password,myinfo->myaddr.NXTADDR,myinfo->myaddr.BTC,myinfo->myaddr.BTCD); return(SuperNET_activehandle(IGUANA_CALLARGS)); } From 2bf7b29ea9585b84fb6385efab83e2ac309278bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 17:05:12 +0200 Subject: [PATCH 324/432] test --- iguana/SuperNET_keys.c | 9 --------- iguana/iguana_rpc.c | 1 - iguana/iguana_wallet.c | 2 -- 3 files changed, 12 deletions(-) diff --git a/iguana/SuperNET_keys.c b/iguana/SuperNET_keys.c index 577907b5f..9eadf21f0 100755 --- a/iguana/SuperNET_keys.c +++ b/iguana/SuperNET_keys.c @@ -84,7 +84,6 @@ bits256 SuperNET_wallet2priv(char *wallet2fname,bits256 wallethash) wallet2str[i] ^= wallethash.bytes[(i + r) % 32]; vcalc_sha256(0,wallet2priv.bytes,(void *)wallet2str,(int32_t)allocsize); free(wallet2str); - //char str[65]; printf("wallet2priv.(%s) from.(%s) crc.%u and passphrase r.%d len.%ld\n",bits256_str(str,wallet2priv),wallet2fname,crc,r,allocsize); } else if ( wallet2fname[0] != 0 ) printf("SuperNET_wallet2priv cant open (%s)\n",wallet2fname); return(wallet2priv); @@ -248,7 +247,6 @@ cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize, wallethash = SuperNET_linehash(passphrase); SuperNET_linehash(fname2fa); // maps special chars wallet2priv = SuperNET_wallet2priv(fname2fa,wallethash); - //char str[65],str2[65]; printf("(%s + %s) -> wallethash.%s 2.(%s)\n",passphrase,fname2fa,bits256_str(str,wallethash),bits256_str(str2,wallet2priv)); } first = (bits256_nonz(wallethash) != 0 && bits256_cmp(wallethash,GENESIS_PRIVKEY) != 0); second = (bits256_nonz(wallet2priv) != 0 && bits256_cmp(wallet2priv,GENESIS_PRIVKEY) != 0); @@ -259,7 +257,6 @@ cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize, wallet2shared = SuperNET_wallet2shared(wallethash,wallet2priv); wallet2pub = curve25519(wallet2shared,curve25519_basepoint9()); sprintf(destfname,"%s/%s",GLOBAL_CONFSDIR,bits256_str(str,wallet2pub)); - //printf("fname.(%s) wallet2pub.%s < [%s, %s]\n",destfname,bits256_str(str,wallet2pub),passphrase,fname2fa); if ( (confstr= OS_filestr(&allocsize,destfname)) != 0 ) { if ( (filejson= cJSON_Parse(confstr)) != 0 ) @@ -305,12 +302,9 @@ int32_t _SuperNET_encryptjson(struct supernet_info *myinfo,char *destfname,char wallethash = SuperNET_linehash(passphrase); SuperNET_linehash(fname2fa); // maps special chars wallet2priv = SuperNET_wallet2priv(fname2fa,wallethash); - //char str2[65]; printf("ENCRYPT.[%s %s] (%s) 2.%s\n",passphrase,fname2fa,bits256_str(str,wallethash),bits256_str(str2,wallet2priv)); wallet2shared = SuperNET_wallet2shared(wallethash,wallet2priv); wallet2pub = curve25519(wallet2shared,curve25519_basepoint9()); sprintf(destfname,"%s/%s",GLOBAL_CONFSDIR,bits256_str(str,wallet2pub)); - //printf("SAVE ARGJSON.(%s) [%s, %s] -> destfname.(%s)\n",jprint(argjson,0),passphrase,fname2fa,destfname); - //printf("shared.%llx -> pub.%s\n",(long long)wallet2shared.txid,bits256_str(str,wallet2pub)); SuperNET_savejsonfile(myinfo,destfname,wallethash,wallet2pub,argjson); return(0); } @@ -375,7 +369,6 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) passphrase[0] = fname2fa[0] = 0; wallethash = wallet2priv = GENESIS_PRIVKEY; coinargs = SuperNET_parsemainargs(myinfo,&wallethash,&wallet2priv,argjsonstr); - //printf("wallethash.%s 2.(%s)\n",bits256_str(str,wallethash),bits256_str(str2,wallet2priv)); if ( (msgjson= SuperNET_decryptedjson(destfname,passphrase,sizeof(passphrase),wallethash,fname2fa,sizeof(fname2fa),wallet2priv)) != 0 ) { SuperNET_parsemyinfo(myinfo,msgjson); @@ -395,9 +388,7 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr) jaddbits256(json,"persistent_pub",myinfo->myaddr.persistent); OS_randombytes((void *)&r,sizeof(r)); jadd64bits(json,"rand",r); - //printf("call SuperNET_encryptjson\n"); _SuperNET_encryptjson(myinfo,destfname,passphrase,sizeof(passphrase),fname2fa,sizeof(fname2fa),json); - //printf("save.(%s)\n",jprint(json,0)); free_json(json); } if ( myinfo->ipaddr[0] == 0 ) diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index cc5eaf831..c36a6bce7 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -52,7 +52,6 @@ char *sglue(GLUEARGS,char *agent,char *method) { if ( (wallet= iguana_walletjson(myinfo)) != 0 ) { - //printf("WALLETSTR.(%s)\n",jprint(wallet,0)); if ( (walletstr= SuperNET_login(myinfo,coin,json,remoteaddr,myinfo->handle,myinfo->secret,myinfo->permanentfile,0)) != 0 ) { free(walletstr); diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index cfa8a8d4e..14c8aadc6 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1505,12 +1505,10 @@ TWOSTRINGS_AND_INT(bitcoinrpc,importprivkey,wif,account,rescan) { free(retstr); retstr = myinfo->decryptstr, myinfo->decryptstr = 0; - //printf("DECRYPT.(%s)\n",retstr); iguana_waddresscalc(myinfo,coin->chain->pubtype,coin->chain->wiftype,waddr,privkey); iguana_waccountswitch(myinfo,coin,account,waddr->coinaddr,0); waddr->privkey = privkey; retjson = iguana_walletadd(myinfo,0,coin,retstr,account,waddr,0,0); - //printf("AFTERADD.(%s)\n",jprint(retjson,0)); if ( retstr != 0 ) scrubfree(retstr); return(jprint(retjson,1)); From 29314923f5ad8ba64537631a3f3f35f0da5e57d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 21:19:38 +0200 Subject: [PATCH 325/432] test --- basilisk/tradebots_liquidity.c | 89 ++++++++++++++++++++++++++++++++++ iguana/dpow/dpow_tx.c | 6 +-- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 12fb15932..f2d8a1b5d 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -511,6 +511,95 @@ double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures return(W0); } +/*double load_model(register int *posAp,register int *negAp,register double *W,register int refc,register int answerind,register int numfeatures) +{ + int j; + FILE *fp; + double perc; + char modelname[512]; +#ifdef __APPLE__ + sprintf(modelname,"/Volumes/SSD/models/%s_%d.A%c%c",CONTRACTS[refc],numfeatures,(answerind/10)+'0',(answerind%10)+'0'); +#else + sprintf(modelname,"/media/raptor/models/%s_%d.A%c%c",CONTRACTS[refc],numfeatures,(answerind/10)+'0',(answerind%10)+'0'); +#endif + if ( (fp= fopen(modelname,"rb")) != 0 ) + { + //printf("load file\n"); + j = (int)fread(W,sizeof(*W),numfeatures+1,fp); + //fread(&W0,1,sizeof(W0),fp); + if ( fread(&perc,1,sizeof(perc),fp) == sizeof(perc) ) + j++; + if ( fread(posAp,1,sizeof(*posAp),fp) == sizeof(*posAp) ) + j++; + if ( fread(negAp,1,sizeof(*negAp),fp) == sizeof(*negAp) ) + j++; + fclose(fp); + //printf("loaded %s bias %9.6f | %5.2f%%\n",modelname,W[numfeatures],perc); + return(perc); + } +#ifndef DISABLE_EXISTINGMODEL + else if ( 0 ) + { + sprintf(modelname,"/media/raptor/models/%s_%d.A%c%c",CONTRACTS[0],numfeatures,(answerind/10)+'0',(answerind%10)+'0'); + if ( (fp= fopen(modelname,"rb")) != 0 ) + { + j = (int)fread(W,sizeof(*W),numfeatures+1,fp); + if ( fread(&perc,1,sizeof(perc),fp) == sizeof(perc) ) + j++; + if ( fread(posAp,1,sizeof(*posAp),fp) == sizeof(*posAp) ) + j++; + if ( fread(negAp,1,sizeof(*negAp),fp) == sizeof(*negAp) ) + j++; + fclose(fp); + printf("Using backup model for %s loaded %s bias %9.6f | %5.2f%%\n",CONTRACTS[refc],modelname,W[numfeatures],perc); + return(perc * .9); + } + } +#endif + else printf("couldn't load (%s)\n",modelname); + return(-1); +} + +int save_model(int refc,int answerind,double *W,int numfeatures,double W0,double perc,int posA,int negA) +{ + FILE *fp; + char modelname[512]; + sprintf(modelname,"/media/raptor/models/%s_%d.A%c%c",CONTRACTS[refc],numfeatures,(answerind/10)+'0',(answerind%10)+'0'); + //printf("modelname.%s m.%p predabs %f\n",modelname,m,predabs); + if ( (fp= fopen(modelname,"wb")) != 0 ) + { + //printf("save %s %.f%% posA.%d negA.%d\n",modelname,perc,posA,negA); + fwrite(W,sizeof(*W),numfeatures,fp); + fwrite(&W0,1,sizeof(W0),fp); + fwrite(&perc,1,sizeof(perc),fp); + fwrite(&posA,1,sizeof(posA),fp); + fwrite(&negA,1,sizeof(negA),fp); + fclose(fp); + return(0); + } + return(-1); +} + +double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) +{ + double fileperc,perc = (100. * (double)(len - bad)) / len; +#ifndef DISABLE_EXISTINGMODEL + int _posA,_negA; + double tmpW[MAX_OCAS_FEATURES+2],fileperc; + if ( (fileperc= load_model(&_posA,&_negA,tmpW,refc_to_c(refc),answerind,numfeatures)) > perc ) + { + if ( (_posA+_negA) != 0 && _posA >= posA && _negA >= negA ) + { + memcpy(W,tmpW,sizeof(*W)*numfeatures); + printf("%s.A%02d numfeatures.%d posA.%d negA.%d saved model %f is better than %f +A%d -A%d\n",CONTRACTS[refc],answerind,numfeatures,_posA,_negA,fileperc,perc,posA,negA); + return(tmpW[numfeatures]); + } + } +#endif + save_model(refc,answerind,W,numfeatures,W0,perc,posA,negA); + return(W0); +}*/ + #ifndef _WIN #include "tradebots_SVM.h" #endif diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 4c141cd5d..355bab418 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -565,13 +565,13 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo if ( bestk >= 0 && bp->state != 0xffffffff && coin != 0 ) { signedtxid = dpow_notarytx(bp->signedtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,1,src_or_dest,pubkeys,numratified); - //printf("src_or_dest.%d bestk.%d %llx %s numsigs.%d signedtx.(%s)\n",src_or_dest,bestk,(long long)bestmask,bits256_str(str,signedtxid),numsigs,bp->signedtx); + printf("src_or_dest.%d bestk.%d %llx %s numsigs.%d signedtx.(%s)\n",src_or_dest,bestk,(long long)bestmask,bits256_str(str,signedtxid),numsigs,bp->signedtx); bp->state = 1; if ( bits256_nonz(signedtxid) != 0 && numsigs == bp->minsigs ) { if ( (retstr= dpow_sendrawtransaction(myinfo,coin,bp->signedtx)) != 0 ) { - //printf("sendrawtransaction.(%s)\n",retstr); + printf("sendrawtransaction.(%s)\n",retstr); if ( is_hexstr(retstr,0) == sizeof(txid)*2 ) { decode_hex(txid.bytes,sizeof(txid),retstr); @@ -594,7 +594,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo printf("complete statemachine.%s ht.%d state.%d (%x %x)\n",coin->symbol,bp->height,bp->state,bp->hashmsg.uints[0],txid.uints[0]); } } else printf("sendtxid mismatch got %s instead of %s\n",bits256_str(str,txid),bits256_str(str2,signedtxid)); - } + } else printf("dpow_sigscheck: mismatched txid.%s vs %s\n",bits256_str(str,txid),retstr); free(retstr); retstr = 0; } From 71be212c61f3bbb33d5e926fb8c16ffb7b439028 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 6 Jan 2017 23:09:47 +0200 Subject: [PATCH 326/432] test --- iguana/dpow/dpow_tx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 355bab418..20052c557 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -565,13 +565,13 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo if ( bestk >= 0 && bp->state != 0xffffffff && coin != 0 ) { signedtxid = dpow_notarytx(bp->signedtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,1,src_or_dest,pubkeys,numratified); - printf("src_or_dest.%d bestk.%d %llx %s numsigs.%d signedtx.(%s)\n",src_or_dest,bestk,(long long)bestmask,bits256_str(str,signedtxid),numsigs,bp->signedtx); + //printf("src_or_dest.%d bestk.%d %llx %s numsigs.%d signedtx.(%s)\n",src_or_dest,bestk,(long long)bestmask,bits256_str(str,signedtxid),numsigs,bp->signedtx); bp->state = 1; if ( bits256_nonz(signedtxid) != 0 && numsigs == bp->minsigs ) { if ( (retstr= dpow_sendrawtransaction(myinfo,coin,bp->signedtx)) != 0 ) { - printf("sendrawtransaction.(%s)\n",retstr); + //printf("sendrawtransaction.(%s)\n",retstr); if ( is_hexstr(retstr,0) == sizeof(txid)*2 ) { decode_hex(txid.bytes,sizeof(txid),retstr); @@ -594,7 +594,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo printf("complete statemachine.%s ht.%d state.%d (%x %x)\n",coin->symbol,bp->height,bp->state,bp->hashmsg.uints[0],txid.uints[0]); } } else printf("sendtxid mismatch got %s instead of %s\n",bits256_str(str,txid),bits256_str(str2,signedtxid)); - } else printf("dpow_sigscheck: mismatched txid.%s vs %s\n",bits256_str(str,txid),retstr); + } //else printf("dpow_sigscheck: mismatched txid.%s vs %s\n",bits256_str(str,txid),retstr); free(retstr); retstr = 0; } From 7f85d72ac985393be87610cc34731209424d0511 Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Sat, 7 Jan 2017 02:38:22 -0500 Subject: [PATCH 327/432] added makefile and preprocessor flag for static nanomsg library Signed-off-by: fadedreamz --- OSlibs/linux/x86_64/libnanomsg-static.a | Bin 0 -> 793310 bytes crypto777/m_LP_StaticNanoMsg | 30 ++++++++++++++++++++++++ iguana/iguana777.h | 3 +-- iguana/m_LP_StaticNanoMsg | 12 ++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 OSlibs/linux/x86_64/libnanomsg-static.a create mode 100755 crypto777/m_LP_StaticNanoMsg create mode 100755 iguana/m_LP_StaticNanoMsg diff --git a/OSlibs/linux/x86_64/libnanomsg-static.a b/OSlibs/linux/x86_64/libnanomsg-static.a new file mode 100644 index 0000000000000000000000000000000000000000..064e32591e26f3db24d42dc2200d99a3b2034eb2 GIT binary patch literal 793310 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≧5o z7UCT4bINhx{=g39p}w5~H+}!8Jk)p4;YfX-{v7Th#97}XiL<_MBz}g-v-`-ϥi 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 abib!LI7Ef{lNHLpmjy$3E~tO7nfX6|skZe1 literal 0 HcmV?d00001 diff --git a/crypto777/m_LP_StaticNanoMsg b/crypto777/m_LP_StaticNanoMsg new file mode 100755 index 000000000..f6487bc1d --- /dev/null +++ b/crypto777/m_LP_StaticNanoMsg @@ -0,0 +1,30 @@ +# Very basic makefile for compiling iguana in Linux with StaticNanoMsg +# derived from m_LP (used to compile iguana for linux) +# author: fadedreamz + +SRCS=$(wildcard *.c) +SRCS+=$(wildcard jpeg/*.c) +SRCS+=$(wildcard jpeg/unix/*.c) + +OBJS=$(SRCS:%.c=%.o) + +INCLUDE_DIRS+=-I/usr/lib/x86_64-linux-gnu/curl +PREPROCESSORS+=-DLIQUIDITY_PROVIDER=1 -DUSE_STATIC_NANOMSG + +CFLAGS+=-O2 $(PREPROCESSORS) $(INCLUDE_DIRS) + +update_repo: + git pull + +clean: + -rm $(OBJS) + +all: update_repo $(OBJS) static + @echo ' ================' + @echo '| crypto777 [OK] |' + @echo ' ================' + +static: $(OBJS) + ar rc ../agents/libcrypto777.a $(OBJS) + +.PHONY: update_repo clean all static \ No newline at end of file diff --git a/iguana/iguana777.h b/iguana/iguana777.h index adcb2db00..2c74858b5 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -55,8 +55,7 @@ #include "bus.h" #else*/ //#ifdef __APPLE__ -#if defined(__APPLE__) || defined(WIN32) - +#if defined(__APPLE__) || defined(WIN32) || defined(USE_STATIC_NANOMSG) #include "../crypto777/nanosrc/nn.h" #include "../crypto777/nanosrc/bus.h" #include "../crypto777/nanosrc/pubsub.h" diff --git a/iguana/m_LP_StaticNanoMsg b/iguana/m_LP_StaticNanoMsg new file mode 100755 index 000000000..b88e05e45 --- /dev/null +++ b/iguana/m_LP_StaticNanoMsg @@ -0,0 +1,12 @@ +#!/bin/bash +#./configure --enable-endomorphism --enable-module-ecdh --enable-module-schnorr --enable-module-rangeproof --enable-experimental --enable-module_recovery +rm -f ../agents/iguana *.o +git pull +cd secp256k1; ./m_unix; cd .. +cd ../crypto777; make -f m_LP_StaticNanoMsg all; make -f m_LP_StaticNanoMsg clean; cd ../iguana + +clang -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 -DUSE_STATIC_NANOMSG *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c +clang -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 -DUSE_STATIC_NANOMSG main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c + + +clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a ../OSlibs/linux/$(uname -m)/libnanomsg-static.a -lcurl -lssl -lcrypto -lpthread -lz -lm -lanl -lrt -lnsl From ec2c6ceed213f0c7f1ab3c69847262961e698058 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 14:11:48 +0200 Subject: [PATCH 328/432] test --- basilisk/basilisk.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index e1b99e81e..f228e79de 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -868,7 +868,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 i,iter; double startmilli,endmilli; //struct dpow_info *dp; iter = 0; relay = iguana_coinfind("RELAY"); printf("start basilisk loop\n"); @@ -891,19 +891,21 @@ void basilisks_loop(void *arg) } else if ( myinfo->numdpows > 1 ) { - dp = &myinfo->DPOWS[counter % myinfo->numdpows]; + /*dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) - iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 10; + iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]);*/ + for (i=0; inumdpows; i++) + iguana_dPoWupdate(myinfo,&myinfo->DPOWS[i]); + endmilli = startmilli + 300; } } else { dex_updateclient(myinfo); if ( myinfo->IAMLP != 0 ) - endmilli = startmilli + 1000; - else endmilli = startmilli + 2000; + endmilli = startmilli + 500; + else endmilli = startmilli + 1000; } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); From 17ad50034a75cdb909ed7d4931d98f34f04893af Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 15:30:59 +0200 Subject: [PATCH 329/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/iguana_notary.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index fc03913fa..bafe9701e 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -412,7 +412,7 @@ void dpow_statemachinestart(void *ptr) extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } - sleep(5); + sleep(3); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { if ( bp->isratify == 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index f0466aea5..3f0dcb360 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -151,7 +151,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - //fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From a66ba1c1baf870de6c0dadf56de2db164f12c60c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 15:35:47 +0200 Subject: [PATCH 330/432] test --- basilisk/basilisk.c | 3 ++- iguana/iguana_notary.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index f228e79de..bf552c280 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -909,9 +909,10 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); + printf("finished waiting\n"); iter++; } } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3f0dcb360..a7945910c 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -169,7 +169,11 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->srctx,&dp->numsrctx,src)) != dp->last.blockhash.height && height >= 0 ) { if ( strcmp(dp->dest,"KMD") == 0 ) + { + fprintf(stderr,"[I"); dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); + fprintf(stderr,"] "); + } char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->dest,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); if ( dp->lastheight == 0 ) dp->lastheight = height-1; From ec406ad66c81305a502e18b55958655c5999d820 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 15:49:17 +0200 Subject: [PATCH 331/432] test --- basilisk/basilisk.c | 13 ++++++------- iguana/dpow/dpow_rpc.c | 2 +- iguana/iguana_notary.c | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index bf552c280..dfef0135f 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -868,7 +868,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 i,iter; double startmilli,endmilli; //struct dpow_info *dp; + struct iguana_info *relay; struct supernet_info *myinfo = arg; int32_t i,iter; double startmilli,endmilli; struct dpow_info *dp; iter = 0; relay = iguana_coinfind("RELAY"); printf("start basilisk loop\n"); @@ -877,6 +877,7 @@ void basilisks_loop(void *arg) if ( relay == 0 ) relay = iguana_coinfind("RELAY"); startmilli = OS_milliseconds(); + endmilli = startmilli + 1000; basilisk_issued_purge(myinfo,600000); basilisk_p2pQ_process(myinfo,777); if ( myinfo->IAMNOTARY != 0 ) @@ -887,17 +888,15 @@ void basilisks_loop(void *arg) if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 50; + endmilli = startmilli + 2500; } else if ( myinfo->numdpows > 1 ) { - /*dp = &myinfo->DPOWS[counter % myinfo->numdpows]; + dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) - iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]);*/ - for (i=0; inumdpows; i++) - iguana_dPoWupdate(myinfo,&myinfo->DPOWS[i]); - endmilli = startmilli + 300; + iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); + endmilli = startmilli + 100; } } else diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 8509397b5..87cee802a 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -1039,7 +1039,7 @@ int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int3 else { //printf("error from %s\n",coin->symbol); - sleep(3); + usleep(100000); } return(height); } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index a7945910c..54e55d184 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -151,7 +151,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + //fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); @@ -172,7 +172,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { fprintf(stderr,"[I"); dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); - fprintf(stderr,"] "); + fprintf(stderr," %d] ",dp->SRCHEIGHT); } char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->dest,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); if ( dp->lastheight == 0 ) From 36d817e5f2db965a1b679811b1b9d04980417007 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 15:56:41 +0200 Subject: [PATCH 332/432] test --- basilisk/basilisk.c | 6 +++--- iguana/dpow/dpow_rpc.c | 10 +++++----- iguana/iguana_notary.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index dfef0135f..43ce405f6 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -868,7 +868,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 i,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"); @@ -908,10 +908,10 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); - printf("finished waiting\n"); + //printf("finished waiting\n"); iter++; } } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 87cee802a..7338ebd6d 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -1001,7 +1001,7 @@ int32_t dpow_issuer_block(struct dpow_info *dp,struct iguana_info *coin,int32_t int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int32_t height,uint32_t *isrealtimep) { - char *retstr; int32_t i,kmdheight; cJSON *infoobj,*result; uint16_t port = coin->chain->rpcport; + char *retstr; int32_t i,currentheight=0; cJSON *infoobj,*result; uint16_t port = coin->chain->rpcport; if ( height <= 0 ) height = 1; *isrealtimep = 0; @@ -1009,9 +1009,9 @@ int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int3 { if ( (infoobj= cJSON_Parse(retstr)) != 0 ) { - if ( (result= jobj(infoobj,(char *)"result")) != 0 && (kmdheight= jint(result,(char *)"blocks")) != 0 ) + if ( (result= jobj(infoobj,(char *)"result")) != 0 && (currentheight= jint(result,(char *)"blocks")) != 0 ) { - for (i=0; i<1000 && height<=kmdheight; i++,height++) + for (i=0; i<30 && height<=currentheight; i++,height++) { /*fprintf(stderr,"%s.%d ",coin->symbol,height); if ( (height % 10) == 0 ) @@ -1028,7 +1028,7 @@ int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int3 } usleep(10000); } - if ( height >= kmdheight ) + if ( height >= currentheight ) *isrealtimep = (uint32_t)time(NULL); } free_json(infoobj); @@ -1038,7 +1038,7 @@ int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int3 } else { - //printf("error from %s\n",coin->symbol); + printf("error from %s height.%d currentheight.%d\n",coin->symbol,height,currentheight); usleep(100000); } return(height); diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 54e55d184..b34ac7ff7 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -170,7 +170,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { if ( strcmp(dp->dest,"KMD") == 0 ) { - fprintf(stderr,"[I"); + fprintf(stderr,"[I "); dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); fprintf(stderr," %d] ",dp->SRCHEIGHT); } From e3d14c573b6a8f827c4e9592312690fb7c88ca79 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:02:45 +0200 Subject: [PATCH 333/432] test --- iguana/iguana_notary.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index b34ac7ff7..3ffb54ee0 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -77,6 +77,8 @@ void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t he } printf("%s/%s src ht.%d dest.%u nonz.%d %s minsigs.%d\n",dp->symbol,dp->dest,checkpoint.blockhash.height,dp->destupdated,bits256_nonz(checkpoint.blockhash.hash),bits256_str(str,dp->last.blockhash.hash),minsigs); dpow_fifoupdate(myinfo,dp->srcfifo,dp->last); + if ( dp->SRCREALTIME == 0 && strcmp(dp->dest,"KMD") == 0 ) + return; if ( bits256_nonz(checkpoint.blockhash.hash) != 0 && (checkpoint.blockhash.height % freq) == 0 ) { ptrs = calloc(1,sizeof(void *)*5 + sizeof(struct dpow_checkpoint)); From 691709293066890d60978dcd677db6ff5c6273f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:10:43 +0200 Subject: [PATCH 334/432] test --- basilisk/basilisk.c | 4 ++-- iguana/iguana_notary.c | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 43ce405f6..9d2389a90 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -908,10 +908,10 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); while ( OS_milliseconds() < endmilli ) usleep(10000); - //printf("finished waiting\n"); + printf("finished waiting\n"); iter++; } } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3ffb54ee0..81b260cff 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -153,7 +153,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - //fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); @@ -176,7 +176,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); fprintf(stderr," %d] ",dp->SRCHEIGHT); } - char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->dest,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); + char str[65]; printf("[%s].%d %s %s height.%d vs last.%d\n",dp->dest,dp->SRCHEIGHT,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); if ( dp->lastheight == 0 ) dp->lastheight = height-1; if ( height < dp->last.blockhash.height ) @@ -206,6 +206,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } } //else printf("error getchaintip for %s\n",dp->symbol); } else printf("iguana_dPoWupdate missing src.(%s) %p or dest.(%s) %p\n",dp->symbol,src,dp->dest,dest); + fprintf(stderr,"done.%s\n",dp->symbol); } void dpow_addresses() From f72e5bad8d2037c040cd0b60987439a40a9073a9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:14:49 +0200 Subject: [PATCH 335/432] test --- basilisk/basilisk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 9d2389a90..a8cd19aad 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -888,7 +888,7 @@ void basilisks_loop(void *arg) if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 2500; + endmilli = startmilli + 100; } else if ( myinfo->numdpows > 1 ) { @@ -896,7 +896,7 @@ void basilisks_loop(void *arg) iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); - endmilli = startmilli + 100; + endmilli = startmilli + 30; } } else @@ -908,10 +908,10 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) basilisk_requests_poll(myinfo); - printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,OS_milliseconds()); + printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) usleep(10000); - printf("finished waiting\n"); + printf("finished waiting numdpow.%d\n",myinfo->numdpows); iter++; } } From 3ca575908dc24e9cad050ce8aa6f83e68b175baf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:24:56 +0200 Subject: [PATCH 336/432] test --- basilisk/basilisk.c | 14 ++++++++++++++ iguana/dpow/dpow_network.c | 2 +- iguana/iguana_notary.c | 9 ++++----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index a8cd19aad..b2e41a367 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -878,13 +878,20 @@ void basilisks_loop(void *arg) relay = iguana_coinfind("RELAY"); startmilli = OS_milliseconds(); endmilli = startmilli + 1000; + fprintf(stderr,"A "); basilisk_issued_purge(myinfo,600000); + fprintf(stderr,"B "); basilisk_p2pQ_process(myinfo,777); + fprintf(stderr,"C "); if ( myinfo->IAMNOTARY != 0 ) { if ( relay != 0 ) + { + fprintf(stderr,"D "); basilisk_ping_send(myinfo,relay); + } counter++; + fprintf(stderr,"E "); if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); @@ -895,19 +902,26 @@ void basilisks_loop(void *arg) dp = &myinfo->DPOWS[counter % myinfo->numdpows]; iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) + { + fprintf(stderr,"F "); iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); + } endmilli = startmilli + 30; } } else { + fprintf(stderr,"G "); dex_updateclient(myinfo); if ( myinfo->IAMLP != 0 ) endmilli = startmilli + 500; else endmilli = startmilli + 1000; } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) + { + fprintf(stderr,"H "); basilisk_requests_poll(myinfo); + } printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) usleep(10000); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index c40d7605f..aa803d1e8 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1206,7 +1206,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 && num < 100 ) + while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 && num < 1000 ) { if ( size > 0 ) { diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 81b260cff..d11e621dc 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -144,16 +144,15 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { - int32_t i,height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - for (i=0; i<3; i++) + int32_t height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; + if ( strcmp(dp->symbol,"KMD") == 0 ) { - if ( (num= dpow_nanomsg_update(myinfo)) <= 0 ) - break; + num = dpow_nanomsg_update(myinfo); //fprintf(stderr,"%d ",num); } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"i.%d dp.%p dPoWupdate (%s -> %s)\n",i,dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From 79026df124bfd69f292d7eaeba585391f49b58f6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:30:18 +0200 Subject: [PATCH 337/432] test --- basilisk/basilisk.c | 20 ++++++++++---------- iguana/dpow/dpow_rpc.c | 2 +- iguana/iguana_notary.c | 7 +++---- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index b2e41a367..0c7651db2 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -878,20 +878,20 @@ void basilisks_loop(void *arg) relay = iguana_coinfind("RELAY"); startmilli = OS_milliseconds(); endmilli = startmilli + 1000; - fprintf(stderr,"A "); + //fprintf(stderr,"A "); basilisk_issued_purge(myinfo,600000); - fprintf(stderr,"B "); + //fprintf(stderr,"B "); basilisk_p2pQ_process(myinfo,777); - fprintf(stderr,"C "); + //fprintf(stderr,"C "); if ( myinfo->IAMNOTARY != 0 ) { if ( relay != 0 ) { - fprintf(stderr,"D "); + //fprintf(stderr,"D "); basilisk_ping_send(myinfo,relay); } counter++; - fprintf(stderr,"E "); + //fprintf(stderr,"E "); if ( myinfo->numdpows == 1 ) { iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); @@ -903,7 +903,7 @@ void basilisks_loop(void *arg) iguana_dPoWupdate(myinfo,dp); if ( (counter % myinfo->numdpows) != 0 ) { - fprintf(stderr,"F "); + //fprintf(stderr,"F "); iguana_dPoWupdate(myinfo,&myinfo->DPOWS[0]); } endmilli = startmilli + 30; @@ -911,7 +911,7 @@ void basilisks_loop(void *arg) } else { - fprintf(stderr,"G "); + //fprintf(stderr,"G "); dex_updateclient(myinfo); if ( myinfo->IAMLP != 0 ) endmilli = startmilli + 500; @@ -919,13 +919,13 @@ void basilisks_loop(void *arg) } if ( myinfo->expiration != 0 && (myinfo->dexsock >= 0 || myinfo->IAMLP != 0 || myinfo->DEXactive > time(NULL)) ) { - fprintf(stderr,"H "); + //fprintf(stderr,"H "); basilisk_requests_poll(myinfo); } - printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); + //printf("RELAYID.%d endmilli %f vs now %f\n",myinfo->NOTARY.RELAYID,endmilli,startmilli); while ( OS_milliseconds() < endmilli ) usleep(10000); - printf("finished waiting numdpow.%d\n",myinfo->numdpows); + //printf("finished waiting numdpow.%d\n",myinfo->numdpows); iter++; } } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 7338ebd6d..0238df031 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -1011,7 +1011,7 @@ int32_t dpow_issuer_iteration(struct dpow_info *dp,struct iguana_info *coin,int3 { if ( (result= jobj(infoobj,(char *)"result")) != 0 && (currentheight= jint(result,(char *)"blocks")) != 0 ) { - for (i=0; i<30 && height<=currentheight; i++,height++) + for (i=0; i<100 && height<=currentheight; i++,height++) { /*fprintf(stderr,"%s.%d ",coin->symbol,height); if ( (height % 10) == 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index d11e621dc..56576ebb7 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -152,7 +152,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); @@ -171,9 +171,9 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { if ( strcmp(dp->dest,"KMD") == 0 ) { - fprintf(stderr,"[I "); + //fprintf(stderr,"[I "); dp->SRCHEIGHT = dpow_issuer_iteration(dp,src,dp->SRCHEIGHT,&dp->SRCREALTIME); - fprintf(stderr," %d] ",dp->SRCHEIGHT); + //fprintf(stderr," %d] ",dp->SRCHEIGHT); } char str[65]; printf("[%s].%d %s %s height.%d vs last.%d\n",dp->dest,dp->SRCHEIGHT,dp->symbol,bits256_str(str,blockhash),height,dp->last.blockhash.height); if ( dp->lastheight == 0 ) @@ -205,7 +205,6 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } } //else printf("error getchaintip for %s\n",dp->symbol); } else printf("iguana_dPoWupdate missing src.(%s) %p or dest.(%s) %p\n",dp->symbol,src,dp->dest,dest); - fprintf(stderr,"done.%s\n",dp->symbol); } void dpow_addresses() From b702320e98829361796b9774bf1ca0af0de8c8d1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:44:30 +0200 Subject: [PATCH 338/432] test --- iguana/iguana_notary.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 56576ebb7..996fb270b 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -158,7 +158,9 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { - char str[65]; printf("[%s] %s %s height.%d vs last.%d\n",dp->symbol,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); + char str[65]; + if ( height != dp->destchaintip.blockhash.height+1 ) + printf("[%s].%d %s %s height.%d vs last.%d\n",dp->symbol,dp->SRCHEIGHT,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { printf("iguana_dPoWupdate dest.%s reorg detected %d vs %d\n",dp->dest,height,dp->destchaintip.blockhash.height); From ef59c3f504b4722aa627e79c19f1999a9dbdc6ab Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:45:28 +0200 Subject: [PATCH 339/432] test --- iguana/dpow/dpow_fsm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index bafe9701e..edaa8d22c 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -412,7 +412,7 @@ void dpow_statemachinestart(void *ptr) extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } - sleep(3); + sleep(13); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) { if ( bp->isratify == 0 ) From 9cce7bab36910f9d907390708e40353bbf9cef55 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:46:39 +0200 Subject: [PATCH 340/432] test --- iguana/dpow/dpow_tx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 20052c557..79559c10f 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -594,7 +594,12 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo printf("complete statemachine.%s ht.%d state.%d (%x %x)\n",coin->symbol,bp->height,bp->state,bp->hashmsg.uints[0],txid.uints[0]); } } else printf("sendtxid mismatch got %s instead of %s\n",bits256_str(str,txid),bits256_str(str2,signedtxid)); - } //else printf("dpow_sigscheck: mismatched txid.%s vs %s\n",bits256_str(str,txid),retstr); + } + else + { + bp->state = 0xffffffff; + printf("dpow_sigscheck: mismatched txid.%s vs %s\n",bits256_str(str,txid),retstr); + } free(retstr); retstr = 0; } From 79116094c38d129bfee0b5db380899090c4408d7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 16:52:44 +0200 Subject: [PATCH 341/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 996fb270b..645321ae6 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -159,7 +159,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { char str[65]; - if ( height != dp->destchaintip.blockhash.height+1 ) + if ( strcmp(dp->symbol,"KMD") == 0 || height != dp->destchaintip.blockhash.height+1 ) printf("[%s].%d %s %s height.%d vs last.%d\n",dp->symbol,dp->SRCHEIGHT,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { From b9e5d7105218946efac48e6fcad29adb6778ecaf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 18:12:20 +0200 Subject: [PATCH 342/432] test --- basilisk/tradebots_liquidity.c | 45 +++++++++++++++++----------------- iguana/iguana777.c | 2 +- iguana/iguana_notary.c | 4 +-- iguana/main.c | 1 + iguana/tests/arbinit | 2 +- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index f2d8a1b5d..4ac7ffb06 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -501,7 +501,7 @@ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) return(svmf); } -double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) +/*double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) { int32_t i,nonz=0; for (i=0; i perc ) + int32_t _posA,_negA; double *tmpW,fileperc; + tmpW = calloc(numfeatures+2,sizeof(*tmpW)); + if ( (fileperc= load_model(&_posA,&_negA,tmpW,refc,answerind,numfeatures)) > perc ) { if ( (_posA+_negA) != 0 && _posA >= posA && _negA >= negA ) { memcpy(W,tmpW,sizeof(*W)*numfeatures); - printf("%s.A%02d numfeatures.%d posA.%d negA.%d saved model %f is better than %f +A%d -A%d\n",CONTRACTS[refc],answerind,numfeatures,_posA,_negA,fileperc,perc,posA,negA); + printf("%s/%s.A%02d numfeatures.%d posA.%d negA.%d saved model %f is better than %f +A%d -A%d\n",Arbpairs[refc].base,Arbpairs[refc].rel,answerind,numfeatures,_posA,_negA,fileperc,perc,posA,negA); + W0 = tmpW[numfeatures]; + free(tmpW); return(tmpW[numfeatures]); } } + free(tmpW); #endif save_model(refc,answerind,W,numfeatures,W0,perc,posA,negA); return(W0); -}*/ +} #ifndef _WIN #include "tradebots_SVM.h" diff --git a/iguana/iguana777.c b/iguana/iguana777.c index f8fc045ce..d992d87e7 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -841,7 +841,7 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { char NOTARYCHAINS[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "KMD", "BTC", "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; + "KMD", "BTC", "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "MVP" }; struct iguana_bundle *bp; struct iguana_peer *addr; int32_t i,bundlei; bits256 zero; char dirname[512],*symbol; iguana_rwiAddrind(coin,0,0,0); //for (i=0; ichain); i++) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 645321ae6..3735ec2eb 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -437,7 +437,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); char CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW" }; + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "MVP" }; uint8_t pubkeys[64][33]; cJSON *infojson; char coinaddr[64],cmd[1024]; uint64_t signedmask; int32_t i,j,sendflag=0,current=0,height; FILE *fp; double vals[64],sum,val = 0.01; int32_t n = komodo_notaries("KMD",pubkeys,114000); if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("KMD")) != 0 ) @@ -490,7 +490,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) } else return(clonestr("{\"error\":\"cant find BTC\"}")); } - for (i=0; i Date: Sat, 7 Jan 2017 18:56:19 +0200 Subject: [PATCH 343/432] test --- iguana/coins/mvp_7776 | 2 ++ iguana/iguana777.c | 9 +++++++++ iguana/m_notary | 1 + 3 files changed, 12 insertions(+) create mode 100755 iguana/coins/mvp_7776 diff --git a/iguana/coins/mvp_7776 b/iguana/coins/mvp_7776 new file mode 100755 index 000000000..500208cd7 --- /dev/null +++ b/iguana/coins/mvp_7776 @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}"root@static:~/komodo/src# MVP ht.69 txi.0 signedmask.1 numvins.1 numvouts.1 notarized.0 special.0 isratification.0 + diff --git a/iguana/iguana777.c b/iguana/iguana777.c index d992d87e7..50c55059c 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -837,6 +837,15 @@ void iguana_helper(void *arg) } } +/* +To add a new dPoW'ed assetchain with DEX* API support: + 1. add to komodo/src: assetchains, dpowassets, fiat-cli + 2. add to end of CURRENCIES[] array in fundnotaries (iguana_notary.c) + 3. create to fiat/ + 4. add to NOTARYCHAINS[] array + 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 +*/ + void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { char NOTARYCHAINS[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies diff --git a/iguana/m_notary b/iguana/m_notary index cf6fdaaf0..c26bb80b7 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -34,6 +34,7 @@ coins/jumblr_7776 coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 +coins/mvp_7776 #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" From 6bb8015de6b1fc9a790c119d8fda12aa8bba0657 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 18:57:24 +0200 Subject: [PATCH 344/432] test --- iguana/iguana777.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 50c55059c..826eb6d14 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -841,9 +841,9 @@ void iguana_helper(void *arg) To add a new dPoW'ed assetchain with DEX* API support: 1. add to komodo/src: assetchains, dpowassets, fiat-cli 2. add to end of CURRENCIES[] array in fundnotaries (iguana_notary.c) - 3. create to fiat/ - 4. add to NOTARYCHAINS[] array - 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 + 3. create fiat/ + 4. add to NOTARYCHAINS[] array in iguana_callcoinstart + 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant */ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) From 4668016d0fdfa5eac132ace7797cfa2ea7b0da4f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 18:58:03 +0200 Subject: [PATCH 345/432] test --- iguana/iguana777.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 826eb6d14..261e8bd25 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -844,6 +844,7 @@ To add a new dPoW'ed assetchain with DEX* API support: 3. create fiat/ 4. add to NOTARYCHAINS[] array in iguana_callcoinstart 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant + 6. launch from a single node with -gen, launch a second node using -addnode= */ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) From 10afd824224c0c46ac26c64191c3038653858cd1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 18:59:05 +0200 Subject: [PATCH 346/432] test --- iguana/coins/mvp_7776 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/coins/mvp_7776 b/iguana/coins/mvp_7776 index 500208cd7..30478c49c 100755 --- a/iguana/coins/mvp_7776 +++ b/iguana/coins/mvp_7776 @@ -1,2 +1,2 @@ -curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}"root@static:~/komodo/src# MVP ht.69 txi.0 signedmask.1 numvins.1 numvouts.1 notarized.0 special.0 isratification.0 +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}"root@static:~/komodo/src# MVP ht.69 txi.0 signedmask.1 numvins.1 numvouts.1 notarized.0 special.0 isratification.0 From a0e38689e786941d7262473642e0b6b28ba053e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 18:59:38 +0200 Subject: [PATCH 347/432] test --- iguana/iguana777.c | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 261e8bd25..d7b28190e 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -845,6 +845,7 @@ To add a new dPoW'ed assetchain with DEX* API support: 4. add to NOTARYCHAINS[] array in iguana_callcoinstart 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant 6. launch from a single node with -gen, launch a second node using -addnode= + 7. from a single node, fundnotaries to get notaries able to dPoW */ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) From 6275c7fc331ebb97aa3db2dac1cb46fe1ec0b83c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 19:00:19 +0200 Subject: [PATCH 348/432] test --- iguana/coins/mvp_7776 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/coins/mvp_7776 b/iguana/coins/mvp_7776 index 30478c49c..c4a6d0dd0 100755 --- a/iguana/coins/mvp_7776 +++ b/iguana/coins/mvp_7776 @@ -1,2 +1,2 @@ -curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}"root@static:~/komodo/src# MVP ht.69 txi.0 signedmask.1 numvins.1 numvouts.1 notarized.0 special.0 isratification.0 +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" From 68d3e8bb159f70eded0a9a44379b6fb49ea711bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 7 Jan 2017 19:15:20 +0200 Subject: [PATCH 349/432] test --- iguana/iguana777.c | 2 +- iguana/iguana_notary.c | 2 +- iguana/tests/mvpgetinfo | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100755 iguana/tests/mvpgetinfo diff --git a/iguana/iguana777.c b/iguana/iguana777.c index d7b28190e..473e0231b 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -844,7 +844,7 @@ To add a new dPoW'ed assetchain with DEX* API support: 3. create fiat/ 4. add to NOTARYCHAINS[] array in iguana_callcoinstart 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant - 6. launch from a single node with -gen, launch a second node using -addnode= + 6. launch from a single node with -gen, launch a second node using -addnode= but without -gen 7. from a single node, fundnotaries to get notaries able to dPoW */ diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3735ec2eb..58592aef5 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -490,7 +490,7 @@ STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) } else return(clonestr("{\"error\":\"cant find BTC\"}")); } - for (i=32; i Date: Sat, 7 Jan 2017 19:34:59 +0200 Subject: [PATCH 350/432] test --- basilisk/tradebots_SVM.h | 8 ++++---- basilisk/tradebots_liquidity.c | 27 +++++++++++++++++++++++++-- iguana/iguana_notary.c | 23 +++++++++++++++++------ iguana/tests/notarychains | 2 ++ includes/iguana_apideclares.h | 1 + 5 files changed, 49 insertions(+), 12 deletions(-) create mode 100755 iguana/tests/notarychains diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index 3e7b566cd..de360d509 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -1041,10 +1041,10 @@ void ocas_init(struct ocas_vars *vars,int32_t c,int32_t numfeatures,int32_t star memset(ptr->W,0,sizeof(*ptr->W) * numfeatures); memset(ptr->oldW,0,sizeof(*ptr->oldW) * numfeatures); vars->W0[answerind] = vars->oldW0[answerind] = 0; -#ifdef ENABLE_EXISTINGMODEL +#ifndef DISABLE_EXISTINGMODEL double init_model(double *percp,double *W,double *oldW,int c,int answerind,int numfeatures); vars->W0[answerind] = init_model(&vars->hwmperc[answerind],ptr->W,ptr->oldW,c,answerind,vars->numfeatures); - if ( _dbufave(ptr->W,numfeatures) != 0 && bitweight(answerindmask) == 1 ) + if ( _dbufave(ptr->W,numfeatures) != 0 ) validate_ocas_model(vars,answerind,ptr->output_pred,ptr->old_output,vars->weekinds[answerind],vars->len[answerind],ptr->W,vars->W0[answerind],numfeatures,1); #endif //printf("%s.A%d call init ocas vars weekinds[0] %p\n",CONTRACTS[c_to_refc(c)],answerind,vars->weekinds[0]); @@ -1057,8 +1057,8 @@ int32_t ocas_gen(int32_t c,int32_t numfeatures,int32_t starti,int32_t endi) { int32_t i; struct ocas_vars *vars = calloc(1,sizeof(*vars)); ocas_init(vars,c,numfeatures,starti,endi); - for (i=0; i<100; i++) - ocas_iter(vars,10); + for (i=0; i<10; i++) + ocas_iter(vars,3); ocas_purge(vars); return(0); } diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index 4ac7ffb06..ad36fe84f 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -513,7 +513,7 @@ float *get_features(int32_t numfeatures,int32_t refc,int32_t ind) void tradebots_modelfname(char *modelname,char *base,char *rel,int32_t answerind,int32_t numfeatures) { - sprintf(modelname,"%s/SVM/models/%s_%s_%d.A%d",GLOBAL_DBDIR,base,rel,numfeatures,answerind); + sprintf(modelname,"SVM/models/%s_%s_%d.A%d",base,rel,numfeatures,answerind); OS_portable_path(modelname); } @@ -563,7 +563,7 @@ int save_model(int refc,int answerind,double *W,int numfeatures,double W0,double { FILE *fp; char modelname[512]; tradebots_modelfname(modelname,Arbpairs[refc].base,Arbpairs[refc].rel,answerind,numfeatures); - //printf("modelname.%s m.%p predabs %f\n",modelname,m,predabs); + printf("save model.(%s)\n",modelname); if ( (fp= fopen(modelname,"wb")) != 0 ) { //printf("save %s %.f%% posA.%d negA.%d\n",modelname,perc,posA,negA); @@ -578,6 +578,29 @@ int save_model(int refc,int answerind,double *W,int numfeatures,double W0,double return(-1); } +double init_model(double *percp,double *W,double *oldW,int c,int answerind,int numfeatures) +{ + int32_t j,posA,negA,nonz=0; double *bestmodel=0; + memset(oldW,0,sizeof(*oldW)*numfeatures); + memset(W,0,sizeof(*W)*numfeatures); + if ( load_model(&posA,&negA,W,c,answerind,numfeatures) > 0 ) + { + bestmodel = W; + if ( bestmodel != 0 ) + { + for (j=0; j<=numfeatures; j++) + { + if ( bestmodel[j] != 0 ) + nonz++; + oldW[j] = W[j]; + } + if ( nonz != 0 ) + return(bestmodel[numfeatures]); + } + } + return(0.); +} + double set_ocas_model(int refc,int answerind,double *W,double W0,int numfeatures,int firstweekind,int len,int bad,double dist,double predabs,int posA,int negA,double answerabs,double aveanswer) { double perc = (100. * (double)(len - bad)) / len; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 58592aef5..47bea6af4 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -432,12 +432,23 @@ STRING_ARG(iguana,addnotary,ipaddr) return(clonestr("{\"result\":\"notary node added\"}")); } +char NOTARY_CURRENCIES[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", + "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", + "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "MVP" }; + +ZERO_ARGS(dpow,notarychains) +{ + int32_t i; cJSON *array = cJSON_CreateArray(); + jaddistr(array,"KMD"); + jaddistr(array,"BTC"); + for (i=0; i Date: Sat, 7 Jan 2017 23:46:35 +0200 Subject: [PATCH 351/432] test --- basilisk/tradebots_liquidity.c | 21 ++++++++++++++++----- iguana/dPoW.h | 2 +- iguana/iguana777.h | 9 ++++++++- iguana/tests/LPinit | 4 +++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index ad36fe84f..f8957573e 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -956,7 +956,11 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 safecopy(li.exchange,exchange,sizeof(li.exchange)); li.profit = jdouble(vals,"profit"); li.refprice = jdouble(vals,"refprice"); + li.bid = jdouble(vals,"bid"); + li.ask = jdouble(vals,"ask"); + li.maxvol = jdouble(vals,"maxvol"); li.dir = jint(vals,"dir"); // positive -> buy, negative -> sell, 0 or missing -> both + li.onetime = jint(vals,"onetime"); // li.theoretical = ... dotproduct // li.filter = ... // li.trigger = ... @@ -1007,7 +1011,7 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 } else tradebot_monitor(myinfo,0,0,0,li.exchange,li.base,li.rel,0.); } myinfo->linfos[i] = li; - printf("Set linfo[%d] %s (%s/%s) %.6f %.8f\n",i,li.exchange,li.base,li.rel,li.profit,li.refprice); + printf("Set linfo[%d] %s (%s/%s) profitmargin %.6f bid %.6f ask %.8f maxvol %.f ref %.8f\n",i,li.exchange,li.base,li.rel,li.profit,li.bid,li.ask,li.maxvol,li.refprice); return; } } @@ -1044,11 +1048,18 @@ double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep, //printf(">>>>>>>> %s %s/%s [%d] dir.%d refli.dir %d vs %s/%s\n",exchange,base,rel,i,dir,refli.dir,refli.base,refli.rel); if ( dir != 0 && dir * refli.dir <= 0 ) { - if ( _default_volume_ok(myinfo,&refli,dir,volume) == 0 ) + if ( refli.profit != 0. ) { - *refpricep = refli.refprice; - return(refli.profit); - } else break; + if ( _default_volume_ok(myinfo,&refli,dir,volume) == 0 ) + { + *refpricep = refli.refprice; + return(refli.profit); + } else break; + } + else + { + //bid, ask, track pending, recover expired, onetime + } } } return(0.); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index d9e3cb1f2..0fb8aeb6b 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //#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 0x0777 +#define DPOW_VERSION 0x0778 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 2c74858b5..ad3db8f97 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -88,7 +88,14 @@ struct supernet_address char NXTADDR[32],BTC[64],BTCD[64]; }; -struct liquidity_info { char base[16],rel[16],exchange[16]; uint64_t assetid; double profit,refprice; int dir; }; +struct liquidity_info +{ + char base[16],rel[16],exchange[16]; + uint64_t assetid; + double profit,refprice,bid,ask,maxvol; + int8_t dir,onetime; +}; + struct message_info { int32_t msgcount; bits256 refhash,msghashes[64]; uint32_t timestamps[64]; }; struct supernet_info diff --git a/iguana/tests/LPinit b/iguana/tests/LPinit index 1f6f4ce29..c7dfbb067 100755 --- a/iguana/tests/LPinit +++ b/iguana/tests/LPinit @@ -1,2 +1,4 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"KMD\",\"vals\":{\"profit\":0.01}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"amlp\"}" +#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"KMD\",\"vals\":{\"profit\":0.01}}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MVP\",\"vals\":{\"rel\":\"USD\",\"bid\":0.09,\"ask\":0.11,\"maxvol\":100}}" From 122a084cef888b77281fe300ba197140b00a3d89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 01:42:52 +0200 Subject: [PATCH 352/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/dpow/dpow_prices.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index edaa8d22c..b2389e0eb 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -182,7 +182,7 @@ void dpow_statemachinestart(void *ptr) kmdheight = checkpoint.blockhash.height; else if ( strcmp(dest->symbol,"KMD") == 0 ) kmdheight = dest->longestchain; - if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) + //if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) { bp = calloc(1,sizeof(*bp)); bp->minsigs = minsigs; diff --git a/iguana/dpow/dpow_prices.c b/iguana/dpow/dpow_prices.c index cc2420201..eae61f44b 100755 --- a/iguana/dpow/dpow_prices.c +++ b/iguana/dpow/dpow_prices.c @@ -1890,7 +1890,7 @@ int32_t PAX_idle(struct supernet_info *myinfo)//struct PAX_data *argdp,int32_t i splineval = PAX_splineval(&dp->splines[i],timestamp,0); pvals[6+i] = PAX_val32(splineval); if ( dispflag != 0 ) - printf("%d ",pvals[6+i]); + printf("%u ",pvals[6+i]); } if ( pvals[6+CNY] != 0 && pvals[6+USD] != 0 ) dp->CNYUSD = ((double)pvals[6 + CNY] / pvals[6 + USD]) * MINDENOMS[USD] / MINDENOMS[CNY]; From 83df9acdd60f40b58a93a62905db4081f10b337b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 02:00:15 +0200 Subject: [PATCH 353/432] test --- iguana/dpow/dpow_fsm.c | 2 +- iguana/iguana777.h | 2 +- iguana/iguana_notary.c | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index b2389e0eb..edaa8d22c 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -182,7 +182,7 @@ void dpow_statemachinestart(void *ptr) kmdheight = checkpoint.blockhash.height; else if ( strcmp(dest->symbol,"KMD") == 0 ) kmdheight = dest->longestchain; - //if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) + if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) { bp = calloc(1,sizeof(*bp)); bp->minsigs = minsigs; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index ad3db8f97..9088dffef 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -122,7 +122,7 @@ struct supernet_info uint8_t *pingbuf; struct basilisk_request DEXaccept; FILE *dexfp; - struct dpow_info DPOWS[64]; int32_t numdpows,dpowsock,dexsock,pubsock,repsock,subsock,reqsock; + struct dpow_info DPOWS[128]; int32_t numdpows,dpowsock,dexsock,pubsock,repsock,subsock,reqsock; struct delayedPoW_info dPoW; struct basilisk_spend *spends; int32_t numspends; char bindaddr[64]; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 47bea6af4..69f20cdf8 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -81,6 +81,7 @@ void dpow_srcupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t he return; if ( bits256_nonz(checkpoint.blockhash.hash) != 0 && (checkpoint.blockhash.height % freq) == 0 ) { + dpow_heightfind(myinfo,dp,checkpoint.blockhash.height + 1000); ptrs = calloc(1,sizeof(void *)*5 + sizeof(struct dpow_checkpoint)); ptrs[0] = (void *)myinfo; ptrs[1] = (void *)dp; @@ -322,7 +323,7 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) } if ( dp->blocks == 0 ) { - dp->maxblocks = 100000; + dp->maxblocks = 1000000; dp->blocks = calloc(dp->maxblocks,sizeof(*dp->blocks)); } portable_mutex_init(&dp->paxmutex); From 0508d53f04e28e162b77de20370860665e29b537 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 18:46:28 +0200 Subject: [PATCH 354/432] test --- basilisk/tradebots_liquidity.c | 225 +++++++++++++++++++++------------ iguana/dpow/dpow_fsm.c | 5 +- iguana/iguana777.h | 3 +- iguana/tests/gensvm | 4 +- iguana/tests/openliquidity | 2 + includes/iguana_apideclares.h | 3 +- 6 files changed, 154 insertions(+), 88 deletions(-) create mode 100755 iguana/tests/openliquidity diff --git a/basilisk/tradebots_liquidity.c b/basilisk/tradebots_liquidity.c index f8957573e..38097caac 100755 --- a/basilisk/tradebots_liquidity.c +++ b/basilisk/tradebots_liquidity.c @@ -878,58 +878,30 @@ void tradebot_arbcandidate(struct supernet_info *myinfo,char *exchange,int32_t t } } -void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) +cJSON *linfo_json(struct liquidity_info *li) { - // update balance, compare to target balance, issue balancing trade via central exchanges, if needed - double price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; - srcamount = swap->I.req.srcamount; - destamount = swap->I.req.destamount; - profitmargin = (double)swap->I.req.profitmargin / 1000000.; - if ( srcamount <= SMALLVAL || destamount <= SMALLVAL ) - { - printf("illegal amount for balancing %f %f\n",srcamount,destamount); - return; - } - strcpy(rel,"BTC"); - if ( strcmp(swap->I.req.src,"BTC") == 0 ) - { - strcpy(base,swap->I.req.dest); - price = (srcamount / destamount); - volume = destamount / SATOSHIDEN; - dir = -1.; - } - else if ( strcmp(swap->I.req.dest,"BTC") == 0 ) - { - strcpy(base,swap->I.req.src); - price = (destamount / srcamount); - volume = srcamount / SATOSHIDEN; - dir = 1.; - } - else - { - printf("only BTC trades can be balanced, not (%s/%s)\n",swap->I.req.src,swap->I.req.dest); - return; - } - if ( iambob != 0 ) - { - if ( myinfo->IAMLP != 0 ) - { - printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); - if ( dir < 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - } - } - else - { - if ( myinfo->IAMLP != 0 ) - { - printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); - if ( dir > 0. ) - InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); - } - } + cJSON *item = cJSON_CreateObject(); + jaddstr(item,"base",li->base); + jaddstr(item,"rel",li->rel); + if ( li->exchange[0] != 0 ) + jaddstr(item,"exchange",li->exchange); + if ( li->assetid != 0 ) + jadd64bits(item,"assetid",li->assetid); + if ( li->profit != 0. ) + jaddnum(item,"profitmargin",li->profit); + if ( li->refprice != 0. ) + jaddnum(item,"refprice",li->refprice); + if ( li->bid != 0. ) + jaddnum(item,"bid",li->bid); + if ( li->ask != 0. ) + jaddnum(item,"ask",li->ask); + if ( li->minvol != 0. ) + jaddnum(item,"minvol",li->minvol); + if ( li->maxvol != 0. ) + jaddnum(item,"maxvol",li->maxvol); + if ( li->totalvol != 0. ) + jaddnum(item,"totalvol",li->totalvol); + return(item); } void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 hash,cJSON *vals) @@ -953,18 +925,17 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 memset(&li,0,sizeof(li)); safecopy(li.base,base,sizeof(li.base)); safecopy(li.rel,relstr,sizeof(li.rel)); - safecopy(li.exchange,exchange,sizeof(li.exchange)); + strncpy(li.exchange,exchange,sizeof(li.exchange)); li.profit = jdouble(vals,"profit"); li.refprice = jdouble(vals,"refprice"); li.bid = jdouble(vals,"bid"); li.ask = jdouble(vals,"ask"); - li.maxvol = jdouble(vals,"maxvol"); - li.dir = jint(vals,"dir"); // positive -> buy, negative -> sell, 0 or missing -> both - li.onetime = jint(vals,"onetime"); - // li.theoretical = ... dotproduct - // li.filter = ... - // li.trigger = ... - // PAX response + if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) + li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.01; + if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) + li.maxvol = li.minvol; + if ( (li.totalvol= jdouble(vals,"total")) < li.maxvol ) + li.totalvol = li.maxvol; if ( strcmp("NXT",li.rel) == 0 ) li.assetid = NXT_assetidfind(base); else if ( strcmp("UNITY",base) == 0 ) @@ -986,20 +957,20 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) { refli = myinfo->linfos[i]; - /*if ( strcmp(li.rel,refli.base) == 0 && strcmp(li.base,refli.rel) == 0 ) + if ( strcmp(li.rel,refli.base) == 0 && strcmp(li.base,refli.rel) == 0 ) { - li = refli; + /*li = refli; strcpy(li.base,refli.base); strcpy(li.rel,refli.rel); if ( fabs(li.refprice) > SMALLVAL ) li.refprice = (1. / li.refprice); else li.refprice = 0.; li.dir = -li.dir; - printf("Set rev linfo[%d] (%s/%s) %.6f %.8f\n",i,li.base,li.rel,li.profit,li.refprice); - myinfo->linfos[i] = li; + myinfo->linfos[i] = li;*/ + printf("cant Set rev linfo[%d] (%s/%s) %.6f %.8f already have (%s/%s)\n",i,li.rel,li.base,li.profit,li.refprice,refli.base,refli.rel); return; } - else*/ if ( refli.base[0] == 0 || (strcmp(li.base,refli.base) == 0 && strcmp(li.rel,refli.rel) == 0 && strcmp(li.exchange,refli.exchange) == 0) ) + else if ( refli.base[0] == 0 || (strcmp(li.base,refli.base) == 0 && strcmp(li.rel,refli.rel) == 0 && strcmp(li.exchange,refli.exchange) == 0) ) { if ( refli.base[0] == 0 && li.exchange[0] != 0 && strcmp(li.exchange,"DEX") != 0 ) { @@ -1020,9 +991,9 @@ void _default_liquidity_command(struct supernet_info *myinfo,char *base,bits256 int32_t _default_volume_ok(struct supernet_info *myinfo,struct liquidity_info *li,int32_t dir,double volume) { - // check order exposure - // check cumulative exposure - return(0); + if ( (li->minvol == 0 || volume >= li->minvol) && (li->maxvol == 0 || volume <= li->maxvol) ) + return(0); + else return(-1); } double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep,char *exchange,char *base,char *rel,double volume) @@ -1030,7 +1001,7 @@ double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep, int32_t i,dir; struct liquidity_info refli; *refpricep = 0.; //printf("%s %s/%s\n",exchange,base,rel); - for (i=sizeof(myinfo->linfos)/sizeof(*myinfo->linfos)-1; i>=0; i--) + for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) { refli = myinfo->linfos[i]; if ( refli.base[0] == 0 ) @@ -1046,25 +1017,106 @@ double _default_liquidity_active(struct supernet_info *myinfo,double *refpricep, continue; } //printf(">>>>>>>> %s %s/%s [%d] dir.%d refli.dir %d vs %s/%s\n",exchange,base,rel,i,dir,refli.dir,refli.base,refli.rel); - if ( dir != 0 && dir * refli.dir <= 0 ) + if ( _default_volume_ok(myinfo,&refli,dir,volume) == 0 ) { if ( refli.profit != 0. ) - { - if ( _default_volume_ok(myinfo,&refli,dir,volume) == 0 ) - { - *refpricep = refli.refprice; - return(refli.profit); - } else break; - } - else - { - //bid, ask, track pending, recover expired, onetime - } + *refpricep = refli.refprice; + else if ( dir > 0 ) + *refpricep = refli.bid; + else if ( dir < 0 ) + *refpricep = refli.ask; + return(refli.profit); } + break; } return(0.); } +struct liquidity_info *_default_lifind(struct supernet_info *myinfo,int32_t *dirp,char *base,char *rel) +{ + struct liquidity_info *li; int32_t i; + *dirp = 0; + for (i=0; ilinfos)/sizeof(*myinfo->linfos); i++) + { + li = &myinfo->linfos[i]; + if ( strcmp(li->base,base) == 0 && strcmp(li->rel,rel) == 0 ) + { + *dirp = 1; + return(li); + } + else if ( strcmp(li->base,rel) == 0 && strcmp(li->rel,base) == 0 ) + { + *dirp = -1; + return(li); + } + } + return(0); +} + +void _default_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) +{ + // update balance, compare to target balance, issue balancing trade via central exchanges, if needed + struct liquidity_info *li; double vol,price,volume,srcamount,destamount,profitmargin,dir=0.,dotrade=1.; char base[64],rel[64]; int32_t idir; + srcamount = swap->I.req.srcamount; + destamount = swap->I.req.destamount; + profitmargin = (double)swap->I.req.profitmargin / 1000000.; + if ( srcamount <= SMALLVAL || destamount <= SMALLVAL ) + { + printf("illegal amount for balancing %f %f\n",srcamount,destamount); + return; + } + if ( (li= _default_lifind(myinfo,&idir,swap->I.req.src,swap->I.req.dest)) != 0 ) + { + if ( idir < 0 ) + vol = 1. / ((double)destamount / SATOSHIDEN); + else vol = ((double)srcamount / SATOSHIDEN); + li->totalvol -= vol; + if ( li->totalvol <= 0. || (li->minvol != 0. && li->totalvol < li->minvol) ) + li->minvol = li->maxvol = li->totalvol = 0.; + printf("li.(%s/%s) totalvol %f after -= %f minmax.(%f %f)\n",li->base,li->rel,li->totalvol,vol,li->minvol,li->maxvol); + } + strcpy(rel,"BTC"); + if ( strcmp(swap->I.req.src,"BTC") == 0 ) + { + strcpy(base,swap->I.req.dest); + price = (srcamount / destamount); + volume = destamount / SATOSHIDEN; + dir = -1.; + } + else if ( strcmp(swap->I.req.dest,"BTC") == 0 ) + { + strcpy(base,swap->I.req.src); + price = (destamount / srcamount); + volume = srcamount / SATOSHIDEN; + dir = 1.; + } + else + { + printf("only BTC trades can be balanced, not (%s/%s)\n",swap->I.req.src,swap->I.req.dest); + return; + } + if ( iambob != 0 ) + { + if ( myinfo->IAMLP != 0 ) + { + printf("BOB: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir < 0. ? "buy" : "sell",price + dir * price * profitmargin,100*profitmargin); + if ( dir < 0. ) + InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + } + } + else + { + if ( myinfo->IAMLP != 0 ) + { + printf("ALICE: price %f * vol %f -> %s newprice %f margin %.2f%%\n",price,volume,dir > 0. ? "buy" : "sell",price - dir * price * profitmargin,100*profitmargin); + if ( dir > 0. ) + InstantDEX_buy(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + else InstantDEX_sell(myinfo,0,0,0,"poloniex",base,rel,price,volume,dotrade); + } + } +} + void tradebot_swap_balancingtrade(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t iambob) { if ( swap->balancingtrade == 0 ) @@ -1145,7 +1197,7 @@ void tradebots_processprices(struct supernet_info *myinfo,struct exchange_info * #include "../includes/iguana_apidefs.h" #include "../includes/iguana_apideclares.h" -TWO_STRINGS(tradebots,gensvm,base,rel) +TWO_STRINGS(tradebot,gensvm,base,rel) { #ifdef _WIN return(clonestr("{\"error\":\"windows doesnt support SVM\"}")); @@ -1161,4 +1213,15 @@ TWO_STRINGS(tradebots,gensvm,base,rel) #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)); +} + #include "../includes/iguana_apiundefs.h" diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index edaa8d22c..592159e1d 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -387,14 +387,15 @@ void dpow_statemachinestart(void *ptr) } sleep(1); } + starttime = (uint32_t)time(NULL); if ( bp->isratify == 0 ) { //if ( (starttime= checkpoint.timestamp) == 0 ) - bp->starttime = starttime = (uint32_t)time(NULL); + bp->starttime = starttime; extralen = dpow_paxpending(extras,&bp->paxwdcrc); bp->notaries[bp->myind].paxwdcrc = bp->paxwdcrc; } - printf("PAXWDCRC.%x myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u\n",bp->paxwdcrc,bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),checkpoint.timestamp); + printf("PAXWDCRC.%x myind.%d isratify.%d DPOW.%s statemachine checkpoint.%d %s start.%u+dur.%d vs %ld\n",bp->paxwdcrc,bp->myind,bp->isratify,src->symbol,checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash),starttime,bp->duration,time(NULL)); for (i=0; iminerkey33[i+1]; //printf("start utxosync start.%u %u\n",starttime,(uint32_t)time(NULL)); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 9088dffef..f8433bd3a 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -92,8 +92,7 @@ struct liquidity_info { char base[16],rel[16],exchange[16]; uint64_t assetid; - double profit,refprice,bid,ask,maxvol; - int8_t dir,onetime; + double profit,refprice,bid,ask,minvol,maxvol,totalvol; }; struct message_info { int32_t msgcount; bits256 refhash,msghashes[64]; uint32_t timestamps[64]; }; diff --git a/iguana/tests/gensvm b/iguana/tests/gensvm index b5b6625a9..d4e749a50 100755 --- a/iguana/tests/gensvm +++ b/iguana/tests/gensvm @@ -1,3 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTC\",\"rel\":\"USD\"}" -#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebots\",\"method\":\"gensvm\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"BTC\",\"rel\":\"USD\"}" +#curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"gensvm\",\"base\":\"BTCD\",\"rel\":\"BTC\"}" diff --git a/iguana/tests/openliquidity b/iguana/tests/openliquidity new file mode 100755 index 000000000..c8e5c6232 --- /dev/null +++ b/iguana/tests/openliquidity @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"openliquidity\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 1098ee73f..7d27ffc2f 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -44,7 +44,8 @@ ZERO_ARGS(pax,start); HASH_ARRAY_STRING(tradebot,liquidity,hash,vals,targetcoin); ZERO_ARGS(tradebot,amlp); ZERO_ARGS(tradebot,notlp); -TWO_STRINGS(tradebots,gensvm,base,rel); +TWO_STRINGS(tradebot,gensvm,base,rel); +ZERO_ARGS(tradebot,openliquidity); INT_AND_ARRAY(iguana,rates,unused,quotes); TWO_STRINGS(iguana,rate,base,rel); From 15a89494efdf60c832f6ae973a861347bc2e7ab2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 20:34:54 +0200 Subject: [PATCH 355/432] test --- basilisk/basilisk_bitcoin.c | 2 ++ iguana/dpow/dpow_network.c | 41 ++++++++++++++++++++++++++++++++++--- iguana/dpow/dpow_rpc.c | 3 ++- iguana/iguana_payments.c | 7 +++++-- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index 4e5ff17cc..b3bf8a9da 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -354,6 +354,7 @@ char *basilisk_valuestr(struct iguana_info *coin,char *coinaddr,uint64_t value,i jaddstr(retjson,"result","success"); jaddstr(retjson,"address",coinaddr); jadd64bits(retjson,"satoshis",value); + jaddnum(retjson,"amount",dstr(value)); jaddnum(retjson,"value",dstr(value)); jaddnum(retjson,"height",height); jaddnum(retjson,"numconfirms",coin->blocks.hwmchain.height - height + 1); @@ -909,6 +910,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) 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")); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index aa803d1e8..978f334f9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -727,15 +727,50 @@ void dpow_bestconsensus(struct dpow_block *bp) void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { - int32_t i; + int32_t i,err; cJSON *ujson; char coinaddr[64]; if ( bp->myind < 0 ) return; if ( isratify != 0 ) { np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; np->srcvout = bp->notaries[bp->myind].ratifysrcvout; + err = 0; + if ( (ujson= dpow_gettxout(myinfo,bp->srccoin,np->srcutxo,np->srcvout)) != 0 ) + { + if ( j64bits(ujson,"value") == 0 ) + err = 1; + free_json(ujson); + } else err = 1; + if ( err != 0 ) + { + bitcoin_address(coinaddr,bp->srccoin->chain->pubtype,dp->minerkey33,33); + if ( dpow_haveutxo(myinfo,bp->srccoin,&bp->notaries[bp->myind].ratifysrcutxo,&bp->notaries[bp->myind].ratifysrcvout,coinaddr) > 0 ) + { + printf("Replace UTXO.%s\n",bp->srccoin->symbol); + np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; + np->srcvout = bp->notaries[bp->myind].ratifysrcvout; + } + else printf("cant find utxo.%s\n",bp->srccoin->symbol); + } np->destutxo = bp->notaries[bp->myind].ratifydestutxo; np->destvout = bp->notaries[bp->myind].ratifydestvout; + err = 0; + if ( (ujson= dpow_gettxout(myinfo,bp->destcoin,np->destutxo,np->destvout)) != 0 ) + { + if ( j64bits(ujson,"value") == 0 ) + err = 1; + free_json(ujson); + } else err = 1; + if ( err != 0 ) + { + bitcoin_address(coinaddr,bp->destcoin->chain->pubtype,dp->minerkey33,33); + if ( dpow_haveutxo(myinfo,bp->destcoin,&bp->notaries[bp->myind].ratifydestutxo,&bp->notaries[bp->myind].ratifydestvout,coinaddr) > 0 ) + { + printf("Replace UTXO.%s\n",bp->destcoin->symbol); + np->destutxo = bp->notaries[bp->myind].ratifydestutxo; + np->destvout = bp->notaries[bp->myind].ratifydestvout; + } else printf("cant find utxo.%s\n",bp->destcoin->symbol); + } np->bestmask = bp->ratifybestmask; np->recvmask = bp->ratifyrecvmask; //printf("send ratify best.(%d %llx) siglens.(%d %d)\n", bp->ratifybestk,(long long)bp->ratifybestmask,bp->ratifysiglens[0],bp->ratifysiglens[1]); @@ -888,11 +923,11 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("crcval.%x numcrcs.%d bestmatches.%d matchesmask.%llx\n",crcval,numcrcs,bestmatches,(long long)matchesmask); - if ( bestmatches >= bp->minsigs ) + if ( bestmatches >= bp->minsigs && numcrcs >= bp->minsigs ) { if ( bp->pendingratifybestk != bp->ratifybestk || bp->pendingratifybestmask != bp->ratifybestmask ) { - printf("new PENDING RATIFY BESTK (%d %llx)\n",bp->ratifybestk,(long long)bp->ratifybestmask); + printf("new PENDING RATIFY BESTK (%d %llx) crcval.%08x num.%d\n",bp->ratifybestk,(long long)bp->ratifybestmask,crcval,numcrcs); bp->pendingratifybestk = bp->ratifybestk; bp->pendingratifybestmask = bp->ratifybestmask; memset(bp->notaries[bp->myind].ratifysigs,0,sizeof(bp->notaries[bp->myind].ratifysigs)); diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 0238df031..166bfc463 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -562,7 +562,8 @@ int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits item = jitem(unspents,i); if ( is_cJSON_False(jobj(item,"spendable")) != 0 ) continue; - satoshis = SATOSHIDEN * jdouble(item,"amount"); + if ( (satoshis= SATOSHIDEN * jdouble(item,"amount")) == 0 ) + satoshis= SATOSHIDEN * jdouble(item,"value"); if ( satoshis == DPOW_UTXOSIZE && (address= jstr(item,"address")) != 0 && strcmp(address,coinaddr) == 0 ) { if ( (str= jstr(item,"scriptPubKey")) != 0 && is_hexstr(str,0) == sizeof(script)*2 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index 9aa807dc0..eaccdb2a0 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -379,13 +379,15 @@ uint64_t iguana_interest(struct supernet_info *myinfo,struct iguana_info *coin,b uint64_t iguana_interests(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) { - int32_t i,n; cJSON *item; uint64_t interest = 0; + int32_t i,n; cJSON *item; uint64_t value,interest = 0; if ( is_cJSON_Array(vins) != 0 && (n= cJSON_GetArraySize(vins)) > 0 ) { for (i=0; iblocks.hwmchain.height - height + 1); jaddnum(retjson,"value",dstr(value)); + jaddnum(retjson,"amount",dstr(value)); if ( (height % coin->chain->bundlesize) == 0 && vout == 0 ) jadd(retjson,"coinbase",jtrue()); else jadd(retjson,"coinbase",jfalse()); From bb634449d27fd973ee3f2328090c5696d4cb01ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 20:37:11 +0200 Subject: [PATCH 356/432] 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 978f334f9..5c135cf2d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -725,7 +725,7 @@ void dpow_bestconsensus(struct dpow_block *bp) } } -void dpow_nanoutxoset(struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) +void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { int32_t i,err; cJSON *ujson; char coinaddr[64]; if ( bp->myind < 0 ) @@ -1142,12 +1142,12 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo extralen = dpow_paxpending(extras,&paxwdcrc); bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = paxwdcrc; //dpow_bestconsensus(bp); - dpow_nanoutxoset(&np->notarize,bp,0); + dpow_nanoutxoset(myinfo,dp,&np->notarize,bp,0); } else { bp->paxwdcrc = bp->notaries[bp->myind].paxwdcrc = np->notarize.paxwdcrc = 0; - dpow_nanoutxoset(&np->ratify,bp,1); + dpow_nanoutxoset(myinfo,dp,&np->ratify,bp,1); } np->size = size; np->datalen = datalen; From 3270a4a51270a74533d86c9bf6b74af36e3a04d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 20:38:25 +0200 Subject: [PATCH 357/432] test --- iguana/dPoW.h | 1 + 1 file changed, 1 insertion(+) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 0fb8aeb6b..43b3092e9 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -146,6 +146,7 @@ char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int3 int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); int32_t dpow_nanomsg_update(struct supernet_info *myinfo); +int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr); cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); From 7617519c67a1cc016d5b00ca763d2117dc407db7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 20:42:01 +0200 Subject: [PATCH 358/432] test --- iguana/dpow/dpow_network.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5c135cf2d..44476610f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -727,7 +727,7 @@ void dpow_bestconsensus(struct dpow_block *bp) void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { - int32_t i,err; cJSON *ujson; char coinaddr[64]; + int32_t i,err; cJSON *ujson; char coinaddr[64]; uint16_t vout; if ( bp->myind < 0 ) return; if ( isratify != 0 ) @@ -744,9 +744,10 @@ void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct d if ( err != 0 ) { bitcoin_address(coinaddr,bp->srccoin->chain->pubtype,dp->minerkey33,33); - if ( dpow_haveutxo(myinfo,bp->srccoin,&bp->notaries[bp->myind].ratifysrcutxo,&bp->notaries[bp->myind].ratifysrcvout,coinaddr) > 0 ) + if ( dpow_haveutxo(myinfo,bp->srccoin,&bp->notaries[bp->myind].ratifysrcutxo,&vout,coinaddr) > 0 ) { printf("Replace UTXO.%s\n",bp->srccoin->symbol); + bp->notaries[bp->myind].ratifysrcvout = vout; np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; np->srcvout = bp->notaries[bp->myind].ratifysrcvout; } @@ -764,9 +765,10 @@ void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct d if ( err != 0 ) { bitcoin_address(coinaddr,bp->destcoin->chain->pubtype,dp->minerkey33,33); - if ( dpow_haveutxo(myinfo,bp->destcoin,&bp->notaries[bp->myind].ratifydestutxo,&bp->notaries[bp->myind].ratifydestvout,coinaddr) > 0 ) + if ( dpow_haveutxo(myinfo,bp->destcoin,&bp->notaries[bp->myind].ratifydestutxo,&vout,coinaddr) > 0 ) { printf("Replace UTXO.%s\n",bp->destcoin->symbol); + bp->notaries[bp->myind].ratifydestvout = vout; np->destutxo = bp->notaries[bp->myind].ratifydestutxo; np->destvout = bp->notaries[bp->myind].ratifydestvout; } else printf("cant find utxo.%s\n",bp->destcoin->symbol); From ac7655863dd80d9c5ab2de280019a2563184b66f Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 20:43:13 +0200 Subject: [PATCH 359/432] 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 44476610f..09e83a9ea 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -727,7 +727,7 @@ void dpow_bestconsensus(struct dpow_block *bp) void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { - int32_t i,err; cJSON *ujson; char coinaddr[64]; uint16_t vout; + int32_t i,err,vout; cJSON *ujson; char coinaddr[64]; if ( bp->myind < 0 ) return; if ( isratify != 0 ) From 2cc623b69da1a005e4f21c90f7acf2dc42506a77 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 21:03:41 +0200 Subject: [PATCH 360/432] test --- iguana/dpow/dpow_network.c | 72 ++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 09e83a9ea..199ea3098 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -727,51 +727,53 @@ void dpow_bestconsensus(struct dpow_block *bp) void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_nanoutxo *np,struct dpow_block *bp,int32_t isratify) { - int32_t i,err,vout; cJSON *ujson; char coinaddr[64]; + int32_t i,err,vout; cJSON *ujson; char coinaddr[64],str[65]; if ( bp->myind < 0 ) return; if ( isratify != 0 ) { np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; np->srcvout = bp->notaries[bp->myind].ratifysrcvout; - err = 0; - if ( (ujson= dpow_gettxout(myinfo,bp->srccoin,np->srcutxo,np->srcvout)) != 0 ) - { - if ( j64bits(ujson,"value") == 0 ) - err = 1; - free_json(ujson); - } else err = 1; - if ( err != 0 ) - { - bitcoin_address(coinaddr,bp->srccoin->chain->pubtype,dp->minerkey33,33); - if ( dpow_haveutxo(myinfo,bp->srccoin,&bp->notaries[bp->myind].ratifysrcutxo,&vout,coinaddr) > 0 ) - { - printf("Replace UTXO.%s\n",bp->srccoin->symbol); - bp->notaries[bp->myind].ratifysrcvout = vout; - np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; - np->srcvout = bp->notaries[bp->myind].ratifysrcvout; - } - else printf("cant find utxo.%s\n",bp->srccoin->symbol); - } np->destutxo = bp->notaries[bp->myind].ratifydestutxo; np->destvout = bp->notaries[bp->myind].ratifydestvout; - err = 0; - if ( (ujson= dpow_gettxout(myinfo,bp->destcoin,np->destutxo,np->destvout)) != 0 ) - { - if ( j64bits(ujson,"value") == 0 ) - err = 1; - free_json(ujson); - } else err = 1; - if ( err != 0 ) + if ( bp->myind != 0 ) { - bitcoin_address(coinaddr,bp->destcoin->chain->pubtype,dp->minerkey33,33); - if ( dpow_haveutxo(myinfo,bp->destcoin,&bp->notaries[bp->myind].ratifydestutxo,&vout,coinaddr) > 0 ) + err = 0; + if ( (ujson= dpow_gettxout(myinfo,bp->srccoin,np->srcutxo,np->srcvout)) != 0 ) + { + if ( j64bits(ujson,"value") == 0 ) + err = 1; + free_json(ujson); + } else err = 1; + if ( err != 0 ) { - printf("Replace UTXO.%s\n",bp->destcoin->symbol); - bp->notaries[bp->myind].ratifydestvout = vout; - np->destutxo = bp->notaries[bp->myind].ratifydestutxo; - np->destvout = bp->notaries[bp->myind].ratifydestvout; - } else printf("cant find utxo.%s\n",bp->destcoin->symbol); + bitcoin_address(coinaddr,bp->srccoin->chain->pubtype,dp->minerkey33,33); + if ( dpow_haveutxo(myinfo,bp->srccoin,&bp->notaries[bp->myind].ratifysrcutxo,&vout,coinaddr) > 0 ) + { + bp->notaries[bp->myind].ratifysrcvout = vout; + np->srcutxo = bp->notaries[bp->myind].ratifysrcutxo; + np->srcvout = bp->notaries[bp->myind].ratifysrcvout; + printf("Replace UTXO.%s < %s/v%d\n",bp->srccoin->symbol,bits256_str(str,np->srcutxo),vout); + } else printf("cant find utxo.%s\n",bp->srccoin->symbol); + } + err = 0; + if ( (ujson= dpow_gettxout(myinfo,bp->destcoin,np->destutxo,np->destvout)) != 0 ) + { + if ( j64bits(ujson,"value") == 0 ) + err = 1; + free_json(ujson); + } else err = 1; + if ( err != 0 ) + { + bitcoin_address(coinaddr,bp->destcoin->chain->pubtype,dp->minerkey33,33); + if ( dpow_haveutxo(myinfo,bp->destcoin,&bp->notaries[bp->myind].ratifydestutxo,&vout,coinaddr) > 0 ) + { + bp->notaries[bp->myind].ratifydestvout = vout; + np->destutxo = bp->notaries[bp->myind].ratifydestutxo; + np->destvout = bp->notaries[bp->myind].ratifydestvout; + printf("Replace UTXO.%s < %s/v%d\n",bp->destcoin->symbol,bits256_str(str,np->destutxo),vout); + } else printf("cant find utxo.%s\n",bp->destcoin->symbol); + } } np->bestmask = bp->ratifybestmask; np->recvmask = bp->ratifyrecvmask; From 0ca4e2d150c0c8070f42a29e938d0975552819a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 21:08:01 +0200 Subject: [PATCH 361/432] test --- iguana/dpow/dpow_network.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 199ea3098..2aa3fdf6c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -742,7 +742,10 @@ void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct d if ( (ujson= dpow_gettxout(myinfo,bp->srccoin,np->srcutxo,np->srcvout)) != 0 ) { if ( j64bits(ujson,"value") == 0 ) + { + printf("(%s)\n",jprint(ujson,0)); err = 1; + } free_json(ujson); } else err = 1; if ( err != 0 ) From ec9d74b1a63260b591f9450f6deda95f1b688c36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 8 Jan 2017 21:11:52 +0200 Subject: [PATCH 362/432] 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 2aa3fdf6c..de9166a23 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -741,9 +741,9 @@ void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct d err = 0; if ( (ujson= dpow_gettxout(myinfo,bp->srccoin,np->srcutxo,np->srcvout)) != 0 ) { - if ( j64bits(ujson,"value") == 0 ) + if ( (uint64_t)(jdouble(ujson,"value") * SATOSHIDEN) == 0 ) { - printf("(%s)\n",jprint(ujson,0)); + //printf("(%s)\n",jprint(ujson,0)); err = 1; } free_json(ujson); @@ -762,7 +762,7 @@ void dpow_nanoutxoset(struct supernet_info *myinfo,struct dpow_info *dp,struct d err = 0; if ( (ujson= dpow_gettxout(myinfo,bp->destcoin,np->destutxo,np->destvout)) != 0 ) { - if ( j64bits(ujson,"value") == 0 ) + if ( (uint64_t)(jdouble(ujson,"value") * SATOSHIDEN) == 0 ) err = 1; free_json(ujson); } else err = 1; From 95bea60d8637db5595b58823e85a42c34fc2fba6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 14:15:11 +0200 Subject: [PATCH 363/432] test --- basilisk/basilisk.c | 17 +++++++++++++++++ iguana/coins/{basilisk => basilisk.old} | 0 iguana/coins/basilisk/bet | 2 ++ iguana/coins/basilisk/bots | 2 ++ iguana/coins/basilisk/btc | 2 ++ iguana/coins/basilisk/crypto | 2 ++ iguana/coins/basilisk/dex | 2 ++ iguana/coins/basilisk/hodl | 2 ++ iguana/coins/basilisk/jumblr | 2 ++ iguana/coins/basilisk/kmd | 4 ++++ iguana/coins/basilisk/mgw | 2 ++ iguana/coins/basilisk/mvp | 2 ++ iguana/coins/basilisk/pangea | 2 ++ iguana/coins/basilisk/revs | 2 ++ iguana/coins/basilisk/shark | 2 ++ iguana/coins/basilisk/supernet | 1 + iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 4 ++-- iguana/iguana_notary.c | 20 +++++++++++--------- iguana/tests/basilisk | 2 ++ includes/iguana_apideclares.h | 3 +++ 21 files changed, 65 insertions(+), 11 deletions(-) rename iguana/coins/{basilisk => basilisk.old} (100%) create mode 100755 iguana/coins/basilisk/bet create mode 100755 iguana/coins/basilisk/bots create mode 100755 iguana/coins/basilisk/btc create mode 100755 iguana/coins/basilisk/crypto create mode 100755 iguana/coins/basilisk/dex create mode 100755 iguana/coins/basilisk/hodl create mode 100755 iguana/coins/basilisk/jumblr create mode 100755 iguana/coins/basilisk/kmd create mode 100755 iguana/coins/basilisk/mgw create mode 100755 iguana/coins/basilisk/mvp create mode 100755 iguana/coins/basilisk/pangea create mode 100755 iguana/coins/basilisk/revs create mode 100755 iguana/coins/basilisk/shark create mode 100755 iguana/coins/basilisk/supernet create mode 100755 iguana/tests/basilisk diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index 0c7651db2..03fb5f2d9 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -1044,4 +1044,21 @@ HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr) return(jprint(retjson,1)); } +ZERO_ARGS(passthru,paxfiats) +{ + komodo_assetcoins(-1); + return(clonestr("{\"result\":\"success\"}")); +} + +ZERO_ARGS(basilisk,paxfiats) +{ + komodo_assetcoins(0); + return(clonestr("{\"result\":\"success\"}")); +} + +ZERO_ARGS(iguana,paxfiats) +{ + komodo_assetcoins(1); + return(clonestr("{\"result\":\"success\"}")); +} #include "../includes/iguana_apiundefs.h" diff --git a/iguana/coins/basilisk b/iguana/coins/basilisk.old similarity index 100% rename from iguana/coins/basilisk rename to iguana/coins/basilisk.old diff --git a/iguana/coins/basilisk/bet b/iguana/coins/basilisk/bet new file mode 100755 index 000000000..d2fae9771 --- /dev/null +++ b/iguana/coins/basilisk/bet @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"BET.conf\",\"path\":\"${HOME#"/"}/.komodo/BET\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BET\",\"name\":\"BET\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"6b9e3e1b\",\"p2p\":15610,\"rpc\":15611,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/bots b/iguana/coins/basilisk/bots new file mode 100755 index 000000000..6632e4803 --- /dev/null +++ b/iguana/coins/basilisk/bots @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"BOTS.conf\",\"path\":\"${HOME#"/"}/.komodo/BOTS\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BOTS\",\"name\":\"BOTS\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"5bec8cf7\",\"p2p\":11363,\"rpc\":11364,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/btc b/iguana/coins/basilisk/btc new file mode 100755 index 000000000..9479f35d7 --- /dev/null +++ b/iguana/coins/basilisk/btc @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"bitcoin.conf\",\"path\":\"${HOME#"/"}/.bitcoin\",\"prefetchlag\":-1,\"poll\":1,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTC\",\"startpend\":64,\"endpend\":64,\"services\":0,\"maxpeers\":512,\"RELAY\":0,\"VALIDATE\":0,\"portp2p\":8333,\"minconfirms\":1}" diff --git a/iguana/coins/basilisk/crypto b/iguana/coins/basilisk/crypto new file mode 100755 index 000000000..49d7670f3 --- /dev/null +++ b/iguana/coins/basilisk/crypto @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"CRYPTO.conf\",\"path\":\"${HOME#"/"}/.komodo/CRYPTO\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"CRYPTO\",\"name\":\"CRYPTO\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"fced9e2a\",\"p2p\":12947,\"rpc\":12948,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/dex b/iguana/coins/basilisk/dex new file mode 100755 index 000000000..7c245c2a5 --- /dev/null +++ b/iguana/coins/basilisk/dex @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"DEX.conf\",\"path\":\"${HOME#"/"}/.komodo/DEX\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"DEX\",\"name\":\"DEX\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"f2ae0516\",\"p2p\":11889,\"rpc\":11890,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/hodl b/iguana/coins/basilisk/hodl new file mode 100755 index 000000000..934a21c69 --- /dev/null +++ b/iguana/coins/basilisk/hodl @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"HODL.conf\",\"path\":\"${HOME#"/"}/.komodo/HODL\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"HODL\",\"name\":\"HODL\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"9b13fb5f\",\"p2p\":14430,\"rpc\":14431,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/jumblr b/iguana/coins/basilisk/jumblr new file mode 100755 index 000000000..be336dbb7 --- /dev/null +++ b/iguana/coins/basilisk/jumblr @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"JUMBLR.conf\",\"path\":\"${HOME#"/"}/.komodo/JUMBLR\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"JUMBLR\",\"name\":\"JUMBLR\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"7223759e\",\"p2p\":15105,\"rpc\":15106,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/kmd b/iguana/coins/basilisk/kmd new file mode 100755 index 000000000..bfcb83cef --- /dev/null +++ b/iguana/coins/basilisk/kmd @@ -0,0 +1,4 @@ +#!/bin/bash + +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"komodo.conf\",\"path\":\"${HOME#"/"}/.komodo\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":8,\"endpend\":8,\"services\":0,\"maxpeers\":32,\"newcoin\":\"KMD\",\"name\":\"Komodo\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"f9eee48d\",\"p2p\":7770,\"rpc\":7771,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0}" + diff --git a/iguana/coins/basilisk/mgw b/iguana/coins/basilisk/mgw new file mode 100755 index 000000000..416befe2d --- /dev/null +++ b/iguana/coins/basilisk/mgw @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"MGW.conf\",\"path\":\"${HOME#"/"}/.komodo/MGW\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MGW\",\"name\":\"MGW\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"fd9feb93\",\"p2p\":12385,\"rpc\":12386,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/mvp b/iguana/coins/basilisk/mvp new file mode 100755 index 000000000..e77c37475 --- /dev/null +++ b/iguana/coins/basilisk/mvp @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"MVP.conf\",\"path\":\"${HOME#"/"}/.komodo/MVP\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":1,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"MVP\",\"name\":\"MVP\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"dd5ce076\",\"p2p\":11675,\"rpc\":11676,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/pangea b/iguana/coins/basilisk/pangea new file mode 100755 index 000000000..715798269 --- /dev/null +++ b/iguana/coins/basilisk/pangea @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"PANGEA.conf\",\"path\":\"${HOME#"/"}/.komodo/PANGEA\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"PANGEA\",\"name\":\"PANGEA\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"5fa45ae8\",\"p2p\":14067,\"rpc\":14068,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/revs b/iguana/coins/basilisk/revs new file mode 100755 index 000000000..6cef30fff --- /dev/null +++ b/iguana/coins/basilisk/revs @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"REVS.conf\",\"path\":\"${HOME#"/"}/.komodo/REVS\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"REVS\",\"name\":\"REVS\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"905c3498\",\"p2p\":10195,\"rpc\":10196,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/shark b/iguana/coins/basilisk/shark new file mode 100755 index 000000000..9a4e73fe2 --- /dev/null +++ b/iguana/coins/basilisk/shark @@ -0,0 +1,2 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"SHARK.conf\",\"path\":\"${HOME#"/"}/.komodo/SHARK\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SHARK\",\"name\":\"SHARK\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"54a5e30c\",\"p2p\":10113,\"rpc\":10114,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" + diff --git a/iguana/coins/basilisk/supernet b/iguana/coins/basilisk/supernet new file mode 100755 index 000000000..c4fc10ea2 --- /dev/null +++ b/iguana/coins/basilisk/supernet @@ -0,0 +1 @@ +curl --url "http://127.0.0.1:7778" --data "{\"conf\":\"SUPERNET.conf\",\"path\":\"${HOME#"/"}/.komodo/SUPERNET\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":0,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":100,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":4,\"endpend\":4,\"services\":129,\"maxpeers\":8,\"newcoin\":\"SUPERNET\",\"name\":\"SUPERNET\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"cc55d9d4\",\"p2p\":11340,\"rpc\":11341,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0,\"seedipaddr\":\"78.47.196.146\"}" diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 43b3092e9..ba23d2770 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -147,6 +147,7 @@ int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32 void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); int32_t dpow_nanomsg_update(struct supernet_info *myinfo); int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr); +void komodo_assetcoins(int32_t fullnode); cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index de9166a23..5e2ff0546 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1553,7 +1553,7 @@ uint16_t komodo_port(char *symbol,uint64_t supply,uint32_t *magicp) #define MAX_CURRENCIES 32 extern char CURRENCIES[][8]; -void komodo_assetcoins() +void komodo_assetcoins(int32_t fullnode) { uint16_t extract_userpass(char *serverport,char *userpass,char *coinstr,char *userhome,char *coindir,char *confname); int32_t i,j; uint32_t magic; cJSON *json; uint16_t port; long filesize; char *userhome,confstr[16],jsonstr[512],magicstr[9],path[512]; struct iguana_info *coin; @@ -1570,7 +1570,7 @@ void komodo_assetcoins() for (j=0; j<4; j++) sprintf(&magicstr[j*2],"%02x",((uint8_t *)&magic)[j]); magicstr[j*2] = 0; - sprintf(jsonstr,"{\"newcoin\":\"%s\",\"RELAY\":-1,\"VALIDATE\":0,\"portp2p\":%u,\"rpcport\":%u,\"netmagic\":\"%s\"}",CURRENCIES[i],port,port+1,magicstr); + sprintf(jsonstr,"{\"newcoin\":\"%s\",\"RELAY\":%d,\"VALIDATE\":0,\"portp2p\":%u,\"rpcport\":%u,\"netmagic\":\"%s\"}",CURRENCIES[i],fullnode,port,port+1,magicstr); if ( (json= cJSON_Parse(jsonstr)) != 0 ) { if ( (coin= iguana_coinadd(CURRENCIES[i],CURRENCIES[i],json,0)) == 0 ) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 69f20cdf8..ffceba6d9 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -244,7 +244,7 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) if ( symbol == 0 || symbol[0] == 0 ) symbol = "KMD"; if ( myinfo->numdpows == 1 ) - komodo_assetcoins(); + komodo_assetcoins(-1); if ( iguana_coinfind(symbol) == 0 ) return(clonestr("{\"error\":\"cant dPoW an inactive coin\"}")); if ( strcmp(symbol,"KMD") == 0 && iguana_coinfind("BTC") == 0 ) @@ -450,19 +450,21 @@ ZERO_ARGS(dpow,notarychains) STRING_AND_INT(dpow,fundnotaries,symbol,numblocks) { int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); - uint8_t pubkeys[64][33]; cJSON *infojson; char coinaddr[64],cmd[1024]; uint64_t signedmask; int32_t i,j,sendflag=0,current=0,height; FILE *fp; double vals[64],sum,val = 0.01; - int32_t n = komodo_notaries("KMD",pubkeys,114000); - if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && (coin= iguana_coinfind("KMD")) != 0 ) + uint8_t pubkeys[64][33]; cJSON *infojson; char coinaddr[64],cmd[1024]; uint64_t signedmask; int32_t i,j,n,sendflag=0,current=0,height; FILE *fp; double vals[64],sum,val = 0.01; + if ( (coin= iguana_coinfind("KMD")) == 0 ) + return(clonestr("{\"error\":\"need KMD active\"}")); + if ( (infojson= dpow_getinfo(myinfo,coin)) != 0 ) + { + current = jint(infojson,"blocks"); + free_json(infojson); + } else return(clonestr("{\"error\":\"cant get current height\"}")); + n = komodo_notaries("KMD",pubkeys,current); + if ( symbol != 0 && strcmp(symbol,"BTC") == 0 && coin != 0 ) { if ( numblocks == 0 ) numblocks = 10000; else sendflag = 1; memset(vals,0,sizeof(vals)); - if ( (infojson= dpow_getinfo(myinfo,coin)) != 0 ) - { - current = jint(infojson,"blocks"); - free_json(infojson); - } else return(clonestr("{\"error\":\"cant get current height\"}")); if ( (coin= iguana_coinfind("BTC")) != 0 ) { if ( (fp= fopen("signedmasks","rb")) != 0 ) diff --git a/iguana/tests/basilisk b/iguana/tests/basilisk new file mode 100755 index 000000000..a4de1766d --- /dev/null +++ b/iguana/tests/basilisk @@ -0,0 +1,2 @@ +#!/bin/bash +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\"}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 7d27ffc2f..bbb9b1bfa 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -22,6 +22,9 @@ THREE_STRINGS(iguana,passthru,asset,function,hex); STRING_ARG(dpow,bindaddr,ipaddr); STRING_AND_INT(dpow,fundnotaries,symbol,numblocks); ZERO_ARGS(dpow,notarychains); +ZERO_ARGS(passthru,paxfiats); +ZERO_ARGS(basilisk,paxfiats); +ZERO_ARGS(iguana,paxfiats); TWO_STRINGS(dex,send,hex,handler); HASH_AND_STRING(dex,gettransaction,txid,symbol); From 9cfe8a792dc636555366b95e3e95f5776c90d068 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 14:49:49 +0200 Subject: [PATCH 364/432] test --- iguana/dpow/dpow_network.c | 1 + iguana/dpow/dpow_rpc.c | 2 ++ iguana/iguana777.c | 30 +++--------------------------- iguana/iguana_init.c | 32 +++++++++++++++++++++++++++++++- iguana/tests/basilisk | 2 -- iguana/tests/basilisks | 17 +++++++++++++++++ iguana/tests/dexalladdresses | 2 ++ iguana/tests/deximportaddress | 4 +++- iguana/tests/dexlistunspent | 2 +- 9 files changed, 60 insertions(+), 32 deletions(-) delete mode 100755 iguana/tests/basilisk create mode 100755 iguana/tests/basilisks diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5e2ff0546..eae80f0fc 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -274,6 +274,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d *broadcastflagp = 1; if ( retstr == 0 ) retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + else printf("funcA.(%s)\n",retstr); } else if ( dexreq.func == 'V' ) { diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 166bfc463..8ee5caec2 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -441,6 +441,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); + printf("importaddress.(%s) -> (%s)\n",address,retstr); if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) { if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) @@ -478,6 +479,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { sprintf(buf,"[\"%s\"]",address); sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); + printf("first importaddress.(%s) -> %s\n",fname); if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(buf,1,strlen(buf)+1,fp); diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 473e0231b..af9ece78f 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -837,23 +837,9 @@ void iguana_helper(void *arg) } } -/* -To add a new dPoW'ed assetchain with DEX* API support: - 1. add to komodo/src: assetchains, dpowassets, fiat-cli - 2. add to end of CURRENCIES[] array in fundnotaries (iguana_notary.c) - 3. create fiat/ - 4. add to NOTARYCHAINS[] array in iguana_callcoinstart - 5. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant - 6. launch from a single node with -gen, launch a second node using -addnode= but without -gen - 7. from a single node, fundnotaries to get notaries able to dPoW -*/ - void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) { - char NOTARYCHAINS[][16] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies - "CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK", - "KMD", "BTC", "REVS", "SUPERNET", "DEX", "PANGEA", "JUMBLR", "BET", "CRYPTO", "HODL", "SHARK", "BOTS", "MGW", "MVP" }; - struct iguana_bundle *bp; struct iguana_peer *addr; int32_t i,bundlei; bits256 zero; char dirname[512],*symbol; + struct iguana_bundle *bp; struct iguana_peer *addr; int32_t bundlei; bits256 zero; char dirname[512],*symbol; iguana_rwiAddrind(coin,0,0,0); //for (i=0; ichain); i++) // printf("%02x",((uint8_t *)coin->chain)[i]); @@ -883,17 +869,8 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) memset(zero.bytes,0,sizeof(zero)); if ( (bp= iguana_bundlecreate(coin,&bundlei,0,*(bits256 *)coin->chain->genesis_hashdata,zero,1)) != 0 ) bp->bundleheight = 0; - coin->notarychain = -1; - if ( coin->FULLNODE == 0 ) - { - for (i=0; isymbol,NOTARYCHAINS[i]) == 0 ) - { - printf("SET NOTARYCHAIN.%d\n",i); - coin->notarychain = i; - break; - } - } + if ( coin->FULLNODE != 0 ) + coin->notarychain = -1; addr = &coin->peers->active[IGUANA_MAXPEERS-2]; iguana_initpeer(coin,addr,(uint32_t)calc_ipbits(coin->seedipaddr)); printf("SEED_IPADDR initpeer.(%s) notarychain.%d\n",addr->ipaddr,coin->notarychain); @@ -919,7 +896,6 @@ void iguana_coinloop(void *arg) if ( coin->didaddresses == 0 ) { coin->didaddresses = 1; - coin->notarychain = -1; if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) { if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 961996a23..9f2622d74 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -15,6 +15,16 @@ #include "iguana777.h" +/* + To add a new dPoW'ed assetchain with DEX* API support: + 1. add to komodo/src: assetchains, dpowassets, fiat-cli + 2. add to end of NOTARY_CURRENCIES[] array in fundnotaries (iguana_notary.c) + 3. create fiat/ + 4. add to m_notary coins/ get gen_acname from where komodod was launched, change RELAY:-1 and port to 7776 and make _7776 variant + 5. launch from a single node with -gen, launch a second node using -addnode= but without -gen + 6. from a single node, fundnotaries to get notaries able to dPoW + */ + void iguana_initQ(queue_t *Q,char *name) { struct stritem *tst,*item; @@ -74,6 +84,7 @@ void iguana_initcoin(struct iguana_info *coin,cJSON *argjson) iguana_meminit(&coin->blockMEM,"blockMEM",coin->blockspace,coin->blockspacesize,0); iguana_initQs(coin); coin->bindsock = -1; + coin->notarychain = -1; OS_randombytes((unsigned char *)&coin->instance_nonce,sizeof(coin->instance_nonce)); coin->startutc = (uint32_t)time(NULL); while ( time(NULL) == coin->startutc ) @@ -516,7 +527,7 @@ void iguana_coinpurge(struct iguana_info *coin) struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_info *coin,int32_t initialheight,int32_t mapflags) { - FILE *fp; char fname[512],*symbol; int32_t j,iter; long fpos; bits256 lastbundle; + FILE *fp; char fname[512],*symbol,*jsonstr; cJSON *chains; int32_t j,i,n,iter; long fpos; bits256 lastbundle; /*if ( coin->peers == 0 ) { printf("cant start privatechain directly\n"); @@ -564,6 +575,25 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ } } } + coin->notarychain = -1; + if ( (jsonstr= dpow_notarychains(0,0,0,0)) != 0 ) + { + if ( (chains= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(chains)) > 0 ) + { + for (i=0; isymbol,jstri(chains,i)) == 0 ) + { + printf("SET %s NOTARYCHAIN.%d\n",coin->symbol,i); + coin->notarychain = i; + break; + } + } + free_json(chains); + } + free(jsonstr); + } if ( coin->notarychain >= 0 ) return(coin); //coin->firstblock = coin->blocks.parsedblocks + 1; diff --git a/iguana/tests/basilisk b/iguana/tests/basilisk deleted file mode 100755 index a4de1766d..000000000 --- a/iguana/tests/basilisk +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\"}" diff --git a/iguana/tests/basilisks b/iguana/tests/basilisks new file mode 100755 index 000000000..078d2463e --- /dev/null +++ b/iguana/tests/basilisks @@ -0,0 +1,17 @@ +#!/bin/bash +../coins/basilisk/bet +../coins/basilisk/btc +../coins/basilisk/dex +../coins/basilisk/jumblr +../coins/basilisk/mgw +../coins/basilisk/pangea +../coins/basilisk/shark +../coins/basilisk/bots +../coins/basilisk/crypto +../coins/basilisk/hodl +../coins/basilisk/kmd +../coins/basilisk/mvp +../coins/basilisk/revs +../coins/basilisk/supernet + +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"basilisk\",\"method\":\"paxfiats\"}" diff --git a/iguana/tests/dexalladdresses b/iguana/tests/dexalladdresses index 24feefa9c..5141f8d1b 100755 --- a/iguana/tests/dexalladdresses +++ b/iguana/tests/dexalladdresses @@ -1,2 +1,4 @@ #!/bin/bash curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"MVP\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"USD\"}" diff --git a/iguana/tests/deximportaddress b/iguana/tests/deximportaddress index ae340b58e..6acb8ffd3 100755 --- a/iguana/tests/deximportaddress +++ b/iguana/tests/deximportaddress @@ -1,2 +1,4 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"15R3C2ZKmak5pCc4duLY2jLtFD3o1jaeNd\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"importaddress\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"MVP\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index ac18edf80..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\":\"listunspent\",\"address\":\"1E2ac2gxeFR2ir1H3vqETTperWkiXkwy99\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"symbol\":\"BTC\"}" From 8423feeba6066d2b2acbbc2d3785752c2efd3a6d Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 14:55:06 +0200 Subject: [PATCH 365/432] test --- iguana/dpow/dpow_network.c | 14 +++++++------- iguana/dpow/dpow_rpc.c | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index eae80f0fc..8392c40f6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -60,7 +60,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t char *retstr; //for (i=0; ipacket,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); + printf(" uniq DEX_PACKET.[%d] crc.%x lag.%d (%d %d)\n",size,calc_crc32(0,dexp->packet,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); if ( 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 ) @@ -163,7 +163,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } - nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + //nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } } @@ -214,7 +214,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d if ( strcmp(dexp->handler,"request") == 0 ) { datalen = dex_rwrequest(0,dexp->packet,&dexreq); - //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); + printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { if ( dexreq.func == 'T' ) @@ -280,7 +280,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); } - } + } else printf("(%s) not active\n",dexreq.name); if ( retstr == 0 ) return(clonestr("{\"error\":\"null return\"}")); } @@ -1324,7 +1324,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { num++; //fprintf(stderr,"%d ",size); - //printf("REP got %d\n",size); + printf("REP got %d\n",size); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); @@ -1341,13 +1341,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); nn_send(myinfo->pubsock,dexp,size,0); - //printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + 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); } } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 8ee5caec2..61c465333 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -441,7 +441,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); - printf("importaddress.(%s) -> (%s)\n",address,retstr); + printf("%s importaddress.(%s) -> (%s)\n",coin->symbol,address,retstr); if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) { if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) @@ -479,7 +479,7 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { sprintf(buf,"[\"%s\"]",address); sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); - printf("first importaddress.(%s) -> %s\n",fname); + printf("%s first importaddress.(%s) -> %s\n",coin->symbol,address,fname); if ( (fp= fopen(fname,"wb")) != 0 ) { fwrite(buf,1,strlen(buf)+1,fp); From 5dcb959b0573f233e5494fc7c29e0cc24cb130f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 14:58:51 +0200 Subject: [PATCH 366/432] test --- iguana/iguana_notary.c | 4 ++-- iguana/m_notary | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ffceba6d9..3f76a9aa4 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -243,8 +243,8 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) return(clonestr("{\"error\":\"need 33 byte pubkey\"}")); if ( symbol == 0 || symbol[0] == 0 ) symbol = "KMD"; - if ( myinfo->numdpows == 1 ) - komodo_assetcoins(-1); + //if ( myinfo->numdpows == 1 ) + // komodo_assetcoins(-1); if ( iguana_coinfind(symbol) == 0 ) return(clonestr("{\"error\":\"cant dPoW an inactive coin\"}")); if ( strcmp(symbol,"KMD") == 0 && iguana_coinfind("BTC") == 0 ) diff --git a/iguana/m_notary b/iguana/m_notary index c26bb80b7..6b629b7c7 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -35,6 +35,7 @@ coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 coins/mvp_7776 +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" From e343d12dd25f97a0146d507947bd8bf2b0b3b886 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 15:00:09 +0200 Subject: [PATCH 367/432] 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 8392c40f6..0f514e630 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1580,7 +1580,7 @@ void komodo_assetcoins(int32_t fullnode) return; } free_json(json); - coin->FULLNODE = -1; + coin->FULLNODE = fullnode; coin->chain->rpcport = port + 1; coin->chain->pubtype = 60; coin->chain->p2shtype = 85; From eb860744b1ebbc8ce7289c8d234bf319b64d10b0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 15:29:09 +0200 Subject: [PATCH 368/432] test --- iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 36 +++++++++++++++------------ iguana/iguana_init.c | 47 +++++++++++++++++++++--------------- iguana/iguana_wallet.c | 8 +++++- iguana/tests/dexalladdresses | 5 ++++ iguana/tests/encryptwallet | 3 ++- 6 files changed, 63 insertions(+), 37 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index ba23d2770..a64777743 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -148,6 +148,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo int32_t dpow_nanomsg_update(struct supernet_info *myinfo); int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr); void komodo_assetcoins(int32_t fullnode); +int32_t iguana_isnotarychain(char *symbol); cJSON *dpow_getinfo(struct supernet_info *myinfo,struct iguana_info *coin); cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0f514e630..1aab131db 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -214,7 +214,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d if ( strcmp(dexp->handler,"request") == 0 ) { datalen = dex_rwrequest(0,dexp->packet,&dexreq); - printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); + //printf("dex_response.%s (%c)\n",dexreq.name,dexreq.func); if ( (coin= iguana_coinfind(dexreq.name)) != 0 ) { if ( dexreq.func == 'T' ) @@ -290,21 +290,27 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) { uint8_t packet[sizeof(*dexreq)]; int32_t datalen; - datalen = dex_rwrequest(1,packet,dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + if ( iguana_isnotarychain(dexreq->name) >= 0 ) + { + datalen = dex_rwrequest(1,packet,dexreq); + return(dex_reqsend(myinfo,"request",packet,datalen)); + } else return(clonestr("{\"error\":\"not notarychain\"}")); } char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str) { uint8_t *packet; int32_t datalen,slen; char *retstr; - slen = (int32_t)strlen(str)+1; - packet = calloc(1,sizeof(*dexreq)+slen); - datalen = dex_rwrequest(1,packet,dexreq); - strcpy((char *)&packet[datalen],str); - datalen += slen; - retstr = dex_reqsend(myinfo,"request",packet,datalen); - free(packet); - return(retstr); + if ( iguana_isnotarychain(dexreq->name) >= 0 ) + { + slen = (int32_t)strlen(str)+1; + packet = calloc(1,sizeof(*dexreq)+slen); + datalen = dex_rwrequest(1,packet,dexreq); + strcpy((char *)&packet[datalen],str); + datalen += slen; + retstr = dex_reqsend(myinfo,"request",packet,datalen); + free(packet); + return(retstr); + } else return(clonestr("{\"error\":\"not notarychain\"}")); } char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid) @@ -320,7 +326,7 @@ char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 t char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) { struct dex_request dexreq; - char str[65]; printf("gettxout(%s %s %d)\n",symbol,bits256_str(str,txid),vout); + //char str[65]; printf("gettxout(%s %s %d)\n",symbol,bits256_str(str,txid),vout); memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; @@ -1324,7 +1330,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { num++; //fprintf(stderr,"%d ",size); - printf("REP got %d\n",size); + //printf("REP got %d\n",size); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); @@ -1341,13 +1347,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { r = myinfo->dpowipbits[rand() % m]; nn_send(myinfo->repsock,&r,sizeof(r),0); - printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); + //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { nn_send(myinfo->dexsock,dexp,size,0); nn_send(myinfo->pubsock,dexp,size,0); - printf("REP.%08x -> dexbus and pub, t.%d lag.%d\n",dexp->crc32,dexp->timestamp,(int32_t)(time(NULL)-dexp->timestamp)); + //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); } } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 9f2622d74..47da77bd1 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -525,9 +525,32 @@ void iguana_coinpurge(struct iguana_info *coin) coin->active = saved; } +int32_t iguana_isnotarychain(char *symbol) +{ + int32_t i,n,notarychain = -1; char *jsonstr; cJSON *chains; + if ( (jsonstr= dpow_notarychains(0,0,0,0)) != 0 ) + { + if ( (chains= cJSON_Parse(jsonstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(chains)) > 0 ) + { + for (i=0; ipeers == 0 ) { printf("cant start privatechain directly\n"); @@ -575,27 +598,11 @@ struct iguana_info *iguana_coinstart(struct supernet_info *myinfo,struct iguana_ } } } - coin->notarychain = -1; - if ( (jsonstr= dpow_notarychains(0,0,0,0)) != 0 ) + if ( (coin->notarychain= iguana_isnotarychain(coin->symbol)) >= 0 ) { - if ( (chains= cJSON_Parse(jsonstr)) != 0 ) - { - if ( (n= cJSON_GetArraySize(chains)) > 0 ) - { - for (i=0; isymbol,jstri(chains,i)) == 0 ) - { - printf("SET %s NOTARYCHAIN.%d\n",coin->symbol,i); - coin->notarychain = i; - break; - } - } - free_json(chains); - } - free(jsonstr); - } - if ( coin->notarychain >= 0 ) + printf("SET %s NOTARYCHAIN.%d\n",coin->symbol,coin->notarychain); return(coin); + } //coin->firstblock = coin->blocks.parsedblocks + 1; iguana_genesis(myinfo,coin,coin->chain); int32_t bundlei = -2; diff --git a/iguana/iguana_wallet.c b/iguana/iguana_wallet.c index 14c8aadc6..9eb8e558b 100755 --- a/iguana/iguana_wallet.c +++ b/iguana/iguana_wallet.c @@ -1367,7 +1367,7 @@ TWOSTRINGS_AND_INT(bitcoinrpc,walletpassphrase,password,permanentfile,timeout) THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) { - char *retstr,buf[128],wifstr[128]; cJSON *retjson; int32_t need_KMD = 0,need_BTC = 0; + char *retstr,buf[128],wifstr[128],*dexstr; cJSON *retjson,*dexjson; int32_t need_KMD = 0,need_BTC = 0; if ( remoteaddr != 0 || coin == 0 ) return(clonestr("{\"error\":\"no remote encrypt or no coin\"}")); iguana_walletlock(myinfo,coin); @@ -1414,6 +1414,12 @@ THREE_STRINGS(bitcoinrpc,encryptwallet,passphrase,password,permanentfile) bitcoin_priv2wif(wifstr,waddr.privkey,128); jaddstr(retjson,"BTCwif",wifstr); } + if ( (dexstr= _dex_importaddress(myinfo,coin->symbol,waddr.coinaddr)) != 0 ) + { + if ( (dexjson= cJSON_Parse(dexstr)) != 0 ) + jadd(retjson,"deximport",dexjson); + free(dexstr); + } retstr = jprint(retjson,1); } //iguana_walletinitcheck(myinfo,coin); diff --git a/iguana/tests/dexalladdresses b/iguana/tests/dexalladdresses index 5141f8d1b..d638ad15c 100755 --- a/iguana/tests/dexalladdresses +++ b/iguana/tests/dexalladdresses @@ -1,4 +1,9 @@ #!/bin/bash +echo BTC curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"BTC\"}" +echo KMD +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"KMD\"}" +echo MVP curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"MVP\"}" +echo USD curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"alladdresses\",\"symbol\":\"USD\"}" diff --git a/iguana/tests/encryptwallet b/iguana/tests/encryptwallet index 2c42f88e6..2d99cd534 100755 --- a/iguana/tests/encryptwallet +++ b/iguana/tests/encryptwallet @@ -1,2 +1,3 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"test\"}" +../coins/basilisk/kmd +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"KMD\",\"agent\":\"bitcoinrpc\",\"method\":\"encryptwallet\",\"passphrase\":\"test\"}" From 6673a219a52c79866c55c3a932a97ea14a70bdf6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 15:35:24 +0200 Subject: [PATCH 369/432] test --- iguana/m_notary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/m_notary b/iguana/m_notary index 6b629b7c7..71c3c11fa 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -35,7 +35,7 @@ coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 coins/mvp_7776 -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\"}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" From 181449b5b1295bf2b8ae3294cb2224369fee38c8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 15:37:49 +0200 Subject: [PATCH 370/432] 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 1aab131db..56ca0f717 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -163,7 +163,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 printf("%d: subscribe connect (%s)\n",myinfo->numdexipbits,str); } } - //nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); + nn_connect(myinfo->reqsock,nanomsg_tcpname(0,str,ipaddr,REP_SOCK)); printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } } From 32a7600a94975f084a057ea2a720609ebfd7b402 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 15:51:28 +0200 Subject: [PATCH 371/432] test --- iguana/iguana777.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index af9ece78f..ad0523099 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -896,8 +896,9 @@ void iguana_coinloop(void *arg) if ( coin->didaddresses == 0 ) { coin->didaddresses = 1; - if ( myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) + if ( coin->notarychain >= 0 && myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) { + printf("(%s) ALL.(%s)\n",coin->symbol,alladdresses); if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) { if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) From 8476ae5098631df767a94350f445b05ae943c517 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 16:20:46 +0200 Subject: [PATCH 372/432] test --- iguana/dpow/dpow_network.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 56ca0f717..91d1ee478 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -271,10 +271,15 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d else if ( dexreq.func == 'A' ) { retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen],0); - *broadcastflagp = 1; if ( retstr == 0 ) + { + *broadcastflagp = 1; retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); - else printf("funcA.(%s)\n",retstr); + } + else + { + printf("funcA.(%s)\n",retstr); + } } else if ( dexreq.func == 'V' ) { From 07460b831d11a9eb45e00ebe8e89caaa25d5ae36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 16:53:06 +0200 Subject: [PATCH 373/432] test --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 4 +++- iguana/dpow/dpow_rpc.c | 43 ++++++++++++++++++++++---------------- iguana/iguana777.c | 2 +- iguana/m_notary | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index a64777743..d098465aa 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -157,7 +157,7 @@ bits256 dpow_getblockhash(struct supernet_info *myinfo,struct iguana_info *coin, bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin); char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx); cJSON *dpow_gettxout(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout); -char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address,int32_t forceflag); +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 91d1ee478..ed29865f5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -270,7 +270,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d } else if ( dexreq.func == 'A' ) { - retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen],0); + retstr = dpow_importaddress(myinfo,coin,(char *)&dexp->packet[datalen]); if ( retstr == 0 ) { *broadcastflagp = 1; @@ -935,6 +935,8 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct { if ( ((1LL << i) & matchesmask) != 0 ) { + if ( bp->notaries[i].pendingcrcs[bp->state < 1000] == 0 ) + continue; if ( numcrcs == 0 ) numcrcs++, crcval = bp->notaries[i].pendingcrcs[bp->state < 1000]; else if ( numcrcs > 0 && crcval == bp->notaries[i].pendingcrcs[bp->state < 1000] ) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 61c465333..54b61732b 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -434,9 +434,22 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) return(retstr); } -char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address,int32_t forceflag) +char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char buf[1024],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson; int32_t i,n; FILE *fp; + char buf[1024],*retstr,*alladdresses,*outstr,fname[1024]; cJSON *alljson,*validatejson; int32_t i,n,doneflag = 0; FILE *fp; + if ( (retstr= dpow_validateaddress(myinfo,coin,address)) != 0 ) + { + if ( (validatejson= cJSON_Parse(retstr)) != 0 ) + { + if ( is_cJSON_True(jobj(validatejson,"iswatchonly")) != 0 || is_cJSON_True(jobj(validatejson,"ismine")) != 0 ) + doneflag = 1; + free_json(validatejson); + } + free(retstr); + retstr = 0; + } + if ( doneflag != 0 ) + return(0); // success if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); @@ -448,27 +461,21 @@ char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,c { if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) { - if ( forceflag == 0 ) - { - for (i=0; isymbol), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) { - outstr = jprint(alljson,0); - sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(outstr,1,strlen(outstr)+1,fp); - fclose(fp); - printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); - } - free(outstr); + fwrite(outstr,1,strlen(outstr)+1,fp); + fclose(fp); + printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); } + free(outstr); } } free_json(alljson); diff --git a/iguana/iguana777.c b/iguana/iguana777.c index ad0523099..0dc0b63f1 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -904,7 +904,7 @@ void iguana_coinloop(void *arg) if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) { for (i=0; i Date: Mon, 9 Jan 2017 17:00:39 +0200 Subject: [PATCH 374/432] 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 ed29865f5..79865f558 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -944,7 +944,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("crcval.%x numcrcs.%d bestmatches.%d matchesmask.%llx\n",crcval,numcrcs,bestmatches,(long long)matchesmask); - if ( bestmatches >= bp->minsigs && numcrcs >= bp->minsigs ) + if ( bestmatches >= bp->minsigs ) { if ( bp->pendingratifybestk != bp->ratifybestk || bp->pendingratifybestmask != bp->ratifybestmask ) { From 7ff9eefbe0f508c22ba51a3def44c7878fe48322 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 9 Jan 2017 17:06:43 +0200 Subject: [PATCH 375/432] test --- iguana/m_notary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/m_notary b/iguana/m_notary index 7572a8068..8f4f95d60 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -35,7 +35,7 @@ coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 coins/mvp_7776 -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"timeout\":60000}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"timeout\":200000}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" From abbcce6dd63d143b3c5aa34bd46b9e3e77fe1a2a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 15:29:58 +0200 Subject: [PATCH 376/432] test --- iguana/dPoW.h | 1 + iguana/dpow/dpow_network.c | 2 +- iguana/dpow/dpow_rpc.c | 104 +++++++++++++++++++++++-------------- iguana/dpow/dpow_tx.c | 24 +++++---- iguana/iguana777.c | 19 ++----- 5 files changed, 84 insertions(+), 66 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index d098465aa..7ceb304b1 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -162,6 +162,7 @@ char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); +void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 txid); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 79865f558..ed29865f5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -944,7 +944,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("crcval.%x numcrcs.%d bestmatches.%d matchesmask.%llx\n",crcval,numcrcs,bestmatches,(long long)matchesmask); - if ( bestmatches >= bp->minsigs ) + if ( bestmatches >= bp->minsigs && numcrcs >= bp->minsigs ) { if ( bp->pendingratifybestk != bp->ratifybestk || bp->pendingratifybestmask != bp->ratifybestmask ) { diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 54b61732b..48eac3fc9 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -434,9 +434,72 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) return(retstr); } +void update_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin,char *address) +{ + char *alladdresses,*outstr,fname[1024],buf[512]; cJSON *alljson; int32_t i,n; FILE *fp; + if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) + { + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; isymbol), OS_compatible_path(fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(outstr,1,strlen(outstr)+1,fp); + fclose(fp); + printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); + } + free(outstr); + } + } + free_json(alljson); + } + free(alladdresses); + } + else + { + sprintf(buf,"[\"%s\"]",address); + sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); + printf("%s first importaddress.(%s) -> %s\n",coin->symbol,address,fname); + if ( (fp= fopen(fname,"wb")) != 0 ) + { + fwrite(buf,1,strlen(buf)+1,fp); + fclose(fp); + } + } +} + +void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *alladdresses,*retstr; cJSON *alljson; int32_t i,n; + if ( (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) + { + printf("(%s) ALL.(%s)\n",coin->symbol,alladdresses); + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; isymbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); printf("%s importaddress.(%s) -> (%s)\n",coin->symbol,address,retstr); - if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) - { - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) - { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) - { - for (i=0; isymbol), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(outstr,1,strlen(outstr)+1,fp); - fclose(fp); - printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); - } - free(outstr); - } - } - free_json(alljson); - } - free(alladdresses); - } - else - { - sprintf(buf,"[\"%s\"]",address); - sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); - printf("%s first importaddress.(%s) -> %s\n",coin->symbol,address,fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(buf,1,strlen(buf)+1,fp); - fclose(fp); - } - } + update_alladdresses(myinfo,coin,address); return(retstr); } else return(0); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 79559c10f..e564aa895 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -256,7 +256,7 @@ int32_t dpow_voutstandard(struct dpow_block *bp,uint8_t *serialized,int32_t m,in bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs,int32_t src_or_dest,uint8_t pubkeys[][33],int32_t numratified) { - uint32_t k,m,numsigs,version,vout,sequenceid = 0xffffffff; bits256 zero; int32_t n,siglen,len; uint8_t serialized[32768],*sig; bits256 txid; struct dpow_entry *ep; struct dpow_coinentry *cp; + uint32_t k,m,numsigs,version,vout,crcval,sequenceid = 0xffffffff; bits256 zero; int32_t n,siglen,len; uint8_t serialized[32768],*sig; bits256 txid; struct dpow_entry *ep; struct dpow_coinentry *cp; signedtx[0] = 0; *numsigsp = 0; memset(zero.bytes,0,sizeof(zero)); @@ -336,6 +336,16 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow len += n; init_hexbytes_noT(signedtx,serialized,len); //printf("notarytx.(%s) opretlen.%d\n",signedtx,opretlen); + if ( usesigs == 0 && bestk >= 0 ) + { + crcval = calc_crc32(0,bp->ratifyrawtx[src_or_dest],bp->rawratifiedlens[src_or_dest]); + if ( crcval != bp->pendingcrcs[src_or_dest] ) + { + printf("new crcval.[%d] %x != %x\n",src_or_dest,crcval,bp->pendingcrcs[src_or_dest]); + bp->pendingcrcs[src_or_dest] = crcval; + } + bp->notaries[bp->myind].pendingcrcs[src_or_dest] = bp->pendingcrcs[src_or_dest]; + } *numsigsp = numsigs; return(bits256_doublesha256(0,serialized,len)); } @@ -486,7 +496,7 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct dpow_info *dp,struct igu int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t myind,uint32_t deprec,int32_t src_or_dest,int32_t useratified) { - int32_t j,m,numsigs,len,siglen,retval=-1; uint32_t crcval; char rawtx[32768],*jsonstr,*rawtx2,*signedtx,*sigstr; cJSON *item,*sobj,*vins,*vin,*txobj2,*signobj; bits256 txid,srchash,zero; struct dpow_entry *ep; + int32_t j,m,numsigs,len,siglen,retval=-1; char rawtx[32768],*jsonstr,*rawtx2,*signedtx,*sigstr; cJSON *item,*sobj,*vins,*vin,*txobj2,*signobj; bits256 txid,srchash,zero; struct dpow_entry *ep; ep = &bp->notaries[myind]; memset(&zero,0,sizeof(zero)); if ( bestk < 0 ) @@ -504,14 +514,7 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct dpow_info *dp,struc len = (int32_t)strlen(rawtx) >> 1; if ( len <= sizeof(bp->ratifyrawtx[0]) ) { - decode_hex(bp->ratifyrawtx[src_or_dest],len,rawtx), bp->rawratifiedlens[src_or_dest] = len; - crcval = calc_crc32(0,bp->ratifyrawtx[src_or_dest],bp->rawratifiedlens[src_or_dest]); - if ( crcval != bp->pendingcrcs[src_or_dest] ) - { - printf("new crcval.[%d] %x != %x\n",src_or_dest,crcval,bp->pendingcrcs[src_or_dest]); - bp->pendingcrcs[src_or_dest] = crcval; - } - bp->notaries[bp->myind].pendingcrcs[src_or_dest] = bp->pendingcrcs[src_or_dest]; + decode_hex(bp->ratifyrawtx[src_or_dest],len,rawtx),bp->rawratifiedlens[src_or_dest] = len; } if ( (jsonstr= dpow_signrawtransaction(myinfo,coin,rawtx,vins)) != 0 ) { @@ -564,6 +567,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_info *dp,struct dpo channel = (src_or_dest != 0) ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL; if ( bestk >= 0 && bp->state != 0xffffffff && coin != 0 ) { + dpow_notarytx(bp->signedtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,0,src_or_dest,pubkeys,numratified); // setcrcval signedtxid = dpow_notarytx(bp->signedtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,1,src_or_dest,pubkeys,numratified); //printf("src_or_dest.%d bestk.%d %llx %s numsigs.%d signedtx.(%s)\n",src_or_dest,bestk,(long long)bestmask,bits256_str(str,signedtxid),numsigs,bp->signedtx); bp->state = 1; diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 0dc0b63f1..bde87f374 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -879,7 +879,7 @@ void iguana_callcoinstart(struct supernet_info *myinfo,struct iguana_info *coin) void iguana_coinloop(void *arg) { - struct supernet_info *myinfo; int32_t flag,i,j,n; cJSON *alljson; struct iguana_peer *addr; bits256 zero; uint32_t now; char *alladdresses,*retstr; struct iguana_info *coin,**coins = arg; + struct supernet_info *myinfo; int32_t flag,i,j,n; struct iguana_peer *addr; bits256 zero; uint32_t now; struct iguana_info *coin,**coins = arg; myinfo = SuperNET_MYINFO(0); n = (int32_t)(long)coins[0]; coins++; @@ -896,21 +896,8 @@ void iguana_coinloop(void *arg) if ( coin->didaddresses == 0 ) { coin->didaddresses = 1; - if ( coin->notarychain >= 0 && myinfo->IAMNOTARY != 0 && (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) - { - printf("(%s) ALL.(%s)\n",coin->symbol,alladdresses); - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) - { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) - { - for (i=0; inotarychain >= 0 && myinfo->IAMNOTARY != 0 ) + init_alladdresses(myinfo,coin); } if ( coin->FULLNODE < 0 || coin->notarychain >= 0 ) continue; From 42937551939ef050d7c25461199885fc75eef24d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 15:41:47 +0200 Subject: [PATCH 377/432] 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 ed29865f5..dd19d55b5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -944,7 +944,7 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct } } //printf("crcval.%x numcrcs.%d bestmatches.%d matchesmask.%llx\n",crcval,numcrcs,bestmatches,(long long)matchesmask); - if ( bestmatches >= bp->minsigs && numcrcs >= bp->minsigs ) + if ( bestmatches >= bp->minsigs )//&& numcrcs >= bp->minsigs ) { if ( bp->pendingratifybestk != bp->ratifybestk || bp->pendingratifybestmask != bp->ratifybestmask ) { From 7f5670f91ce98f6bf27908cf43bf7b850067d032 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 15:46:02 +0200 Subject: [PATCH 378/432] test --- iguana/dPoW.h | 2 ++ iguana/dpow/dpow_network.c | 6 +++--- iguana/dpow/dpow_tx.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 7ceb304b1..da8db86e2 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -51,6 +51,8 @@ #define PUB_SOCK 7773 #define REP_SOCK 7772 +#define DPOW_EPOCHDURATION 600 + struct dpow_coinentry { bits256 prev_hash; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index dd19d55b5..ca093a82f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -902,12 +902,12 @@ void dpow_ratify_update(struct supernet_info *myinfo,struct dpow_info *dp,struct if ( besti >= 0 && bestks[besti] >= 0 && masks[besti] != 0 && (bp->ratifyrecvmask & masks[besti]) == masks[besti] ) bp->ratifybestmask = masks[besti], bp->ratifybestk = bestks[besti]; //printf("numdiff.%d besti.%d numbest.%d (%d %llx) vs (%d %llx)\n",numdiff,besti,best,besti>=0?bestks[besti]:-1,(long long)(besti>=0?masks[besti]:0),bestk,(long long)bestmask); - if ( bp->ratifybestmask == 0 || (time(NULL) / 100) != bp->lastepoch ) + if ( bp->ratifybestmask == 0 || (time(NULL) / DPOW_EPOCHDURATION) != bp->lastepoch ) { bp->ratifybestmask = dpow_ratifybest(bp->ratifyrecvmask,bp,&bp->ratifybestk); - if ( (time(NULL) / 100) != bp->lastepoch ) + if ( (time(NULL) / DPOW_EPOCHDURATION) != bp->lastepoch ) { - bp->lastepoch = (uint32_t)(time(NULL) / 100); + bp->lastepoch = (uint32_t)(time(NULL) / DPOW_EPOCHDURATION); printf("epoch %u\n",bp->lastepoch % bp->numnotaries); sleep(2 + (rand() % 7)); } diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index e564aa895..abdce53ce 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -82,7 +82,7 @@ uint64_t dpow_ratifybest(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) *lastkp = -1; for (m=j=0; jnumnotaries; j++) { - k = (j + ((uint32_t)time(NULL) / 100)) % bp->numnotaries;//DPOW_MODIND(bp,j); + k = (j + ((uint32_t)time(NULL) / DPOW_EPOCHDURATION)) % bp->numnotaries;//DPOW_MODIND(bp,j); if ( bp->require0 != 0 && k == 0 ) continue; if ( bits256_nonz(bp->notaries[k].ratifysrcutxo) != 0 && bits256_nonz(bp->notaries[k].ratifydestutxo) != 0 ) From 2eceb845edd9eef03c6a6506be904f6d370ddc60 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 18:00:05 +0200 Subject: [PATCH 379/432] test --- iguana/dpow/dpow_rpc.c | 97 ++++++++++++++++++++------------------- iguana/dpow/dpow_tx.c | 2 +- includes/iguana_structs.h | 3 ++ 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 48eac3fc9..d7568df26 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -436,64 +436,49 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) void update_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char *alladdresses,*outstr,fname[1024],buf[512]; cJSON *alljson; int32_t i,n; FILE *fp; - if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) - { - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + struct hashstr_item *hashstr,*tmp; cJSON *alljson; char *alladdresses,*outstr,fname[1024]; int32_t i,n,saveflag = 0; + HASH_FIND(hh,coin->alladdresses,address,strlen(address),hashstr); + if ( hashstr == 0 ) + { + hashstr = calloc(1,sizeof(*hashstr)); + strncpy(hashstr->address,address,sizeof(hashstr->address)); + HASH_ADD_KEYPTR(hh,coin->alladdresses,hashstr->address,strlen(address),hashstr); + saveflag = 1; + if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) { - for (i=0; i 0 ) { - jaddistr(alljson,address); - outstr = jprint(alljson,0); - sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); - if ( (fp= fopen(fname,"wb")) != 0 ) - { - fwrite(outstr,1,strlen(outstr)+1,fp); - fclose(fp); - printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); - } - free(outstr); + for (i=0; ialladdresses,hashstr,tmp) + { + jaddistr(alljson,hashstr->address); + } + outstr = jprint(alljson,0); sprintf(fname,"%s/alladdresses.%s",GLOBAL_CONFSDIR,coin->symbol), OS_compatible_path(fname); - printf("%s first importaddress.(%s) -> %s\n",coin->symbol,address,fname); if ( (fp= fopen(fname,"wb")) != 0 ) { - fwrite(buf,1,strlen(buf)+1,fp); + fwrite(outstr,1,strlen(outstr)+1,fp); fclose(fp); + printf("importaddress.(%s) -> alladdresses.%s\n",address,coin->symbol); } - } -} - -void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) -{ - char *alladdresses,*retstr; cJSON *alljson; int32_t i,n; - if ( (alladdresses= _dex_alladdresses(myinfo,coin->symbol)) != 0 ) - { - printf("(%s) ALL.(%s)\n",coin->symbol,alladdresses); - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) - { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) - { - for (i=0; iFULLNODE < 0 ) { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"importaddress",buf); printf("%s importaddress.(%s) -> (%s)\n",coin->symbol,address,retstr); - update_alladdresses(myinfo,coin,address); return(retstr); } else return(0); } +void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) +{ + char *alladdresses,*retstr; cJSON *alljson; int32_t i,n; + if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) + { + printf("(%s) ALL.(%s)\n",coin->symbol,alladdresses); + if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) + { + if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) + { + for (i=0; i> 1; - if ( len <= sizeof(bp->ratifyrawtx[0]) ) + if ( len <= sizeof(bp->ratifyrawtx[src_or_dest]) ) { decode_hex(bp->ratifyrawtx[src_or_dest],len,rawtx),bp->rawratifiedlens[src_or_dest] = len; } diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index 0552c6854..e1a0d61bc 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -464,6 +464,8 @@ struct iguana_RTtxid struct iguana_RTspend *spends[]; }; +struct hashstr_item { UT_hash_handle hh; char address[40]; }; + struct iguana_info { UT_hash_handle hh; @@ -533,6 +535,7 @@ struct iguana_info uint32_t lastbesthashtime; bits256 lastbesthash; int32_t lastbestheight; struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; + struct hashstr_item *alladdresses; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; }; From 4f481d0f7e66cc3c43ebf5604c7e2b586735b6a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 18:07:51 +0200 Subject: [PATCH 380/432] 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 ca093a82f..5292b9e5b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -61,7 +61,7 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t //for (i=0; ipacket,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); - if ( dexp->datalen > BASILISK_KEYSIZE ) + 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 ) free(retstr); From 6715d7adf498b9fc5c608b4b9a37783cbe92d171 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 18:16:48 +0200 Subject: [PATCH 381/432] test --- iguana/dpow/dpow_network.c | 54 ++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5292b9e5b..2015f42ac 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -23,6 +23,27 @@ struct dex_nanomsghdr uint8_t version0,version1,packet[]; } PACKED; +struct dex_request { bits256 hash; int32_t intarg; uint16_t shortarg; char name[15]; uint8_t func; }; + +int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) +{ + int32_t len = 0; + len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->intarg),&dexreq->intarg); + len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->shortarg),&dexreq->shortarg); + if ( rwflag != 0 ) + { + memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); + serialized[len++] = dexreq->func; + } + else + { + memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name); + dexreq->func = serialized[len++]; + } + return(len); +} + void dex_init(struct supernet_info *myinfo) { strcpy(myinfo->dexseed_ipaddr,"78.47.196.146"); @@ -57,7 +78,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; + char *retstr; int32_t datalen; struct iguana_info *coin; struct dex_request dexreq; //for (i=0; ipacket,dexp->datalen),(int32_t)(time(NULL)-dexp->timestamp),dexp->size,dexp->datalen); @@ -66,6 +87,16 @@ void dex_packet(struct supernet_info *myinfo,struct dex_nanomsghdr *dexp,int32_t if ( (retstr= basilisk_respond_addmessage(myinfo,dexp->packet,BASILISK_KEYSIZE,&dexp->packet[BASILISK_KEYSIZE],dexp->datalen-BASILISK_KEYSIZE,0,BASILISK_DEXDURATION)) != 0 ) free(retstr); } + else if ( strcmp(dexp->handler,"request") == 0 ) + { + datalen = dex_rwrequest(0,dexp->packet,&dexreq); + if ( 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); + } } char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) @@ -186,27 +217,6 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -struct dex_request { bits256 hash; int32_t intarg; uint16_t shortarg; char name[15]; uint8_t func; }; - -int32_t dex_rwrequest(int32_t rwflag,uint8_t *serialized,struct dex_request *dexreq) -{ - int32_t len = 0; - len += iguana_rwbignum(rwflag,&serialized[len],sizeof(dexreq->hash),dexreq->hash.bytes); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->intarg),&dexreq->intarg); - len += iguana_rwnum(rwflag,&serialized[len],sizeof(dexreq->shortarg),&dexreq->shortarg); - if ( rwflag != 0 ) - { - memcpy(&serialized[len],dexreq->name,sizeof(dexreq->name)), len += sizeof(dexreq->name); - serialized[len++] = dexreq->func; - } - else - { - memcpy(dexreq->name,&serialized[len],sizeof(dexreq->name)), len += sizeof(dexreq->name); - dexreq->func = serialized[len++]; - } - return(len); -} - char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { char buf[65],*retstr = 0; int32_t datalen; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; From 132b360e91851495bb69b39e35531f6b3694801c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 18:42:50 +0200 Subject: [PATCH 382/432] test --- iguana/dpow/dpow_network.c | 51 ++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2015f42ac..3bb3b33df 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -101,7 +101,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 *data,int32_t datalen) { - struct dex_nanomsghdr *dexp; char ipaddr[64],str[128]; int32_t timeout,i,n,size,recvbytes,sentbytes = 0,reqsock,subsock; uint32_t *retptr,ipbits; 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; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); subsock = myinfo->subsock; reqsock = myinfo->reqsock; @@ -174,9 +174,22 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); + ipbits = 0; if ( strcmp(handler,"DEX") == 0 ) - { ipbits = *retptr; + else + { + retstr = clonestr((char *)retptr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + ipbits = juint(retjson,"randipbits"); + free_json(retjson); + printf("GOT randipbits.%08x\n",ipbits); + } + //printf("REQ got.%d (%s)\n",recvbytes,retstr); + } + if ( ipbits != 0 ) + { expand_ipbits(ipaddr,ipbits); n = myinfo->numdexipbits; for (i=0; inumdexipbits,str); } } - else - { - retstr = clonestr((char *)retptr); - //printf("REQ got.%d (%s)\n",recvbytes,retstr); - } nn_freemsg(retptr); portable_mutex_unlock(&myinfo->dexmutex); } @@ -217,6 +225,17 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } +void dpow_randipbits(struct supernet_info *myinfo,cJSON *retjson) +{ + int32_t m; uint32_t ipbits; + if ( (m= myinfo->numdpowipbits) > 0 ) + { + ipbits = myinfo->dpowipbits[(uint32_t)rand() % m]; + jaddnum(retjson,"randipbits",ipbits); + printf("add randipbits.%08x\n",ipbits); + } +} + char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) { char buf[65],*retstr = 0; int32_t datalen; bits256 hash2; cJSON *retjson; struct iguana_info *coin; struct dex_request dexreq; @@ -230,12 +249,18 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d if ( dexreq.func == 'T' ) { if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'O' ) { if ( (retjson= dpow_gettxout(myinfo,coin,dexreq.hash,dexreq.shortarg)) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'H' ) { @@ -246,17 +271,26 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d else if ( dexreq.func == 'B' ) { if ( (retjson= dpow_getblock(myinfo,coin,dexreq.hash)) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'I' ) { if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'U' ) { if ( (retjson= dpow_listunspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'P' ) { @@ -276,7 +310,10 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); if ( (retjson= dpow_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) + { + dpow_randipbits(myinfo,retjson); retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'A' ) { From 8cdc16f0b965934ef234196aa61ccf4115e0b86f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 18:52:19 +0200 Subject: [PATCH 383/432] 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 3bb3b33df..7fc354ba4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -184,9 +184,9 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { ipbits = juint(retjson,"randipbits"); free_json(retjson); - printf("GOT randipbits.%08x\n",ipbits); + if ( ipbits != 0 ) + printf("GOT randipbits.%08x\n",ipbits); } - //printf("REQ got.%d (%s)\n",recvbytes,retstr); } if ( ipbits != 0 ) { @@ -232,7 +232,7 @@ void dpow_randipbits(struct supernet_info *myinfo,cJSON *retjson) { ipbits = myinfo->dpowipbits[(uint32_t)rand() % m]; jaddnum(retjson,"randipbits",ipbits); - printf("add randipbits.%08x\n",ipbits); + //printf("add randipbits.%08x\n",ipbits); } } From c9523753cfe3e4f861651a94131dc4da8c8b718d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 19:06:57 +0200 Subject: [PATCH 384/432] test --- iguana/dpow/dpow_network.c | 75 ++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7fc354ba4..14a8d2cd9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -99,7 +99,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 *data,int32_t datalen) +char *_dex_reqsend(struct supernet_info *myinfo,char *handler,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; char *retstr = 0; portable_mutex_lock(&myinfo->dexmutex); @@ -225,15 +225,17 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -void dpow_randipbits(struct supernet_info *myinfo,cJSON *retjson) +void dpow_randipbits(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *retjson) { - int32_t m; uint32_t ipbits; + int32_t m; uint32_t ipbits; char *coinstr; if ( (m= myinfo->numdpowipbits) > 0 ) { ipbits = myinfo->dpowipbits[(uint32_t)rand() % m]; jaddnum(retjson,"randipbits",ipbits); //printf("add randipbits.%08x\n",ipbits); } + if ( (coinstr= jstr(retjson,"coin")) == 0 ) + jaddstr(retjson,"coin",coin->symbol); } char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) @@ -250,7 +252,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { if ( (retjson= dpow_gettransaction(myinfo,coin,dexreq.hash)) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -258,7 +260,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { if ( (retjson= dpow_gettxout(myinfo,coin,dexreq.hash,dexreq.shortarg)) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -266,13 +268,18 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { hash2 = dpow_getblockhash(myinfo,coin,dexreq.intarg); bits256_str(buf,hash2); - retstr = clonestr(buf); + if ( (retstr= clonestr(buf)) != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'B' ) { if ( (retjson= dpow_getblock(myinfo,coin,dexreq.hash)) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -280,7 +287,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { if ( (retjson= dpow_getinfo(myinfo,coin)) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -288,7 +295,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { if ( (retjson= dpow_listunspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -296,22 +303,39 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { hash2 = dpow_getbestblockhash(myinfo,coin); bits256_str(buf,hash2); - retstr = clonestr(buf); + if ( (retstr= clonestr(buf)) != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'S' ) { retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); + if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } else if ( dexreq.func == '*' ) { retstr = dpow_alladdresses(myinfo,coin); + if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'L' ) { //printf("call list.(%s %d %d)\n",(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg); if ( (retjson= dpow_listtransactions(myinfo,coin,(char *)&dexp->packet[datalen],dexreq.shortarg,dexreq.intarg)) != 0 ) { - dpow_randipbits(myinfo,retjson); + dpow_randipbits(myinfo,coin,retjson); retstr = jprint(retjson,1); } } @@ -327,10 +351,22 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { printf("funcA.(%s)\n",retstr); } + if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } else if ( dexreq.func == 'V' ) { retstr = dpow_validateaddress(myinfo,coin,(char *)&dexp->packet[datalen]); + if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + free(retstr); + retstr = jprint(retjson,1); + } } } else printf("(%s) not active\n",dexreq.name); if ( retstr == 0 ) @@ -339,6 +375,23 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d return(retstr); } +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) +{ + char *retstr = 0; int32_t i,max = myinfo->numdpowipbits; + for (i=0; i<=max; i++) + { + if ( (retstr= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) + { + if ( strncmp(retstr,"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 ) + break; + else if ( i < max-1 ) + free(retstr); + } + printf("automatic retry\n"); + } + return(retstr); +} + char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) { uint8_t packet[sizeof(*dexreq)]; int32_t datalen; From bf0fac201968e49f94b51d7ab57fd7ba3cafe3cc Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 19:29:35 +0200 Subject: [PATCH 385/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- iguana/dpow/dpow_rpc.c | 11 ++++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 14a8d2cd9..8a9490468 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -116,7 +116,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 { timeout = 100; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_SNDTIMEO,&timeout,sizeof(timeout)); - timeout = 2000; + timeout = 1000; nn_setsockopt(reqsock,NN_SOL_SOCKET,NN_RCVTIMEO,&timeout,sizeof(timeout)); //nn_setsockopt(reqsock,NN_TCP,NN_RECONNECT_IVL,&timeout,sizeof(timeout)); if ( myinfo->IAMNOTARY == 0 && subsock < 0 && (subsock= nn_socket(AF_SP,NN_SUB)) >= 0 ) @@ -184,7 +184,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 { ipbits = juint(retjson,"randipbits"); free_json(retjson); - if ( ipbits != 0 ) + if ( 0 && ipbits != 0 ) printf("GOT randipbits.%08x\n",ipbits); } } @@ -377,17 +377,17 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) { - char *retstr = 0; int32_t i,max = myinfo->numdpowipbits; + char *retstr = 0; int32_t i,max = myinfo->numdexipbits; for (i=0; i<=max; i++) { if ( (retstr= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { if ( strncmp(retstr,"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 ) break; - else if ( i < max-1 ) + else if ( i < max ) free(retstr); } - printf("automatic retry\n"); + //printf("automatic retry.%d of %d\n",i,max); } return(retstr); } diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index d7568df26..517078374 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -484,18 +484,23 @@ void update_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin,c char *dpow_importaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - char buf[1024],*retstr; cJSON *validatejson; int32_t doneflag = 0; + char buf[1024],*retstr; cJSON *validatejson; int32_t isvalid=0,doneflag = 0; if ( (retstr= dpow_validateaddress(myinfo,coin,address)) != 0 ) { if ( (validatejson= cJSON_Parse(retstr)) != 0 ) { - if ( is_cJSON_True(jobj(validatejson,"iswatchonly")) != 0 || is_cJSON_True(jobj(validatejson,"ismine")) != 0 ) - doneflag = 1; + if ( (isvalid= is_cJSON_True(jobj(validatejson,"isvalid")) != 0) != 0 ) + { + if ( is_cJSON_True(jobj(validatejson,"iswatchonly")) != 0 || is_cJSON_True(jobj(validatejson,"ismine")) != 0 ) + doneflag = 1; + } free_json(validatejson); } free(retstr); retstr = 0; } + if ( isvalid == 0 ) + return(clonestr("{\"isvalid\":false}")); if ( doneflag != 0 ) return(0); // success update_alladdresses(myinfo,coin,address); From 72dd7a41e9ccaa6196bb387e805ea6b2ce3b1f71 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 19:48:18 +0200 Subject: [PATCH 386/432] test --- gecko/gecko.c | 2 ++ iguana/iguana777.c | 18 +++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gecko/gecko.c b/gecko/gecko.c index 5a0c2dbaa..a3186f5b8 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -180,6 +180,8 @@ struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbo virt->enableCACHE = 1; serialized = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,hexbuf,sizeof(hexbuf),hexstr); iguana_chaininit(myinfo,virt->chain,1,valsobj); + if ( virt->FULLNODE >= 0 ) + virt->chain->userpass[0] = 0; virt->chain->isPoS = 1; hdrsize = (virt->chain->zcash != 0) ? sizeof(struct iguana_msgzblockhdr) : sizeof(struct iguana_msgblockhdr); if ( gecko_blocknonce_verify(virt,serialized,hdrsize,virt->chain->nBits,0,0) > 0 ) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index bde87f374..9f5647168 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -58,6 +58,8 @@ struct iguana_info *iguana_coinadd(char *symbol,char *name,cJSON *argjson,int32_ else { coin->chain = iguana_chainfind(myinfo,(char *)symbol,argjson,1); + if ( coin->FULLNODE >= 0 ) + coin->chain->userpass[0] = 0; coin->peers = calloc(1,sizeof(*coin->peers)); for (j=0; jactive = juint(json,"active"); if ( (coin->minconfirms= minconfirms) == 0 ) coin->minconfirms = (strcmp(symbol,"BTC") == 0) ? 3 : 10; - if ( coin->chain == 0 && (coin->chain= iguana_createchain(json)) == 0 ) - { - printf("cant initialize chain.(%s)\n",jstr(json,0)); - strcpy(coin->name,"illegalcoin"); - coin->symbol[0] = 0; - return(0); - } if ( jobj(json,"RELAY") != 0 ) coin->FULLNODE = jint(json,"RELAY"); else coin->FULLNODE = (strcmp(coin->symbol,"BTCD") == 0); @@ -1159,6 +1154,15 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers, else coin->VALIDATENODE = (strcmp(coin->symbol,"BTCD") == 0); if ( coin->VALIDATENODE > 0 || coin->FULLNODE > 0 ) SuperNET_MYINFO(0)->IAMRELAY++; + if ( coin->chain == 0 && (coin->chain= iguana_createchain(json)) == 0 ) + { + printf("cant initialize chain.(%s)\n",jstr(json,0)); + strcpy(coin->name,"illegalcoin"); + if ( coin->FULLNODE >= 0 ) + coin->chain->userpass[0] = 0; + coin->symbol[0] = 0; + return(0); + } #ifdef __PNACL coin->VALIDATENODE = coin->FULLNODE = 0; #endif From 609c95a92761d7318131875ea95c176ccdcce2f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 19:51:56 +0200 Subject: [PATCH 387/432] test --- iguana/iguana777.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 9f5647168..f51a4493b 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -1206,10 +1206,13 @@ int32_t iguana_launchcoin(struct supernet_info *myinfo,char *symbol,cJSON *json, coins = mycalloc('A',1+1,sizeof(*coins)); if ( (coin= iguana_setcoin(symbol,coins,maxpeers,maxrecvcache,services,initialheight,maphash,minconfirms,maxrequests,maxbundles,json,virtcoin)) != 0 ) { - coins[0] = (void *)((long)1); - coins[1] = coin; - printf("launch.%p coinloop for.%s services.%llx started.%p peers.%p\n",coin,coin->symbol,(long long)services,coin->started,coin->peers); - coin->launched = iguana_launch(coin,"iguana_coinloop",iguana_coinloop,coins,IGUANA_PERMTHREAD); + if ( iguana_isnotarychain(coin->symbol) < 0 ) + { + coins[0] = (void *)((long)1); + coins[1] = coin; + printf("launch.%p coinloop for.%s services.%llx started.%p peers.%p\n",coin,coin->symbol,(long long)services,coin->started,coin->peers); + coin->launched = iguana_launch(coin,"iguana_coinloop",iguana_coinloop,coins,IGUANA_PERMTHREAD); + } coin->active = 1; coin->started = 0; return(1); From d357a85c8fb6bcff3f4a3504f46808cce758d517 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 19:59:59 +0200 Subject: [PATCH 388/432] test --- iguana/dpow/dpow_network.c | 9 ++++++--- iguana/iguana777.c | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 8a9490468..437a14893 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1698,9 +1698,12 @@ void komodo_assetcoins(int32_t fullnode) coin->chain->pubtype = 60; coin->chain->p2shtype = 85; coin->chain->wiftype = 188; - sprintf(confstr,"%s.conf",CURRENCIES[i]); - sprintf(path,"%s/.komodo/%s",userhome,CURRENCIES[i]); - extract_userpass(coin->chain->serverport,coin->chain->userpass,CURRENCIES[i],coin->chain->userhome,path,confstr); + if ( fullnode < 0 ) + { + sprintf(confstr,"%s.conf",CURRENCIES[i]); + sprintf(path,"%s/.komodo/%s",userhome,CURRENCIES[i]); + extract_userpass(coin->chain->serverport,coin->chain->userpass,CURRENCIES[i],coin->chain->userhome,path,confstr); + } } printf("(%s %u) ",CURRENCIES[i],port); } diff --git a/iguana/iguana777.c b/iguana/iguana777.c index f51a4493b..b8284fc27 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -27,10 +27,10 @@ struct iguana_info *iguana_coinfind(char *symbol) struct iguana_info *coin=0; uint32_t symbolcrc; struct supernet_info *myinfo = SuperNET_MYINFO(0); while ( myinfo->allcoins_being_added != 0 ) { - sleep(3); + sleep(1); if ( myinfo->allcoins_being_added != 0 ) printf("wait for coinadd to complete, OK if rare\n"); - sleep(3); + sleep(1); } symbolcrc = calc_crc32(0,symbol,(int32_t)strlen(symbol)); //portable_mutex_lock(&myinfo->allcoins_mutex); From 95d694e376a99329d4fdca9112a4417f2bdd924f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 20:03:30 +0200 Subject: [PATCH 389/432] test --- iguana/dpow/dpow_network.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 437a14893..d23aaf7fb 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -323,12 +323,6 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d else if ( dexreq.func == '*' ) { retstr = dpow_alladdresses(myinfo,coin); - if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) - { - dpow_randipbits(myinfo,coin,retjson); - free(retstr); - retstr = jprint(retjson,1); - } } else if ( dexreq.func == 'L' ) { From 31a3e3a7cde6049d23e810a8378c1d990060a6e2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 20:10:26 +0200 Subject: [PATCH 390/432] test --- gecko/gecko.c | 4 ++-- iguana/iguana777.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gecko/gecko.c b/gecko/gecko.c index a3186f5b8..8de1611bf 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -180,8 +180,8 @@ struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbo virt->enableCACHE = 1; serialized = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,hexbuf,sizeof(hexbuf),hexstr); iguana_chaininit(myinfo,virt->chain,1,valsobj); - if ( virt->FULLNODE >= 0 ) - virt->chain->userpass[0] = 0; + //if ( virt->FULLNODE >= 0 ) + // virt->chain->userpass[0] = 0; virt->chain->isPoS = 1; hdrsize = (virt->chain->zcash != 0) ? sizeof(struct iguana_msgzblockhdr) : sizeof(struct iguana_msgblockhdr); if ( gecko_blocknonce_verify(virt,serialized,hdrsize,virt->chain->nBits,0,0) > 0 ) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index b8284fc27..03c6de357 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -58,8 +58,8 @@ struct iguana_info *iguana_coinadd(char *symbol,char *name,cJSON *argjson,int32_ else { coin->chain = iguana_chainfind(myinfo,(char *)symbol,argjson,1); - if ( coin->FULLNODE >= 0 ) - coin->chain->userpass[0] = 0; + //if ( coin->FULLNODE >= 0 ) + // coin->chain->userpass[0] = 0; coin->peers = calloc(1,sizeof(*coin->peers)); for (j=0; jname,"illegalcoin"); - if ( coin->FULLNODE >= 0 ) - coin->chain->userpass[0] = 0; + //if ( coin->FULLNODE >= 0 ) + // coin->chain->userpass[0] = 0; coin->symbol[0] = 0; return(0); } From 4250bd594875c77b6fa2dad358232e2b1bd6dc2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 20:14:02 +0200 Subject: [PATCH 391/432] test --- gecko/gecko.c | 4 ++-- iguana/iguana777.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gecko/gecko.c b/gecko/gecko.c index 8de1611bf..a3186f5b8 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -180,8 +180,8 @@ struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbo virt->enableCACHE = 1; serialized = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,hexbuf,sizeof(hexbuf),hexstr); iguana_chaininit(myinfo,virt->chain,1,valsobj); - //if ( virt->FULLNODE >= 0 ) - // virt->chain->userpass[0] = 0; + if ( virt->FULLNODE >= 0 ) + virt->chain->userpass[0] = 0; virt->chain->isPoS = 1; hdrsize = (virt->chain->zcash != 0) ? sizeof(struct iguana_msgzblockhdr) : sizeof(struct iguana_msgblockhdr); if ( gecko_blocknonce_verify(virt,serialized,hdrsize,virt->chain->nBits,0,0) > 0 ) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 03c6de357..b8284fc27 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -58,8 +58,8 @@ struct iguana_info *iguana_coinadd(char *symbol,char *name,cJSON *argjson,int32_ else { coin->chain = iguana_chainfind(myinfo,(char *)symbol,argjson,1); - //if ( coin->FULLNODE >= 0 ) - // coin->chain->userpass[0] = 0; + if ( coin->FULLNODE >= 0 ) + coin->chain->userpass[0] = 0; coin->peers = calloc(1,sizeof(*coin->peers)); for (j=0; jname,"illegalcoin"); - //if ( coin->FULLNODE >= 0 ) - // coin->chain->userpass[0] = 0; + if ( coin->FULLNODE >= 0 ) + coin->chain->userpass[0] = 0; coin->symbol[0] = 0; return(0); } From 0a65bc7ad0943396de7a89c25f3300a01b2fdc48 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 20:16:27 +0200 Subject: [PATCH 392/432] test --- gecko/gecko.c | 4 ++-- iguana/iguana777.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gecko/gecko.c b/gecko/gecko.c index a3186f5b8..8de1611bf 100755 --- a/gecko/gecko.c +++ b/gecko/gecko.c @@ -180,8 +180,8 @@ struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbo virt->enableCACHE = 1; serialized = get_dataptr(BASILISK_HDROFFSET,&ptr,&datalen,hexbuf,sizeof(hexbuf),hexstr); iguana_chaininit(myinfo,virt->chain,1,valsobj); - if ( virt->FULLNODE >= 0 ) - virt->chain->userpass[0] = 0; + //if ( virt->FULLNODE >= 0 ) + // virt->chain->userpass[0] = 0; virt->chain->isPoS = 1; hdrsize = (virt->chain->zcash != 0) ? sizeof(struct iguana_msgzblockhdr) : sizeof(struct iguana_msgblockhdr); if ( gecko_blocknonce_verify(virt,serialized,hdrsize,virt->chain->nBits,0,0) > 0 ) diff --git a/iguana/iguana777.c b/iguana/iguana777.c index b8284fc27..03c6de357 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -58,8 +58,8 @@ struct iguana_info *iguana_coinadd(char *symbol,char *name,cJSON *argjson,int32_ else { coin->chain = iguana_chainfind(myinfo,(char *)symbol,argjson,1); - if ( coin->FULLNODE >= 0 ) - coin->chain->userpass[0] = 0; + //if ( coin->FULLNODE >= 0 ) + // coin->chain->userpass[0] = 0; coin->peers = calloc(1,sizeof(*coin->peers)); for (j=0; jname,"illegalcoin"); - if ( coin->FULLNODE >= 0 ) - coin->chain->userpass[0] = 0; + //if ( coin->FULLNODE >= 0 ) + // coin->chain->userpass[0] = 0; coin->symbol[0] = 0; return(0); } From 7d2eb12f780a806f7992617941655e37f950445f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 20:29:02 +0200 Subject: [PATCH 393/432] test --- basilisk/basilisk_MSG.c | 2 +- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 34 +++++++++++++++++----------------- iguana/iguana_notary.c | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 76e019031..c6cb0afa9 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -309,7 +309,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) memcpy(space2,key,BASILISK_KEYSIZE); if ( data != 0 && datalen != 0 ) memcpy(&space2[BASILISK_KEYSIZE],data,datalen); - dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE); + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1); } else printf("sendmessage space too small error for %d\n",datalen); free(space); free(space2); diff --git a/iguana/dPoW.h b/iguana/dPoW.h index da8db86e2..b1118a7d6 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -143,7 +143,7 @@ struct dpow_info uint64_t dpow_notarybestk(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp); int32_t dpow_paxpending(uint8_t *hex,uint32_t *paxwdcrcp); void dex_updateclient(struct supernet_info *myinfo); -char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen); +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen,int32_t M); char *basilisk_respond_addmessage(struct supernet_info *myinfo,uint8_t *key,int32_t keylen,uint8_t *data,int32_t datalen,int32_t sendping,uint32_t duration); int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin); void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_block *bp,bits256 srchash,bits256 desthash,uint32_t channel,uint32_t msgbits,uint8_t *data,int32_t datalen); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d23aaf7fb..30ac38cbf 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -369,7 +369,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d return(retstr); } -char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen) +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen,int32_t M) { char *retstr = 0; int32_t i,max = myinfo->numdexipbits; for (i=0; i<=max; i++) @@ -386,17 +386,17 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstr); } -char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq) +char *_dex_sendrequest(struct supernet_info *myinfo,struct dex_request *dexreq,int32_t M) { uint8_t packet[sizeof(*dexreq)]; int32_t datalen; if ( iguana_isnotarychain(dexreq->name) >= 0 ) { datalen = dex_rwrequest(1,packet,dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen)); + return(dex_reqsend(myinfo,"request",packet,datalen,M)); } else return(clonestr("{\"error\":\"not notarychain\"}")); } -char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str) +char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str,int32_t M) { uint8_t *packet; int32_t datalen,slen; char *retstr; if ( iguana_isnotarychain(dexreq->name) >= 0 ) @@ -406,7 +406,7 @@ char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexre datalen = dex_rwrequest(1,packet,dexreq); strcpy((char *)&packet[datalen],str); datalen += slen; - retstr = dex_reqsend(myinfo,"request",packet,datalen); + retstr = dex_reqsend(myinfo,"request",packet,datalen,M); free(packet); return(retstr); } else return(clonestr("{\"error\":\"not notarychain\"}")); @@ -419,7 +419,7 @@ char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 t safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; dexreq.func = 'T'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,1)); } char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) @@ -431,7 +431,7 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 dexreq.hash = txid; dexreq.shortarg = vout; dexreq.func = 'O'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,3)); } char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) @@ -440,7 +440,7 @@ char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'I'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,1)); } char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) @@ -449,7 +449,7 @@ char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = '*'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,1)); } char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) @@ -459,7 +459,7 @@ char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = hash2; dexreq.func = 'B'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,1)); } char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height) @@ -469,7 +469,7 @@ char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.intarg = height; dexreq.func = 'H'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,1)); } char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) @@ -478,7 +478,7 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'P'; - return(_dex_sendrequest(myinfo,&dexreq)); + return(_dex_sendrequest(myinfo,&dexreq,3)); } char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) @@ -487,7 +487,7 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'S'; - return(_dex_sendrequeststr(myinfo,&dexreq,signedtx)); + return(_dex_sendrequeststr(myinfo,&dexreq,signedtx,3)); } char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) @@ -496,7 +496,7 @@ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'A'; - return(_dex_sendrequeststr(myinfo,&dexreq,address)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); } char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address) @@ -505,7 +505,7 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'V'; - return(_dex_sendrequeststr(myinfo,&dexreq,address)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); } char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) @@ -514,7 +514,7 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'U'; - return(_dex_sendrequeststr(myinfo,&dexreq,address)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); } char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *address,int32_t count,int32_t skip) @@ -525,7 +525,7 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *addr dexreq.intarg = skip; dexreq.shortarg = count; dexreq.func = 'L'; - return(_dex_sendrequeststr(myinfo,&dexreq,address)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 3f76a9aa4..4eaff6fe7 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -381,7 +381,7 @@ TWO_STRINGS(dex,send,hex,handler) decode_hex(data,datalen,hex); if ( handler == 0 || handler[0] == 0 ) handler = "DEX"; - if ( (retstr= dex_reqsend(myinfo,handler,data,datalen)) == 0 ) + if ( (retstr= dex_reqsend(myinfo,handler,data,datalen,1)) == 0 ) return(clonestr("{\"result\":\"success\"}")); else return(retstr); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); From 6a88a0b19cbb39e3aa0a5ee8feb81dd71309c989 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 21:09:52 +0200 Subject: [PATCH 394/432] test --- iguana/dpow/dpow_network.c | 25 ++++++++++++++++++------- iguana/dpow/dpow_rpc.c | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 30ac38cbf..fe4962100 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -371,19 +371,30 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen,int32_t M) { - char *retstr = 0; int32_t i,max = myinfo->numdexipbits; - for (i=0; i<=max; i++) + char *retstrs[64]; int32_t i,j,max = myinfo->numdexipbits; + memset(retstrs,0,sizeof(retstrs)); + for (i=j=0; i<=max; i++) { - if ( (retstr= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) + if ( (retstrs[j]= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { - if ( strncmp(retstr,"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 ) - break; + if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 ) + { + if ( ++j == M ) + break; + } else if ( i < max ) - free(retstr); + free(retstrs[j]); } //printf("automatic retry.%d of %d\n",i,max); } - return(retstr); + if ( j == 1 ) + return(retstrs[0]); + else + { + for (i=0; iFULLNODE < 0 ) { sprintf(buf,"[\"%s\", \"%s\", false]",address,address); From 1a0d039a75da516475f533962405a1123e490063 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 21:18:38 +0200 Subject: [PATCH 395/432] dex scalability --- 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 fe4962100..76994cb2e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -90,12 +90,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 ( 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); } - printf("process broadcast importaddress.(%s) [%s]\n",(char *)&dexp->packet[datalen],dexreq.name); } } From d19f76762e11ebd4b1f368f2aec7fd115cd3d582 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 22:12:26 +0200 Subject: [PATCH 396/432] test --- iguana/dpow/dpow_rpc.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 33045a8c8..eddfe261c 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -444,23 +444,6 @@ void update_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin,c strncpy(hashstr->address,address,sizeof(hashstr->address)); HASH_ADD_KEYPTR(hh,coin->alladdresses,hashstr->address,strlen(address),hashstr); saveflag = 1; - if ( (alladdresses= dpow_alladdresses(myinfo,coin)) != 0 ) - { - if ( (alljson= cJSON_Parse(alladdresses)) != 0 ) - { - if ( is_cJSON_Array(alljson) != 0 && (n= cJSON_GetArraySize(alljson)) > 0 ) - { - for (i=0; i Date: Tue, 10 Jan 2017 22:34:16 +0200 Subject: [PATCH 397/432] syntax --- iguana/dpow/dpow_rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index eddfe261c..b81d1dcf1 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -436,7 +436,7 @@ char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin) void update_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin,char *address) { - struct hashstr_item *hashstr,*tmp; cJSON *alljson; char *alladdresses,*outstr,fname[1024]; int32_t i,n,saveflag = 0; + struct hashstr_item *hashstr,*tmp; cJSON *alljson; char *outstr,fname[1024]; int32_t saveflag = 0; HASH_FIND(hh,coin->alladdresses,address,strlen(address),hashstr); if ( hashstr == 0 ) { From a3224fbded1e10f8370f77d620f1c3c5f873a7e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 10 Jan 2017 23:07:00 +0200 Subject: [PATCH 398/432] test --- iguana/dpow/dpow_network.c | 17 ++++++++++------- iguana/tests/dexlisttransactions | 5 ++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 76994cb2e..6dfd8ca3d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -228,14 +228,17 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 void dpow_randipbits(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *retjson) { int32_t m; uint32_t ipbits; char *coinstr; - if ( (m= myinfo->numdpowipbits) > 0 ) + if ( is_cJSON_Array(retjson) == 0 ) { - ipbits = myinfo->dpowipbits[(uint32_t)rand() % m]; - jaddnum(retjson,"randipbits",ipbits); - //printf("add randipbits.%08x\n",ipbits); + if ( (m= myinfo->numdpowipbits) > 0 ) + { + ipbits = myinfo->dpowipbits[(uint32_t)rand() % m]; + jaddnum(retjson,"randipbits",ipbits); + //printf("add randipbits.%08x\n",ipbits); + } + if ( (coinstr= jstr(retjson,"coin")) == 0 ) + jaddstr(retjson,"coin",coin->symbol); } - if ( (coinstr= jstr(retjson,"coin")) == 0 ) - jaddstr(retjson,"coin",coin->symbol); } char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct dex_nanomsghdr *dexp) @@ -377,7 +380,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { - if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 ) + if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 ) { if ( ++j == M ) break; diff --git a/iguana/tests/dexlisttransactions b/iguana/tests/dexlisttransactions index 2db8fd18e..3dbc78aa6 100755 --- a/iguana/tests/dexlisttransactions +++ b/iguana/tests/dexlisttransactions @@ -1,2 +1,5 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"15R3C2ZKmak5pCc4duLY2jLtFD3o1jaeNd\",\"count\":100,\"skip\":0,\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"count\":100,\"skip\":0,\"symbol\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"count\":100,\"skip\":0,\"symbol\":\"MVP\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RMGpGoX82M1ZUUbHxZ3JKHacxY9NYVakqr\",\"count\":100,\"skip\":0,\"symbol\":\"USD\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listtransactions\",\"address\":\"RMGpGoX82M1ZUUbHxZ3JKHacxY9NYVakqr\",\"count\":100,\"skip\":0,\"symbol\":\"MVP\"}" From e464f5864eb2acf48a9e36309fc5d8533ff620ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Jan 2017 22:29:44 +0200 Subject: [PATCH 399/432] 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 6dfd8ca3d..0abd8f7f3 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1191,7 +1191,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } else if ( i == senderind && ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) flag = senderind; - if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } if ( flag >= 0 ) @@ -1201,7 +1201,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru srchash.bytes[i] = dp->minerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); } - if ( 0 && bp->myind <= 1 ) + if ( 1 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { From b7ae12d0f320de47367bb3e50bd0c2a1371ac09f Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Jan 2017 22:35:43 +0200 Subject: [PATCH 400/432] test --- iguana/dpow/dpow_network.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 0abd8f7f3..d4a5c6e29 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1225,6 +1225,14 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } //else printf("destmask.%llx != bestmask.%llx\n",(long long)bp->destsigsmasks[bp->bestk],(long long)bp->bestmask); } } + else + { + for (i=0; inumnotaries; i++) + { + if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) + paxmatches++; + } + } if ( (rand() % 130) == 0 ) printf("%p ht.%d [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->height,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); } From 759582269524b49bd959ca69ca8fd3d1a9c23211 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Jan 2017 23:38:40 +0200 Subject: [PATCH 401/432] test --- iguana/dpow/dpow_network.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d4a5c6e29..db7640d15 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1231,7 +1231,9 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) paxmatches++; + else printf("%x.%d ",bp->notaries[i].paxwdcrc); } + printf("mypaxcrc.%x\n",bp->paxwdcrc); } if ( (rand() % 130) == 0 ) printf("%p ht.%d [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->height,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); From 12e3021a5f78c25e54ea1825698f70728742a875 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 11 Jan 2017 23:39:48 +0200 Subject: [PATCH 402/432] test --- iguana/dpow/dpow_network.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index db7640d15..99db29ee9 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1191,7 +1191,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru } else if ( i == senderind && ((1LL << bp->myind) & bp->bestmask) != 0 && ((1LL << i) & bp->bestmask) != 0 && ((1LL << bp->myind) & bp->notaries[i].recvmask) == 0 ) flag = senderind; - if ( 1 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) + if ( 0 && bp->myind <= 1 && bp->notaries[i].paxwdcrc != 0 ) printf("%d.(%x %d %llx r%llx) ",i,bp->notaries[i].paxwdcrc,bp->notaries[i].bestk,(long long)bp->notaries[i].bestmask,(long long)bp->notaries[i].recvmask); } if ( flag >= 0 ) @@ -1201,7 +1201,7 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru srchash.bytes[i] = dp->minerkey33[i+1]; dpow_send(myinfo,dp,bp,srchash,bp->hashmsg,0,bp->height,(void *)"ping",0); } - if ( 1 && bp->myind <= 1 ) + if ( 0 && bp->myind <= 1 ) printf("recv.%llx best.(%d %llx) m.%d p.%d:%d b.%d\n",(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,matches,paxmatches,paxbestmatches,bestmatches); if ( bestmatches >= bp->minsigs && paxbestmatches >= bp->minsigs ) { @@ -1231,9 +1231,11 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) paxmatches++; - else printf("%x.%d ",bp->notaries[i].paxwdcrc); + else if ( bp->myind <= 1 ) + printf("%x.%d ",bp->notaries[i].paxwdcrc,i); } - printf("mypaxcrc.%x\n",bp->paxwdcrc); + if ( bp->myind <= 1 ) + printf("mypaxcrc.%x\n",bp->paxwdcrc); } if ( (rand() % 130) == 0 ) printf("%p ht.%d [%d] ips.%d %s NOTARIZE.%d matches.%d paxmatches.%d bestmatches.%d bestk.%d %llx recv.%llx sigmasks.(%llx %llx) senderind.%d state.%x (%x %x %x) pax.%x\n",bp,bp->height,bp->myind,dp->numipbits,dp->symbol,bp->minsigs,matches,paxmatches,bestmatches,bp->bestk,(long long)bp->bestmask,(long long)bp->recvmask,(long long)(bp->bestk>=0?bp->destsigsmasks[bp->bestk]:0),(long long)(bp->bestk>=0?bp->srcsigsmasks[bp->bestk]:0),senderind,bp->state,bp->hashmsg.uints[0],bp->desttxid.uints[0],bp->srctxid.uints[0],bp->paxwdcrc); From c33e5f4f4975b0ecc9d870590f12158c9c3690bf Mon Sep 17 00:00:00 2001 From: fadedreamz Date: Thu, 12 Jan 2017 02:56:59 -0500 Subject: [PATCH 403/432] updated compilation for windows, added bugfix for parallel sync on windows Signed-off-by: fadedreamz --- basilisk/tradebots_SVM.h | 9 +++++++ iguana/iguana_recv.c | 52 +++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/basilisk/tradebots_SVM.h b/basilisk/tradebots_SVM.h index de360d509..d1deef80d 100755 --- a/basilisk/tradebots_SVM.h +++ b/basilisk/tradebots_SVM.h @@ -20,7 +20,16 @@ //#include typedef float svmtype; +#ifdef WIN32 +// fadedreamz@gmail.com - added for successful compilation, however, for MSVC probably require a particular OpenCL SDK +// to work with it (e,g nvidia or amd SDK) +typedef struct fake_opencl_double { + double x; + double y; +}double2; +#else typedef double double2 __attribute__((ext_vector_type(2))); +#endif #define MAX_VECTORS (1440 * 365 * 5) #define MAIN_MAXCORES 16 #define c_to_refc(c) (c) diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index c310b0a12..d64beb07f 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -1291,31 +1291,33 @@ struct iguana_bundle *iguana_bundleset(struct supernet_info *myinfo,struct iguan iguana_bundlespeculate(coin,bp,bundlei,hash2,1); } prevbp = 0, prevbundlei = -2; - iguana_bundlefind(coin,&prevbp,&prevbundlei,prevhash2); - //if ( 0 && block->blockhashes != 0 ) - // fprintf(stderr,"has blockhashes bp.%p[%d] prevbp.%p[%d]\n",bp,bundlei,prevbp,prevbundlei); - if ( prevbp != 0 && prevbundlei >= 0 && (prevblock= iguana_blockfind("bundleset2",coin,prevhash2)) != 0 ) - { - if ( prevbundlei < coin->chain->bundlesize ) - { - if ( prevbp->hdrsi+1 == coin->bundlescount && prevbundlei == coin->chain->bundlesize-1 ) - { - printf("%s AUTOCREATE.%d\n",coin->symbol,prevbp->bundleheight + coin->chain->bundlesize); - if ( (bp= iguana_bundlecreate(coin,bundleip,prevbp->bundleheight + coin->chain->bundlesize,hash2,zero,0)) != 0 ) - { - if ( bp->queued == 0 ) - iguana_bundleQ(myinfo,coin,bp,1000); - } - } - if ( prevbundlei < coin->chain->bundlesize-1 ) - { - //printf("bundlehash2add next %d\n",prevbundlei); - iguana_bundlehash2add(coin,0,prevbp,prevbundlei+1,hash2); - } - if ( 1 && strcmp("BTC",coin->symbol) != 0 ) - iguana_bundlespeculate(coin,prevbp,prevbundlei,prevhash2,2); - } - } + if (bits256_nonz(prevhash2)) { + iguana_bundlefind(coin, &prevbp, &prevbundlei, prevhash2); + //if ( 0 && block->blockhashes != 0 ) + // fprintf(stderr,"has blockhashes bp.%p[%d] prevbp.%p[%d]\n",bp,bundlei,prevbp,prevbundlei); + if (prevbp != 0 && prevbundlei >= 0 && (prevblock = iguana_blockfind("bundleset2", coin, prevhash2)) != 0) + { + if (prevbundlei < coin->chain->bundlesize) + { + if (prevbp->hdrsi + 1 == coin->bundlescount && prevbundlei == coin->chain->bundlesize - 1) + { + printf("%s AUTOCREATE.%d\n", coin->symbol, prevbp->bundleheight + coin->chain->bundlesize); + if ((bp = iguana_bundlecreate(coin, bundleip, prevbp->bundleheight + coin->chain->bundlesize, hash2, zero, 0)) != 0) + { + if (bp->queued == 0) + iguana_bundleQ(myinfo, coin, bp, 1000); + } + } + if (prevbundlei < coin->chain->bundlesize - 1) + { + //printf("bundlehash2add next %d\n",prevbundlei); + iguana_bundlehash2add(coin, 0, prevbp, prevbundlei + 1, hash2); + } + if (1 && strcmp("BTC", coin->symbol) != 0) + iguana_bundlespeculate(coin, prevbp, prevbundlei, prevhash2, 2); + } + } + } } else printf("iguana_bundleset: error adding blockhash\n"); bp = 0, *bundleip = -2; return(iguana_bundlefind(coin,&bp,bundleip,hash2)); From c9a93218f9348f54b0d12974d6d2da3f1fcd3723 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 12 Jan 2017 22:06:26 +0200 Subject: [PATCH 404/432] redundant dex* queries, iguana lock time --- basilisk/basilisk_MSG.c | 2 +- basilisk/basilisk_bitcoin.c | 4 +- basilisk/basilisk_swap.c | 2 +- gecko/gecko_miner.c | 2 +- iguana/dPoW.h | 2 +- iguana/dpow/dpow_network.c | 99 ++++++++++++++++++++++--------------- iguana/iguana_notary.c | 2 +- iguana/iguana_payments.c | 2 +- iguana/iguana_sign.c | 6 ++- iguana/tests/dexgetH | 2 +- iguana/tests/dexlistunspent | 2 +- includes/iguana_funcs.h | 2 +- 12 files changed, 75 insertions(+), 52 deletions(-) diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index c6cb0afa9..86d0eda80 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -309,7 +309,7 @@ HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr) 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); + dex_reqsend(myinfo,"DEX",space2,datalen+BASILISK_KEYSIZE,1,""); } else printf("sendmessage space too small error for %d\n",datalen); free(space); free(space2); diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b3bf8a9da..321ba0c50 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -550,7 +550,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); - if ( (txobj= bitcoin_txcreate(coin->chain->isPoS,0,1,0)) != 0 ) + if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,0,1,0)) != 0 ) { if ( duplicates <= 0 ) duplicates = 1; @@ -609,7 +609,7 @@ char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coi return(clonestr("{\"error\":\"invalid changeaddr or spendscript or addresses\"}")); if ( coin != 0 ) { - if ( (txobj= bitcoin_txcreate(coin->chain->isPoS,locktime,locktime==0?coin->chain->normal_txversion:coin->chain->locktime_txversion,juint(valsobj,"timestamp"))) != 0 ) + if ( (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,locktime,locktime==0?coin->chain->normal_txversion:coin->chain->locktime_txversion,juint(valsobj,"timestamp"))) != 0 ) { spendlen = (int32_t)strlen(spendscriptstr) >> 1; decode_hex(buf,spendlen,spendscriptstr); diff --git a/basilisk/basilisk_swap.c b/basilisk/basilisk_swap.c index b340b81ac..bced7218b 100755 --- a/basilisk/basilisk_swap.c +++ b/basilisk/basilisk_swap.c @@ -325,7 +325,7 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b V[0].ignore_cltverr = ignore_cltverr; if ( dest->I.redeemlen != 0 ) memcpy(V[0].p2shscript,dest->redeemscript,dest->I.redeemlen), V[0].p2shlen = dest->I.redeemlen; - txobj = bitcoin_txcreate(rawtx->coin->chain->isPoS,locktime,userdata == 0 ? 1 : 1,timestamp);//rawtx->coin->chain->locktime_txversion); + txobj = bitcoin_txcreate(rawtx->coin->symbol,rawtx->coin->chain->isPoS,locktime,userdata == 0 ? 1 : 1,timestamp);//rawtx->coin->chain->locktime_txversion); vins = cJSON_CreateArray(); item = cJSON_CreateObject(); if ( userdata != 0 && userdatalen > 0 ) diff --git a/gecko/gecko_miner.c b/gecko/gecko_miner.c index 77b592467..6a7bdee31 100755 --- a/gecko/gecko_miner.c +++ b/gecko/gecko_miner.c @@ -302,7 +302,7 @@ cJSON *gecko_paymentsobj(struct supernet_info *myinfo,cJSON *txjson,cJSON *valso if ( (txversion= juint(valsobj,"txversion")) == 0 ) txversion = (locktime == 0) ? IGUANA_NORMAL_TXVERSION : IGUANA_LOCKTIME_TXVERSION; if ( txjson == 0 ) - txjson = bitcoin_txcreate(1,locktime,txversion,juint(valsobj,"timestamp")); + txjson = bitcoin_txcreate("gecko",1,locktime,txversion,juint(valsobj,"timestamp")); if ( (array= jarray(&n,valsobj,"payments")) != 0 && n > 0 ) { for (i=0; i (%s)\n",dexreq.intarg,bits256_str(buf,hash2)); bits256_str(buf,hash2); - if ( (retstr= clonestr(buf)) != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) - { - dpow_randipbits(myinfo,coin,retjson); - free(retstr); - retstr = jprint(retjson,1); - } + retstr = clonestr(buf); } else if ( dexreq.func == 'B' ) { @@ -306,22 +302,11 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d { hash2 = dpow_getbestblockhash(myinfo,coin); bits256_str(buf,hash2); - if ( (retstr= clonestr(buf)) != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) - { - dpow_randipbits(myinfo,coin,retjson); - free(retstr); - retstr = jprint(retjson,1); - } + retstr = clonestr(buf); } else if ( dexreq.func == 'S' ) { retstr = dpow_sendrawtransaction(myinfo,coin,(char *)&dexp->packet[datalen]); - if ( retstr != 0 && (retjson= cJSON_Parse(retstr)) != 0 ) - { - dpow_randipbits(myinfo,coin,retjson); - free(retstr); - retstr = jprint(retjson,1); - } } else if ( dexreq.func == '*' ) { @@ -372,15 +357,16 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d return(retstr); } -char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen,int32_t M) +char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32_t datalen,int32_t M,char *field) { - char *retstrs[64]; int32_t i,j,max = myinfo->numdexipbits; + char *retstrs[64],*origretstr0 = 0; cJSON *retjson; int32_t err,i,j,max = myinfo->numdexipbits; memset(retstrs,0,sizeof(retstrs)); for (i=j=0; i<=max; i++) { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { - if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 ) + printf("j.%d of max.%d (%s)\n",j,max,retstrs[j]); + if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 && strcmp("0",retstrs[j]) != 0 ) { if ( ++j == M ) break; @@ -394,23 +380,58 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 return(retstrs[0]); else { - for (i=0; iname) >= 0 ) { datalen = dex_rwrequest(1,packet,dexreq); - return(dex_reqsend(myinfo,"request",packet,datalen,M)); + return(dex_reqsend(myinfo,"request",packet,datalen,M,field)); } else return(clonestr("{\"error\":\"not notarychain\"}")); } -char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str,int32_t M) +char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexreq,char *str,int32_t M,char *field) { uint8_t *packet; int32_t datalen,slen; char *retstr; if ( iguana_isnotarychain(dexreq->name) >= 0 ) @@ -420,7 +441,7 @@ char *_dex_sendrequeststr(struct supernet_info *myinfo,struct dex_request *dexre datalen = dex_rwrequest(1,packet,dexreq); strcpy((char *)&packet[datalen],str); datalen += slen; - retstr = dex_reqsend(myinfo,"request",packet,datalen,M); + retstr = dex_reqsend(myinfo,"request",packet,datalen,M,field); free(packet); return(retstr); } else return(clonestr("{\"error\":\"not notarychain\"}")); @@ -433,7 +454,7 @@ char *_dex_getrawtransaction(struct supernet_info *myinfo,char *symbol,bits256 t safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = txid; dexreq.func = 'T'; - return(_dex_sendrequest(myinfo,&dexreq,1)); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32_t vout) @@ -445,7 +466,7 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 dexreq.hash = txid; dexreq.shortarg = vout; dexreq.func = 'O'; - return(_dex_sendrequest(myinfo,&dexreq,3)); + return(_dex_sendrequest(myinfo,&dexreq,3,"value")); } char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) @@ -454,7 +475,7 @@ char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'I'; - return(_dex_sendrequest(myinfo,&dexreq,1)); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) @@ -463,7 +484,7 @@ char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = '*'; - return(_dex_sendrequest(myinfo,&dexreq,1)); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) @@ -473,7 +494,7 @@ char *_dex_getblock(struct supernet_info *myinfo,char *symbol,bits256 hash2) safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.hash = hash2; dexreq.func = 'B'; - return(_dex_sendrequest(myinfo,&dexreq,1)); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height) @@ -483,7 +504,7 @@ char *_dex_getblockhash(struct supernet_info *myinfo,char *symbol,int32_t height safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.intarg = height; dexreq.func = 'H'; - return(_dex_sendrequest(myinfo,&dexreq,1)); + return(_dex_sendrequest(myinfo,&dexreq,3,"*")); } char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) @@ -492,7 +513,7 @@ char *_dex_getbestblockhash(struct supernet_info *myinfo,char *symbol) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'P'; - return(_dex_sendrequest(myinfo,&dexreq,3)); + return(_dex_sendrequest(myinfo,&dexreq,1,"")); } char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *signedtx) @@ -501,7 +522,7 @@ char *_dex_sendrawtransaction(struct supernet_info *myinfo,char *symbol,char *si memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'S'; - return(_dex_sendrequeststr(myinfo,&dexreq,signedtx,3)); + return(_dex_sendrequeststr(myinfo,&dexreq,signedtx,3,"*")); } char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address) @@ -510,7 +531,7 @@ char *_dex_importaddress(struct supernet_info *myinfo,char *symbol,char *address memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'A'; - return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1,"")); } char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *address) @@ -519,7 +540,7 @@ char *_dex_validateaddress(struct supernet_info *myinfo,char *symbol,char *addre memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'V'; - return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1,"")); } char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) @@ -528,7 +549,7 @@ char *_dex_listunspent(struct supernet_info *myinfo,char *symbol,char *address) memset(&dexreq,0,sizeof(dexreq)); safecopy(dexreq.name,symbol,sizeof(dexreq.name)); dexreq.func = 'U'; - return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1,"")); } char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *address,int32_t count,int32_t skip) @@ -539,7 +560,7 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *addr dexreq.intarg = skip; dexreq.shortarg = count; dexreq.func = 'L'; - return(_dex_sendrequeststr(myinfo,&dexreq,address,1)); + return(_dex_sendrequeststr(myinfo,&dexreq,address,1,"")); } int32_t dex_crc32find(struct supernet_info *myinfo,uint32_t crc32) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 4eaff6fe7..8ea940781 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -381,7 +381,7 @@ TWO_STRINGS(dex,send,hex,handler) decode_hex(data,datalen,hex); if ( handler == 0 || handler[0] == 0 ) handler = "DEX"; - if ( (retstr= dex_reqsend(myinfo,handler,data,datalen,1)) == 0 ) + if ( (retstr= dex_reqsend(myinfo,handler,data,datalen,1,"")) == 0 ) return(clonestr("{\"result\":\"success\"}")); else return(retstr); } else return(clonestr("{\"error\":\"dex send: invalid hex\"}")); diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index eaccdb2a0..b28442b15 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -1236,7 +1236,7 @@ ARRAY_OBJ_INT(bitcoinrpc,createrawtransaction,vins,vouts,locktime) bits256 txid; int32_t offset,spendlen=0,n; uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; uint64_t satoshis; char *hexstr,*field,*txstr; cJSON *txobj,*item,*obj,*retjson = cJSON_CreateObject(); if ( remoteaddr != 0 ) return(clonestr("{\"error\":\"no remote\"}")); - if ( coin != 0 && (txobj= bitcoin_txcreate(coin->chain->isPoS,locktime,1,0)) != 0 ) + if ( coin != 0 && (txobj= bitcoin_txcreate(coin->symbol,coin->chain->isPoS,locktime,1,0)) != 0 ) { iguana_createvins(myinfo,coin,txobj,vins); if ( (n= cJSON_GetArraySize(vouts)) > 0 ) diff --git a/iguana/iguana_sign.c b/iguana/iguana_sign.c index f8790f003..ca59d58c8 100755 --- a/iguana/iguana_sign.c +++ b/iguana/iguana_sign.c @@ -1245,10 +1245,12 @@ cJSON *bitcoin_txinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_ return(txobj); } -cJSON *bitcoin_txcreate(int32_t isPoS,int64_t locktime,uint32_t txversion,uint32_t timestamp) +cJSON *bitcoin_txcreate(char *symbol,int32_t isPoS,int64_t locktime,uint32_t txversion,uint32_t timestamp) { cJSON *json = cJSON_CreateObject(); jaddnum(json,"version",txversion); + if ( locktime == 0 && strcmp(symbol,"KMD") == 0 ) + locktime = (uint32_t)time(NULL); jaddnum(json,"locktime",locktime); if ( isPoS != 0 ) jaddnum(json,"timestamp",timestamp == 0 ? time(NULL) : timestamp); @@ -1356,7 +1358,7 @@ P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount if ( M > N || N > 3 ) return(clonestr("{\"error\":\"illegal M or N\"}")); memset(&V,0,sizeof(V)); - txobj = bitcoin_txcreate(active->chain->isPoS,0,coin->chain->normal_txversion,0); + 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. ) diff --git a/iguana/tests/dexgetH b/iguana/tests/dexgetH index 8b1963442..5e87d32a0 100755 --- a/iguana/tests/dexgetH +++ b/iguana/tests/dexgetH @@ -1,2 +1,2 @@ #!/bin/bash -curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"height\":400000,\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"getblockhash\",\"height\":100000,\"symbol\":\"KMD\"}" diff --git a/iguana/tests/dexlistunspent b/iguana/tests/dexlistunspent index 4e353d69b..7347339da 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\":\"listunspent\",\"address\":\"1Hgzt5xsnbfc8UTWqWKSTLRm5bEYHYBoCE\",\"symbol\":\"BTC\"}" +curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"RRyBxbrAPRUBCUpiJgJZYrkxqrh8x5ta9Z\",\"symbol\":\"KMD\"}" diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index efba8cba3..8a106ca3a 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -308,7 +308,7 @@ cJSON *iguana_signtx(struct supernet_info *myinfo,struct iguana_info *coin,bits2 void iguana_addscript(struct iguana_info *coin,cJSON *dest,uint8_t *script,int32_t scriptlen,char *fieldname); bits256 iguana_genesis(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_chain *chain); -cJSON *bitcoin_txcreate(int32_t isPoS,int64_t locktime,uint32_t txversion,uint32_t timestamp); +cJSON *bitcoin_txcreate(char *symbol,int32_t isPoS,int64_t locktime,uint32_t txversion,uint32_t timestamp); cJSON *bitcoin_txoutput(cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t satoshis); cJSON *bitcoin_txinput(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,uint8_t *sigscript,int32_t siglen); From f77157af1a63bd756b715e43dec5bf8135aa411f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 12 Jan 2017 22:21:18 +0200 Subject: [PATCH 405/432] dex* API improvements --- iguana/dpow/dpow_network.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index ddf709393..b1891d45f 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -270,7 +270,7 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d else if ( dexreq.func == 'H' ) { hash2 = dpow_getblockhash(myinfo,coin,dexreq.intarg); - printf("getblockhash %d -> (%s)\n",dexreq.intarg,bits256_str(buf,hash2)); + //printf("getblockhash %d -> (%s)\n",dexreq.intarg,bits256_str(buf,hash2)); bits256_str(buf,hash2); retstr = clonestr(buf); } @@ -365,7 +365,7 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 { if ( (retstrs[j]= _dex_reqsend(myinfo,handler,data,datalen)) != 0 ) { - printf("j.%d of max.%d (%s)\n",j,max,retstrs[j]); + //printf("j.%d of max.%d (%s)\n",j,max,retstrs[j]); if ( strncmp(retstrs[j],"{\"error\":\"null return\"}",strlen("{\"error\":\"null return\"}")) != 0 && strncmp(retstrs[j],"[]",strlen("[]")) != 0 && strcmp("0",retstrs[j]) != 0 ) { if ( ++j == M ) @@ -378,22 +378,22 @@ char *dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int32 } if ( j == 1 ) return(retstrs[0]); - else + else if ( j >= M ) { + origretstr0 = retstrs[0]; err = 0; if ( strcmp(field,"*") != 0 ) { for (i=0; i Date: Fri, 13 Jan 2017 14:20:19 +0200 Subject: [PATCH 406/432] signed_nn --- iguana/dPoW.h | 2 +- iguana/dpow/dpow_fsm.c | 5 +++ iguana/dpow/dpow_network.c | 88 ++++++++++++++++++++++++++++++++------ iguana/iguana777.h | 1 + iguana/iguana_payments.c | 2 +- iguana/iguana_secp.c | 12 ++++-- includes/iguana_funcs.h | 2 +- 7 files changed, 92 insertions(+), 20 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index c585a8204..b0a933f02 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //#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 0x0778 +#define DPOW_VERSION 0x0779 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 592159e1d..5748d9635 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -370,6 +370,11 @@ void dpow_statemachinestart(void *ptr) bp->notaries[myind].ratifydestvout = ep->dest.prev_vout; } } + if ( strcmp(bp->srccoin->symbol,"KMD") == 0 ) + { + memcpy(myinfo->notaries,bp->notaries,bp->numnotaries * sizeof(*bp->notaries)); + myinfo->numnotaries = bp->numnotaries; + } bp->recvmask |= (1LL << myind); bp->notaries[myind].othermask |= (1LL << myind); dp->checkpoint = checkpoint; diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b1891d45f..3bccd4e62 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -16,6 +16,68 @@ // 1. add rpc hooks, debug // 2. sig validate in fsm +struct signed_nnpacket +{ + uint8_t sig64[64]; + bits256 packethash; + uint32_t nonce,packetlen; + uint8_t packet[]; +}; + +int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32_t size) +{ + int32_t i,sentbytes,siglen = 0; uint8_t sig[65]; struct signed_nnpacket *sigpacket; + if ( (sigpacket= calloc(1,size + sizeof(*sigpacket))) != 0 ) + { + sigpacket->packetlen = size; + memcpy(sigpacket->packet,packet,size); + for (i=0; i<10000; i++) + { + sigpacket->nonce = i; + vcalc_sha256(0,sigpacket->packethash.bytes,(void *)&sigpacket->nonce,(int32_t)(size+sizeof(sigpacket->nonce)+sizeof(sigpacket->packetlen))); + if ( sigpacket->packethash.bytes[0] == 0 ) + break; + } + if ( (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) + { + memcpy(sigpacket->sig64,sig+1,64); + sentbytes = nn_send(sock,sigpacket,size + sizeof(*sigpacket),0); + return(sentbytes - siglen); + } + } + return(-1); +} + +int32_t signed_nn_recv(void *ctx,struct dpow_entry *notaries,int32_t n,int32_t sock,void *packetp) +{ + int32_t i,recvbytes; uint8_t pubkey33[33]; bits256 packethash; struct signed_nnpacket *sigpacket; + *(void **)packetp = 0; + recvbytes = nn_recv(sock,&sigpacket,NN_MSG,0); + if ( recvbytes > sizeof(sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) + { + vcalc_sha256(0,packethash.bytes,(void *)&sigpacket->nonce,(int32_t)(sigpacket->packetlen+sizeof(sigpacket->nonce)+sizeof(sigpacket->packetlen))); + if ( bits256_cmp(packethash,sigpacket->packethash) == 0 && sigpacket->packethash.bytes[0] == 0 ) + { + if ( bitcoin_recoververify(ctx,"nnrecv",sigpacket->sig64,sigpacket->packethash,pubkey33,33) == 0 ) + { + for (i=0; inonce,sigpacket->packetlen); + } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); + } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); + if ( sigpacket != 0 ) + nn_freemsg(sigpacket); + return(-1); +} + struct dex_nanomsghdr { uint32_t crc32,size,datalen,timestamp; @@ -162,7 +224,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 pfd.events = NN_POLLOUT; if ( nn_poll(&pfd,1,100) > 0 ) { - sentbytes = nn_send(myinfo->reqsock,dexp,size,0); + sentbytes = signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->reqsock,dexp,size); //printf(" sent.%d:%d datalen.%d\n",sentbytes,size,datalen); break; } @@ -170,7 +232,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 } //for (i=0; ireqsock,&retptr,NN_MSG,0)) >= 0 ) + if ( (recvbytes= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) { //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); @@ -608,7 +670,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; - if ( myinfo->subsock >= 0 && (size= nn_recv(myinfo->subsock,&dexp,NN_MSG,0)) >= 0 ) + if ( myinfo->subsock >= 0 && (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->subsock,&dexp)) >= 0 ) { //printf("SUBSOCK.%08x recv.%d datalen.%d\n",dexp->crc32,size,dexp->datalen); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) @@ -1343,7 +1405,7 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo pfd.events = NN_POLLOUT; if ( nn_poll(&pfd,1,100) > 0 ) { - sentbytes = nn_send(myinfo->dpowsock,np,size,0); + sentbytes = signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dpowsock,np,size); break; } usleep(1000); @@ -1411,7 +1473,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= nn_recv(myinfo->dpowsock,&np,NN_MSG,0)) >= 0 && num < 1000 ) + while ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) { if ( size > 0 ) { @@ -1465,14 +1527,14 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) n = 0; if ( myinfo->dexsock >= 0 ) // from servers { - if ( (size= nn_recv(myinfo->dexsock,&dexp,NN_MSG,0)) > 0 ) + if ( (size= signed_nn_recvnn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { //fprintf(stderr,"%d ",size); num++; if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { //printf("FROM BUS.%08x -> pub\n",dexp->crc32); - nn_send(myinfo->pubsock,dexp,size,0); + signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->pubsock,dexp,size); dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); @@ -1482,19 +1544,19 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( myinfo->repsock >= 0 ) // from clients { - if ( (size= nn_recv(myinfo->repsock,&dexp,NN_MSG,0)) > 0 ) + if ( (size= signed_nn_recvnn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->repsock,&dexp)) > 0 ) { num++; //fprintf(stderr,"%d ",size); //printf("REP got %d\n",size); if ( (retstr= dex_response(&broadcastflag,myinfo,dexp)) != 0 ) { - nn_send(myinfo->repsock,retstr,(int32_t)strlen(retstr)+1,0); + signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,retstr,(int32_t)strlen(retstr)+1); free(retstr); if ( broadcastflag != 0 ) { printf("BROADCAST dexp request.[%d]\n",size); - nn_send(myinfo->dexsock,dexp,size,0); + signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); } } else @@ -1502,13 +1564,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) if ( (m= myinfo->numdpowipbits) > 0 ) { r = myinfo->dpowipbits[rand() % m]; - nn_send(myinfo->repsock,&r,sizeof(r),0); + signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->repsock,&r,sizeof(r)); //printf("REP.%08x <- rand ip m.%d %x\n",dexp->crc32,m,r); } else printf("illegal state without dpowipbits?\n"); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) { - nn_send(myinfo->dexsock,dexp,size,0); - nn_send(myinfo->pubsock,dexp,size,0); + signed_nn_send(myinfo->ctx,myinfo->persistent_priv,myinfo->dexsock,dexp,size); + signed_nn_send(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); } diff --git a/iguana/iguana777.h b/iguana/iguana777.h index f8433bd3a..dfa7132b2 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -137,6 +137,7 @@ struct supernet_info uint8_t logs[256],exps[510]; struct message_info msgids[8192]; double *svmfeatures; + struct dpow_entry notaries[64]; int32_t numnotaries; }; #include "../includes/iguana_funcs.h" diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index b28442b15..9e6d7831a 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -852,7 +852,7 @@ THREE_STRINGS(bitcoinrpc,verifymessage,address,sig,message) // printf("%02x",sigbuf[i]); //printf(" siglen.%d [%d] address.(%s) sig.(%s) message.(%s)\n",len,sigbuf[0],address,sig,message); hash2 = iguana_messagehash2(message,coin->chain->messagemagic); - if ( bitcoin_recoververify(myinfo->ctx,coin->symbol,sigbuf,hash2,pubkey) == 0 ) + if ( bitcoin_recoververify(myinfo->ctx,coin->symbol,sigbuf,hash2,pubkey,0) == 0 ) jadd(retjson,"result",jtrue()); else jadd(retjson,"result",jfalse()); jaddstr(retjson,"coin",coin->symbol); diff --git a/iguana/iguana_secp.c b/iguana/iguana_secp.c index 984379f3a..583b96c5b 100755 --- a/iguana/iguana_secp.c +++ b/iguana/iguana_secp.c @@ -151,14 +151,18 @@ int32_t bitcoin_sign(void *ctx,char *symbol,uint8_t *sig,bits256 txhash2,bits256 return(retval); } -int32_t bitcoin_recoververify(void *ctx,char *symbol,uint8_t *sig65,bits256 messagehash2,uint8_t *pubkey) +int32_t bitcoin_recoververify(void *ctx,char *symbol,uint8_t *sig,bits256 messagehash2,uint8_t *pubkey,size_t plen) { - int32_t retval = -1; size_t plen; secp256k1_pubkey PUB; secp256k1_ecdsa_signature SIG; secp256k1_ecdsa_recoverable_signature rSIG; + int32_t retval = -1; secp256k1_pubkey PUB; secp256k1_ecdsa_signature SIG; secp256k1_ecdsa_recoverable_signature rSIG; pubkey[0] = 0; SECP_ENSURE_CTX { - plen = (sig65[0] <= 31) ? 65 : 33; - secp256k1_ecdsa_recoverable_signature_parse_compact(ctx,&rSIG,sig65 + 1,0); + if ( plen == 0 ) + { + plen = (sig[0] <= 31) ? 65 : 33; + sig++; + } + secp256k1_ecdsa_recoverable_signature_parse_compact(ctx,&rSIG,sig,0); secp256k1_ecdsa_recoverable_signature_convert(ctx,&SIG,&rSIG); if ( secp256k1_ecdsa_recover(ctx,&PUB,&rSIG,messagehash2.bytes) != 0 ) { diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index 8a106ca3a..3dd5b74d0 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -469,7 +469,7 @@ struct iguana_waddress *iguana_waddressadd(struct supernet_info *myinfo,struct i cJSON *iguana_createvins(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *txobj,cJSON *vins); bits256 bitcoin_pubkey33(void *ctx,uint8_t *data,bits256 privkey); bits256 bitcoin_randkey(void *ctx); -int32_t bitcoin_recoververify(void *ctx,char *symbol,uint8_t *sig64,bits256 messagehash2,uint8_t *pubkey); +int32_t bitcoin_recoververify(void *ctx,char *symbol,uint8_t *sig64,bits256 messagehash2,uint8_t *pubkey,size_t plen); int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t script[IGUANA_MAXSCRIPTSIZE],cJSON *scriptobj,int32_t interpret,int64_t nLockTime,struct vin_info *V); cJSON *iguana_spendasm(struct iguana_info *coin,uint8_t *spendscript,int32_t spendlen); uint64_t iguana_unspentavail(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_outpoint outpt,int32_t minconf,int32_t maxconf); From ef2f1487556923e8ff48892ea5d7f22670e2dffe Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:21:36 +0200 Subject: [PATCH 407/432] 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 3bccd4e62..5d02b2b3a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1527,7 +1527,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) n = 0; if ( myinfo->dexsock >= 0 ) // from servers { - if ( (size= signed_nn_recvnn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) + if ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { //fprintf(stderr,"%d ",size); num++; @@ -1544,7 +1544,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } if ( myinfo->repsock >= 0 ) // from clients { - if ( (size= signed_nn_recvnn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->repsock,&dexp)) > 0 ) + if ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->repsock,&dexp)) > 0 ) { num++; //fprintf(stderr,"%d ",size); From 305fad5a99f99b017dd3297391b56e598197bcbf Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:28:21 +0200 Subject: [PATCH 408/432] test --- iguana/dpow/dpow_network.c | 39 ++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5d02b2b3a..2704f6d0c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -48,10 +48,11 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 return(-1); } -int32_t signed_nn_recv(void *ctx,struct dpow_entry *notaries,int32_t n,int32_t sock,void *packetp) +int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int32_t n,int32_t sock,void *packetp) { int32_t i,recvbytes; uint8_t pubkey33[33]; bits256 packethash; struct signed_nnpacket *sigpacket; *(void **)packetp = 0; + *freeptrp = 0; recvbytes = nn_recv(sock,&sigpacket,NN_MSG,0); if ( recvbytes > sizeof(sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { @@ -65,6 +66,7 @@ int32_t signed_nn_recv(void *ctx,struct dpow_entry *notaries,int32_t n,int32_t s { *(void **)packetp = (void **)((uint64_t)sigpacket + sizeof(*sigpacket)); printf("got signed packet from notary.%d\n",i); + *freeptrp = sigpacket; return((int32_t)(recvbytes - sizeof(*sigpacket))); } for (i=0; i<33; i++) @@ -163,7 +165,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 *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; 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; @@ -232,7 +234,7 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 } //for (i=0; ictx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) + if ( (recvbytes= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->reqsock,&retptr)) >= 0 ) { //printf("req returned.[%d]\n",recvbytes); portable_mutex_lock(&myinfo->dexmutex); @@ -273,7 +275,8 @@ char *_dex_reqsend(struct supernet_info *myinfo,char *handler,uint8_t *data,int3 printf("%d: req connect (%s)\n",myinfo->numdexipbits,str); } } - nn_freemsg(retptr); + if ( freeptr != 0 ) + nn_freemsg(freeptr), freeptr = 0, retptr = 0; portable_mutex_unlock(&myinfo->dexmutex); } else @@ -669,8 +672,8 @@ 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; - if ( myinfo->subsock >= 0 && (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->subsock,&dexp)) >= 0 ) + int32_t size= -1; struct dex_nanomsghdr *dexp; void *freeptr; + if ( myinfo->subsock >= 0 && (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->subsock,&dexp)) >= 0 ) { //printf("SUBSOCK.%08x recv.%d datalen.%d\n",dexp->crc32,size,dexp->datalen); if ( dex_packetcheck(myinfo,dexp,size) == 0 ) @@ -678,8 +681,8 @@ int32_t dex_subsock_poll(struct supernet_info *myinfo) //printf("SUBSOCK.%08x ",dexp->crc32); dex_packet(myinfo,dexp,size); } - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; + if ( freeptr != 0 ) + nn_freemsg(freeptr), dexp = 0, freeptr = 0; } return(size); } @@ -1460,7 +1463,7 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t * int32_t dpow_nanomsg_update(struct supernet_info *myinfo) { - int32_t i,n=0,num=0,size,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; + int32_t i,n=0,num=0,size,broadcastflag,firstz = -1; char *retstr; uint32_t crc32,r,m; struct dpow_nanomsghdr *np=0; struct dpow_info *dp; struct dpow_block *bp; struct dex_nanomsghdr *dexp = 0; void *freeptr; if ( time(NULL) < myinfo->nanoinit+5 || (myinfo->dpowsock < 0 && myinfo->dexsock < 0 && myinfo->repsock < 0) ) return(-1); portable_mutex_lock(&myinfo->dpowmutex); @@ -1473,7 +1476,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) + while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) { if ( size > 0 ) { @@ -1521,13 +1524,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); - if ( np != 0 ) - nn_freemsg(np), np = 0; + if ( freeptr != 0 ) + nn_freemsg(np), np = 0, freeptr = 0; } //else printf("no packets\n"); n = 0; if ( myinfo->dexsock >= 0 ) // from servers { - if ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) + if ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dexsock,&dexp)) > 0 ) { //fprintf(stderr,"%d ",size); num++; @@ -1538,13 +1541,13 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) dex_packet(myinfo,dexp,size); } //printf("GOT DEX bus PACKET.%d\n",size); - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; + if ( freeptr != 0 ) + nn_freemsg(freeptr), dexp = 0, freeptr = 0; } } if ( myinfo->repsock >= 0 ) // from clients { - if ( (size= signed_nn_recv(myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->repsock,&dexp)) > 0 ) + if ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->repsock,&dexp)) > 0 ) { num++; //fprintf(stderr,"%d ",size); @@ -1576,8 +1579,8 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } } //printf("GOT DEX rep PACKET.%d\n",size); - if ( dexp != 0 ) - nn_freemsg(dexp), dexp = 0; + if ( freeptr != 0 ) + nn_freemsg(freeptr), dexp = 0, freeptr = 0; } } portable_mutex_unlock(&myinfo->dpowmutex); From 57146c835820f8cb18c7477edcfacfe07049ccb2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:32:02 +0200 Subject: [PATCH 409/432] test --- iguana/dpow/dpow_network.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 2704f6d0c..35981b085 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -77,6 +77,8 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); if ( sigpacket != 0 ) nn_freemsg(sigpacket); + *freeptrp = 0; + *(void **)packetp = 0; return(-1); } From 251f53dbbcf49b51e680613bc5a37984479f6e41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:48:57 +0200 Subject: [PATCH 410/432] test --- iguana/dpow/dpow_network.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 35981b085..11ca373a6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -22,7 +22,7 @@ struct signed_nnpacket bits256 packethash; uint32_t nonce,packetlen; uint8_t packet[]; -}; +} PACKED; int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32_t size) { @@ -75,6 +75,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); + printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket); *freeptrp = 0; From 1022020d59e37aa63244c292b01d78d80a6f8b20 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:52:54 +0200 Subject: [PATCH 411/432] test --- iguana/dpow/dpow_network.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 11ca373a6..d12dd636b 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -76,11 +76,11 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); - if ( sigpacket != 0 ) - nn_freemsg(sigpacket); - *freeptrp = 0; - *(void **)packetp = 0; - return(-1); + //if ( sigpacket != 0 ) + // nn_freemsg(sigpacket); + *freeptrp = sigpacket; + *(void **)packetp = sigpacket; + return(recvbytes); } struct dex_nanomsghdr From 1910f760fb3a9b8e1239724d4e4d38760a54ba6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 14:56:52 +0200 Subject: [PATCH 412/432] 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 d12dd636b..fbb64b592 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -74,8 +74,8 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33\n"); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); - printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); + } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); + //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); //if ( sigpacket != 0 ) // nn_freemsg(sigpacket); *freeptrp = sigpacket; From de19ad7147d02695e1c9713dd0bdcf7d16632321 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 15:13:07 +0200 Subject: [PATCH 413/432] 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 fbb64b592..929a367f4 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -54,7 +54,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int *(void **)packetp = 0; *freeptrp = 0; recvbytes = nn_recv(sock,&sigpacket,NN_MSG,0); - if ( recvbytes > sizeof(sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) + if ( sigpacket != 0 && recvbytes > sizeof(*sigpacket) && sigpacket->packetlen == recvbytes-sizeof(*sigpacket) ) { vcalc_sha256(0,packethash.bytes,(void *)&sigpacket->nonce,(int32_t)(sigpacket->packetlen+sizeof(sigpacket->nonce)+sizeof(sigpacket->packetlen))); if ( bits256_cmp(packethash,sigpacket->packethash) == 0 && sigpacket->packethash.bytes[0] == 0 ) From 0ea5b8cde37bba51a58d86425a45a91186b9b15c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 18:12:08 +0200 Subject: [PATCH 414/432] 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 929a367f4..93dadbf3d 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1525,7 +1525,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); - } else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); + } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } else printf("illegal size.%d\n",size); if ( freeptr != 0 ) nn_freemsg(np), np = 0, freeptr = 0; From 6602994d57f7bb77f0d6ff6791f81aaf282ceead Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 18:26:07 +0200 Subject: [PATCH 415/432] test --- iguana/dpow/dpow_network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 93dadbf3d..0667fe10c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -38,12 +38,13 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 if ( sigpacket->packethash.bytes[0] == 0 ) break; } - if ( (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) + if ( i < 10000 && (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) { memcpy(sigpacket->sig64,sig+1,64); sentbytes = nn_send(sock,sigpacket,size + sizeof(*sigpacket),0); return(sentbytes - siglen); - } + } else printf("couldnt find nonce\n"); + free(sigpacket); } return(-1); } From 1426b6799fe859f39acbbd6b88f3ae779b485d65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 18:55:48 +0200 Subject: [PATCH 416/432] 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 0667fe10c..90d989f0e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -72,7 +72,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } for (i=0; i<33; i++) printf("%02x",pubkey33[i]); - printf(" invalid pubkey33\n"); + printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); From 8f7700d6cd41970b786d30736628061f963846a5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 18:58:06 +0200 Subject: [PATCH 417/432] test --- iguana/dpow/dpow_network.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 90d989f0e..ca8ad4b04 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -63,6 +63,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int if ( bitcoin_recoververify(ctx,"nnrecv",sigpacket->sig64,sigpacket->packethash,pubkey33,33) == 0 ) { for (i=0; i Date: Fri, 13 Jan 2017 19:48:04 +0200 Subject: [PATCH 418/432] test --- iguana/dpow/dpow_fsm.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 5748d9635..3a6bf95a3 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -292,6 +292,8 @@ void dpow_statemachinestart(void *ptr) // printf("%02x",pubkeys[i][j]); //printf(" <= pubkey[%d]\n",i); memcpy(bp->notaries[i].pubkey,pubkeys[i],33); + if ( strcmp("KMD",src->symbol) == 0 ) + memcpy(myinfo->notaries[i].pubkey,pubkeys[i],33); if ( memcmp(bp->notaries[i].pubkey,dp->minerkey33,33) == 0 ) { myind = i; @@ -301,6 +303,8 @@ void dpow_statemachinestart(void *ptr) printf(" MYIND.%d <<<<<<<<<<<<<<<<<<<<<<\n",myind); } } + if ( strcmp("KMD",src->symbol) == 0 ) + myinfo->numnotaries = bp->numnotaries; if ( myind < 0 || ep == 0 ) { printf("minerkey33-> "); @@ -370,11 +374,6 @@ void dpow_statemachinestart(void *ptr) bp->notaries[myind].ratifydestvout = ep->dest.prev_vout; } } - if ( strcmp(bp->srccoin->symbol,"KMD") == 0 ) - { - memcpy(myinfo->notaries,bp->notaries,bp->numnotaries * sizeof(*bp->notaries)); - myinfo->numnotaries = bp->numnotaries; - } bp->recvmask |= (1LL << myind); bp->notaries[myind].othermask |= (1LL << myind); dp->checkpoint = checkpoint; From 74b7e39e570dc9a901bb328e48478e8f0e93f78f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:10:48 +0200 Subject: [PATCH 419/432] 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 ca8ad4b04..3b0d2eba5 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -86,11 +86,11 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); - //if ( sigpacket != 0 ) - // nn_freemsg(sigpacket); + if ( sigpacket != 0 ) + nn_freemsg(sigpacket), sigpacket = 0; *freeptrp = sigpacket; *(void **)packetp = sigpacket; - return(recvbytes); + return(0); } struct dex_nanomsghdr From 83e0bf11eb58e597900516d833926f0837cb6c15 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:13:13 +0200 Subject: [PATCH 420/432] 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 3b0d2eba5..32f635405 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1536,7 +1536,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } //else printf("crc error from.%d %x vs %x or no dp.%p [%s]\n",np->senderind,crc32,np->crc32,dp,np->symbol); } else printf("ignore.%d np->datalen.%d %d (size %d - %ld) [%s]\n",np->senderind,np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np),np->symbol); } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); - } else printf("illegal size.%d\n",size); + } //else printf("illegal size.%d\n",size); if ( freeptr != 0 ) nn_freemsg(np), np = 0, freeptr = 0; } //else printf("no packets\n"); From f46710b179e0b61e9c169ae343ecb683df4a592f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:31:13 +0200 Subject: [PATCH 421/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 8ea940781..ee20596ec 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -160,7 +160,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { char str[65]; - if ( strcmp(dp->symbol,"KMD") == 0 || height != dp->destchaintip.blockhash.height+1 ) + //if ( strcmp(dp->symbol,"KMD") == 0 || height != dp->destchaintip.blockhash.height+1 ) printf("[%s].%d %s %s height.%d vs last.%d\n",dp->symbol,dp->SRCHEIGHT,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { From 70470efbc2847d56e98b6d025a6871e4983a319d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:34:43 +0200 Subject: [PATCH 422/432] test --- iguana/iguana_notary.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index ee20596ec..614344edb 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -153,7 +153,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From d290a3fc550c036e4221e8dee940cc89df9854d1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:38:12 +0200 Subject: [PATCH 423/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_notary.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 32f635405..894871bdf 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -1489,7 +1489,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 1000 ) + while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) > 0 && num < 1000 ) { if ( size > 0 ) { diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 614344edb..cfd44eb50 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -146,6 +146,7 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; + fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( strcmp(dp->symbol,"KMD") == 0 ) { num = dpow_nanomsg_update(myinfo); @@ -153,7 +154,6 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) } src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( src != 0 && dest != 0 ) { dp->numdesttx = sizeof(dp->desttx)/sizeof(*dp->desttx); From fe0f33c70d8b62b87ce1b4b5a4d9bf52766b740b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:41:29 +0200 Subject: [PATCH 424/432] 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 894871bdf..cc3921871 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -84,7 +84,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); + } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; @@ -1489,7 +1489,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) break; usleep(1000); }*/ - while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) > 0 && num < 1000 ) + while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 100 ) { if ( size > 0 ) { From f8eef19a20ead1290e76e15231687ca543437671 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:42:18 +0200 Subject: [PATCH 425/432] 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 cc3921871..b4afc4427 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -86,8 +86,8 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); - if ( sigpacket != 0 ) - nn_freemsg(sigpacket), sigpacket = 0; + //if ( sigpacket != 0 ) + // nn_freemsg(sigpacket), sigpacket = 0; *freeptrp = sigpacket; *(void **)packetp = sigpacket; return(0); From 2553baa771db07f64a5caea93215378a6d7e8811 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:50:02 +0200 Subject: [PATCH 426/432] test --- iguana/dpow/dpow_network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b4afc4427..55cc6a48c 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -51,7 +51,7 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int32_t n,int32_t sock,void *packetp) { - int32_t i,recvbytes; uint8_t pubkey33[33]; bits256 packethash; struct signed_nnpacket *sigpacket; + int32_t i,recvbytes; uint8_t pubkey33[33]; bits256 packethash; struct signed_nnpacket *sigpacket=0; *(void **)packetp = 0; *freeptrp = 0; recvbytes = nn_recv(sock,&sigpacket,NN_MSG,0); @@ -86,8 +86,8 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); - //if ( sigpacket != 0 ) - // nn_freemsg(sigpacket), sigpacket = 0; + if ( sigpacket != 0 ) + nn_freemsg(sigpacket), sigpacket = 0; *freeptrp = sigpacket; *(void **)packetp = sigpacket; return(0); @@ -1538,7 +1538,7 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) } //else printf("wrong version from.%d %02x %02x size.%d [%s]\n",np->senderind,np->version0,np->version1,size,np->symbol); } //else printf("illegal size.%d\n",size); if ( freeptr != 0 ) - nn_freemsg(np), np = 0, freeptr = 0; + nn_freemsg(freeptr), np = 0, freeptr = 0; } //else printf("no packets\n"); n = 0; if ( myinfo->dexsock >= 0 ) // from servers From 7d05dedbd0b36b6524b0033d59566d4e91ec545b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 20:54:36 +0200 Subject: [PATCH 427/432] 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 55cc6a48c..5ef1f2961 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -84,7 +84,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket->packetlen,sizeof(*sigpacket)); + } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; From 025b174131db48ab1e13a2d9c4a3eacf2a23da1d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 21:02:15 +0200 Subject: [PATCH 428/432] 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 5ef1f2961..7f4dfe65a 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -84,7 +84,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); + } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; From 85bf33d06bfee46c2a31a658011feaa93ca2fad3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 21:08:53 +0200 Subject: [PATCH 429/432] test --- iguana/dpow/dpow_network.c | 4 ++-- iguana/m_notary | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 7f4dfe65a..b4e7598ed 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -84,7 +84,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); + } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; @@ -1491,10 +1491,10 @@ int32_t dpow_nanomsg_update(struct supernet_info *myinfo) }*/ while ( (size= signed_nn_recv(&freeptr,myinfo->ctx,myinfo->notaries,myinfo->numnotaries,myinfo->dpowsock,&np)) >= 0 && num < 100 ) { + num++; if ( size > 0 ) { //fprintf(stderr,"%d ",size); - num++; if ( np->version0 == (DPOW_VERSION & 0xff) && np->version1 == ((DPOW_VERSION >> 8) & 0xff) ) { //printf("v.%02x %02x datalen.%d size.%d %d vs %d\n",np->version0,np->version1,np->datalen,size,np->datalen,(int32_t)(size - sizeof(*np))); diff --git a/iguana/m_notary b/iguana/m_notary index 8f4f95d60..34ee8b878 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -35,7 +35,7 @@ coins/crypto_7776 coins/pangea_7776 coins/mgw_7776 coins/mvp_7776 -curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"timeout\":200000}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"passthru\",\"method\":\"paxfiats\",\"timeout\":900000}" #curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"$myip\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KMD\",\"pubkey\":\"$pubkey\"}" From 40eff81964e6f4749768f1063cbbb93da2ed6a30 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 21:11:56 +0200 Subject: [PATCH 430/432] test --- iguana/dpow/dpow_network.c | 2 +- iguana/iguana_notary.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index b4e7598ed..d3d5ccda7 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -84,7 +84,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); - } else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); + } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket)); //printf("free sigpacket.%p freeptrp.%p packetp.%p\n",sigpacket,*freeptrp,*(void **)packetp); if ( sigpacket != 0 ) nn_freemsg(sigpacket), sigpacket = 0; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index cfd44eb50..5f98f1bb8 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -146,7 +146,7 @@ void dpow_destupdate(struct supernet_info *myinfo,struct dpow_info *dp,int32_t h void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) { int32_t height,num; uint32_t blocktime; bits256 blockhash; struct iguana_info *src,*dest; - fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); + //fprintf(stderr,"dp.%p dPoWupdate (%s -> %s)\n",dp,dp!=0?dp->symbol:"",dp!=0?dp->dest:""); if ( strcmp(dp->symbol,"KMD") == 0 ) { num = dpow_nanomsg_update(myinfo); @@ -160,7 +160,7 @@ void iguana_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp) if ( (height= dpow_getchaintip(myinfo,&blockhash,&blocktime,dp->desttx,&dp->numdesttx,dest)) != dp->destchaintip.blockhash.height && height >= 0 ) { char str[65]; - //if ( strcmp(dp->symbol,"KMD") == 0 || height != dp->destchaintip.blockhash.height+1 ) + if ( strcmp(dp->symbol,"KMD") == 0 || height != dp->destchaintip.blockhash.height+1 ) printf("[%s].%d %s %s height.%d vs last.%d\n",dp->symbol,dp->SRCHEIGHT,dp->dest,bits256_str(str,blockhash),height,dp->destchaintip.blockhash.height); if ( height <= dp->destchaintip.blockhash.height ) { From 4189b80f214894658e8485bf72388d504fb951d6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 21:32:32 +0200 Subject: [PATCH 431/432] test --- iguana/dpow/dpow_network.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index d3d5ccda7..af3c8eacc 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -26,7 +26,7 @@ struct signed_nnpacket int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32_t size) { - int32_t i,sentbytes,siglen = 0; uint8_t sig[65]; struct signed_nnpacket *sigpacket; + int32_t i,sentbytes,siglen = 0; uint8_t sig[65],pubkey33[33]; struct signed_nnpacket *sigpacket; if ( (sigpacket= calloc(1,size + sizeof(*sigpacket))) != 0 ) { sigpacket->packetlen = size; @@ -38,8 +38,12 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 if ( sigpacket->packethash.bytes[0] == 0 ) break; } + bitcoin_pubkey33(ctx,pubkey33,privkey); if ( i < 10000 && (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) { + for (i=0; i<33; i++) + printf("%02x",pubkey33[i]); + printf(" signed pubkey\n"); memcpy(sigpacket->sig64,sig+1,64); sentbytes = nn_send(sock,sigpacket,size + sizeof(*sigpacket),0); return(sentbytes - siglen); @@ -71,7 +75,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int *freeptrp = sigpacket; return((int32_t)(recvbytes - sizeof(*sigpacket))); } - if ( i < 2 ) + if ( 0 && i < 2 ) { int32_t j; for (j=0; j<33; j++) @@ -1338,10 +1342,10 @@ void dpow_notarize_update(struct supernet_info *myinfo,struct dpow_info *dp,stru { if ( bp->paxwdcrc == bp->notaries[i].paxwdcrc ) paxmatches++; - else if ( bp->myind <= 1 ) + else if ( 0 && bp->myind <= 1 ) printf("%x.%d ",bp->notaries[i].paxwdcrc,i); } - if ( bp->myind <= 1 ) + if ( 0 && bp->myind <= 1 ) printf("mypaxcrc.%x\n",bp->paxwdcrc); } if ( (rand() % 130) == 0 ) From b5af4b9f3e25b7f022017b5993f9408f626131dd Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Jan 2017 22:03:29 +0200 Subject: [PATCH 432/432] signing --- iguana/dpow/dpow_network.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index af3c8eacc..86c81a22e 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -41,9 +41,9 @@ int32_t signed_nn_send(void *ctx,bits256 privkey,int32_t sock,void *packet,int32 bitcoin_pubkey33(ctx,pubkey33,privkey); if ( i < 10000 && (siglen= bitcoin_sign(ctx,"nnsend",sig,sigpacket->packethash,privkey,1)) > 0 && siglen == 65 ) { - for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); - printf(" signed pubkey\n"); + //for (i=0; i<33; i++) + // printf("%02x",pubkey33[i]); + //printf(" signed pubkey\n"); memcpy(sigpacket->sig64,sig+1,64); sentbytes = nn_send(sock,sigpacket,size + sizeof(*sigpacket),0); return(sentbytes - siglen); @@ -71,7 +71,7 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int if ( memcmp(pubkey33,notaries[i].pubkey,33) == 0 ) { *(void **)packetp = (void **)((uint64_t)sigpacket + sizeof(*sigpacket)); - printf("got signed packet from notary.%d\n",i); + //printf("got signed packet from notary.%d\n",i); *freeptrp = sigpacket; return((int32_t)(recvbytes - sizeof(*sigpacket))); } @@ -83,9 +83,9 @@ int32_t signed_nn_recv(void **freeptrp,void *ctx,struct dpow_entry *notaries,int printf(" pubkey[%d]\n",i); } } - for (i=0; i<33; i++) - printf("%02x",pubkey33[i]); - printf(" invalid pubkey33 n.%d\n",n); + //for (i=0; i<33; i++) + // printf("%02x",pubkey33[i]); + //printf(" invalid pubkey33 n.%d\n",n); } else printf("recoververify error nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } else printf("hash mismatch or bad nonce.%u packetlen.%d\n",sigpacket->nonce,sigpacket->packetlen); } //else printf("recvbytes.%d mismatched packetlen.%d + %ld\n",recvbytes,sigpacket!=0?sigpacket->packetlen:-1,sizeof(*sigpacket));