diff --git a/basilisk/basilisk.c b/basilisk/basilisk.c index c3d8af0e3..c15f7d086 100755 --- a/basilisk/basilisk.c +++ b/basilisk/basilisk.c @@ -588,7 +588,7 @@ void basilisk_msgprocess(struct supernet_info *myinfo,void *_addr,uint32_t sende { (void *)"END", &basilisk_respond_VPNlogout }, // logout // coin services - { (void *)"RAW", &basilisk_respond_rawtx }, + //{ (void *)"RAW", &basilisk_respond_rawtx }, { (void *)"VAL", &basilisk_respond_value }, { (void *)"BAL", &basilisk_respond_balances }, }; diff --git a/basilisk/basilisk.h b/basilisk/basilisk.h index 3cdf565f9..d3249a529 100755 --- a/basilisk/basilisk.h +++ b/basilisk/basilisk.h @@ -56,9 +56,10 @@ struct basilisk_rawtx struct iguana_msgtx msgtx; struct iguana_info *coin; uint64_t amount,change,inputsum; - int32_t datalen,completed,vintype,vouttype,numconfirms,spendlen,secretstart,suppress_pubkeys; + int32_t redeemlen,datalen,completed,vintype,vouttype,numconfirms,spendlen,secretstart,suppress_pubkeys; uint32_t locktime; - char destaddr[64],name[32]; uint8_t addrtype,pubkey33[33],rmd160[20],spendscript[512]; + char destaddr[64],name[32]; + uint8_t addrtype,pubkey33[33],spendscript[512],redeemscript[1024],rmd160[20]; uint8_t *txbytes,extraspace[1024]; }; @@ -130,5 +131,7 @@ void basilisk_request_goodbye(struct supernet_info *myinfo); int32_t basilisk_update(char *symbol,uint32_t reftimestamp); void basilisk_seqresult(struct supernet_info *myinfo,char *retstr); struct iguana_info *basilisk_geckochain(struct supernet_info *myinfo,char *symbol,char *chainname,cJSON *valsobj); +void basilisk_alicepayment(struct supernet_info *myinfo,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn); +void basilisk_rawtx_setparms(char *name,struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33); #endif diff --git a/basilisk/basilisk_CMD.c b/basilisk/basilisk_CMD.c index 908a87308..69d8bf527 100755 --- a/basilisk/basilisk_CMD.c +++ b/basilisk/basilisk_CMD.c @@ -181,7 +181,7 @@ char *basilisk_respond_VPNmessage(struct supernet_info *myinfo,char *CMD,void *a return(retstr); } -char *basilisk_respond_rawtx(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) +/*char *basilisk_respond_rawtx(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) { char *symbol,*retstr=0; struct basilisk_item Lptr,*ptr; int32_t timeoutmillis; struct iguana_info *coin = 0; timeoutmillis = jint(valsobj,"timeout"); @@ -193,7 +193,7 @@ char *basilisk_respond_rawtx(struct supernet_info *myinfo,char *CMD,void *addr,c ptr->finished = (uint32_t)time(NULL); } else retstr = clonestr("{\"error\":\"no coin specified or error bitcoinrawtx\"}"); return(retstr); -} +}*/ char *basilisk_respond_value(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) { diff --git a/basilisk/basilisk_MSG.c b/basilisk/basilisk_MSG.c index 9a1e3bbd2..d39219828 100755 --- a/basilisk/basilisk_MSG.c +++ b/basilisk/basilisk_MSG.c @@ -47,15 +47,24 @@ int32_t basilisk_ping_processMSG(struct supernet_info *myinfo,uint32_t senderipb { keylen = data[len++]; if ( keylen != sizeof(bits256)+sizeof(uint32_t)*2 ) + { + printf("invalid keylen.%d != %d\n",keylen,(int32_t)(sizeof(bits256)+sizeof(uint32_t)*2)); return(0); + } key = &data[len], len += keylen; if ( len+sizeof(msglen) > datalen ) + { + printf("processMSG overflow len.%d msglen.%d %d > %d\n",len,msglen,(int32_t)(len+sizeof(msglen)),datalen); return(0); + } len += iguana_rwnum(0,&data[len],sizeof(msglen),&msglen); msg = &data[len], len += msglen; if ( msglen <= 0 || len > datalen ) + { + printf("illegal msglen.%d or len.%d > %d\n",msglen,len,datalen); return(0); - //printf("i.%d: keylen.%d msglen.%d\n",i,keylen,msglen); + } + printf("i.%d: keylen.%d msglen.%d\n",i,keylen,msglen); basilisk_respond_addmessage(myinfo,key,keylen,msg,msglen,0); } } @@ -73,7 +82,7 @@ int32_t basilisk_ping_genMSG(struct supernet_info *myinfo,uint8_t *data,int32_t datalen += iguana_rwnum(1,&data[datalen],sizeof(msg->datalen),&msg->datalen); if ( maxlen > datalen+msg->datalen ) { - //printf("SEND keylen.%d msglen.%d\n",msg->keylen,msg->datalen); + printf("SEND keylen.%d msglen.%d\n",msg->keylen,msg->datalen); memcpy(&data[datalen],msg->data,msg->datalen), datalen += msg->datalen; } else @@ -136,7 +145,7 @@ char *basilisk_respond_MSG(struct supernet_info *myinfo,char *CMD,void *addr,cha { int32_t keylen; uint8_t key[64]; keylen = basilisk_messagekey(key,hash,valsobj); - //char str[65]; printf("%s channel.%u msgid.%u datalen.%d\n",bits256_str(str,hash),juint(valsobj,"channel"),juint(valsobj,"msgid"),datalen); + char str[65]; printf("%s channel.%u msgid.%u datalen.%d\n",bits256_str(str,hash),juint(valsobj,"channel"),juint(valsobj,"msgid"),datalen); return(basilisk_respond_getmessage(myinfo,key,keylen)); } diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index b89d640a8..663fdfb48 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -477,9 +477,9 @@ int32_t basilisk_vins_validate(struct supernet_info *myinfo,struct iguana_info * return(retval); } -void *basilisk_bitcoinrawtx(struct basilisk_item *Lptr,struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj) +char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj) { - uint8_t buf[4096]; int32_t oplen,offset,numsent,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; + uint8_t buf[4096]; int32_t oplen,offset,minconf,spendlen; cJSON *vins,*addresses,*txobj = 0; uint32_t locktime; char *opreturn,*spendscriptstr,*changeaddr,*rawtx = 0; int64_t amount,txfee,burnamount; vins = 0; changeaddr = jstr(valsobj,"changeaddr"); if ( (amount= j64bits(valsobj,"satoshis")) == 0 ) @@ -498,43 +498,32 @@ void *basilisk_bitcoinrawtx(struct basilisk_item *Lptr,struct supernet_info *myi } //printf("use addresses.(%s)\n",jprint(addresses,0)); //printf("vals.(%s) change.(%s) spend.%s\n",jprint(valsobj,0),changeaddr,spendscriptstr); - if ( changeaddr == 0 || changeaddr[0] == 0 || spendscriptstr == 0 || spendscriptstr[0] == 0 )//|| amount == 0 || addresses == 0 ) - { - Lptr->retstr = clonestr("{\"error\":\"invalid changeaddr or spendscript or addresses\"}"); - return(Lptr); - } + if ( changeaddr == 0 || changeaddr[0] == 0 || spendscriptstr == 0 || spendscriptstr[0] == 0 ) + return(clonestr("{\"error\":\"invalid changeaddr or spendscript or addresses\"}")); if ( coin != 0 && basilisk_bitcoinavail(coin) != 0 ) { - //if ( coin->VALIDATENODE != 0 || coin->RELAYNODE != 0 ) + if ( (txobj= bitcoin_txcreate(coin->chain->isPoS,locktime,locktime==0?coin->chain->normal_txversion:coin->chain->locktime_txversion)) != 0 ) { - if ( (txobj= bitcoin_txcreate(coin->chain->isPoS,locktime,locktime==0?coin->chain->normal_txversion:coin->chain->locktime_txversion)) != 0 ) + spendlen = (int32_t)strlen(spendscriptstr) >> 1; + decode_hex(buf,spendlen,spendscriptstr); + bitcoin_txoutput(txobj,buf,spendlen,amount); + burnamount = offset = oplen = 0; + if ( (opreturn= jstr(valsobj,"opreturn")) != 0 && (oplen= is_hexstr(opreturn,0)) > 0 ) { - spendlen = (int32_t)strlen(spendscriptstr) >> 1; - decode_hex(buf,spendlen,spendscriptstr); - bitcoin_txoutput(txobj,buf,spendlen,amount); - burnamount = offset = oplen = 0; - if ( (opreturn= jstr(valsobj,"opreturn")) != 0 && (oplen= is_hexstr(opreturn,0)) > 0 ) + oplen >>= 1; + if ( (strcmp("BTC",coin->symbol) == 0 && oplen < 77) || coin->chain->do_opreturn == 0 ) { - oplen >>= 1; - if ( (strcmp("BTC",coin->symbol) == 0 && oplen < 77) || coin->chain->do_opreturn == 0 ) - { - decode_hex(&buf[sizeof(buf) - oplen],oplen,opreturn); - spendlen = datachain_datascript(coin,buf,&buf[sizeof(buf) - oplen],oplen); - if ( (burnamount= SATOSHIDEN * jdouble(valsobj,"burn")) < 10000 ) - burnamount = 10000; - bitcoin_txoutput(txobj,buf,spendlen,burnamount); - oplen = 0; - } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); - } - rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr); - printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); - } - else - { - Lptr->retstr = clonestr("{\"error\":\"couldnt create rawtx locally\"}"); - return(Lptr); + decode_hex(&buf[sizeof(buf) - oplen],oplen,opreturn); + spendlen = datachain_datascript(coin,buf,&buf[sizeof(buf) - oplen],oplen); + if ( (burnamount= SATOSHIDEN * jdouble(valsobj,"burn")) < 10000 ) + burnamount = 10000; + bitcoin_txoutput(txobj,buf,spendlen,burnamount); + oplen = 0; + } else oplen = datachain_opreturnscript(coin,buf,opreturn,oplen); } - } //else rawtx = bitcoin_calcrawtx(myinfo,coin,vinsp,satoshis,spendscriptstr,changeaddr,txfee,addresses,minconf,locktime); + rawtx = iguana_calcrawtx(myinfo,coin,&vins,txobj,amount,changeaddr,txfee,addresses,minconf,oplen!=0?buf:0,oplen+offset,burnamount,remoteaddr); + printf("generated.(%s) vins.(%s)\n",rawtx!=0?rawtx:"",vins!=0?jprint(vins,0):""); + } if ( rawtx != 0 ) { if ( vins != 0 ) @@ -545,18 +534,17 @@ void *basilisk_bitcoinrawtx(struct basilisk_item *Lptr,struct supernet_info *myi jaddstr(valsobj,"rawtx",rawtx); jaddstr(valsobj,"coin",coin->symbol); free(rawtx); - Lptr->retstr = jprint(valsobj,1); - return(Lptr); + return(jprint(valsobj,1)); } else free(rawtx); } if ( txobj != 0 ) free_json(txobj); if ( vins != 0 ) free_json(vins); - Lptr->retstr = clonestr("{\"error\":\"couldnt create rawtx\"}"); - return(Lptr); + return(clonestr("{\"error\":\"couldnt create rawtx\"}")); } - return(basilisk_issueremote(myinfo,0,&numsent,"RAW",coin->symbol,1,valsobj,juint(valsobj,"fanout"),juint(valsobj,"minresults"),basilisktag,timeoutmillis,0,0,0,0,BASILISK_DEFAULTDIFF)); + return(clonestr("{\"error\":\"dont have coin to create rawtx\"}")); + //return(basilisk_issueremote(myinfo,0,&numsent,"RAW",coin->symbol,1,valsobj,juint(valsobj,"fanout"),juint(valsobj,"minresults"),basilisktag,timeoutmillis,0,0,0,0,BASILISK_DEFAULTDIFF)); } /* @@ -810,7 +798,7 @@ HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr) return(basilisk_standardservice("VAL",myinfo,0,hash,vals,hexstr,1)); } -HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) +/*HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) { char *retstr=0,*symbol; uint32_t basilisktag; struct basilisk_item *ptr,Lptr; int32_t timeoutmillis,i,retval = -1; uint64_t amount,txfee; cJSON *retarray; //if ( coin == 0 ) @@ -867,7 +855,7 @@ HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr) } } return(retstr); -} +}*/ HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr) { @@ -1172,16 +1160,26 @@ void basilisk_unspents_update(struct supernet_info *myinfo,struct iguana_info *c portable_mutex_lock(&myinfo->bu_mutex); if ( (retarray= cJSON_Parse(retstr)) != 0 ) { + //printf("%s UNSPENTS_UPDATE.(%s)\n",coin->symbol,retstr); if ( jobj(retarray,"error") == 0 ) { if ( (jstr(retarray,"ipaddr") == 0 || strcmp(jstr(retarray,"ipaddr"),myinfo->ipaddr) != 0) && (n= cJSON_GetArraySize(retarray)) > 0 ) { - printf("n.%d GOT.(%s)\n",n,jprint(retarray,0)); for (i=0; ilocktime; @@ -89,15 +89,18 @@ int32_t basilisk_bobscript(uint8_t *script,int32_t n,uint32_t *locktimep,int32_t return(-1); memcpy(pubkeyA+1,cltvpub.bytes,sizeof(cltvpub)); memcpy(pubkeyB+1,destpub.bytes,sizeof(destpub)); - script[n++] = SCRIPT_OP_IF; - n = bitcoin_checklocktimeverify(script,n,*locktimep); - n = bitcoin_pubkeyspend(script,n,pubkeyA); - script[n++] = SCRIPT_OP_ELSE; + redeemscript[n++] = SCRIPT_OP_IF; + n = bitcoin_checklocktimeverify(redeemscript,n,*locktimep); + n = bitcoin_pubkeyspend(redeemscript,n,pubkeyA); + redeemscript[n++] = SCRIPT_OP_ELSE; if ( secretstartp != 0 ) *secretstartp = n + 2; - n = bitcoin_revealsecret160(script,n,secret160); - n = bitcoin_pubkeyspend(script,n,pubkeyB); - script[n++] = SCRIPT_OP_ENDIF; + n = bitcoin_revealsecret160(redeemscript,n,secret160); + n = bitcoin_pubkeyspend(redeemscript,n,pubkeyB); + redeemscript[n++] = SCRIPT_OP_ENDIF; + *redeemlenp = n; + calc_rmd160_sha256(rmd160,redeemscript,n); + n = bitcoin_p2shspend(script,0,rmd160); return(n); } @@ -506,7 +509,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,struct basilisk_rawtx { item = jitem(vins,i); txid = jbits256(item,"txid"); - vout = jint(item,"prevout"); + vout = jint(item,"vout"); if ( bits256_nonz(txid) != 0 ) { char str[65]; printf("call addspend.(%s) v.%d\n",bits256_str(str,txid),vout); @@ -526,7 +529,7 @@ int32_t basilisk_rawtx_return(struct supernet_info *myinfo,struct basilisk_rawtx return(retval); } -int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf) +int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,int32_t iambob,int32_t lockinputs,struct basilisk_rawtx *rawtx,uint32_t locktime,uint8_t *script,int32_t scriptlen,int64_t txfee,int32_t minconf) { struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],wifstr[64],*retstr,scriptstr[1024]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *valsobj,*retarray=0,*privkeyarray,*addresses; if ( (waddr= iguana_getaccountaddress(myinfo,rawtx->coin,0,0,rawtx->coin->changeaddr,"change")) == 0 ) @@ -560,7 +563,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis jaddnum(valsobj,"timeout",30000); rawtx->locktime = locktime; printf("%s locktime.%u\n",rawtx->name,locktime); - if ( (retstr= basilisk_rawtx(myinfo,rawtx->coin,0,0,myinfo->myaddr.persistent,valsobj,"")) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj)) != 0 ) { printf("%s got.(%s)\n",str,retstr); flag = 0; @@ -578,7 +581,7 @@ int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilis free(retarray); } else printf("error parsing.(%s)\n",retstr); free(retstr); - } else printf("error creating %s feetx\n",swap->iambob != 0 ? "BOB" : "ALICE"); + } else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); free_json(privkeyarray); free_json(valsobj); printf("rawtx retval.%d\n",retval); @@ -905,9 +908,119 @@ uint32_t basilisk_swapdata_rawtxsend(struct supernet_info *myinfo,struct basilis return(0); } +void basilisk_swap01(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) +{ + int32_t datalen; + datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); + printf("send deck.%d\n",datalen); + swap->statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01); +} + +void basilisk_swap02(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) +{ + basilisk_swap01(myinfo,swap,data,maxlen); + printf("check for other deck\n"); + if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) + swap->statebits |= 0x02; +} + +void basilisk_swap04(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) +{ + int32_t i,datalen; char str[65]; + //if ( (rand() % 10) == 0 ) + basilisk_swap02(myinfo,swap,data,maxlen); + datalen = iguana_rwnum(1,data,sizeof(swap->choosei),&swap->choosei); + if ( swap->iambob != 0 ) + { + for (i=0; i<32; i++) + data[datalen++] = swap->pubB0.bytes[i]; + for (i=0; i<32; i++) + data[datalen++] = swap->pubB1.bytes[i]; + printf("SEND pubB0/1 %s\n",bits256_str(str,swap->pubB0)); + } + else + { + for (i=0; i<32; i++) + data[datalen++] = swap->pubA0.bytes[i]; + for (i=0; i<32; i++) + data[datalen++] = swap->pubA1.bytes[i]; + printf("SEND pubA0/1 %s\n",bits256_str(str,swap->pubA0)); + } + swap->statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04); +} + +void basilisk_swap08(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) +{ + uint8_t pubkey33[33]; char str[65]; + //if ( (rand() % 10) == 0 ) + basilisk_swap04(myinfo,swap,data,maxlen); + printf("check otherchoosei\n"); + if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) + { + if ( swap->iambob != 0 ) + { + if ( bits256_nonz(swap->privBn) == 0 ) + { + swap->privBn = swap->privkeys[swap->otherchoosei]; + memset(&swap->privkeys[swap->otherchoosei],0,sizeof(swap->privkeys[swap->otherchoosei])); + calc_rmd160_sha256(swap->secretBn,swap->privBn.bytes,sizeof(swap->privBn)); + swap->pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->privBn); + printf("set privBn.%s\n",bits256_str(str,swap->privBn)); + } + } + else + { + if ( bits256_nonz(swap->privAm) == 0 ) + { + swap->privAm = swap->privkeys[swap->otherchoosei]; + memset(&swap->privkeys[swap->otherchoosei],0,sizeof(swap->privkeys[swap->otherchoosei])); + calc_rmd160_sha256(swap->secretAm,swap->privAm.bytes,sizeof(swap->privAm)); + swap->pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->privAm); + printf("set privAm.%s\n",bits256_str(str,swap->privAm)); + } + } + swap->statebits |= 0x08; + } +} + +void basilisk_swap10(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) +{ + int32_t i,j,datalen; + if ( (rand() % 10) == 0 ) + basilisk_swap08(myinfo,swap,data,maxlen); + datalen = 0; + for (i=0; iprivkeys)/sizeof(*swap->privkeys); i++) + { + for (j=0; j<32; j++) + data[datalen++] = (i == swap->otherchoosei) ? 0 : swap->privkeys[i].bytes[j]; + } + if ( swap->iambob != 0 ) + { + for (i=0; i<32; i++) + data[datalen++] = swap->pubBn.bytes[i]; + for (i=0; i<20; i++) + data[datalen++] = swap->secretBn[i]; + } + else + { + for (i=0; i<32; i++) + data[datalen++] = swap->pubAm.bytes[i]; + for (i=0; i<20; i++) + data[datalen++] = swap->secretAm[i]; + } + printf("send privkeys.%d\n",datalen); + swap->statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10); +} + +void basilisk_alicepayment(struct supernet_info *myinfo,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) +{ + alicepayment->spendlen = basilisk_alicescript(alicepayment->spendscript,0,alicepayment->destaddr,coin->chain->p2shtype,pubAm,pubBn); + basilisk_rawtx_gen("alicepayment",myinfo,0,1,alicepayment,alicepayment->locktime,alicepayment->spendscript,alicepayment->spendlen,coin->chain->txfee,1); +} + void basilisk_swaploop(void *_swap) { - uint8_t *data,pubkey33[33]; int32_t i,j,maxlen,datalen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; + uint8_t *data; int32_t i,j,maxlen,datalen; struct supernet_info *myinfo; struct basilisk_swap *swap = _swap; myinfo = swap->myinfo; fprintf(stderr,"start swap\n"); maxlen = 1024*1024 + sizeof(*swap); @@ -916,85 +1029,15 @@ void basilisk_swaploop(void *_swap) { fprintf(stderr,"r%u/q%u swapstate.%x\n",swap->req.requestid,swap->req.quoteid,swap->statebits); if ( (swap->statebits & 0x01) == 0 ) // send pubkeys - { - datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); - swap->statebits |= basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01); - } + basilisk_swap01(myinfo,swap,data,maxlen); else if ( (swap->statebits & 0x02) == 0 ) // wait for pubkeys - { - datalen = basilisk_swapdata_deck(myinfo,swap,data,maxlen); - basilisk_swapsend(myinfo,swap,0x02,data,datalen,0x01); - if ( basilisk_swapget(myinfo,swap,0x02,data,maxlen,basilisk_verify_otherdeck) == 0 ) - swap->statebits |= 0x02; - } + basilisk_swap02(myinfo,swap,data,maxlen); else if ( (swap->statebits & 0x04) == 0 ) // send choosei - { - datalen = iguana_rwnum(1,data,sizeof(swap->choosei),&swap->choosei); - if ( swap->iambob != 0 ) - { - for (i=0; i<32; i++) - data[datalen++] = swap->pubB0.bytes[i]; - for (i=0; i<32; i++) - data[datalen++] = swap->pubB1.bytes[i]; - } - else - { - for (i=0; i<32; i++) - data[datalen++] = swap->pubA0.bytes[i]; - for (i=0; i<32; i++) - data[datalen++] = swap->pubA1.bytes[i]; - char str[65]; printf("SEND pubA0/1 %s\n",bits256_str(str,swap->pubA0)); - } - swap->statebits |= basilisk_swapsend(myinfo,swap,0x08,data,datalen,0x04); - } + basilisk_swap04(myinfo,swap,data,maxlen); else if ( (swap->statebits & 0x08) == 0 ) // wait for choosei - { - if ( basilisk_swapget(myinfo,swap,0x08,data,maxlen,basilisk_verify_choosei) == 0 ) - { - char str[65]; - if ( swap->iambob != 0 ) - { - swap->privBn = swap->privkeys[swap->otherchoosei]; - memset(&swap->privkeys[swap->otherchoosei],0,sizeof(swap->privkeys[swap->otherchoosei])); - calc_rmd160_sha256(swap->secretBn,swap->privBn.bytes,sizeof(swap->privBn)); - swap->pubBn = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->privBn); - printf("set privBn.%s\n",bits256_str(str,swap->privBn)); - } - else - { - swap->privAm = swap->privkeys[swap->otherchoosei]; - memset(&swap->privkeys[swap->otherchoosei],0,sizeof(swap->privkeys[swap->otherchoosei])); - calc_rmd160_sha256(swap->secretAm,swap->privAm.bytes,sizeof(swap->privAm)); - swap->pubAm = bitcoin_pubkey33(myinfo->ctx,pubkey33,swap->privAm); - printf("set privAm.%s\n",bits256_str(str,swap->privAm)); - } - swap->statebits |= 0x08; - } - } + basilisk_swap08(myinfo,swap,data,maxlen); else if ( (swap->statebits & 0x10) == 0 && swap->otherchoosei >= 0 && swap->otherchoosei < INSTANTDEX_DECKSIZE ) // send all but one privkeys - { - datalen = 0; - for (i=0; iprivkeys)/sizeof(*swap->privkeys); i++) - { - for (j=0; j<32; j++) - data[datalen++] = (i == swap->otherchoosei) ? 0 : swap->privkeys[i].bytes[j]; - } - if ( swap->iambob != 0 ) - { - for (i=0; i<32; i++) - data[datalen++] = swap->pubBn.bytes[i]; - for (i=0; i<20; i++) - data[datalen++] = swap->secretBn[i]; - } - else - { - for (i=0; i<32; i++) - data[datalen++] = swap->pubAm.bytes[i]; - for (i=0; i<20; i++) - data[datalen++] = swap->secretAm[i]; - } - swap->statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10); - } + basilisk_swap10(myinfo,swap,data,maxlen); else if ( (swap->statebits & 0x20) == 0 ) // wait for all but one privkeys { if ( basilisk_swapget(myinfo,swap,0x20,data,maxlen,basilisk_verify_privkeys) == 0 ) @@ -1030,10 +1073,10 @@ void basilisk_swaploop(void *_swap) printf(" <- pubB1\n"); if ( swap->iambob != 0 ) { - swap->bobpayment.spendlen = basilisk_bobscript(swap->bobpayment.spendscript,0,&swap->bobpayment.locktime,&swap->bobpayment.secretstart,swap,0); - swap->bobdeposit.spendlen = basilisk_bobscript(swap->bobdeposit.spendscript,0,&swap->bobdeposit.locktime,&swap->bobdeposit.secretstart,swap,1); - basilisk_rawtx_gen("deposit",myinfo,swap,1,&swap->bobdeposit,swap->bobdeposit.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.spendlen,swap->bobdeposit.coin->chain->txfee,1); - basilisk_rawtx_gen("payment",myinfo,swap,1,&swap->bobpayment,swap->bobpayment.locktime,swap->bobpayment.spendscript,swap->bobpayment.spendlen,swap->bobpayment.coin->chain->txfee,1); + swap->bobpayment.spendlen = basilisk_bobscript(swap->bobpayment.rmd160,swap->bobpayment.redeemscript,&swap->bobpayment.redeemlen,swap->bobpayment.spendscript,0,&swap->bobpayment.locktime,&swap->bobpayment.secretstart,swap,0); + swap->bobdeposit.spendlen = basilisk_bobscript(swap->bobdeposit.rmd160,swap->bobdeposit.redeemscript,&swap->bobdeposit.redeemlen,swap->bobdeposit.spendscript,0,&swap->bobdeposit.locktime,&swap->bobdeposit.secretstart,swap,1); + basilisk_rawtx_gen("deposit",myinfo,1,1,&swap->bobdeposit,swap->bobdeposit.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.spendlen,swap->bobdeposit.coin->chain->txfee,1); + basilisk_rawtx_gen("payment",myinfo,1,1,&swap->bobpayment,swap->bobpayment.locktime,swap->bobpayment.spendscript,swap->bobpayment.spendlen,swap->bobpayment.coin->chain->txfee,1); if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.spendlen == 0 || swap->bobpayment.txbytes == 0 || swap->bobpayment.spendlen == 0 ) { printf("error bob generating deposit.%d or payment.%d\n",swap->bobdeposit.spendlen,swap->bobpayment.spendlen); @@ -1042,15 +1085,14 @@ void basilisk_swaploop(void *_swap) } else { - swap->alicepayment.spendlen = basilisk_alicescript(swap->alicepayment.spendscript,0,swap->alicepayment.destaddr,swap->alicepayment.coin->chain->p2shtype,swap->pubAm,swap->pubBn); - basilisk_rawtx_gen("alicepayment",myinfo,swap,1,&swap->alicepayment,swap->alicepayment.locktime,swap->alicepayment.spendscript,swap->alicepayment.spendlen,swap->alicepayment.coin->chain->txfee,1); + basilisk_alicepayment(myinfo,swap->alicepayment.coin,&swap->alicepayment,swap->pubAm,swap->pubBn); if ( swap->alicepayment.txbytes == 0 || swap->alicepayment.spendlen == 0 ) { printf("error alice generating payment.%d\n",swap->alicepayment.spendlen); break; } } - if ( basilisk_rawtx_gen("myfee",myinfo,swap,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.spendlen,swap->myfee.coin->chain->txfee,1) == 0 ) + if ( basilisk_rawtx_gen("myfee",myinfo,swap->iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.spendlen,swap->myfee.coin->chain->txfee,1) == 0 ) swap->statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); else { diff --git a/iguana/iguana777.c b/iguana/iguana777.c index 6cc8d2760..d8e7c39c7 100755 --- a/iguana/iguana777.c +++ b/iguana/iguana777.c @@ -706,7 +706,7 @@ void iguana_coinloop(void *arg) } if ( coin->bindsock >= 0 ) { - if ( coin->MAXPEERS > 1 && coin->peers->numranked < IGUANA_MAXPEERS/2 && now > coin->lastpossible+3 ) + if ( coin->MAXPEERS > 1 && coin->peers->numranked < IGUANA_MAXPEERS/2 && now > coin->lastpossible+10 ) { //fprintf(stderr,"check possible\n"); if ( coin->peers->numranked > 0 && (now % 60) == 0 ) diff --git a/iguana/iguana_payments.c b/iguana/iguana_payments.c index b78164fbd..d8f4d4349 100755 --- a/iguana/iguana_payments.c +++ b/iguana/iguana_payments.c @@ -162,7 +162,7 @@ cJSON *iguana_scriptobj(struct iguana_info *coin,uint8_t rmd160[20],char *coinad return(scriptobj); } -int32_t iguana_bestunspent(struct iguana_info *coin,int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,int64_t *unspents,int32_t numunspents,uint64_t value) +int32_t iguana_bestunspent(struct supernet_info *myinfo,struct iguana_info *coin,int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,int64_t *unspents,int32_t numunspents,uint64_t value) { int32_t i,abovei,belowi; int64_t above,below,gap,atx_value; abovei = belowi = -1; @@ -170,6 +170,11 @@ int32_t iguana_bestunspent(struct iguana_info *coin,int32_t *aboveip,int64_t *ab { if ( (atx_value= unspents[(i << 1) + 1]) <= 0 ) continue; + if ( iguana_unspent_check(myinfo,coin,(uint16_t)(unspents[i << 1] >> 32),(uint32_t)unspents[i << 1]) != 0 ) + { + printf("(%d u%d) %.8f already used\n",(uint16_t)(unspents[i << 1] >> 32),(uint32_t)unspents[i << 1],dstr(atx_value)); + continue; + } //printf("(%.8f vs %.8f)\n",dstr(atx_value),dstr(value)); if ( atx_value == value ) { @@ -185,8 +190,7 @@ int32_t iguana_bestunspent(struct iguana_info *coin,int32_t *aboveip,int64_t *ab above = gap; abovei = i; } - } - gap = (value - atx_value); + } else gap = (value - atx_value); if ( below == 0 || gap < below ) { below = gap; @@ -220,7 +224,7 @@ cJSON *iguana_inputsjson(struct supernet_info *myinfo,struct iguana_info *coin,i for (i=0; i 0 ) jaddstr(valsobj,"opreturn",comment); - if ( (retstr= basilisk_rawtx(myinfo,coin,0,0,myinfo->myaddr.persistent,valsobj,"")) != 0 ) + if ( (retstr= basilisk_bitcoinrawtx(myinfo,coin,remoteaddr,basilisktag,jint(valsobj,"timeout"),valsobj)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { diff --git a/iguana/iguana_spendvectors.c b/iguana/iguana_spendvectors.c index ba6c90f16..ea6481e93 100755 --- a/iguana/iguana_spendvectors.c +++ b/iguana/iguana_spendvectors.c @@ -469,7 +469,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig txidind = B[starti].firsttxidind; spendind = B[starti].firstvin; emit = startemit; - if ( coin->RTheight == 0 || bp->bundleheight+bp->n < coin->RTheight ) + if ( 0 && (coin->RTheight == 0 || bp->bundleheight+bp->n < coin->RTheight) ) fprintf(stderr,"BALANCEGEN.[%d] %p[%d] starti.%d s%d <-> endi.%d s%d startemit.%d\n",bp->hdrsi,Xspendinds,numXspends,starti,spendind,endi,B[endi].firstvin+B[endi].numvins,startemit); for (i=starti; i<=endi; i++) { @@ -827,7 +827,8 @@ int32_t iguana_balanceflush(struct iguana_info *coin,int32_t refhdrsi) if ( fwrite(Uptr,sizeof(*Uptr),numunspents,fp2) == numunspents ) { err = 0; - printf("[%d] of %d saved (%s) and (%s)\n",hdrsi,numhdrsi,fname,fname2); + if ( (hdrsi % 100) == 0 ) + printf("[%d] of %d saved (%s) and (%s)\n",hdrsi,numhdrsi,fname,fname2); } } } @@ -861,7 +862,8 @@ int32_t iguana_balanceflush(struct iguana_info *coin,int32_t refhdrsi) printf("balances error copying (%s) -> (%s)\n",fname2,destfname); return(-1); } - printf("%s -> %s\n",fname,destfname); + if ( (hdrsi % 100) == 0 ) + printf("%s -> %s\n",fname,destfname); OS_removefile(fname,0); OS_removefile(fname2,0); } diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 33e37f4b4..6d7966279 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -23,14 +23,14 @@ int32_t iguana_unspentind2txid(struct supernet_info *myinfo,struct iguana_info *coin,int32_t *spentheightp,bits256 *txidp,int32_t *voutp,int16_t hdrsi,uint32_t unspentind) { - struct iguana_ramchaindata *rdata=0; struct iguana_bundle *bp; struct iguana_unspent *U,*u; struct iguana_txid *T,*t; + struct iguana_ramchaindata *rdata=0; struct iguana_bundle *bp=0; struct iguana_unspent *U,*u; struct iguana_txid *T,*t; *voutp = *spentheightp = -1; memset(txidp,0,sizeof(*txidp)); if ( hdrsi < coin->bundlescount-1 ) rdata = coin->RTramchain.H.data; else if ( (bp= coin->bundles[hdrsi]) != 0 ) rdata = bp->ramchain.H.data; - if ( rdata != 0 && unspentind > 0 && unspentind < rdata->numunspents ) + while ( rdata != 0 && unspentind > 0 && unspentind < rdata->numunspents ) { U = RAMCHAIN_PTR(rdata,Uoffset); u = &U[unspentind]; @@ -46,6 +46,9 @@ int32_t iguana_unspentind2txid(struct supernet_info *myinfo,struct iguana_info * return(0); } } + else if ( bp == 0 && (bp= coin->bundles[hdrsi]) != 0 ) + rdata = bp->ramchain.H.data; + else break; } return(-1); } @@ -454,7 +457,7 @@ int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin } else { - printf("%s pkhash balance.[%d] from m.%d check %.8f vs %.8f spent %.8f [%.8f]\n",coinaddr,i,m,dstr(netbalance),dstr(deposits),dstr(spent),dstr(deposits)-dstr(spent)); + //printf("%s pkhash balance.[%d] from m.%d check %.8f vs %.8f spent %.8f [%.8f]\n",coinaddr,i,m,dstr(netbalance),dstr(deposits),dstr(spent),dstr(deposits)-dstr(spent)); total += netbalance; n++; } @@ -465,7 +468,7 @@ int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin break; } numunspents += m; - printf("%d: balance %.8f, lastunspent.%u m.%d num.%d max.%d\n",i,dstr(total),lastunspentind,m,numunspents,maxunspents); + //printf("%d: balance %.8f, lastunspent.%u m.%d num.%d max.%d\n",i,dstr(total),lastunspentind,m,numunspents,maxunspents); } } if ( numunspentsp != 0 ) @@ -538,9 +541,26 @@ uint8_t *iguana_rmdarray(struct supernet_info *myinfo,struct iguana_info *coin,i return(rmdarray); } +int32_t iguana_unspent_check(struct supernet_info *myinfo,struct iguana_info *coin,uint16_t hdrsi,uint32_t unspentind) +{ + bits256 txid; int32_t vout,spentheight; + memset(&txid,0,sizeof(txid)); + if ( iguana_unspentind2txid(myinfo,coin,&spentheight,&txid,&vout,hdrsi,unspentind) == 0 ) + { + //char str[65]; printf("verify %s/v%d is not already used\n",bits256_str(str,txid),vout); + if ( basilisk_addspend(myinfo,coin->symbol,txid,vout,0) != 0 ) + { + char str[65]; printf("iguana_unspent_check found unspentind (%u %d) %s\n",hdrsi,unspentind,bits256_str(str,txid)); + return(1); + } else return(0); + } + printf("iguana_unspent_check: couldnt find (%d %d)\n",hdrsi,unspentind); + return(-1); +} + int32_t iguana_unspentslists(struct supernet_info *myinfo,struct iguana_info *coin,int64_t *totalp,int64_t *unspents,int32_t max,int64_t required,int32_t minconf,cJSON *addresses,char *remoteaddr) { - int64_t total,sum = 0; int32_t i,n,j,r,numunspents,numaddrs; uint8_t addrtype,pubkey[65],rmd160[20]; char *coinaddr,str[65]; struct iguana_waddress *waddr; struct iguana_waccount *wacct; struct basilisk_unspent *bu; + int64_t *candidates,total,sum = 0; uint32_t unspentind; int32_t i,n,j,r,hdrsi,numunspents,numaddrs; uint8_t addrtype,pubkey[65],rmd160[20]; char *coinaddr,str[65]; struct iguana_waddress *waddr; struct iguana_waccount *wacct; struct basilisk_unspent *bu; *totalp = 0; if ( (numaddrs= cJSON_GetArraySize(addresses)) == 0 ) { @@ -553,7 +573,7 @@ int32_t iguana_unspentslists(struct supernet_info *myinfo,struct iguana_info *co { if ( (coinaddr= jstri(addresses,i)) != 0 ) { - printf("i.%d coinaddr.(%s) minconf.%d longest.%d diff.%d\n",i,coinaddr,minconf,coin->longestchain,coin->blocks.hwmchain.height - minconf); + //printf("i.%d coinaddr.(%s) minconf.%d longest.%d diff.%d\n",i,coinaddr,minconf,coin->longestchain,coin->blocks.hwmchain.height - minconf); total = 0; n = 0; if ( coin->RELAYNODE != 0 || coin->VALIDATENODE != 0 ) @@ -562,9 +582,21 @@ int32_t iguana_unspentslists(struct supernet_info *myinfo,struct iguana_info *co iguana_pkhasharray(myinfo,coin,0,minconf,coin->longestchain,&total,0,coin->bundlescount,rmd160,coinaddr,pubkey,coin->blocks.hwmchain.height - minconf,unspents,&n,max-1000,remoteaddr); if ( n > 0 ) { - sum += total; - unspents += (n << 1); - numunspents += n; + candidates = unspents; + for (j=0; j> 32); + unspentind = (int32_t)candidates[j << 1]; + if ( iguana_unspent_check(myinfo,coin,hdrsi,unspentind) == 0 ) + { + //printf("(%d u%d) %.8f not in mempool\n",hdrsi,unspentind,dstr(candidates[(j << 1) + 1])); + unspents[numunspents << 1] = candidates[j << 1]; + unspents[(numunspents << 1) + 1] = candidates[(j << 1) + 1]; + sum += candidates[(j << 1) + 1]; + unspents += 2; + numunspents++; + } + } } } else @@ -589,7 +621,7 @@ int32_t iguana_unspentslists(struct supernet_info *myinfo,struct iguana_info *co } } } - if ( numunspents > max ) + if ( numunspents > max || sum > required ) break; //printf("n.%d max.%d total %.8f\n",n,max,dstr(total)); } diff --git a/iguana/iguana_volatiles.c b/iguana/iguana_volatiles.c index a4c534bc5..f2ad68f86 100755 --- a/iguana/iguana_volatiles.c +++ b/iguana/iguana_volatiles.c @@ -140,8 +140,8 @@ struct iguana_utxo iguana_utxofind(struct iguana_info *coin,int16_t spent_hdrsi, int32_t iguana_spentflag(struct supernet_info *myinfo,struct iguana_info *coin,int64_t *RTspendp,int32_t *spentheightp,struct iguana_ramchain *ramchain,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t height,int32_t minconf,int32_t maxconf,uint64_t amount) { - uint32_t numunspents; int32_t vout,RTspentflag; struct iguana_utxo utxo; uint64_t confs,RTspend = 0; - struct iguana_ramchaindata *rdata; bits256 txid; char str[65]; + uint32_t numunspents; int32_t RTspentflag; struct iguana_utxo utxo; uint64_t confs,RTspend = 0; + struct iguana_ramchaindata *rdata; *spentheightp = -1; if ( (rdata= ramchain->H.data) == 0 ) return(0); @@ -149,12 +149,6 @@ int32_t iguana_spentflag(struct supernet_info *myinfo,struct iguana_info *coin,i utxo = iguana_utxofind(coin,spent_hdrsi,spent_unspentind,&RTspentflag,0); if ( RTspentflag != 0 ) *RTspendp = (amount == 0) ? coin->txfee : amount; - if ( iguana_unspentind2txid(myinfo,coin,spentheightp,&txid,&vout,spent_hdrsi,spent_unspentind) == 0 && basilisk_addspend(myinfo,coin->symbol,txid,vout,0) != 0 ) - { - printf("iguana_spentflag found unspentind (%u %d) %s\n",spent_hdrsi,spent_unspentind,bits256_str(str,txid)); - (*RTspendp) += RTspend; - return(-1); - } else printf("iguana_spentflag %s not in mempool\n",bits256_str(str,txid)); if ( utxo.spentflag != 0 && utxo.fromheight == 0 ) { printf("illegal unspentind.%u vs %u hdrs.%d zero fromheight?\n",spent_unspentind,numunspents,spent_hdrsi); diff --git a/iguana/main.c b/iguana/main.c index 3b3f1dc60..fcda90b9a 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -501,7 +501,7 @@ void iguana_appletests(struct supernet_info *myinfo) bitcoin_sharedsecret(myinfo->ctx,hash2,pubkey,33); printf("secp256k1 elapsed %.3f for %d iterations\n",OS_milliseconds() - startmillis,i); getchar();**/ - if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"protover\":70002,\"RELAY\":0,\"VALIDATE\":0,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":64,\"endpend\":64,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":1}"),0,myinfo->rpcport)) != 0 ) + if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"protover\":70002,\"RELAY\":1,\"VALIDATE\":0,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":64,\"endpend\":64,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":1}"),0,myinfo->rpcport)) != 0 ) { free(str); if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"portp2p\":8333,\"RELAY\":0,\"VALIDATE\":0,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":1,\"endpend\":1,\"services\":128,\"maxpeers\":8,\"newcoin\":\"BTC\",\"active\":0,\"numhelpers\":1,\"poll\":100}"),0,myinfo->rpcport)) != 0 ) diff --git a/iguana/tests/decoderawtransactionB b/iguana/tests/decoderawtransactionB index 00332c8dd..695f44691 100755 --- a/iguana/tests/decoderawtransactionB +++ b/iguana/tests/decoderawtransactionB @@ -1 +1 @@ -curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"BTCD\",\"method\":\"decoderawtransaction\",\"params\":[\"0100000052937e57018b8a679be9116f47d5c8748c2e81e62a532e9b9b08b7840341efaf937b29823d010000000100ffffffff02a0860100000000001976a914ca1e04745e8ca0c60d8c5881531d51bec470743f88ac908a773b000000001976a914c210f6711e98fe9971757ede2b2dcb0507f3f25e88ac00000000\"]}" +curl --url "http://127.0.0.1:7778" --data "{\"coin\":\"BTCD\",\"method\":\"decoderawtransaction\",\"params\":[\"01000000e37486570105cbd4d0058c3d7842966917456cbb4202ba90489abaa142dc093755b10a077d010000000100ffffffff0200e1f505000000004752210211a23a9bbbb43784b0b0198bab1cc6dbf2bab6cf3dd96a428ec6916267c80e70210372e08a8a353ba0190f513b3980d8229f4afecddbf014052199799875a924e56752ae50677235000000001976a914c210f6711e98fe9971757ede2b2dcb0507f3f25e88ac00000000\"]}" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index b1575aed9..d839e8025 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -28,7 +28,7 @@ HASH_ARRAY_STRING(basilisk,history,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,balances,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,value,hash,vals,hexstr); -HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); +//HASH_ARRAY_STRING(basilisk,rawtx,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,getmessage,hash,vals,hexstr); HASH_ARRAY_STRING(basilisk,sendmessage,hash,vals,hexstr); diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index f9e84b601..b4cf2b815 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -467,12 +467,15 @@ struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson); int32_t iguana_inv2poll(struct supernet_info *myinfo,struct iguana_info *coin); struct iguana_bundlereq *iguana_bundlereq(struct iguana_info *coin,struct iguana_peer *addr,int32_t type,uint8_t *data,int32_t datalen); void instantdex_FSMinit(); +int32_t bitcoin_p2shspend(uint8_t *script,int32_t n,uint8_t rmd160[20]); void iguana_unspentslock(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins); char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *addresses,int32_t minconf,uint8_t *opreturn,int32_t oplen,int64_t burnamount,char *remoteaddr); int64_t datachain_update(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,uint8_t rmd160[20],int64_t crypto777_payment,uint8_t type,int32_t height,uint64_t hdrsi_unspentind,int64_t burned,uint32_t fileid,uint64_t scriptpos,int32_t scriptlen,bits256 txid,int32_t vout); void datachain_update_spend(struct supernet_info *myinfo,int32_t ordered,struct iguana_info *coin,uint32_t timestamp,struct iguana_bundle *bp,int32_t height,bits256 txid,int32_t vout,uint8_t rmd160[20],int64_t value); cJSON *bitcoin_data2json(struct iguana_info *coin,bits256 *txidp,struct iguana_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,uint8_t *serialized,int32_t len); int32_t iguana_unspentind2txid(struct supernet_info *myinfo,struct iguana_info *coin,int32_t *spentheightp,bits256 *txidp,int32_t *voutp,int16_t hdrsi,uint32_t unspentind); +int32_t iguana_unspent_check(struct supernet_info *myinfo,struct iguana_info *coin,uint16_t hdrsi,uint32_t unspentind); +char *basilisk_bitcoinrawtx(struct supernet_info *myinfo,struct iguana_info *coin,char *remoteaddr,uint32_t basilisktag,int32_t timeoutmillis,cJSON *valsobj); char *iguana_signrawtx(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *signedtxidp,int32_t *completedp,cJSON *vins,char *rawtx,cJSON *privkey,struct vin_info *V); bits256 scrypt_blockhash(const void *input);