bool findOutputsToAccount(const CryptoNote::TransactionPrefix& transaction, const AccountPublicAddress& addr, const SecretKey& viewSecretKey, std::vector<uint32_t>& out, uint64_t& amount) { AccountKeys keys; keys.address = addr; // only view secret key is used, spend key is not needed keys.viewSecretKey = viewSecretKey; Crypto::PublicKey txPubKey = getTransactionPublicKeyFromExtra(transaction.extra); amount = 0; size_t keyIndex = 0; uint32_t outputIndex = 0; Crypto::KeyDerivation derivation; generate_key_derivation(txPubKey, keys.viewSecretKey, derivation); for (const TransactionOutput& o : transaction.outputs) { assert(o.target.type() == typeid(KeyOutput)); if (o.target.type() == typeid(KeyOutput)) { if (is_out_to_acc(keys, boost::get<KeyOutput>(o.target), derivation, keyIndex)) { out.push_back(outputIndex); amount += o.amount; } ++keyIndex; } ++outputIndex; } return true; }
bool lookup_acc_outs(const account_keys& acc, const Transaction& tx, const crypto::public_key& tx_pub_key, std::vector<size_t>& outs, uint64_t& money_transfered) { money_transfered = 0; size_t keyIndex = 0; size_t outputIndex = 0; crypto::key_derivation derivation; generate_key_derivation(tx_pub_key, acc.m_view_secret_key, derivation); for (const TransactionOutput& o : tx.vout) { assert(o.target.type() == typeid(TransactionOutputToKey) || o.target.type() == typeid(TransactionOutputMultisignature)); if (o.target.type() == typeid(TransactionOutputToKey)) { if (is_out_to_acc(acc, boost::get<TransactionOutputToKey>(o.target), derivation, keyIndex)) { outs.push_back(outputIndex); money_transfered += o.amount; } ++keyIndex; } else if (o.target.type() == typeid(TransactionOutputMultisignature)) { keyIndex += boost::get<TransactionOutputMultisignature>(o.target).keys.size(); } ++outputIndex; } return true; }
bool lookup_acc_outs(const AccountKeys& acc, const Transaction& tx, const PublicKey& tx_pub_key, std::vector<size_t>& outs, uint64_t& money_transfered) { money_transfered = 0; size_t keyIndex = 0; size_t outputIndex = 0; KeyDerivation derivation; generate_key_derivation(tx_pub_key, acc.viewSecretKey, derivation); for (const TransactionOutput& o : tx.outputs) { assert(o.target.type() == typeid(KeyOutput) || o.target.type() == typeid(MultisignatureOutput)); if (o.target.type() == typeid(KeyOutput)) { if (is_out_to_acc(acc, boost::get<KeyOutput>(o.target), derivation, keyIndex)) { outs.push_back(outputIndex); money_transfered += o.amount; } ++keyIndex; } else if (o.target.type() == typeid(MultisignatureOutput)) { keyIndex += boost::get<MultisignatureOutput>(o.target).keys.size(); } ++outputIndex; } return true; }
bool is_out_to_acc(const AccountKeys& acc, const KeyOutput& out_key, const PublicKey& tx_pub_key, size_t keyIndex) { KeyDerivation derivation; generate_key_derivation(tx_pub_key, acc.viewSecretKey, derivation); return is_out_to_acc(acc, out_key, derivation, keyIndex); }
bool is_out_to_acc(const account_keys& acc, const TransactionOutputToKey& out_key, const crypto::public_key& tx_pub_key, size_t keyIndex) { crypto::key_derivation derivation; generate_key_derivation(tx_pub_key, acc.m_view_secret_key, derivation); return is_out_to_acc(acc, out_key, derivation, keyIndex); }