added 'add bet funds'
added comments
This commit is contained in:
@@ -239,7 +239,7 @@ int32_t prices_syntheticvec(std::vector<uint16_t> &vec,std::vector<std::string>
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate price for synthetic expression
|
// calculates price for synthetic expression
|
||||||
int64_t prices_syntheticprice(std::vector<uint16_t> vec,int32_t height,int32_t minmax,int16_t leverage)
|
int64_t prices_syntheticprice(std::vector<uint16_t> vec,int32_t height,int32_t minmax,int16_t leverage)
|
||||||
{
|
{
|
||||||
int32_t i,value,errcode,depth,retval = -1;
|
int32_t i,value,errcode,depth,retval = -1;
|
||||||
@@ -261,7 +261,7 @@ int64_t prices_syntheticprice(std::vector<uint16_t> vec,int32_t height,int32_t m
|
|||||||
if ( prices_extract(pricedata,height,1,value) == 0 )
|
if ( prices_extract(pricedata,height,1,value) == 0 )
|
||||||
{
|
{
|
||||||
// push price to the prices stack
|
// push price to the prices stack
|
||||||
if ( minmax == 0 )
|
if ( !minmax )
|
||||||
pricestack[depth] = pricedata[2]; // use smoothed value if we are over 24h
|
pricestack[depth] = pricedata[2]; // use smoothed value if we are over 24h
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -392,7 +392,8 @@ int64_t prices_syntheticprice(std::vector<uint16_t> vec,int32_t height,int32_t m
|
|||||||
return(price / den);
|
return(price / den);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t prices_syntheticprofits(bool isCalcCostBasis, int64_t &costbasis,int32_t firstheight,int32_t height,int16_t leverage,std::vector<uint16_t> vec,int64_t positionsize,int64_t addedbets)
|
// calculates profit/loss for the bet
|
||||||
|
int64_t prices_syntheticprofits(bool calcCostbasis, int64_t &costbasis, int32_t firstheight, int32_t height, int16_t leverage, std::vector<uint16_t> vec, int64_t positionsize, int64_t addedbets)
|
||||||
{
|
{
|
||||||
int64_t price, profits = 0;
|
int64_t price, profits = 0;
|
||||||
|
|
||||||
@@ -403,15 +404,17 @@ int64_t prices_syntheticprofits(bool isCalcCostBasis, int64_t &costbasis,int32_t
|
|||||||
fprintf(stderr, "unexpected zero synthetic price at height.%d\n", height);
|
fprintf(stderr, "unexpected zero synthetic price at height.%d\n", height);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
if (isCalcCostBasis) {
|
if (calcCostbasis) {
|
||||||
if (minmax) // if we are within day window, set costbasis to max or min value
|
if (minmax) { // if we are within day window, set costbasis to max or min price value
|
||||||
{
|
|
||||||
if (leverage > 0 && price > costbasis)
|
if (leverage > 0 && price > costbasis)
|
||||||
costbasis = price; // set costbasis
|
costbasis = price; // set costbasis
|
||||||
else if (leverage < 0 && (costbasis == 0 || price < costbasis))
|
else if (leverage < 0 && (costbasis == 0 || price < costbasis))
|
||||||
costbasis = price;
|
costbasis = price;
|
||||||
// else -> use the previous value
|
// else -> use the previous value
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
costbasis = price; // smoothed value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
profits = costbasis > 0 ? ((price * SATOSHIDEN) / costbasis) - SATOSHIDEN : 0;
|
profits = costbasis > 0 ? ((price * SATOSHIDEN) / costbasis) - SATOSHIDEN : 0;
|
||||||
@@ -456,14 +459,41 @@ int64_t prices_costbasis(CTransaction bettx)
|
|||||||
return costbasis;
|
return costbasis;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cerr << "prices_costbasis() cannot load costbasis tx or decode opret" << " isLoaded=" << isLoaded << " funcId=" << funcId << std::endl;
|
std::cerr << "prices_costbasis() cannot load costbasis tx or decode opret" << " isLoaded=" << isLoaded << " funcId=" << (int)funcId << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculates added bet total, returns the last baton txid
|
||||||
int64_t prices_batontxid(uint256 &batontxid,CTransaction bettx,uint256 bettxid)
|
int64_t prices_batontxid(uint256 &batontxid,CTransaction bettx,uint256 bettxid)
|
||||||
{
|
{
|
||||||
int64_t addedbets = 0;
|
int64_t addedbets = 0;
|
||||||
|
int32_t vini;
|
||||||
|
int32_t height;
|
||||||
|
int32_t retcode;
|
||||||
|
|
||||||
// iterate through batons, adding up vout1 -> addedbets
|
// iterate through batons, adding up vout1 -> addedbets
|
||||||
|
while ((retcode = CCgetspenttxid(batontxid, vini, height, bettxid, 1)) == 0) {
|
||||||
|
|
||||||
|
CTransaction txBaton;
|
||||||
|
uint256 hashBlock;
|
||||||
|
uint256 bettxid;
|
||||||
|
CPubKey pk;
|
||||||
|
bool isLoaded = false;
|
||||||
|
uint8_t funcId = 0;
|
||||||
|
int64_t amount;
|
||||||
|
|
||||||
|
if ((isLoaded = myGetTransaction(batontxid, txBaton, hashBlock)) &&
|
||||||
|
txBaton.vout.size() > 0 &&
|
||||||
|
(funcId = prices_addopretdecode(txBaton.vout.back().scriptPubKey, bettxid, pk, amount)) != 0) {
|
||||||
|
addedbets += amount;
|
||||||
|
std::cerr << "prices_batontxid() added amount=" << amount << std::endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cerr << "prices_batontxid() cannot load or decode add bet tx, isLoaded=" << isLoaded << " funcId=" << (int)funcId << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return(addedbets);
|
return(addedbets);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,7 +523,7 @@ UniValue PricesBet(uint64_t txfee,int64_t amount,int16_t leverage,std::vector<st
|
|||||||
if ( AddNormalinputs(mtx,mypk,amount+5*txfee,64) >= amount+5*txfee )
|
if ( AddNormalinputs(mtx,mypk,amount+5*txfee,64) >= amount+5*txfee )
|
||||||
{
|
{
|
||||||
betamount = (amount * 199) / 200;
|
betamount = (amount * 199) / 200;
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); // baton for total funding
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); // vout0 baton for total funding
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,(amount-betamount)+2*txfee,pricespk));
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode,(amount-betamount)+2*txfee,pricespk));
|
||||||
mtx.vout.push_back(MakeCC1of2vout(cp->evalcode,betamount,pricespk,mypk));
|
mtx.vout.push_back(MakeCC1of2vout(cp->evalcode,betamount,pricespk,mypk));
|
||||||
mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG)); // marker
|
mtx.vout.push_back(CTxOut(txfee, CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG)); // marker
|
||||||
@@ -505,39 +535,40 @@ UniValue PricesBet(uint64_t txfee,int64_t amount,int16_t leverage,std::vector<st
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue PricesAddFunding(uint64_t txfee,uint256 bettxid,int64_t amount)
|
UniValue PricesAddFunding(uint64_t txfee, uint256 bettxid, int64_t amount)
|
||||||
{
|
{
|
||||||
int32_t nextheight = komodo_nextheight();
|
int32_t nextheight = komodo_nextheight();
|
||||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(),nextheight); UniValue result(UniValue::VOBJ);
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), nextheight); UniValue result(UniValue::VOBJ);
|
||||||
struct CCcontract_info *cp,C; CTransaction bettx; CPubKey pricespk,mypk; int64_t addedbets=0,betamount,firstprice; std::vector<uint16_t> vec; uint256 batontxid; std::string rawtx; char myaddr[64];
|
struct CCcontract_info *cp, C; CTransaction bettx; CPubKey pricespk, mypk; int64_t addedbets = 0, betamount, firstprice; std::vector<uint16_t> vec; uint256 batontxid; std::string rawtx; char myaddr[64];
|
||||||
cp = CCinit(&C,EVAL_PRICES);
|
cp = CCinit(&C, EVAL_PRICES);
|
||||||
if ( txfee == 0 )
|
if (txfee == 0)
|
||||||
txfee = PRICES_TXFEE;
|
txfee = PRICES_TXFEE;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
pricespk = GetUnspendable(cp,0);
|
pricespk = GetUnspendable(cp, 0);
|
||||||
GetCCaddress(cp,myaddr,mypk);
|
GetCCaddress(cp, myaddr, mypk);
|
||||||
if ( AddNormalinputs(mtx,mypk,amount+txfee,64) >= amount+txfee )
|
if (AddNormalinputs(mtx, mypk, amount + txfee, 64) >= amount + txfee)
|
||||||
{
|
{
|
||||||
if ( prices_batontxid(batontxid,bettx,bettxid) >= 0 )
|
if (prices_batontxid(batontxid, bettx, bettxid) >= 0)
|
||||||
{
|
{
|
||||||
mtx.vin.push_back(CTxIn(batontxid,0,CScript()));
|
mtx.vin.push_back(CTxIn(batontxid, 0, CScript()));
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,txfee,mypk)); // baton for total funding
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode, txfee, mypk)); // baton for total funding
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,pricespk));
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode, amount, pricespk));
|
||||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,prices_addopret(bettxid,mypk,amount));
|
rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, prices_addopret(bettxid, mypk, amount));
|
||||||
return(prices_rawtxresult(result,rawtx,0));
|
return(prices_rawtxresult(result, rawtx, 0));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.push_back(Pair("result","error"));
|
result.push_back(Pair("result", "error"));
|
||||||
result.push_back(Pair("error","couldnt find batonttxid"));
|
result.push_back(Pair("error", "couldnt find batonttxid"));
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result.push_back(Pair("result","error"));
|
result.push_back(Pair("result", "error"));
|
||||||
result.push_back(Pair("error","not enough funds"));
|
result.push_back(Pair("error", "not enough funds"));
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set cost basis (open price) for the bet
|
||||||
UniValue PricesSetcostbasis(int64_t txfee, uint256 bettxid)
|
UniValue PricesSetcostbasis(int64_t txfee, uint256 bettxid)
|
||||||
{
|
{
|
||||||
int32_t nextheight = komodo_nextheight();
|
int32_t nextheight = komodo_nextheight();
|
||||||
@@ -559,7 +590,7 @@ UniValue PricesSetcostbasis(int64_t txfee, uint256 bettxid)
|
|||||||
{
|
{
|
||||||
if (prices_betopretdecode(bettx.vout[numvouts - 1].scriptPubKey, pk, firstheight, positionsize, leverage, firstprice, vec, tokenid) == 'B')
|
if (prices_betopretdecode(bettx.vout[numvouts - 1].scriptPubKey, pk, firstheight, positionsize, leverage, firstprice, vec, tokenid) == 'B')
|
||||||
{
|
{
|
||||||
if (nextheight < firstheight + PRICES_DAYWINDOW) {
|
if (nextheight <= firstheight + PRICES_DAYWINDOW + PRICES_SMOOTHWIDTH) {
|
||||||
result.push_back(Pair("result", "error"));
|
result.push_back(Pair("result", "error"));
|
||||||
result.push_back(Pair("error", "cannot calculate costbasis yet"));
|
result.push_back(Pair("error", "cannot calculate costbasis yet"));
|
||||||
return(result);
|
return(result);
|
||||||
@@ -567,7 +598,7 @@ UniValue PricesSetcostbasis(int64_t txfee, uint256 bettxid)
|
|||||||
|
|
||||||
addedbets = prices_batontxid(batontxid, bettx, bettxid);
|
addedbets = prices_batontxid(batontxid, bettx, bettxid);
|
||||||
mtx.vin.push_back(CTxIn(bettxid, 1, CScript())); // spend vin1
|
mtx.vin.push_back(CTxIn(bettxid, 1, CScript())); // spend vin1
|
||||||
for (i = 0; i < PRICES_DAYWINDOW; i++) // we need a full day to check if there was a rekt
|
for (i = 0; i < PRICES_DAYWINDOW + PRICES_SMOOTHWIDTH; i++) // the last datum for 24h is the costbasis value
|
||||||
{
|
{
|
||||||
if ((profits = prices_syntheticprofits(true, costbasis, firstheight, firstheight + i, leverage, vec, positionsize, addedbets)) < 0)
|
if ((profits = prices_syntheticprofits(true, costbasis, firstheight, firstheight + i, leverage, vec, positionsize, addedbets)) < 0)
|
||||||
{ // we are in loss
|
{ // we are in loss
|
||||||
@@ -584,7 +615,7 @@ UniValue PricesSetcostbasis(int64_t txfee, uint256 bettxid)
|
|||||||
result.push_back(Pair("myfee", myfee));
|
result.push_back(Pair("myfee", myfee));
|
||||||
mtx.vout.push_back(CTxOut(myfee, CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
mtx.vout.push_back(CTxOut(myfee, CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode, bettx.vout[1].nValue - myfee - txfee, pricespk));
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode, bettx.vout[1].nValue - myfee - txfee, pricespk));
|
||||||
rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, prices_costbasisopret(bettxid, mypk, firstheight + PRICES_DAYWINDOW - 1, costbasis));
|
rawtx = FinalizeCCTx(0, cp, mtx, mypk, txfee, prices_costbasisopret(bettxid, mypk, firstheight + PRICES_DAYWINDOW /*- 1*/, costbasis));
|
||||||
return(prices_rawtxresult(result, rawtx, 0));
|
return(prices_rawtxresult(result, rawtx, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user