@ -353,12 +353,12 @@ uint8_t ValidateTokenOpret(CTransaction tx, int32_t v, uint256 tokenid, std::vec
// goDeeper is true: the func also validates amounts of the passed transaction:
// it should be either sum(cc vins) == sum(cc vouts) or the transaction is the 'tokenbase' ('c') tx
// checkPubkeys is true: validates if the vout is token vout1 or token vout1of2. Should always be true!
int64_t IsTokensvout ( bool goDeeper , bool checkPubkeys , struct CCcontract_info * cp , Eval * eval , /*std::vector<uint8_t> &vopretExtra,*/ const CTransaction & tx , int32_t v , uint256 reftokenid , std : : vector < CPubKey > vinPubkeys000 )
int64_t IsTokensvout ( bool goDeeper , bool checkPubkeys , struct CCcontract_info * cp , Eval * eval , const CTransaction & tx , int32_t v , uint256 reftokenid )
{
// this is just for log messages indentation fur debugging recursive calls:
std : : string indentStr = std : : string ( ) . append ( tokenValIndentSize , ' . ' ) ;
std : : cerr < < indentStr < < " IsTokensvout() entered for txid= " < < tx . GetHash ( ) . GetHex ( ) < < " v= " < < v < < " for tokenid= " < < reftokenid . GetHex ( ) < < std : : endl ;
//std::cerr << indentStr << "IsTokensvout() entered for txid=" << tx.GetHash().GetHex() << " v=" << v << " for tokenid=" << reftokenid.GetHex() << std::endl;
//TODO: validate cc vouts are EVAL_TOKENS!
if ( tx . vout [ v ] . scriptPubKey . IsPayToCryptoCondition ( ) ) // maybe check address too? dimxy: possibly no, because there are too many cases with different addresses here
@ -393,7 +393,6 @@ int64_t IsTokensvout(bool goDeeper, bool checkPubkeys, struct CCcontract_info *c
// moved opret checking to this new reusable func (dimxy):
std : : vector < CPubKey > voutPubkeys ;
std : : vector < uint8_t > vopretExtra ;
//std::vector<uint8_t> vcontractOpret;
const uint8_t funcId = ValidateTokenOpret ( tx , v , reftokenid , voutPubkeys , vopretExtra ) ;
//std::cerr << indentStr << "IsTokensvout() ValidateTokenOpret returned=" << (char)(funcId?funcId:' ') << " for txid=" << tx.GetHash().GetHex() << " for tokenid=" << reftokenid.GetHex() << std::endl;
if ( funcId ! = 0 ) {
@ -401,12 +400,8 @@ int64_t IsTokensvout(bool goDeeper, bool checkPubkeys, struct CCcontract_info *c
if ( checkPubkeys & & funcId ! = ' c ' ) { // verify that the vout is token's (for 'c' there is no pubkeys!):
//CScript contractScript = CScript(vopretExtra);
//GetOpReturnData(contractScript, vcontractOpret);
std : : cerr < < " IsTokensvout() vopretExtra= " < < HexStr ( vopretExtra ) < < std : : endl ;
//std::cerr << "IsTokensvout() vcontractOpret=" << HexStr(vcontractOpret) << std::endl;;
//std::cerr << "IsTokensvout() vopretExtra=" << HexStr(vopretExtra) << std::endl;
uint8_t evalCodeInOpret ;
if ( vopretExtra . size ( ) > = 2 /*|| vopretExtra.size() != vopretExtra.begin()[0] <-- shold we check this?*/ ) {
std : : cerr < < " IsTokensvout() empty or incorrect contract opret " < < std : : endl ;
@ -448,7 +443,7 @@ int64_t IsTokensvout(bool goDeeper, bool checkPubkeys, struct CCcontract_info *c
CTxOut testTokenVout1 ;
testTokenVout1 = MakeCC1vout ( EVAL_TOKENS , tx . vout [ v ] . nValue , voutPubkeys [ 0 ] ) ;
if ( tx . vout [ v ] . scriptPubKey = = testTokenVout1 . scriptPubKey ) {
std : : cerr < < indentStr < < " IsTokensvout() this is single-eval token vout (i=0), returning nValue= " < < tx . vout [ v ] . nValue < < " for txid= " < < tx . GetHash ( ) . GetHex ( ) < < " for tokenid= " < < reftokenid . GetHex ( ) < < std : : endl ;
//std::cerr << indentStr << " IsTokensvout() this is single-eval token vout (i=0), returning nValue=" << tx.vout[v].nValue << " for txid=" << tx.GetHash().GetHex() << " for tokenid=" << reftokenid.GetHex() << std::endl;
return tx . vout [ v ] . nValue ;
}
@ -496,11 +491,8 @@ int64_t IsTokensvout(bool goDeeper, bool checkPubkeys, struct CCcontract_info *c
bool TokensExactAmounts ( bool goDeeper , struct CCcontract_info * cp , int64_t & inputs , int64_t & outputs , Eval * eval , const CTransaction & tx , uint256 tokenid )
{
CTransaction vinTx ;
uint256 hashBlock ; //, id, id2;
//int32_t flag;
uint256 hashBlock ;
int64_t tokenoshis ;
// std::vector<uint8_t> tmporigpubkey; int64_t tmpprice;
std : : vector < CPubKey > vinPubkeys000 ;
struct CCcontract_info * cpTokens , tokensC ;
cpTokens = CCinit ( & tokensC , EVAL_TOKENS ) ;
@ -512,8 +504,6 @@ bool TokensExactAmounts(bool goDeeper, struct CCcontract_info *cp, int64_t &inpu
// this is just for log messages indentation for debugging recursive calls:
std : : string indentStr = std : : string ( ) . append ( tokenValIndentSize , ' . ' ) ;
//ExtractTokensVinPubkeys(tx, vinPubkeys);
for ( int32_t i = 0 ; i < numvins ; i + + )
{ // check for additional contracts which may send tokens to the Tokens contract
if ( ( * cpTokens - > ismyvin ) ( tx . vin [ i ] . scriptSig ) /*|| IsVinAllowed(tx.vin[i].scriptSig) != 0*/ )
@ -528,8 +518,8 @@ bool TokensExactAmounts(bool goDeeper, struct CCcontract_info *cp, int64_t &inpu
else {
tokenValIndentSize + + ;
// validate vouts of vintx
std : : cerr < < indentStr < < " TokenExactAmounts() check vin i= " < < i < < " nValue= " < < vinTx . vout [ tx . vin [ i ] . prevout . n ] . nValue < < std : : endl ;
tokenoshis = IsTokensvout ( goDeeper , true , cpTokens , eval , /*tmporigpubkey,*/ vinTx , tx . vin [ i ] . prevout . n , tokenid , vinPubkeys000 ) ;
//std::cerr << indentStr << "TokenExactAmounts() check vin i=" << i << " nValue=" << vinTx.vout[tx.vin[i].prevout.n].nValue << std::endl;
tokenoshis = IsTokensvout ( goDeeper , true , cpTokens , eval , vinTx , tx . vin [ i ] . prevout . n , tokenid ) ;
tokenValIndentSize - - ;
if ( tokenoshis ! = 0 )
{
@ -547,7 +537,7 @@ bool TokensExactAmounts(bool goDeeper, struct CCcontract_info *cp, int64_t &inpu
// Note: we pass in here 'false' because we don't need to call TokenExactAmounts() recursively from IsTokensvout
// indeed, in this case we'll be checking this tx again
//std::cerr << indentStr << "TokenExactAmounts() check vout i=" << i << " nValue=" << tx.vout[i].nValue << std::endl;
tokenoshis = IsTokensvout ( false , true /*<--exclude non-tokens vouts*/ , cpTokens , eval , /* tmporigpubkey,*/ tx , i , tokenid , vinPubkeys000 ) ;
tokenoshis = IsTokensvout ( false , true /*<--exclude non-tokens vouts*/ , cpTokens , eval , tx , i , tokenid ) ;
tokenValIndentSize - - ;
if ( tokenoshis ! = 0 )
@ -601,11 +591,11 @@ int64_t AddTokenCCInputs(struct CCcontract_info *cp, CMutableTransaction &mtx, C
Getscriptaddress ( destaddr , vintx . vout [ vout ] . scriptPubKey ) ;
if ( strcmp ( destaddr , tokenaddr ) ! = 0 & & strcmp ( destaddr , cp - > unspendableCCaddr ) ! = 0 & & strcmp ( destaddr , cp - > unspendableaddr2 ) ! = 0 )
continue ;
fprintf ( stderr , " AddTokenCCInputs() check destaddress=%s vout amount=%.8f \n " , destaddr , ( double ) vintx . vout [ vout ] . nValue / COIN ) ;
//fprintf(stderr, " AddTokenCCInputs() check destaddress=%s vout amount=%.8f\n", destaddr, (double)vintx.vout[vout].nValue / COIN);
std : : vector < CPubKey > vinPubkeys ;
if ( ( nValue = IsTokensvout ( true , true /*<--add only checked uxtos */ , cp , NULL , /*vopretExtra,*/ vintx , vout , tokenid , vinPubkeys ) ) > 0 & & myIsutxo_spentinmempool ( txid , vout ) = = 0 )
if ( ( nValue = IsTokensvout ( true , true /*<--add only checked token uxtos */ , cp , NULL , vintx , vout , tokenid ) ) > 0 & & myIsutxo_spentinmempool ( txid , vout ) = = 0 )
{
if ( total ! = 0 & & maxinputs ! = 0 )
mtx . vin . push_back ( CTxIn ( txid , vout , CScript ( ) ) ) ;