/****************************************************************************** * Copyright © 2014-2016 The SuperNET Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * * holder information and the developer policies on copyright and licensing. * * * * Unless otherwise agreed in a custom licensing agreement, no part of the * * SuperNET software, including this file may be copied, modified, propagated * * or distributed except according to the terms contained in the LICENSE file * * * * Removal or modification of this copyright notice is prohibited. * * * ******************************************************************************/ bits256 dpow_getbestblockhash(struct supernet_info *myinfo,struct iguana_info *coin) { char *retstr; bits256 blockhash; memset(blockhash.bytes,0,sizeof(blockhash)); if ( coin->FULLNODE < 0 ) { if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getbestblockhash","")) != 0 ) { //printf("%s getbestblockhash.(%s)\n",coin->symbol,retstr); if ( is_hexstr(retstr,0) == sizeof(blockhash)*2 ) decode_hex(blockhash.bytes,sizeof(blockhash),retstr); free(retstr); } } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { blockhash = coin->blocks.hwmchain.RO.hash2; } else { } return(blockhash); } cJSON *dpow_getblock(struct supernet_info *myinfo,struct iguana_info *coin,bits256 blockhash) { char buf[128],str[65],*retstr=0; cJSON *json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"\"%s\"",bits256_str(str,blockhash)); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getblock",buf); //printf("%s getblock.(%s)\n",coin->symbol,retstr); } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { retstr = bitcoinrpc_getblock(myinfo,coin,0,0,blockhash,1,0); } else { return(0); } if ( retstr != 0 ) { json = cJSON_Parse(retstr); free(retstr); } return(json); } char *dpow_decoderawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx) { char *retstr,*paramstr; cJSON *array; if ( coin->FULLNODE < 0 ) { array = cJSON_CreateArray(); jaddistr(array,rawtx); paramstr = jprint(array,1); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"decoderawtransaction",paramstr); //printf("%s decoderawtransaction.(%s) <- (%s)\n",coin->symbol,retstr,paramstr); free(paramstr); } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { retstr = bitcoinrpc_decoderawtransaction(myinfo,coin,0,0,rawtx,1); } else { return(0); } return(retstr); } cJSON *dpow_gettransaction(struct supernet_info *myinfo,struct iguana_info *coin,bits256 txid) { char buf[128],str[65],*retstr=0,*rawtx=0; cJSON *json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"[\"%s\", 1]",bits256_str(str,txid)); if ( (rawtx= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"getrawtransaction",buf)) != 0 ) { retstr = dpow_decoderawtransaction(myinfo,coin,rawtx); free(rawtx); } } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { retstr = bitcoinrpc_getrawtransaction(myinfo,coin,0,0,txid,1); } else { return(0); } if ( retstr != 0 ) { json = cJSON_Parse(retstr); free(retstr); } return(json); } cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr) { char buf[128],*retstr; cJSON *json = 0; if ( coin->FULLNODE < 0 ) { sprintf(buf,"0, 99999999, [\"%s\"]",coinaddr); if ( (retstr= bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"listunspent",buf)) != 0 ) { json = cJSON_Parse(retstr); //printf("%s (%s) listunspent.(%s)\n",coin->symbol,buf,retstr); free(retstr); } else printf("%s null retstr from (%s)n",coin->symbol,buf); } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { json = iguana_listunspents(myinfo,coin,0,1,coin->longestchain,""); } else { return(0); } return(json); } char *dpow_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *rawtx,cJSON *vins) { cJSON *array,*privkeys,*item; char *wifstr,*str,*paramstr,*retstr; uint8_t script[256]; int32_t i,n,len,hashtype; struct vin_info V; struct iguana_waddress *waddr; struct iguana_waccount *wacct; if ( coin->FULLNODE < 0 ) { array = cJSON_CreateArray(); jaddistr(array,rawtx); jaddi(array,jduplicate(vins)); paramstr = jprint(array,1); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"signrawtransaction",paramstr); //printf("%s signrawtransaction.(%s) params.(%s)\n",coin->symbol,retstr,paramstr); free(paramstr); return(retstr); } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { privkeys = cJSON_CreateArray(); if ( (n= cJSON_GetArraySize(vins)) > 0 ) { for (i=0; i 0 && strlen(str) < sizeof(script)*2 ) { len = (int32_t)strlen(str) >> 1; decode_hex(script,len,str); V.spendlen = len; memcpy(V.spendscript,script,len); if ( (hashtype= _iguana_calcrmd160(coin,&V)) >= 0 && V.coinaddr[0] != 0 ) { if ( (waddr= iguana_waddresssearch(myinfo,&wacct,V.coinaddr)) != 0 ) { if ( bits256_nonz(waddr->privkey) != 0 ) { if ( bitcoin_priv2wif(waddr->wifstr,waddr->privkey,coin->chain->wiftype) > 0 ) { wifstr = waddr->wifstr; } } } } } jaddistr(privkeys,wifstr); } } retstr = bitcoinrpc_signrawtransaction(myinfo,coin,0,0,rawtx,vins,privkeys,"ALL"); free_json(privkeys); return(retstr); } else { return(0); } } char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx) { bits256 txid; cJSON *json,*array; char *paramstr,*retstr; if ( coin->FULLNODE < 0 ) { array = cJSON_CreateArray(); jaddistr(array,signedtx); paramstr = jprint(array,1); retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"sendrawtransaction",paramstr); printf(">>>>>>>>>>> %s sendrawtransaction.(%s) -> %s\n",coin->symbol,paramstr,retstr); free(paramstr); return(retstr); } else if ( coin->FULLNODE > 0 || coin->VALIDATENODE > 0 ) { txid = iguana_sendrawtransaction(myinfo,coin,signedtx); json = cJSON_CreateObject(); jaddbits256(json,"result",txid); return(jprint(json,1)); } else { return(0); } } int32_t dpow_getchaintip(struct supernet_info *myinfo,bits256 *blockhashp,uint32_t *blocktimep,bits256 *txs,uint32_t *numtxp,struct iguana_info *coin) { int32_t n,i,height = -1,maxtx = *numtxp; bits256 besthash; cJSON *array,*json; *numtxp = *blocktimep = 0; *blockhashp = besthash = dpow_getbestblockhash(myinfo,coin); if ( bits256_nonz(besthash) != 0 ) { if ( (json= dpow_getblock(myinfo,coin,besthash)) != 0 ) { if ( (height= juint(json,"height")) != 0 && (*blocktimep= juint(json,"time")) != 0 ) { if ( (array= jarray(&n,json,"tx")) != 0 ) { for (i=0; isymbol,height,*blocktimep,n); *numtxp = n; } } else height = -1; free_json(json); } } return(height); } int32_t dpow_vini_ismine(struct supernet_info *myinfo,cJSON *item) { cJSON *sobj; char *hexstr; int32_t len; uint8_t data[35]; if ( (sobj= jobj(item,"scriptPubKey")) != 0 && (hexstr= jstr(sobj,"hex")) != 0 ) { len = (int32_t)strlen(hexstr) >> 1; if ( len <= sizeof(data) ) { decode_hex(data,len,hexstr); if ( len == 35 && data[34] == CHECKSIG && data[0] == 33 && memcmp(data+1,myinfo->DPOW.minerkey33,33) == 0 ) return(0); } } return(-1); } int32_t dpow_haveutxo(struct supernet_info *myinfo,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr) { int32_t i,n,vout,haveutxo = 0; bits256 txid; cJSON *unspents,*item; uint64_t satoshis; char *str,*address; uint8_t script[35]; memset(txidp,0,sizeof(*txidp)); *voutp = -1; if ( (unspents= dpow_listunspent(myinfo,coin,coinaddr)) != 0 ) { if ( (n= cJSON_GetArraySize(unspents)) > 0 ) { /*{ "txid" : "34bc21b40d6baf38e2db5be5353dd0bcc9fe416485a2a68753541ed2f9c194b1", "vout" : 0, "address" : "RFBmvBaRybj9io1UpgWM4pzgufc3E4yza7", "scriptPubKey" : "21039a3f7373ae91588b9edd76a9088b2871f62f3438d172b9f18e0581f64887404aac", "amount" : 3.00000000, "confirmations" : 4282, "spendable" : true },*/ for (i=0; i= 0 ) { if ( *voutp < 0 || (rand() % (n/2+1)) == 0 ) { *voutp = vout; *txidp = txid; } haveutxo++; } } } } if ( haveutxo == 0 ) printf("no utxo: need to fund address.(%s) or wait for splitfund to confirm\n",coinaddr); } else printf("null utxo array size\n"); free_json(unspents); } else printf("null return from dpow_listunspent\n"); if ( haveutxo > 0 ) printf("%s haveutxo.%d\n",coin->symbol,haveutxo); return(haveutxo); }