diff --git a/src/cc/prices.cpp b/src/cc/prices.cpp index 2116f2e8e..3ac334109 100644 --- a/src/cc/prices.cpp +++ b/src/cc/prices.cpp @@ -62,6 +62,7 @@ typedef struct OneBetData { } onebetdata; typedef struct BetInfo { + uint256 txid; int64_t averageCostbasis, firstprice, lastprice, liquidationprice, equity; int64_t rektfee; int32_t lastheight; @@ -69,7 +70,7 @@ typedef struct BetInfo { bool isOpen, isRekt; uint256 tokenid; - std::vector parsed; + std::vector vecparsed; std::vector bets; CPubKey pk; @@ -1599,13 +1600,13 @@ int32_t prices_getbetinfo(uint256 bettxid, BetInfo &betinfo) return -2; OneBetData bet1; - if (prices_betopretdecode(bettx.vout.back().scriptPubKey, betinfo.pk, bet1.firstheight, bet1.positionsize, betinfo.leverage, betinfo.firstprice, betinfo.parsed, betinfo.tokenid) == 'B') + if (prices_betopretdecode(bettx.vout.back().scriptPubKey, betinfo.pk, bet1.firstheight, bet1.positionsize, betinfo.leverage, betinfo.firstprice, betinfo.vecparsed, betinfo.tokenid) == 'B') { uint256 finaltxid; int32_t vini; int32_t finaltxheight; //, endheight; //std::vector bets; - + betinfo.txid = bettxid; if (CCgetspenttxid(finaltxid, vini, finaltxheight, bettxid, NVOUT_CCMARKER) == 0) betinfo.isOpen = false; @@ -1618,7 +1619,7 @@ int32_t prices_getbetinfo(uint256 bettxid, BetInfo &betinfo) prices_enumaddedbets(batontxid, betinfo.bets, bettxid); - if (prices_scanchain(betinfo.bets, betinfo.leverage, betinfo.parsed, betinfo.lastprice, betinfo.lastheight) < 0) { + if (prices_scanchain(betinfo.bets, betinfo.leverage, betinfo.vecparsed, betinfo.lastprice, betinfo.lastheight) < 0) { return -4; } @@ -1921,7 +1922,7 @@ UniValue PricesInfo(uint256 bettxid, int32_t refheight) result.push_back(Pair("rektheight", betinfo.lastheight)); } - std::string expr = prices_getsourceexpression(betinfo.parsed); + std::string expr = prices_getsourceexpression(betinfo.vecparsed); result.push_back(Pair("expression", expr)); result.push_back(Pair("reduced", prices_getreducedexpr(expr))); // result.push_back(Pair("batontxid", batontxid.GetHex())); @@ -2002,11 +2003,52 @@ UniValue PricesList(uint32_t filter, CPubKey mypk) } -void prices_addbookentry(uint256 txid) +static bool prices_addbookentry(uint256 txid, std::vector &book) { BetInfo betinfo; - //if( prices_getbetinfo(txid, betinfo) == 0 ) + if (prices_getbetinfo(txid, betinfo) == 0) { + book.push_back(betinfo); + return true; + } + return false; +} +/* +static bool prices_isopposite(BetInfo p1, BetInfo p2) { + if (p1.vecparsed.size() <= 3 && p2.vecparsed.size() <= 3) { // simple synthetic exp + + uint16_t opcode1 = p1.vecparsed[0]; + uint16_t opcode2 = p2.vecparsed[0]; + + int32_t value1 = (opcode1 & (KOMODO_MAXPRICES - 1)); // index or weight + int32_t value2 = (opcode2 & (KOMODO_MAXPRICES - 1)); // index or weight + + if ( (opcode1 & KOMODO_PRICEMASK) && (opcode2 & KOMODO_PRICEMASK) ) { + char name1[65]; + char name2[65]; + if (komodo_pricename(name1, value1) && komodo_pricename(name2, value2)) { + + std::string upperquote1, bottomquote1, upperquote2, bottomquote2; + prices_splitpair(std::string(name1), upperquote1, bottomquote1); + prices_splitpair(std::string(name2), upperquote2, bottomquote2); + + if (upperquote == "BTC") + isTop = true; + else if (bottomquote == "BTC") + isTop = false; + else + continue; + + if (!bottomquote.empty()) { + + for (int j = i + 1; j < book.size(); j++) { + + } + } + } + } + } } +*/ // walk through uxtos on the global address // calculate the balance: @@ -2016,16 +2058,50 @@ void prices_addbookentry(uint256 txid) UniValue PricesGetOrderbook() { UniValue result(UniValue::VARR); - std::vector > addressIndex, addressIndexCC; + std::vector book, opposits; + std::vector > addressIndex; struct CCcontract_info *cp, C; cp = CCinit(&C, EVAL_PRICES); + // add all bets: SetCCtxids(addressIndex, cp->normaladdr, false); // old normal marker for (std::vector >::const_iterator it = addressIndex.begin(); it != addressIndex.end(); it++) { if (it->first.txindex == NVOUT_NORMALMARKER) - prices_addbookentry(it->first.txhash); + prices_addbookentry(it->first.txhash, book); } + + + // calc total fund amount + int64_t totalfund = 0; + std::vector > addressCCunspents; + SetCCunspents(addressCCunspents, cp->unspendableCCaddr, true); // cc marker + for (std::vector >::const_iterator it = addressCCunspents.begin(); it != addressCCunspents.end(); it++) + { + totalfund += it->second.satoshis; + } + + // extract out opposit bets: + int lastbtcpos = -1; + int lastleverage = 0; + for (int i = 0; i < book.size() - 1; i++) { + for (int j = 0; j < book.size(); j++) { + if (book[i].isOpen && book[j].isOpen) { + //if (prices_isopposite(book[i], book[j])) { + //} + } + } + } + + int64_t totalliabilities = 0; + for (int i = 0; i < book.size() - 1; i++) { + if (book[i].isOpen) { + totalliabilities += book[i].equity; + } + } + + result.push_back(Pair("TotalFund", ValueFromAmount(totalfund))); + result.push_back(Pair("TotalLiabilities", ValueFromAmount(totalliabilities))); return result; }