diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index 59d64f0b3..0a203b3f7 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -60,13 +60,13 @@ bool ValidateAssetRemainder(int32_t sellflag,uint64_t remaining_price,uint64_t r { unitprice = (orig_nValue * COIN) / totalunits; recvunitprice = (received_nValue * COIN) / paidunits; - if ( (sellflag == 0 && recvunitprice < unitprice) || (sellflag != 0 && recvunitprice > unitprice) ) - { - fprintf(stderr,"recvunitprice %llu < %llu unitprice\n",(long long)recvunitprice,(long long)unitprice); - return(false); - } if ( remaining_price != 0 ) newunitprice = (remaining_nValue * COIN) / remaining_price; + if ( recvunitprice < unitprice ) + { + fprintf(stderr,"error recvunitprice %.16f < %.16f unitprice, new unitprice %.16f\n",(double)recvunitprice/(COIN*COIN),(double)unitprice/(COIN*COIN),(double)newunitprice/(COIN*COIN)); + return(false); + } fprintf(stderr,"recvunitprice %.16f >= %.16f unitprice, new unitprice %.16f\n",(double)recvunitprice/(COIN*COIN),(double)unitprice/(COIN*COIN),(double)newunitprice/(COIN*COIN)); } return(true); diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index fcf64f42d..13efe1e47 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -54,17 +54,21 @@ uint64_t IsFaucetvout(const CTransaction& tx,int32_t v) return(0); } -bool FaucetExactAmounts(Eval* eval,const CTransaction &tx) +bool FaucetExactAmounts(Eval* eval,const CTransaction &tx,int32_t minage) { - CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; CBlockIndex *pindex; numvins = tx.vin.size(); numvouts = tx.vout.size(); - for (i=1; iGetTxUnconfirmed(tx.vin[i].prevout.hash,vinTx,hashBlock) == 0 ) return eval->Invalid("always should find vin, but didnt"); + else if ( (pindex= mapBlockIndex[hashBlock]) != 0 ) + return eval->Invalid("couldnt find pindex for hashBlock"); + else if ( pindex->nHeight <= 0 || pindex->nHeight > chainActive.LastTip()->nHeight ) + return eval->Invalid("vin is not eligible"); else if ( (assetoshis= IsFaucetvout(vinTx,tx.vin[i].prevout.n)) != 0 ) inputs += assetoshis; } @@ -81,7 +85,7 @@ bool FaucetExactAmounts(Eval* eval,const CTransaction &tx) bool FaucetValidate(Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; fprintf(stderr,"FaucetValidate\n"); numvins = tx.vin.size(); numvouts = tx.vout.size(); @@ -90,9 +94,20 @@ bool FaucetValidate(Eval* eval,const CTransaction &tx) return eval->Invalid("illegal asset vin0"); else if ( numvouts < 1 ) return eval->Invalid("no vouts"); - else if ( FaucetExactAmounts(eval,tx) == false ) + else if ( FaucetExactAmounts(eval,tx,1) == false ) eval->Invalid("asset inputs != outputs"); - else return(PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts)); + else + { + preventCCvouts = 1; + if ( (assetoshis= IsFaucetvout(tx,0)) != 0 ) + { + preventCCvouts++; + i = 1; + } else i = 0; + if ( tx.vin[i].nValue != COIN ) + return(false); + return(PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts)); + } } bool ProcessFaucet(Eval* eval, std::vector paramsNull,const CTransaction &ctx, unsigned int nIn)