|
@ -316,15 +316,11 @@ bits256 basilisk_swap_broadcast(char *name,struct supernet_info *myinfo,struct b |
|
|
return(txid); |
|
|
return(txid); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) |
|
|
int32_t _basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,uint32_t timestamp,uint32_t locktime,uint32_t sequenceid,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) |
|
|
{ |
|
|
{ |
|
|
char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; uint32_t timestamp,sequenceid=0xffffffff; struct vin_info *V; uint32_t locktime=0; |
|
|
char *rawtxbytes=0,*signedtx=0,hexstr[999],wifstr[128]; cJSON *txobj,*vins,*item,*sobj,*privkeys; int32_t needsig=1,retval = -1; struct vin_info *V; |
|
|
|
|
|
|
|
|
V = calloc(16,sizeof(*V)); |
|
|
V = calloc(16,sizeof(*V)); |
|
|
timestamp = swap->I.started; |
|
|
|
|
|
if ( dest == &swap->aliceclaim ) |
|
|
|
|
|
locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; |
|
|
|
|
|
else if ( dest == &swap->bobreclaim ) |
|
|
|
|
|
locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; |
|
|
|
|
|
V[0].signers[0].privkey = privkey; |
|
|
V[0].signers[0].privkey = privkey; |
|
|
bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); |
|
|
bitcoin_pubkey33(myinfo->ctx,V[0].signers[0].pubkey,privkey); |
|
|
privkeys = cJSON_CreateArray(); |
|
|
privkeys = cJSON_CreateArray(); |
|
@ -399,6 +395,159 @@ int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct b |
|
|
return(retval); |
|
|
return(retval); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_sign(struct supernet_info *myinfo,int32_t height,struct basilisk_swap *swap,struct basilisk_rawtx *dest,struct basilisk_rawtx *rawtx,bits256 privkey,bits256 *privkey2,uint8_t *userdata,int32_t userdatalen,int32_t ignore_cltverr) |
|
|
|
|
|
{ |
|
|
|
|
|
uint32_t timestamp,locktime=0,sequenceid = 0xffffffff; |
|
|
|
|
|
timestamp = swap->I.started; |
|
|
|
|
|
if ( dest == &swap->aliceclaim ) |
|
|
|
|
|
locktime = swap->bobdeposit.I.locktime + 1, sequenceid = 0; |
|
|
|
|
|
else if ( dest == &swap->bobreclaim ) |
|
|
|
|
|
locktime = swap->bobpayment.I.locktime + 1, sequenceid = 0; |
|
|
|
|
|
return(_basilisk_rawtx_sign(myinfo,height,timestamp,locktime,sequenceid,dest,rawtx,privkey,privkey2,userdata,userdatalen,ignore_cltverr)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) |
|
|
|
|
|
{ |
|
|
|
|
|
cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; |
|
|
|
|
|
privkeyarray = cJSON_CreateArray(); |
|
|
|
|
|
//printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr);
|
|
|
|
|
|
if ( (n= cJSON_GetArraySize(vins)) > 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
item = jitem(vins,i); |
|
|
|
|
|
txid = jbits256(item,"txid"); |
|
|
|
|
|
vout = jint(item,"vout"); |
|
|
|
|
|
if ( bits256_nonz(txid) != 0 && vout >= 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); |
|
|
|
|
|
if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
len = (int32_t)strlen(hexstr) >> 1; |
|
|
|
|
|
if ( len < (sizeof(script) << 1) ) |
|
|
|
|
|
{ |
|
|
|
|
|
decode_hex(script,len,hexstr); |
|
|
|
|
|
if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) |
|
|
|
|
|
bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if ( coinaddr[0] != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); |
|
|
|
|
|
jaddistr(privkeyarray,waddr->wifstr); |
|
|
|
|
|
} |
|
|
|
|
|
else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); |
|
|
|
|
|
jaddistr(privkeyarray,wifstr); |
|
|
|
|
|
} |
|
|
|
|
|
else printf("cant find (%s) in wallet\n",coinaddr); |
|
|
|
|
|
} else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); |
|
|
|
|
|
} else printf("invalid txid/vout %d of %d\n",i,n); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(privkeyarray); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) |
|
|
|
|
|
{ |
|
|
|
|
|
char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; |
|
|
|
|
|
if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); |
|
|
|
|
|
if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( lockinputs != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
//printf("lockinputs\n");
|
|
|
|
|
|
iguana_RTunspentslock(myinfo,rawtx->coin,vins); |
|
|
|
|
|
if ( (n= cJSON_GetArraySize(vins)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bits256 txid; int32_t vout; |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
item = jitem(vins,i); |
|
|
|
|
|
txid = jbits256(item,"txid"); |
|
|
|
|
|
vout = jint(item,"vout"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; |
|
|
|
|
|
rawtx->txbytes = calloc(1,rawtx->I.datalen); |
|
|
|
|
|
decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); |
|
|
|
|
|
printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); |
|
|
|
|
|
free(signedtx); |
|
|
|
|
|
retval = 0; |
|
|
|
|
|
} else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll
|
|
|
|
|
|
free_json(privkeyarray); |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,uint32_t swapstarted,uint8_t *pubkey33,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,int32_t delay) |
|
|
|
|
|
{ |
|
|
|
|
|
char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; |
|
|
|
|
|
//bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33);
|
|
|
|
|
|
if ( rawtx->coin->changeaddr[0] == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,pubkey33,33); |
|
|
|
|
|
printf("set change address.(%s)\n",rawtx->coin->changeaddr); |
|
|
|
|
|
} |
|
|
|
|
|
//if ( strcmp(rawtx->coin->symbol,"BTC") == 0 )
|
|
|
|
|
|
// txfee = 0;
|
|
|
|
|
|
init_hexbytes_noT(scriptstr,script,scriptlen); |
|
|
|
|
|
basilisktag = (uint32_t)rand(); |
|
|
|
|
|
valsobj = cJSON_CreateObject(); |
|
|
|
|
|
jaddstr(valsobj,"coin",rawtx->coin->symbol); |
|
|
|
|
|
jaddstr(valsobj,"spendscript",scriptstr); |
|
|
|
|
|
jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); |
|
|
|
|
|
jadd64bits(valsobj,"satoshis",rawtx->I.amount); |
|
|
|
|
|
jadd64bits(valsobj,"txfee",txfee); |
|
|
|
|
|
jaddnum(valsobj,"minconf",minconf); |
|
|
|
|
|
jaddnum(valsobj,"locktime",locktime); |
|
|
|
|
|
jaddnum(valsobj,"timeout",30000); |
|
|
|
|
|
jaddnum(valsobj,"timestamp",swapstarted+delay); |
|
|
|
|
|
addresses = cJSON_CreateArray(); |
|
|
|
|
|
bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,pubkey33,33); |
|
|
|
|
|
jaddistr(addresses,coinaddr); |
|
|
|
|
|
jadd(valsobj,"addresses",addresses); |
|
|
|
|
|
rawtx->I.locktime = locktime; |
|
|
|
|
|
//printf("%s locktime.%u\n",rawtx->name,locktime);
|
|
|
|
|
|
V = calloc(256,sizeof(*V)); |
|
|
|
|
|
if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
//printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr);
|
|
|
|
|
|
flag = 0; |
|
|
|
|
|
if ( (retarray= cJSON_Parse(retstr)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( is_cJSON_Array(retarray) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
n = cJSON_GetArraySize(retarray); |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
rawtx->vins = jobj(jitem(retarray,i),"vins"); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); |
|
|
|
|
|
rawtx->vins = jobj(retarray,"vins"); |
|
|
|
|
|
} |
|
|
|
|
|
free(retarray); |
|
|
|
|
|
} else printf("error parsing.(%s)\n",retstr); |
|
|
|
|
|
free(retstr); |
|
|
|
|
|
} else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); |
|
|
|
|
|
free_json(valsobj); |
|
|
|
|
|
free(V); |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) |
|
|
struct basilisk_rawtx *basilisk_swapdata_rawtx(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen,struct basilisk_rawtx *rawtx) |
|
|
{ |
|
|
{ |
|
|
if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) |
|
|
if ( rawtx->txbytes != 0 && rawtx->I.datalen <= maxlen ) |
|
@ -463,7 +612,8 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str |
|
|
{ |
|
|
{ |
|
|
decode_hex(rawtx->spendscript,hexlen,hexstr); |
|
|
decode_hex(rawtx->spendscript,hexlen,hexstr); |
|
|
rawtx->I.spendlen = hexlen; |
|
|
rawtx->I.spendlen = hexlen; |
|
|
basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment
|
|
|
if ( swap != 0 ) |
|
|
|
|
|
basilisk_txlog(swap->myinfoptr,swap,rawtx,-1); // bobdeposit, bobpayment or alicepayment
|
|
|
retval = 0; |
|
|
retval = 0; |
|
|
} |
|
|
} |
|
|
} else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); |
|
|
} else printf("%s ERROR.(%s)\n",rawtx->name,jprint(txobj,0)); |
|
@ -473,7 +623,7 @@ int32_t basilisk_rawtx_spendscript(struct basilisk_swap *swap,int32_t height,str |
|
|
return(retval); |
|
|
return(retval); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int32_t basilisk_swapuserdata(struct basilisk_swap *swap,uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) |
|
|
int32_t basilisk_swapuserdata(uint8_t *userdata,bits256 privkey,int32_t ifpath,bits256 signpriv,uint8_t *redeemscript,int32_t redeemlen) |
|
|
{ |
|
|
{ |
|
|
int32_t i,len = 0; |
|
|
int32_t i,len = 0; |
|
|
#ifdef DISABLE_CHECKSIG |
|
|
#ifdef DISABLE_CHECKSIG |
|
@ -503,7 +653,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; struct basilisk_swap *swap = ptr; |
|
|
if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) |
|
|
if ( basilisk_rawtx_spendscript(swap,swap->bobcoin->longestchain,&swap->bobdeposit,0,data,datalen,0) == 0 ) |
|
|
{ |
|
|
{ |
|
|
len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); |
|
|
len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->aliceclaim,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) |
|
|
{ |
|
|
{ |
|
|
for (i=0; i<swap->bobdeposit.I.datalen; i++) |
|
|
for (i=0; i<swap->bobdeposit.I.datalen; i++) |
|
@ -523,7 +673,7 @@ int32_t basilisk_verify_bobdeposit(struct supernet_info *myinfo,void *ptr,uint8_ |
|
|
int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t delay) |
|
|
int32_t basilisk_bobdeposit_refund(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t delay) |
|
|
{ |
|
|
{ |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; char str[65]; |
|
|
len = basilisk_swapuserdata(swap,userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); |
|
|
len = basilisk_swapuserdata(userdata,swap->I.privBn,0,swap->I.myprivs[0],swap->bobdeposit.redeemscript,swap->bobdeposit.I.redeemlen); |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobrefund,&swap->bobdeposit,swap->I.myprivs[0],0,userdata,len,0)) == 0 ) |
|
|
{ |
|
|
{ |
|
|
for (i=0; i<swap->bobrefund.I.datalen; i++) |
|
|
for (i=0; i<swap->bobrefund.I.datalen; i++) |
|
@ -546,7 +696,7 @@ int32_t basilisk_bobpayment_reclaim(struct supernet_info *myinfo,struct basilisk |
|
|
{ |
|
|
{ |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; |
|
|
uint8_t userdata[512]; int32_t i,retval,len = 0; static bits256 zero; |
|
|
printf("basilisk_bobpayment_reclaim\n"); |
|
|
printf("basilisk_bobpayment_reclaim\n"); |
|
|
len = basilisk_swapuserdata(swap,userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); |
|
|
len = basilisk_swapuserdata(userdata,zero,1,swap->I.myprivs[1],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->bobreclaim,&swap->bobpayment,swap->I.myprivs[1],0,userdata,len,1)) == 0 ) |
|
|
{ |
|
|
{ |
|
|
for (i=0; i<swap->bobreclaim.I.datalen; i++) |
|
|
for (i=0; i<swap->bobreclaim.I.datalen; i++) |
|
@ -566,8 +716,8 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * |
|
|
{ |
|
|
{ |
|
|
for (i=0; i<32; i++) |
|
|
for (i=0; i<32; i++) |
|
|
revAm.bytes[i] = swap->I.privAm.bytes[31-i]; |
|
|
revAm.bytes[i] = swap->I.privAm.bytes[31-i]; |
|
|
len = basilisk_swapuserdata(swap,userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); |
|
|
len = basilisk_swapuserdata(userdata,revAm,0,swap->I.myprivs[0],swap->bobpayment.redeemscript,swap->bobpayment.I.redeemlen); |
|
|
char str[65]; printf("bobpaid.(%s)\n",bits256_str(str,swap->I.privAm)); |
|
|
char str[65],str2[65]; printf("bobpaid.(%s) (%s)\n",bits256_str(str,swap->I.privAm),bits256_str(str2,swap->I.myprivs[0])); |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) |
|
|
if ( (retval= basilisk_rawtx_sign(myinfo,swap->bobcoin->longestchain,swap,&swap->alicespend,&swap->bobpayment,swap->I.myprivs[0],0,userdata,len,1)) == 0 ) |
|
|
{ |
|
|
{ |
|
|
for (i=0; i<swap->bobpayment.I.datalen; i++) |
|
|
for (i=0; i<swap->bobpayment.I.datalen; i++) |
|
@ -584,6 +734,12 @@ int32_t basilisk_verify_bobpaid(struct supernet_info *myinfo,void *ptr,uint8_t * |
|
|
return(-1); |
|
|
return(-1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) |
|
|
|
|
|
{ |
|
|
|
|
|
alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); |
|
|
|
|
|
basilisk_rawtx_gen("alicepayment",myinfo,swap->I.started,swap->persistent_pubkey33,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) |
|
|
int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk_swap *swap,struct basilisk_rawtx *dest) |
|
|
{ |
|
|
{ |
|
|
int32_t i,retval; |
|
|
int32_t i,retval; |
|
@ -594,13 +750,104 @@ int32_t basilisk_alicepayment_spend(struct supernet_info *myinfo,struct basilisk |
|
|
for (i=0; i<dest->I.datalen; i++) |
|
|
for (i=0; i<dest->I.datalen; i++) |
|
|
printf("%02x",dest->txbytes[i]); |
|
|
printf("%02x",dest->txbytes[i]); |
|
|
printf(" <- msigspend\n\n"); |
|
|
printf(" <- msigspend\n\n"); |
|
|
swap->I.bobspent = 1; |
|
|
if ( dest == &swap->bobspend ) |
|
|
|
|
|
swap->I.bobspent = 1; |
|
|
basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim
|
|
|
basilisk_txlog(myinfo,swap,dest,0); // bobspend or alicereclaim
|
|
|
return(retval); |
|
|
return(retval); |
|
|
} |
|
|
} |
|
|
return(-1); |
|
|
return(-1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_bobpayment_spendclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) |
|
|
|
|
|
{ |
|
|
|
|
|
bits256 revAm; uint8_t userdata[512]; int32_t i,len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; |
|
|
|
|
|
basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); |
|
|
|
|
|
dest->I.suppress_pubkeys = 1; |
|
|
|
|
|
basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); |
|
|
|
|
|
if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
memset(revAm.bytes,0,sizeof(revAm)); |
|
|
|
|
|
for (i=0; i<32; i++) |
|
|
|
|
|
revAm.bytes[i] = privAm.bytes[31-i]; |
|
|
|
|
|
len = basilisk_swapuserdata(userdata,revAm,0,myprivs0,src->redeemscript,src->I.redeemlen); |
|
|
|
|
|
if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_bobpayment_reclaimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs1,uint8_t *data,int32_t datalen,int32_t jumblrflag) |
|
|
|
|
|
{ |
|
|
|
|
|
bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; |
|
|
|
|
|
basilisk_rawtx_setparms("bobpayment",quoteid,src,bobcoin,numconfirms,0,amount,3,0,jumblrflag); |
|
|
|
|
|
dest->I.suppress_pubkeys = 1; |
|
|
|
|
|
basilisk_rawtx_gen("bobpayment",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); |
|
|
|
|
|
if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
memset(zero.bytes,0,sizeof(zero)); |
|
|
|
|
|
len = basilisk_swapuserdata(userdata,zero,1,myprivs1,src->redeemscript,src->I.redeemlen); |
|
|
|
|
|
if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs1,0,userdata,len,1)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_bobdeposit_refundclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,bits256 privBn,uint8_t *data,int32_t datalen,int32_t jumblrflag) |
|
|
|
|
|
{ |
|
|
|
|
|
uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; |
|
|
|
|
|
basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); |
|
|
|
|
|
dest->I.suppress_pubkeys = 1; |
|
|
|
|
|
basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); |
|
|
|
|
|
if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
len = basilisk_swapuserdata(userdata,privBn,0,myprivs0,src->redeemscript,src->I.redeemlen); |
|
|
|
|
|
if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,0)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_bobdeposit_claimclone(struct supernet_info *myinfo,struct iguana_info *bobcoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 myprivs0,uint8_t *data,int32_t datalen,int32_t jumblrflag) |
|
|
|
|
|
{ |
|
|
|
|
|
bits256 zero; uint8_t userdata[512]; int32_t len,numconfirms = 0,retval = -1; uint32_t sequenceid = 0xffffffff; |
|
|
|
|
|
basilisk_rawtx_setparms("bobdeposit",quoteid,src,bobcoin,numconfirms,0,amount,4,0,jumblrflag); |
|
|
|
|
|
dest->I.suppress_pubkeys = 1; |
|
|
|
|
|
basilisk_rawtx_gen("bobdeposit",myinfo,swapstarted,changepubkey33,1,1,src,src->I.locktime,src->spendscript,src->I.spendlen,bobcoin->chain->txfee,1,0); |
|
|
|
|
|
if ( basilisk_rawtx_spendscript(0,bobcoin->longestchain,src,0,data,datalen,0) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
memset(zero.bytes,0,sizeof(zero)); |
|
|
|
|
|
len = basilisk_swapuserdata(userdata,zero,1,myprivs0,src->redeemscript,src->I.redeemlen); |
|
|
|
|
|
if ( (retval= _basilisk_rawtx_sign(myinfo,bobcoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,myprivs0,0,userdata,len,1)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//basilisk_alicepayment_clone(myinfo,&dest,&src,swapstarted,changepubkey33,alicecoin,quoteid,amount,privAm,pubAm,privBn,pubBn);
|
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_alicepayment_spendclone(struct supernet_info *myinfo,struct iguana_info *alicecoin,struct basilisk_rawtx *dest,struct basilisk_rawtx *src,uint32_t swapstarted,uint8_t *changepubkey33,uint32_t quoteid,uint64_t amount,bits256 privAm,bits256 privBn,int32_t jumblrflag) |
|
|
|
|
|
{ |
|
|
|
|
|
uint8_t pubAm33[33],pubBn33[33]; bits256 pubAm,pubBn; int32_t retval,numconfirms = 0; uint32_t sequenceid = 0xffffffff; |
|
|
|
|
|
bitcoin_pubkey33(myinfo->ctx,pubAm33,privAm); |
|
|
|
|
|
memcpy(pubAm.bytes,pubAm33+1,32); |
|
|
|
|
|
bitcoin_pubkey33(myinfo->ctx,pubBn33,privBn); |
|
|
|
|
|
memcpy(pubBn.bytes,pubBn33+1,32); |
|
|
|
|
|
memset(src,0,sizeof(*src)); |
|
|
|
|
|
memset(dest,0,sizeof(*dest)); |
|
|
|
|
|
basilisk_rawtx_setparms("alicepayment",quoteid,src,alicecoin,numconfirms,0,amount,2,0,jumblrflag); |
|
|
|
|
|
src->I.spendlen = basilisk_alicescript(src->redeemscript,&src->I.redeemlen,src->spendscript,0,src->I.destaddr,alicecoin->chain->p2shtype,pubAm,pubBn); |
|
|
|
|
|
basilisk_rawtx_gen("alicepayment",myinfo,swapstarted,changepubkey33,0,1,src,src->I.locktime,src->spendscript,src->I.spendlen,alicecoin->chain->txfee,1,0); |
|
|
|
|
|
if ( (retval= _basilisk_rawtx_sign(myinfo,alicecoin->longestchain,swapstarted,src->I.locktime,sequenceid,dest,src,privAm,&privBn,0,0,1)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) |
|
|
int32_t basilisk_verify_alicepaid(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen) |
|
|
{ |
|
|
{ |
|
|
struct basilisk_swap *swap = ptr; |
|
|
struct basilisk_swap *swap = ptr; |
|
@ -630,148 +877,6 @@ int32_t basilisk_verify_pubpair(int32_t *wrongfirstbytep,struct basilisk_swap *s |
|
|
return(0); |
|
|
return(0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
cJSON *basilisk_privkeyarray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *vins) |
|
|
|
|
|
{ |
|
|
|
|
|
cJSON *privkeyarray,*item,*sobj; struct iguana_waddress *waddr; struct iguana_waccount *wacct; char coinaddr[64],account[128],wifstr[64],str[65],*hexstr; uint8_t script[1024]; int32_t i,n,len,vout; bits256 txid,privkey; |
|
|
|
|
|
privkeyarray = cJSON_CreateArray(); |
|
|
|
|
|
//printf("%s persistent.(%s) (%s) change.(%s) scriptstr.(%s)\n",coin->symbol,myinfo->myaddr.BTC,coinaddr,coin->changeaddr,scriptstr);
|
|
|
|
|
|
if ( (n= cJSON_GetArraySize(vins)) > 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
item = jitem(vins,i); |
|
|
|
|
|
txid = jbits256(item,"txid"); |
|
|
|
|
|
vout = jint(item,"vout"); |
|
|
|
|
|
if ( bits256_nonz(txid) != 0 && vout >= 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
iguana_txidcategory(myinfo,coin,account,coinaddr,txid,vout); |
|
|
|
|
|
if ( coinaddr[0] == 0 && (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 && is_hexstr(hexstr,0) > 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
len = (int32_t)strlen(hexstr) >> 1; |
|
|
|
|
|
if ( len < (sizeof(script) << 1) ) |
|
|
|
|
|
{ |
|
|
|
|
|
decode_hex(script,len,hexstr); |
|
|
|
|
|
if ( len == 25 && script[0] == 0x76 && script[1] == 0xa9 && script[2] == 0x14 ) |
|
|
|
|
|
bitcoin_address(coinaddr,coin->chain->pubtype,script+3,20); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if ( coinaddr[0] != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( (waddr= iguana_waddresssearch(myinfo,&wacct,coinaddr)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_priv2wif(wifstr,waddr->privkey,coin->chain->wiftype); |
|
|
|
|
|
jaddistr(privkeyarray,waddr->wifstr); |
|
|
|
|
|
} |
|
|
|
|
|
else if ( smartaddress(myinfo,&privkey,coinaddr) >= 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_priv2wif(wifstr,privkey,coin->chain->wiftype); |
|
|
|
|
|
jaddistr(privkeyarray,wifstr); |
|
|
|
|
|
} |
|
|
|
|
|
else printf("cant find (%s) in wallet\n",coinaddr); |
|
|
|
|
|
} else printf("cant coinaddr from (%s).v%d\n",bits256_str(str,txid),vout); |
|
|
|
|
|
} else printf("invalid txid/vout %d of %d\n",i,n); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return(privkeyarray); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_return(struct supernet_info *myinfo,int32_t height,struct basilisk_rawtx *rawtx,cJSON *item,int32_t lockinputs,struct vin_info *V) |
|
|
|
|
|
{ |
|
|
|
|
|
char *signedtx,*txbytes; cJSON *vins,*privkeyarray; int32_t i,n,retval = -1; |
|
|
|
|
|
if ( (txbytes= jstr(item,"rawtx")) != 0 && (vins= jobj(item,"vins")) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
privkeyarray = basilisk_privkeyarray(myinfo,rawtx->coin,vins); |
|
|
|
|
|
if ( (signedtx= iguana_signrawtx(myinfo,rawtx->coin,height,&rawtx->I.signedtxid,&rawtx->I.completed,vins,txbytes,privkeyarray,V)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( lockinputs != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
//printf("lockinputs\n");
|
|
|
|
|
|
iguana_RTunspentslock(myinfo,rawtx->coin,vins); |
|
|
|
|
|
if ( (n= cJSON_GetArraySize(vins)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bits256 txid; int32_t vout; |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
item = jitem(vins,i); |
|
|
|
|
|
txid = jbits256(item,"txid"); |
|
|
|
|
|
vout = jint(item,"vout"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
rawtx->I.datalen = (int32_t)strlen(signedtx) >> 1; |
|
|
|
|
|
rawtx->txbytes = calloc(1,rawtx->I.datalen); |
|
|
|
|
|
decode_hex(rawtx->txbytes,rawtx->I.datalen,signedtx); |
|
|
|
|
|
printf("%s SIGNEDTX.(%s)\n",rawtx->name,signedtx); |
|
|
|
|
|
free(signedtx); |
|
|
|
|
|
retval = 0; |
|
|
|
|
|
} else printf("error signrawtx\n"); //do a very short timeout so it finishes via local poll
|
|
|
|
|
|
free_json(privkeyarray); |
|
|
|
|
|
} |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_rawtx_gen(char *str,struct supernet_info *myinfo,struct basilisk_swap *swap,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,int32_t delay) |
|
|
|
|
|
{ |
|
|
|
|
|
char *retstr,scriptstr[1024],coinaddr[64]; uint32_t basilisktag; int32_t flag,i,n,retval = -1; cJSON *addresses,*valsobj,*retarray=0; struct vin_info *V; |
|
|
|
|
|
//bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,myinfo->persistent_pubkey33,33);
|
|
|
|
|
|
if ( rawtx->coin->changeaddr[0] == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
bitcoin_address(rawtx->coin->changeaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); |
|
|
|
|
|
printf("set change address.(%s)\n",rawtx->coin->changeaddr); |
|
|
|
|
|
} |
|
|
|
|
|
//if ( strcmp(rawtx->coin->symbol,"BTC") == 0 )
|
|
|
|
|
|
// txfee = 0;
|
|
|
|
|
|
init_hexbytes_noT(scriptstr,script,scriptlen); |
|
|
|
|
|
basilisktag = (uint32_t)rand(); |
|
|
|
|
|
valsobj = cJSON_CreateObject(); |
|
|
|
|
|
jaddstr(valsobj,"coin",rawtx->coin->symbol); |
|
|
|
|
|
jaddstr(valsobj,"spendscript",scriptstr); |
|
|
|
|
|
jaddstr(valsobj,"changeaddr",rawtx->coin->changeaddr); |
|
|
|
|
|
jadd64bits(valsobj,"satoshis",rawtx->I.amount); |
|
|
|
|
|
jadd64bits(valsobj,"txfee",txfee); |
|
|
|
|
|
jaddnum(valsobj,"minconf",minconf); |
|
|
|
|
|
jaddnum(valsobj,"locktime",locktime); |
|
|
|
|
|
jaddnum(valsobj,"timeout",30000); |
|
|
|
|
|
jaddnum(valsobj,"timestamp",swap->I.started+delay); |
|
|
|
|
|
addresses = cJSON_CreateArray(); |
|
|
|
|
|
bitcoin_address(coinaddr,rawtx->coin->chain->pubtype,swap->persistent_pubkey33,33); |
|
|
|
|
|
jaddistr(addresses,coinaddr); |
|
|
|
|
|
jadd(valsobj,"addresses",addresses); |
|
|
|
|
|
rawtx->I.locktime = locktime; |
|
|
|
|
|
//printf("%s locktime.%u\n",rawtx->name,locktime);
|
|
|
|
|
|
V = calloc(256,sizeof(*V)); |
|
|
|
|
|
if ( (retstr= basilisk_bitcoinrawtx(myinfo,rawtx->coin,"",basilisktag,jint(valsobj,"timeout"),valsobj,V)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
//printf("%s %s basilisk_bitcoinrawtx.(%s)\n",rawtx->name,str,retstr);
|
|
|
|
|
|
flag = 0; |
|
|
|
|
|
if ( (retarray= cJSON_Parse(retstr)) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( is_cJSON_Array(retarray) != 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
n = cJSON_GetArraySize(retarray); |
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
if ( (retval= basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,jitem(retarray,i),lockinputs,V)) == 0 ) |
|
|
|
|
|
{ |
|
|
|
|
|
rawtx->vins = jobj(jitem(retarray,i),"vins"); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
retval = basilisk_rawtx_return(myinfo,rawtx->coin->longestchain,rawtx,retarray,lockinputs,V); |
|
|
|
|
|
rawtx->vins = jobj(retarray,"vins"); |
|
|
|
|
|
} |
|
|
|
|
|
free(retarray); |
|
|
|
|
|
} else printf("error parsing.(%s)\n",retstr); |
|
|
|
|
|
free(retstr); |
|
|
|
|
|
} else printf("error creating %s feetx\n",iambob != 0 ? "BOB" : "ALICE"); |
|
|
|
|
|
free_json(valsobj); |
|
|
|
|
|
free(V); |
|
|
|
|
|
return(retval); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) |
|
|
int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swap *swap,int32_t depositflag,int32_t genflag) |
|
|
{ |
|
|
{ |
|
|
int32_t i,j; //char str[65];
|
|
|
int32_t i,j; //char str[65];
|
|
@ -789,7 +894,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa |
|
|
{ |
|
|
{ |
|
|
//if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 )
|
|
|
//if ( swap->bobpayment.txbytes != 0 && swap->bobpayment.I.spendlen != 0 )
|
|
|
// break;
|
|
|
// break;
|
|
|
basilisk_rawtx_gen("payment",myinfo,swap,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); |
|
|
basilisk_rawtx_gen("payment",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobpayment,swap->bobpayment.I.locktime,swap->bobpayment.spendscript,swap->bobpayment.I.spendlen,swap->bobpayment.coin->chain->txfee,1,0); |
|
|
if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) |
|
|
if ( swap->bobpayment.txbytes == 0 || swap->bobpayment.I.spendlen == 0 ) |
|
|
{ |
|
|
{ |
|
|
printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); |
|
|
printf("error bob generating %p payment.%d\n",swap->bobpayment.txbytes,swap->bobpayment.I.spendlen); |
|
@ -822,7 +927,7 @@ int32_t basilisk_bobscripts_set(struct supernet_info *myinfo,struct basilisk_swa |
|
|
{ |
|
|
{ |
|
|
//if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 )
|
|
|
//if ( swap->bobdeposit.txbytes != 0 && swap->bobdeposit.I.spendlen != 0 )
|
|
|
// break;
|
|
|
// break;
|
|
|
basilisk_rawtx_gen("deposit",myinfo,swap,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); |
|
|
basilisk_rawtx_gen("deposit",myinfo,swap->I.started,swap->persistent_pubkey33,1,1,&swap->bobdeposit,swap->bobdeposit.I.locktime,swap->bobdeposit.spendscript,swap->bobdeposit.I.spendlen,swap->bobdeposit.coin->chain->txfee,1,0); |
|
|
if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) |
|
|
if ( swap->bobdeposit.txbytes == 0 || swap->bobdeposit.I.spendlen == 0 ) |
|
|
{ |
|
|
{ |
|
|
printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); |
|
|
printf("error bob generating %p deposit.%d\n",swap->bobdeposit.txbytes,swap->bobdeposit.I.spendlen); |
|
@ -912,6 +1017,16 @@ void basilisk_swapgotdata(struct supernet_info *myinfo,struct basilisk_swap *swa |
|
|
mp->datalen = datalen; |
|
|
mp->datalen = datalen; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
FILE *basilisk_swap_save(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) |
|
|
|
|
|
{ |
|
|
|
|
|
FILE *fp; char fname[512]; |
|
|
|
|
|
sprintf(fname,"%s/SWAPS/%u-%u",GLOBAL_DBDIR,rp->requestid,rp->quoteid), OS_compatible_path(fname); |
|
|
|
|
|
if ( (fp= fopen(fname,"rb+")) == 0 ) |
|
|
|
|
|
fp = fopen(fname,"wb+"); |
|
|
|
|
|
else fseek(fp,0,SEEK_END); |
|
|
|
|
|
return(fp); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) |
|
|
int32_t basilisk_swapget(struct supernet_info *myinfo,struct basilisk_swap *swap,uint32_t msgbits,uint8_t *data,int32_t maxlen,int32_t (*basilisk_verify_func)(struct supernet_info *myinfo,void *ptr,uint8_t *data,int32_t datalen)) |
|
|
{ |
|
|
{ |
|
|
uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; |
|
|
uint8_t *ptr; bits256 srchash,desthash; uint32_t crc32,_msgbits,quoteid; int32_t i,size,offset,retval = -1; struct basilisk_swapmessage *mp = 0; |
|
@ -1090,7 +1205,7 @@ int32_t instantdex_pubkeyargs(void *ctx,struct basilisk_swap *swap,int32_t numpu |
|
|
return(n); |
|
|
return(n); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void basilisk_rawtx_setparms(char *name,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) |
|
|
void basilisk_rawtx_setparms(char *name,uint32_t quoteid,struct basilisk_rawtx *rawtx,struct iguana_info *coin,int32_t numconfirms,int32_t vintype,uint64_t satoshis,int32_t vouttype,uint8_t *pubkey33,int32_t jumblrflag) |
|
|
{ |
|
|
{ |
|
|
strcpy(rawtx->name,name); |
|
|
strcpy(rawtx->name,name); |
|
|
rawtx->coin = coin; |
|
|
rawtx->coin = coin; |
|
@ -1101,9 +1216,12 @@ void basilisk_rawtx_setparms(char *name,struct basilisk_swap *swap,struct basili |
|
|
rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit
|
|
|
rawtx->I.vouttype = vouttype; // 0 -> fee, 1 -> std, 2 -> 2of2, 3 -> bobpayment, 4 -> bobdeposit
|
|
|
if ( rawtx->I.vouttype == 0 ) |
|
|
if ( rawtx->I.vouttype == 0 ) |
|
|
{ |
|
|
{ |
|
|
if ( strcmp(coin->symbol,"BTC") == 0 && (swap->I.req.quoteid % 10) == 0 ) |
|
|
if ( jumblrflag == 0 ) |
|
|
decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); |
|
|
{ |
|
|
else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); |
|
|
if ( strcmp(coin->symbol,"BTC") == 0 && (quoteid % 10) == 0 ) |
|
|
|
|
|
decode_hex(rawtx->I.rmd160,20,TIERNOLAN_RMD160); |
|
|
|
|
|
else decode_hex(rawtx->I.rmd160,20,INSTANTDEX_RMD160); |
|
|
|
|
|
} else decode_hex(rawtx->I.rmd160,20,JUMBLR_RMD160); |
|
|
bitcoin_address(rawtx->I.destaddr,rawtx->coin->chain->pubtype,rawtx->I.rmd160,20); |
|
|
bitcoin_address(rawtx->I.destaddr,rawtx->coin->chain->pubtype,rawtx->I.rmd160,20); |
|
|
} |
|
|
} |
|
|
if ( pubkey33 != 0 ) |
|
|
if ( pubkey33 != 0 ) |
|
@ -1146,9 +1264,9 @@ int32_t bitcoin_coinptrs(bits256 pubkey,struct iguana_info **bobcoinp,struct igu |
|
|
return(0); |
|
|
return(0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey33,bits256 pubkey25519,struct basilisk_swap *swap,int32_t optionduration,uint32_t statebits) |
|
|
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) |
|
|
{ |
|
|
{ |
|
|
uint8_t *alicepub33=0,*bobpub33=0; int32_t x = -1; |
|
|
uint8_t *alicepub33=0,*bobpub33=0; int32_t jumblrflag,x = -1; |
|
|
swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; |
|
|
swap->I.putduration = swap->I.callduration = INSTANTDEX_LOCKTIME; |
|
|
if ( optionduration < 0 ) |
|
|
if ( optionduration < 0 ) |
|
|
swap->I.putduration -= optionduration; |
|
|
swap->I.putduration -= optionduration; |
|
@ -1194,41 +1312,42 @@ struct basilisk_swap *bitcoin_swapinit(void *ctx,bits256 privkey,uint8_t *pubkey |
|
|
swap->I.iambob = 1; |
|
|
swap->I.iambob = 1; |
|
|
swap->I.otherhash = swap->I.req.srchash; |
|
|
swap->I.otherhash = swap->I.req.srchash; |
|
|
} |
|
|
} |
|
|
if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) |
|
|
if ( bits256_nonz(privkey) == 0 || (x= instantdex_pubkeyargs(myinfo->ctx,swap,2 + INSTANTDEX_DECKSIZE,privkey,swap->I.orderhash,0x02+swap->I.iambob)) != 2 + INSTANTDEX_DECKSIZE ) |
|
|
{ |
|
|
{ |
|
|
char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); |
|
|
char str[65]; printf("couldnt generate privkeys %d %s\n",x,bits256_str(str,privkey)); |
|
|
return(0); |
|
|
return(0); |
|
|
} |
|
|
} |
|
|
|
|
|
jumblrflag = bits256_cmp(privkey,myinfo->persistent_priv) != 0; |
|
|
if ( swap->I.iambob != 0 ) |
|
|
if ( swap->I.iambob != 0 ) |
|
|
{ |
|
|
{ |
|
|
basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); |
|
|
basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); |
|
|
basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); |
|
|
basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); |
|
|
bobpub33 = pubkey33; |
|
|
bobpub33 = pubkey33; |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
basilisk_rawtx_setparms("otherfee",swap,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0); |
|
|
basilisk_rawtx_setparms("otherfee",swap->I.req.quoteid,&swap->otherfee,swap->bobcoin,0,0,swap->I.bobsatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); |
|
|
basilisk_rawtx_setparms("myfee",swap,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0); |
|
|
basilisk_rawtx_setparms("myfee",swap->I.req.quoteid,&swap->myfee,swap->alicecoin,0,0,swap->I.alicesatoshis/INSTANTDEX_DECKSIZE,0,0,jumblrflag); |
|
|
alicepub33 = pubkey33; |
|
|
alicepub33 = pubkey33; |
|
|
} |
|
|
} |
|
|
basilisk_rawtx_setparms("bobdeposit",swap,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0); |
|
|
basilisk_rawtx_setparms("bobdeposit",swap->I.req.quoteid,&swap->bobdeposit,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3) + swap->bobcoin->txfee,4,0,jumblrflag); |
|
|
basilisk_rawtx_setparms("bobrefund",swap,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33); |
|
|
basilisk_rawtx_setparms("bobrefund",swap->I.req.quoteid,&swap->bobrefund,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,bobpub33,jumblrflag); |
|
|
swap->bobrefund.I.suppress_pubkeys = 1; |
|
|
swap->bobrefund.I.suppress_pubkeys = 1; |
|
|
basilisk_rawtx_setparms("aliceclaim",swap,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33); |
|
|
basilisk_rawtx_setparms("aliceclaim",swap->I.req.quoteid,&swap->aliceclaim,swap->bobcoin,1,4,swap->I.bobsatoshis + (swap->I.bobsatoshis>>3),1,alicepub33,jumblrflag); |
|
|
swap->aliceclaim.I.suppress_pubkeys = 1; |
|
|
swap->aliceclaim.I.suppress_pubkeys = 1; |
|
|
swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; |
|
|
swap->aliceclaim.I.locktime = swap->I.started + swap->I.putduration+swap->I.callduration + 1; |
|
|
|
|
|
|
|
|
basilisk_rawtx_setparms("bobpayment",swap,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0); |
|
|
basilisk_rawtx_setparms("bobpayment",swap->I.req.quoteid,&swap->bobpayment,swap->bobcoin,swap->I.bobconfirms,0,swap->I.bobsatoshis + swap->bobcoin->txfee,3,0,jumblrflag); |
|
|
basilisk_rawtx_setparms("alicespend",swap,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33); |
|
|
basilisk_rawtx_setparms("alicespend",swap->I.req.quoteid,&swap->alicespend,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,alicepub33,jumblrflag); |
|
|
swap->alicespend.I.suppress_pubkeys = 1; |
|
|
swap->alicespend.I.suppress_pubkeys = 1; |
|
|
basilisk_rawtx_setparms("bobreclaim",swap,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33); |
|
|
basilisk_rawtx_setparms("bobreclaim",swap->I.req.quoteid,&swap->bobreclaim,swap->bobcoin,swap->I.bobconfirms,3,swap->I.bobsatoshis,1,bobpub33,jumblrflag); |
|
|
swap->bobreclaim.I.suppress_pubkeys = 1; |
|
|
swap->bobreclaim.I.suppress_pubkeys = 1; |
|
|
swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; |
|
|
swap->bobreclaim.I.locktime = swap->I.started + swap->I.putduration + 1; |
|
|
|
|
|
|
|
|
basilisk_rawtx_setparms("alicepayment",swap,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0); |
|
|
basilisk_rawtx_setparms("alicepayment",swap->I.req.quoteid,&swap->alicepayment,swap->alicecoin,swap->I.aliceconfirms,0,swap->I.alicesatoshis+swap->alicecoin->txfee,2,0,jumblrflag); |
|
|
basilisk_rawtx_setparms("bobspend",swap,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33); |
|
|
basilisk_rawtx_setparms("bobspend",swap->I.req.quoteid,&swap->bobspend,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,bobpub33,jumblrflag); |
|
|
swap->bobspend.I.suppress_pubkeys = 1; |
|
|
swap->bobspend.I.suppress_pubkeys = 1; |
|
|
basilisk_rawtx_setparms("alicereclaim",swap,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33); |
|
|
basilisk_rawtx_setparms("alicereclaim",swap->I.req.quoteid,&swap->alicereclaim,swap->alicecoin,swap->I.aliceconfirms,2,swap->I.alicesatoshis,1,alicepub33,jumblrflag); |
|
|
swap->alicereclaim.I.suppress_pubkeys = 1; |
|
|
swap->alicereclaim.I.suppress_pubkeys = 1; |
|
|
printf("IAMBOB.%d\n",swap->I.iambob); |
|
|
printf("IAMBOB.%d\n",swap->I.iambob); |
|
|
return(swap); |
|
|
return(swap); |
|
@ -1536,12 +1655,6 @@ void basilisk_sendmostprivs(struct supernet_info *myinfo,struct basilisk_swap *s |
|
|
swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); |
|
|
swap->I.statebits |= basilisk_swapsend(myinfo,swap,0x20,data,datalen,0x10,swap->I.crcs_myprivs); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void basilisk_alicepayment(struct supernet_info *myinfo,struct basilisk_swap *swap,struct iguana_info *coin,struct basilisk_rawtx *alicepayment,bits256 pubAm,bits256 pubBn) |
|
|
|
|
|
{ |
|
|
|
|
|
alicepayment->I.spendlen = basilisk_alicescript(alicepayment->redeemscript,&alicepayment->I.redeemlen,alicepayment->spendscript,0,alicepayment->I.destaddr,coin->chain->p2shtype,pubAm,pubBn); |
|
|
|
|
|
basilisk_rawtx_gen("alicepayment",myinfo,swap,0,1,alicepayment,alicepayment->I.locktime,alicepayment->spendscript,alicepayment->I.spendlen,coin->chain->txfee,1,0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) |
|
|
int32_t basilisk_swapiteration(struct supernet_info *myinfo,struct basilisk_swap *swap,uint8_t *data,int32_t maxlen) |
|
|
{ |
|
|
{ |
|
|
int32_t j,datalen,retval = 0; |
|
|
int32_t j,datalen,retval = 0; |
|
@ -1961,7 +2074,7 @@ void basilisk_swaploop(void *_swap) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
printf("generate fee\n"); |
|
|
printf("generate fee\n"); |
|
|
if ( basilisk_rawtx_gen("myfee",myinfo,swap,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) |
|
|
if ( basilisk_rawtx_gen("myfee",myinfo,swap->I.started,swap->persistent_pubkey33,swap->I.iambob,1,&swap->myfee,0,swap->myfee.spendscript,swap->myfee.I.spendlen,swap->myfee.coin->chain->txfee,1,0) == 0 ) |
|
|
{ |
|
|
{ |
|
|
printf("done generate fee\n"); |
|
|
printf("done generate fee\n"); |
|
|
swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); |
|
|
swap->I.statebits |= basilisk_swapdata_rawtxsend(myinfo,swap,0x80,data,maxlen,&swap->myfee,0x40); |
|
@ -2019,7 +2132,7 @@ void basilisk_swaploop(void *_swap) |
|
|
free(data); |
|
|
free(data); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration) |
|
|
struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 privkey,struct basilisk_request *rp,uint32_t statebits,int32_t optionduration,int32_t reinit) |
|
|
{ |
|
|
{ |
|
|
int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; |
|
|
int32_t i,m,n; char *retstr; uint8_t pubkey33[33]; bits256 pubkey25519; uint32_t channel,starttime; cJSON *retarray,*item,*msgobj,*retjson; struct basilisk_swap *swap = 0; |
|
|
// statebits 1 -> client, 0 -> LP
|
|
|
// statebits 1 -> client, 0 -> LP
|
|
@ -2044,7 +2157,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 |
|
|
swap->persistent_privkey = privkey; |
|
|
swap->persistent_privkey = privkey; |
|
|
memcpy(swap->persistent_pubkey33,pubkey33,33); |
|
|
memcpy(swap->persistent_pubkey33,pubkey33,33); |
|
|
m = n = 0; |
|
|
m = n = 0; |
|
|
if ( bitcoin_swapinit(myinfo->ctx,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) |
|
|
if ( bitcoin_swapinit(myinfo,privkey,pubkey33,pubkey25519,swap,optionduration,statebits) != 0 ) |
|
|
{ |
|
|
{ |
|
|
if ( statebits == 0 ) |
|
|
if ( statebits == 0 ) |
|
|
{ |
|
|
{ |
|
@ -2094,6 +2207,7 @@ struct basilisk_swap *basilisk_thread_start(struct supernet_info *myinfo,bits256 |
|
|
//for (i=0; i<sizeof(swap->I.req); i++)
|
|
|
//for (i=0; i<sizeof(swap->I.req); i++)
|
|
|
// fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]);
|
|
|
// fprintf(stderr,"%02x",((uint8_t *)&swap->I.req)[i]);
|
|
|
fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); |
|
|
fprintf(stderr," M.%d N.%d launch.%d %d %p\n",m,n,myinfo->numswaps,(int32_t)(sizeof(myinfo->swaps)/sizeof(*myinfo->swaps)),&swap->I.req); |
|
|
|
|
|
swap->fp = basilisk_swap_save(myinfo,privkey,rp,statebits,optionduration,reinit); |
|
|
if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) |
|
|
if ( OS_thread_create(malloc(sizeof(pthread_t)),NULL,(void *)basilisk_swaploop,(void *)swap) != 0 ) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|