Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
4d4a4dd71b
  1. 2
      iguana/iguana777.h
  2. 36
      iguana/iguana_payments.c
  3. 47
      iguana/iguana_unspents.c
  4. 7
      iguana/iguana_wallet.c
  5. 2
      iguana/ramchain_api.c

2
iguana/iguana777.h

@ -829,7 +829,7 @@ int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr
char *issue_startForging(struct supernet_info *myinfo,char *secret); 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);
int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp); int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp,int32_t maxunspents);
long iguana_spentsfile(struct iguana_info *coin,int32_t n); long iguana_spentsfile(struct iguana_info *coin,int32_t n);
uint8_t *iguana_rmdarray(struct iguana_info *coin,int32_t *numrmdsp,cJSON *array,int32_t firsti); uint8_t *iguana_rmdarray(struct iguana_info *coin,int32_t *numrmdsp,cJSON *array,int32_t firsti);
int64_t iguana_unspents(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint8_t *rmdarray,int32_t numrmds,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp); int64_t iguana_unspents(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint8_t *rmdarray,int32_t numrmds,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp);

36
iguana/iguana_payments.c

@ -158,17 +158,35 @@ cJSON *iguana_scriptobj(struct iguana_info *coin,uint8_t rmd160[20],char *coinad
return(scriptobj); return(scriptobj);
} }
char *sendtoaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,double amount,char *comment,char *comment2,int32_t minconf,char *account) char *sendtoaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,uint64_t satoshis,char *comment,char *comment2,int32_t minconf,char *account)
{ {
uint8_t addrtype,rmd160[20]; int32_t numwaddrs; struct iguana_waddress **waddrs; uint8_t addrtype,rmd160[20],*rmdarray; int32_t i,numwaddrs,numrmds,numunspents=0; struct iguana_waddress **waddrs,*waddr; uint64_t *unspents;
//sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to] <amount> is a real and is rounded to 8 decimal places. Returns the transaction ID <txid> if successful. Y //sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to] <amount> is a real and is rounded to 8 decimal places. Returns the transaction ID <txid> if successful. Y
if ( coinaddr != 0 && coinaddr[0] != 0 && amount > 0. ) if ( coinaddr != 0 && coinaddr[0] != 0 && satoshis != 0 )
{ {
if ( iguana_addressvalidate(coin,&addrtype,rmd160,coinaddr) < 0 ) if ( iguana_addressvalidate(coin,&addrtype,rmd160,coinaddr) < 0 )
return(clonestr("{\"error\":\"invalid coin address\"}")); return(clonestr("{\"error\":\"invalid coin address\"}"));
numwaddrs = iguana_unspentslists(myinfo,coin,(struct iguana_waddress **)coin->blockspace,(int32_t)(sizeof(coin->blockspace)/sizeof(*waddrs)),amount,minconf,0); waddrs = (struct iguana_waddress **)coin->blockspace;
numwaddrs = iguana_unspentslists(myinfo,coin,waddrs,(int32_t)(sizeof(coin->blockspace)/sizeof(*waddrs)),satoshis,minconf,0);
printf("need to generate send %.8f to %s [%s] [%s] using numaddrs.%d\n",dstr(amount),coinaddr,comment!=0?comment:"",comment2!=0?comment2:"",numwaddrs); if ( numwaddrs > 0 )
{
unspents = (uint64_t *)((long)coin->blockspace + sizeof(*waddrs)*numwaddrs);
for (i=0; i<numwaddrs; i++)
{
if ( (waddr= waddrs[i]) != 0 )
printf("(%s %.8f) ",waddr->coinaddr,dstr(waddr->balance));
}
if ( (rmdarray= iguana_rmdarray(coin,&numrmds,0,0)) != 0 )
{
numunspents = (int32_t)((sizeof(coin->blockspace) - sizeof(*waddrs)*numwaddrs) / sizeof(uint64_t));
iguana_unspents(myinfo,coin,0,minconf,coin->longestchain,rmdarray,numrmds,0,unspents,&numunspents);
if ( rmdarray != 0 )
free(rmdarray);
for (i=0; i<numunspents; i++)
printf("([%d].u%u) ",(uint32_t)(unspents[i]>>32),(uint32_t)unspents[i]);
}
}
printf("need to generate send %.8f to %s [%s] [%s] using numaddrs.%d numunspents.%d\n",dstr(satoshis),coinaddr,comment!=0?comment:"",comment2!=0?comment2:"",numwaddrs,numunspents);
} }
return(clonestr("{\"error\":\"need address and amount\"}")); return(clonestr("{\"error\":\"need address and amount\"}"));
} }
@ -757,7 +775,7 @@ S_D_SS(bitcoinrpc,sendtoaddress,address,amount,comment,comment2)
return(clonestr("{\"error\":\"need to unlock wallet\"}")); return(clonestr("{\"error\":\"need to unlock wallet\"}"));
myinfo->expiration++; myinfo->expiration++;
iguana_unspentset(myinfo,coin); iguana_unspentset(myinfo,coin);
return(sendtoaddress(myinfo,coin,address,amount,comment,comment2,coin->minconfirms,0)); return(sendtoaddress(myinfo,coin,address,amount * SATOSHIDEN,comment,comment2,coin->minconfirms,0));
} }
SS_D_I_SS(bitcoinrpc,sendfrom,fromaccount,toaddress,amount,minconf,comment,comment2) SS_D_I_SS(bitcoinrpc,sendfrom,fromaccount,toaddress,amount,minconf,comment,comment2)
@ -768,7 +786,7 @@ SS_D_I_SS(bitcoinrpc,sendfrom,fromaccount,toaddress,amount,minconf,comment,comme
return(clonestr("{\"error\":\"need to unlock wallet\"}")); return(clonestr("{\"error\":\"need to unlock wallet\"}"));
myinfo->expiration++; myinfo->expiration++;
iguana_unspentset(myinfo,coin); iguana_unspentset(myinfo,coin);
return(sendtoaddress(myinfo,coin,toaddress,amount,comment,comment2,minconf,fromaccount)); return(sendtoaddress(myinfo,coin,toaddress,amount * SATOSHIDEN,comment,comment2,minconf,fromaccount));
} }
S_A_I_S(bitcoinrpc,sendmany,fromaccount,payments,minconf,comment) S_A_I_S(bitcoinrpc,sendmany,fromaccount,payments,minconf,comment)
@ -789,7 +807,7 @@ S_A_I_S(bitcoinrpc,sendmany,fromaccount,payments,minconf,comment)
amount = jdouble(item,0); amount = jdouble(item,0);
val = amount * SATOSHIDEN; val = amount * SATOSHIDEN;
printf("(%s %.8f) ",coinaddr,dstr(val)); printf("(%s %.8f) ",coinaddr,dstr(val));
if ( (str= sendtoaddress(myinfo,coin,coinaddr,amount,comment,"",minconf,fromaccount)) != 0 ) if ( (str= sendtoaddress(myinfo,coin,coinaddr,val,comment,"",minconf,fromaccount)) != 0 )
{ {
free(str); free(str);
} }

47
iguana/iguana_unspents.c

@ -138,7 +138,8 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r
*depositsp = ACCTS[pkind].total; *depositsp = ACCTS[pkind].total;
*lastunspentindp = ACCTS[pkind].lastunspentind; *lastunspentindp = ACCTS[pkind].lastunspentind;
printf("[%d] return pkind.%u of %u P.%p %.8f last.%u ACCTS.%p %p\n",i,pkind,numpkinds,P,dstr(*depositsp),*lastunspentindp,ACCTS,ramchain->A); printf("[%d] return pkind.%u of %u P.%p %.8f last.%u ACCTS.%p %p\n",i,pkind,numpkinds,P,dstr(*depositsp),*lastunspentindp,ACCTS,ramchain->A);
*p = P[pkind]; if ( P != 0 )
*p = P[pkind];
return(p); return(p);
} }
else if ( pkind != 0 ) else if ( pkind != 0 )
@ -223,12 +224,9 @@ int64_t iguana_pkhashbalance(struct supernet_info *myinfo,struct iguana_info *co
return(deposits - spent); return(deposits - spent);
} }
int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp) int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,int64_t *totalp,struct iguana_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp,int32_t maxunspents)
{ {
int32_t i,n,m,maxunspents,numunspents = 0; int64_t spent,deposits,netbalance,total; uint32_t lastunspentind; struct iguana_pkhash *p,_p; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; int32_t i,n,m,numunspents = *numunspentsp; int64_t spent,deposits,netbalance,total; uint32_t lastunspentind; struct iguana_pkhash *p,_p; struct iguana_ramchain *ramchain; struct iguana_bundle *bp;
if ( numunspentsp != 0 )
maxunspents = *numunspentsp, *numunspentsp = 0;
else maxunspents = 0;
if ( 0 && coin->RTramchain_busy != 0 ) if ( 0 && coin->RTramchain_busy != 0 )
{ {
printf("iguana_pkhasharray: unexpected access when RTramchain_busy\n"); printf("iguana_pkhasharray: unexpected access when RTramchain_busy\n");
@ -248,7 +246,7 @@ int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin
continue; continue;
if ( (coin->blocks.hwmchain.height - bp->bundleheight) < minconf ) if ( (coin->blocks.hwmchain.height - bp->bundleheight) < minconf )
break; break;
if ( iguana_pkhashfind(coin,&ramchain,&deposits,&lastunspentind,&P[n],rmd160,i,i) != 0 ) if ( iguana_pkhashfind(coin,&ramchain,&deposits,&lastunspentind,P != 0 ? &P[n] : &_p,rmd160,i,i) != 0 )
{ {
m = maxunspents; m = maxunspents;
p = (P == 0) ? &_p : &P[n]; p = (P == 0) ? &_p : &P[n];
@ -264,24 +262,26 @@ int32_t iguana_pkhasharray(struct supernet_info *myinfo,struct iguana_info *coin
} }
maxunspents -= m; maxunspents -= m;
numunspents += m; numunspents += m;
printf("%d: balance %.8f, lastunspent.%u m.%d num.%d max.%d\n",i,dstr(total),lastunspentind,m,numunspents,maxunspents);
} }
//printf("%d: balance %.8f, lastunspent.%u\n",i,dstr(balance),lastunspentind);
} }
//printf("n.%d max.%d\n",n,max);
if ( numunspentsp != 0 ) if ( numunspentsp != 0 )
*numunspentsp = numunspents; *numunspentsp = numunspents;
printf("numunspents.%d [%d] max.%d\n",numunspents,*numunspentsp,maxunspents);
*totalp += total; *totalp += total;
return(n); return(n);
} }
int64_t iguana_unspents(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint8_t *rmdarray,int32_t numrmds,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp) int64_t iguana_unspents(struct supernet_info *myinfo,struct iguana_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint8_t *rmdarray,int32_t numrmds,int32_t lastheight,uint64_t *unspents,int32_t *numunspentsp)
{ {
int64_t total=0,sum=0; struct iguana_pkhash *P; uint8_t *addrtypes,*pubkeys; int32_t i,flag = 0; char coinaddr[64]; int64_t total=0,sum=0; struct iguana_pkhash *P; uint8_t *addrtypes,*pubkeys; int32_t i,numunspents,maxunspents,flag = 0; char coinaddr[64];
if ( 0 && coin->RTramchain_busy != 0 ) if ( 0 && coin->RTramchain_busy != 0 )
{ {
printf("iguana_pkhasharray: unexpected access when RTramchain_busy\n"); printf("iguana_pkhasharray: unexpected access when RTramchain_busy\n");
return(sum); return(sum);
} }
numunspents = 0;
maxunspents = *numunspentsp;
if ( rmdarray == 0 ) if ( rmdarray == 0 )
rmdarray = iguana_walletrmds(myinfo,coin,&numrmds), flag++; rmdarray = iguana_walletrmds(myinfo,coin,&numrmds), flag++;
if ( numrmds > 0 && rmdarray != 0 ) if ( numrmds > 0 && rmdarray != 0 )
@ -291,13 +291,17 @@ int64_t iguana_unspents(struct supernet_info *myinfo,struct iguana_info *coin,cJ
for (i=0; i<numrmds; i++) for (i=0; i<numrmds; i++)
{ {
bitcoin_address(coinaddr,addrtypes[i],&rmdarray[i * 20],20); bitcoin_address(coinaddr,addrtypes[i],&rmdarray[i * 20],20);
iguana_pkhasharray(myinfo,coin,array,minconf,maxconf,&total,P,coin->bundlescount,&rmdarray[i * 20],coinaddr,&pubkeys[33*i],lastheight,unspents,numunspentsp); *numunspentsp = 0;
printf("i.%d of %d: %s %.8f\n",i,numrmds,coinaddr,dstr(total)); iguana_pkhasharray(myinfo,coin,array,minconf,maxconf,&total,P,coin->bundlescount,&rmdarray[i * 20],coinaddr,&pubkeys[33*i],lastheight,&unspents[numunspents],numunspentsp,maxunspents);
printf("iguana_unspents: i.%d of %d: %s %.8f numunspents.%d\n",i,numrmds,coinaddr,dstr(total),*numunspentsp);
maxunspents -= *numunspentsp;
numunspents += *numunspentsp;
sum += total; sum += total;
} }
printf("sum %.8f\n",dstr(sum)); printf("sum %.8f\n",dstr(sum));
free(P); free(P);
} }
*numunspentsp = numunspents;
if ( flag != 0 && rmdarray != 0 ) if ( flag != 0 && rmdarray != 0 )
free(rmdarray); free(rmdarray);
return(sum); return(sum);
@ -329,7 +333,7 @@ uint8_t *iguana_rmdarray(struct iguana_info *coin,int32_t *numrmdsp,cJSON *array
int64_t iguana_unspentset(struct supernet_info *myinfo,struct iguana_info *coin) int64_t iguana_unspentset(struct supernet_info *myinfo,struct iguana_info *coin)
{ {
int64_t sum = 0,total; struct iguana_waccount *wacct,*tmp; struct iguana_waddress *waddr,*tmp2; int32_t numunspents; int64_t sum = 0,total; struct iguana_waccount *wacct,*tmp; struct iguana_waddress *waddr,*tmp2; int32_t n,numunspents = 0;
HASH_ITER(hh,myinfo->wallet,wacct,tmp) HASH_ITER(hh,myinfo->wallet,wacct,tmp)
{ {
HASH_ITER(hh,wacct->waddr,waddr,tmp2) HASH_ITER(hh,wacct->waddr,waddr,tmp2)
@ -337,19 +341,20 @@ int64_t iguana_unspentset(struct supernet_info *myinfo,struct iguana_info *coin)
if ( waddr->addrtype != coin->chain->pubtype || (bits256_nonz(waddr->privkey) == 0 && waddr->scriptlen == 0) ) if ( waddr->addrtype != coin->chain->pubtype || (bits256_nonz(waddr->privkey) == 0 && waddr->scriptlen == 0) )
continue; continue;
total = 0; total = 0;
numunspents = (int32_t)(sizeof(coin->blockspace)/sizeof(*waddr->unspents)); n = 0;
iguana_pkhasharray(myinfo,coin,0,coin->minconfirms,coin->longestchain,&total,0,coin->bundlescount,waddr->rmd160,waddr->coinaddr,waddr->pubkey,coin->blocks.hwmchain.height - coin->minconfirms,(uint64_t *)coin->blockspace,&numunspents); iguana_pkhasharray(myinfo,coin,0,coin->minconfirms,coin->longestchain,&total,0,coin->bundlescount,waddr->rmd160,waddr->coinaddr,waddr->pubkey,coin->blocks.hwmchain.height - coin->minconfirms,(uint64_t *)coin->blockspace,&n,(int32_t)(sizeof(coin->blockspace)/sizeof(*waddr->unspents)));
if ( numunspents > 0 ) if ( n > 0 )
{ {
if ( waddr->unspents == 0 || waddr->maxunspents < numunspents ) if ( waddr->unspents == 0 || waddr->maxunspents < n )
{ {
waddr->unspents = realloc(waddr->unspents,sizeof(*waddr->unspents) * numunspents); waddr->unspents = realloc(waddr->unspents,sizeof(*waddr->unspents) * n);
waddr->maxunspents = numunspents; waddr->maxunspents = n;
} }
memcpy(waddr->unspents,coin->blockspace,sizeof(*waddr->unspents) * numunspents); memcpy(waddr->unspents,coin->blockspace,sizeof(*waddr->unspents) * n);
waddr->numunspents = numunspents; waddr->numunspents = n;
waddr->balance = total; waddr->balance = total;
sum += total; sum += total;
numunspents += n;
} }
} }
} }

7
iguana/iguana_wallet.c

@ -636,7 +636,10 @@ cJSON *iguana_walletiterate(struct supernet_info *myinfo,struct iguana_info *coi
if ( flag < -1 ) if ( flag < -1 )
{ {
HASH_DELETE(hh,wacct->waddr,waddr); HASH_DELETE(hh,wacct->waddr,waddr);
free(waddr); if ( waddr->unspents != 0 )
free(waddr->unspents);
printf("%p free %s\n",waddr,waddr->coinaddr);
myfree(waddr,sizeof(*waddr) + waddr->scriptlen);
} }
} }
else else
@ -656,7 +659,7 @@ cJSON *iguana_walletiterate(struct supernet_info *myinfo,struct iguana_info *coi
if ( flag < -1 ) if ( flag < -1 )
{ {
HASH_DELETE(hh,myinfo->wallet,wacct); HASH_DELETE(hh,myinfo->wallet,wacct);
free(wacct); myfree(wacct,sizeof(*wacct));
} }
} }
if ( goodp != 0 ) if ( goodp != 0 )

2
iguana/ramchain_api.c

@ -53,7 +53,7 @@ TWO_STRINGS_AND_TWO_DOUBLES(iguana,balance,activecoin,address,lastheightd,mincon
printf("Start %s balance.(%s) height.%d\n",coin->symbol,address,lastheight); printf("Start %s balance.(%s) height.%d\n",coin->symbol,address,lastheight);
if ( lastheight == 0 ) if ( lastheight == 0 )
lastheight = IGUANA_MAXHEIGHT; lastheight = IGUANA_MAXHEIGHT;
iguana_pkhasharray(myinfo,coin,array,minconf,maxconf,&total,P,coin->bundlescount,rmd160,address,pubkey33,lastheight,0,0); iguana_pkhasharray(myinfo,coin,array,minconf,maxconf,&total,P,coin->bundlescount,rmd160,address,pubkey33,lastheight,0,0,0);
free(P); free(P);
jadd(retjson,"unspents",array); jadd(retjson,"unspents",array);
jaddnum(retjson,"balance",dstr(total)); jaddnum(retjson,"balance",dstr(total));

Loading…
Cancel
Save