From 75b63facf38b68fbf3bbc5f561a9ef8c802022b3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 23 Jul 2018 01:43:03 -1100 Subject: [PATCH] Sell flag --- src/cc/CCassets.h | 4 ++-- src/cc/CCassetsCore.cpp | 12 ++++-------- src/cc/CCassetstx.cpp | 8 ++++---- src/cc/assets.cpp | 8 ++------ 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/cc/CCassets.h b/src/cc/CCassets.h index 9a3ed33dc..976a2c2da 100644 --- a/src/cc/CCassets.h +++ b/src/cc/CCassets.h @@ -37,8 +37,8 @@ CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,uint64_ uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,uint64_t &price,std::vector &origpubkey); bool SetAssetOrigpubkey(std::vector &origpubkey,uint64_t &price,const CTransaction &tx); uint64_t IsAssetvout(uint64_t &price,std::vector &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid); -bool ValidateAssetRemainder(uint64_t remaining_price,uint64_t remaining_nValue,uint64_t orig_nValue,uint64_t received_nValue,uint64_t paidprice,uint64_t totalprice); -bool SetAssetFillamounts(uint64_t &paid,uint64_t &remaining_price,uint64_t orig_nValue,uint64_t &received,uint64_t totalprice); +bool ValidateAssetRemainder(int32_t sellflag,uint64_t remaining_price,uint64_t remaining_nValue,uint64_t orig_nValue,uint64_t received_nValue,uint64_t paidprice,uint64_t totalprice); +bool SetAssetFillamounts(int32_t sellflag,uint64_t &paid,uint64_t &remaining_price,uint64_t orig_nValue,uint64_t &received,uint64_t totalprice); uint64_t AssetValidateBuyvin(Eval* eval,uint64_t &tmpprice,std::vector &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid); uint64_t AssetValidateSellvin(Eval* eval,uint64_t &tmpprice,std::vector &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 assetid); bool AssetExactAmounts(uint64_t &inputs,uint64_t &outputs,Eval* eval,const CTransaction &tx,uint256 assetid); diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index 68493d33e..59d64f0b3 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -38,7 +38,7 @@ We assume that the effective unit cost in the orderbook is valid and that that amount was paid and also that any remainder will be close enough in effective unit cost to not matter. At the edge cases, this will probably be not true and maybe some orders wont be practically fillable when reduced to fractional state. However, the original pubkey that created the offer can always reclaim it. */ -bool ValidateAssetRemainder(uint64_t remaining_price,uint64_t remaining_nValue,uint64_t orig_nValue,uint64_t received_nValue,uint64_t paidunits,uint64_t totalunits) +bool ValidateAssetRemainder(int32_t sellflag,uint64_t remaining_price,uint64_t remaining_nValue,uint64_t orig_nValue,uint64_t received_nValue,uint64_t paidunits,uint64_t totalunits) { uint64_t unitprice,recvunitprice,newunitprice=0; if ( orig_nValue == 0 || received_nValue == 0 || paidunits == 0 || totalunits == 0 ) @@ -60,7 +60,7 @@ bool ValidateAssetRemainder(uint64_t remaining_price,uint64_t remaining_nValue,u { unitprice = (orig_nValue * COIN) / totalunits; recvunitprice = (received_nValue * COIN) / paidunits; - if ( recvunitprice < unitprice ) + if ( (sellflag == 0 && recvunitprice < unitprice) || (sellflag != 0 && recvunitprice > unitprice) ) { fprintf(stderr,"recvunitprice %llu < %llu unitprice\n",(long long)recvunitprice,(long long)unitprice); return(false); @@ -72,11 +72,7 @@ bool ValidateAssetRemainder(uint64_t remaining_price,uint64_t remaining_nValue,u return(true); } -/* - SetAssetFillamounts(paid_amount,remaining_required,bidamount,fillamount,origprice); - */ - -bool SetAssetFillamounts(uint64_t &received_nValue,uint64_t &remaining_price,uint64_t orig_nValue,uint64_t &paidunits,uint64_t totalunits) +bool SetAssetFillamounts(int32_t sellflag,uint64_t &received_nValue,uint64_t &remaining_price,uint64_t orig_nValue,uint64_t &paidunits,uint64_t totalunits) { uint64_t remaining_nValue,unitprice; if ( totalunits == 0 ) @@ -97,7 +93,7 @@ bool SetAssetFillamounts(uint64_t &received_nValue,uint64_t &remaining_price,uin if ( unitprice > 0 && (received_nValue= (paidunits * unitprice)/COIN) > 0 && received_nValue < orig_nValue ) { remaining_nValue = (orig_nValue - received_nValue); - return(ValidateAssetRemainder(remaining_price,remaining_nValue,orig_nValue,received_nValue,paidunits,totalunits)); + return(ValidateAssetRemainder(sellflag,remaining_price,remaining_nValue,orig_nValue,received_nValue,paidunits,totalunits)); } else return(false); } diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 6ad2519d2..7c290ff56 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -232,7 +232,7 @@ std::string FillBuyOffer(uint64_t txfee,uint256 assetid,uint256 bidtxid,uint64_t { if ( inputs > fillamount ) CCchange = (inputs - fillamount); - SetAssetFillamounts(paid_amount,remaining_required,bidamount,fillamount,origprice); + SetAssetFillamounts(0,paid_amount,remaining_required,bidamount,fillamount,origprice); mtx.vout.push_back(MakeAssetsVout(bidamount - paid_amount,GetUnspendable(EVAL_ASSETS,0))); mtx.vout.push_back(CTxOut(paid_amount,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); mtx.vout.push_back(MakeAssetsVout(fillamount,pubkey2pk(origpubkey))); @@ -248,7 +248,7 @@ std::string FillBuyOffer(uint64_t txfee,uint256 assetid,uint256 bidtxid,uint64_t std::string FillSell(uint64_t txfee,uint256 assetid,uint256 assetid2,uint256 asktxid,uint64_t fillamount) { - CTransaction vintx,filltx; uint256 hashBlock; CMutableTransaction mtx; CPubKey mypk; std::vector origpubkey; int32_t askvout=0; uint64_t origprice,askamount,paid_amount,remaining_required,inputs,CCchange=0; + CTransaction vintx,filltx; uint256 hashBlock; CMutableTransaction mtx; CPubKey mypk; std::vector origpubkey; int32_t askvout=0; uint64_t totalunits,askamount,paid_amount,remaining_required,inputs,CCchange=0; if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); @@ -257,7 +257,7 @@ std::string FillSell(uint64_t txfee,uint256 assetid,uint256 assetid2,uint256 ask if ( GetTransaction(asktxid,vintx,hashBlock,false) != 0 ) { askamount = vintx.vout[askvout].nValue; - SetAssetOrigpubkey(origpubkey,origprice,vintx); + SetAssetOrigpubkey(origpubkey,totalunits,vintx); mtx.vin.push_back(CTxIn(asktxid,askvout,CScript())); if ( assetid2 == zeroid ) inputs = AddAssetInputs(mtx,mypk,assetid2,fillamount,60); @@ -266,7 +266,7 @@ std::string FillSell(uint64_t txfee,uint256 assetid,uint256 assetid2,uint256 ask { if ( assetid2 == zeroid && inputs > fillamount ) CCchange = (inputs - fillamount); - SetAssetFillamounts(paid_amount,remaining_required,askamount,fillamount,origprice); + SetAssetFillamounts(1,paid_amount,remaining_required,askamount,fillamount,totalunits); mtx.vout.push_back(MakeAssetsVout(askamount - paid_amount,GetUnspendable(EVAL_ASSETS,0))); mtx.vout.push_back(MakeAssetsVout(paid_amount,mypk)); mtx.vout.push_back(MakeAssetsVout(fillamount,pubkey2pk(origpubkey))); diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 522519289..22f737a62 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -220,7 +220,7 @@ bool AssetValidate(Eval* eval,const CTransaction &tx,int32_t numvouts,uint8_t fu return eval->Invalid("vout1 is CC for fillbuy"); else if ( ConstrainVout(tx.vout[2],1,CCaddr,0) == 0 ) return eval->Invalid("vout2 is normal for fillbuy"); - else if ( ValidateAssetRemainder(remaining_price,tx.vout[0].nValue,nValue,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) + else if ( ValidateAssetRemainder(0,remaining_price,tx.vout[0].nValue,nValue,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) return eval->Invalid("mismatched remainder for fillbuy"); else if ( remaining_price != 0 ) { @@ -288,11 +288,7 @@ bool AssetValidate(Eval* eval,const CTransaction &tx,int32_t numvouts,uint8_t fu return eval->Invalid("mismatched origpubkeys for fill"); else { - // if ( ValidateAssetRemainder(remaining_price,tx.vout[0].nValue,nValue,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) - //bool ValidateAssetRemainder(uint64_t remaining_price,uint64_t remaining_nValue,uint64_t orig_nValue,uint64_t received_nValue,uint64_t paidunits,uint64_t totalunits) - - - if ( ValidateAssetRemainder(remaining_price,tx.vout[0].nValue,assetoshis,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) + if ( ValidateAssetRemainder(1,remaining_price,tx.vout[0].nValue,assetoshis,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) return eval->Invalid("mismatched remainder for fill"); else if ( ConstrainVout(tx.vout[1],1,0,0) == 0 ) return eval->Invalid("normal vout1 for fillask");