added check amount acceptable

This commit is contained in:
dimxy
2019-05-10 01:50:33 +05:00
parent 60d5859136
commit 039a3128f2

View File

@@ -119,7 +119,16 @@ typedef struct MatchedBookTotal {
} MatchedBookTotal; } MatchedBookTotal;
typedef struct TotalFund {
int64_t totalFund;
int64_t totalBets;
int64_t totalRekt;
int64_t totalEquity;
} TotalFund;
int32_t prices_syntheticprofits(int64_t &costbasis, int32_t firstheight, int32_t height, int16_t leverage, std::vector<uint16_t> vec, int64_t positionsize, int64_t &profits, int64_t &outprice); int32_t prices_syntheticprofits(int64_t &costbasis, int32_t firstheight, int32_t height, int16_t leverage, std::vector<uint16_t> vec, int64_t positionsize, int64_t &profits, int64_t &outprice);
static bool prices_isacceptableamount(const std::vector<uint16_t> &vecparsed, int64_t amount, int16_t leverage);
// helpers: // helpers:
@@ -1423,6 +1432,13 @@ UniValue PricesBet(int64_t txfee, int64_t amount, int16_t leverage, std::vector<
result.push_back(Pair("error", "invalid synthetic")); result.push_back(Pair("error", "invalid synthetic"));
return(result); return(result);
} }
if (prices_isacceptableamount(vec, amount, leverage)) {
result.push_back(Pair("result", "error"));
result.push_back(Pair("error", "too large amount and leverage"));
return(result);
}
if (AddNormalinputs(mtx, mypk, amount + 4 * txfee, 64) >= amount + 4 * txfee) if (AddNormalinputs(mtx, mypk, amount + 4 * txfee, 64) >= amount + 4 * txfee)
{ {
betamount = (amount * 199) / 200; betamount = (amount * 199) / 200;
@@ -1431,14 +1447,14 @@ UniValue PricesBet(int64_t txfee, int64_t amount, int16_t leverage, std::vector<
mtx.vout.push_back(MakeCC1vout(cp->evalcode, txfee, pricespk)); // vout1 cc marker (NVOUT_CCMARKER) mtx.vout.push_back(MakeCC1vout(cp->evalcode, txfee, pricespk)); // vout1 cc marker (NVOUT_CCMARKER)
mtx.vout.push_back(MakeCC1vout(cp->evalcode, betamount, pricespk)); // vout2 betamount mtx.vout.push_back(MakeCC1vout(cp->evalcode, betamount, pricespk)); // vout2 betamount
mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG)); // vout3 normal marker NVOUT_NORMALMARKER - TODO: remove it as we have cc marker now, when move to the new chain mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG)); // vout3 normal marker NVOUT_NORMALMARKER - TODO: remove it as we have cc marker now, when move to the new chain
if ( ASSETCHAINS_EARLYTXIDCONTRACT == EVAL_PRICES && KOMODO_EARLYTXID_SCRIPTPUB.size() == 0 ) /*if ( ASSETCHAINS_EARLYTXIDCONTRACT == EVAL_PRICES && KOMODO_EARLYTXID_SCRIPTPUB.size() == 0 )
{ {
// Lock here, as in validation we cannot call lock in the function itself. // Lock here, as in validation we cannot call lock in the function itself.
// may not be needed as the validation call to update the global, is called in a LOCK already, and it can only update there and here. // may not be needed as the validation call to update the global, is called in a LOCK already, and it can only update there and here.
LOCK(cs_main); LOCK(cs_main);
GetKomodoEarlytxidScriptPub(); GetKomodoEarlytxidScriptPub();
} }
mtx.vout.push_back(CTxOut(amount-betamount, KOMODO_EARLYTXID_SCRIPTPUB)); mtx.vout.push_back(CTxOut(amount-betamount, KOMODO_EARLYTXID_SCRIPTPUB)); */
rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, prices_betopret(mypk, nextheight - 1, amount, leverage, firstprice, vec, zeroid)); rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, prices_betopret(mypk, nextheight - 1, amount, leverage, firstprice, vec, zeroid));
return(prices_rawtxresult(result, rawtx, 0)); return(prices_rawtxresult(result, rawtx, 0));
@@ -1635,13 +1651,13 @@ int32_t prices_getbetinfo(uint256 bettxid, BetInfo &betinfo)
prices_enumaddedbets(batontxid, betinfo.bets, bettxid); prices_enumaddedbets(batontxid, betinfo.bets, bettxid);
if (!betinfo.isOpen) { /*if (!betinfo.isOpen) {
CTransaction finaltx; CTransaction finaltx;
uint256 hashBlock; uint256 hashBlock;
if (myGetTransaction(finaltxid, finaltx, hashBlock) && finaltx.vout.size() > 0 && prices_finalopretdecode) if (myGetTransaction(finaltxid, finaltx, hashBlock) && finaltx.vout.size() > 0 && prices_finalopretdecode)
{ {
} }
} }*/
if (prices_scanchain(betinfo.bets, betinfo.leverage, betinfo.vecparsed, betinfo.lastprice, betinfo.lastheight) < 0) { if (prices_scanchain(betinfo.bets, betinfo.leverage, betinfo.vecparsed, betinfo.lastprice, betinfo.lastheight) < 0) {
@@ -2039,9 +2055,9 @@ static bool prices_addbookentry(uint256 txid, std::vector<BetInfo> &book)
} }
static bool prices_ispositionup(BetInfo p) { static bool prices_ispositionup(const std::vector<uint16_t> &vecparsed, int16_t leverage) {
if (p.vecparsed.size() > 1 && p.vecparsed.size() <= 3) { if (vecparsed.size() > 1 && vecparsed.size() <= 3) {
uint16_t opcode = p.vecparsed[0]; uint16_t opcode = vecparsed[0];
int32_t value = (opcode & (KOMODO_MAXPRICES - 1)); // filter index or weight = opcode & (2048-1) int32_t value = (opcode & (KOMODO_MAXPRICES - 1)); // filter index or weight = opcode & (2048-1)
@@ -2051,13 +2067,13 @@ static bool prices_ispositionup(BetInfo p) {
std::string upperquote, bottomquote; std::string upperquote, bottomquote;
prices_splitpair(std::string(name), upperquote, bottomquote); prices_splitpair(std::string(name), upperquote, bottomquote);
uint16_t opcode1 = p.vecparsed[1]; uint16_t opcode1 = vecparsed[1];
std::cerr << "prices_ispositionup upperquote=" << upperquote << " bottomquote=" << bottomquote << " opcode1=" << opcode1 << " (opcode1 & KOMODO_PRICEMASK)=" << (opcode1 & KOMODO_PRICEMASK) << std::endl; //std::cerr << "prices_ispositionup upperquote=" << upperquote << " bottomquote=" << bottomquote << " opcode1=" << opcode1 << " (opcode1 & KOMODO_PRICEMASK)=" << (opcode1 & KOMODO_PRICEMASK) << std::endl;
if (upperquote == "BTC" || bottomquote == "BTC") { // it is relatively btc if (upperquote == "BTC" || bottomquote == "BTC") { // it is relatively btc
if (upperquote == "BTC" && (p.leverage > 0 || (opcode1 & KOMODO_PRICEMASK) != PRICES_INV) || if (upperquote == "BTC" && (leverage > 0 || (opcode1 & KOMODO_PRICEMASK) != PRICES_INV) ||
bottomquote == "BTC" && (p.leverage < 0 || (opcode1 & KOMODO_PRICEMASK) == PRICES_INV)) { bottomquote == "BTC" && (leverage < 0 || (opcode1 & KOMODO_PRICEMASK) == PRICES_INV)) {
std::cerr << "prices_ispositionup return true for BTC" << std::endl; std::cerr << "prices_ispositionup return true for BTC" << std::endl;
return true; return true;
} }
@@ -2066,8 +2082,8 @@ static bool prices_ispositionup(BetInfo p) {
} }
if (upperquote == "USD" || bottomquote == "USD") { // it is relatively usd if (upperquote == "USD" || bottomquote == "USD") { // it is relatively usd
if (upperquote == "USD" && (p.leverage > 0 || (opcode1 & KOMODO_PRICEMASK) != PRICES_INV) || if (upperquote == "USD" && (leverage > 0 || (opcode1 & KOMODO_PRICEMASK) != PRICES_INV) ||
bottomquote == "USD" && (p.leverage < 0 || (opcode1 & KOMODO_PRICEMASK) == PRICES_INV)) { bottomquote == "USD" && (leverage < 0 || (opcode1 & KOMODO_PRICEMASK) == PRICES_INV)) {
std::cerr << "prices_ispositionup return true for USD" << std::endl; std::cerr << "prices_ispositionup return true for USD" << std::endl;
return true; return true;
} }
@@ -2111,15 +2127,30 @@ static bool prices_isopposite(BetInfo p1, BetInfo p2) {
} }
// walk through uxtos on the global address
// calculate the balance: static std::string findMatchedBook(const std::vector<uint16_t> &vecparsed, const std::map<std::string, std::vector<BetInfo> > & bookmatched) {
// + rekt positions
// = opposite positions if (vecparsed.size() > 1 && vecparsed.size() <= 3) {
// - unbalanced positions uint16_t opcode = vecparsed[0];
UniValue PricesGetOrderbook()
int32_t value = (opcode & (KOMODO_MAXPRICES - 1)); // filter index or weight = opcode & (2048-1)
if ((opcode & KOMODO_PRICEMASK) == 0) {
char name[65];
if (komodo_pricename(name, value)) {
auto it = bookmatched.find(std::string(name));
if (it != bookmatched.end())
return it->first;
}
}
}
return std::string("");
}
void prices_getorderbook(std::map<std::string, std::vector<BetInfo> > & bookmatched, std::map<std::string, MatchedBookTotal> &matchedTotals, TotalFund &fundTotals)
{ {
UniValue result(UniValue::VOBJ); std::vector<BetInfo> book;
std::vector<BetInfo> book, opposits;
std::vector<std::pair<CAddressIndexKey, CAmount> > addressIndex; std::vector<std::pair<CAddressIndexKey, CAmount> > addressIndex;
struct CCcontract_info *cp, C; struct CCcontract_info *cp, C;
@@ -2135,29 +2166,25 @@ UniValue PricesGetOrderbook()
// calc total fund amount // calc total fund amount
int64_t totalfund = 0; fundTotals.totalFund = 0;
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressCCunspents; std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressCCunspents;
SetCCunspents(addressCCunspents, cp->unspendableCCaddr, true); // cc marker SetCCunspents(addressCCunspents, cp->unspendableCCaddr, true); // cc marker
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it = addressCCunspents.begin(); it != addressCCunspents.end(); it++) for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it = addressCCunspents.begin(); it != addressCCunspents.end(); it++)
{ {
std::cerr << "totalfund calc txid=" << it->first.txhash.GetHex() << " nvout=" << it->first.index << " satoshis=" << it->second.satoshis << std::endl; std::cerr << "totalfund calc txid=" << it->first.txhash.GetHex() << " nvout=" << it->first.index << " satoshis=" << it->second.satoshis << std::endl;
totalfund += it->second.satoshis; fundTotals.totalFund += it->second.satoshis;
} }
// extract out opposite bets: // extract out opposite bets:
std::map<std::string, std::vector<BetInfo> > bookmatched;
int64_t totalBets = 0;
int64_t totalRekt = 0;
int64_t totalEquity = 0;
while (book.size() > 0) { while (book.size() > 0) {
int64_t betspos = 0; int64_t betspos = 0;
for (auto bet : book[0].bets) betspos += bet.positionsize; for (auto bet : book[0].bets) betspos += bet.positionsize;
if (!book[0].isRekt) { if (!book[0].isRekt) {
totalBets += betspos; fundTotals.totalBets += betspos;
totalEquity += book[0].equity; fundTotals.totalEquity += book[0].equity;
if (book[0].vecparsed.size() <= 3) { // only short expr check for match: "BTC_USD,1" or "BTC_USD,!,1" if (book[0].vecparsed.size() <= 3) { // only short expr check for match: "BTC_USD,1" or "BTC_USD,!,1"
char name[65]; char name[65];
@@ -2182,14 +2209,13 @@ UniValue PricesGetOrderbook()
} }
} }
else { else {
totalRekt += (betspos - book[0].rektfee); fundTotals.totalRekt += (betspos - book[0].rektfee);
//TODO: store rekt //TODO: store rekt
} }
book.erase(book.begin()); book.erase(book.begin());
} }
// calculate cancelling amount // calculate cancelling amount
std::map<std::string, MatchedBookTotal> matchedTotals;
for (auto &m : bookmatched) { for (auto &m : bookmatched) {
int64_t totalLeveragedPositionUp = 0; int64_t totalLeveragedPositionUp = 0;
int64_t totalLeveragedPositionDown = 0; int64_t totalLeveragedPositionDown = 0;
@@ -2197,17 +2223,55 @@ UniValue PricesGetOrderbook()
for (int i = 0; i < m.second.size(); i++) { for (int i = 0; i < m.second.size(); i++) {
int64_t betspos = 0; int64_t betspos = 0;
for (auto bet : m.second[i].bets) betspos += bet.positionsize; for (auto bet : m.second[i].bets) betspos += bet.positionsize;
m.second[i].isUp = prices_ispositionup(m.second[i]); m.second[i].isUp = prices_ispositionup(m.second[i].vecparsed, m.second[i].leverage);
if (m.second[i].isUp) if (m.second[i].isUp)
totalLeveragedPositionUp += betspos * abs(m.second[i].leverage); totalLeveragedPositionUp += betspos * abs(m.second[i].leverage);
else else
totalLeveragedPositionDown += betspos * abs(m.second[i].leverage); totalLeveragedPositionDown += betspos * abs(m.second[i].leverage);
std::cerr << "PricesGetOrderbook 0 m.second[i].isUp=" << m.second[i].isUp << " i=" << i << std::endl; //std::cerr << "PricesGetOrderbook 0 m.second[i].isUp=" << m.second[i].isUp << " i=" << i << std::endl;
} }
matchedTotals[m.first].diffLeveragedPosition = totalLeveragedPositionUp - totalLeveragedPositionDown; matchedTotals[m.first].diffLeveragedPosition = totalLeveragedPositionUp - totalLeveragedPositionDown;
} }
}
static bool prices_isacceptableamount(const std::vector<uint16_t> &vecparsed, int64_t amount, int16_t leverage) {
std::map<std::string, std::vector<BetInfo> > matchedBook;
std::map<std::string, MatchedBookTotal> matchedTotals;
TotalFund fundTotals;
prices_getorderbook(matchedBook, matchedTotals, fundTotals);
std::string pricename = findMatchedBook(vecparsed, matchedBook);
if (!pricename.empty()) {
std::cerr << "IsAcceptableAmount() found matched book=" << pricename << " diffLeveragedPosition=" << matchedTotals[pricename].diffLeveragedPosition << std::endl;
// could fit into leveraged amount
if ((prices_ispositionup(vecparsed, leverage) || leverage > 0) && amount*abs(leverage) + matchedTotals[pricename].diffLeveragedPosition <= 0) {
std::cerr << "IsAcceptableAmount() could fit into opposite negative lev amount" << std::endl;
return true;
}
if ((!prices_ispositionup(vecparsed, leverage) || leverage < 0) && -amount*abs(leverage) + matchedTotals[pricename].diffLeveragedPosition >= 0) {
std::cerr << "IsAcceptableAmount() could fit into opposite positive lev amount" << std::endl;
return true;
}
}
return false;
}
// walk through uxtos on the global address
// calculate the balance:
// + rekt positions
// = opposite positions
// - unbalanced positions
UniValue PricesGetOrderbook()
{
UniValue result(UniValue::VOBJ);
std::map<std::string, std::vector<BetInfo> > matchedBook;
std::map<std::string, MatchedBookTotal> matchedTotals;
TotalFund fundTotals;
prices_getorderbook(matchedBook, matchedTotals, fundTotals);
/*UniValue resbook (UniValue::VARR); /*UniValue resbook (UniValue::VARR);
for (int i = 0; i < book.size(); i++) { for (int i = 0; i < book.size(); i++) {
@@ -2221,8 +2285,8 @@ UniValue PricesGetOrderbook()
result.push_back(Pair("unmatched", resbook)); */ result.push_back(Pair("unmatched", resbook)); */
// copy to rpc UniResult // copy to rpc UniResult
for (auto &m : bookmatched) { for (auto &m : matchedBook) {
UniValue mathedBookHeader(UniValue::VOBJ); UniValue resheader(UniValue::VOBJ);
UniValue resbook(UniValue::VARR); UniValue resbook(UniValue::VARR);
for (int i = 0; i < m.second.size(); i++) { for (int i = 0; i < m.second.size(); i++) {
UniValue entry(UniValue::VOBJ); UniValue entry(UniValue::VOBJ);
@@ -2231,16 +2295,16 @@ UniValue PricesGetOrderbook()
entry.push_back(Pair("costbasis", m.second[i].averageCostbasis)); entry.push_back(Pair("costbasis", m.second[i].averageCostbasis));
entry.push_back(Pair("leverage", m.second[i].leverage)); entry.push_back(Pair("leverage", m.second[i].leverage));
entry.push_back(Pair("equity", m.second[i].equity)); entry.push_back(Pair("equity", m.second[i].equity));
std::cerr << "PricesGetOrderbook 1 m.second[i].isUp=" << m.second[i].isUp << " i=" << i << std::endl; //std::cerr << "PricesGetOrderbook 1 m.second[i].isUp=" << m.second[i].isUp << " i=" << i << std::endl;
entry.push_back(Pair("isUpPosition", (m.second[i].isUp ? 1 : 0))); entry.push_back(Pair("isUpPosition", (m.second[i].isUp ? 1 : 0)));
resbook.push_back(entry); resbook.push_back(entry);
} }
mathedBookHeader.push_back(Pair("positions", resbook)); resheader.push_back(Pair("positions", resbook));
mathedBookHeader.push_back(Pair("DiffLeveragedPosition", matchedTotals[m.first].diffLeveragedPosition)); resheader.push_back(Pair("DiffLeveragedPosition", matchedTotals[m.first].diffLeveragedPosition));
result.push_back(Pair(m.first, mathedBookHeader)); result.push_back(Pair(m.first, resheader));
} }
int64_t totalLiabilities = 0; //int64_t totalLiabilities = 0;
/* empty /* empty
for (int i = 0; i < book.size(); i++) { for (int i = 0; i < book.size(); i++) {
if (book[i].isOpen) { if (book[i].isOpen) {
@@ -2251,10 +2315,10 @@ UniValue PricesGetOrderbook()
} }
} */ } */
result.push_back(Pair("TotalFund", ValueFromAmount(totalfund))); result.push_back(Pair("TotalFund", ValueFromAmount(fundTotals.totalFund)));
result.push_back(Pair("TotalRekt", ValueFromAmount(totalRekt))); result.push_back(Pair("TotalRekt", ValueFromAmount(fundTotals.totalRekt)));
result.push_back(Pair("TotalBets", ValueFromAmount(totalBets))); result.push_back(Pair("TotalBets", ValueFromAmount(fundTotals.totalBets)));
result.push_back(Pair("TotalEquity", ValueFromAmount(totalEquity))); result.push_back(Pair("TotalEquity", ValueFromAmount(fundTotals.totalEquity)));
// result.push_back(Pair("TotalLiabilities", ValueFromAmount(totalLiabilities))); // result.push_back(Pair("TotalLiabilities", ValueFromAmount(totalLiabilities)));