Browse Source

Merge pull request #317 from jl777/dev

fix iguana full sync instability with numhelpers > 1
beta
jl777 8 years ago
committed by GitHub
parent
commit
d54d847ab1
  1. 14
      basilisk/basilisk.c
  2. 10
      basilisk/basilisk_bitcoin.c
  3. 18
      basilisk/basilisk_swap.c
  4. 303
      basilisk/jumblr.c
  5. 1
      crypto777/iguana_OS.c
  6. 2
      crypto777/iguana_utils.c
  7. 6
      iguana/iguana_payments.c
  8. 26
      iguana/iguana_ramchain.c
  9. 9
      iguana/iguana_tx.c
  10. 5
      iguana/iguana_unspents.c
  11. 6
      iguana/m_LP
  12. 2
      iguana/m_osx
  13. 6
      iguana/m_osx_release
  14. 2
      iguana/m_test
  15. 15
      iguana/main.c
  16. 2
      iguana/pangea777.h
  17. 2
      iguana/tests/dexgetO
  18. 2
      iguana/tests/dexlistunspent
  19. 6
      includes/iguana_funcs.h
  20. 23
      includes/iguana_structs.h

14
basilisk/basilisk.c

@ -1301,7 +1301,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase)
safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase)); safecopy(myinfo->jumblr_passphrase,passphrase,sizeof(myinfo->jumblr_passphrase));
retjson = cJSON_CreateObject(); retjson = cJSON_CreateObject();
jaddstr(retjson,"result","success"); jaddstr(retjson,"result","success");
privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,JUMBLR_DEPOSITPREFIX);
smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr);
myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9()); myinfo->jumblr_depositkey = curve25519(privkey,curve25519_basepoint9());
bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype);
@ -1316,7 +1316,7 @@ STRING_ARG(jumblr,setpassphrase,passphrase)
jumblr_importprivkey(myinfo,coinbtc,wifstr); jumblr_importprivkey(myinfo,coinbtc,wifstr);
jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr)));
} }
privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,"");
smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr); smartaddress_add(myinfo,privkey,BTCaddr,KMDaddr);
myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9()); myinfo->jumblr_pubkey = curve25519(privkey,curve25519_basepoint9());
jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"KMDjumblr",KMDaddr);
@ -1335,14 +1335,14 @@ ZERO_ARGS(jumblr,status)
jumblr_opidsupdate(myinfo,coin); jumblr_opidsupdate(myinfo,coin);
retjson = cJSON_CreateObject(); retjson = cJSON_CreateObject();
step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0; step_t2z = step_z2z = step_z2t = deposited = finished = pending = 0;
jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,JUMBLR_DEPOSITPREFIX);
jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"KMDdeposit",KMDaddr);
jaddstr(retjson,"BTCdeposit",BTCaddr); jaddstr(retjson,"BTCdeposit",BTCaddr);
if ( (coinbtc= iguana_coinfind("BTC")) != 0 ) if ( (coinbtc= iguana_coinfind("BTC")) != 0 )
jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))); jaddnum(retjson,"BTCdeposits",dstr(jumblr_balance(myinfo,coinbtc,BTCaddr)));
received = jumblr_receivedby(myinfo,coin,KMDaddr); received = jumblr_receivedby(myinfo,coin,KMDaddr);
deposited = jumblr_balance(myinfo,coin,KMDaddr); deposited = jumblr_balance(myinfo,coin,KMDaddr);
jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,"");
jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"KMDjumblr",KMDaddr);
jaddstr(retjson,"BTCjumblr",BTCaddr); jaddstr(retjson,"BTCjumblr",BTCaddr);
if ( coinbtc != 0 ) if ( coinbtc != 0 )
@ -1603,7 +1603,7 @@ TWO_STRINGS(basilisk,refresh,symbol,address)
STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore) STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore)
{ {
char *destaddr,*changeaddr; uint64_t satoshis,txfee; int32_t completed,sendflag,timelock; char *destaddr,*changeaddr; int64_t satoshis,txfee; int32_t completed,sendflag,timelock;
timelock = jint(vals,"timelock"); timelock = jint(vals,"timelock");
sendflag = jint(vals,"sendflag"); sendflag = jint(vals,"sendflag");
satoshis = jdouble(vals,"amount") * SATOSHIDEN; satoshis = jdouble(vals,"amount") * SATOSHIDEN;
@ -1612,7 +1612,7 @@ STRING_ARRAY_OBJ_STRING(basilisk,utxorawtx,symbol,utxos,vals,ignore)
if ( destaddr != 0 && changeaddr != 0 && symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 ) if ( destaddr != 0 && changeaddr != 0 && symbol != 0 && (coin= iguana_coinfind(symbol)) != 0 )
{ {
txfee = jdouble(vals,"txfee") * SATOSHIDEN; txfee = jdouble(vals,"txfee") * SATOSHIDEN;
return(iguana_utxorawtx(myinfo,coin,timelock,destaddr,changeaddr,satoshis,txfee,&completed,sendflag,utxos)); return(iguana_utxorawtx(myinfo,coin,timelock,destaddr,changeaddr,&satoshis,1,txfee,&completed,sendflag,utxos));
} }
return(clonestr("{\"error\":\"invalid coin or address specified\"}")); return(clonestr("{\"error\":\"invalid coin or address specified\"}"));
} }
@ -1706,7 +1706,7 @@ HASH_ARRAY_STRING(InstantDEX,request,hash,vals,hexstr)
jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN); jadd64bits(vals,"destsatoshis",jdouble(vals,"destamount") * SATOSHIDEN);
jaddnum(vals,"timestamp",time(NULL)); jaddnum(vals,"timestamp",time(NULL));
if ( (jumblr= jint(vals,"usejumblr")) != 0 ) if ( (jumblr= jint(vals,"usejumblr")) != 0 )
privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : ""); privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,jumblr == 1 ? JUMBLR_DEPOSITPREFIX : "");
else privkey = myinfo->persistent_priv; else privkey = myinfo->persistent_priv;
hash = curve25519(privkey,curve25519_basepoint9()); hash = curve25519(privkey,curve25519_basepoint9());
if ( jobj(vals,"srchash") == 0 ) if ( jobj(vals,"srchash") == 0 )

10
basilisk/basilisk_bitcoin.c

@ -658,9 +658,9 @@ int64_t iguana_verifytimelock(struct supernet_info *myinfo,struct iguana_info *c
} return(-2); } return(-2);
} }
char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t timelock,char *destaddr,char *changeaddr,uint64_t satoshis,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos) char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int32_t timelock,char *destaddr,char *changeaddr,int64_t *satoshis,int32_t numoutputs,uint64_t txfee,int32_t *completedp,int32_t sendflag,cJSON *utxos)
{ {
uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t p2shlen,iter,spendlen; cJSON *retjson,*txcopy,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0; uint8_t script[35],p2shscript[128],rmd160[20],addrtype; bits256 txid; int32_t i,p2shlen,iter,spendlen; cJSON *retjson,*txcopy,*txobj=0,*vins=0; char *rawtx=0,*signedtx=0; uint32_t timelocked = 0;
*completedp = 0; *completedp = 0;
if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 ) if ( iguana_addressvalidate(coin,&addrtype,destaddr) < 0 || iguana_addressvalidate(coin,&addrtype,changeaddr) < 0 )
return(clonestr("{\"error\":\"invalid coin address\"}")); return(clonestr("{\"error\":\"invalid coin address\"}"));
@ -687,11 +687,13 @@ char *iguana_utxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,int
spendlen = bitcoin_p2shspend(script,0,rmd160); spendlen = bitcoin_p2shspend(script,0,rmd160);
printf("timelock.%d spend timelocked %u\n",timelock,timelocked); printf("timelock.%d spend timelocked %u\n",timelock,timelocked);
} }
bitcoin_txoutput(txobj,script,spendlen,satoshis); for (i=0; i<numoutputs; i++)
if ( satoshis[i] > 0 )
bitcoin_txoutput(txobj,script,spendlen,satoshis[i]);
for (iter=0; iter<2; iter++) for (iter=0; iter<2; iter++)
{ {
txcopy = jduplicate(txobj); txcopy = jduplicate(txobj);
if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,changeaddr,txfee,utxos,"",0,0)) != 0 ) if ( (rawtx= iguana_calcutxorawtx(myinfo,coin,&vins,txobj,satoshis,numoutputs,changeaddr,txfee,utxos,"",0,0)) != 0 )
{ {
if ( iter == 1 || txfee != 0 ) if ( iter == 1 || txfee != 0 )
jaddstr(retjson,"rawtx",rawtx); jaddstr(retjson,"rawtx",rawtx);

18
basilisk/basilisk_swap.c

@ -1120,7 +1120,8 @@ void basilisk_swaps_init(struct supernet_info *myinfo)
if ( M.datalen < 100000 ) if ( M.datalen < 100000 )
{ {
M.data = malloc(M.datalen); M.data = malloc(M.datalen);
fread(M.data,1,M.datalen,fp); if ( fread(M.data,1,M.datalen,fp) == M.datalen )
{
if ( calc_crc32(0,M.data,M.datalen) == M.crc32 ) if ( calc_crc32(0,M.data,M.datalen) == M.crc32 )
{ {
if ( iter == 1 ) if ( iter == 1 )
@ -1134,6 +1135,7 @@ void basilisk_swaps_init(struct supernet_info *myinfo)
basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1); basilisk_swapgotdata(myinfo,swap,M.crc32,M.srchash,M.desthash,M.quoteid,M.msgbits,M.data,M.datalen,1);
} }
} else printf("crc mismatch %x vs %x\n",calc_crc32(0,M.data,M.datalen),M.crc32); } else printf("crc mismatch %x vs %x\n",calc_crc32(0,M.data,M.datalen),M.crc32);
} else printf("error reading M.datalen %d\n",M.datalen);
free(M.data), M.data = 0; free(M.data), M.data = 0;
} }
} }
@ -1456,14 +1458,15 @@ int32_t basilisk_swap_loadtx(struct basilisk_rawtx *rawtx,FILE *fp,char *bobcoin
struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit) struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits,int32_t reinit)
{ {
FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; FILE *fp; char fname[512]; uint8_t *alicepub33=0,*bobpub33=0; int32_t errs=0,jumblrflag,x = -1;
if ( reinit != 0 ) if ( reinit != 0 )
{ {
sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname); sprintf(fname,"%s/SWAPS/%u-%u.swap",GLOBAL_DBDIR,swap->I.req.requestid,swap->I.req.quoteid), OS_compatible_path(fname);
printf("reinit.(%s)\n",fname); printf("reinit.(%s)\n",fname);
if ( (fp= fopen(fname,"rb")) != 0 ) if ( (fp= fopen(fname,"rb")) != 0 )
{ {
fread(&swap->I,1,sizeof(swap->I),fp); if ( fread(&swap->I,1,sizeof(swap->I),fp) != sizeof(swap->I) )
errs++;
if ( swap->bobcoin == 0 ) if ( swap->bobcoin == 0 )
swap->bobcoin = iguana_coinfind(swap->I.req.dest); swap->bobcoin = iguana_coinfind(swap->I.req.dest);
if ( swap->alicecoin == 0 ) if ( swap->alicecoin == 0 )
@ -1482,9 +1485,12 @@ struct basilisk_swap *bitcoin_swapinit(struct supernet_info *myinfo,bits256 priv
basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol); basilisk_swap_loadtx(&swap->bobrefund,fp,swap->bobcoin->symbol,swap->alicecoin->symbol);
basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol);*/ basilisk_swap_loadtx(&swap->alicereclaim,fp,swap->bobcoin->symbol,swap->alicecoin->symbol);*/
} else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin); } else printf("missing coins (%p %p)\n",swap->bobcoin,swap->alicecoin);
fread(swap->privkeys,1,sizeof(swap->privkeys),fp); if ( fread(swap->privkeys,1,sizeof(swap->privkeys),fp) != sizeof(swap->privkeys) )
fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp); errs++;
fread(swap->deck,1,sizeof(swap->deck),fp); if ( fread(swap->otherdeck,1,sizeof(swap->otherdeck),fp) != sizeof(swap->otherdeck) )
errs++;
if ( fread(swap->deck,1,sizeof(swap->deck),fp) != sizeof(swap->deck) )
errs++;
fclose(fp); fclose(fp);
} else printf("cant find.(%s)\n",fname); } else printf("cant find.(%s)\n",fname);
} }

303
basilisk/jumblr.c

@ -289,8 +289,8 @@ void jumblr_opidupdate(struct supernet_info *myinfo,struct iguana_info *coin,str
if ( strcmp(status,"success") == 0 ) if ( strcmp(status,"success") == 0 )
{ {
ptr->status = jumblr_itemset(ptr,item,status); ptr->status = jumblr_itemset(ptr,item,status);
jumblr_privkey(myinfo,BTCaddr,KMDdeposit,JUMBLR_DEPOSITPREFIX); jumblr_privkey(myinfo,BTCaddr,0,KMDdeposit,JUMBLR_DEPOSITPREFIX);
jumblr_privkey(myinfo,BTCaddr,KMDjumblr,""); jumblr_privkey(myinfo,BTCaddr,0,KMDjumblr,"");
if ( (jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->src,KMDdeposit) != 0) || (jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->src) == 't' && strcmp(ptr->dest,KMDjumblr) != 0) ) if ( (jumblr_addresstype(myinfo,coin,ptr->src) == 't' && jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && strcmp(ptr->src,KMDdeposit) != 0) || (jumblr_addresstype(myinfo,coin,ptr->src) == 'z' && jumblr_addresstype(myinfo,coin,ptr->src) == 't' && strcmp(ptr->dest,KMDjumblr) != 0) )
{ {
printf("a non-jumblr t->z pruned\n"); printf("a non-jumblr t->z pruned\n");
@ -364,37 +364,302 @@ void jumblr_opidsupdate(struct supernet_info *myinfo,struct iguana_info *coin)
} }
} }
bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix) bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,uint8_t pubtype,char *KMDaddr,char *prefix)
{ {
bits256 privkey,pubkey; uint8_t pubkey33[33]; char passphrase[sizeof(myinfo->jumblr_passphrase) + 64]; bits256 privkey,pubkey; uint8_t pubkey33[33]; char passphrase[sizeof(myinfo->jumblr_passphrase) + 64];
sprintf(passphrase,"%s%s",prefix,myinfo->jumblr_passphrase); sprintf(passphrase,"%s%s",prefix,myinfo->jumblr_passphrase);
conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase)); conv_NXTpassword(privkey.bytes,pubkey.bytes,(uint8_t *)passphrase,(int32_t)strlen(passphrase));
bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey); bitcoin_pubkey33(myinfo->ctx,pubkey33,privkey);
bitcoin_address(BTCaddr,0,pubkey33,33); bitcoin_address(BTCaddr,pubtype,pubkey33,33);
bitcoin_address(KMDaddr,60,pubkey33,33); bitcoin_address(KMDaddr,60,pubkey33,33);
return(privkey); return(privkey);
} }
void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey) int64_t jumblr_DEXsplit(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *splittxidp,char *coinaddr,bits256 txid,int32_t vout,int64_t remaining,double bigprice,double middleprice,double smallprice,double fees[4])
{ {
static double kmdprice,pending; static uint32_t lasttime; int64_t values[4],outputs[64],value,total,estfee = 50000; int32_t i,success=0,completed,sendflag,numoutputs = 0; char *retstr; cJSON *retjson,*utxo,*item;
double btcavail=0,minbtc,avebid,aveask,highbid,lowask,CMC_average,USD_average,changes[3]; struct iguana_info *coinbtc; cJSON *vals; bits256 hash; char *retstr; total = 0;
coinbtc = iguana_coinfind("BTC"); memset(values,0,sizeof(values));
if ( kmdprice == 0. || time(NULL) > lasttime+60 ) memset(outputs,0,sizeof(outputs));
if ( bigprice > SMALLVAL )
values[0] = SATOSHIDEN * bigprice;
if ( middleprice > SMALLVAL )
values[1] = SATOSHIDEN * middleprice;
if ( smallprice > SMALLVAL )
values[2] = SATOSHIDEN * smallprice;
for (i=0; i<4; i++)
{ {
kmdprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,"komodo","KMD","BTC",&USD_average); if ( fees[i] > SMALLVAL )
lasttime = (uint32_t)time(NULL); values[3+i] = SATOSHIDEN * fees[i];
printf("KMD %.8f\n",kmdprice);
} }
if ( kmdprice > SMALLVAL ) for (i=0; i<7; i++)
{ {
minbtc = (kmdprice * 1.1) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE)); if ( (value= values[i]) != 0 )
if ( coinbtc != 0 && (btcavail= dstr(jumblr_balance(myinfo,coinbtc,BTCaddr))) > minbtc+pending ) {
while ( remaining > value+estfee && numoutputs < sizeof(outputs)/sizeof(*outputs) )
{
outputs[numoutputs++] = value;
remaining -= value;
total += value;
printf("%.8f ",dstr(value));
}
}
}
char str[65]; printf("numoutputs.%d total %.8f %s/v%d\n",numoutputs,dstr(total),bits256_str(str,txid),vout);
if ( numoutputs > 0 )
{
if ( (retstr= _dex_gettxout(myinfo,coin->symbol,txid,vout)) != 0 )
{
item = cJSON_Parse(retstr);
free(retstr);
if ( item != 0 )
{
utxo = cJSON_CreateArray();
jaddi(utxo,item);
sendflag = 0;
if ( (retstr= iguana_utxorawtx(myinfo,coin,0,coinaddr,coinaddr,outputs,numoutputs,0,&completed,sendflag,utxo)) != 0 )
{
if ( completed != 0 )
{
if ( (retjson= cJSON_Parse(retstr)) != 0 )
{
if ( jobj(retjson,"error") == 0 && jobj(retjson,"sent") != 0 )
{
*splittxidp = jbits256(retjson,"sent");
success = 1;
printf("DEXsplit success %.8f\n",dstr(total));
}
free_json(retjson);
}
}
free(retstr);
}
free_json(utxo);
}
}
}
return(success * total);
}
double jumblr_DEXutxosize(double *targetpriceBp,double *targetpriceMp,double *targetpriceSp,int32_t isbob)
{
double fee,depositfactor = (isbob == 0) ? 1. : 1.2;
fee = JUMBLR_INCR * JUMBLR_FEE;
*targetpriceBp = depositfactor * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE);
*targetpriceMp = depositfactor * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE);
*targetpriceSp = depositfactor * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE);
return(depositfactor);
}
int32_t jumblr_DEXutxoind(int32_t *shouldsplitp,double targetpriceB,double targetpriceM,double targetpriceS,double amount,double margin,double dexfeeratio,double esttxfee)
{
*shouldsplitp = 0;
if ( amount >= targetpriceB )
{
if ( amount > margin * (targetpriceB + targetpriceS) )
*shouldsplitp = 1;
return(0);
}
else
{
if ( amount >= targetpriceM )
{
if ( amount > margin * (targetpriceM + targetpriceS) )
*shouldsplitp = 1;
return(1);
}
else
{
if ( amount >= targetpriceS )
{
if ( amount > margin * targetpriceS )
*shouldsplitp = 1;
return(2);
}
else if ( amount >= targetpriceB/dexfeeratio )
{
if ( amount > margin * targetpriceB/dexfeeratio )
*shouldsplitp = 1;
return(3);
}
else if ( amount >= targetpriceM/dexfeeratio )
{
if ( amount > margin * targetpriceM/dexfeeratio )
*shouldsplitp = 1;
return(4);
}
else if ( amount >= targetpriceS/dexfeeratio )
{
if ( amount > margin * targetpriceS/dexfeeratio )
*shouldsplitp = 1;
return(5);
}
else if ( amount >= esttxfee )
{
if ( amount > esttxfee*4 )
*shouldsplitp = 1;
return(6);
}
else return(-1);
}
}
}
int64_t jumblr_DEXutxoupdate(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *splittxidp,char *coinaddr,bits256 txid,int32_t vout,uint64_t value,int32_t isbob)
{
double fees[4],targetpriceB,amount,targetpriceM,targetpriceS,depositfactor,dexfeeratio,margin; int32_t ind,shouldsplit;
margin = 1.1;
depositfactor = (isbob == 0) ? 1. : 1.2;
dexfeeratio = 500.;
amount = dstr(value);
memset(splittxidp,0,sizeof(*splittxidp));
depositfactor = jumblr_DEXutxosize(&targetpriceB,&targetpriceM,&targetpriceS,isbob);
fees[0] = (margin * targetpriceB) / dexfeeratio;
fees[1] = (margin * targetpriceM) / dexfeeratio;
fees[2] = (margin * targetpriceS) / dexfeeratio;
fees[3] = (strcmp("BTC",coin->symbol) == 0) ? 50000 : 10000;
if ( (ind= jumblr_DEXutxoind(&shouldsplit,targetpriceB,targetpriceM,targetpriceS,amount,margin,dexfeeratio,fees[3])) >= 0 )
{
if ( shouldsplit != 0 )
return(jumblr_DEXsplit(myinfo,coin,splittxidp,coinaddr,txid,vout,value,margin * targetpriceB,margin * targetpriceM,margin * targetpriceS,fees));
}
return(0);
}
/*struct DEXcoin_info
{
bits256 deposit_privkey,jumblr_privkey;
struct iguana_info *coin;
cJSON *utxos,*spentutxos,*bigutxos,*normalutxos,*smallutxos,*feeutxos,*otherutxos;
double btcprice,USD_average,DEXpending,maxbid,minask,avail,KMDavail;
uint32_t lasttime;
char CMCname[32],symbol[16],depositaddr[64],KMDdepositaddr[64],KMDjumblraddr[64],jumblraddr[64];
};*/
int32_t jumblr_utxotxidpending(struct supernet_info *myinfo,bits256 *splittxidp,struct iguana_info *coin,bits256 txid,int32_t vout)
{
int32_t i;
memset(splittxidp,0,sizeof(*splittxidp));
for (i=0; i<coin->DEXinfo.numpending; i++)
{
if ( coin->DEXinfo.pending[i].vout == vout && bits256_cmp(coin->DEXinfo.pending[i].txid,txid) == 0 )
{
*splittxidp = coin->DEXinfo.pending[i].splittxid;
return(i);
}
}
return(-1);
}
void jumblr_utxotxidpendingadd(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid,int32_t vout,bits256 splittxid)
{
struct jumblr_pending pend;
memset(&pend,0,sizeof(pend));
pend.splittxid = splittxid;
pend.txid = txid;
pend.vout = vout;
coin->DEXinfo.pending = realloc(coin->DEXinfo.pending,sizeof(*coin->DEXinfo.pending) * (1 + coin->DEXinfo.numpending));
coin->DEXinfo.pending[coin->DEXinfo.numpending++] = pend;
}
void jumblr_utxoupdate(struct supernet_info *myinfo,struct iguana_info *coin,double price,char *coinaddr)
{
char *retstr; cJSON *array,*item; int32_t i,n,vout; bits256 txid,splittxid; uint64_t value;
if ( (retstr= _dex_listunspent(myinfo,coin->symbol,coinaddr)) != 0 )
{
if ( (array= cJSON_Parse(retstr)) != 0 )
{
if ( (n= cJSON_GetArraySize(array)) > 0 )
{
for (i=0; i<n; i++)
{
item = jitem(array,i);
txid = jbits256(item,"txid");
vout = jint(item,"vout");
value = SATOSHIDEN * jdouble(item,"amount");
if ( jumblr_utxotxidpending(myinfo,&splittxid,coin,txid,vout) < 0 )
{
jumblr_DEXutxoupdate(myinfo,coin,&splittxid,coinaddr,txid,vout,value,myinfo->IAMLP);
jumblr_utxotxidpendingadd(myinfo,coin,txid,vout,splittxid);
}
}
}
free_json(array);
}
free(retstr);
}
}
void jumblr_DEXupdate(struct supernet_info *myinfo,struct iguana_info *coin,char *symbol,char *CMCname,double BTC2KMD,double KMDavail)
{
double avebid,aveask,highbid,lowask,CMC_average,changes[3]; struct iguana_info *btccoin,*kmdcoin; struct DEXcoin_info *ptr = &coin->DEXinfo;
if ( coin != 0 && (kmdcoin= iguana_coinfind("KMD")) != 0 && time(NULL) > ptr->lasttime+60 )
{
ptr->coin = coin;
if ( strcmp(symbol,ptr->symbol) != 0 )
{
safecopy(ptr->symbol,symbol,sizeof(ptr->symbol));
safecopy(ptr->CMCname,CMCname,sizeof(ptr->CMCname));
}
if ( ptr->depositaddr[0] == 0 )
{
if ( strcmp("KMD",symbol) == 0 )
ptr->deposit_privkey = jumblr_privkey(myinfo,ptr->depositaddr,0,ptr->KMDdepositaddr,JUMBLR_DEPOSITPREFIX);
else ptr->deposit_privkey = jumblr_privkey(myinfo,ptr->depositaddr,ptr->coin->chain->pubtype,ptr->KMDdepositaddr,JUMBLR_DEPOSITPREFIX);
}
if ( ptr->jumblraddr[0] == 0 )
ptr->jumblr_privkey = jumblr_privkey(myinfo,ptr->jumblraddr,ptr->coin->chain->pubtype,ptr->KMDjumblraddr,"");
ptr->avail = dstr(jumblr_balance(myinfo,ptr->coin,ptr->depositaddr));
ptr->btcprice = get_theoretical(&avebid,&aveask,&highbid,&lowask,&CMC_average,changes,CMCname,symbol,"BTC",&ptr->USD_average);
if ( strcmp("KMD",symbol) == 0 )
{
ptr->BTC2KMD = ptr->btcprice;
ptr->kmdprice = 1.;
ptr->KMDavail = ptr->avail;
if ( (btccoin= iguana_coinfind("BTC")) != 0 )
jumblr_utxoupdate(myinfo,btccoin,ptr->btcprice,ptr->depositaddr);
jumblr_utxoupdate(myinfo,kmdcoin,1.,ptr->KMDdepositaddr);
}
else if ( (ptr->BTC2KMD= BTC2KMD) > SMALLVAL )
{
ptr->kmdprice = ptr->btcprice / BTC2KMD;
ptr->KMDavail = KMDavail;
jumblr_utxoupdate(myinfo,ptr->coin,ptr->kmdprice,ptr->depositaddr);
}
ptr->lasttime = (uint32_t)time(NULL);
}
}
void jumblr_CMCname(char *CMCname,char *symbol)
{
if ( strcmp(symbol,"KMD") == 0 )
strcpy(CMCname,"komodo");
}
void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coin)
{
struct iguana_info *kmdcoin;
if ( (kmdcoin= iguana_coinfind("KMD")) == 0 || iguana_coinfind("BTC") == 0 )
return;
printf("jumblr_DEXcheck\n");
jumblr_DEXupdate(myinfo,kmdcoin,"KMD","komodo",0.,0.);
if ( strcmp(coin->symbol,"KMD") != 0 && kmdcoin->DEXinfo.btcprice > 0. )
{
if ( coin->CMCname[0] == 0 )
jumblr_CMCname(coin->CMCname,coin->symbol);
if ( coin->CMCname[0] != 0 )
jumblr_DEXupdate(myinfo,coin,coin->symbol,coin->CMCname,kmdcoin->DEXinfo.btcprice,kmdcoin->DEXinfo.avail);
}
/*if ( kmdprice > SMALLVAL )
{
minbtc = (kmdprice * 1.2) * (JUMBLR_INCR + 3*(JUMBLR_INCR * JUMBLR_FEE + JUMBLR_TXFEE));
btcavail = dstr(jumblr_balance(myinfo,coinbtc,BTCaddr));
if ( coinbtc != 0 && btcavail > minbtc+pending )
{ {
printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc); printf("BTC deposits %.8f, min %.8f\n",btcavail,minbtc);
vals = cJSON_CreateObject(); vals = cJSON_CreateObject();
jaddstr(vals,"source","BTC"); jaddstr(vals,"source","BTC");
//hash = curve25519(privkey,curve25519_basepoint9());
jaddstr(vals,"dest","KMD"); jaddstr(vals,"dest","KMD");
jaddnum(vals,"amount",btcavail*.3); jaddnum(vals,"amount",btcavail*.3);
jaddnum(vals,"minprice",kmdprice*.95); jaddnum(vals,"minprice",kmdprice*.95);
@ -408,7 +673,7 @@ void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,ch
} }
// curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}" // curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"InstantDEX\",\"method\":\"request\",\"vals\":{\"source\":\"KMD\",\"amount\":20,\"dest\":\"USD\",\"minprice\":0.08}}"
} //else printf("btcavail %.8f pending %.8f\n",btcavail,pending); } //else printf("btcavail %.8f pending %.8f\n",btcavail,pending);
} else printf("null kmdprice %.8f\n",kmdprice); } else printf("null kmdprice %.8f\n",kmdprice);*/
} }
void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval) void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval)
@ -424,7 +689,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3
switch ( selector ) switch ( selector )
{ {
case 0: // public -> z, need to importprivkey case 0: // public -> z, need to importprivkey
jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,JUMBLR_DEPOSITPREFIX);
if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) if ( (total= jumblr_balance(myinfo,coin,KMDaddr)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN )
{ {
if ( (r & 1) == 0 ) if ( (r & 1) == 0 )
@ -477,7 +742,7 @@ void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int3
{ {
if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) if ( (r & 1) == 0 && ptr->spent == 0 && (total= jumblr_balance(myinfo,coin,ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN )
{ {
privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); privkey = jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,"");
if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 ) if ( (retstr= jumblr_sendz_to_t(myinfo,coin,ptr->dest,KMDaddr,dstr(total))) != 0 )
{ {
printf("sendz_to_t.(%s)\n",retstr); printf("sendz_to_t.(%s)\n",retstr);

1
crypto777/iguana_OS.c

@ -422,6 +422,7 @@ void *iguana_meminit(struct OS_memspace *mem,char *name,void *ptr,int64_t totals
mem->totalsize = totalsize; mem->totalsize = totalsize;
} }
mem->threadsafe = threadsafe; mem->threadsafe = threadsafe;
mem->alignflag = 4;
iguana_memreset(mem); iguana_memreset(mem);
if ( mem->totalsize == 0 ) if ( mem->totalsize == 0 )
printf("meminit.%s ILLEGAL STATE null size\n",mem->name), getchar(); printf("meminit.%s ILLEGAL STATE null size\n",mem->name), getchar();

2
crypto777/iguana_utils.c

@ -1279,7 +1279,7 @@ double get_theoretical(double *avebidp,double *aveaskp,double *highbidp,double *
weighted = weighted_orderbook(avebidp,aveaskp,highbidp,lowaskp,bittrex_orderbook(base,rel,25),1./(*CMC_averagep)); weighted = weighted_orderbook(avebidp,aveaskp,highbidp,lowaskp,bittrex_orderbook(base,rel,25),1./(*CMC_averagep));
if ( *CMC_averagep > SMALLVAL && weighted > SMALLVAL ) if ( *CMC_averagep > SMALLVAL && weighted > SMALLVAL )
theoretical = calc_theoretical(weighted,*CMC_averagep,changes); theoretical = calc_theoretical(weighted,*CMC_averagep,changes);
if ( counter++ == 0 ) if ( counter++ < 100 )
printf("HBLA.[%.8f %.8f] AVE.[%.8f %.8f] (%s) CMC %f %f %f %f\n",*highbidp,*lowaskp,*avebidp,*aveaskp,jprint(item,0),*CMC_averagep,changes[0],changes[1],changes[2]); printf("HBLA.[%.8f %.8f] AVE.[%.8f %.8f] (%s) CMC %f %f %f %f\n",*highbidp,*lowaskp,*avebidp,*aveaskp,jprint(item,0),*CMC_averagep,changes[0],changes[1],changes[2]);
free_json(cmcjson); free_json(cmcjson);
} }

6
iguana/iguana_payments.c

@ -545,12 +545,14 @@ char *iguana_calcrawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJS
return(rawtx); return(rawtx);
} }
char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode) char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t *outputs,int32_t numoutputs,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode)
{ {
uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; int32_t allocflag=0,max,i,n,num,spendlen; char *spendscriptstr,*rawtx=0; bits256 txid; cJSON *sobj,*vins=0,*item; uint64_t value,avail=0,total,change,interests; struct iguana_outpoint *unspents = 0; uint8_t addrtype,rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE]; int32_t allocflag=0,max,i,n,num,spendlen; char *spendscriptstr,*rawtx=0; uint64_t satoshis = 0; bits256 txid; cJSON *sobj,*vins=0,*item; uint64_t value,avail=0,total,change,interests; struct iguana_outpoint *unspents = 0;
*vinsp = 0; *vinsp = 0;
max = 0; max = 0;
interests = 0; interests = 0;
for (i=0; i<numoutputs; i++)
satoshis += outputs[i];
if ( (n= cJSON_GetArraySize(utxos)) == 0 ) if ( (n= cJSON_GetArraySize(utxos)) == 0 )
return(0); return(0);
for (i=0; i<n; i++) for (i=0; i<n; i++)

26
iguana/iguana_ramchain.c

@ -71,7 +71,7 @@ struct iguana_kvitem *iguana_hashsetPT(struct iguana_ramchain *ramchain,int32_t
printf("negative itemind\n"); printf("negative itemind\n");
iguana_exit(0,0); iguana_exit(0,0);
} }
if ( (0) ) if ( (1) )
{ {
if ( selector == 'T' ) if ( selector == 'T' )
HASH_FIND(hh,ramchain->txids,key,keylen,tmp); HASH_FIND(hh,ramchain->txids,key,keylen,tmp);
@ -258,7 +258,9 @@ uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_
P[pkind].firstunspentind = unspentind; P[pkind].firstunspentind = unspentind;
printf("%p P[%d] <- firstunspent.%d\n",&P[pkind],pkind,unspentind); printf("%p P[%d] <- firstunspent.%d\n",&P[pkind],pkind,unspentind);
}*/ }*/
memcpy(P[pkind].rmd160,rmd160,sizeof(P[pkind].rmd160)); //memcpy(P[pkind].rmd160,rmd160,sizeof(P[pkind].rmd160));
for (i=0; i<20; i++)
P[pkind].rmd160[i] = rmd160[i];
//for (i=0; i<20; i++) //for (i=0; i<20; i++)
// printf("%02x",rmd160[i]); // printf("%02x",rmd160[i]);
//printf(" -> rmd160 pkind.%d \n",pkind); //printf(" -> rmd160 pkind.%d \n",pkind);
@ -276,7 +278,7 @@ uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_
uint32_t iguana_ramchain_addunspent20(struct iguana_info *coin,struct iguana_peer *addr,RAMCHAIN_FUNC,uint64_t value,uint8_t *script,int32_t scriptlen,bits256 txid,int32_t vout,int8_t type,struct iguana_bundle *bp,uint8_t rmd160[20]) uint32_t iguana_ramchain_addunspent20(struct iguana_info *coin,struct iguana_peer *addr,RAMCHAIN_FUNC,uint64_t value,uint8_t *script,int32_t scriptlen,bits256 txid,int32_t vout,int8_t type,struct iguana_bundle *bp,uint8_t rmd160[20])
{ {
uint32_t unspentind; struct iguana_unspent20 *u; long scriptpos; struct vin_info V; char asmstr[IGUANA_MAXSCRIPTSIZE*2+1]; uint32_t unspentind,i; struct iguana_unspent20 *u; long scriptpos; struct vin_info V; char asmstr[IGUANA_MAXSCRIPTSIZE*2+1];
unspentind = ramchain->H.unspentind++; unspentind = ramchain->H.unspentind++;
u = &U[unspentind]; u = &U[unspentind];
if ( scriptlen > 0 ) if ( scriptlen > 0 )
@ -287,14 +289,16 @@ uint32_t iguana_ramchain_addunspent20(struct iguana_info *coin,struct iguana_pee
type = iguana_calcrmd160(coin,asmstr,&V,script,scriptlen,txid,vout,0xffffffff); type = iguana_calcrmd160(coin,asmstr,&V,script,scriptlen,txid,vout,0xffffffff);
if ( (type == 12 && scriptlen == 0) || (type == 1 && bitcoin_pubkeylen(script+1) <= 0) ) if ( (type == 12 && scriptlen == 0) || (type == 1 && bitcoin_pubkeylen(script+1) <= 0) )
{ {
int32_t i; for (i=0; i<scriptlen; i++) for (i=0; i<scriptlen; i++)
printf("%02x",script[i]); printf("%02x",script[i]);
printf(" script type.%d\n",type); printf(" script type.%d\n",type);
} }
//int32_t i; for (i=0; i<scriptlen; i++) //int32_t i; for (i=0; i<scriptlen; i++)
// printf("%02x",script[i]); // printf("%02x",script[i]);
//char str[65]; printf(" type.%d %s\n",type,bits256_str(str,txid)); //char str[65]; printf(" type.%d %s\n",type,bits256_str(str,txid));
memcpy(rmd160,V.rmd160,sizeof(V.rmd160)); //memcpy(rmd160,V.rmd160,sizeof(V.rmd160));
for (i=0; i<20; i++)
rmd160[i] = V.rmd160[i];
} //else printf("iguana_ramchain_addunspent20: unexpected non-neg type.%d\n",type); } //else printf("iguana_ramchain_addunspent20: unexpected non-neg type.%d\n",type);
} }
if ( ramchain->H.ROflag != 0 ) if ( ramchain->H.ROflag != 0 )
@ -309,7 +313,9 @@ uint32_t iguana_ramchain_addunspent20(struct iguana_info *coin,struct iguana_pee
{ {
u->value = value; u->value = value;
u->type = type; u->type = type;
memcpy(u->rmd160,rmd160,sizeof(u->rmd160)); //memcpy(u->rmd160,rmd160,sizeof(u->rmd160));
for (i=0; i<20; i++)
u->rmd160[i] = rmd160[i];
if ( type == IGUANA_SCRIPT_76AC ) if ( type == IGUANA_SCRIPT_76AC )
{ {
static uint64_t totalsize; static uint64_t totalsize;
@ -693,7 +699,7 @@ void *iguana_ramchain_offset(char *fname,void *dest,uint8_t *lhash,FILE *fp,uint
int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t flag) int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t flag)
{ {
RAMCHAIN_DECLARE; RAMCHAIN_ZEROES; RAMCHAIN_DECLARE; RAMCHAIN_ZEROES;
struct iguana_pkhash p; struct iguana_unspent u; struct iguana_txid txid; uint32_t i,numpkinds,numtxids,numunspents,numexternal,tlen,plen,nonz=0; uint8_t *ptr; struct iguana_ramchaindata *rdata; struct iguana_pkhash p; struct iguana_unspent u; struct iguana_txid txid; uint32_t i,j,numpkinds,numtxids,numunspents,numexternal,tlen,plen,nonz=0; uint8_t *ptr; struct iguana_ramchaindata *rdata;
//return(0); //return(0);
if ( (rdata= ramchain->H.data) != 0 ) if ( (rdata= ramchain->H.data) != 0 )
{ {
@ -716,7 +722,9 @@ int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain
tlen = (rdata->numtxsparse * rdata->txsparsebits) >> 3; tlen = (rdata->numtxsparse * rdata->txsparsebits) >> 3;
for (i=0; i<numtxids; i++) for (i=0; i<numtxids; i++)
{ {
memcpy(&txid,&T[i],sizeof(txid)); //memcpy(&txid,&T[i],sizeof(txid));
for (j=0; j<sizeof(txid); j++)
((uint8_t *)&txid)[j] = ((uint8_t *)&T[i])[j];
if ( bits256_nonz(txid.txid) != 0 ) if ( bits256_nonz(txid.txid) != 0 )
nonz++; nonz++;
} }
@ -2189,6 +2197,8 @@ void iguana_bundlemapfree(struct iguana_info *coin,struct OS_memspace *mem,struc
{ {
for (j=starti; j<=endi; j++) for (j=starti; j<=endi; j++)
{ {
R[j].fileptr = 0;
R[j].filesize = 0;
iguana_ramchain_free(coin,&R[j],1); iguana_ramchain_free(coin,&R[j],1);
} }
myfree(R,n * sizeof(*R)); myfree(R,n * sizeof(*R));

9
iguana/iguana_tx.c

@ -27,7 +27,7 @@ int32_t iguana_scriptdata(struct iguana_info *coin,uint8_t *scriptspace,uint64_t
int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen) int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen)
#endif #endif
{ {
FILE *fp; long err; int32_t retval = scriptlen; FILE *fp; long err; uint8_t *ptr; int32_t i,retval = scriptlen;
#ifndef __PNACL__ #ifndef __PNACL__
if ( scriptpos < 0xffffffff ) if ( scriptpos < 0xffffffff )
{ {
@ -41,7 +41,10 @@ int32_t iguana_scriptdata(struct iguana_info *coin, uint8_t *scriptspace, long f
{ {
if ( (scriptpos + scriptlen) <= fileptr[1] ) if ( (scriptpos + scriptlen) <= fileptr[1] )
{ {
memcpy(scriptspace,(void *)(fileptr[0] + (uint32_t)scriptpos),scriptlen); ptr = (void *)(fileptr[0] + (uint32_t)scriptpos);
//memcpy(scriptspace,ptr,scriptlen);
for (i=0; i<scriptlen; i++)
scriptspace[i] = ptr[i];
return(retval); return(retval);
} }
else if ( (0) ) else if ( (0) )
@ -307,7 +310,7 @@ int32_t iguana_peerblockrequest(struct supernet_info *myinfo,struct iguana_info
char str[65],str2[65]; char str[65],str2[65];
if ( counter++ < 100 ) if ( counter++ < 100 )
{ {
for (i=0; i<len; i++) for (i=0; i<len&&i<64; i++)
printf("%02x",blockspace[sizeof(struct iguana_msghdr)+i]); printf("%02x",blockspace[sizeof(struct iguana_msghdr)+i]);
printf(" len.%d error getting txi.%d [%d:%d] cmp.%s %s\n",len,i,bp->hdrsi,bundlei,bits256_str(str,checktxid),bits256_str(str2,T.txid)); printf(" len.%d error getting txi.%d [%d:%d] cmp.%s %s\n",len,i,bp->hdrsi,bundlei,bits256_str(str,checktxid),bits256_str(str2,T.txid));
} }

5
iguana/iguana_unspents.c

@ -1896,7 +1896,10 @@ INT_ARRAY_STRING(iguana,dividends,height,vals,symbol)
{ {
sprintf(buf,"%s %s %.8f %s",prefix,field,dstr(val),suffix); sprintf(buf,"%s %s %.8f %s",prefix,field,dstr(val),suffix);
if ( execflag != 0 ) if ( execflag != 0 )
system(buf); {
if ( system(buf) != 0 )
printf("error system.(%s)\n",buf);
}
else printf("%s\n",buf); else printf("%s\n",buf);
emit += val; emit += val;
} else dustsum += val; } else dustsum += val;

6
iguana/m_LP

@ -4,6 +4,6 @@ rm -f ../agents/iguana *.o
git pull git pull
cd secp256k1; ./m_unix; cd .. cd secp256k1; ./m_unix; cd ..
cd ../crypto777; ./m_LP; cd ../iguana cd ../crypto777; ./m_LP; cd ../iguana
clang -g -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c gcc -g -Wno-aggressive-loop-optimizations -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 gcc -g -Wno-aggressive-loop-optimizations -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c iguana_ramchain.c
clang -g -o ../agents/iguana *.o ../agents/libcrypto777.a /usr/local/lib/libnanomsg.so -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

2
iguana/m_osx

@ -4,5 +4,5 @@ rm ../agents/iguana *.o
git pull git pull
cd secp256k1; ./m_unix; cd .. cd secp256k1; ./m_unix; cd ..
gcc -g -Wno-address-of-packed-member -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c gcc -g -Wno-address-of-packed-member -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c
gcc -g -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c gcc -g -Wno-address-of-packed-member -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c iguana_ramchain.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 -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm

6
iguana/m_osx_release

@ -3,6 +3,6 @@
rm ../agents/iguana *.o rm ../agents/iguana *.o
git pull git pull
cd secp256k1; ./m_osx_release; cd .. cd secp256k1; ./m_osx_release; cd ..
gcc -g -mmacosx-version-min=10.6 -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c clang -g -mmacosx-version-min=10.6 -Wno-deprecated -c -O2 -DLIQUIDITY_PROVIDER=1 *.c ../basilisk/basilisk.c ../gecko/gecko.c ../datachain/datachain.c
gcc -g -mmacosx-version-min=10.6 -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c clang -g -mmacosx-version-min=10.6 -Wno-deprecated -c -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c
gcc -g -mmacosx-version-min=10.6 /usr/local/lib/libnanomsg.5.0.0.dylib -o ../agents/iguana *.o ../agents/libcrypto777.a -lcurl -lssl -lcrypto -lpthread -lz -lm clang -g -mmacosx-version-min=10.6 /usr/local/lib/libnanomsg.5.0.0.dylib -o ../agents/iguana *.o ../agents/libcrypto777.a -lcurl -lssl -lcrypto -lpthread -lz -lm

2
iguana/m_test

@ -5,7 +5,7 @@ git pull
cd secp256k1; ./m_unix; cd .. cd secp256k1; ./m_unix; cd ..
cd ../crypto777; ./m_LP; cd ../iguana 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 -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 -fno-aggressive-loop-optimizations -Wno-deprecated -c -DISNOTARYNODE=1 -DLIQUIDITY_PROVIDER=1 main.c iguana777.c iguana_bundles.c ../basilisk/basilisk.c iguana_ramchain.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 -lnanomsg -lcurl -lssl -lcrypto -lpthread -lz -lm
../agents/iguana notary & #> iguana.log 2> error.log & ../agents/iguana notary & #> iguana.log 2> error.log &

15
iguana/main.c

@ -749,19 +749,18 @@ void iguana_urlinit(struct supernet_info *myinfo,int32_t ismainnet,int32_t usess
void jumblr_loop(void *ptr) void jumblr_loop(void *ptr)
{ {
struct iguana_info *coin; char BTCaddr[64],KMDaddr[64]; bits256 privkey; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10; struct iguana_info *coin; uint32_t t; struct supernet_info *myinfo = ptr; int32_t mult = 10;
printf("JUMBLR loop\n"); printf("JUMBLR loop\n");
while ( 1 ) while ( 1 )
{ {
if ( (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 ) if ( myinfo->jumblr_passphrase[0] != 0 && (coin= iguana_coinfind("KMD")) != 0 && coin->FULLNODE < 0 )
{ {
privkey = jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX);
// if BTC has arrived in deposit address, invoke DEX -> KMD
// if BTC has arrived in destination address, invoke DEX -> BTC // if BTC has arrived in destination address, invoke DEX -> BTC
jumblr_DEXcheck(myinfo,coin,BTCaddr,KMDaddr,privkey); jumblr_DEXcheck(myinfo,coin);
t = (uint32_t)time(NULL); t = (uint32_t)time(NULL);
if ( myinfo->jumblr_passphrase[0] != 0 && (t % (120 * mult)) < 60 ) if ( (t % (120 * mult)) < 60 )
{ {
// if BTC has arrived in deposit address, invoke DEX -> KMD
jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult)); jumblr_iteration(myinfo,coin,(t % (360 * mult)) / (120 * mult),t % (120 * mult));
} }
//printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase); //printf("t.%u %p.%d %s\n",t,coin,coin!=0?coin->FULLNODE:0,myinfo->jumblr_passphrase);
@ -1909,10 +1908,10 @@ ZERO_ARGS(SuperNET,activehandle)
} else jaddstr(retjson,"status","locked"); } else jaddstr(retjson,"status","locked");
if ( myinfo->jumblr_passphrase[0] != 0 ) if ( myinfo->jumblr_passphrase[0] != 0 )
{ {
jumblr_privkey(myinfo,BTCaddr,KMDaddr,JUMBLR_DEPOSITPREFIX); jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,JUMBLR_DEPOSITPREFIX);
jaddstr(retjson,"BTCdeposit","notyet"); jaddstr(retjson,"BTCdeposit","notyet");
jaddstr(retjson,"KMDdeposit",KMDaddr); jaddstr(retjson,"KMDdeposit",KMDaddr);
jumblr_privkey(myinfo,BTCaddr,KMDaddr,""); jumblr_privkey(myinfo,BTCaddr,0,KMDaddr,"");
jaddstr(retjson,"BTCjumblr","notyet"); jaddstr(retjson,"BTCjumblr","notyet");
jaddstr(retjson,"KMDjumblr",KMDaddr); jaddstr(retjson,"KMDjumblr",KMDaddr);
} }

2
iguana/pangea777.h

@ -128,7 +128,7 @@ struct pangea_msghdr
char cmd[8]; char cmd[8];
int8_t turni,cardi,destplayer,myind; // ALL DATA MUST BE SERIALIZED!!! int8_t turni,cardi,destplayer,myind; // ALL DATA MUST BE SERIALIZED!!!
uint8_t serialized[]; uint8_t serialized[];
} PACKED; };// PACKED;
#define PANGEA_ARGS struct supernet_info *myinfo,struct table_info *tp,cJSON *json #define PANGEA_ARGS struct supernet_info *myinfo,struct table_info *tp,cJSON *json
#define PANGEA_CALLARGS myinfo,tp,json #define PANGEA_CALLARGS myinfo,tp,json

2
iguana/tests/dexgetO

@ -1,2 +1,2 @@
#!/bin/bash #!/bin/bash
curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":1,\"txid\":\"4a1a2026718ac10bd11ccccbdd85f29faa5f0b7c3ab95a57dcf7040c5ca0420c\",\"symbol\":\"KMD\"}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"gettxout\",\"vout\":0,\"txid\":\"3b0f38d8cf4b3a89b6c83003410abdb773422d814ce93d68730c00c91e770995\",\"symbol\":\"KMD\"}"

2
iguana/tests/dexlistunspent

@ -1,2 +1,2 @@
#!/bin/bash #!/bin/bash
curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"\",\"symbol\":\"BTC\"}" curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"dex\",\"method\":\"listunspent\",\"address\":\"REMYL4s4zSiKeLEit5FawHFuGKZ4apm297\",\"symbol\":\"KMD\"}"

6
includes/iguana_funcs.h

@ -629,8 +629,8 @@ int32_t iguana_staker_sort(struct iguana_info *coin,bits256 *hash2p,uint8_t *ref
bits256 mpz_div64(bits256 hash,uint64_t divval); bits256 mpz_div64(bits256 hash,uint64_t divval);
void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin); void iguana_walletinitcheck(struct supernet_info *myinfo,struct iguana_info *coin);
void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval); void jumblr_iteration(struct supernet_info *myinfo,struct iguana_info *coin,int32_t selector,int32_t modval);
void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coinkmd,char *BTCaddr,char *KMDaddr,bits256 privkey); void jumblr_DEXcheck(struct supernet_info *myinfo,struct iguana_info *coin);
bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,char *KMDaddr,char *prefix); bits256 jumblr_privkey(struct supernet_info *myinfo,char *BTCaddr,uint8_t pubtype,char *KMDaddr,char *prefix);
char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr); char *jumblr_importprivkey(struct supernet_info *myinfo,struct iguana_info *coin,char *wifstr);
int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins); int64_t iguana_esttxfee(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,char *signedtx,int32_t numvins);
@ -659,7 +659,7 @@ void iguana_schnorr(struct supernet_info *myinfo);
void iguana_fixsecp(struct supernet_info *myinfo); void iguana_fixsecp(struct supernet_info *myinfo);
int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp); int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp);
char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode); char *iguana_calcutxorawtx(struct supernet_info *myinfo,struct iguana_info *coin,cJSON **vinsp,cJSON *txobj,int64_t *satoshis,int32_t numoutputs,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode);
uint64_t _iguana_interest(uint32_t now,int32_t height,uint32_t txlocktime,uint64_t value); uint64_t _iguana_interest(uint32_t now,int32_t height,uint32_t txlocktime,uint64_t value);
#include "../includes/iguana_api.h" #include "../includes/iguana_api.h"

23
includes/iguana_structs.h

@ -141,7 +141,7 @@ struct iguana_msgmerkle
uint32_t branch_length; uint32_t branch_length;
bits256 branch_hash[4096]; bits256 branch_hash[4096];
uint32_t branch_side_mask; uint32_t branch_side_mask;
}PACKEDSTRUCT; }; //PACKEDSTRUCT;
struct iguana_msgblock struct iguana_msgblock
{ {
@ -155,9 +155,9 @@ struct iguana_msgzblock
uint32_t txn_count; uint32_t txn_count;
} PACKEDSTRUCT; } PACKEDSTRUCT;
struct iguana_msgvin { bits256 prev_hash; uint8_t *vinscript,*userdata,*spendscript,*redeemscript; uint32_t prev_vout,sequence; uint16_t scriptlen,p2shlen,userdatalen,spendlen; }PACKEDSTRUCT; struct iguana_msgvin { bits256 prev_hash; uint8_t *vinscript,*userdata,*spendscript,*redeemscript; uint32_t prev_vout,sequence; uint16_t scriptlen,p2shlen,userdatalen,spendlen; }; //PACKEDSTRUCT;
struct iguana_msgvout { uint64_t value; uint32_t pk_scriptlen; uint8_t *pk_script; }PACKEDSTRUCT; struct iguana_msgvout { uint64_t value; uint32_t pk_scriptlen; uint8_t *pk_script; }; //PACKEDSTRUCT;
struct iguana_msgtx struct iguana_msgtx
{ {
@ -168,7 +168,7 @@ struct iguana_msgtx
int32_t allocsize,timestamp,numinputs,numoutputs; int32_t allocsize,timestamp,numinputs,numoutputs;
int64_t inputsum,outputsum,txfee; int64_t inputsum,outputsum,txfee;
uint8_t *serialized; uint8_t *serialized;
} PACKEDSTRUCT; };// PACKEDSTRUCT;
struct iguana_msgjoinsplit struct iguana_msgjoinsplit
{ {
@ -466,10 +466,22 @@ struct iguana_RTtxid
struct hashstr_item { UT_hash_handle hh; char address[40]; }; struct hashstr_item { UT_hash_handle hh; char address[40]; };
struct jumblr_pending { bits256 splittxid,txid; int32_t vout; };
struct DEXcoin_info
{
bits256 deposit_privkey,jumblr_privkey;
struct iguana_info *coin;
double btcprice,BTC2KMD,kmdprice,USD_average,DEXpending,maxbid,minask,avail,KMDavail;
uint32_t lasttime,numpending;
char CMCname[32],symbol[16],depositaddr[64],KMDdepositaddr[64],KMDjumblraddr[64],jumblraddr[64];
struct jumblr_pending *pending;
};
struct iguana_info struct iguana_info
{ {
UT_hash_handle hh; UT_hash_handle hh;
char name[64],symbol[64],protocol,statusstr[512],scriptsfname[2][512]; char CMCname[64],name[64],symbol[64],protocol,statusstr[512],scriptsfname[2][512];
struct iguana_peers *peers; struct iguana_peer internaladdr; struct iguana_peers *peers; struct iguana_peer internaladdr;
//basilisk_func basilisk_rawtx,basilisk_balances,basilisk_value; //basilisk_func basilisk_rawtx,basilisk_balances,basilisk_value;
//basilisk_metricfunc basilisk_rawtxmetric,basilisk_balancesmetric,basilisk_valuemetric; //basilisk_metricfunc basilisk_rawtxmetric,basilisk_balancesmetric,basilisk_valuemetric;
@ -534,6 +546,7 @@ struct iguana_info
uint64_t estimatedfee; uint64_t estimatedfee;
char seedipaddr[64]; char seedipaddr[64];
uint32_t lastbesthashtime; bits256 lastbesthash; int32_t lastbestheight; uint32_t lastbesthashtime; bits256 lastbesthash; int32_t lastbestheight;
struct DEXcoin_info DEXinfo;
struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536];
struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs; struct iguana_RTtxid *RTdataset; struct iguana_RTaddr *RTaddrs;
struct hashstr_item *alladdresses; struct hashstr_item *alladdresses;

Loading…
Cancel
Save