diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 259b33ab6..b7186e317 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -28,9 +28,6 @@ #include #include -/* - A very important thing to make sure is that the change calculation is correct and takes care of handling transitions from CC outputs to normal, and vice versa - */ #define SMALLVAL 0.000000000000001 diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 8c8a3328a..00feefa41 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -85,7 +85,7 @@ selloffer: vin.0: normal input - vin.1: valid CC output for sale + vin.1+: valid CC output for sale vout.0: vin.1 assetoshis output to CC to unspendable vout.1: CC output for change (if any) vout.2: normal output for change (if any) @@ -93,7 +93,7 @@ exchange: vin.0: normal input - vin.1: valid CC output + vin.1+: valid CC output vout.0: vin.1 assetoshis output to CC to unspendable vout.1: CC output for change (if any) vout.2: normal output for change (if any) @@ -227,10 +227,19 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx return eval->Invalid("mismatched origpubkeys for fillbuy"); else { - if ( ConstrainVout(tx.vout[1],0,0,0) == 0 ) + if ( nValue != tx.vout[0].nValue+tx.vout[1].nValue ) + return eval->Invalid("locked value doesnt match vout0+1 fillbuy"); + else if ( tx.vout[3].scriptPubKey.IsPayToCryptoCondition() != 0 ) + { + if ( ConstrainVout(tx.vout[2],1,CCaddr,0) == 0 ) + return eval->Invalid("vout2 doesnt go to origpubkey fillbuy"); + else if ( inputs != tx.vout[2].nValue+tx.vout[3].nValue ) + return eval->Invalid("asset inputs doesnt match vout2+3 fillbuy"); + } + else if ( ConstrainVout(tx.vout[2],1,CCaddr,inputs) == 0 ) + return eval->Invalid("vout2 doesnt match inputs fillbuy"); + else if ( ConstrainVout(tx.vout[1],0,0,0) == 0 ) return eval->Invalid("vout1 is CC for fillbuy"); - else if ( ConstrainVout(tx.vout[2],1,CCaddr,0) == 0 ) - return eval->Invalid("vout1 is normal for fillbuy"); else if ( ValidateBidRemainder(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 ) @@ -245,17 +254,17 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx case 's': // selloffer case 'e': // exchange //vin.0: normal input - //vin.1: valid CC output for sale + //vin.1+: valid CC output for sale //vout.0: vin.1 assetoshis output to CC to unspendable //vout.1: normal output for change (if any) //'s'.vout.n-1: opreturn [EVAL_ASSETS] ['s'] [assetid] [amount of native coin required] [origpubkey] //'e'.vout.n-1: opreturn [EVAL_ASSETS] ['e'] [assetid] [assetid2] [amount of asset2 required] [origpubkey] if ( remaining_price == 0 ) return eval->Invalid("illegal null remaining_price for selloffer"); - else if ( ConstrainVout(tx.vout[0],1,(char *)cp->unspendableCCaddr,0) == 0 ) + else if ( ConstrainVout(tx.vout[0],1,(char *)cp->unspendableCCaddr,inputs) == 0 ) return eval->Invalid("mismatched vout0 AssetsCCaddr for selloffer"); //fprintf(stderr,"remaining.%d for sell\n",(int32_t)remaining_price); - preventCCvouts = 2; + preventCCvouts = 1; break; case 'x': // cancel @@ -284,13 +293,15 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx if ( (assetoshis= AssetValidateSellvin(cp,eval,totalunits,tmporigpubkey,CCaddr,origaddr,tx,assetid)) == 0 ) return(false); else if ( numvouts < 3 ) - return eval->Invalid("not enough vouts for fill"); + return eval->Invalid("not enough vouts for fillask"); else if ( tmporigpubkey != origpubkey ) - return eval->Invalid("mismatched origpubkeys for fill"); + return eval->Invalid("mismatched origpubkeys for fillask"); else { + if ( assetoshis != tx.vout[0].nValue+tx.vout[1].nValue ) + return eval->Invalid("locked value doesnt match vout0+1 fillask"); if ( ValidateAskRemainder(remaining_price,tx.vout[0].nValue,assetoshis,tx.vout[1].nValue,tx.vout[2].nValue,totalunits) == false ) - return eval->Invalid("mismatched remainder for fill"); + return eval->Invalid("mismatched remainder for fillask"); else if ( ConstrainVout(tx.vout[1],1,0,0) == 0 ) return eval->Invalid("normal vout1 for fillask"); else if ( ConstrainVout(tx.vout[2],0,origaddr,0) == 0 )