diff --git a/iguana/iguana777.c b/iguana/iguana777.c index dc65d875f..050f9a535 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -15,7 +15,7 @@ #include "iguana777.h" -const char *Hardcoded_coins[][3] = { { "BTC", "bitcoin", "0" }, { "BTCD", "BitcoinDark", "129" }, { "VPN", "VPNcoin", "129" }, { "LTC", "litecoin", "129" } }; +const char *Hardcoded_coins[][3] = { { "BTC", "bitcoin", "0" }, { "BTCD", "BitcoinDark", "129" }, { "VPN", "VPNcoin", "129" }, { "LTC", "litecoin", "129" } , { "endmarker", "", "" } }; struct iguana_info *iguana_coinfind(const char *symbol) { @@ -28,7 +28,7 @@ struct iguana_info *iguana_coinfind(const char *symbol) return(0); } -struct iguana_info *iguana_coinadd(const char *symbol) +struct iguana_info *iguana_coinadd(const char *symbol,cJSON *argjson) { struct iguana_info *coin; int32_t i = 0; if ( symbol == 0 ) @@ -41,7 +41,6 @@ struct iguana_info *iguana_coinadd(const char *symbol) if ( Coins[i] == 0 ) { Coins[i] = mycalloc('c',1,sizeof(*Coins[i])); - //memset(Coins[i],0,sizeof(*Coins[i])); printf("iguana_coin.(new) -> %p\n",Coins[i]); return(Coins[i]); } return(0); @@ -52,20 +51,29 @@ struct iguana_info *iguana_coinadd(const char *symbol) { for (i=0; i= sizeof(Hardcoded_coins)/sizeof(*Hardcoded_coins) || Hardcoded_coins[i][0] == 0 ) + if ( i >= sizeof(Hardcoded_coins)/sizeof(*Hardcoded_coins) ) break; - if ( strcmp(symbol,Hardcoded_coins[i][0]) == 0 ) + //printf("Hardcoded_coins[i][0] %s vs.(%s)\n",Hardcoded_coins[i][0],symbol); + //if ( symbol[0] == 0 ) + // getchar(); + if ( strcmp("endmarker",Hardcoded_coins[i][0]) == 0 || strcmp(symbol,Hardcoded_coins[i][0]) == 0 ) { if ( Coins[i] == 0 ) Coins[i] = mycalloc('c',1,sizeof(*Coins[i])); coin = Coins[i]; if ( coin->chain == 0 ) { - strcpy(coin->name,Hardcoded_coins[i][1]); - //coin->myservices = atoi(Hardcoded_coins[i][2]); + if ( i < sizeof(Hardcoded_coins)/sizeof(*Hardcoded_coins) ) + strcpy(coin->name,Hardcoded_coins[i][1]); + else if (argjson != 0 ) + { + if ( jstr(argjson,"name") != 0 ) + safecopy(coin->name,jstr(argjson,"name"),sizeof(coin->name)); + else strcpy(coin->name,symbol); + } + coin->chain = iguana_chainfind((char *)symbol,argjson,1); + iguana_initcoin(coin,argjson); strcpy(coin->symbol,symbol); - coin->chain = iguana_chainfind(coin->symbol); - iguana_initcoin(coin); } return(coin); } @@ -443,7 +451,7 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers, struct iguana_chain *iguana_createchain(cJSON *json); struct iguana_info *coin; int32_t j,m,mapflags; char dirname[512]; cJSON *peers; mapflags = IGUANA_MAPRECVDATA | maphash*IGUANA_MAPTXIDITEMS | maphash*IGUANA_MAPPKITEMS | maphash*IGUANA_MAPBLOCKITEMS | maphash*IGUANA_MAPPEERITEMS; - coin = iguana_coinadd(symbol); + coin = iguana_coinadd(symbol,json); coin->launched = launched; if ( (coin->MAXPEERS= maxpeers) <= 0 ) coin->MAXPEERS = (strcmp(symbol,"BTC") == 0) ? 64 : 32; @@ -493,7 +501,7 @@ int32_t iguana_launchcoin(char *symbol,cJSON *json) int64_t maxrecvcache; uint64_t services; struct iguana_info **coins,*coin; if ( symbol == 0 ) return(-1); - if ( (coin= iguana_coinadd(symbol)) == 0 ) + if ( (coin= iguana_coinadd(symbol,json)) == 0 ) return(-1); if ( coin->launched == 0 ) { @@ -502,7 +510,7 @@ int32_t iguana_launchcoin(char *symbol,cJSON *json) else maphash = 0; iguana_coinargs(symbol,&maxrecvcache,&minconfirms,&maxpeers,&initialheight,&services,&maxpending,&maxbundles,json); coins = mycalloc('A',1+1,sizeof(*coins)); - if ( (coin= iguana_setcoin(coin->symbol,coins,maxpeers,maxrecvcache,services,initialheight,maphash,minconfirms,maxpending,maxbundles,json)) != 0 ) + if ( (coin= iguana_setcoin(symbol,coins,maxpeers,maxrecvcache,services,initialheight,maphash,minconfirms,maxpending,maxbundles,json)) != 0 ) { coins[0] = (void *)((long)1); coins[1] = coin; diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 7268f41e2..3ae3c8710 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -537,7 +537,7 @@ int32_t iguana_updateramchain(struct iguana_info *coin); // blockchain int32_t iguana_needhdrs(struct iguana_info *coin); -struct iguana_chain *iguana_chainfind(char *name); +struct iguana_chain *iguana_chainfind(char *name,cJSON *argjson,int32_t createflag); int32_t iguana_chainextend(struct iguana_info *coin,struct iguana_block *newblock); uint64_t iguana_miningreward(struct iguana_info *coin,uint32_t blocknum); @@ -582,7 +582,7 @@ void iguana_bundlestats(struct iguana_info *coin,char *str); // init struct iguana_info *iguana_coinstart(struct iguana_info *coin,int32_t initialheight,int32_t mapflags); -void iguana_initcoin(struct iguana_info *coin); +void iguana_initcoin(struct iguana_info *coin,cJSON *argjson); void iguana_coinloop(void *arg); // utils @@ -701,7 +701,7 @@ char *busdata_sync(uint32_t *noncep,char *jsonstr,char *broadcastmode,char *dest void peggy(); int32_t opreturns_init(uint32_t blocknum,uint32_t blocktimestamp,char *path); struct iguana_info *iguana_coinfind(const char *symbol); -struct iguana_info *iguana_coinadd(const char *symbol); +struct iguana_info *iguana_coinadd(const char *symbol,cJSON *json); struct iguana_ramchain *iguana_bundleload(struct iguana_info *coin,struct iguana_bundle *bp); int32_t iguana_sendblockreq(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_bundle *bp,int32_t bundlei,bits256 hash2,int32_t iamthreadsafe); int32_t iguana_send_supernet(struct iguana_info *coin,struct iguana_peer *addr,char *jsonstr,int32_t delay); @@ -731,7 +731,7 @@ cJSON *SuperNET_bits2json(uint8_t *serialized,int32_t datalen); int32_t SuperNET_sendmsg(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,bits256 destpub,bits256 mypriv,bits256 mypub,uint8_t *msg,int32_t len,uint8_t *data,int32_t delaymillis); int32_t category_peer(struct supernet_info *myinfo,struct iguana_peer *addr,bits256 category,bits256 subhash); int32_t btc_wif2priv(uint8_t *addrtypep,uint8_t privkey[32],char *wifstr); -bits256 iguana_chaingenesis(char *genesisblock,char *hashalgostr,int32_t version,uint32_t timestamp,uint32_t bits,uint32_t nonce,bits256 merkle_root); +bits256 iguana_chaingenesis(bits256 genesishash,char *genesisblock,char *hashalgostr,int32_t version,uint32_t timestamp,uint32_t bits,uint32_t nonce,bits256 merkle_root); int32_t iguana_send_ConnectTo(struct iguana_info *coin,struct iguana_peer *addr); cJSON *iguana_txjson(struct iguana_info *coin,struct iguana_txid *tx,int32_t height,struct vin_info *V); char *iguana_txscan(struct iguana_info *coin,cJSON *json,uint8_t *data,int32_t recvlen,bits256 txid); diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index 1f9a91f75..7aa682dae 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -122,16 +122,16 @@ blockhashfunc iguana_hashalgo(char *hashalgostr) return(0); } -bits256 iguana_chaingenesis(char *genesisblock,char *hashalgostr,int32_t version,uint32_t timestamp,uint32_t bits,uint32_t nonce,bits256 merkle_root) +bits256 iguana_chaingenesis(bits256 genesishash,char *genesisblock,char *hashalgostr,int32_t version,uint32_t timestamp,uint32_t nBits,uint32_t nonce,bits256 merkle_root) { struct iguana_msgblock msg; int32_t len,blockhashlen; bits256 hash2; - char blockhashstr[256]; uint8_t serialized[1024],blockhash[256]; + char blockhashstr[256],str3[65]; uint8_t serialized[1024],blockhash[256]; int32_t (*hashalgo)(uint8_t *blockhashp,uint8_t *serialized,int32_t len); memset(&msg,0,sizeof(msg)); msg.H.version = version; msg.H.merkle_root = merkle_root; msg.H.timestamp = timestamp; - msg.H.bits = bits; + msg.H.bits = nBits; msg.H.nonce = nonce; len = iguana_rwblock(1,&hash2,serialized,&msg); blockhashstr[0] = 0; @@ -139,9 +139,12 @@ bits256 iguana_chaingenesis(char *genesisblock,char *hashalgostr,int32_t version { if ( (blockhashlen= (*hashalgo)(blockhash,serialized,len)) > 0 ) init_hexbytes_noT(blockhashstr,blockhash,blockhashlen); - } + } else init_hexbytes_noT(blockhashstr,hash2.bytes,sizeof(hash2)); + char str[65],str2[65]; + if ( bits256_cmp(genesishash,hash2) != 0 ) + printf("WARNING: genesishash.(%s) mismatch vs calc.(%s)\n",bits256_str(str,genesishash),bits256_str(str2,genesishash)); init_hexbytes_noT(genesisblock,serialized,len); - char str[65],str2[65]; printf("v.%d t.%u bits.%x nonce.%u merkle.(%s) genesis.(%s) hash2.(%s) blockhash.(%s) size.%ld\n",version,timestamp,bits,nonce,bits256_str(str2,merkle_root),genesisblock,bits256_str(str,hash2),blockhashstr,strlen(genesisblock)/2); + printf("v.%d t.%u %s nBits.%08x nonce.%u merkle.(%s) genesis.(%s) hash2.(%s) blockhash.(%s) size.%ld\n",version,timestamp,utc_str(str3,timestamp),nBits,nonce,bits256_str(str2,merkle_root),genesisblock,bits256_str(str,hash2),blockhashstr,strlen(genesisblock)/2); return(hash2); } @@ -242,86 +245,10 @@ uint16_t extract_userpass(char *serverport,char *userpass,char *coinstr,char *us return(port); } -void iguana_chaininit(struct iguana_chain *chain,int32_t hasheaders) -{ - chain->hasheaders = hasheaders; - chain->minoutput = 10000; - chain->hashalgo = blockhash_sha256; - if ( strcmp(chain->symbol,"BTC") == 0 ) - { - chain->unitval = 0x1d; - chain->txfee = 10000; - } - else chain->txfee = 1000000; - if ( chain->unitval == 0 ) - chain->unitval = 0x1e; - if ( hasheaders != 0 ) - { - strcpy(chain->gethdrsmsg,"getheaders"); - chain->bundlesize = _IGUANA_HDRSCOUNT; - } - else - { - strcpy(chain->gethdrsmsg,"getblocks"); - chain->bundlesize = _IGUANA_BLOCKHASHES; - } - decode_hex((uint8_t *)chain->genesis_hashdata,32,(char *)chain->genesis_hash); - if ( chain->ramchainport == 0 ) - chain->ramchainport = chain->portp2p - 1; - if ( chain->portrpc == 0 ) - chain->portrpc = chain->portp2p + 1; -} - -struct iguana_chain *iguana_chainfind(char *name) -{ - struct iguana_chain *chain; uint32_t i; - for (i=0; igenesis_hash,chain->name,name,strcmp(name,chain->name)); - if ( chain->name[0] == 0 || chain->genesis_hash == 0 ) - continue; - if ( strcmp(name,chain->symbol) == 0 ) - { - printf("found.(%s)\n",name); - iguana_chaininit(chain,strcmp(chain->symbol,"BTC") == 0); - return(chain); - } - } - return NULL; -} - -struct iguana_chain *iguana_findmagic(uint8_t netmagic[4]) -{ - struct iguana_chain *chain; uint8_t i; - for (i=0; iname[0] == 0 || chain->genesis_hash == 0 ) - continue; - if ( memcmp(netmagic,chain->netmagic,4) == 0 ) - return(iguana_chainfind((char *)chain->symbol)); - } - return NULL; -} - -uint64_t iguana_miningreward(struct iguana_info *coin,uint32_t blocknum) -{ - int32_t i; uint64_t reward = 50LL * SATOSHIDEN; - for (i=0; ichain->rewards)/sizeof(*coin->chain->rewards); i++) - { - //printf("%d: %u %.8f\n",i,(int32_t)coin->chain->rewards[i][0],dstr(coin->chain->rewards[i][1])); - if ( blocknum >= coin->chain->rewards[i][0] ) - reward = coin->chain->rewards[i][1]; - else break; - } - return(reward); -} - void iguana_chainparms(struct iguana_chain *chain,cJSON *argjson) { extern char Userhome[]; - char *path,*conf,*hexstr,genesisblock[1024],str[65]; bits256 hash; uint16_t port; cJSON *rpair,*genesis,*rewards,*item; int32_t i,n,m; + char *path,*conf,*hexstr,genesisblock[1024]; bits256 hash; uint16_t port; cJSON *rpair,*genesis,*rewards,*item; int32_t i,n,m; uint32_t nBits; uint8_t tmp[4]; if ( strcmp(chain->symbol,"NXT") != 0 ) { if ( strcmp(chain->symbol,"BTC") != 0 ) @@ -371,20 +298,30 @@ void iguana_chainparms(struct iguana_chain *chain,cJSON *argjson) decode_hex((uint8_t *)chain->netmagic,1,hexstr); if ( (hexstr= jstr(argjson,"unitval")) != 0 && strlen(hexstr) == 2 ) decode_hex((uint8_t *)&chain->unitval,1,hexstr); + if ( (hexstr= jstr(argjson,"genesishash")) != 0 ) + { + chain->genesis_hash = mycalloc('G',1,strlen(hexstr)+1); + strcpy(chain->genesis_hash,hexstr); + } if ( (genesis= jobj(argjson,"genesis")) != 0 ) { chain->hashalgo = iguana_hashalgo(jstr(genesis,"hashalgo")); - hash = iguana_chaingenesis(genesisblock,jstr(genesis,"hashalgo"),juint(genesis,"version"),juint(genesis,"timestamp"),juint(genesis,"nbits"),juint(genesis,"nonce"),jbits256(genesis,"merkle_root")); - chain->genesis_hash = clonestr(bits256_str(str,hash)); + decode_hex(hash.bytes,sizeof(hash),chain->genesis_hash); + if ( jstr(genesis,"nBits") != 0 ) + { + decode_hex((void *)&tmp,sizeof(tmp),jstr(genesis,"nBits")); + ((uint8_t *)&nBits)[0] = tmp[3]; + ((uint8_t *)&nBits)[1] = tmp[2]; + ((uint8_t *)&nBits)[2] = tmp[1]; + ((uint8_t *)&nBits)[3] = tmp[0]; + } + else nBits = 0x1e00ffff; + hash = iguana_chaingenesis(hash,genesisblock,jstr(genesis,"hashalgo"),juint(genesis,"version"),juint(genesis,"timestamp"),nBits,juint(genesis,"nonce"),jbits256(genesis,"merkle_root")); + //chain->genesis_hash = clonestr(bits256_str(str,hash)); chain->genesis_hex = clonestr(genesisblock); } else { - if ( (hexstr= jstr(argjson,"genesishash")) != 0 ) - { - chain->genesis_hash = mycalloc('G',1,strlen(hexstr)+1); - strcpy(chain->genesis_hash,hexstr); - } if ( (hexstr= jstr(argjson,"genesisblock")) != 0 ) { chain->genesis_hex = mycalloc('G',1,strlen(hexstr)+1); @@ -412,16 +349,101 @@ void iguana_chainparms(struct iguana_chain *chain,cJSON *argjson) } } +void iguana_chaininit(struct iguana_chain *chain,int32_t hasheaders,cJSON *argjson) +{ + chain->hasheaders = hasheaders; + chain->minoutput = 10000; + chain->hashalgo = blockhash_sha256; + if ( strcmp(chain->symbol,"BTC") == 0 ) + { + chain->unitval = 0x1d; + chain->txfee = 10000; + } + else chain->txfee = 1000000; + if ( chain->unitval == 0 ) + chain->unitval = 0x1e; + if ( argjson != 0 ) + iguana_chainparms(chain,argjson); + if ( hasheaders != 0 ) + { + strcpy(chain->gethdrsmsg,"getheaders"); + chain->bundlesize = _IGUANA_HDRSCOUNT; + } + else + { + strcpy(chain->gethdrsmsg,"getblocks"); + chain->bundlesize = _IGUANA_BLOCKHASHES; + } + decode_hex((uint8_t *)chain->genesis_hashdata,32,(char *)chain->genesis_hash); + if ( chain->ramchainport == 0 ) + chain->ramchainport = chain->portp2p - 1; + if ( chain->portrpc == 0 ) + chain->portrpc = chain->portp2p + 1; +} + +struct iguana_chain *iguana_chainfind(char *name,cJSON *argjson,int32_t createflag) +{ + struct iguana_chain *chain; uint32_t i; + for (i=0; igenesis_hash,chain->name,name,strcmp(name,chain->name)); + if ( chain->name[0] == 0 || chain->genesis_hash == 0 ) + { + if ( createflag != 0 && argjson != 0 ) + { + iguana_chaininit(chain,strcmp(chain->symbol,"BTC") == 0,argjson); + return(chain); + } + continue; + } + if ( strcmp(name,chain->symbol) == 0 ) + { + printf("found.(%s)\n",name); + iguana_chaininit(chain,strcmp(chain->symbol,"BTC") == 0,argjson); + return(chain); + } + } + return NULL; +} + +struct iguana_chain *iguana_findmagic(uint8_t netmagic[4]) +{ + struct iguana_chain *chain; uint8_t i; + for (i=0; iname[0] == 0 || chain->genesis_hash == 0 ) + continue; + if ( memcmp(netmagic,chain->netmagic,4) == 0 ) + return(iguana_chainfind((char *)chain->symbol,0,0)); + } + return NULL; +} + +uint64_t iguana_miningreward(struct iguana_info *coin,uint32_t blocknum) +{ + int32_t i; uint64_t reward = 50LL * SATOSHIDEN; + for (i=0; ichain->rewards)/sizeof(*coin->chain->rewards); i++) + { + //printf("%d: %u %.8f\n",i,(int32_t)coin->chain->rewards[i][0],dstr(coin->chain->rewards[i][1])); + if ( blocknum >= coin->chain->rewards[i][0] ) + reward = coin->chain->rewards[i][1]; + else break; + } + return(reward); +} + struct iguana_chain *iguana_createchain(cJSON *json) { char *symbol,*name; struct iguana_chain *chain = 0; - if ( (symbol= jstr(json,"name")) != 0 && strlen(symbol) < 8 ) + if ( ((symbol= jstr(json,"newcoin")) != 0 || (symbol= jstr(json,"name")) != 0) && strlen(symbol) < 8 ) { chain = mycalloc('C',1,sizeof(*chain)); strcpy(chain->symbol,symbol); if ( (name= jstr(json,"description")) != 0 && strlen(name) < 32 ) strcpy(chain->name,name); - iguana_chaininit(chain,juint(json,"hasheaders")); + iguana_chaininit(chain,juint(json,"hasheaders"),json); } return(chain); } diff --git a/iguana/iguana_exchanges.c b/iguana/iguana_exchanges.c index 02663db6b..399c602f9 100755 --- a/iguana/iguana_exchanges.c +++ b/iguana/iguana_exchanges.c @@ -909,7 +909,7 @@ struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson) exchange->commission *= .01; printf("ADDEXCHANGE.(%s) [%s, %s, %s] commission %.3f%%\n",exchangestr,exchange->apikey,exchange->userid,exchange->apisecret,exchange->commission * 100.); Exchanges[exchangeid] = exchange; - iguana_launch(iguana_coinadd("BTCD"),"exchangeloop",(void *)exchanges777_loop,exchange,IGUANA_EXCHANGETHREAD); + iguana_launch(iguana_coinadd("BTCD",0),"exchangeloop",(void *)exchanges777_loop,exchange,IGUANA_EXCHANGETHREAD); return(exchange); } diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index d5ffce0db..8e8116ecd 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -50,7 +50,7 @@ void iguana_initpeer(struct iguana_info *coin,struct iguana_peer *addr,uint64_t iguana_initQ(&addr->sendQ,"addrsendQ"); } -void iguana_initcoin(struct iguana_info *coin) +void iguana_initcoin(struct iguana_info *coin,cJSON *argjson) { int32_t i; portable_mutex_init(&coin->peers_mutex); @@ -74,15 +74,21 @@ void iguana_initcoin(struct iguana_info *coin) bits256 iguana_genesis(struct iguana_info *coin,struct iguana_chain *chain) { - struct iguana_block block,*ptr; struct iguana_msgblock msg; bits256 hash2; char str[65]; uint8_t buf[1024]; int32_t height; + struct iguana_block block,*ptr; struct iguana_msgblock msg; bits256 hash2; char str[65],str2[65]; uint8_t buf[1024]; int32_t height; + if ( chain->genesis_hex == 0 ) + { + printf("no genesis_hex for %s\n",coin->symbol); + memset(hash2.bytes,0,sizeof(hash2)); + return(hash2); + } decode_hex(buf,(int32_t)strlen(chain->genesis_hex)/2,(char *)chain->genesis_hex); hash2 = bits256_doublesha256(0,buf,sizeof(struct iguana_msgblockhdr)); iguana_rwblock(0,&hash2,buf,&msg); if ( memcmp(hash2.bytes,chain->genesis_hashdata,sizeof(hash2)) != 0 ) { bits256_str(str,hash2); - printf("genesis mismatch? calculated %s vs %s\n",str,(char *)chain->genesis_hex); - hash2 = bits256_conv("00000ac7d764e7119da60d3c832b1d4458da9bc9ef9d5dd0d91a15f690a46d99"); + printf("genesis mismatch? calculated %s vs %s\n",str,bits256_str(str2,*(bits256 *)chain->genesis_hashdata)); + //hash2 = bits256_conv("00000ac7d764e7119da60d3c832b1d4458da9bc9ef9d5dd0d91a15f690a46d99"); //memset(hash2.bytes,0,sizeof(hash2)); //return(hash2); diff --git a/iguana/main.c b/iguana/main.c index 6261c6a37..d40101816 100644 --- a/iguana/main.c +++ b/iguana/main.c @@ -1075,14 +1075,16 @@ void iguana_main(void *arg) } //iguana_chaingenesis(1,1403138561,0x1e0fffff,8359109,bits256_conv("fd1751cc6963d88feca94c0d01da8883852647a37a0a67ce254d62dd8c9d5b2b")); // BTCD //iguana_chaingenesis(1,1409839200,0x1e0fffff,64881664,bits256_conv("698a93a1cacd495a7a4fb3864ad8d06ed4421dedbc57f9aaad733ea53b1b5828")); // VPN - char genesisblock[1024]; - iguana_chaingenesis(genesisblock,"sha256",1,1317972665,0x1e0ffff0,2084524493,bits256_conv("97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9")); // LTC + //char genesisblock[1024]; + //iguana_chaingenesis(genesisblock,"sha256",1,1317972665,0x1e0ffff0,2084524493,bits256_conv("97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9")); // LTC iguana_initQ(&helperQ,"helperQ"); OS_ensure_directory("help"); OS_ensure_directory("confs"); OS_ensure_directory("DB"), OS_ensure_directory("DB/ECB"); OS_ensure_directory("tmp"); + iguana_coinadd("BTC",0); + iguana_coinadd("BTCD",0); if ( arg != 0 && (argjson= cJSON_Parse(arg)) != 0 ) { safecopy(Userhome,jstr(argjson,"userhome"),sizeof(Userhome)); @@ -1100,12 +1102,12 @@ void iguana_main(void *arg) { sprintf(helperstr,"{\"name\":\"helper.%d\"}",i); helperargs = clonestr(helperstr); - iguana_launch(iguana_coinadd("BTCD"),"iguana_helper",iguana_helper,helperargs,IGUANA_PERMTHREAD); + iguana_launch(iguana_coinadd("BTCD",0),"iguana_helper",iguana_helper,helperargs,IGUANA_PERMTHREAD); } - iguana_launch(iguana_coinadd("BTCD"),"rpcloop",iguana_rpcloop,SuperNET_MYINFO(0),IGUANA_PERMTHREAD); + iguana_launch(iguana_coinadd("BTCD",0),"rpcloop",iguana_rpcloop,SuperNET_MYINFO(0),IGUANA_PERMTHREAD); category_init(&MYINFO); if ( (coinargs= SuperNET_keysinit(&MYINFO,arg)) != 0 ) - iguana_launch(iguana_coinadd("BTCD"),"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD); + iguana_launch(iguana_coinadd("BTCD",0),"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD); else if ( 1 ) { #ifdef __APPLE__