diff --git a/src/komodo.h b/src/komodo.h index 9b4d768b0..14de88f4d 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -68,7 +68,7 @@ uint32_t MINDENOMS[] = { 1000, 1000, 100000, 1000, 1000, 1000, 1000, 1000, // ma double PAX_val(uint32_t pval,int32_t baseid) { - printf("PAX_val baseid.%d pval.%u\n",baseid,pval); + //printf("PAX_val baseid.%d pval.%u\n",baseid,pval); if ( baseid >= 0 && baseid < MAX_CURRENCIES ) return(((double)pval / 1000000000.) / MINDENOMS[baseid]); return(0.); @@ -488,15 +488,17 @@ int32_t komodo_baseid(char *origbase) for (i=0; origbase[i]!=0&&i= 0 && (relid= komodo_baseid(rel)) >= 0 ) { for (i=NUM_PRICES-1; i>=0; i--) @@ -504,12 +506,29 @@ uint64_t komodo_paxprice(int32_t height,char *base,char *rel) ptr = &PVALS[36 * i]; if ( *ptr < height ) { - if ( (pvalb= ptr[1 + baseid]) != 0 && (pvalr= ptr[1 + relid]) != 0 ) + if ( (pvalb= ptr[1 + baseid]) != 0 ) { baseval = PAX_val(pvalb,baseid); - relval = PAX_val(pvalr,relid); - printf("ht.%d [%d] base.(%u %f) rel.(%u %f) -> %llu\n",height,*ptr,pvalb,baseval,pvalr,relval,(long long)(COIN * (baseval / relval))); - return(COIN * (baseval / relval)); + if ( relid == MAX_CURRENCIES ) + { + kmdbtc = ptr[1 + MAX_CURRENCIES]; + btcusd = ptr[1 + MAX_CURRENCIES + 1]; + if ( ptr[1 + USD] != 0 && kmdbtc != 0 && btcusd != 0 ) + { + usdval = PAX_val(ptr[1 + USD],USD); + KMDBTC = ((double)kmdbtc / (1000000000. * 1000.)); + BTCUSD = ((double)btcusd / (1000000000. / 1000.)); + KMDUSD = (KMDBTC * BTCUSD); + printf("base -> USD %f, BTC %f KMDUSD %f\n",baseval/usdval,BTCUSD,KMDUSD); + return(volume * (baseval / usdval) / KMDUSD); + } + } + else if ( (pvalr= ptr[1 + relid]) != 0 ) + { + relval = PAX_val(pvalr,relid); + printf("ht.%d [%d] base.(%u %f) rel.(%u %f) -> %llu\n",height,*ptr,pvalb,baseval,pvalr,relval,(long long)(COIN * (baseval / relval))); + return(volume * (baseval / relval)); + } } return(0); } diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 2e955bfcc..7dc95eb82 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -382,22 +382,29 @@ Value gettxoutsetinfo(const Array& params, bool fHelp) uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); uint32_t komodo_txtime(uint256 hash); -uint64_t komodo_paxprice(int32_t height,char *base,char *rel); +uint64_t komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume); Value paxprice(const Array& params, bool fHelp) { - if ( fHelp || params.size() != 3 ) + if ( fHelp || params.size() < 3 || params.size() > 4 ) throw runtime_error("paxprice \"base\" \"rel\" height\n"); LOCK(cs_main); - Object ret; uint64_t pricetoshis; + Object ret; uint64_t pricetoshis,basevolume; std::string base = params[0].get_str(); std::string rel = params[1].get_str(); int32_t height = atoi(params[2].get_str().c_str()); - pricetoshis = komodo_paxprice(height,(char *)base.c_str(),(char *)rel.c_str()); + if ( params.size() == 3 ) + basevolume = COIN; + else basevolume = AmountFromValue(params[3]); + relvolume = komodo_paxprice(height,(char *)base.c_str(),(char *)rel.c_str(),basevolume); ret.push_back(Pair("base", base)); ret.push_back(Pair("rel", rel)); ret.push_back(Pair("height", height)); - ret.push_back(Pair("price", ValueFromAmount(pricetoshis))); + if ( relvolume != 0 ) + { + ret.push_back(Pair("price", ValueFromAmount(basevolume) / ValueFromAmount(relvolume))); + ret.push_back(Pair("relvolume", ValueFromAmount(relvolume))); + } return ret; }