Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
522e040635
  1. 1
      iguana/exchanges/nxtae.c
  2. 2
      iguana/exchanges777.h
  3. 6
      iguana/iguana777.h
  4. 50
      iguana/iguana_instantdex.c
  5. 135
      iguana/iguana_ramchain.c
  6. 21
      iguana/main.c
  7. 73
      iguana/swaps/iguana_BTCswap.c
  8. 2
      includes/iguana_apideclares.h

1
iguana/exchanges/nxtae.c

@ -725,6 +725,7 @@ uint64_t submit_triggered_nxtae(struct supernet_info *myinfo,int32_t dotrade,cha
} }
if ( (jsonstr= issue_NXTPOST(cmd)) != 0 ) if ( (jsonstr= issue_NXTPOST(cmd)) != 0 )
{ {
printf("NXT.(%s) -> (%s)\n",cmd,jsonstr);
_stripwhite(jsonstr,' '); _stripwhite(jsonstr,' ');
if ( (json= cJSON_Parse(jsonstr)) != 0 ) if ( (json= cJSON_Parse(jsonstr)) != 0 )
{ {

2
iguana/exchanges777.h

@ -137,7 +137,7 @@ struct bitcoin_swapinfo
uint64_t altsatoshis,BTCsatoshis,insurance,altpremium,matched64; uint64_t altsatoshis,BTCsatoshis,insurance,altpremium,matched64;
int32_t isinitiator,choosei,otherchoosei,cutverified,otherverifiedcut; int32_t isinitiator,choosei,otherchoosei,cutverified,otherverifiedcut;
struct bitcoin_statetx *deposit,*payment,*altpayment,*myfee,*otherfee; struct bitcoin_statetx *deposit,*payment,*altpayment,*myfee,*otherfee;
char expectedcmdstr[16],status[16]; char expectedcmdstr[16],status[16],waitfortx[16];
struct instantdex_stateinfo *state; uint32_t expiration,dead,reftime; struct instantdex_stateinfo *state; uint32_t expiration,dead,reftime;
}; };

6
iguana/iguana777.h

@ -367,7 +367,8 @@ struct iguana_ramchain
uint32_t numblocks:31,expanded:1,pkind,externalind,height; uint32_t numblocks:31,expanded:1,pkind,externalind,height;
struct iguana_kvitem *txids,*pkhashes; struct iguana_kvitem *txids,*pkhashes;
struct OS_memspace *hashmem; long filesize; void *fileptr; struct OS_memspace *hashmem; long filesize; void *fileptr;
struct iguana_account *A,*roA; //struct iguana_Uextra *U2,*roU2; struct iguana_pkextra *P2,*roP2; struct iguana_account *A,*roA; struct iguana_Uextra *spents;
//struct iguana_Uextra *U2,*roU2; struct iguana_pkextra *P2,*roP2;
}; };
struct iguana_peer struct iguana_peer
@ -685,7 +686,6 @@ struct iguana_txid *iguana_bundletx(struct iguana_info *coin,struct iguana_bundl
int32_t iguana_txidreq(struct iguana_info *coin,char **retstrp,bits256 txid); int32_t iguana_txidreq(struct iguana_info *coin,char **retstrp,bits256 txid);
void iguana_bundleiclear(struct iguana_info *coin,struct iguana_bundle *bp,int32_t bundlei); void iguana_bundleiclear(struct iguana_info *coin,struct iguana_bundle *bp,int32_t bundlei);
int32_t hcalc_bitsize(uint64_t x); int32_t hcalc_bitsize(uint64_t x);
struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_pkhash *p,uint8_t rmd160[20]);
struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid); struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid);
int32_t iguana_scriptgen(struct iguana_info *coin,int32_t *Mp,int32_t *nump,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,const struct vin_info *vp,int32_t txi); int32_t iguana_scriptgen(struct iguana_info *coin,int32_t *Mp,int32_t *nump,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,const struct vin_info *vp,int32_t txi);
int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s); int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s);
@ -763,6 +763,8 @@ char *issue_startForging(struct supernet_info *myinfo,char *secret);
struct bitcoin_unspent *iguana_unspentsget(struct supernet_info *myinfo,struct iguana_info *coin,char **retstrp,double *balancep,int32_t *numunspentsp,double minconfirms,char *account); struct bitcoin_unspent *iguana_unspentsget(struct supernet_info *myinfo,struct iguana_info *coin,char **retstrp,double *balancep,int32_t *numunspentsp,double minconfirms,char *account);
void iguana_chainparms(struct iguana_chain *chain,cJSON *argjson); void iguana_chainparms(struct iguana_chain *chain,cJSON *argjson);
void iguana_addinputs(struct iguana_info *coin,struct bitcoin_spend *spend,cJSON *txobj,uint32_t sequence); void iguana_addinputs(struct iguana_info *coin,struct bitcoin_spend *spend,cJSON *txobj,uint32_t sequence);
int32_t iguana_pkhasharray(struct iguana_info *coin,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20]);
long iguana_spentsfile(struct iguana_info *coin,int32_t n);
extern queue_t bundlesQ; extern queue_t bundlesQ;

50
iguana/iguana_instantdex.c

@ -1197,36 +1197,56 @@ TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,minaccept,base,rel,minprice,basevolume)
} else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}")); } else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
} }
THREE_STRINGS_AND_DOUBLE(atomic,offer,base,rel,orderid,basevolume) char *instantdex_statemachineget(struct supernet_info *myinfo,struct bitcoin_swapinfo **swapp,cJSON *argjson,char *remoteaddr)
{ {
if ( remoteaddr == 0 ) struct bitcoin_swapinfo *swap; uint64_t orderid,otherorderid; struct exchange_info *exchange;
*swapp = 0;
if ( remoteaddr == 0 && (exchange= exchanges777_find("bitcoin")) != 0 )
{ {
return(clonestr("{\"result\":\"atomic API request is not yet\"}")); orderid = j64bits(argjson,"myorderid");
} else return(clonestr("{\"error\":\"atomic API request only local usage!\"}")); otherorderid = j64bits(argjson,"otherid");
} if ( (swap= instantdex_statemachinefind(myinfo,exchange,orderid,1)) != 0 )
TWO_STRINGS(atomic,accept,myorderid,otherid)
{ {
if ( remoteaddr == 0 ) if ( swap->other.orderid != otherorderid )
return(clonestr("{\"error\":\"statemachine otherid mismatch\"}"));
else
{ {
return(clonestr("{\"result\":\"atomic API request is not yet\"}")); *swapp = swap;
return(0);
}
} else return(clonestr("{\"error\":\"statemachine not found\"}"));
} else return(clonestr("{\"error\":\"atomic API request only local usage!\"}")); } else return(clonestr("{\"error\":\"atomic API request only local usage!\"}"));
} }
THREE_STRINGS(atomic,approve,myorderid,otherid,txname) THREE_STRINGS(atomic,approve,myorderid,otherid,txname)
{ {
if ( remoteaddr == 0 ) char *retstr,virtualevent[16]; cJSON *newjson; struct bitcoin_statetx *tx; struct bitcoin_swapinfo *swap = 0;
if ( (retstr= instantdex_statemachineget(myinfo,&swap,json,remoteaddr)) != 0 )
return(retstr);
else if ( (tx= instantdex_getstatetx(swap,txname)) == 0 )
return(clonestr("{\"error\":\"cant find txname\"}"));
else
{ {
return(clonestr("{\"result\":\"atomic API request is not yet\"}")); strcpy(virtualevent,txname);
} else return(clonestr("{\"error\":\"atomic API request only local usage!\"}")); strcat(virtualevent,"found");
newjson = cJSON_CreateObject();
if ( (retstr= instantdex_sendcmd(myinfo,&swap->mine.offer,newjson,virtualevent,myinfo->myaddr.persistent,0,0,0)) != 0 )
return(retstr);
else return(clonestr("{\"result\":\"statemachine sent found event\"}"));
}
} }
THREE_STRINGS(atomic,claim,myorderid,otherid,txname) THREE_STRINGS(atomic,claim,myorderid,otherid,txname)
{ {
if ( remoteaddr == 0 ) char *retstr; struct bitcoin_statetx *tx; struct bitcoin_swapinfo *swap = 0;
if ( (retstr= instantdex_statemachineget(myinfo,&swap,json,remoteaddr)) != 0 )
return(retstr);
else if ( (tx= instantdex_getstatetx(swap,txname)) == 0 )
return(clonestr("{\"error\":\"cant find txname\"}"));
else
{ {
return(clonestr("{\"result\":\"atomic API request is not yet\"}")); return(clonestr("{\"result\":\"statemachine should claim tx\"}"));
} else return(clonestr("{\"error\":\"atomic API request only local usage!\"}")); }
} }
#include "../includes/iguana_apiundefs.h" #include "../includes/iguana_apiundefs.h"

135
iguana/iguana_ramchain.c

@ -225,18 +225,25 @@ struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,st
return(0); return(0);
} }
struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_pkhash *p,uint8_t rmd160[20]) struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_ramchain **ramchainp,uint64_t *balancep,uint32_t *lastunspentindp,struct iguana_pkhash *p,uint8_t rmd160[20],int32_t firsti,int32_t endi)
{ {
uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_account *ACCTS;
for (i=0; i<coin->bundlescount; i++) *balancep = 0;
*ramchainp = 0;
*lastunspentindp = 0;
for (i=firsti; i<coin->bundlescount&&i<=endi; i++)
{ {
if ( (bp= coin->bundles[i]) != 0 ) if ( (bp= coin->bundles[i]) != 0 )
{ {
ramchain = &bp->ramchain; ramchain = &bp->ramchain;
PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset);
P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset);
if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 ) ACCTS = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Aoffset);
if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < ramchain->H.data->numpkinds )
{ {
*ramchainp = ramchain;
*balancep = ACCTS[pkind].balance;
*lastunspentindp = ACCTS[pkind].lastunspentind;
*p = P[pkind]; *p = P[pkind];
return(p); return(p);
} }
@ -245,6 +252,99 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_p
return(0); return(0);
} }
int32_t iguana_spentsinit(struct iguana_info *coin,struct iguana_Uextra *spents,struct iguana_bundle *bp,struct iguana_ramchain *ramchain)
{
//struct iguana_spend { uint32_t spendtxidind; int16_t prevout; uint16_t tbd:14,external:1,diffsequence:1; } __attribute__((packed));
//struct iguana_unspent { uint64_t value; uint32_t txidind,pkind,prevunspentind; uint16_t hdrsi:12,type:4,vout; } __attribute__((packed));
int32_t i,n,max; struct iguana_spend *S;
S = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Soffset);
max = ramchain->H.unspentind;
n = ramchain->H.spendind;
for (i=0; i<n; i++)
{
}
return(0);
}
long iguana_spentsfile(struct iguana_info *coin,int32_t n)
{
int32_t i,iter,allocated = 0; long filesize,total,count; struct iguana_Uextra *spents = 0; struct iguana_ramchain *ramchain; char fname[1024]; struct iguana_bundle *bp;
for (total=iter=0; iter<2; iter++)
{
for (count=i=0; i<n; i++)
{
if ( (bp= coin->bundles[i]) != 0 )
{
ramchain = &bp->ramchain;
if ( iter == 1 )
{
ramchain->spents = &spents[count];
if ( allocated != 0 && iguana_spentsinit(coin,spents,bp,ramchain) < 0 )
{
printf("error initializing spents bp.%d\n",i);
exit(-1);
}
}
count += ramchain->H.unspentind;
} else return(-1);
}
sprintf(fname,"DB/%s/spents_%d.%ld",coin->symbol,n,count);
printf("%s total unspents.%ld\n",fname,count);
if ( iter == 0 )
{
total = count;
if ( (spents= OS_filestr(&filesize,fname)) == 0 )
spents = calloc(total,sizeof(*spents)), allocated = 1;
}
else if ( total != count )
printf("%s total.%ld != count.%ld\n",fname,total,count);
}
return(total);
}
int64_t iguana_pkhashbalance(struct iguana_info *coin,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,uint32_t lastunspentind)
{
struct iguana_unspent *U; struct iguana_txid *T; uint64_t unspentind; int64_t balance = 0;
*nump = 0;
unspentind = lastunspentind;
U = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Uoffset);
T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset);
while ( unspentind > 0 )
{
(*nump)++;
balance += U[unspentind].value;
if ( unspentind == p->firstunspentind )
break;
unspentind = U[unspentind].prevunspentind;
}
return(balance);
}
int32_t iguana_pkhasharray(struct iguana_info *coin,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20])
{
int32_t i,n,m; uint64_t balance,checkbalance,total; uint32_t lastunspentind; struct iguana_ramchain *ramchain;
for (total=i=n=0; i<max && i<coin->bundlescount; i++)
{
if ( iguana_pkhashfind(coin,&ramchain,&balance,&lastunspentind,&P[n],rmd160,i,i) != 0 )
{
if ( (checkbalance= iguana_pkhashbalance(coin,&m,ramchain,&P[n],lastunspentind)) != balance )
{
printf("pkhash balance mismatch from m.%d check %.8f vs %.8f\n",m,dstr(checkbalance),dstr(balance));
}
else
{
P[n].firstunspentind = lastunspentind;
P[n].flags = m;
total += balance;
n++;
}
}
}
*totalp = total;
return(n);
}
int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks) int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks)
{ {
struct iguana_bundle *bp = 0; int32_t bundlei = -2; char str[65]; struct iguana_bundle *bp = 0; int32_t bundlei = -2; char str[65];
@ -509,7 +609,7 @@ int32_t iguana_ramchain_txid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 *txi
return(-2); return(-2);
} }
uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 prev_hash,int32_t prev_vout,uint32_t sequence)//,int32_t hdrsi,int32_t bundlei) uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 prev_hash,int32_t prev_vout,uint32_t sequence,int32_t hdrsi)
{ {
struct iguana_spend *s; struct iguana_kvitem *ptr; bits256 txid; struct iguana_spend *s; struct iguana_kvitem *ptr; bits256 txid;
uint32_t spendind,unspentind,txidind,pkind,external; uint64_t value = 0; uint32_t spendind,unspentind,txidind,pkind,external; uint64_t value = 0;
@ -582,8 +682,11 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
} }
/*if ( unspentind != 0 ) /*if ( unspentind != 0 )
{ {
if ( U2[unspentind].spendind == 0 ) if ( coin->U2[hdris][unspentind].spendind == 0 )
U2[unspentind].spendind = spendind; {
coin->U2[hdris][unspentind].spendind = spendind;
coin->U2[hdris][unspentind].hdris = hdrsi;
}
}*/ }*/
return(spendind); return(spendind);
} }
@ -1292,7 +1395,7 @@ int32_t iguana_ramchain_cmp(struct iguana_ramchain *A,struct iguana_ramchain *B,
return(-1); return(-1);
} }
int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain *dest,struct iguana_ramchain *ramchain) int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain *dest,struct iguana_ramchain *ramchain,int32_t bundle_hdrsi)
{ {
RAMCHAIN_DECLARE; RAMCHAIN_DESTDECLARE; RAMCHAIN_DECLARE; RAMCHAIN_DESTDECLARE;
int32_t j,hdrsi,prevout; uint32_t sequence,destspendind=0,desttxidind=0; int32_t j,hdrsi,prevout; uint32_t sequence,destspendind=0,desttxidind=0;
@ -1388,7 +1491,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
prevout = iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]); prevout = iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]);
//bundlei = Sx[ramchain->H.spendind].bundlei; //bundlei = Sx[ramchain->H.spendind].bundlei;
//hdrsi = Sx[ramchain->H.spendind].hdrsi; //hdrsi = Sx[ramchain->H.spendind].hdrsi;
if ( iguana_ramchain_addspend(coin,RAMCHAIN_ARG,prevhash,prevout,sequence) == 0 ) if ( iguana_ramchain_addspend(coin,RAMCHAIN_ARG,prevhash,prevout,sequence,bundle_hdrsi) == 0 )
{ {
char str[65]; int32_t i; char str[65]; int32_t i;
printf("txidind.%d spendind.%d spendtxid.%x %d vin.%d %s vout.%d\n",ramchain->H.txidind,ramchain->H.spendind,Sx[ramchain->H.spendind].spendtxidind,Sx[ramchain->H.spendind].spendtxidind&0xfffffff,j,bits256_str(str,prevhash),prevout); printf("txidind.%d spendind.%d spendtxid.%x %d vin.%d %s vout.%d\n",ramchain->H.txidind,ramchain->H.spendind,Sx[ramchain->H.spendind].spendtxidind,Sx[ramchain->H.spendind].spendtxidind&0xfffffff,j,bits256_str(str,prevhash),prevout);
@ -1412,7 +1515,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
} }
if ( dest != 0 ) if ( dest != 0 )
{ {
if ( iguana_ramchain_addspend(coin,RAMCHAIN_DESTARG,prevhash,prevout,sequence) == 0 ) if ( iguana_ramchain_addspend(coin,RAMCHAIN_DESTARG,prevhash,prevout,sequence,bundle_hdrsi) == 0 )
return(-9); return(-9);
} }
} }
@ -1528,7 +1631,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
else else
{ {
iguana_ramchain_extras(&R,0); iguana_ramchain_extras(&R,0);
if ( (err= iguana_ramchain_iterate(coin,0,&R)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,0,&R,bp->hdrsi)) != 0 )
printf("err.%d iterate ",err); printf("err.%d iterate ",err);
//printf("SUCCESS REMAP\n"); //printf("SUCCESS REMAP\n");
bp->numtxids += ramchain->H.data->numtxids; bp->numtxids += ramchain->H.data->numtxids;
@ -1666,7 +1769,7 @@ int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,stru
memcpy(ramchain->roA,ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); memcpy(ramchain->roA,ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds);
memset(ramchain->A,0,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); memset(ramchain->A,0,sizeof(*ramchain->A) * ramchain->H.data->numpkinds);
//printf("presave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d\n",ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti); //printf("presave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d\n",ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti);
if ( (err= iguana_ramchain_iterate(coin,0,ramchain)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,0,ramchain,bp->hdrsi)) != 0 )
printf("ERROR.%d iterating presave ramchain hdrsi.%d\n",err,hdrsi); printf("ERROR.%d iterating presave ramchain hdrsi.%d\n",err,hdrsi);
else if ( (err= iguana_ramchain_verify(coin,ramchain)) != 0 ) else if ( (err= iguana_ramchain_verify(coin,ramchain)) != 0 )
printf("ERROR.%d verifying presave ramchain hdrsi.%d\n",err,hdrsi); printf("ERROR.%d verifying presave ramchain hdrsi.%d\n",err,hdrsi);
@ -1687,7 +1790,7 @@ int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,stru
iguana_ramchain_link(mapchain,firsthash2,lasthash2,hdrsi,height,0,numblocks,firsti,1); iguana_ramchain_link(mapchain,firsthash2,lasthash2,hdrsi,height,0,numblocks,firsti,1);
iguana_ramchain_extras(mapchain,hashmem); iguana_ramchain_extras(mapchain,hashmem);
//printf("MAP T.%d U.%d S.%d P.%d X.%d -> size.%ld Xoffset.%d\n",mapchain->H.data->numtxids,mapchain->H.data->numunspents,mapchain->H.data->numspends,mapchain->H.data->numpkinds,mapchain->H.data->numexternaltxids,(long)mapchain->H.data->allocsize,(int32_t)mapchain->H.data->Xoffset); //printf("MAP T.%d U.%d S.%d P.%d X.%d -> size.%ld Xoffset.%d\n",mapchain->H.data->numtxids,mapchain->H.data->numunspents,mapchain->H.data->numspends,mapchain->H.data->numpkinds,mapchain->H.data->numexternaltxids,(long)mapchain->H.data->allocsize,(int32_t)mapchain->H.data->Xoffset);
if ( (err= iguana_ramchain_iterate(coin,0,mapchain)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,0,mapchain,bp->hdrsi)) != 0 )
printf("err.%d iterate mapped dest\n",err); printf("err.%d iterate mapped dest\n",err);
else if ( cmpflag != 0 ) else if ( cmpflag != 0 )
{ {
@ -1872,7 +1975,7 @@ int32_t iguana_bundlesaveHT(struct iguana_info *coin,struct OS_memspace *mem,str
coin->blocks.RO[bp->bundleheight+bundlei] = block->RO; coin->blocks.RO[bp->bundleheight+bundlei] = block->RO;
destB[bundlei] = block->RO; destB[bundlei] = block->RO;
//printf("(%d %d) ",R[bundlei].H.data->numtxids,dest->H.txidind); //printf("(%d %d) ",R[bundlei].H.data->numtxids,dest->H.txidind);
if ( (err= iguana_ramchain_iterate(coin,dest,&R[bundlei])) != 0 ) if ( (err= iguana_ramchain_iterate(coin,dest,&R[bundlei],bp->hdrsi)) != 0 )
{ {
printf("error ramchain_iterate hdrs.%d bundlei.%d\n",bp->hdrsi,bundlei); printf("error ramchain_iterate hdrs.%d bundlei.%d\n",bp->hdrsi,bundlei);
break; break;
@ -1970,9 +2073,9 @@ int32_t iguana_bundlemergeHT(struct iguana_info *coin,struct OS_memspace *mem,st
iguana_ramchain_extras(dest,&HASHMEM); iguana_ramchain_extras(dest,&HASHMEM);
dest->H.txidind = dest->H.unspentind = dest->H.spendind = dest->pkind = dest->H.data->firsti; dest->H.txidind = dest->H.unspentind = dest->H.spendind = dest->pkind = dest->H.data->firsti;
dest->externalind = 0; dest->externalind = 0;
if ( (err= iguana_ramchain_iterate(coin,dest,A)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,dest,A,bp->hdrsi)) != 0 )
printf("error.%d ramchain_iterate A.%d\n",err,A->height); printf("error.%d ramchain_iterate A.%d\n",err,A->height);
else if ( (err= iguana_ramchain_iterate(coin,dest,B)) != 0 ) else if ( (err= iguana_ramchain_iterate(coin,dest,B,nextbp->hdrsi)) != 0 )
printf("error.%d ramchain_iterate B.%d\n",err,B->height); printf("error.%d ramchain_iterate B.%d\n",err,B->height);
else if ( iguana_ramchain_expandedsave(coin,RAMCHAIN_DESTARG,&newchain,&HASHMEM,0,0) == 0 ) else if ( iguana_ramchain_expandedsave(coin,RAMCHAIN_DESTARG,&newchain,&HASHMEM,0,0) == 0 )
{ {

21
iguana/main.c

@ -1136,6 +1136,27 @@ void iguana_main(void *arg)
} }
if ( arg != 0 ) if ( arg != 0 )
SuperNET_JSON(&MYINFO,cJSON_Parse(arg),0); SuperNET_JSON(&MYINFO,cJSON_Parse(arg),0);
{
int32_t i,n; int64_t total; char *coinaddr; struct iguana_pkhash *P; struct iguana_info *coin; uint8_t rmd160[20],addrtype;
coin = iguana_coinfind("BTCD");
if ( 0 && coin != 0 )
{
for (i=0; i<coin->bundlescount; i++)
if ( coin->bundles[i] == 0 )
break;
if ( i > 0 )
iguana_spentsfile(coin,i);
getchar();
coinaddr = "RUZ9AKxy6J2okcBd1PZm4YH6atmPwqV4bo";
bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr);
P = calloc(coin->bundlescount,sizeof(*P));
n = iguana_pkhasharray(coin,&total,P,coin->bundlescount,rmd160);
printf("%s has total outputs %.8f from %d bundles\n",coinaddr,dstr(total),n);
n = iguana_pkhasharray(coin,&total,P,coin->bundlescount,rmd160);
printf("%s has total outputs %.8f from %d bundles\n",coinaddr,dstr(total),n);
getchar();
}
}
mainloop(&MYINFO); mainloop(&MYINFO);
} }

73
iguana/swaps/iguana_BTCswap.c

@ -317,6 +317,7 @@ cJSON *BOB_reclaimfunc(struct supernet_info *myinfo,struct exchange_info *exchan
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
if ( swap->deposit != 0 ) if ( swap->deposit != 0 )
printf("reclaim deposit.(%s) to %s\n",swap->deposit->txbytes,myinfo->myaddr.BTC); printf("reclaim deposit.(%s) to %s\n",swap->deposit->txbytes,myinfo->myaddr.BTC);
strcpy(swap->waitfortx,"bre");
// reclaim deposit // reclaim deposit
return(newjson); return(newjson);
} }
@ -326,6 +327,7 @@ cJSON *BOB_feereclaimfunc(struct supernet_info *myinfo,struct exchange_info *exc
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
if ( swap->myfee != 0 ) if ( swap->myfee != 0 )
printf("reclaim fee.(%s)\n",swap->myfee->txbytes); printf("reclaim fee.(%s)\n",swap->myfee->txbytes);
strcpy(swap->waitfortx,"bfr");
// reclaim deposit // reclaim deposit
return(newjson); return(newjson);
} }
@ -335,6 +337,7 @@ cJSON *BOB_claimaltfunc(struct supernet_info *myinfo,struct exchange_info *excha
*serdatap = 0, *serdatalenp = 0; char altcoinaddr[64]; *serdatap = 0, *serdatalenp = 0; char altcoinaddr[64];
if ( swap->altpayment != 0 ) if ( swap->altpayment != 0 )
printf("spend altpayment.(%s) -> %s\n",swap->altpayment->txbytes,altcoinaddr); printf("spend altpayment.(%s) -> %s\n",swap->altpayment->txbytes,altcoinaddr);
strcpy(swap->waitfortx,"bcl");
// spend altpayment // spend altpayment
return(newjson); return(newjson);
} }
@ -345,6 +348,7 @@ cJSON *ALICE_reclaimfunc(struct supernet_info *myinfo,struct exchange_info *exch
// reclaim altpayment // reclaim altpayment
if ( swap->altpayment != 0 ) if ( swap->altpayment != 0 )
printf("reclaim altpayment.(%s) -> %s\n",swap->altpayment->txbytes,altcoinaddr); printf("reclaim altpayment.(%s) -> %s\n",swap->altpayment->txbytes,altcoinaddr);
strcpy(swap->waitfortx,"are");
return(newjson); return(newjson);
} }
@ -354,6 +358,7 @@ cJSON *ALICE_feereclaimfunc(struct supernet_info *myinfo,struct exchange_info *e
// reclaim fee // reclaim fee
if ( swap->myfee != 0 ) if ( swap->myfee != 0 )
printf("reclaim fee.(%s)\n",swap->myfee->txbytes); printf("reclaim fee.(%s)\n",swap->myfee->txbytes);
strcpy(swap->waitfortx,"afr");
return(newjson); return(newjson);
} }
@ -362,6 +367,7 @@ cJSON *ALICE_claimdepositfunc(struct supernet_info *myinfo,struct exchange_info
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
if ( swap->deposit != 0 ) if ( swap->deposit != 0 )
printf("reclaim deposit.(%s)\n",swap->deposit->txbytes); printf("reclaim deposit.(%s)\n",swap->deposit->txbytes);
strcpy(swap->waitfortx,"adp");
// reclaim deposit // reclaim deposit
return(newjson); return(newjson);
} }
@ -371,6 +377,7 @@ cJSON *ALICE_claimbtcfunc(struct supernet_info *myinfo,struct exchange_info *exc
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
if ( swap->payment != 0 ) if ( swap->payment != 0 )
printf("spend BTC payment.(%s) -> %s\n",swap->payment->txbytes,myinfo->myaddr.BTC); printf("spend BTC payment.(%s) -> %s\n",swap->payment->txbytes,myinfo->myaddr.BTC);
strcpy(swap->waitfortx,"acl");
// spend BTC // spend BTC
return(newjson); return(newjson);
} }
@ -637,6 +644,7 @@ cJSON *BOB_waitfeefunc(struct supernet_info *myinfo,struct exchange_info *exchan
char *retstr; struct iguana_info *coinbtc; char *retstr; struct iguana_info *coinbtc;
coinbtc = iguana_coinfind("BTC"); coinbtc = iguana_coinfind("BTC");
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
strcpy(swap->waitfortx,"fee");
if ( coinbtc != 0 && swap->otherfee != 0 )//swap->deposit == 0 && (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->otherfee->txid,&swap->otherfee->numconfirms,"feefound",0)) != 0 ) if ( coinbtc != 0 && swap->otherfee != 0 )//swap->deposit == 0 && (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->otherfee->txid,&swap->otherfee->numconfirms,"feefound",0)) != 0 )
{ {
retstr = swap->otherfee->txbytes; retstr = swap->otherfee->txbytes;
@ -669,6 +677,7 @@ cJSON *BOB_waitaltconfirmfunc(struct supernet_info *myinfo,struct exchange_info
char *retstr; struct iguana_info *altcoin; //uint32_t reftime; char *retstr; struct iguana_info *altcoin; //uint32_t reftime;
altcoin = iguana_coinfind(swap->mine.offer.base); altcoin = iguana_coinfind(swap->mine.offer.base);
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
strcpy(swap->waitfortx,"alt");
//reftime = (uint32_t)(ap->offer.expiration - INSTANTDEX_LOCKTIME*2); //reftime = (uint32_t)(ap->offer.expiration - INSTANTDEX_LOCKTIME*2);
if ( altcoin != 0 && swap->altpayment != 0 && (retstr= BTC_txconfirmed(myinfo,altcoin,swap,newjson,swap->altpayment->txid,&swap->altpayment->numconfirms,"altfound",altcoin->chain->minconfirms)) != 0 ) if ( altcoin != 0 && swap->altpayment != 0 && (retstr= BTC_txconfirmed(myinfo,altcoin,swap,newjson,swap->altpayment->txid,&swap->altpayment->numconfirms,"altfound",altcoin->chain->minconfirms)) != 0 )
{ {
@ -703,6 +712,7 @@ cJSON *ALICE_waitfeefunc(struct supernet_info *myinfo,struct exchange_info *exch
char *retstr; struct iguana_info *coinbtc; char *retstr; struct iguana_info *coinbtc;
coinbtc = iguana_coinfind("BTC"); coinbtc = iguana_coinfind("BTC");
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
strcpy(swap->waitfortx,"fee");
if ( coinbtc != 0 && swap->otherfee != 0 )//&& (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->otherfee->txid,&swap->otherfee->numconfirms,"feefound",0)) != 0 ) if ( coinbtc != 0 && swap->otherfee != 0 )//&& (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->otherfee->txid,&swap->otherfee->numconfirms,"feefound",0)) != 0 )
{ {
retstr = swap->otherfee->txbytes; retstr = swap->otherfee->txbytes;
@ -716,6 +726,7 @@ cJSON *ALICE_waitdepositfunc(struct supernet_info *myinfo,struct exchange_info *
char *retstr; struct iguana_info *coinbtc,*altcoin; char *retstr; struct iguana_info *coinbtc,*altcoin;
coinbtc = iguana_coinfind("BTC"); coinbtc = iguana_coinfind("BTC");
altcoin = iguana_coinfind(swap->mine.offer.rel); altcoin = iguana_coinfind(swap->mine.offer.rel);
strcpy(swap->waitfortx,"dep");
*serdatap = 0, *serdatalenp = 0; *serdatap = 0, *serdatalenp = 0;
if ( swap->deposit != 0 && (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->deposit->txid,&swap->deposit->numconfirms,"depfound",0.5)) != 0 ) if ( swap->deposit != 0 && (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->deposit->txid,&swap->deposit->numconfirms,"depfound",0.5)) != 0 )
{ {
@ -732,7 +743,24 @@ cJSON *ALICE_waitdepositfunc(struct supernet_info *myinfo,struct exchange_info *
return(newjson); return(newjson);
} }
cJSON *ALICE_waitpayconf_or_bobreclaimfunc(struct supernet_info *myinfo,struct exchange_info *exchange,struct bitcoin_swapinfo *swap,cJSON *argjson,cJSON *newjson,uint8_t **serdatap,int32_t *serdatalenp) cJSON *ALICE_waitconfirmsfunc(struct supernet_info *myinfo,struct exchange_info *exchange,struct bitcoin_swapinfo *swap,cJSON *argjson,cJSON *newjson,uint8_t **serdatap,int32_t *serdatalenp)
{
char *retstr; double btcconfirms; struct iguana_info *coinbtc;
coinbtc = iguana_coinfind("BTC");
*serdatap = 0, *serdatalenp = 0;
if ( swap->BTCsatoshis < SATOSHIDEN/10 )
btcconfirms = 0;
else btcconfirms = 1. + sqrt((double)swap->BTCsatoshis / SATOSHIDEN);
if ( swap->payment != 0 && (retstr= BTC_txconfirmed(myinfo,coinbtc,swap,newjson,swap->payment->txid,&swap->payment->numconfirms,"payfound",btcconfirms)) != 0 )
{
jaddstr(newjson,"payfound",retstr);
// if bobreclaimed is there, then reclaim altpayment
printf("search for Bob's reclaim in blockchain\n");
return(newjson);
} else return(0);
}
cJSON *ALICE_checkbobreclaimfunc(struct supernet_info *myinfo,struct exchange_info *exchange,struct bitcoin_swapinfo *swap,cJSON *argjson,cJSON *newjson,uint8_t **serdatap,int32_t *serdatalenp)
{ {
char *retstr; double btcconfirms; struct iguana_info *coinbtc; char *retstr; double btcconfirms; struct iguana_info *coinbtc;
coinbtc = iguana_coinfind("BTC"); coinbtc = iguana_coinfind("BTC");
@ -766,10 +794,35 @@ cJSON *BTC_idlerecvfunc(struct supernet_info *myinfo,struct exchange_info *excha
return(newjson); return(newjson);
} }
struct bitcoin_statetx *instantdex_getstatetx(struct bitcoin_swapinfo *swap,char *txname)
{
//char *txnames[] = { "fee", "dep", "alt", "acl", "bre", "bcl", "bfr", "are", "adp" };
if ( strcmp(txname,"fee") == 0 )
return(swap->otherfee);
else if ( strcmp(txname,"dep") == 0 )
return(swap->deposit);
else if ( strcmp(txname,"alt") == 0 )
return(swap->altpayment);
else if ( strcmp(txname,"acl") == 0 )
return(swap->payment);
else if ( strcmp(txname,"bre") == 0 )
return(swap->deposit);
else if ( strcmp(txname,"bcl") == 0 )
return(swap->altpayment);
else if ( strcmp(txname,"bfr") == 0 )
return(swap->myfee);
else if ( strcmp(txname,"are") == 0 )
return(swap->altpayment);
else if ( strcmp(txname,"adp") == 0 )
return(swap->deposit);
printf("unrecognized txname.(%s)\n",txname);
return(0);
}
struct instantdex_stateinfo *BTC_initFSM(int32_t *n) struct instantdex_stateinfo *BTC_initFSM(int32_t *n)
{ {
struct instantdex_stateinfo *s = 0; struct instantdex_stateinfo *s = 0;
// Four initial states are BOB_sentoffer, ALICE_gotoffer, ALICE_sentoffer, BOB_gotoffer // Two initial states are BOB_idle and ALICE_idle
// Inconvenient to start statemachines before this as typically after posting something in the orderbook, it is possible for multiple offers to come in. In that case the user or designated tradebot will need to choose among the acceptable offers and also to determine how much longer to wait. Also, an orderbook entry is technically a state, but there is no assurance it will ever proceed beyond the initial state and not just expire. Once an incoming offer is accepted, then the statemachine is created to push the swap toward completion. // Inconvenient to start statemachines before this as typically after posting something in the orderbook, it is possible for multiple offers to come in. In that case the user or designated tradebot will need to choose among the acceptable offers and also to determine how much longer to wait. Also, an orderbook entry is technically a state, but there is no assurance it will ever proceed beyond the initial state and not just expire. Once an incoming offer is accepted, then the statemachine is created to push the swap toward completion.
// the initiator includes a deck of INSTANTDEX_DECKSIZE keypairs // the initiator includes a deck of INSTANTDEX_DECKSIZE keypairs
@ -835,7 +888,8 @@ struct instantdex_stateinfo *BTC_initFSM(int32_t *n)
s = instantdex_statecreate(s,n,"Alice_waitfee",ALICE_waitfeefunc,0,"BTC_cleanup",0,0); s = instantdex_statecreate(s,n,"Alice_waitfee",ALICE_waitfeefunc,0,"BTC_cleanup",0,0);
s = instantdex_statecreate(s,n,"ALICE_waitdeposit",ALICE_waitdepositfunc,0,"BTC_cleanup",0,0); s = instantdex_statecreate(s,n,"ALICE_waitdeposit",ALICE_waitdepositfunc,0,"BTC_cleanup",0,0);
s = instantdex_statecreate(s,n,"ALICE_sentalt",ALICE_waitBTCpaytxfunc,0,"ALICE_reclaimed",0,0); s = instantdex_statecreate(s,n,"ALICE_sentalt",ALICE_waitBTCpaytxfunc,0,"ALICE_reclaimed",0,0);
s = instantdex_statecreate(s,n,"ALICE_waitconfirms",ALICE_waitpayconf_or_bobreclaimfunc,0,"ALICE_reclaimed",0,0); s = instantdex_statecreate(s,n,"ALICE_waitconfirms",ALICE_waitconfirmsfunc,0,"ALICE_reclaimed",0,0);
s = instantdex_statecreate(s,n,"ALICE_checkbobreclaim",ALICE_checkbobreclaimfunc,0,"ALICE_reclaimed",0,0);
if ( 0 ) // following are implicit states and events handled externally to setup datastructures if ( 0 ) // following are implicit states and events handled externally to setup datastructures
{ {
@ -894,14 +948,17 @@ struct instantdex_stateinfo *BTC_initFSM(int32_t *n)
s = instantdex_statecreate(s,n,"ALICE_sentalt",ALICE_waitBTCpaytxfunc,0,"ALICE_reclaimed",0,0); s = instantdex_statecreate(s,n,"ALICE_sentalt",ALICE_waitBTCpaytxfunc,0,"ALICE_reclaimed",0,0);
instantdex_addevent(s,*n,"ALICE_sentalt","BTCpaytx","poll","ALICE_waitconfirms"); instantdex_addevent(s,*n,"ALICE_sentalt","BTCpaytx","poll","ALICE_waitconfirms");
s = instantdex_statecreate(s,n,"ALICE_waitconfirms",ALICE_waitpayconf_or_bobreclaimfunc,0,"ALICE_reclaimed",0,0); s = instantdex_statecreate(s,n,"ALICE_waitconfirms",ALICE_waitconfirmsfunc,0,"ALICE_reclaimed",0,0);
instantdex_addevent(s,*n,"ALICE_waitconfirms","bobfound","poll","ALICE_reclaimed"); instantdex_addevent(s,*n,"ALICE_waitconfirms","altfound","BTCprivM","ALICE_claimedbtc");
instantdex_addevent(s,*n,"ALICE_waitconfirms","payfound","BTCprivM","ALICE_claimedbtc"); instantdex_addevent(s,*n,"ALICE_waitconfirms","poll","poll","ALICE_checkbobreclaim");
instantdex_addevent(s,*n,"ALICE_waitconfirms","poll","poll","ALICE_waitconfirms");
s = instantdex_statecreate(s,n,"ALICE_checkbobreclaim",ALICE_checkbobreclaimfunc,0,"ALICE_reclaimed",0,0);
instantdex_addevent(s,*n,"ALICE_checkbobreclaim","brefound","poll","ALICE_reclaimed");
instantdex_addevent(s,*n,"ALICE_checkbobreclaim","poll","poll","ALICE_waitconfirms");
// [BLOCKING: privM] Bob waits for privM either from Alice or alt blockchain // [BLOCKING: privM] Bob waits for privM either from Alice or alt blockchain
s = instantdex_statecreate(s,n,"BOB_sentpayment",BOB_waitprivMfunc,0,"BOB_reclaimed",0,0); s = instantdex_statecreate(s,n,"BOB_sentpayment",BOB_waitprivMfunc,0,"BOB_reclaimed",0,0);
instantdex_addevent(s,*n,"BOB_sentpayment","btcfound","BTCdone","BOB_claimedalt"); instantdex_addevent(s,*n,"BOB_sentpayment","aclfound","BTCdone","BOB_claimedalt");
instantdex_addevent(s,*n,"BOB_sentpayment","BTCprivM","BTCdone","BOB_claimedalt"); instantdex_addevent(s,*n,"BOB_sentpayment","BTCprivM","BTCdone","BOB_claimedalt");
instantdex_addevent(s,*n,"BOB_sentpayment","poll","poll","BOB_sentpayment"); instantdex_addevent(s,*n,"BOB_sentpayment","poll","poll","BOB_sentpayment");
{ {

2
includes/iguana_apideclares.h

@ -53,8 +53,6 @@ STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap);
ZERO_ARGS(InstantDEX,allexchanges); ZERO_ARGS(InstantDEX,allexchanges);
STRING_ARG(InstantDEX,allpairs,exchange); STRING_ARG(InstantDEX,allpairs,exchange);
THREE_STRINGS_AND_DOUBLE(atomic,offer,base,rel,orderid,basevolume);
TWO_STRINGS(atomic,accept,myorderid,otherid);
THREE_STRINGS(atomic,approve,myorderid,otherid,txname); THREE_STRINGS(atomic,approve,myorderid,otherid,txname);
THREE_STRINGS(atomic,claim,myorderid,otherid,txname); THREE_STRINGS(atomic,claim,myorderid,otherid,txname);

Loading…
Cancel
Save