From 98d151dd1dfbed34a618e069387ee5fac93bb48b Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 27 Jul 2018 22:11:45 -1100 Subject: [PATCH] Token swap ready for testing --- src/cc/CCassetsCore.cpp | 26 +++++++++++++------------- src/cc/assets.cpp | 37 +++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index ecff979ea..f61b7ee4e 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -130,7 +130,6 @@ bool SetAskFillamounts(int64_t &received_assetoshis,int64_t &remaining_nValue,in bool ValidateAskRemainder(int64_t remaining_nValue,int64_t remaining_assetoshis,int64_t orig_assetoshis,int64_t received_assetoshis,int64_t paid_nValue,int64_t total_nValue) { int64_t unitprice,recvunitprice,newunitprice=0; - fprintf(stderr,"%llu %llu %llu %llu %llu %llu\n",(long long)remaining_nValue,(long long)remaining_assetoshis,(long long)orig_assetoshis,(long long)received_assetoshis,(long long)paid_nValue,(long long)total_nValue); if ( orig_assetoshis == 0 || received_assetoshis == 0 || paid_nValue == 0 || total_nValue == 0 ) { fprintf(stderr,"ValidateAssetRemainder: orig_assetoshis == %llu || received_assetoshis == %llu || paid_nValue == %llu || total_nValue == %llu\n",(long long)orig_assetoshis,(long long)received_assetoshis,(long long)paid_nValue,(long long)total_nValue); @@ -162,38 +161,39 @@ bool ValidateAskRemainder(int64_t remaining_nValue,int64_t remaining_assetoshis, return(true); } -bool SetSwapFillamounts(int64_t &received_assetoshis,int64_t &remaining_nValue,int64_t orig_assetoshis,int64_t &paid_nValue,int64_t total_nValue) +bool SetSwapFillamounts(int64_t &received_assetoshis,int64_t &remaining_assetoshis2,int64_t orig_assetoshis,int64_t &paid_assetoshis2,int64_t total_assetoshis2) { int64_t remaining_assetoshis; double dunitprice; - if ( total_nValue == 0 ) + if ( total_assetoshis2 == 0 ) { - fprintf(stderr,"total_nValue.0 origsatoshis.%llu paid_nValue.%llu\n",(long long)orig_assetoshis,(long long)paid_nValue); - received_assetoshis = remaining_nValue = paid_nValue = 0; + fprintf(stderr,"total_assetoshis2.0 origsatoshis.%llu paid_assetoshis2.%llu\n",(long long)orig_assetoshis,(long long)paid_assetoshis2); + received_assetoshis = remaining_assetoshis2 = paid_assetoshis2 = 0; return(false); } - if ( paid_nValue >= total_nValue ) + if ( paid_assetoshis2 >= total_assetoshis2 ) { - paid_nValue = total_nValue; + paid_assetoshis2 = total_assetoshis2; received_assetoshis = orig_assetoshis; - remaining_nValue = 0; + remaining_assetoshis2 = 0; fprintf(stderr,"totally filled!\n"); return(true); } - remaining_nValue = (total_nValue - paid_nValue); - dunitprice = ((double)total_nValue / orig_assetoshis); - received_assetoshis = (paid_nValue / dunitprice); - fprintf(stderr,"remaining_nValue %.8f (%.8f - %.8f)\n",(double)remaining_nValue/COIN,(double)total_nValue/COIN,(double)paid_nValue/COIN); + remaining_assetoshis2 = (total_assetoshis2 - paid_assetoshis2); + dunitprice = ((double)total_assetoshis2 / orig_assetoshis); + received_assetoshis = (paid_assetoshis2 / dunitprice); + fprintf(stderr,"remaining_assetoshis2 %llu (%llu - %llu)\n",(long long)remaining_assetoshis2/COIN,(long long)total_assetoshis2/COIN,(long long)paid_assetoshis2/COIN); fprintf(stderr,"unitprice %.8f received_assetoshis %llu orig %llu\n",dunitprice/COIN,(long long)received_assetoshis,(long long)orig_assetoshis); if ( fabs(dunitprice) > SMALLVAL && received_assetoshis > 0 && received_assetoshis <= orig_assetoshis ) { remaining_assetoshis = (orig_assetoshis - received_assetoshis); - return(ValidateAskRemainder(remaining_nValue,remaining_assetoshis,orig_assetoshis,received_assetoshis,paid_nValue,total_nValue)); + return(ValidateAskRemainder(remaining_assetoshis2,remaining_assetoshis,orig_assetoshis,received_assetoshis,paid_assetoshis2,total_assetoshis2)); } else return(false); } bool ValidateSwapRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidunits,int64_t totalunits) { int64_t unitprice,recvunitprice,newunitprice=0; + fprintf(stderr,"%llu %llu %llu %llu %llu %llu\n",(long long)remaining_nValue,(long long)remaining_assetoshis,(long long)orig_assetoshis,(long long)received_assetoshis,(long long)paid_nValue,(long long)total_nValue); if ( orig_nValue == 0 || received_nValue == 0 || paidunits == 0 || totalunits == 0 ) { fprintf(stderr,"ValidateAssetRemainder: orig_nValue == %llu || received_nValue == %llu || paidunits == %llu || totalunits == %llu\n",(long long)orig_nValue,(long long)received_nValue,(long long)paidunits,(long long)totalunits); diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 00feefa41..1deb330f9 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -317,36 +317,45 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx case 'E': // fillexchange //vin.0: normal input //vin.1: unspendable.(vout.0 assetoshis from selloffer) sellTx.vout[0] - //'S'.vin.2+: normal output that satisfies selloffer (*tx.vin[2])->nValue - //'E'.vin.2+: valid CC assetid2 output that satisfies exchange (*tx.vin[2])->nValue + //vin.2+: valid CC assetid2 output that satisfies exchange (*tx.vin[2])->nValue //vout.0: remaining assetoshis -> unspendable //vout.1: vin.1 assetoshis to signer of vin.2 sellTx.vout[0].nValue -> any - //'S'.vout.2: vin.2 value to original pubkey [origpubkey] - //'E'.vout.2: vin.2 assetoshis2 to original pubkey [origpubkey] - //vout.3: normal output for change (if any) - //'S'.vout.n-1: opreturn [EVAL_ASSETS] ['S'] [assetid] [amount of coin still required] [origpubkey] - //'E'.vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey] + //vout.2: vin.2+ assetoshis2 to original pubkey [origpubkey] + //vout.3: CC output for asset2 change (if any) + //vout.3/4: normal output for change (if any) + //vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey] if ( AssetExactAmounts(cp,inputs,1,outputs,eval,tx,assetid2) == false ) eval->Invalid("asset2 inputs != outputs"); 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 fillex"); else if ( tmporigpubkey != origpubkey ) - return eval->Invalid("mismatched origpubkeys for fill"); + return eval->Invalid("mismatched origpubkeys for fillex"); else { + if ( assetoshis != tx.vout[0].nValue+tx.vout[1].nValue ) + return eval->Invalid("locked value doesnt match vout0+1 fillex"); + 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 fillex"); + else if ( inputs != tx.vout[2].nValue+tx.vout[3].nValue ) + return eval->Invalid("asset inputs doesnt match vout2+3 fillex"); + } + else if ( ConstrainVout(tx.vout[2],1,CCaddr,inputs) == 0 ) + return eval->Invalid("vout2 doesnt match inputs fillex"); + else if ( ConstrainVout(tx.vout[1],0,0,0) == 0 ) + return eval->Invalid("vout1 is CC for fillex"); fprintf(stderr,"assets vout0 %llu, vin1 %llu, vout2 %llu -> orig, vout1 %llu, total %llu\n",(long long)tx.vout[0].nValue,(long long)assetoshis,(long long)tx.vout[2].nValue,(long long)tx.vout[1].nValue,(long long)totalunits); if ( ValidateSwapRemainder(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 fillex"); else if ( ConstrainVout(tx.vout[1],1,0,0) == 0 ) - return eval->Invalid("normal vout1 for fillask"); - else if ( ConstrainVout(tx.vout[2],1,CCaddr,0) == 0 ) - return eval->Invalid("normal vout2 for fillask"); + return eval->Invalid("normal vout1 for fillex"); else if ( remaining_price != 0 ) { if ( ConstrainVout(tx.vout[0],1,(char *)cp->unspendableCCaddr,0) == 0 ) - return eval->Invalid("mismatched vout0 AssetsCCaddr for fill"); + return eval->Invalid("mismatched vout0 AssetsCCaddr for fillex"); } } fprintf(stderr,"fill validated\n");