diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 679c77ef5..036c2f395 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -200,14 +200,14 @@ std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std:: { mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,assetsupply,mypk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(cp->CChexstr) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeAssetCreateOpRet('c',Mypubkey(),name,description))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetCreateOpRet('c',Mypubkey(),name,description))); } return(0); } std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector destpubkey,int64_t total) { - CMutableTransaction mtx; CPubKey mypk; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C; if ( total < 0 ) { fprintf(stderr,"negative total %lld\n",(long long)total); @@ -224,6 +224,7 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector des { for (i=0; i 0 ) { if ( inputs > total ) @@ -232,7 +233,7 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector des mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,total,pubkey2pk(destpubkey))); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } else fprintf(stderr,"not enough CC asset inputs for %.8f\n",(double)total/COIN); //} else fprintf(stderr,"numoutputs.%d != numamounts.%d\n",n,(int32_t)amounts.size()); } @@ -264,14 +265,14 @@ std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64 if ( AddNormalinputs(mtx,mypk,bidamount+txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,bidamount,GetUnspendable(cp,0))); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeAssetOpRet('b',assetid,zeroid,pricetotal,Mypubkey()))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('b',assetid,zeroid,pricetotal,Mypubkey()))); } return(0); } std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t pricetotal) { - CMutableTransaction mtx; CPubKey mypk; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C; if ( askamount < 0 || pricetotal < 0 ) { fprintf(stderr,"negative askamount %lld, askamount %lld\n",(long long)pricetotal,(long long)askamount); @@ -283,6 +284,7 @@ std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t p mypk = pubkey2pk(Mypubkey()); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { + mask = ~((1LL << mtx.vin.size()) - 1); if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 ) { if ( inputs < askamount ) @@ -293,7 +295,7 @@ std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t p if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); opret = EncodeAssetOpRet('s',assetid,zeroid,pricetotal,Mypubkey()); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"need some assets to place ask\n"); } fprintf(stderr,"need some native coins to place ask\n"); @@ -302,7 +304,7 @@ std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t p std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 assetid2,int64_t pricetotal) { - CMutableTransaction mtx; CPubKey mypk; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C; if ( askamount < 0 || pricetotal < 0 ) { fprintf(stderr,"negative askamount %lld, askamount %lld\n",(long long)pricetotal,(long long)askamount); @@ -314,6 +316,7 @@ std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 a mypk = pubkey2pk(Mypubkey()); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { + mask = ~((1LL << mtx.vin.size()) - 1); if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 ) { if ( inputs < askamount ) @@ -329,7 +332,7 @@ std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 a { opret = EncodeAssetOpRet('e',assetid,assetid2,pricetotal,Mypubkey()); } - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"need some assets to place ask\n"); } fprintf(stderr,"need some native coins to place ask\n"); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 94d8d5b2c..eab868620 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -72,7 +72,7 @@ bool Myprivkey(uint8_t myprivkey[]); int64_t CCduration(uint256 txid); // CCtx -std::string FinalizeCCTx(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret); +std::string FinalizeCCTx(uint64_t skipmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret); void SetCCunspents(std::vector > &unspentOutputs,char *coinaddr); void SetCCtxids(std::vector > &addressIndex,char *coinaddr); uint64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,uint64_t total,int32_t maxinputs); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 1620773ee..595b87fd6 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -38,21 +38,25 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,uint64_t utxovalue,const CScri #endif } -std::string FinalizeCCTx(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) +std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) { auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t vinimask=0,utxovalues[64],change,totaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*cond; CPubKey unspendablepk; + CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask,nmask,vinimask=0,utxovalues[64],change,totaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*cond; CPubKey unspendablepk; n = mtx.vout.size(); for (i=0; i 64 ) { fprintf(stderr,"FinalizeCCTx: %d is too many vins\n",n); return(0); } + nmask = (1LL << n) - 1; + if ( (mask & nmask) != (CCmask & mask) ) + fprintf(stderr,"mask.%llx vs CCmask.%llx\n",(mask & nmask),(CCmask & mask)); Myprivkey(myprivkey); unspendablepk = GetUnspendable(cp,unspendablepriv); GetCCaddress(cp,myaddr,mypk); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index ceddd40ae..af92b69a3 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -228,7 +228,7 @@ bool Myprivkey(uint8_t myprivkey[]) if ( pwalletMain->GetKey(keyID,vchSecret) != 0 ) { memcpy(myprivkey,vchSecret.begin(),32); - if ( 1 ) + if ( 0 ) { for (i=0; i<32; i++) fprintf(stderr,"0x%02x, ",myprivkey[i]); diff --git a/src/cc/auction.cpp b/src/cc/auction.cpp index 1be6a50aa..18e4acbe3 100644 --- a/src/cc/auction.cpp +++ b/src/cc/auction.cpp @@ -159,7 +159,7 @@ std::string AuctionBid(uint64_t txfee,uint256 itemhash,uint64_t amount) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_AUCTION,CCchange,Auctionpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Auction inputs\n"); return(0); } @@ -179,7 +179,7 @@ std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_AUCTION,CCchange,Auctionpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Auction inputs\n"); return(0); } @@ -195,7 +195,7 @@ std::string AuctionPost(uint64_t txfee,uint256 itemhash,uint64_t minbid,char *ti if ( AddNormalinputs(mtx,mypk,txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_AUCTION,funds,Auctionpk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } return(0); } diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index a551fed1c..ec6e0528b 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -159,7 +159,7 @@ std::string DiceBet(uint64_t txfee,uint64_t amount,uint64_t odds) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_DICE,CCchange,dicepk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find dice inputs\n"); return(0); } @@ -175,7 +175,7 @@ std::string DiceFund(uint64_t txfee,uint64_t funds) if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_DICE,funds,dicepk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } return(0); } diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index b9071e621..7b2c33705 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -166,7 +166,7 @@ std::string FaucetGet(uint64_t txfee) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find faucet inputs\n"); return(0); } @@ -182,7 +182,7 @@ std::string FaucetFund(uint64_t txfee,uint64_t funds) if ( AddNormalinputs(mtx,mypk,funds+txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,funds,faucetpk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } return(0); } diff --git a/src/cc/lotto.cpp b/src/cc/lotto.cpp index ee8db7c39..abe11f46c 100644 --- a/src/cc/lotto.cpp +++ b/src/cc/lotto.cpp @@ -159,7 +159,7 @@ std::string LottoTicket(uint64_t txfee,uint64_t numtickets) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_LOTTO,CCchange,Lottopk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Lotto inputs\n"); return(0); } @@ -175,7 +175,7 @@ std::string LottoWinner(uint64_t txfee) if ( AddNormalinputs(mtx,mypk,txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_LOTTO,winnings,Lottopk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } return(0); } diff --git a/src/cc/ponzi.cpp b/src/cc/ponzi.cpp index 19e00bc2b..2eef28dd6 100644 --- a/src/cc/ponzi.cpp +++ b/src/cc/ponzi.cpp @@ -159,7 +159,7 @@ std::string PonziBuy(uint64_t txfee,uint64_t amount) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_PONZI,CCchange,ponzipk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find ponzi inputs\n"); return(0); } @@ -175,7 +175,7 @@ std::string PonziClaim(uint64_t txfee) if ( AddNormalinputs(mtx,mypk,txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(EVAL_PONZI,funds,ponzipk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,opret)); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } return(0); } diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 1fc282e03..f8fd40210 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -330,7 +330,7 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 { mtx.vout.push_back(MakeCC1vout(cp->evalcode,funds,rewardspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(rewardspk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeRewardsFundingOpRet('F',sbits,APR,minseconds,maxseconds,mindeposit))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsFundingOpRet('F',sbits,APR,minseconds,maxseconds,mindeposit))); } fprintf(stderr,"cant find enough inputs\n"); return(0); @@ -359,7 +359,7 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i if ( AddNormalinputs(mtx,mypk,amount+txfee,64) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,rewardspk)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeRewardsOpRet('A',sbits,fundingtxid))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsOpRet('A',sbits,fundingtxid))); } else fprintf(stderr,"cant find enough inputs\n"); fprintf(stderr,"cant find fundingtxid\n"); return(0); @@ -395,7 +395,7 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t { mtx.vout.push_back(MakeCC1vout(cp->evalcode,deposit,rewardspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeRewardsOpRet('L',sbits,fundingtxid))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsOpRet('L',sbits,fundingtxid))); } else fprintf(stderr,"cant find enough inputs %.8f note enough for %.8f\n",(double)funding/COIN,(double)deposit/COIN); } fprintf(stderr,"cant find rewards inputs\n"); @@ -437,7 +437,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 CCchange = (inputs - (amount + reward + txfee)); mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,rewardspk)); mtx.vout.push_back(CTxOut(amount+reward,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); + return(FinalizeCCTx(-1,cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); } fprintf(stderr,"cant find enough rewards inputs\n"); }