Browse Source

Merge pull request #437 from jl777/spvdex

Spvdex
etomic
jl777 7 years ago
committed by GitHub
parent
commit
9225b8ffc2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 62
      iguana/exchanges/LP_coins.c
  2. 29
      iguana/exchanges/LP_commands.c
  3. 5
      iguana/exchanges/LP_include.h
  4. 5
      iguana/exchanges/LP_nativeDEX.c
  5. 2
      iguana/exchanges/LP_network.c
  6. 8
      iguana/exchanges/LP_remember.c
  7. 1
      iguana/exchanges/LP_rpc.c
  8. 42
      iguana/exchanges/LP_transaction.c
  9. 53
      iguana/exchanges/LP_utxo.c
  10. 1
      iguana/exchanges/LP_utxos.c
  11. 2
      iguana/exchanges/coins
  12. 6
      iguana/exchanges/coins.json
  13. 2
      iguana/exchanges/install
  14. 2
      iguana/exchanges/mm.c
  15. 2
      iguana/exchanges/stats.c

62
iguana/exchanges/LP_coins.c

@ -23,9 +23,12 @@ char *portstrs[][3] = { { "BTC", "8332" }, { "KMD", "7771" } };
uint16_t LP_rpcport(char *symbol) uint16_t LP_rpcport(char *symbol)
{ {
int32_t i; int32_t i;
for (i=0; i<sizeof(portstrs)/sizeof(*portstrs); i++) if ( symbol != 0 && symbol[0] != 0 )
if ( strcmp(portstrs[i][0],symbol) == 0 ) {
return(atoi(portstrs[i][1])); for (i=0; i<sizeof(portstrs)/sizeof(*portstrs); i++)
if ( strcmp(portstrs[i][0],symbol) == 0 )
return(atoi(portstrs[i][1]));
}
return(0); return(0);
} }
@ -231,12 +234,15 @@ cJSON *LP_coinjson(struct iguana_info *coin,int32_t showwif)
struct iguana_info *LP_conflicts_find(struct iguana_info *refcoin) struct iguana_info *LP_conflicts_find(struct iguana_info *refcoin)
{ {
struct iguana_info *coin=0,*tmp; struct iguana_info *coin=0,*tmp;
HASH_ITER(hh,LP_coins,coin,tmp) if ( refcoin != 0 )
{ {
if ( coin->inactive != 0 || coin->electrum != 0 || coin == refcoin ) HASH_ITER(hh,LP_coins,coin,tmp)
continue; {
if ( strcmp(coin->serverport,refcoin->serverport) == 0 ) if ( coin->inactive != 0 || coin->electrum != 0 || coin == refcoin )
break; continue;
if ( strcmp(coin->serverport,refcoin->serverport) == 0 )
break;
}
} }
return(coin); return(coin);
} }
@ -254,31 +260,37 @@ cJSON *LP_coinsjson(int32_t showwif)
char *LP_getcoin(char *symbol) char *LP_getcoin(char *symbol)
{ {
int32_t numenabled,numdisabled; struct iguana_info *coin,*tmp; cJSON *item=0,*retjson; int32_t numenabled,numdisabled; struct iguana_info *coin,*tmp; cJSON *item=0,*retjson;
numenabled = numdisabled = 0;
retjson = cJSON_CreateObject(); retjson = cJSON_CreateObject();
HASH_ITER(hh,LP_coins,coin,tmp) if ( symbol != 0 && symbol[0] != 0 )
{ {
if ( strcmp(symbol,coin->symbol) == 0 ) numenabled = numdisabled = 0;
item = LP_coinjson(coin,0); HASH_ITER(hh,LP_coins,coin,tmp)
if ( coin->inactive == 0 ) {
numenabled++; if ( strcmp(symbol,coin->symbol) == 0 )
else numdisabled++; item = LP_coinjson(coin,0);
if ( coin->inactive == 0 )
numenabled++;
else numdisabled++;
}
jaddstr(retjson,"result","success");
jaddnum(retjson,"enabled",numenabled);
jaddnum(retjson,"disabled",numdisabled);
if ( item == 0 )
item = cJSON_CreateObject();
jadd(retjson,"coin",item);
} }
jaddstr(retjson,"result","success");
jaddnum(retjson,"enabled",numenabled);
jaddnum(retjson,"disabled",numdisabled);
if ( item == 0 )
item = cJSON_CreateObject();
jadd(retjson,"coin",item);
return(jprint(retjson,1)); return(jprint(retjson,1));
} }
struct iguana_info *LP_coinsearch(char *symbol) struct iguana_info *LP_coinsearch(char *symbol)
{ {
struct iguana_info *coin; struct iguana_info *coin = 0;
portable_mutex_lock(&LP_coinmutex); if ( symbol != 0 && symbol[0] != 0 )
HASH_FIND(hh,LP_coins,symbol,strlen(symbol),coin); {
portable_mutex_unlock(&LP_coinmutex); portable_mutex_lock(&LP_coinmutex);
HASH_FIND(hh,LP_coins,symbol,strlen(symbol),coin);
portable_mutex_unlock(&LP_coinmutex);
}
return(coin); return(coin);
} }

29
iguana/exchanges/LP_commands.c

@ -153,9 +153,12 @@ bot_resume(botid)\n\
\"}")); \"}"));
//sell(base, rel, price, basevolume, timeout=10, duration=3600)\n\ //sell(base, rel, price, basevolume, timeout=10, duration=3600)\n\
base = jstr(argjson,"base"); if ( (base= jstr(argjson,"base")) == 0 )
rel = jstr(argjson,"rel"); base = "";
coin = jstr(argjson,"coin"); if ((rel= jstr(argjson,"rel")) == 0 )
rel = "";
if ( (coin= jstr(argjson,"coin")) == 0 )
coin = "";
if ( G.USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) // protected localhost if ( G.USERPASS[0] != 0 && strcmp(remoteaddr,"127.0.0.1") == 0 && port != 0 ) // protected localhost
{ {
if ( G.USERPASS_COUNTER == 0 ) if ( G.USERPASS_COUNTER == 0 )
@ -187,7 +190,7 @@ bot_resume(botid)\n\
{ {
if ( jobj(argjson,"method2") == 0 ) if ( jobj(argjson,"method2") == 0 )
{ {
LP_broadcast_message(LP_mypubsock,base!=0?base:jstr(argjson,"coin"),rel,jbits256(argjson,"pubkey"),jprint(argjson,0)); LP_broadcast_message(LP_mypubsock,base!=0?base:coin,rel,jbits256(argjson,"pubkey"),jprint(argjson,0));
} }
return(clonestr("{\"result\":\"success\"}")); return(clonestr("{\"result\":\"success\"}"));
} }
@ -257,15 +260,15 @@ bot_resume(botid)\n\
uint32_t requestid,quoteid; uint32_t requestid,quoteid;
if ( (requestid= juint(argjson,"requestid")) != 0 && (quoteid= juint(argjson,"quoteid")) != 0 ) if ( (requestid= juint(argjson,"requestid")) != 0 && (quoteid= juint(argjson,"quoteid")) != 0 )
return(basilisk_swapentry(requestid,quoteid)); return(basilisk_swapentry(requestid,quoteid));
else if ( coin != 0 && coin[0] != 0 ) else if ( coin[0] != 0 )
return(basilisk_swapentries(coin,0,jint(argjson,"limit"))); return(basilisk_swapentries(coin,0,jint(argjson,"limit")));
else if ( base != 0 && base[0] != 0 && rel != 0 && rel[0] != 0 ) else if ( base[0] != 0 && rel[0] != 0 )
return(basilisk_swapentries(base,rel,jint(argjson,"limit"))); return(basilisk_swapentries(base,rel,jint(argjson,"limit")));
else return(basilisk_swaplist(0,0)); else return(basilisk_swaplist(0,0));
} }
else if ( (retstr= LP_istradebots_command(ctx,pubsock,method,argjson)) != 0 ) else if ( (retstr= LP_istradebots_command(ctx,pubsock,method,argjson)) != 0 )
return(retstr); return(retstr);
if ( base != 0 && rel != 0 ) if ( base[0] != 0 && rel[0] != 0 )
{ {
double price,bid,ask; double price,bid,ask;
if ( IAMLP == 0 && LP_isdisabled(base,rel) != 0 ) if ( IAMLP == 0 && LP_isdisabled(base,rel) != 0 )
@ -318,14 +321,14 @@ bot_resume(botid)\n\
} else return(clonestr("{\"error\":\"no price set\"}")); } else return(clonestr("{\"error\":\"no price set\"}"));
} }
} }
else if ( rel != 0 && strcmp(method,"bestfit") == 0 ) else if ( rel[0] != 0 && strcmp(method,"bestfit") == 0 )
{ {
double relvolume; double relvolume;
if ( (relvolume= jdouble(argjson,"relvolume")) > SMALLVAL ) if ( (relvolume= jdouble(argjson,"relvolume")) > SMALLVAL )
return(LP_bestfit(rel,relvolume)); return(LP_bestfit(rel,relvolume));
else return(clonestr("{\"error\":\"no relvolume set\"}")); else return(clonestr("{\"error\":\"no relvolume set\"}"));
} }
else if ( (coin= jstr(argjson,"coin")) != 0 ) else if ( coin[0] != 0 )
{ {
if ( strcmp(method,"enable") == 0 ) if ( strcmp(method,"enable") == 0 )
{ {
@ -503,14 +506,14 @@ bot_resume(botid)\n\
} }
else if ( strcmp(method,"balance") == 0 ) else if ( strcmp(method,"balance") == 0 )
{ {
if ( (ptr= LP_coinsearch(jstr(argjson,"coin"))) != 0 ) if ( (ptr= LP_coinsearch(coin)) != 0 )
return(jprint(LP_address_balance(ptr,jstr(argjson,"address"),1),1)); return(jprint(LP_address_balance(ptr,jstr(argjson,"address"),1),1));
else return(clonestr("{\"error\":\"cant find coind\"}")); else return(clonestr("{\"error\":\"cant find coind\"}"));
} }
else if ( strcmp(method,"pricearray") == 0 ) else if ( strcmp(method,"pricearray") == 0 )
{ {
uint32_t firsttime; uint32_t firsttime;
if ( base != 0 && rel != 0 ) if ( base[0] != 0 && rel[0] != 0 )
{ {
if ( (firsttime= juint(argjson,"firsttime")) < time(NULL)-30*24*3600 ) if ( (firsttime= juint(argjson,"firsttime")) < time(NULL)-30*24*3600 )
firsttime = (uint32_t)(time(NULL)-30*24*3600); firsttime = (uint32_t)(time(NULL)-30*24*3600);
@ -540,7 +543,7 @@ bot_resume(botid)\n\
} }
else if ( strcmp(method,"listunspent") == 0 ) else if ( strcmp(method,"listunspent") == 0 )
{ {
if ( (ptr= LP_coinsearch(jstr(argjson,"coin"))) != 0 ) if ( (ptr= LP_coinsearch(coin)) != 0 )
{ {
char *coinaddr; char *coinaddr;
if ( (coinaddr= jstr(argjson,"address")) != 0 ) if ( (coinaddr= jstr(argjson,"address")) != 0 )
@ -568,7 +571,7 @@ bot_resume(botid)\n\
else if ( strcmp(method,"addr_unspents") == 0 ) else if ( strcmp(method,"addr_unspents") == 0 )
{ {
//printf("GOT ADDR_UNSPENTS %s %s\n",jstr(argjson,"coin"),jstr(argjson,"address")); //printf("GOT ADDR_UNSPENTS %s %s\n",jstr(argjson,"coin"),jstr(argjson,"address"));
if ( (ptr= LP_coinsearch(jstr(argjson,"coin"))) != 0 ) if ( (ptr= LP_coinsearch(coin)) != 0 )
{ {
char *coinaddr; char *coinaddr;
if ( (coinaddr= jstr(argjson,"address")) != 0 ) if ( (coinaddr= jstr(argjson,"address")) != 0 )

5
iguana/exchanges/LP_include.h

@ -47,6 +47,9 @@ void emscripten_usleep(int32_t x); // returns immediate, no sense for sleeping
#define LP_MIN_PEERS 8 #define LP_MIN_PEERS 8
#define LP_MAX_PEERS 32 #define LP_MAX_PEERS 32
#define LP_MAXDESIRED_UTXOS 128
#define LP_MINDESIRED_UTXOS 64
// RTmetrics // RTmetrics
#define LP_RTMETRICS_TOPGROUP 1.01 #define LP_RTMETRICS_TOPGROUP 1.01
#define LP_MAXPENDING_SWAPS 13 #define LP_MAXPENDING_SWAPS 13
@ -250,7 +253,7 @@ struct iguana_info
UT_hash_handle hh; UT_hash_handle hh;
portable_mutex_t txmutex,addrmutex; struct LP_transaction *transactions; struct LP_address *addresses; portable_mutex_t txmutex,addrmutex; struct LP_transaction *transactions; struct LP_address *addresses;
uint64_t txfee; uint64_t txfee;
int32_t longestchain,firstrefht,firstscanht,lastscanht,bussock,height; uint16_t busport; int32_t numutxos,longestchain,firstrefht,firstscanht,lastscanht,bussock,height; uint16_t busport;
uint32_t importedprivkey,lastpushtime,lastutxosync,addr_listunspent_requested,lastutxos,updaterate,counter,inactive,lastmempool,lastgetinfo,ratetime,heighttime,lastmonitor,obooktime; uint32_t importedprivkey,lastpushtime,lastutxosync,addr_listunspent_requested,lastutxos,updaterate,counter,inactive,lastmempool,lastgetinfo,ratetime,heighttime,lastmonitor,obooktime;
uint8_t pubtype,p2shtype,isPoS,wiftype,wiftaddr,taddr,noimportprivkey_flag,userconfirms,isassetchain,maxconfirms; uint8_t pubtype,p2shtype,isPoS,wiftype,wiftaddr,taddr,noimportprivkey_flag,userconfirms,isassetchain,maxconfirms;
char symbol[16],smartaddr[64],userpass[1024],serverport[128]; char symbol[16],smartaddr[64],userpass[1024],serverport[128];

5
iguana/exchanges/LP_nativeDEX.c

@ -17,7 +17,8 @@
// //
// LP_nativeDEX.c // LP_nativeDEX.c
// marketmaker // marketmaker
// bots to do bobs //
// autoadd dust utxo to vin for initial atomic tx
// verify portfolio, interest to KMD withdraw // verify portfolio, interest to KMD withdraw
// dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections
// bigendian architectures need to use little endian for sighash calcs // bigendian architectures need to use little endian for sighash calcs
@ -453,7 +454,7 @@ void utxosQ_loop(void *myipaddr)
{ {
LP_millistats_update(&utxosQ_loop_stats); LP_millistats_update(&utxosQ_loop_stats);
if ( LP_utxosQ_process() == 0 ) if ( LP_utxosQ_process() == 0 )
usleep(10000); usleep(50000);
} }
} }

2
iguana/exchanges/LP_network.c

@ -293,7 +293,7 @@ void queue_loop(void *arg)
{ {
struct LP_queue *ptr,*tmp; int32_t sentbytes,nonz,flag,duplicate,n=0; struct LP_queue *ptr,*tmp; int32_t sentbytes,nonz,flag,duplicate,n=0;
strcpy(queue_loop_stats.name,"queue_loop"); strcpy(queue_loop_stats.name,"queue_loop");
queue_loop_stats.threshold = 100.; queue_loop_stats.threshold = 1000.;
while ( 1 ) while ( 1 )
{ {
LP_millistats_update(&queue_loop_stats); LP_millistats_update(&queue_loop_stats);

8
iguana/exchanges/LP_remember.c

@ -937,7 +937,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti
} }
for (j=0; j<32; j++) for (j=0; j<32; j++)
rev.bytes[j] = rswap.myprivs[0].bytes[31 - j]; rev.bytes[j] = rswap.myprivs[0].bytes[31 - j];
if ( (rswap.txbytes[BASILISK_ALICESPEND]= basilisk_swap_bobtxspend(&signedtxid,rswap.Btxfee,"alicespend",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBPAYMENT],0,0,rswap.pubkey33,1,rswap.expiration,&rswap.values[BASILISK_ALICESPEND],0,0,rswap.bobpaymentaddr,1,bob->zcash)) != 0 ) if ( (rswap.txbytes[BASILISK_ALICESPEND]= basilisk_swap_bobtxspend(0,&signedtxid,rswap.Btxfee,"alicespend",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBPAYMENT],0,0,rswap.pubkey33,1,rswap.expiration,&rswap.values[BASILISK_ALICESPEND],0,0,rswap.bobpaymentaddr,1,bob->zcash)) != 0 )
printf("alicespend.(%s)\n",rswap.txbytes[BASILISK_ALICESPEND]); printf("alicespend.(%s)\n",rswap.txbytes[BASILISK_ALICESPEND]);
} }
LP_txbytes_update("alicespend",rswap.bobcoin,rswap.txbytes[BASILISK_ALICESPEND],&rswap.txids[BASILISK_ALICESPEND],&rswap.paymentspent,&rswap.sentflags[BASILISK_ALICESPEND]); LP_txbytes_update("alicespend",rswap.bobcoin,rswap.txbytes[BASILISK_ALICESPEND],&rswap.txids[BASILISK_ALICESPEND],&rswap.paymentspent,&rswap.sentflags[BASILISK_ALICESPEND]);
@ -967,7 +967,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti
if ( bits256_nonz(rswap.privBn) != 0 ) if ( bits256_nonz(rswap.privBn) != 0 )
{ {
len = basilisk_swapuserdata(userdata,zero,1,rswap.myprivs[0],redeemscript,redeemlen); len = basilisk_swapuserdata(userdata,zero,1,rswap.myprivs[0],redeemscript,redeemlen);
if ( (rswap.txbytes[BASILISK_ALICECLAIM]= basilisk_swap_bobtxspend(&signedtxid,rswap.Btxfee,"aliceclaim",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBDEPOSIT],0,0,rswap.pubkey33,0,rswap.expiration,&rswap.values[BASILISK_ALICECLAIM],0,0,rswap.bobdepositaddr,1,bob->zcash)) != 0 ) if ( (rswap.txbytes[BASILISK_ALICECLAIM]= basilisk_swap_bobtxspend(0,&signedtxid,rswap.Btxfee,"aliceclaim",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBDEPOSIT],0,0,rswap.pubkey33,0,rswap.expiration,&rswap.values[BASILISK_ALICECLAIM],0,0,rswap.bobdepositaddr,1,bob->zcash)) != 0 )
printf("privBn.(%s) aliceclaim.(%s)\n",bits256_str(str,rswap.privBn),rswap.txbytes[BASILISK_ALICECLAIM]); printf("privBn.(%s) aliceclaim.(%s)\n",bits256_str(str,rswap.privBn),rswap.txbytes[BASILISK_ALICECLAIM]);
} }
} }
@ -1042,7 +1042,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti
if ( redeemlen > 0 ) if ( redeemlen > 0 )
{ {
len = basilisk_swapuserdata(userdata,zero,1,rswap.myprivs[1],redeemscript,redeemlen); len = basilisk_swapuserdata(userdata,zero,1,rswap.myprivs[1],redeemscript,redeemlen);
if ( (rswap.txbytes[BASILISK_BOBRECLAIM]= basilisk_swap_bobtxspend(&signedtxid,rswap.Btxfee,"bobrefund",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[1],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBPAYMENT],0,0,rswap.pubkey33,0,rswap.expiration,&rswap.values[BASILISK_BOBRECLAIM],0,0,rswap.bobpaymentaddr,1,bob->zcash)) != 0 ) if ( (rswap.txbytes[BASILISK_BOBRECLAIM]= basilisk_swap_bobtxspend(0,&signedtxid,rswap.Btxfee,"bobrefund",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[1],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBPAYMENT],0,0,rswap.pubkey33,0,rswap.expiration,&rswap.values[BASILISK_BOBRECLAIM],0,0,rswap.bobpaymentaddr,1,bob->zcash)) != 0 )
{ {
int32_t z; int32_t z;
for (z=0; z<20; z++) for (z=0; z<20; z++)
@ -1073,7 +1073,7 @@ cJSON *basilisk_remember(int64_t *KMDtotals,int64_t *BTCtotals,uint32_t requesti
vcalc_sha256(0,rswap.secretBn256,rswap.privBn.bytes,sizeof(rswap.privBn)); vcalc_sha256(0,rswap.secretBn256,rswap.privBn.bytes,sizeof(rswap.privBn));
redeemlen = basilisk_swap_bobredeemscript(1,&secretstart,redeemscript,rswap.dlocktime,rswap.pubA0,rswap.pubB0,rswap.pubB1,rswap.privAm,rswap.privBn,rswap.secretAm,rswap.secretAm256,rswap.secretBn,rswap.secretBn256); redeemlen = basilisk_swap_bobredeemscript(1,&secretstart,redeemscript,rswap.dlocktime,rswap.pubA0,rswap.pubB0,rswap.pubB1,rswap.privAm,rswap.privBn,rswap.secretAm,rswap.secretAm256,rswap.secretBn,rswap.secretBn256);
len = basilisk_swapuserdata(userdata,rswap.privBn,0,rswap.myprivs[0],redeemscript,redeemlen); len = basilisk_swapuserdata(userdata,rswap.privBn,0,rswap.myprivs[0],redeemscript,redeemlen);
if ( (rswap.txbytes[BASILISK_BOBREFUND]= basilisk_swap_bobtxspend(&signedtxid,rswap.Btxfee,"bobrefund",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBDEPOSIT],0,0,rswap.pubkey33,1,rswap.expiration,&rswap.values[BASILISK_BOBREFUND],0,0,rswap.bobdepositaddr,1,bob->zcash)) != 0 ) if ( (rswap.txbytes[BASILISK_BOBREFUND]= basilisk_swap_bobtxspend(0,&signedtxid,rswap.Btxfee,"bobrefund",rswap.bobcoin,bob->wiftaddr,bob->taddr,bob->pubtype,bob->p2shtype,bob->isPoS,bob->wiftype,ctx,rswap.myprivs[0],0,redeemscript,redeemlen,userdata,len,rswap.txids[BASILISK_BOBDEPOSIT],0,0,rswap.pubkey33,1,rswap.expiration,&rswap.values[BASILISK_BOBREFUND],0,0,rswap.bobdepositaddr,1,bob->zcash)) != 0 )
printf("pubB1.(%s) bobrefund.(%s)\n",bits256_str(str,rswap.pubB1),rswap.txbytes[BASILISK_BOBREFUND]); printf("pubB1.(%s) bobrefund.(%s)\n",bits256_str(str,rswap.pubB1),rswap.txbytes[BASILISK_BOBREFUND]);
} }
LP_txbytes_update("bobrefund",rswap.bobcoin,rswap.txbytes[BASILISK_BOBREFUND],&rswap.txids[BASILISK_BOBREFUND],&rswap.depositspent,&rswap.sentflags[BASILISK_BOBREFUND]); LP_txbytes_update("bobrefund",rswap.bobcoin,rswap.txbytes[BASILISK_BOBREFUND],&rswap.txids[BASILISK_BOBREFUND],&rswap.depositspent,&rswap.sentflags[BASILISK_BOBREFUND]);

1
iguana/exchanges/LP_rpc.c

@ -709,6 +709,7 @@ int32_t LP_listunspent_issue(char *symbol,char *coinaddr,int32_t fullflag)
if ( strcmp(coin->smartaddr,coinaddr) == 0 ) if ( strcmp(coin->smartaddr,coinaddr) == 0 )
{ {
retjson = LP_listunspent(symbol,coinaddr); retjson = LP_listunspent(symbol,coinaddr);
coin->numutxos = cJSON_GetArraySize(retjson);
//printf("SELF_LISTUNSPENT.(%s %s)\n",symbol,coinaddr); //printf("SELF_LISTUNSPENT.(%s %s)\n",symbol,coinaddr);
} }
else if ( IAMLP == 0 ) else if ( IAMLP == 0 )

42
iguana/exchanges/LP_transaction.c

@ -603,9 +603,9 @@ int32_t iguana_signrawtransaction(void *ctx,char *symbol,uint8_t wiftaddr,uint8_
return(complete); return(complete);
} }
char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,uint8_t wiftaddr,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,void *ctx,bits256 privkey,bits256 *privkey2p,uint8_t *redeemscript,int32_t redeemlen,uint8_t *userdata,int32_t userdatalen,bits256 utxotxid,int32_t utxovout,char *destaddr,uint8_t *pubkey33,int32_t finalseqid,uint32_t expiration,int64_t *destamountp,uint64_t satoshis,char *changeaddr,char *vinaddr,int32_t suppress_pubkeys,int32_t zcash) char *basilisk_swap_bobtxspend(int32_t dustcombine,bits256 *signedtxidp,uint64_t txfee,char *name,char *symbol,uint8_t wiftaddr,uint8_t taddr,uint8_t pubtype,uint8_t p2shtype,uint8_t isPoS,uint8_t wiftype,void *ctx,bits256 privkey,bits256 *privkey2p,uint8_t *redeemscript,int32_t redeemlen,uint8_t *userdata,int32_t userdatalen,bits256 utxotxid,int32_t utxovout,char *destaddr,uint8_t *pubkey33,int32_t finalseqid,uint32_t expiration,int64_t *destamountp,uint64_t satoshis,char *changeaddr,char *vinaddr,int32_t suppress_pubkeys,int32_t zcash)
{ {
char *rawtxbytes=0,*signedtx=0,str[65],tmpaddr[64],hexstr[999],wifstr[128],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *txobj,*vins,*obj,*vouts,*item,*privkeys; int32_t completed,spendlen,n,ignore_cltverr=1; struct vin_info V[2]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value=0,change = 0; struct iguana_msgtx msgtx; struct iguana_info *coin; char *rawtxbytes=0,*signedtx=0,str[65],tmpaddr[64],hexstr[999],wifstr[128],_destaddr[64]; uint8_t spendscript[512],addrtype,rmd160[20]; cJSON *items[2],*txobj,*vins,*obj,*vouts,*item,*privkeys; int32_t i,completed,spendlen,n,ignore_cltverr=1; struct vin_info V[8]; uint32_t timestamp,locktime = 0,sequenceid = 0xffffffff * finalseqid; bits256 txid; uint64_t value=0,change = 0; struct iguana_msgtx msgtx; struct iguana_info *coin;
LP_mark_spent(symbol,utxotxid,utxovout); LP_mark_spent(symbol,utxotxid,utxovout);
if ( txfee > 0 && txfee < 10000 ) if ( txfee > 0 && txfee < 10000 )
txfee = 10000; txfee = 10000;
@ -617,9 +617,9 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch
if ( redeemlen < 0 ) if ( redeemlen < 0 )
return(0); return(0);
value = 0; value = 0;
#ifndef BASILISK_DISABLESENDTX
if ( (coin= LP_coinfind(symbol)) != 0 ) if ( (coin= LP_coinfind(symbol)) != 0 )
{ {
#ifndef BASILISK_DISABLESENDTX
if ( (txobj= LP_gettx(symbol,utxotxid)) != 0 ) if ( (txobj= LP_gettx(symbol,utxotxid)) != 0 )
{ {
if ( (vouts= jarray(&n,txobj,"vout")) != 0 && utxovout < n ) if ( (vouts= jarray(&n,txobj,"vout")) != 0 && utxovout < n )
@ -629,16 +629,30 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch
//printf("value in vout.%d %.8f (%s)\n",vout,dstr(value),jprint(txobj,0)); //printf("value in vout.%d %.8f (%s)\n",vout,dstr(value),jprint(txobj,0));
} }
free_json(txobj); free_json(txobj);
//if ( value != 0 )
// gettxout
} else printf("cant gettx\n"); } else printf("cant gettx\n");
if ( value == 0 ) if ( value == 0 )
{ {
printf("basilisk_swap_bobtxspend.%s %s utxo.(%s).v%d already spent or doesnt exist\n",name,symbol,bits256_str(str,utxotxid),utxovout); printf("basilisk_swap_bobtxspend.%s %s utxo.(%s).v%d already spent or doesnt exist\n",name,symbol,bits256_str(str,utxotxid),utxovout);
return(0); return(0);
} }
} if ( coin->electrum != 0 || coin->numutxos < LP_MINDESIRED_UTXOS )
dustcombine = 0;
else if ( coin->numutxos >= LP_MINDESIRED_UTXOS )
dustcombine = 2;
if ( dustcombine != 0 )
{
uint64_t more;
if ( privkey2p != 0 )
dustcombine = 1;
memset(items,0,sizeof(items));
more = LP_dustcombine(items,dustcombine,coin);
if ( more != 0 )
printf("%s dustcombine.%d -> %.8f (%s) + (%s)\n",coin->symbol,dustcombine,dstr(more),items[0] != 0 ? jprint(items[0],0) : "",items[1] != 0 ? jprint(items[1],0) : "");
value += more;
dustcombine = (items[0] != 0) + (items[1] != 0);
}
#endif #endif
}
if ( satoshis != 0 ) if ( satoshis != 0 )
{ {
if ( value < satoshis+txfee ) if ( value < satoshis+txfee )
@ -696,6 +710,13 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch
jaddistr(privkeys,wifstr); jaddistr(privkeys,wifstr);
V[0].suppress_pubkeys = suppress_pubkeys; V[0].suppress_pubkeys = suppress_pubkeys;
V[0].ignore_cltverr = ignore_cltverr; V[0].ignore_cltverr = ignore_cltverr;
for (i=0; i<dustcombine; i++) // must be simple standard vin
{
V[i+1].signers[0].privkey = privkey;
V[i+1].suppress_pubkeys = 0;
V[i+1].ignore_cltverr = 0;
V[i+1].N = V[i+1].M = 1;
}
if ( redeemlen != 0 ) if ( redeemlen != 0 )
memcpy(V[0].p2shscript,redeemscript,redeemlen), V[0].p2shlen = redeemlen; memcpy(V[0].p2shscript,redeemscript,redeemlen), V[0].p2shlen = redeemlen;
txobj = bitcoin_txcreate(symbol,isPoS,locktime,1,timestamp); txobj = bitcoin_txcreate(symbol,isPoS,locktime,1,timestamp);
@ -726,6 +747,9 @@ char *basilisk_swap_bobtxspend(bits256 *signedtxidp,uint64_t txfee,char *name,ch
jaddnum(item,"suppress",suppress_pubkeys); jaddnum(item,"suppress",suppress_pubkeys);
jaddnum(item,"sequence",sequenceid); jaddnum(item,"sequence",sequenceid);
jaddi(vins,item); jaddi(vins,item);
for (i=0; i<dustcombine; i++)
if ( items[i] != 0 )
jaddi(vins,items[i]);
jdelete(txobj,"vin"); jdelete(txobj,"vin");
jadd(txobj,"vin",vins); jadd(txobj,"vin",vins);
if ( destaddr == 0 ) if ( destaddr == 0 )
@ -1109,7 +1133,7 @@ int32_t basilisk_rawtx_gen(void *ctx,char *str,uint32_t swapstarted,uint8_t *pub
txfee = LP_MIN_TXFEE; txfee = LP_MIN_TXFEE;
for (iter=0; iter<2; iter++) for (iter=0; iter<2; iter++)
{ {
if ( (signedtx= basilisk_swap_bobtxspend(&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,str,coin->symbol,coin->wiftaddr,coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->wiftype,ctx,privkey,0,0,0,0,0,rawtx->utxotxid,rawtx->utxovout,rawtx->I.destaddr,pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys,coin->zcash)) != 0 ) if ( (signedtx= basilisk_swap_bobtxspend(1,&rawtx->I.signedtxid,iter == 0 ? txfee : newtxfee,str,coin->symbol,coin->wiftaddr,coin->taddr,coin->pubtype,coin->p2shtype,coin->isPoS,coin->wiftype,ctx,privkey,0,0,0,0,0,rawtx->utxotxid,rawtx->utxovout,rawtx->I.destaddr,pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,rawtx->I.suppress_pubkeys,coin->zcash)) != 0 )
{ {
rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1;
if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) ) if ( rawtx->I.datalen <= sizeof(rawtx->txbytes) )
@ -1148,7 +1172,7 @@ int32_t basilisk_rawtx_sign(char *symbol,uint8_t wiftaddr,uint8_t taddr,uint8_t
} }
for (iter=0; iter<2; iter++) for (iter=0; iter<2; iter++)
{ {
if ( (signedtx= basilisk_swap_bobtxspend(&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,dest->utxotxid,dest->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys,zcash)) != 0 ) if ( (signedtx= basilisk_swap_bobtxspend(0,&dest->I.signedtxid,iter == 0 ? txfee : newtxfee,rawtx->name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,swap->ctx,privkey,privkey2,rawtx->redeemscript,rawtx->I.redeemlen,userdata,userdatalen,dest->utxotxid,dest->utxovout,dest->I.destaddr,rawtx->I.pubkey33,1,0,&destamount,rawtx->I.amount,changeaddr,vinaddr,dest->I.suppress_pubkeys,zcash)) != 0 )
{ {
dest->I.datalen = (int32_t)strlen(signedtx) >> 1; dest->I.datalen = (int32_t)strlen(signedtx) >> 1;
if ( dest->I.datalen <= sizeof(dest->txbytes) ) if ( dest->I.datalen <= sizeof(dest->txbytes) )
@ -1208,7 +1232,7 @@ char *basilisk_swap_Aspend(char *name,char *symbol,uint64_t Atxfee,uint8_t wifta
txfee = LP_MIN_TXFEE; txfee = LP_MIN_TXFEE;
} }
//txfee = LP_txfee(symbol); //txfee = LP_txfee(symbol);
signedtx = basilisk_swap_bobtxspend(&signedtxid,txfee,name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,utxovout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1,zcash); signedtx = basilisk_swap_bobtxspend(0,&signedtxid,txfee,name,symbol,wiftaddr,taddr,pubtype,p2shtype,isPoS,wiftype,ctx,privAm,&privBn,redeemscript,redeemlen,0,0,utxotxid,utxovout,0,pubkey33,1,expiration,destamountp,0,0,vinaddr,1,zcash);
LP_mark_spent(symbol,utxotxid,utxovout); LP_mark_spent(symbol,utxotxid,utxovout);
} }
return(signedtx); return(signedtx);

53
iguana/exchanges/LP_utxo.c

@ -957,6 +957,59 @@ int32_t LP_inventory_prevent(int32_t iambob,char *symbol,bits256 txid,int32_t vo
return(0); return(0);
} }
cJSON *LP_dustcombine_item(struct LP_address_utxo *up)
{
cJSON *item = cJSON_CreateObject();
jaddbits256(item,"txid",up->U.txid);
jaddnum(item,"vout",up->U.vout);
return(item);
}
uint64_t LP_dustcombine(cJSON *items[2],int32_t dustcombine,struct iguana_info *coin)
{
struct LP_address *ap=0; struct LP_address_utxo *up,*tmp,*min0,*min1; cJSON *txobj;
if ( coin == 0 || coin->electrum != 0 || dustcombine <= 0 || dustcombine > 2 )
return(0);
return(0);
min1 = min0 = 0;
if ( (ap= _LP_addressfind(coin,coin->smartaddr)) != 0 )
{
DL_FOREACH_SAFE(ap->utxos,up,tmp)
{
if ( up->spendheight <= 0 && up->U.height > 0 && up->U.value != 0 )
{
if ( (txobj= LP_gettxout(coin->symbol,coin->smartaddr,up->U.txid,up->U.vout)) == 0 )
up->spendheight = 1;
else
{
free_json(txobj);
if ( LP_inventory_prevent(0,coin->symbol,up->U.txid,up->U.vout) == 0 && LP_inventory_prevent(1,coin->symbol,up->U.txid,up->U.vout) == 0 )
{
if ( min1 == 0 || up->U.value < min1->U.value )
{
if ( min0 == 0 || up->U.value < min0->U.value )
{
min1 = min0;
min0 = up;
} else min1 = up;
}
}
}
}
}
}
if ( min0 != 0 )
{
items[0] = LP_dustcombine_item(min0);
if ( dustcombine == 2 && min1 != 0 )
{
items[1] = LP_dustcombine_item(min1);
return(min0->U.value + min1->U.value);
} else return(min0->U.value);
}
return(0);
}
int32_t LP_undospends(struct iguana_info *coin,int32_t lastheight) int32_t LP_undospends(struct iguana_info *coin,int32_t lastheight)
{ {
int32_t i,ht,num = 0; struct LP_transaction *tx,*tmp; int32_t i,ht,num = 0; struct LP_transaction *tx,*tmp;

1
iguana/exchanges/LP_utxos.c

@ -512,6 +512,7 @@ int32_t LP_privkey_init(int32_t mypubsock,struct iguana_info *coin,bits256 mypri
txfee = LP_txfeecalc(coin,0,0); txfee = LP_txfeecalc(coin,0,0);
if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 ) if ( is_cJSON_Array(array) != 0 && (n= cJSON_GetArraySize(array)) > 0 )
{ {
coin->numutxos = n;
//printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0)); //printf("LP_privkey_init %s %s\n",coin->symbol,jprint(array,0));
for (iambob=0; iambob<=1; iambob++) for (iambob=0; iambob<=1; iambob++)
{ {

2
iguana/exchanges/coins

File diff suppressed because one or more lines are too long

6
iguana/exchanges/coins.json

File diff suppressed because one or more lines are too long

2
iguana/exchanges/install

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
cp processlist stop millis mnzservers bot_buy bot_list bot_statuslist bot_pause bot_resume bot_sell bot_settings bot_status bot_stop guistats pubkeystats pendings coinswaps baserelswaps setpassphrase notarizations getrawtransaction parselog statsdisp m_js trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts cp processfiles stop millis mnzservers bot_buy bot_list bot_statuslist bot_pause bot_resume bot_sell bot_settings bot_status bot_stop guistats pubkeystats pendings coinswaps baserelswaps setpassphrase notarizations getrawtransaction parselog statsdisp m_js trust trusted setconfirms balance listunspent electrum snapshot_balance snapshot_loop secretaddresses dividends snapshot goals goal portfolio autoprice deletemessages getmessages debug buy sell bestfit orderbook client run_osx client_osx run coins disable enable myprice myprices getcoins getpeers getpeersIP getprices help inv setprice status ../dexscripts
cp coins.json .. cp coins.json ..
cd ../dexscripts cd ../dexscripts
#cp ../exchanges/passphrase ../exchanges/userpass . #cp ../exchanges/passphrase ../exchanges/userpass .

2
iguana/exchanges/mm.c

@ -907,7 +907,7 @@ int main(int argc, const char * argv[])
} //else printf("(%s) launched.(%s)\n",argv[1],passphrase); } //else printf("(%s) launched.(%s)\n",argv[1],passphrase);
incr = 100.; incr = 100.;
while ( (1) ) while ( (1) )
sleep(1); sleep(100000);
profitmargin = jdouble(retjson,"profitmargin"); profitmargin = jdouble(retjson,"profitmargin");
minask = jdouble(retjson,"minask"); minask = jdouble(retjson,"minask");
maxbid = jdouble(retjson,"maxbid"); maxbid = jdouble(retjson,"maxbid");

2
iguana/exchanges/stats.c

@ -598,7 +598,7 @@ void LP_rpc_processreq(void *_ptr)
char filetype[128],content_type[128]; char filetype[128],content_type[128];
int32_t recvlen,flag,postflag=0,contentlen,remains,sock,numsent,jsonflag=0,hdrsize,len; int32_t recvlen,flag,postflag=0,contentlen,remains,sock,numsent,jsonflag=0,hdrsize,len;
char helpname[512],remoteaddr[64],*buf,*retstr,*space,*jsonbuf; struct rpcrequest_info *req = _ptr; char helpname[512],remoteaddr[64],*buf,*retstr,*space,*jsonbuf; struct rpcrequest_info *req = _ptr;
uint32_t ipbits,i,size = 32*IGUANA_MAXPACKETSIZE + 512; uint32_t ipbits,i,size = IGUANA_MAXPACKETSIZE + 512;
ipbits = req->ipbits;; ipbits = req->ipbits;;
expand_ipbits(remoteaddr,ipbits); expand_ipbits(remoteaddr,ipbits);
sock = req->sock; sock = req->sock;

Loading…
Cancel
Save