You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmonero/tests/bcstatus_tests.cpp

1235 lines
303 KiB

6 years ago
//
// Created by mwo on 15/06/18.
//
#include "../src/MicroCore.h"
#include "../src/CurrentBlockchainStatus.h"
#include "../src/ThreadRAII.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "helpers.h"
6 years ago
namespace
{
//using json = nlohmann::json;
6 years ago
using namespace std;
using namespace cryptonote;
using namespace epee::string_tools;
using namespace std::chrono_literals;
using ::testing::AllOf;
using ::testing::Ge;
using ::testing::Le;
using ::testing::HasSubstr;
using ::testing::Not;
6 years ago
using ::testing::Return;
using ::testing::Throw;
using ::testing::DoAll;
using ::testing::SetArgReferee;
using ::testing::SetArgPointee;
6 years ago
using ::testing::_;
6 years ago
using ::testing::internal::FilePath;
6 years ago
class MockMicroCore : public xmreg::MicroCore
{
public:
MOCK_METHOD2(init, bool(const string& _blockchain_path,
network_type nt));
MOCK_CONST_METHOD0(get_current_blockchain_height, uint64_t());
MOCK_CONST_METHOD2(get_block_from_height,
bool(uint64_t height, block& blk));
MOCK_CONST_METHOD2(get_blocks_range,
std::vector<block>(const uint64_t& h1,
const uint64_t& h2));
MOCK_CONST_METHOD3(get_transactions,
bool(const std::vector<crypto::hash>& txs_ids,
std::vector<transaction>& txs,
std::vector<crypto::hash>& missed_txs));
MOCK_CONST_METHOD1(have_tx, bool(crypto::hash const& tx_hash));
MOCK_CONST_METHOD2(tx_exists,
bool(crypto::hash const& tx_hash,
uint64_t& tx_id));
MOCK_CONST_METHOD2(get_output_tx_and_index,
tx_out_index(uint64_t const& amount,
uint64_t const& index));
MOCK_CONST_METHOD2(get_tx,
bool(crypto::hash const& tx_hash,
transaction& tx));
MOCK_METHOD3(get_output_key,
void(const uint64_t& amount,
const vector<uint64_t>& absolute_offsets,
vector<cryptonote::output_data_t>& outputs));
6 years ago
MOCK_METHOD2(get_output_key,
output_data_t(uint64_t amount,
uint64_t global_amount_index));
MOCK_CONST_METHOD1(get_tx_amount_output_indices,
std::vector<uint64_t>(uint64_t const& tx_id));
MOCK_CONST_METHOD2(get_random_outs_for_amounts,
bool(COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request const& req,
COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& res));
MOCK_CONST_METHOD2(get_outs,
bool(const COMMAND_RPC_GET_OUTPUTS_BIN::request& req,
COMMAND_RPC_GET_OUTPUTS_BIN::response& res));
MOCK_CONST_METHOD1(get_dynamic_per_kb_fee_estimate,
uint64_t(uint64_t const& grace_blocks));
MOCK_CONST_METHOD2(get_mempool_txs,
bool(vector<tx_info>& tx_infos,
vector<spent_key_image_info>& key_image_infos));
6 years ago
// dont need to mock this function currently
// MOCK_METHOD3(decrypt_payment_id,
// bool(crypto::hash8& payment_id,
// crypto::public_key const& public_key,
// crypto::secret_key const& secret_key));
6 years ago
};
class MockRPCCalls : public xmreg::RPCCalls
{
public:
MockRPCCalls(string _deamon_url)
: xmreg::RPCCalls(_deamon_url)
{}
MOCK_METHOD3(commit_tx, bool(const string& tx_blob,
string& error_msg,
bool do_not_relay));
};
6 years ago
class MockTxSearch : public xmreg::TxSearch
{
public:
MOCK_METHOD0(operator_fcall, void());
virtual void operator()() {operator_fcall();}
MOCK_METHOD0(ping, void());
MOCK_CONST_METHOD0(still_searching, bool());
MOCK_CONST_METHOD0(get_searched_blk_no, uint64_t());
MOCK_METHOD0(get_known_outputs_keys,
xmreg::TxSearch::known_outputs_t());
MOCK_CONST_METHOD0(get_xmr_address_viewkey,
xmreg::TxSearch::addr_view_t());
// google mock has some issues with nlohmann::json
// as input or return parameters in functions it mocks.
// it resutls in wornings, so to avoid it we are going
// to proxy json as strings.
MOCK_METHOD2(mock_find_txs_in_mempool,
void(xmreg::TxSearch::pool_txs_t mempool_txs,
vector<string>& transactions_json_str));
// now we need to manualy overwrite TxSearch::find_txs_in_mempool
// to return j_transactions based on transactions_json_str
// from the mock_find_txs_in_mempool
virtual void
find_txs_in_mempool(pool_txs_t mempool_txs,
nlohmann::json* j_transactions)
{
vector<string> transactions_json_str;
mock_find_txs_in_mempool(mempool_txs, transactions_json_str);
*j_transactions = nlohmann::json::array();
for (auto& json_str: transactions_json_str)
j_transactions->push_back(nlohmann::json::parse(json_str));
}
};
class BCSTATUS_TEST : public ::testing::TestWithParam<network_type>
6 years ago
{
public:
static void
SetUpTestCase()
{
string config_path {"../config/config.json"};
config_json = xmreg::BlockchainSetup::read_config(config_path);
6 years ago
}
protected:
virtual void
SetUp()
{
net_type = GetParam();
bc_setup = xmreg::BlockchainSetup {
net_type, do_not_relay, config_json};
6 years ago
mcore = std::make_unique<MockMicroCore>();
mcore_ptr = mcore.get();
rpc = std::make_unique<MockRPCCalls>("dummy deamon url");
rpc_ptr = rpc.get();
bcs = std::make_unique<xmreg::CurrentBlockchainStatus>(
bc_setup, std::move(mcore), std::move(rpc));
}
6 years ago
network_type net_type {network_type::STAGENET};
bool do_not_relay {false};
xmreg::BlockchainSetup bc_setup;
6 years ago
std::unique_ptr<MockMicroCore> mcore;
std::unique_ptr<MockRPCCalls> rpc;
6 years ago
std::unique_ptr<xmreg::CurrentBlockchainStatus> bcs;
MockMicroCore* mcore_ptr;
MockRPCCalls* rpc_ptr;
6 years ago
static nlohmann::json config_json;
6 years ago
};
nlohmann::json BCSTATUS_TEST::config_json;
6 years ago
TEST_P(BCSTATUS_TEST, DefaultConstruction)
6 years ago
{
xmreg::CurrentBlockchainStatus bcs {bc_setup, nullptr, nullptr};
6 years ago
EXPECT_TRUE(true);
}
6 years ago
6 years ago
TEST_P(BCSTATUS_TEST, InitMoneroBlockchain)
6 years ago
{
6 years ago
EXPECT_CALL(*mcore_ptr, init(_, _))
.WillOnce(Return(true));
EXPECT_TRUE(bcs->init_monero_blockchain());
}
TEST_P(BCSTATUS_TEST, GetBlock)
6 years ago
{
EXPECT_CALL(*mcore_ptr, get_block_from_height(_, _))
.WillOnce(Return(true));
uint64_t height = 1000;
block blk;
EXPECT_TRUE(bcs->get_block(height, blk));
}
ACTION(ThrowBlockDNE)
{
throw BLOCK_DNE("Mock Throw: Block does not exist!");
6 years ago
}
TEST_P(BCSTATUS_TEST, GetBlockRange)
6 years ago
{
vector<block> blocks_to_return {block(), block(), block()};
EXPECT_CALL(*mcore_ptr, get_blocks_range(_, _))
.WillOnce(Return(blocks_to_return));
uint64_t h1 = 1000;
uint64_t h2 = h1+2;
vector<block> blocks = bcs->get_blocks_range(h1, h2);
EXPECT_EQ(blocks, blocks_to_return);
EXPECT_CALL(*mcore_ptr, get_blocks_range(_, _))
.WillOnce(ThrowBlockDNE());
blocks = bcs->get_blocks_range(h1, h2);
EXPECT_TRUE(blocks.empty());
6 years ago
}
TEST_P(BCSTATUS_TEST, GetBlockTxs)
6 years ago
{
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(Return(true));
const block dummy_blk;
vector<transaction> blk_txs;
vector<crypto::hash> missed_txs;
EXPECT_TRUE(bcs->get_block_txs(dummy_blk, blk_txs, missed_txs));
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_block_txs(dummy_blk, blk_txs, missed_txs));
}
TEST_P(BCSTATUS_TEST, GetTxs)
{
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(Return(true));
vector<crypto::hash> txs_to_get;
vector<transaction> blk_txs;
vector<crypto::hash> missed_txs;
EXPECT_TRUE(bcs->get_txs(txs_to_get, blk_txs, missed_txs));
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_txs(txs_to_get, blk_txs, missed_txs));
6 years ago
}
6 years ago
TEST_P(BCSTATUS_TEST, TxExist)
{
EXPECT_CALL(*mcore_ptr, have_tx(_))
.WillOnce(Return(true));
EXPECT_TRUE(bcs->tx_exist(crypto::hash()));
uint64_t mock_tx_index_to_return {4444};
// return true and set tx_index (ret by ref) to mock_tx_index_to_return
EXPECT_CALL(*mcore_ptr, tx_exists(_, _))
.WillOnce(DoAll(SetArgReferee<1>(mock_tx_index_to_return),
Return(true)));
uint64_t tx_index {0};
EXPECT_TRUE(bcs->tx_exist(crypto::hash(), tx_index));
EXPECT_EQ(tx_index, mock_tx_index_to_return);
// just some dummy hash
string tx_hash_str
{"fc4b8d5956b30dc4a353b171b4d974697dfc32730778f138a8e7f16c11907691"};
tx_index = 0;
EXPECT_CALL(*mcore_ptr, tx_exists(_, _))
.WillOnce(DoAll(SetArgReferee<1>(mock_tx_index_to_return),
Return(true)));
EXPECT_TRUE(bcs->tx_exist(tx_hash_str, tx_index));
EXPECT_EQ(tx_index, mock_tx_index_to_return);
tx_hash_str = "wrong_hash";
EXPECT_FALSE(bcs->tx_exist(tx_hash_str, tx_index));
}
TEST_P(BCSTATUS_TEST, GetTxWithOutput)
{
// some dummy tx hash
RAND_TX_HASH();
const tx_out_index tx_idx_to_return = make_pair(tx_hash, 6);
EXPECT_CALL(*mcore_ptr, get_output_tx_and_index(_, _))
.WillOnce(Return(tx_idx_to_return));
EXPECT_CALL(*mcore_ptr, get_tx(_, _))
.WillOnce(Return(true));
const uint64_t mock_output_idx {4};
const uint64_t mock_amount {11110};
transaction tx_returned;
uint64_t out_idx_returned;
EXPECT_TRUE(bcs->get_tx_with_output(mock_output_idx, mock_amount,
tx_returned, out_idx_returned));
}
ACTION(ThrowOutputDNE)
{
throw OUTPUT_DNE("Mock Throw: Output does not exist!");
}
TEST_P(BCSTATUS_TEST, GetTxWithOutputFailure)
{
// some dummy tx hash
RAND_TX_HASH();
const tx_out_index tx_idx_to_return = make_pair(tx_hash, 6);
EXPECT_CALL(*mcore_ptr, get_output_tx_and_index(_, _))
.WillOnce(Return(tx_idx_to_return));
EXPECT_CALL(*mcore_ptr, get_tx(_, _))
.WillOnce(Return(false));
const uint64_t mock_output_idx {4};
const uint64_t mock_amount {11110};
transaction tx_returned;
uint64_t out_idx_returned;
EXPECT_FALSE(bcs->get_tx_with_output(mock_output_idx, mock_amount,
tx_returned, out_idx_returned));
// or
EXPECT_CALL(*mcore_ptr, get_output_tx_and_index(_, _))
.WillOnce(ThrowOutputDNE());
EXPECT_FALSE(bcs->get_tx_with_output(mock_output_idx, mock_amount,
tx_returned, out_idx_returned));
}
TEST_P(BCSTATUS_TEST, GetCurrentHeight)
{
uint64_t mock_current_height {1619148};
EXPECT_CALL(*mcore_ptr, get_current_blockchain_height())
.WillOnce(Return(mock_current_height));
bcs->update_current_blockchain_height();
EXPECT_EQ(bcs->get_current_blockchain_height(),
mock_current_height - 1);
}
TEST_P(BCSTATUS_TEST, IsTxSpendtimeUnlockedScenario1)
{
// there are two main scenerious here.
// Scenerio 1: tx_unlock_time is block height
// Scenerio 2: tx_unlock_time is timestamp.
const uint64_t mock_current_height {100};
EXPECT_CALL(*mcore_ptr, get_current_blockchain_height())
.WillOnce(Return(mock_current_height));
bcs->update_current_blockchain_height();
// SCENARIO 1: tx_unlock_time is block height
// expected unlock time is in future, thus a tx is still locked
uint64_t tx_unlock_time {mock_current_height
+ CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE};
uint64_t not_used_block_height {0}; // not used in the first
// part of the test case
EXPECT_FALSE(bcs->is_tx_unlocked(
tx_unlock_time, not_used_block_height));
// expected unlock time is in the future
// (1 blocks from now), thus a tx is locked
tx_unlock_time = mock_current_height + 1;
EXPECT_FALSE(bcs->is_tx_unlocked(
tx_unlock_time, not_used_block_height));
// expected unlock time is in the past
// (10 blocks behind), thus a tx is unlocked
tx_unlock_time = mock_current_height
- CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE;
EXPECT_TRUE(bcs->is_tx_unlocked(tx_unlock_time,
not_used_block_height));
// expected unlock time is same as as current height
// thus a tx is unlocked
tx_unlock_time = mock_current_height;
EXPECT_TRUE(bcs->is_tx_unlocked(tx_unlock_time,
not_used_block_height));
}
class MockTxUnlockChecker : public xmreg::TxUnlockChecker
{
public:
// mock system call to get current timestamp
MOCK_CONST_METHOD0(get_current_time, uint64_t());
//MOCK_CONST_METHOD1(get_leeway, uint64_t(uint64_t tx_block_height));
};
TEST_P(BCSTATUS_TEST, IsTxSpendtimeUnlockedScenario2)
{
// there are two main scenerious here.
// Scenerio 1: tx_unlock_time is block height
// Scenerio 2: tx_unlock_time is timestamp.
const uint64_t mock_current_height {100};
EXPECT_CALL(*mcore_ptr, get_current_blockchain_height())
.WillOnce(Return(mock_current_height));
bcs->update_current_blockchain_height();
// SCENARIO 2: tx_unlock_time is timestamp.
MockTxUnlockChecker mock_tx_unlock_checker;
const uint64_t current_timestamp {1000000000};
EXPECT_CALL(mock_tx_unlock_checker, get_current_time())
.WillRepeatedly(Return(1000000000));
uint64_t block_height = mock_current_height;
// tx unlock time is now
uint64_t tx_unlock_time {current_timestamp}; // mock timestamp
EXPECT_TRUE(bcs->is_tx_unlocked(tx_unlock_time, block_height,
mock_tx_unlock_checker));
// unlock time is 1 second more than needed
tx_unlock_time = current_timestamp
+ mock_tx_unlock_checker.get_leeway(
block_height, bcs->get_bc_setup().net_type) + 1;
EXPECT_FALSE(bcs->is_tx_unlocked(tx_unlock_time, block_height,
mock_tx_unlock_checker));
}
TEST_P(BCSTATUS_TEST, GetOutputKeys)
{
// we are going to expect two outputs
vector<output_data_t> outputs_to_return;
outputs_to_return.push_back(
output_data_t {
crypto::rand<crypto::public_key>(),
1000, 2222,
crypto::rand<rct::key>()});
outputs_to_return.push_back(
output_data_t {
crypto::rand<crypto::public_key>(),
3333, 5555,
crypto::rand<rct::key>()});
EXPECT_CALL(*mcore_ptr, get_output_key(_, _, _))
.WillOnce(SetArgReferee<2>(outputs_to_return));
const uint64_t mock_amount {1111};
const vector<uint64_t> mock_absolute_offsets;
vector<cryptonote::output_data_t> outputs;
EXPECT_TRUE(bcs->get_output_keys(mock_amount,
mock_absolute_offsets,
outputs));
EXPECT_EQ(outputs.back().pubkey, outputs_to_return.back().pubkey);
EXPECT_CALL(*mcore_ptr, get_output_key(_, _, _))
.WillOnce(ThrowOutputDNE());
EXPECT_FALSE(bcs->get_output_keys(mock_amount,
mock_absolute_offsets,
outputs));
}
TEST_P(BCSTATUS_TEST, GetAccountIntegratedAddressAsStr)
{
// bcs->get_account_integrated_address_as_str only forwards
// call to cryptonote function. so we just check if
// forwarding is correct, not wether the cryptonote
// function works correctly.
crypto::hash8 payment_id8 = crypto::rand<crypto::hash8>();
string payment_id8_str = pod_to_hex(payment_id8);
string expected_int_addr
= cryptonote::get_account_integrated_address_as_str(
bcs->get_bc_setup().net_type,
bcs->get_bc_setup().import_payment_address.address,
payment_id8);
string resulting_int_addr
= bcs->get_account_integrated_address_as_str(payment_id8);
EXPECT_EQ(expected_int_addr, resulting_int_addr);
resulting_int_addr
= bcs->get_account_integrated_address_as_str(
payment_id8_str);
EXPECT_EQ(expected_int_addr, resulting_int_addr);
resulting_int_addr
= bcs->get_account_integrated_address_as_str(
"wrong_payment_id8");
EXPECT_TRUE(resulting_int_addr.empty());
}
ACTION(ThrowTxDNE)
{
throw TX_DNE("Mock Throw: Tx does not exist!");
}
TEST_P(BCSTATUS_TEST, GetAmountSpecificIndices)
{
vector<uint64_t> out_indices_to_return {1,2,3};
EXPECT_CALL(*mcore_ptr, tx_exists(_, _))
.WillOnce(Return(true));
EXPECT_CALL(*mcore_ptr, get_tx_amount_output_indices(_))
.WillOnce(Return(out_indices_to_return));
vector<uint64_t> out_indices;
RAND_TX_HASH();
EXPECT_TRUE(bcs->get_amount_specific_indices(tx_hash, out_indices));
EXPECT_EQ(out_indices, out_indices_to_return);
EXPECT_CALL(*mcore_ptr, tx_exists(_, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_amount_specific_indices(tx_hash, out_indices));
EXPECT_CALL(*mcore_ptr, tx_exists(_, _))
.WillOnce(ThrowTxDNE());
EXPECT_FALSE(bcs->get_amount_specific_indices(tx_hash, out_indices));
}
TEST_P(BCSTATUS_TEST, GetRandomOutputs)
{
using out_for_amount = COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS
::outs_for_amount;
std::vector<out_for_amount> outputs_to_return;
outputs_to_return.push_back(out_for_amount {22, {}});
outputs_to_return.push_back(out_for_amount {66, {}});
COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response res;
res.outs = outputs_to_return;
EXPECT_CALL(*mcore_ptr, get_random_outs_for_amounts(_, _))
.WillOnce(DoAll(SetArgReferee<1>(res), Return(true)));
const vector<uint64_t> mock_amounts {444, 556, 77}; // any
const uint64_t mock_outs_count {3}; // any
std::vector<out_for_amount> found_outputs;
EXPECT_TRUE(bcs->get_random_outputs(
mock_amounts, mock_outs_count,
found_outputs));
EXPECT_EQ(found_outputs.size(), outputs_to_return.size());
EXPECT_EQ(found_outputs.back().amount,
outputs_to_return.back().amount);
EXPECT_CALL(*mcore_ptr, get_random_outs_for_amounts(_, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_random_outputs(
mock_amounts, mock_outs_count,
found_outputs));
}
TEST_P(BCSTATUS_TEST, GetOutput)
{
using outkey = COMMAND_RPC_GET_OUTPUTS_BIN::outkey;
outkey output_key_to_return {
crypto::rand<crypto::public_key>(),
crypto::rand<rct::key>(),
true, 444,
crypto::rand<crypto::hash>()};
COMMAND_RPC_GET_OUTPUTS_BIN::response res;
res.outs.push_back(output_key_to_return);
EXPECT_CALL(*mcore_ptr, get_outs(_, _))
.WillOnce(DoAll(SetArgReferee<1>(res), Return(true)));
const uint64_t mock_amount {0};
const uint64_t mock_global_output_index {0};
outkey output_info;
EXPECT_TRUE(bcs->get_output(mock_amount,
mock_global_output_index,
output_info));
EXPECT_EQ(output_info.key, output_key_to_return.key);
EXPECT_CALL(*mcore_ptr, get_outs(_, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_output(mock_amount,
mock_global_output_index,
output_info));
}
TEST_P(BCSTATUS_TEST, GetDynamicPerKbFeeEstimate)
{
EXPECT_CALL(*mcore_ptr, get_dynamic_per_kb_fee_estimate(_))
.WillOnce(Return(3333));
EXPECT_EQ(bcs->get_dynamic_per_kb_fee_estimate(), 3333);
}
TEST_P(BCSTATUS_TEST, CommitTx)
{
EXPECT_CALL(*rpc_ptr, commit_tx(_, _, _))
.WillOnce(Return(true));
string tx_blob {"mock blob"};
string error_msg;
EXPECT_TRUE(bcs->commit_tx(tx_blob, error_msg, true));
EXPECT_CALL(*rpc_ptr, commit_tx(_, _, _))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->commit_tx(tx_blob, error_msg, true));
}
TEST_P(BCSTATUS_TEST, ReadMempool)
{
// stagenet tx: 4b40cfb2fdce2cd57a834a380901d55d70aba29dad13ac6c4dc82a895f439ecf
const string tx_4b40_hex {"0200010200089832f68b01b2a601a21ec01da83ffe0139a71678019703665175d1e067d20c738a8634aeaad6a7bc493a4b5a641b4962fa020002fb1d79f31791c9553c6dc1c066cde2361385021a5c33e7101d69a557cc3c34a1000292b1073ac7c2fdd851955e7fb76cbc7de4e812db745b5e795445594ea1c7d2a721010a9e82db48149442ac50cff52a39fda95f90b9683098b02e413a52b4d1f05f1c0180f3a3f93aaac0d8887ce542c01e49afbaf1f5ac8e1e4c8882011dd83fa33d1c9efa5f210d39e17c153a6a5825da329dcb31cd1acae98961d55038fb22e78fb93b95e6820a6904ff5b7bbfcf0cd1f6b9e9dd56f41062c7f5f43d9e1b3d69724eeca4bc3404a41ff0669f7f8ae725da8bbc2f8d0411605d2c3e959e3099414ffce1654418020d6ee74bb25042045e955b966e060a9f65b9cfccfbdcb4ee3101019a51f3a41372414c90383c9b84fb4ac690047ea67d70c917192abeb1fdf6c618aeafc732ae9a3e6c6f7fb274240ca04d24035a1d55b3fd1060dc3f4e64f9816868f36d2a0aeb76b64169bc9525d7d70b077c8b998b1204c6108e2917af893b0de24f4adb043eee433b096db8ef730de6e339a84f966b80b239821f350e2a8b10817fc19508da4f82bcb90fcf84cd47929ab1ba90bde5d252767736a4b23d26063cc6b2120dc636b2d4e3e7b3f6d7448882e01c10cf7bdd2117710dc49a59b49cf99212800093da22a6ab5bf693a80d4a662f35259f088a91a26ac261980c537238daa7a40477871f7481973edbcc86fa4885a4061d5c889d0986b4c0cb394165d4039081069f61cff822c7a227474d1609dbf05909f738803834b9e1b5ee68dcb825fcd906d880684e5fa684c8cb02495530fcaeeb35a405345f352ef3c8cf276c096d4303ee14cc0a48533afd1bcdf32dcfb25db4c45a19b10926dff72ace2c2a1d0759090acff99ad06e3f81c4d759a9f74d47fff9cb61d3784aa0eb57a250eec8d14800b85026f5b112740e2e8c257541bdfa4ea1f166b9d930e9705fa1d3f3c2be1e0fb242394d9230c7c457fc8422a6f919a06df5c52d954fa1bfdb57a0a2778d35020ef07490fc3c4f6e99ceaef97fcb3da049898944f3291b96a4f9ce491654340414565db2e0c6bd13eab933194b32336c09c478689cc4a7160b63ecb59937b2028e1649744c6ea69db01aed72fb8b39519cb28d764f158789cc539e01fd5f8f098597c8977e6d2b22c37b289c95dca13bece9e28f741ae2384ead8f0d6df7c30f311210523cb0b7e8c1173aee311362282f3c7d06ae2153969d073bec14ff3605d193bfe829e110df39b894fc4a8eb462d357098688748d579c85f9dc9e9cd20229c9865bc54ae8338433247c28875249e37d4d9b9ccbad611ce5948f1c7ea00fccdc41a9fbe942539a44111f160c9b1dc2653ecae0e4c30bada58d9164fa4c021b60fc0e2068510ef8ec56f7c8e036f2eb31ae0871c9a6aff7b8ad6a86054a06daf06393871f41859f51165f09d22fedd8a2326099a803491dbff5027f72540ed6981f505d1162d86c1ec716758bfbf4e1bfdbbe628b9340942a328209c86b0ec71981c90b407b146cbf065cfd8b0a1c2528aaf007c505a83779dacf8cb7500577a1f8f4a2c9a833d08b254c0c5edbbe87c9eaf266627d23bf518373dceba4099c13c6c468b99c16d56ea5eec12620867fdeb01be66bb0248a7ab7dd6434aa042392c4482e8694292bfc638f1a344d35c9cbfe121a25d2302db4db9688285905fcef9a892593840fe2ddebf0e059e341b2e7f107ee6a19fe386e3f9ea0da2801c5e9fe1b9c4b21155f6f2194ef36f2383097f9cf7ee0994873cfd92d098a33006547ef67bbeb2c1386fcbeec6f0b974532f2ac6e474b26683a37ed3919ec3108b578d3a552c32a362c0bea8bfe35c481f014721af9503a0663d95f5aa91b8802c32f60dbaa65978ad114a2fd45901a07fb4dded61d19e30c8c11e4efbdc1180a02d08d05a646bd8a4d160203da8d490ae0a0b4e631280401d635eb78e0416408c208436dcd653c11a75f365e2d012e0e69f0d4fe2fb2997726dad29468109001ed7c65464ba734e4b35f2ac85a4437fcafe0cdb6128e634970ba420e2e3296080636520e9fbf453e07cdd215117a2eeffed5a0ea0003761f5eb4c35aebf87b063f59d0571e149dc9d0c143a59415a7fe950d34b5024087145969abdc7f7140079bc25119825dda1bf080150bd40142d9635fd87e5dc691899d2686ccf6c9d106c7cdbf783fbbc83fc0feebe8abee3b458e7417a385215f1f89a2a89bef3b870c7a30a6cf4920ddd6eb50439c95c1f38fec867a41e628415ed142b7014991fd0818e8cf725b7075498e773790ccc882db0eb22453f0c9931debfb8d3adb09370f30e62b5fe94ffa7e55ff053488ad48f6e244ed6f043fae8f2225a024800c690ce15dd8017457d23c834b276d079d4a141f22db8fed4ea8f1e378fb741a2da30c09abc817ef0ad589428f966b8bdf92fb32fefa67f425ef1c58a2d4c881e8cc0156519256b87736ed84691b585687971c01a23da37ab76726602a01e771d9820add53f62168d51c7ec12ede030b61155f12e7c8d5573985a9e0884bcc41e0b50aa066b3337f2ab8e3b1031a1c843700413ef03d3734536547fc636055f5d15b0f804b3d25f90e4aaf199ee666d90199d0781526bb2040144b5a638411c1067d0bc5e3ef1911c5223fb0f5d0ce6387702b6957f9466b1a8be6879b8c7190ec1e0662cda6005a363f5d3d4585e6d9d15349be797353179b0a713b925dddfbd05609430601339bf31226cce63c763d887364aa6f1d640892f2a074338b741b7c3303e62c6fc16f544ceeed251dba
std::string tx_blob = xmreg::hex_to_tx_blob(tx_4b40_hex);
vector<tx_info> mempool_txs_to_return;
mempool_txs_to_return.push_back(tx_info{});
mempool_txs_to_return.back().tx_blob = tx_blob;
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillOnce(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
EXPECT_TRUE(bcs->read_mempool());
xmreg::CurrentBlockchainStatus::mempool_txs_t mempool_txs;
mempool_txs = bcs->get_mempool_txs();
TX_FROM_HEX(tx_4b40_hex);
EXPECT_EQ(get_transaction_hash(mempool_txs[0].second),
tx_hash);
}
TEST_P(BCSTATUS_TEST, ReadMempoolFailure)
{
vector<tx_info> mempool_txs_to_return;
mempool_txs_to_return.push_back(tx_info{});
mempool_txs_to_return.push_back(tx_info{});
mempool_txs_to_return.push_back(tx_info{});
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillOnce(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
EXPECT_FALSE(bcs->read_mempool());
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillOnce(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(false)));
EXPECT_FALSE(bcs->read_mempool());
}
TEST_P(BCSTATUS_TEST, SearchIfPaymentMade)
{
6 years ago
// test search_if_payment_made for testnet
// and stagenet blockchains.
if (GetParam() == 0) // if mainnet
{
EXPECT_TRUE(true);
return;
}
vector<tx_info> mempool_txs_to_return;
6 years ago
vector<string> txs_hex;
string expected_payment_id_str;
uint64_t desired_amount {100000000000}; // 0.1 xmr
string expected_tx_hash_str;
if (GetParam() == 2) // stagenet
{
// tx_hash 2ff79595683b546c8959e353b2c345394ea80694073d9237a146448bb65915dd
txs_hex.emplace_back("02c2d20701ff86d20701f88ceccabdbf06027b0b71991727c05f0ec98bdc0e12fe598acf8eb808790c3692550a464b722ec22101d9d9ddd1f2b7010715195405742af8fa89e12c0d6c3f490c81a08e836e3d516300");
// tx_hash 8a7e09ae4bc4d85153ff85350da82d076461db61e94b321fb727a0fcdd96e8e6
// this tx should have 0.1 xmr for stagnet wallet 53mqDDKtVkib8inMa41HuNJG4tj9CcaNKGr6EVSbvhWGJdpDQCiNNYBUNF1oDb8BczU5aD68d3HNKXaEsPq8cvbQE2FBkTS
// viewkey: 53c5850e895122574c53a4f952c726be3fe22bcd2b08f4bfed8946d887cc950b
// payment_id8: 1f5d434f0b34448b
txs_hex.emplace_back("020002020007bcaa04dc8d028f439601f51d57d302aea425427e03cb7243e20e512bc03a9c7cf2f3a3d6178e8b4e3cb4930945d710020007cd50b92b9af302a2c302d0599203ed0575b11353f8f35d282744185f5107da43f810c2e4dcaac815280860da016320af0200021d3890f92bb851512869bf2336f322e06501b5ea55b000030380833bd0cc51570002d1ff798caaaf37667cfa616e3bb009a5605ab03acf91fed4f4f2eb68c046a5412c0209018f19d83c6f305c75011137a812db81609018a33684ec8350d6f9d2219f235fc9263af85299e246cd0302c0caf0cc3b829bc083f46c4f70d3c5a7dc90908d665c29ad4d2be6ce07f7a1d4b9d55888cb6a76f8fbf6c5daf3d6e57d7233d037db92969f76f459fc4194279f17e359f664f986047e3b121dc9a5c0ae98d22abb96aecbdb14793c11249fda611edda9020b2048913a6a6b0a466ae005f199db5a20138eca1ff0e165f051ef91f4199cc10af8963b0b0d9e4b3dca91dc7e59acc9367ea99572f3b92f4f2718b2975ec6b00c40b0d4bed4589c357d3d785434bc94d4cc60a81a3ad481a9d31cc06f586f790a05fbc095a5d64d8d83d841d51834c5bf81bb91abe5fba2d95a871f6a00aee10601858567a1151d444fdfc43a37aa7a4957e9318e5b221a29d432ba3b4a7b9f5517ecfaedd04adef367e601b5deffae36ce58b06a677612b6d1328e29dd118f0a9a15e4e4b2d672962e7668455b76c62018cabd9a7325a7bb8f62cdbbdd19d109f9694587a5edad9531f2d69826e37882fc13e3bf77cbb76132622658bcaf1f085acfef452ef2f8597186242922a4cbe7bbcecbbd2d832787704564c2e4acb90f41f430abd50bc5f3f2491e3d5a80aaef5a1c9bd7305107cdd99e863dc9808106e8f33289308f51962820dee0662719f4580d2d506292f852516f63e546bdd20f4b33f2be65689e7d099199bb278e3c4de71cba3e067b6e3d3c31362ed505bc01087ae0bc13d793c56119aed7cecde0d16ecd5c85982d90ba0107bd9b5481f006fcb91eeac29745f8b4ed16e80a47df0dba161a6f63f692b3561c2efda7dc68030f0b8a19fbd8d8e7ee2e9985ec945fe19495159586dd076441449818c4dde40bf4fd7ecf3c94531cd061d8cc9af56b983d71120b92d254bc62755363c95ec70eebbc66de97fccf3554d1b92f7929beaab552e4a79cb14a0a0c27df3e2c0fcc044a0531d23c0e05a4935a7de35934ad7a6e50857629f165740dd78fb9fdf8b80694937a2e3949dd16655b2b449252c1eedd4a7ea71d92433e691d38afe7dfa701af904128da0f1c73e61fde12550777a17481cf19cff2b734d49e07510997a70d29bde78592c41e8096552edc844f75febabc80c31bb8904e35c0837645386d0632badc529963ac1bd865231a828cb78b460e3e68269a93845127ae1acd91fd0ec771694d0dffe7fde7863ea3342e5a89ec99cd0b16586524219edc497b65fd0ca6fbcc71c0fa632a38243fdd478bfe0c32e27d9af2d4a36e76b98e8ed770530bc4c70a2543e9c372e84774e82b5fde2f392033550bc9d82d5668d1b1da02c507b007e91d4eec5cb9e7ecf6ab2771c0d18d6f2d7d69747d1d649c58377151320138ca5e283bc244f972b463a2415850205ac8dd33c51178e04f8cc35d1f64fd079446d307d131eee099363b8a77a547e7abacd0597e96f7ef76b79bde0dfb4a014fe147688a9920952a9225248ee0c3fc4271d35936185b3508cd6af1258842087de145522eafd725a8dc9513ab95de2f8c1d9630052f363a7386653326a9df02e1b94e73e074a2543d50d43561868054feaeb999c9460eec6e1d6775bdc013096b67e06a94d90531ac7dd86c8e9573d8da74ebbba45d83fd544ba075adb69000896f2149b8ff594432655b92cd1fa61a0e2425c5b6370267e1929e9fb85d71086dd0923693ee0bc2b3bb76b47ee99703e31ef3f0989793a21f805605ea219201082790b3e37d7e646be945c80ebdd50b648463bd65055f342a66a63edf93c7075b6d28bae1f4579ff9c01a956fe0bba94b32dd941789110579233b51c4bf2500f24ff159a83f4a25651378c397a489fbc3e7b34439b5a5ccdc18182c29e21403fc4c1ce9a230854633887d6da03b20e647aeeb2c3f34d5f894c84295ffec7e0a1f355cf5d64d4c6ff29cc58717cfbcf4aa77e50f3c1307223b15b08401430c071ae7361e88b2137250ae0e29570a8a57acc79aedff9151104cf9d312e51bf2033f28024086377a06b4d8bfb2046ecae1265c727f82c2110b4916e3c1e342da0f4ac3df0a8b4b1ea2668d8b54d2b75ad7596544063d4d4d2ba7e52fdb04dc790860b8c39c75e9c38687ec54d0466ddfc61b9cec3f4a22173a9215fa60281b790b5ddd401de6a48bd6b3166607e7341729432527017b847b39efe9bf15f16d1e039f4ba936878408fed4be7b7dd147ae1ae07028c916711e020d8191438ebed308fc85b0e1969893270c0391e4e0bf988fb132b30c683b3111f04bec6567a9e30a1143edeecb0a552531b5062ceb11afe1db329d066d320690b9ac58971796e4050b93e15885ed31ed69296aa5a3c32ef6d6d68ad2e4ce039c7d4b40044df6550920ffc6a52e051588fdb16c7690acda11bee9554f25933a9afc994a4165cb7c0d33c232d702c6de7a2e7c0a6e12c69d4974477f750975a1561f41214720c9840ddddb15a20b3619ec6943cdcb569abba069dc499cf3b845a3e0c04d6504bb100d6c11ac99a6e61042bffebc157b3ff526e29012cc0feb0249360a35852f328f000d13a31baa0319d657ab11bb2e1e64aa9eb87fec7d93c3840b2cadee0412e20917e8615663e2d7cbb86c74ed382d4f43f
expected_tx_hash_str = "8a7e09ae4bc4d85153ff85350da82d076461db61e94b321fb727a0fcdd96e8e6";
expected_payment_id_str = "1f5d434f0b34448b";
// tx_hash ac715b386010bd95a506fde0ac0405aa8ad72080b1d7cef257b5b112d9ed84bb
txs_hex.emplace_back("020003020029f7d30185029407bc10800fe119f60fc6019916a008a507b80730eb01e114b609df03ac0b4da40cb002b606f010d410a607b205aa06e915f7018d04d106f70af603b516dc088d18d5055d8e020cb104daa32b6bfb671a92c2f9296e5d09174b509a69ac2e67988533bbbe5d6bf298aa0200298a28a8529d4c870c920f8202992aa203ee0e950ebd0403980226be016cc202b118b114f802c40bf60d8408cb03d611bd07b204c9069203a806169c15bd14e704da14c20e2ce605f205d5038526c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed020029bb3cb315c70db922bd109c22b00af023e0372df701a218f108b902c906a017a201f10fbc1196028c0782088e11e915d203cb048b0adc14ad0d60de01b602ae0651a909c305bc03a511c607980bb7147d8e2a1f1755ef12ce28185821e6b19cb6023d535411bbb7abdced139c923bad020002e4b04f1a4a46e00442df6fbee88056ef5d34fb87d432e232dc3b166be05fdb280002e475a89f6073029a3f6ca09f301d5a88e522e229b0a3e7867b2aa331cb46c8d62101307f043802c7d6460fbf3aab1ad9bddeb417c7a5810382d0b282d2e3ffa860a702a0a7edbbb679a40685a9ae03993e86e96bf3352ef6c7b90137e93053d0ea6ed521b6c86877c467657c7120b66248f4f2cac2293b84310c37ecf409a7a1c7365819387b039a613855d36fa10780922eda8c96c031682e8d35657e209b461a1fa64cdb07cf3ea55659ae1d583cd70ef6944164ab2c35f9ec26addba6cdd6d43287a58bf3e0fb0da0a3784186315a8ea8d8402026cd186c37c794f6d9b4b97f50e6726eda7fca0840d1c4eba4bee47fb53988a6b12fa4fdc661d20446d157eae0ea42a2c69d08008394fb8714a97a9c98858f1f57e1c45530f8ecdebc88a62f8eaa986adcf0940f32e62f9336efcb8a134813c6d9ac94736fea3ae7fa9969bb2acb5697bb3614474a297d61a76e9d352852999229a2f735b8bbefd3fcbb680eec46761959be5c9a33f8e99da8cf4e62cdb05b888cc2cba76020a2ec2b9843ca32565d84b665d901c56eaece700357808d78937231e5433e54bbb943fb6c8159dd9445df6561740a5bc6a6f4344efc2055b2b5c803d9676d7e8630b14c292756761ed158ffc6bb0a5a5243275192efcadfa63fcbb10b0b7b268c438599d37d1bce2bc30558821b035b7f9fb2f70e0f84f53e8b3d822dc42407848db1ae8eca2aca2cedf1fea2ec066332934cf1344d9df0e39c9607c8fd87a78d640d88fd01fc381b22bbbd7945048764e2f891467343ced6671e106d95c357689d59d6212e46931327578b8bce0a52a7bba6272d059cf5384b36fe12b33a26ebf9205c8589e32fb2cf16144dcf00a664150964d1ba8594aa7aa096be927192f7c33f0d9a373d5089a63b86d42d03e41a0dbc08b9b43a3650b2fb3d09be3586a9f3bf954d83b30d06b4cfb50be600ad798ae6903a0230526a1a97e2fdec48eac2757be16911a8694cf793cc408a0e1bbb3c4e3847f456af2d7c02e7a23428656006a488784dc5737c443967c742057ea11da8386a9885473d424f4c269678b4acf1c0f930d168167948b782a166060a4304cc1788e4e04332f2a54467cc373733e6a10b6e392a7948728b77573105e6e130bc88574bd54dc4b44a11f0af6b0eb97e069f113615d75148483fe1ba0536478bb1d745b5b2fc55d0f5237bd2b1b51406242ce195bea8d6882ed8c3c00e2f96ce3479b1d205b803e5b61ec19e69d1a64a0733a109b57d33a9f6063549020615c8604aff59dbeea47e33f3ca7d54002098059bc16d00f4623104cc17b6025a0ae39b2ad8490b54486cde43f214e73e556b5c5449b83fbb18196cd5c5940bc0d13012deadec31c43480138219e65f16dc3c729c943cd60c52cef818f8a30f97fcf04da1eec3efc26c29bd1777265c0940ee617f09952e0422d1d29b8c930cb150bd726365f349eb605aaa646f8d8dbf40aff57a2143ed618e2bf290a41506b5dcbe1e92d49d9bc57eba245f8e407f1ad1639346cd9100c2efc6adad65a40452c75fa8710b33040285ae0a8e5f71ecc471a5b01dbb2a4b9e3f526e7199a808e0b52b08d04600c2b50d67479c677aaa4e736ec8148195ff5c1da47cdf421d0c2c21bd7bc5dbdbed8909600e6f2edfc114382f651ed6be82118f52b4b45633095b89b3ca5333a8d9496c09f672feeab27fb18f750ccd8e00b62e936686351e06f1b017fd1838d4339f8fb9b6db2474815e2ac0a55e745071374ebd328cc22a06e65c6351e87bdeaf9994879b83dbaed95adba0d7fcb18a586f4883f11cdd3503b18b7912ce56293fab4fc17e84efe2d420318feb3be1d15dd06df254047dbc0ea5a82ba611ed0b8b19d1ff9f93e87c9fc00ce0704e7bdbf44ef916c3b29c46022a318ecfa1c6691122c1cd4c2147620ce26bf22e6e7e1d90e3e65b6d9a12bb09cc5d0fc54df90e7b8693b3e641e692fbcfd27137c62f8f8ee4036e543377b5079832faa7a6e07babf92e66880766c5b8cd13a6875ee40af2de1bd99eb1992d0dc79cd62f9034902a442730b9a872e26fac5a9e25c7e469d16f1b2eef7863d9064a80763b846b8ac6f9e81a704e43101cc6868d42b7ba181f59f05a70ebd75d08a821ef222ee4f66149f956367094bad0b93a4ea4f77df5b6c699b3ace1728a076ed7d515bc6a1dc641ff26a668a7b4a20a3272ff72915ee0904639fa62a4ff0f3435194c79b53602bd0e6bb5b6d6a41567fe5fecf4f9db931f757ef4aea46008ec6a0de98e4449b61d3e9552ffbcee27225f335478938ee6cd35dc6a9164870d6d352d594a175bc6f414a55
}
else if (GetParam() == 1) // testnet
{
// tx_hash 0124371c3470a1e79053aebd9b9fe859005d7a7cec786f08655ed2cebbc673e3
txs_hex.emplace_back("020002020007da9012f79602f0e30399a20314d7010cd033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000781c609bfd508d71a9efc07d07741df0429e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002f1a558f69093ce2bcf02719bb5a372a9e2b92651b0c861674f4f0f1ca3ac2ba80002cc84eabfa99691044bbb314c08f7f3eed2b7d1c64fc4733c7f7b25f6b0f212812c02090180006f9a80dc79e701eb19d03b9110895caa08788cade55a1ab50f11be91a5ebdbf02b36b27211485404d081f896033702be8d4330b04466a69ca94779dc0c9066e8be85b3513ab6648128c64a80080a85345cd384aaba7c8ba92b8d23a21a4ed27e38134cb3cd3c4fa5701728f80260f567f28a61f9074f1a14ed83532dcd67fde76484d2969a048160799aad8503b37aa103cb3f122b9a03e99ebf890f23e4e0284db56b3965f1b4183edc284f0ceba21af74ed66fa14ddd72e3e07b78abbad53590565747764e64c04e2ba723b0c39894754f95b5ba6c01b7af7f152298f47549cd69e0cde657d29399f48087b1434d93184e0b8d2549772302cce035c9f625ff7de363715a6bcca13ceb829f1285d807785c9729a1e6ee89fc89737bb2bd7a8d66bebb09a10a9090a55ea375608da1c73c77c64ae6dc0a7688a25d6dd8dc998edf60fb51a421c78bab7b698cabc086521d7e78ee5a41ac93955ef4436216daa5af1df1ed7a48ac6f52d723d3c81b13bdce40bf973dfdaae2e29312c8c990ce058659f18d71b75437ccff40480595e13219920f6c0afe7f8290dd1d9bd875f5043155042a8f96a77878422fe10906a039cc5a206002d980aaaf82ed6e650cc3fe27529ea412fdea7bb87a1422c047741b98719756b8b91700a40095cca780cb8b0a6ad77236c8d2ae1e900f1037a6c9098193507cc552e77947c6d8b00407cd4a91d551e2751a2c248c51c77bee75f7195314c1b06813803f3625746b1b971f0a03eacc3b50600c7759ee39c5228e5c76da2200179f6db8ecec631937412b992935a33548af4947088c31607d22836ff5723a0a6d7a40fd7adf11d354e85cd3d22d1b77e3427c3afe648a7c02286706e24453d75278e499bbb4dff1aa6b10e0e1b6b45804ad909707eb663a4ab9300a72705c494bd0cc8bf1b3e0adb4ba9fa432b05abe766115ee8e186a445d3c7048514b012cc74b1eb261f3344a7691437ea2912be0bdff79aae16cdf3b9192850a9f74bf0134e9568acb39aface8e4b571342cc3f86f875735f54d0ce7d263620badb99209f03486de1a6b2c6636870b187c75e64ba51455e9fe45f2ca9d3e44efad80126f9ca4bc02c0a3bc8de68aeb41616089c8ad2e8b88b650a47438c46f055396a378d407b7a4fa0b667d66454f2c7f3e313f72233878e591642f22817b0a36ff4c1d04f03629852509a7a0a9c3f68a423a4ee407b12444b60d2b7db4f902b566258973dbff3f718ca0ac12e7a32d2c88e638c14227009bac9c1cca43c304e48dc6baf650c46a7abf45db4f960a787ce3bea193a39833d0dcba7feb7c3bc322666e4b4c451803252cc4787e53b1754e795e75afa4d74143e59c3820f4c66d31ed635833fc868b200ae59e9e718393cbb8e7a9c5bf144cae1a6b54f812cf99fa8963d977a9633128ba5718f8fca2aa8064d3357c23a70d32ce59e1f3a0c251511ed9780dc1e99ce409773030121edfe31d9819e3346bf02eaa536bc900ca00f8d4c40283564ec5acc82d1a8abc69411ea39d1a4d89ddee2ebc99979147380206565d10f81cc26110a77072d8097e6f6472195465677345e4f9bc9174b7f93088fcde21fe43f3972284e9ef17b3f821397dded316c8716a114e9f90b739b95605969c7e69d8027bae858c1411367b200b3a0be7dcfcbea6e3937388b6e5861d78749ab502610f6a05e90fa525a01272d5345a6a8b659b7b8d95995d4ba4160a5aec0060c92cacf82e796cd798c57fff75094435c90b7ec6fdaaaca33ed2f838f42da96966e0e33477b91c7c34d388c2eda1b18d1c99457281fff70406a05dc18306aecaf77b78cf7fc7a39e7bf7eef38547fb7f0055a768f870e60e0ece6483b7ee85808f132d0c5d013ab929eff21065d8679a751d882a332e27a6752a26c5279c846591f8022f39017e9fff4f29d7dbbffdf4abb1ae93e957903a8d08272113da43fca3d707b56b546e71a1cec088adbcbe136d5402245c2545ef5ed0c9abd8efc46fd323f3da50c4530b59408d7ff08891b8fd3f2ce2cd6938f06c884cf61d974acfec94b6d9e80fcd493d5251750b9101aadc749157a19d2b8fb21e33dd0c2161839898d71bcd9f7906a680c55ae03c9c8ff771f7943d3c8c22f9b14480410353b2ffe7b3ee174ee476fd757360475af4fd419b79b91f00f15c5e59a415e80e32508152be103e2eb487fd0e3bdb9474f2efdf9aeafc2075fe796a510009e2033633390514f141cb82861aa8122280da1ccb0872beb671fa63f860f18194fe08e34d40154fd13e25f09d4fcdf0dde7452803de730f315a87f8fd6369dc20560542a9a8a5816923d730880bc242e0f55a82e44050035b5ff4c5f8fd5b027ad00d249fa3006150d035ca82e59ae7ea97f77afc6dc3ec197444b70a8603875ea9056b7d94f7861ab3ca1106ce3d39af4e20b62d03d2ef0e14d24a020320412ed40748f348a97739cba7c29a24bc2e93f293549f2ff6a7ad2d9ac19360814f659507e64d7e8affcf8e085c543292be5e226138a9938b7824bd7e6e75499c8634580130e846097b212d860354b65aad7a5f1cce9a241eb541739e8e43336a0274f509e1155657e032ab0a1f4fd4d
// tx_hash a4080f0a37837f24ff4512cc0e21c5203e7445b9689303e7add5702c11725e9d
// this tx should have 0.1 xmr for stagnet wallet 9tzmPMTViHYM3z6NAgQni1Qm1Emzxy5hQFibPgWD3LVTAz91yok5Eni1pH6zKhBHzpTU15GZooPHSGHXFvFuXEdmEG2sWAZ
// viewkey: ae6184287ca791609844f140b8502ccfa2223c04c8699cf31fcd0af1f1d0be08
// payment_id8: 4c3bc77b30f486a5
txs_hex.emplace_back("020002020007da9012f79602f0e30399a20314d7010cd033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000781c609bfd508d71a9efc07d07741df0429e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002f1a558f69093ce2bcf02719bb5a372a9e2b92651b0c861674f4f0f1ca3ac2ba80002cc84eabfa99691044bbb314c08f7f3eed2b7d1c64fc4733c7f7b25f6b0f212812c02090180006f9a80dc79e701eb19d03b9110895caa08788cade55a1ab50f11be91a5ebdbf02b36b27211485404d081f896033702be8d4330b04466a69ca94779dc0c9066e8be85b3513ab6648128c64a80080a85345cd384aaba7c8ba92b8d23a21a4ed27e38134cb3cd3c4fa5701728f80260f567f28a61f9074f1a14ed83532dcd67fde76484d2969a048160799aad8503b37aa103cb3f122b9a03e99ebf890f23e4e0284db56b3965f1b4183edc284f0ceba21af74ed66fa14ddd72e3e07b78abbad53590565747764e64c04e2ba723b0c39894754f95b5ba6c01b7af7f152298f47549cd69e0cde657d29399f48087b1434d93184e0b8d2549772302cce035c9f625ff7de363715a6bcca13ceb829f1285d807785c9729a1e6ee89fc89737bb2bd7a8d66bebb09a10a9090a55ea375608da1c73c77c64ae6dc0a7688a25d6dd8dc998edf60fb51a421c78bab7b698cabc086521d7e78ee5a41ac93955ef4436216daa5af1df1ed7a48ac6f52d723d3c81b13bdce40bf973dfdaae2e29312c8c990ce058659f18d71b75437ccff40480595e13219920f6c0afe7f8290dd1d9bd875f5043155042a8f96a77878422fe10906a039cc5a206002d980aaaf82ed6e650cc3fe27529ea412fdea7bb87a1422c047741b98719756b8b91700a40095cca780cb8b0a6ad77236c8d2ae1e900f1037a6c9098193507cc552e77947c6d8b00407cd4a91d551e2751a2c248c51c77bee75f7195314c1b06813803f3625746b1b971f0a03eacc3b50600c7759ee39c5228e5c76da2200179f6db8ecec631937412b992935a33548af4947088c31607d22836ff5723a0a6d7a40fd7adf11d354e85cd3d22d1b77e3427c3afe648a7c02286706e24453d75278e499bbb4dff1aa6b10e0e1b6b45804ad909707eb663a4ab9300a72705c494bd0cc8bf1b3e0adb4ba9fa432b05abe766115ee8e186a445d3c7048514b012cc74b1eb261f3344a7691437ea2912be0bdff79aae16cdf3b9192850a9f74bf0134e9568acb39aface8e4b571342cc3f86f875735f54d0ce7d263620badb99209f03486de1a6b2c6636870b187c75e64ba51455e9fe45f2ca9d3e44efad80126f9ca4bc02c0a3bc8de68aeb41616089c8ad2e8b88b650a47438c46f055396a378d407b7a4fa0b667d66454f2c7f3e313f72233878e591642f22817b0a36ff4c1d04f03629852509a7a0a9c3f68a423a4ee407b12444b60d2b7db4f902b566258973dbff3f718ca0ac12e7a32d2c88e638c14227009bac9c1cca43c304e48dc6baf650c46a7abf45db4f960a787ce3bea193a39833d0dcba7feb7c3bc322666e4b4c451803252cc4787e53b1754e795e75afa4d74143e59c3820f4c66d31ed635833fc868b200ae59e9e718393cbb8e7a9c5bf144cae1a6b54f812cf99fa8963d977a9633128ba5718f8fca2aa8064d3357c23a70d32ce59e1f3a0c251511ed9780dc1e99ce409773030121edfe31d9819e3346bf02eaa536bc900ca00f8d4c40283564ec5acc82d1a8abc69411ea39d1a4d89ddee2ebc99979147380206565d10f81cc26110a77072d8097e6f6472195465677345e4f9bc9174b7f93088fcde21fe43f3972284e9ef17b3f821397dded316c8716a114e9f90b739b95605969c7e69d8027bae858c1411367b200b3a0be7dcfcbea6e3937388b6e5861d78749ab502610f6a05e90fa525a01272d5345a6a8b659b7b8d95995d4ba4160a5aec0060c92cacf82e796cd798c57fff75094435c90b7ec6fdaaaca33ed2f838f42da96966e0e33477b91c7c34d388c2eda1b18d1c99457281fff70406a05dc18306aecaf77b78cf7fc7a39e7bf7eef38547fb7f0055a768f870e60e0ece6483b7ee85808f132d0c5d013ab929eff21065d8679a751d882a332e27a6752a26c5279c846591f8022f39017e9fff4f29d7dbbffdf4abb1ae93e957903a8d08272113da43fca3d707b56b546e71a1cec088adbcbe136d5402245c2545ef5ed0c9abd8efc46fd323f3da50c4530b59408d7ff08891b8fd3f2ce2cd6938f06c884cf61d974acfec94b6d9e80fcd493d5251750b9101aadc749157a19d2b8fb21e33dd0c2161839898d71bcd9f7906a680c55ae03c9c8ff771f7943d3c8c22f9b14480410353b2ffe7b3ee174ee476fd757360475af4fd419b79b91f00f15c5e59a415e80e32508152be103e2eb487fd0e3bdb9474f2efdf9aeafc2075fe796a510009e2033633390514f141cb82861aa8122280da1ccb0872beb671fa63f860f18194fe08e34d40154fd13e25f09d4fcdf0dde7452803de730f315a87f8fd6369dc20560542a9a8a5816923d730880bc242e0f55a82e44050035b5ff4c5f8fd5b027ad00d249fa3006150d035ca82e59ae7ea97f77afc6dc3ec197444b70a8603875ea9056b7d94f7861ab3ca1106ce3d39af4e20b62d03d2ef0e14d24a020320412ed40748f348a97739cba7c29a24bc2e93f293549f2ff6a7ad2d9ac19360814f659507e64d7e8affcf8e085c543292be5e226138a9938b7824bd7e6e75499c8634580130e846097b212d860354b65aad7a5f1cce9a241eb541739e8e43336a0274f509e1155657e032ab0a1f4fd4d
expected_tx_hash_str = "a4080f0a37837f24ff4512cc0e21c5203e7445b9689303e7add5702c11725e9d";
expected_payment_id_str = "4c3bc77b30f486a5";
desired_amount = 123000000000; // 0.123 xmr
// tx_hash d2287b54215d9d614a9a5366f9d786cbf03a1b45143b6246967a8661404bf62f
txs_hex.emplace_back("02000202000788de17d55fe0779f28a894018a1ea41ff04aff9a245c5442fd58b00ec7ed1acefdd70babd27bc9996683ee71b02791e002000785ac039cee08ace408ffae028bc902f9b1017de457e596ad30bbef6b728135ad7c5a99587577f67bd247172d90f5de9c5c96ad0200024fa7d9ec3be18496b1687cb81351214095a12525cbe07665a271316732e269bc00023f817e4e696261ece3bfc9bd336e6d8047cf721b3d11b3c6c8c86092e654b7252101cca97f40f79fd56224be79145aacc5caf3da52562fdcd92253504b71132a215f0480ecf99603f8e6406cafe0b2bfc38184fd248f3d453943c8d7a82f6b04884e152b48c9be04a365c2158f93a92b40db8d48d71e1afa823e8fa62078afa3246863bb4358c407267c9773b19c8b106facbaea01db47ec18dfe88e64be035c420f4cf0f4aad102efcea4a08b6e28a66683a6114f578091c8d572a77ae27611d40300570033760d76fcdee2ca05378c7c860960ad9d82a6b98e49326c163eeccb51336e10feaef783bab3c64a9ec6612d20e91fb969780a8cecf6c6d4ac1ad2feff092909a60e5824fbf296b47bacfa689e44e731b258d869c570261de2f7018ebad487e9c77ae7eb34ffd04f560d8c25cc3a9a92feb6a3793f96a8116ed86179252553a2b083693e8d6753a66e444a17ec77d2992185943d0ffe78f4dba665c0cc0626da0ed14cb3d97dccb3e91273388fc3a56d21220704a983d03109650b2288338d48e20b2a38feb0667cb1a3e53453f622c83809efdd83d4335a4e9f3db35eaa32937ac30794a36c4dba20fe3e71a1c3bc9e7236c6c669dfc3472564659b151aa79fdde30c067c0f803098d24a303848fe2be0207cdd8859f2607c439c4038c106ea9dcc12ac685cdcfc385ea55beb0c92f144f359518ab867c894d2a9ef94154b4b10601aab08f5d872cee155777994af79b6cbef0c1393e290a64e8916313b96ce8b87922137189362dcce8283bea8ef56ed4ac3b2b05d66a4f3bc1a352194467b69905fc48b6006ee83246695b4b797965d2d050f7640b9f15e7ac6ac7967d6f393c0530e23f68f9f2b2375ba83e3449997b67f73ef987f6fa73bbf0e1aacabad150776f106cfdcb1ff80e9b0d38fdb5d1d39af212af85453b1c39ad2c6eeb225b60231aea27ff2209c453e620967250b3ffe00e91d24a4175972d7b4214deaf5ab78bf26346e9466b35ba3b09a076d0ab705a117e3c914082c36fc11afb9ae21cc35000ae83716aeeae17ef6e297275f2b66d08cac35c5ba7e164238f9b0c3b0f26f5e260257995637de484e87944b809965229150a92696380ddd668f0da7e23deecb565cc8fc83b4ffc0b37508ff8804b96e0998ed5561166eee479a1e35f2cccef5e714e4e674d3a6bfda3f61bc5cc44f948618096c69b7e18daba5e90e4f10815c5b0a3dd8f83f19f1ce17044aa8dd916380f2a0ea255fc9a9d333b2f4b345cc342102538f05a53efb7a792ca73a3d3169b07be7ad293c6eb25bc8311dfffaeef32f02f8c42635c8cf62697c49461fde9c96ac10d00686e4fea0504b26174b7c8318274d5f22781b875a6724254e92feb476072b886d45b24ac42e05454fba09158562faf7521ca452fcfd5748275114fca329af26ce1e2502d4bfb09e094126feeb5faacc2ee40eca14debf5849a4184da52c1640a300345976a741b4e0f0e3c0fcc62d024cabbb93cf595db27df949325ea69a4e091a0e9b5751afa1ec841fed130a0b102ff2ebd378ff0f226523cc6aa283ddd6704d3ebccd72fa3469ac292a9e09060588a436805f6d8d4661843d1b21cf06e19692a5f9dd314e91e92be650bf9eefb3d90cdf15d846eb66f366ce72d9658270bcf748415d73c70585d2e6b5aa0cc40714cec892da2f8b6cca7bd58140fd2799498b0a8e322f6a51a21d7e94b0a37b295664195c4f404e5bab5194138cc1c5d7bd13c4b03528b3484a9ea67519d29c2b15dac7649c3021b6e0d5c3e35501c53bbbdc76944428c941471d10182a904e2e97fb9e71f9730a2b729ca0a57eea55369b6f6a2fe1be86dcf811f8b5505703065bb366ba0a63c7de8fae412b48b66bfc5315ad71673934bcab34ec2b0dae770091436f78ce5a39d9d423a9046d491364877573bef2da6491f4b129f1767dd09b5c215893424906e75802b2227dc750f44cec188fd3cd5a2f38146316b5437e6b451a96bf5ff03c822bf336814e28f25ea55c9524d9f4cc041467bf0911fc9a3269f05b93b70b455b9c3da7a4af186f2d76b66903d929df328f5e884480a975d743e57a14075cb49b665d171d1af6e531610594eeb789fa4f08c10411527a86014e8c78a2625fa3f5bcf0fb9efdc86a247d7acb5e6870d8e2df1553d2b9eea40138578424a38c1d18dd6ef2516caaf36ceb30571049f1676d1ac56a692075ed008a7112ceb04638be47865264ceab829851e85936eb309428652799ad24842c0867daaeac8f734823fbb5cb6098e19ce51bf654000c2332682d4719558bc6130ab72d838b36b8eb9a37fe97bcb6e845699d8d264ba57e954a30b8f998c5615100565b9d36c7ddd2e3d955f3dc68598465f9b532d6f9e24a1f95eeb372ab753a011d6d65a6e47cf891f614402a21da4e6843ac23caf6039ded3caf7011225ad507c0894e2e7567ecbac7ceffc2d80730e29280af11c6d02f77775d5e11d1e2160061326964dae81233054a0967048ff625548d523cda298a4ca8275920b71f850c63cb48af8f28012030f7125eab86c2dcdd7dd0e9f63c5147464aa6f37ee479076c271b76a18d1c6c15b08ddc0d45d82ece5d26464c878b4d697ceecc1a42d9072fb9c72749aacecae2f63ad4893051ee5468949
//tx hash b611bfdeadb1e314fb3056e4fdfd78ab642d904879897fd8a97cec1187fc36e2
// also mine
txs_hex.emplace_back("020002020007999e069ea106abd105878d05921890b201d607bce058c48e04877dac0e044fd3337145912e4d3aa03461d599a562e9f55a32b0020007a3f10e94f502e2488407b5f40190fb05fa8601640cfc0b2c7ab56952fa11a79e0b04f5d2f7e777ec24b83a9d274532418d28bd020002a0f9b3b009f587ade985d327a36c9f0ea961acd06ac03938b898fe20ca13e90600024f021ee3ea942b2180e6bce1d26b9f737c51d2293ae7681edb23d35f6413d9552c0209011182086f2d85a34d01dc1f51b97edb0ff69e5069bc72d5fe14356d9233ef034b2c9e63d52a2eca94e704d081f89603c9bf10fd46e222ec5f32a58f58aa25c723624d78e272992df19a7eba56ce5203f088e38bc479d3c482c2037075b2d7f42c51f8d308ebfa8b2b22dc136e5e9306dc60eaa372e78ffc608fbca486b8863dd1c69ee21ddb31d0a138edd0812cdb0a10b9d866aeae16b57e4fdafddb3ee5fac9d9dcac38399ad6fbf8492e76fd03027ac3088e043b4694eb859f65cd6c90bb3f3191bda436ed8e14af5d6c87cd44a59e235088ee138aeef1c8db94cd602633a186bf412323e01813c5d5e6b84b007ff0ef614cd34d97b0c324eae82131d665d2ec20b14c63cd9996dd6d3a60e79e4fe9b074b2d1012199dba872710f42915ccec5f9f738cad4181c09ddddb39e0815e3b139f5ce0cf2e227262b0598943e4fca0940020c79a9ea56e4f066cb512e27940e6da5a9b0a4ef28fb018842fd7c2509fe636cf75ddc47f225874c5c4a323e4057bc8a3e1567fbd15c3199b90fe2d2627451206a95a8120fda4afeaf485c0bd4d0154cab369b159faf787c9e1e28f4c057157fdcb41e4775a8dbf27c8e1d0e068e11d9495272f56a5be0967d57b30d25f32cf8cd711cd746e22ac260cb538db49d00b5f15af17de9bcca5efaa2c37fc8b7a10666fb1600253f20058c0499e923ce0293475fcd95207eb937a9606bb303873c078eea300cf0ce4cc25024b5025504888bb56fcd50e2c1ab336f50c11103b9700015fc34cfdd893c36e8c42dd4fda09ba491b56db986d2cdf9145e482926e0674b14c00e29efdf6db2f66ac4fc4f624b04a3ad7d8215c0ed707f678d378b0467a0a7891ec14e90a304f54329ec880614427662d7b410f1df2cab582d59e67c4968535c90fe3dbd3c2c60af202c6837b0bbf2045a0182f19bf8a903a972e3dc670097f8c576589c48639ed709e6d53a12b171a11f2bbef879a161e5a457fe2ada7505cf67565b812f23a9ede58df3e6f30682e68a2a761e33e9a6fb7930a9e8a23440fffd21494d4d1cec84bb73cabca29de9019df04bb3d80b9a7ec1574f1fe318215b197c3bd67c9a00587efde888f3e591abe8830cc2d81439e0e66aaade837779d5ccadee4b5352e681a66210cd01a2f054697bc09099eef433e778e4d813b7b4dcdbdcf9cb9cc88e9b74e518004fd189988804321750e5f7d34a811620750eb37355e69b39e5f16a3144062601d576d219301c1ac4d1c861dbc55e15f351d96fd1375895d9cd8592927875620da9afd7b6f5234000e1de31655ad792ee46b5d3f753a22e34d067b09e6badf04e4f2b1abd748231efd6a0518b38b6db12effaa1e8c1e84ea74ac25dc08fbcee19850717349b7203fb63cab46da07206ba1f34ed6e3be374fb9c31f43d1f8488979d59b0c8dd6e605f53372c542111a31a258ae4decfc1f3a09a58cf52a2cc3b0fc027bcd93256db09b5b4b8512335988b61c17e5e4b537bec016128ef7831680c7ddd75c276d2dc27b5786d1f1340693605326dd7f3fb5195fc41404ee092b30f06eba54c0168de43772f1a2e526f4857eed566abc7fd4e0b9ed4fbd43a2bb32f7b45373c11cc97c4a76fab6c5eb9d8bf4ebdf0c208f1bbaee9a1eb8245dae1632f1633152f8d97280255fd37b68069dac69d18768b745958517a1129aaadb1a7e220635ff7648fbb97bc2d136ded6d44f8c9a9e44c0b4435dfa731d6f83f7822e54743c9fa1b07b73f625eb37d66cc5022b756f1fe8efacefd1739b5f6222306c8aed2ece4f0680a1d0c77bcca35085eaec4a1751e89edffab8f51673ae750688b062ff2a2c727e8c52312a352fb2e019a47ddb7021a6ac5b878f80e6b3b3b257c317299114e61ff004053651ccb6c4ad1aa1f236afce29589d45661a8c550761814ffb8510345e2b574921f84bc034ff18e8cfd24d0d8c192da814900c7e8714033d0c73b02a7162c196c906c3aa1338a5b4e7661128a09213665db7ee4cde6e40493bee00b3e26f8f51df1215cd03024057af3c760f5d96a5b65fafbd72585800d520f1ca8fdebe3ec0102c413f5d34e7ce882278925b433b43cb7521ad3a5e30803354ab3bc1ade3fada1f74d4db2e2f7fc64403fca153d67cc9e695643841704f81d6142f42a58fe3d555d723d7eb028415812ff2341e125c073aad767ecd70c66508d9ad17314f95c6675935fab095107644c7575ed4488f86b1c16f7059702ac1cd805ffbac4859e5dc1aeae39e726894a77110405957aca382c3f7c5632024369f2731efc38334096281f90a30620e623c365df9f660b825c8b69e880bd09b4da28085cd89b5d24bb9caaf0e752d63c7932f7936b1bd90483ed7d799c1a0e4cc319873a8356269727c6118ddf3cc0b6844491104006306d220f4093b06a00b4cc912da856b147dfdb94f0fb8f59825a6503b6f9559658b1a1128899bda60fea8b9717925f6be273f12734b2454243b946b6b8d20094c38cfa88cede5cae0732db5668d500dd202355581f1f664179fe07457dda71ddb8f7e66a8537a4df0002d307562bf6530ad970b3c90c44d3628a2a457a3f0a450cee6d637c5670e203ead4cf4d1e1
//tx hash 932768971c60ff6c7c0ccda5e57a1b9f3cce0ccdf068e754994c7dab9deeeb9d
// second tx which has payment_id8 for us
txs_hex.emplace_back("020001020029c7b901df84019745ce67dc158a9304af02b17a97be01cb51a00b8d07db77c512d139cd0cd9179633d850fc9b01ca549e25eba301eb02be74810bf65eb30ed033e350daf701a711e87d9c1251bfcd01f007e226f02a821ed15518fff454382da01b4420cd666dc5f3101314537de00d62042206d4b393bf918a020002cf17a9eb628b54df1f79b400b3cf7bfa6072478ac6ac44ae15be52017a49031100026e9a8ac05e10ab205195790d2d05b33fe1e36d5b211531c40bc4f0a5fc19e4e42c020901d909623975fcf81d01e96b5a97669e10e3efbde814f63b10588171cdaa13987610ea298c17ac8f364f0180e8e0c6fe1513c543dba62fc7f541ae219abcf6e2cf6fa52e041bb9333454c900e48c974e0dfd0594eddb8ed93a20de36636107a1e0155d56494a31cd400fdf2f616834c70e400a6d51cfb19922981638a965e89072c157b5dc25e05a0d4693ab3385d11806dc80f4dcbe03fe9c2d159373333ae90beef668f5742c5134c2333743e612a905cc24c246b0de24cae2ace5d52cb6cd6466ec7a6a73841e8c9f579090b0426fa7b60355f3410d93d84c4f4982926501bb6fcaf56956fa2b1bd19035224175dd090d2f511ab97154dd07f7ce907bfd1d7c73f3787bab6e709a8a17ac622798750d570bcc95e19476d7f089b7e67206acd9103857b15eaf289689ba2023c7bea70e898867594fac0e4febf98e4639e5bf1feb45787563318668bef10fe817396b09bdc308906223e4d2ed3159f139c7b113ac2c76ba25314bce45e2ab938c91e303e13b217f5b242b52ef4d9abb41c0f43b50b7feb9999f64c96b6c38016755140134a0286c561543833e39b53ad2c416c134261a88dbfa530fa76259fbc2345b027e6af732886fd419fbc28a6f779746ce8f79eb08674fc45875e76d632b887c035721c5698f6f6903e8ec586dbcb68d7c6ac36d2545646f34ce762016a722f2070258c4edf5978ddd5294b36b2811ab5e5a9d79e6bd4db15ba7ba7f498c30b70435d9d137ad675993000a34a96e0447691e837a9ad5ab9fd37a4e11bdbd293c0c016b613862ab81b9f7c4a29d0dfa5545ae0f011b01877e113dc727e0582ef3099d3cf9f74056eb03bbe885ff4d4994ee01068b757387a0297a265ed3cb35110bcdbbec8ebdcd47f2bc05bd23070cda5579a190a212df15334d72409faae2ae0a040e5073d1fcfefab1878d92ee7879e8bcf007f92c927186c023adc68b679c0b4a004d9322440e2bfc6cc3616063b93b441bc7e2ea028132a7decd345fc8ab02f59c99d365d29bf5f29bec86d02b17fc3600f4547f91df1708001c3b4331c1029fca83d6a0ab75fdd2cf5856135ca1660d575b51a056b699e9c5ca484937c1033575288ea0008dd86d6a03db025076314a1cfe28ebc3a272828bf79995b0cf05a32f94b64ecb174b47f8bb91f8a7304a329a67c8be114f13abc24ed5aae8c9054ceda8f31794238540ede464b39a1ab9e9fb9d278c232a205c55cfbb8eee0006794656b220c307df5cf5edb24970d61819d33c4fb6efeda7299c2ee70f48fa0f8594d258f0d9cc16c9fe357fd02e2c1175bc888147dcf07c8a91b1ea8bf75a02f252070b92d2eadd8b7ac237ea8a66b768e2f31c4a19061da90807d565f94003fa405f616ebf9d541a2ce3e8b5c18eb3a9ddf80c042d6d6135ddf3e279f97501f2524d1b1a25882b5f4612f84e53eabbd1584226daaf66d9fd5fabcd8488cf054b897567267384094c45d0f5c43ae469642652edccd67a0b0a592d534a69dd02648cd31fb563370cf52a63ff47082ee743b95f1bb2d67e6e63892e3c64cf6905bf9fe4d2de4b6df986b582a2edea49aa6fb4678f44fc30620183e169414bca00fcce26d766793dea307701cf6314534f822b2ef36ccff91d311aa10b97ee6a054a383f338bd7640aa2f85cc9db3bd09bc8097dc71b7f0c8d4d774b6556db030bd0d331e8ea2a7365db5cd35e056bda04232d87098facc68d74a19e2c9ec88f098c5b2d6e37c712a31f216bb0d6fe90607e1cd2918d41525f260bc08a96dc2a0557f00dd8c1a63bf7436d8550ff99afb03c6c3756c5dabc76824362f2983c6e0af327a0a5cbca0f990d34f1fce6ba7dad83a8af01bc64be30f59bb8328555f30fe49fd4a5a48e6a40ee060050c8738111c63ceb178b2d40cc189ed1b4e362140a2cd64f6a3c949ee420902b56f46a0219946cd577fe1ecb38754bf071f2246a01b0a8ac95c5ffd4754b1e000fcb5c2efd8af77938f4f5f13cac9be5e938996306ef828a22c6df9bdc08bb2a8177b9704e7bc09e8fdc7edf28026f3a7e4d024d04e371c775e9c576dc4aa92aa2a6d42e0a65155f393e1e1a88740356cad03ac80c21878944191241e0d0d1786f6e92406972750a81ae17df9d428a9a1960d80d05d933dd55623065e1d47d5fca4fbbf38b8272d771044e78acef9bdc2f71ab9f07fbfab7b280cd6a5b7593cd3ee3b2899b83832fb395440813e897eee6c4efb307b0f7d87c8338837be982081277b05baeea16f5b89d9de6489c55172b1463060163886001f5531354c6d1040eae509217e1fb0480be75bce1504bc5b3c71e990d0c17558ad388a260d02e602cd904af1ec5ba839200cc5a7213ce03d69e09ea0c795919c2a7e4a1b9b4dd5da08c951fdac2bae207ed99d274611d848bede18e08a8083d5ad0684fa3d89a96f9ba1030990f752fd12f8ac25598803bf6ac681f08b46f2013ae00b514f52d9ed1fbc32f450113d6d1454f9628b3d8ed69b987b302330aefcca7d807fc6b134d0319be0aa2d4fa81dec5cd49efa8a41a9851af190613c29735ca5a43872e6f5cd111a2dbe134f0689ff4d78c974
}
vector<string> txs_blobs;
for (auto const& tx_hex: txs_hex)
txs_blobs.push_back(xmreg::hex_to_tx_blob(tx_hex));
for (auto const& tx_blob: txs_blobs)
{
mempool_txs_to_return.emplace_back();
mempool_txs_to_return.back().tx_blob = tx_blob;
}
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillRepeatedly(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
block mock_blk; // just an empty block
EXPECT_CALL(*mcore_ptr, get_block_from_height(_, _))
.WillRepeatedly(DoAll(SetArgReferee<1>(mock_blk),
Return(true)));
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillRepeatedly(Return(true));
ASSERT_TRUE(bcs->read_mempool());
string tx_hash_with_payment;
EXPECT_TRUE(bcs->search_if_payment_made(expected_payment_id_str,
desired_amount,
tx_hash_with_payment));
EXPECT_EQ(tx_hash_with_payment, expected_tx_hash_str);
// desired amount is more than what tx has, so
// it should be false
EXPECT_FALSE(bcs->search_if_payment_made(expected_payment_id_str,
desired_amount*2,
tx_hash_with_payment));
EXPECT_CALL(*mcore_ptr, get_block_from_height(_, _))
.WillRepeatedly(DoAll(SetArgReferee<1>(mock_blk),
Return(false)));
EXPECT_FALSE(bcs->search_if_payment_made(expected_payment_id_str,
desired_amount,
tx_hash_with_payment));
EXPECT_CALL(*mcore_ptr, get_block_from_height(_, _))
.WillRepeatedly(DoAll(SetArgReferee<1>(mock_blk),
Return(true)));
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillRepeatedly(Return(false));
EXPECT_FALSE(bcs->search_if_payment_made(expected_payment_id_str,
desired_amount,
tx_hash_with_payment));
}
TEST_P(BCSTATUS_TEST, GetOutputKey)
{
output_data_t output_to_return {
crypto::rand<crypto::public_key>(),
1000, 2222,
crypto::rand<rct::key>()};
EXPECT_CALL(*mcore_ptr, get_output_key(_, _))
.WillOnce(Return(output_to_return));
output_data_t result = bcs->get_output_key(333 /* any */,
444 /* any */);
EXPECT_EQ(result.pubkey, output_to_return.pubkey);
}
ACTION(MockSearchWhile)
{
cout << "\nMocking while search in txsearch class\n" << endl;
}
TEST_P(BCSTATUS_TEST, StartTxSearchThread)
{
xmreg::XmrAccount acc; // empty, mock account
auto tx_search = std::make_unique<MockTxSearch>();
EXPECT_CALL(*tx_search, operator_fcall()) // mock operator()
.WillOnce(MockSearchWhile());
EXPECT_TRUE(bcs->start_tx_search_thread(acc, std::move(tx_search)));
auto tx_search2 = std::make_unique<MockTxSearch>();
// trying launching the same thread for already running account
// should also return true as this is fine
EXPECT_TRUE(bcs->start_tx_search_thread(acc, std::move(tx_search2)));
6 years ago
// wait a bit, just to give time to tx_search mock thread to finish
// its mocking action
std::this_thread::sleep_for(1s);
}
ACTION(MockSearchWhile2)
{
cout << "\nMocking while search in txsearch class2\n" << endl;
std::this_thread::sleep_for(1s);
}
TEST_P(BCSTATUS_TEST, PingSearchThread)
{
xmreg::XmrAccount acc; // empty, mock account
acc.address = "whatever mock address";
auto tx_search = std::make_unique<MockTxSearch>();
EXPECT_CALL(*tx_search, operator_fcall()) // mock operator()
.WillOnce(MockSearchWhile2());
EXPECT_CALL(*tx_search, ping()).WillOnce(Return());
EXPECT_CALL(*tx_search, still_searching())
.WillRepeatedly(Return(false));
ASSERT_TRUE(bcs->start_tx_search_thread(acc, std::move(tx_search)));
EXPECT_TRUE(bcs->ping_search_thread(acc.address));
while(bcs->search_thread_exist(acc.address))
{
cout << "\nsearch thread still exists\n";
std::this_thread::sleep_for(1s);
bcs->clean_search_thread_map();
}
// once we removed the search thread as it finshed,
// we should be getting false now
EXPECT_FALSE(bcs->ping_search_thread(acc.address));
}
TEST_P(BCSTATUS_TEST, GetSearchedBlkOutputsAndAddrViewkey)
{
xmreg::XmrAccount acc; // empty, mock account
acc.address = "whatever mock address";
auto tx_search = std::make_unique<MockTxSearch>();
EXPECT_CALL(*tx_search, operator_fcall()) // mock operator()
.WillOnce(MockSearchWhile2());
EXPECT_CALL(*tx_search, get_searched_blk_no())
.WillOnce(Return(123));
xmreg::TxSearch::known_outputs_t outputs_to_return;
outputs_to_return.insert({crypto::rand<crypto::public_key>(), 33});
outputs_to_return.insert({crypto::rand<crypto::public_key>(), 44});
outputs_to_return.insert({crypto::rand<crypto::public_key>(), 55});
EXPECT_CALL(*tx_search, get_known_outputs_keys())
.WillOnce(Return(outputs_to_return));
xmreg::TxSearch::addr_view_t mock_address = std::make_pair(
bcs->get_bc_setup().import_payment_address,
bcs->get_bc_setup().import_payment_viewkey);
EXPECT_CALL(*tx_search, get_xmr_address_viewkey())
.WillRepeatedly(Return(mock_address));
EXPECT_CALL(*tx_search, still_searching())
.WillRepeatedly(Return(false));
ASSERT_TRUE(bcs->start_tx_search_thread(acc, std::move(tx_search)));
uint64_t searched_blk_no {0};
EXPECT_TRUE(bcs->get_searched_blk_no(acc.address, searched_blk_no));
xmreg::TxSearch::known_outputs_t outputs_returned;
EXPECT_TRUE(bcs->get_known_outputs_keys(acc.address, outputs_returned));
EXPECT_EQ(outputs_returned.size(), outputs_to_return.size());
address_parse_info address_returned;
crypto::secret_key viewkey_returned;
EXPECT_TRUE(bcs->get_xmr_address_viewkey(acc.address,
address_returned,
viewkey_returned));
//can compare addresses only as string
string address_returned_str
= get_account_address_as_str(GetParam(), false,
address_returned.address);
string mock_address_str
= get_account_address_as_str(GetParam(), false,
mock_address.first.address);
EXPECT_EQ(address_returned_str, mock_address_str);
EXPECT_EQ(viewkey_returned, mock_address.second);
while(bcs->search_thread_exist(acc.address))
{
cout << "\nsearch thread still exists\n";
std::this_thread::sleep_for(1s);
bcs->clean_search_thread_map();
}
// once we removed the search thread as it finshed,
// we should be getting false now
EXPECT_FALSE(bcs->get_searched_blk_no(acc.address, searched_blk_no));
EXPECT_FALSE(bcs->get_known_outputs_keys(acc.address, outputs_returned));
EXPECT_FALSE(bcs->get_xmr_address_viewkey(acc.address,
address_returned,
viewkey_returned));
}
TEST_P(BCSTATUS_TEST, FindTxsInMempool)
{
xmreg::XmrAccount acc; // empty, mock account
acc.address = "whatever mock address";
auto tx_search = std::make_unique<MockTxSearch>();
nlohmann::json txs_to_return = nlohmann::json::array();
txs_to_return.push_back(nlohmann::json {"tx_hash1", "some_tx_hash1"});
txs_to_return.push_back(nlohmann::json {"tx_hash2", "some_tx_hash2"});
txs_to_return.push_back(nlohmann::json {"tx_hash3", "some_tx_hash3"});
vector<string> txs_to_return_json_str;
for (auto& tx_json: txs_to_return)
txs_to_return_json_str.push_back(tx_json.dump());
EXPECT_CALL(*tx_search, mock_find_txs_in_mempool(_,_))
.WillRepeatedly(SetArgReferee<1>(txs_to_return_json_str));
EXPECT_CALL(*tx_search, operator_fcall()) // mock operator()
.WillRepeatedly(MockSearchWhile2());
ASSERT_TRUE(bcs->start_tx_search_thread(acc, std::move(tx_search)));
nlohmann::json txs;
EXPECT_TRUE(bcs->find_txs_in_mempool(acc.address, txs));
while(bcs->search_thread_exist(acc.address))
{
cout << "\nsearch thread still exists\n";
std::this_thread::sleep_for(1s);
bcs->clean_search_thread_map();
}
// once we removed the search thread as it finshed,
// we should be getting false now
EXPECT_FALSE(bcs->find_txs_in_mempool(acc.address, txs));
}
// returns some mock txs in hex or blob form
vector<string>
get_mock_txs_as_str(bool as_blob = false)
{
vector<string> txs_hex;
// tx_hash 2ff79595683b546c8959e353b2c345394ea80694073d9237a146448bb65915dd
txs_hex.emplace_back("02c2d20701ff86d20701f88ceccabdbf06027b0b71991727c05f0ec98bdc0e12fe598acf8eb808790c3692550a464b722ec22101d9d9ddd1f2b7010715195405742af8fa89e12c0d6c3f490c81a08e836e3d516300");
// tx_hash 8a7e09ae4bc4d85153ff85350da82d076461db61e94b321fb727a0fcdd96e8e6
// this tx should have 0.1 xmr for stagnet wallet 53mqDDKtVkib8inMa41HuNJG4tj9CcaNKGr6EVSbvhWGJdpDQCiNNYBUNF1oDb8BczU5aD68d3HNKXaEsPq8cvbQE2FBkTS
// viewkey: 53c5850e895122574c53a4f952c726be3fe22bcd2b08f4bfed8946d887cc950b
// payment_id8: 1f5d434f0b34448b
txs_hex.emplace_back("020002020007bcaa04dc8d028f439601f51d57d302aea425427e03cb7243e20e512bc03a9c7cf2f3a3d6178e8b4e3cb4930945d710020007cd50b92b9af302a2c302d0599203ed0575b11353f8f35d282744185f5107da43f810c2e4dcaac815280860da016320af0200021d3890f92bb851512869bf2336f322e06501b5ea55b000030380833bd0cc51570002d1ff798caaaf37667cfa616e3bb009a5605ab03acf91fed4f4f2eb68c046a5412c0209018f19d83c6f305c75011137a812db81609018a33684ec8350d6f9d2219f235fc9263af85299e246cd0302c0caf0cc3b829bc083f46c4f70d3c5a7dc90908d665c29ad4d2be6ce07f7a1d4b9d55888cb6a76f8fbf6c5daf3d6e57d7233d037db92969f76f459fc4194279f17e359f664f986047e3b121dc9a5c0ae98d22abb96aecbdb14793c11249fda611edda9020b2048913a6a6b0a466ae005f199db5a20138eca1ff0e165f051ef91f4199cc10af8963b0b0d9e4b3dca91dc7e59acc9367ea99572f3b92f4f2718b2975ec6b00c40b0d4bed4589c357d3d785434bc94d4cc60a81a3ad481a9d31cc06f586f790a05fbc095a5d64d8d83d841d51834c5bf81bb91abe5fba2d95a871f6a00aee10601858567a1151d444fdfc43a37aa7a4957e9318e5b221a29d432ba3b4a7b9f5517ecfaedd04adef367e601b5deffae36ce58b06a677612b6d1328e29dd118f0a9a15e4e4b2d672962e7668455b76c62018cabd9a7325a7bb8f62cdbbdd19d109f9694587a5edad9531f2d69826e37882fc13e3bf77cbb76132622658bcaf1f085acfef452ef2f8597186242922a4cbe7bbcecbbd2d832787704564c2e4acb90f41f430abd50bc5f3f2491e3d5a80aaef5a1c9bd7305107cdd99e863dc9808106e8f33289308f51962820dee0662719f4580d2d506292f852516f63e546bdd20f4b33f2be65689e7d099199bb278e3c4de71cba3e067b6e3d3c31362ed505bc01087ae0bc13d793c56119aed7cecde0d16ecd5c85982d90ba0107bd9b5481f006fcb91eeac29745f8b4ed16e80a47df0dba161a6f63f692b3561c2efda7dc68030f0b8a19fbd8d8e7ee2e9985ec945fe19495159586dd076441449818c4dde40bf4fd7ecf3c94531cd061d8cc9af56b983d71120b92d254bc62755363c95ec70eebbc66de97fccf3554d1b92f7929beaab552e4a79cb14a0a0c27df3e2c0fcc044a0531d23c0e05a4935a7de35934ad7a6e50857629f165740dd78fb9fdf8b80694937a2e3949dd16655b2b449252c1eedd4a7ea71d92433e691d38afe7dfa701af904128da0f1c73e61fde12550777a17481cf19cff2b734d49e07510997a70d29bde78592c41e8096552edc844f75febabc80c31bb8904e35c0837645386d0632badc529963ac1bd865231a828cb78b460e3e68269a93845127ae1acd91fd0ec771694d0dffe7fde7863ea3342e5a89ec99cd0b16586524219edc497b65fd0ca6fbcc71c0fa632a38243fdd478bfe0c32e27d9af2d4a36e76b98e8ed770530bc4c70a2543e9c372e84774e82b5fde2f392033550bc9d82d5668d1b1da02c507b007e91d4eec5cb9e7ecf6ab2771c0d18d6f2d7d69747d1d649c58377151320138ca5e283bc244f972b463a2415850205ac8dd33c51178e04f8cc35d1f64fd079446d307d131eee099363b8a77a547e7abacd0597e96f7ef76b79bde0dfb4a014fe147688a9920952a9225248ee0c3fc4271d35936185b3508cd6af1258842087de145522eafd725a8dc9513ab95de2f8c1d9630052f363a7386653326a9df02e1b94e73e074a2543d50d43561868054feaeb999c9460eec6e1d6775bdc013096b67e06a94d90531ac7dd86c8e9573d8da74ebbba45d83fd544ba075adb69000896f2149b8ff594432655b92cd1fa61a0e2425c5b6370267e1929e9fb85d71086dd0923693ee0bc2b3bb76b47ee99703e31ef3f0989793a21f805605ea219201082790b3e37d7e646be945c80ebdd50b648463bd65055f342a66a63edf93c7075b6d28bae1f4579ff9c01a956fe0bba94b32dd941789110579233b51c4bf2500f24ff159a83f4a25651378c397a489fbc3e7b34439b5a5ccdc18182c29e21403fc4c1ce9a230854633887d6da03b20e647aeeb2c3f34d5f894c84295ffec7e0a1f355cf5d64d4c6ff29cc58717cfbcf4aa77e50f3c1307223b15b08401430c071ae7361e88b2137250ae0e29570a8a57acc79aedff9151104cf9d312e51bf2033f28024086377a06b4d8bfb2046ecae1265c727f82c2110b4916e3c1e342da0f4ac3df0a8b4b1ea2668d8b54d2b75ad7596544063d4d4d2ba7e52fdb04dc790860b8c39c75e9c38687ec54d0466ddfc61b9cec3f4a22173a9215fa60281b790b5ddd401de6a48bd6b3166607e7341729432527017b847b39efe9bf15f16d1e039f4ba936878408fed4be7b7dd147ae1ae07028c916711e020d8191438ebed308fc85b0e1969893270c0391e4e0bf988fb132b30c683b3111f04bec6567a9e30a1143edeecb0a552531b5062ceb11afe1db329d066d320690b9ac58971796e4050b93e15885ed31ed69296aa5a3c32ef6d6d68ad2e4ce039c7d4b40044df6550920ffc6a52e051588fdb16c7690acda11bee9554f25933a9afc994a4165cb7c0d33c232d702c6de7a2e7c0a6e12c69d4974477f750975a1561f41214720c9840ddddb15a20b3619ec6943cdcb569abba069dc499cf3b845a3e0c04d6504bb100d6c11ac99a6e61042bffebc157b3ff526e29012cc0feb0249360a35852f328f000d13a31baa0319d657ab11bb2e1e64aa9eb87fec7d93c3840b2cadee0412e20917e8615663e2d7cbb86c74ed382d4f43f242
// tx_hash ac715b386010bd95a506fde0ac0405aa8ad72080b1d7cef257b5b112d9ed84bb
txs_hex.emplace_back("020003020029f7d30185029407bc10800fe119f60fc6019916a008a507b80730eb01e114b609df03ac0b4da40cb002b606f010d410a607b205aa06e915f7018d04d106f70af603b516dc088d18d5055d8e020cb104daa32b6bfb671a92c2f9296e5d09174b509a69ac2e67988533bbbe5d6bf298aa0200298a28a8529d4c870c920f8202992aa203ee0e950ebd0403980226be016cc202b118b114f802c40bf60d8408cb03d611bd07b204c9069203a806169c15bd14e704da14c20e2ce605f205d5038526c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed020029bb3cb315c70db922bd109c22b00af023e0372df701a218f108b902c906a017a201f10fbc1196028c0782088e11e915d203cb048b0adc14ad0d60de01b602ae0651a909c305bc03a511c607980bb7147d8e2a1f1755ef12ce28185821e6b19cb6023d535411bbb7abdced139c923bad020002e4b04f1a4a46e00442df6fbee88056ef5d34fb87d432e232dc3b166be05fdb280002e475a89f6073029a3f6ca09f301d5a88e522e229b0a3e7867b2aa331cb46c8d62101307f043802c7d6460fbf3aab1ad9bddeb417c7a5810382d0b282d2e3ffa860a702a0a7edbbb679a40685a9ae03993e86e96bf3352ef6c7b90137e93053d0ea6ed521b6c86877c467657c7120b66248f4f2cac2293b84310c37ecf409a7a1c7365819387b039a613855d36fa10780922eda8c96c031682e8d35657e209b461a1fa64cdb07cf3ea55659ae1d583cd70ef6944164ab2c35f9ec26addba6cdd6d43287a58bf3e0fb0da0a3784186315a8ea8d8402026cd186c37c794f6d9b4b97f50e6726eda7fca0840d1c4eba4bee47fb53988a6b12fa4fdc661d20446d157eae0ea42a2c69d08008394fb8714a97a9c98858f1f57e1c45530f8ecdebc88a62f8eaa986adcf0940f32e62f9336efcb8a134813c6d9ac94736fea3ae7fa9969bb2acb5697bb3614474a297d61a76e9d352852999229a2f735b8bbefd3fcbb680eec46761959be5c9a33f8e99da8cf4e62cdb05b888cc2cba76020a2ec2b9843ca32565d84b665d901c56eaece700357808d78937231e5433e54bbb943fb6c8159dd9445df6561740a5bc6a6f4344efc2055b2b5c803d9676d7e8630b14c292756761ed158ffc6bb0a5a5243275192efcadfa63fcbb10b0b7b268c438599d37d1bce2bc30558821b035b7f9fb2f70e0f84f53e8b3d822dc42407848db1ae8eca2aca2cedf1fea2ec066332934cf1344d9df0e39c9607c8fd87a78d640d88fd01fc381b22bbbd7945048764e2f891467343ced6671e106d95c357689d59d6212e46931327578b8bce0a52a7bba6272d059cf5384b36fe12b33a26ebf9205c8589e32fb2cf16144dcf00a664150964d1ba8594aa7aa096be927192f7c33f0d9a373d5089a63b86d42d03e41a0dbc08b9b43a3650b2fb3d09be3586a9f3bf954d83b30d06b4cfb50be600ad798ae6903a0230526a1a97e2fdec48eac2757be16911a8694cf793cc408a0e1bbb3c4e3847f456af2d7c02e7a23428656006a488784dc5737c443967c742057ea11da8386a9885473d424f4c269678b4acf1c0f930d168167948b782a166060a4304cc1788e4e04332f2a54467cc373733e6a10b6e392a7948728b77573105e6e130bc88574bd54dc4b44a11f0af6b0eb97e069f113615d75148483fe1ba0536478bb1d745b5b2fc55d0f5237bd2b1b51406242ce195bea8d6882ed8c3c00e2f96ce3479b1d205b803e5b61ec19e69d1a64a0733a109b57d33a9f6063549020615c8604aff59dbeea47e33f3ca7d54002098059bc16d00f4623104cc17b6025a0ae39b2ad8490b54486cde43f214e73e556b5c5449b83fbb18196cd5c5940bc0d13012deadec31c43480138219e65f16dc3c729c943cd60c52cef818f8a30f97fcf04da1eec3efc26c29bd1777265c0940ee617f09952e0422d1d29b8c930cb150bd726365f349eb605aaa646f8d8dbf40aff57a2143ed618e2bf290a41506b5dcbe1e92d49d9bc57eba245f8e407f1ad1639346cd9100c2efc6adad65a40452c75fa8710b33040285ae0a8e5f71ecc471a5b01dbb2a4b9e3f526e7199a808e0b52b08d04600c2b50d67479c677aaa4e736ec8148195ff5c1da47cdf421d0c2c21bd7bc5dbdbed8909600e6f2edfc114382f651ed6be82118f52b4b45633095b89b3ca5333a8d9496c09f672feeab27fb18f750ccd8e00b62e936686351e06f1b017fd1838d4339f8fb9b6db2474815e2ac0a55e745071374ebd328cc22a06e65c6351e87bdeaf9994879b83dbaed95adba0d7fcb18a586f4883f11cdd3503b18b7912ce56293fab4fc17e84efe2d420318feb3be1d15dd06df254047dbc0ea5a82ba611ed0b8b19d1ff9f93e87c9fc00ce0704e7bdbf44ef916c3b29c46022a318ecfa1c6691122c1cd4c2147620ce26bf22e6e7e1d90e3e65b6d9a12bb09cc5d0fc54df90e7b8693b3e641e692fbcfd27137c62f8f8ee4036e543377b5079832faa7a6e07babf92e66880766c5b8cd13a6875ee40af2de1bd99eb1992d0dc79cd62f9034902a442730b9a872e26fac5a9e25c7e469d16f1b2eef7863d9064a80763b846b8ac6f9e81a704e43101cc6868d42b7ba181f59f05a70ebd75d08a821ef222ee4f66149f956367094bad0b93a4ea4f77df5b6c699b3ace1728a076ed7d515bc6a1dc641ff26a668a7b4a20a3272ff72915ee0904639fa62a4ff0f3435194c79b53602bd0e6bb5b6d6a41567fe5fecf4f9db931f757ef4aea46008ec6a0de98e4449b61d3e9552ffbcee27225f335478938ee6cd35dc6a9164870d6d352d594a175bc6f414a558f3
// tx_hash 0124371c3470a1e79053aebd9b9fe859005d7a7cec786f08655ed2cebbc673e3
txs_hex.emplace_back("020002020007da9012f79602f0e30399a20314d7010cd033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000781c609bfd508d71a9efc07d07741df0429e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002f1a558f69093ce2bcf02719bb5a372a9e2b92651b0c861674f4f0f1ca3ac2ba80002cc84eabfa99691044bbb314c08f7f3eed2b7d1c64fc4733c7f7b25f6b0f212812c02090180006f9a80dc79e701eb19d03b9110895caa08788cade55a1ab50f11be91a5ebdbf02b36b27211485404d081f896033702be8d4330b04466a69ca94779dc0c9066e8be85b3513ab6648128c64a80080a85345cd384aaba7c8ba92b8d23a21a4ed27e38134cb3cd3c4fa5701728f80260f567f28a61f9074f1a14ed83532dcd67fde76484d2969a048160799aad8503b37aa103cb3f122b9a03e99ebf890f23e4e0284db56b3965f1b4183edc284f0ceba21af74ed66fa14ddd72e3e07b78abbad53590565747764e64c04e2ba723b0c39894754f95b5ba6c01b7af7f152298f47549cd69e0cde657d29399f48087b1434d93184e0b8d2549772302cce035c9f625ff7de363715a6bcca13ceb829f1285d807785c9729a1e6ee89fc89737bb2bd7a8d66bebb09a10a9090a55ea375608da1c73c77c64ae6dc0a7688a25d6dd8dc998edf60fb51a421c78bab7b698cabc086521d7e78ee5a41ac93955ef4436216daa5af1df1ed7a48ac6f52d723d3c81b13bdce40bf973dfdaae2e29312c8c990ce058659f18d71b75437ccff40480595e13219920f6c0afe7f8290dd1d9bd875f5043155042a8f96a77878422fe10906a039cc5a206002d980aaaf82ed6e650cc3fe27529ea412fdea7bb87a1422c047741b98719756b8b91700a40095cca780cb8b0a6ad77236c8d2ae1e900f1037a6c9098193507cc552e77947c6d8b00407cd4a91d551e2751a2c248c51c77bee75f7195314c1b06813803f3625746b1b971f0a03eacc3b50600c7759ee39c5228e5c76da2200179f6db8ecec631937412b992935a33548af4947088c31607d22836ff5723a0a6d7a40fd7adf11d354e85cd3d22d1b77e3427c3afe648a7c02286706e24453d75278e499bbb4dff1aa6b10e0e1b6b45804ad909707eb663a4ab9300a72705c494bd0cc8bf1b3e0adb4ba9fa432b05abe766115ee8e186a445d3c7048514b012cc74b1eb261f3344a7691437ea2912be0bdff79aae16cdf3b9192850a9f74bf0134e9568acb39aface8e4b571342cc3f86f875735f54d0ce7d263620badb99209f03486de1a6b2c6636870b187c75e64ba51455e9fe45f2ca9d3e44efad80126f9ca4bc02c0a3bc8de68aeb41616089c8ad2e8b88b650a47438c46f055396a378d407b7a4fa0b667d66454f2c7f3e313f72233878e591642f22817b0a36ff4c1d04f03629852509a7a0a9c3f68a423a4ee407b12444b60d2b7db4f902b566258973dbff3f718ca0ac12e7a32d2c88e638c14227009bac9c1cca43c304e48dc6baf650c46a7abf45db4f960a787ce3bea193a39833d0dcba7feb7c3bc322666e4b4c451803252cc4787e53b1754e795e75afa4d74143e59c3820f4c66d31ed635833fc868b200ae59e9e718393cbb8e7a9c5bf144cae1a6b54f812cf99fa8963d977a9633128ba5718f8fca2aa8064d3357c23a70d32ce59e1f3a0c251511ed9780dc1e99ce409773030121edfe31d9819e3346bf02eaa536bc900ca00f8d4c40283564ec5acc82d1a8abc69411ea39d1a4d89ddee2ebc99979147380206565d10f81cc26110a77072d8097e6f6472195465677345e4f9bc9174b7f93088fcde21fe43f3972284e9ef17b3f821397dded316c8716a114e9f90b739b95605969c7e69d8027bae858c1411367b200b3a0be7dcfcbea6e3937388b6e5861d78749ab502610f6a05e90fa525a01272d5345a6a8b659b7b8d95995d4ba4160a5aec0060c92cacf82e796cd798c57fff75094435c90b7ec6fdaaaca33ed2f838f42da96966e0e33477b91c7c34d388c2eda1b18d1c99457281fff70406a05dc18306aecaf77b78cf7fc7a39e7bf7eef38547fb7f0055a768f870e60e0ece6483b7ee85808f132d0c5d013ab929eff21065d8679a751d882a332e27a6752a26c5279c846591f8022f39017e9fff4f29d7dbbffdf4abb1ae93e957903a8d08272113da43fca3d707b56b546e71a1cec088adbcbe136d5402245c2545ef5ed0c9abd8efc46fd323f3da50c4530b59408d7ff08891b8fd3f2ce2cd6938f06c884cf61d974acfec94b6d9e80fcd493d5251750b9101aadc749157a19d2b8fb21e33dd0c2161839898d71bcd9f7906a680c55ae03c9c8ff771f7943d3c8c22f9b14480410353b2ffe7b3ee174ee476fd757360475af4fd419b79b91f00f15c5e59a415e80e32508152be103e2eb487fd0e3bdb9474f2efdf9aeafc2075fe796a510009e2033633390514f141cb82861aa8122280da1ccb0872beb671fa63f860f18194fe08e34d40154fd13e25f09d4fcdf0dde7452803de730f315a87f8fd6369dc20560542a9a8a5816923d730880bc242e0f55a82e44050035b5ff4c5f8fd5b027ad00d249fa3006150d035ca82e59ae7ea97f77afc6dc3ec197444b70a8603875ea9056b7d94f7861ab3ca1106ce3d39af4e20b62d03d2ef0e14d24a020320412ed40748f348a97739cba7c29a24bc2e93f293549f2ff6a7ad2d9ac19360814f659507e64d7e8affcf8e085c543292be5e226138a9938b7824bd7e6e75499c8634580130e846097b212d860354b65aad7a5f1cce9a241eb541739e8e43336a0274f509e1155657e032ab0a1f4fd4d2a0
// tx_hash a4080f0a37837f24ff4512cc0e21c5203e7445b9689303e7add5702c11725e9d
// this tx should have 0.1 xmr for stagnet wallet 9tzmPMTViHYM3z6NAgQni1Qm1Emzxy5hQFibPgWD3LVTAz91yok5Eni1pH6zKhBHzpTU15GZooPHSGHXFvFuXEdmEG2sWAZ
// viewkey: ae6184287ca791609844f140b8502ccfa2223c04c8699cf31fcd0af1f1d0be08
// payment_id8: 4c3bc77b30f486a5
txs_hex.emplace_back("020002020007da9012f79602f0e30399a20314d7010cd033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000781c609bfd508d71a9efc07d07741df0429e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002f1a558f69093ce2bcf02719bb5a372a9e2b92651b0c861674f4f0f1ca3ac2ba80002cc84eabfa99691044bbb314c08f7f3eed2b7d1c64fc4733c7f7b25f6b0f212812c02090180006f9a80dc79e701eb19d03b9110895caa08788cade55a1ab50f11be91a5ebdbf02b36b27211485404d081f896033702be8d4330b04466a69ca94779dc0c9066e8be85b3513ab6648128c64a80080a85345cd384aaba7c8ba92b8d23a21a4ed27e38134cb3cd3c4fa5701728f80260f567f28a61f9074f1a14ed83532dcd67fde76484d2969a048160799aad8503b37aa103cb3f122b9a03e99ebf890f23e4e0284db56b3965f1b4183edc284f0ceba21af74ed66fa14ddd72e3e07b78abbad53590565747764e64c04e2ba723b0c39894754f95b5ba6c01b7af7f152298f47549cd69e0cde657d29399f48087b1434d93184e0b8d2549772302cce035c9f625ff7de363715a6bcca13ceb829f1285d807785c9729a1e6ee89fc89737bb2bd7a8d66bebb09a10a9090a55ea375608da1c73c77c64ae6dc0a7688a25d6dd8dc998edf60fb51a421c78bab7b698cabc086521d7e78ee5a41ac93955ef4436216daa5af1df1ed7a48ac6f52d723d3c81b13bdce40bf973dfdaae2e29312c8c990ce058659f18d71b75437ccff40480595e13219920f6c0afe7f8290dd1d9bd875f5043155042a8f96a77878422fe10906a039cc5a206002d980aaaf82ed6e650cc3fe27529ea412fdea7bb87a1422c047741b98719756b8b91700a40095cca780cb8b0a6ad77236c8d2ae1e900f1037a6c9098193507cc552e77947c6d8b00407cd4a91d551e2751a2c248c51c77bee75f7195314c1b06813803f3625746b1b971f0a03eacc3b50600c7759ee39c5228e5c76da2200179f6db8ecec631937412b992935a33548af4947088c31607d22836ff5723a0a6d7a40fd7adf11d354e85cd3d22d1b77e3427c3afe648a7c02286706e24453d75278e499bbb4dff1aa6b10e0e1b6b45804ad909707eb663a4ab9300a72705c494bd0cc8bf1b3e0adb4ba9fa432b05abe766115ee8e186a445d3c7048514b012cc74b1eb261f3344a7691437ea2912be0bdff79aae16cdf3b9192850a9f74bf0134e9568acb39aface8e4b571342cc3f86f875735f54d0ce7d263620badb99209f03486de1a6b2c6636870b187c75e64ba51455e9fe45f2ca9d3e44efad80126f9ca4bc02c0a3bc8de68aeb41616089c8ad2e8b88b650a47438c46f055396a378d407b7a4fa0b667d66454f2c7f3e313f72233878e591642f22817b0a36ff4c1d04f03629852509a7a0a9c3f68a423a4ee407b12444b60d2b7db4f902b566258973dbff3f718ca0ac12e7a32d2c88e638c14227009bac9c1cca43c304e48dc6baf650c46a7abf45db4f960a787ce3bea193a39833d0dcba7feb7c3bc322666e4b4c451803252cc4787e53b1754e795e75afa4d74143e59c3820f4c66d31ed635833fc868b200ae59e9e718393cbb8e7a9c5bf144cae1a6b54f812cf99fa8963d977a9633128ba5718f8fca2aa8064d3357c23a70d32ce59e1f3a0c251511ed9780dc1e99ce409773030121edfe31d9819e3346bf02eaa536bc900ca00f8d4c40283564ec5acc82d1a8abc69411ea39d1a4d89ddee2ebc99979147380206565d10f81cc26110a77072d8097e6f6472195465677345e4f9bc9174b7f93088fcde21fe43f3972284e9ef17b3f821397dded316c8716a114e9f90b739b95605969c7e69d8027bae858c1411367b200b3a0be7dcfcbea6e3937388b6e5861d78749ab502610f6a05e90fa525a01272d5345a6a8b659b7b8d95995d4ba4160a5aec0060c92cacf82e796cd798c57fff75094435c90b7ec6fdaaaca33ed2f838f42da96966e0e33477b91c7c34d388c2eda1b18d1c99457281fff70406a05dc18306aecaf77b78cf7fc7a39e7bf7eef38547fb7f0055a768f870e60e0ece6483b7ee85808f132d0c5d013ab929eff21065d8679a751d882a332e27a6752a26c5279c846591f8022f39017e9fff4f29d7dbbffdf4abb1ae93e957903a8d08272113da43fca3d707b56b546e71a1cec088adbcbe136d5402245c2545ef5ed0c9abd8efc46fd323f3da50c4530b59408d7ff08891b8fd3f2ce2cd6938f06c884cf61d974acfec94b6d9e80fcd493d5251750b9101aadc749157a19d2b8fb21e33dd0c2161839898d71bcd9f7906a680c55ae03c9c8ff771f7943d3c8c22f9b14480410353b2ffe7b3ee174ee476fd757360475af4fd419b79b91f00f15c5e59a415e80e32508152be103e2eb487fd0e3bdb9474f2efdf9aeafc2075fe796a510009e2033633390514f141cb82861aa8122280da1ccb0872beb671fa63f860f18194fe08e34d40154fd13e25f09d4fcdf0dde7452803de730f315a87f8fd6369dc20560542a9a8a5816923d730880bc242e0f55a82e44050035b5ff4c5f8fd5b027ad00d249fa3006150d035ca82e59ae7ea97f77afc6dc3ec197444b70a8603875ea9056b7d94f7861ab3ca1106ce3d39af4e20b62d03d2ef0e14d24a020320412ed40748f348a97739cba7c29a24bc2e93f293549f2ff6a7ad2d9ac19360814f659507e64d7e8affcf8e085c543292be5e226138a9938b7824bd7e6e75499c8634580130e846097b212d860354b65aad7a5f1cce9a241eb541739e8e43336a0274f509e1155657e032ab0a1f4fd4d2a0
// tx_hash d2287b54215d9d614a9a5366f9d786cbf03a1b45143b6246967a8661404bf62f
txs_hex.emplace_back("02000202000788de17d55fe0779f28a894018a1ea41ff04aff9a245c5442fd58b00ec7ed1acefdd70babd27bc9996683ee71b02791e002000785ac039cee08ace408ffae028bc902f9b1017de457e596ad30bbef6b728135ad7c5a99587577f67bd247172d90f5de9c5c96ad0200024fa7d9ec3be18496b1687cb81351214095a12525cbe07665a271316732e269bc00023f817e4e696261ece3bfc9bd336e6d8047cf721b3d11b3c6c8c86092e654b7252101cca97f40f79fd56224be79145aacc5caf3da52562fdcd92253504b71132a215f0480ecf99603f8e6406cafe0b2bfc38184fd248f3d453943c8d7a82f6b04884e152b48c9be04a365c2158f93a92b40db8d48d71e1afa823e8fa62078afa3246863bb4358c407267c9773b19c8b106facbaea01db47ec18dfe88e64be035c420f4cf0f4aad102efcea4a08b6e28a66683a6114f578091c8d572a77ae27611d40300570033760d76fcdee2ca05378c7c860960ad9d82a6b98e49326c163eeccb51336e10feaef783bab3c64a9ec6612d20e91fb969780a8cecf6c6d4ac1ad2feff092909a60e5824fbf296b47bacfa689e44e731b258d869c570261de2f7018ebad487e9c77ae7eb34ffd04f560d8c25cc3a9a92feb6a3793f96a8116ed86179252553a2b083693e8d6753a66e444a17ec77d2992185943d0ffe78f4dba665c0cc0626da0ed14cb3d97dccb3e91273388fc3a56d21220704a983d03109650b2288338d48e20b2a38feb0667cb1a3e53453f622c83809efdd83d4335a4e9f3db35eaa32937ac30794a36c4dba20fe3e71a1c3bc9e7236c6c669dfc3472564659b151aa79fdde30c067c0f803098d24a303848fe2be0207cdd8859f2607c439c4038c106ea9dcc12ac685cdcfc385ea55beb0c92f144f359518ab867c894d2a9ef94154b4b10601aab08f5d872cee155777994af79b6cbef0c1393e290a64e8916313b96ce8b87922137189362dcce8283bea8ef56ed4ac3b2b05d66a4f3bc1a352194467b69905fc48b6006ee83246695b4b797965d2d050f7640b9f15e7ac6ac7967d6f393c0530e23f68f9f2b2375ba83e3449997b67f73ef987f6fa73bbf0e1aacabad150776f106cfdcb1ff80e9b0d38fdb5d1d39af212af85453b1c39ad2c6eeb225b60231aea27ff2209c453e620967250b3ffe00e91d24a4175972d7b4214deaf5ab78bf26346e9466b35ba3b09a076d0ab705a117e3c914082c36fc11afb9ae21cc35000ae83716aeeae17ef6e297275f2b66d08cac35c5ba7e164238f9b0c3b0f26f5e260257995637de484e87944b809965229150a92696380ddd668f0da7e23deecb565cc8fc83b4ffc0b37508ff8804b96e0998ed5561166eee479a1e35f2cccef5e714e4e674d3a6bfda3f61bc5cc44f948618096c69b7e18daba5e90e4f10815c5b0a3dd8f83f19f1ce17044aa8dd916380f2a0ea255fc9a9d333b2f4b345cc342102538f05a53efb7a792ca73a3d3169b07be7ad293c6eb25bc8311dfffaeef32f02f8c42635c8cf62697c49461fde9c96ac10d00686e4fea0504b26174b7c8318274d5f22781b875a6724254e92feb476072b886d45b24ac42e05454fba09158562faf7521ca452fcfd5748275114fca329af26ce1e2502d4bfb09e094126feeb5faacc2ee40eca14debf5849a4184da52c1640a300345976a741b4e0f0e3c0fcc62d024cabbb93cf595db27df949325ea69a4e091a0e9b5751afa1ec841fed130a0b102ff2ebd378ff0f226523cc6aa283ddd6704d3ebccd72fa3469ac292a9e09060588a436805f6d8d4661843d1b21cf06e19692a5f9dd314e91e92be650bf9eefb3d90cdf15d846eb66f366ce72d9658270bcf748415d73c70585d2e6b5aa0cc40714cec892da2f8b6cca7bd58140fd2799498b0a8e322f6a51a21d7e94b0a37b295664195c4f404e5bab5194138cc1c5d7bd13c4b03528b3484a9ea67519d29c2b15dac7649c3021b6e0d5c3e35501c53bbbdc76944428c941471d10182a904e2e97fb9e71f9730a2b729ca0a57eea55369b6f6a2fe1be86dcf811f8b5505703065bb366ba0a63c7de8fae412b48b66bfc5315ad71673934bcab34ec2b0dae770091436f78ce5a39d9d423a9046d491364877573bef2da6491f4b129f1767dd09b5c215893424906e75802b2227dc750f44cec188fd3cd5a2f38146316b5437e6b451a96bf5ff03c822bf336814e28f25ea55c9524d9f4cc041467bf0911fc9a3269f05b93b70b455b9c3da7a4af186f2d76b66903d929df328f5e884480a975d743e57a14075cb49b665d171d1af6e531610594eeb789fa4f08c10411527a86014e8c78a2625fa3f5bcf0fb9efdc86a247d7acb5e6870d8e2df1553d2b9eea40138578424a38c1d18dd6ef2516caaf36ceb30571049f1676d1ac56a692075ed008a7112ceb04638be47865264ceab829851e85936eb309428652799ad24842c0867daaeac8f734823fbb5cb6098e19ce51bf654000c2332682d4719558bc6130ab72d838b36b8eb9a37fe97bcb6e845699d8d264ba57e954a30b8f998c5615100565b9d36c7ddd2e3d955f3dc68598465f9b532d6f9e24a1f95eeb372ab753a011d6d65a6e47cf891f614402a21da4e6843ac23caf6039ded3caf7011225ad507c0894e2e7567ecbac7ceffc2d80730e29280af11c6d02f77775d5e11d1e2160061326964dae81233054a0967048ff625548d523cda298a4ca8275920b71f850c63cb48af8f28012030f7125eab86c2dcdd7dd0e9f63c5147464aa6f37ee479076c271b76a18d1c6c15b08ddc0d45d82ece5d26464c878b4d697ceecc1a42d9072fb9c72749aacecae2f63ad4893051ee5468949fc7
//tx hash b611bfdeadb1e314fb3056e4fdfd78ab642d904879897fd8a97cec1187fc36e2
// also mine
txs_hex.emplace_back("020002020007999e069ea106abd105878d05921890b201d607bce058c48e04877dac0e044fd3337145912e4d3aa03461d599a562e9f55a32b0020007a3f10e94f502e2488407b5f40190fb05fa8601640cfc0b2c7ab56952fa11a79e0b04f5d2f7e777ec24b83a9d274532418d28bd020002a0f9b3b009f587ade985d327a36c9f0ea961acd06ac03938b898fe20ca13e90600024f021ee3ea942b2180e6bce1d26b9f737c51d2293ae7681edb23d35f6413d9552c0209011182086f2d85a34d01dc1f51b97edb0ff69e5069bc72d5fe14356d9233ef034b2c9e63d52a2eca94e704d081f89603c9bf10fd46e222ec5f32a58f58aa25c723624d78e272992df19a7eba56ce5203f088e38bc479d3c482c2037075b2d7f42c51f8d308ebfa8b2b22dc136e5e9306dc60eaa372e78ffc608fbca486b8863dd1c69ee21ddb31d0a138edd0812cdb0a10b9d866aeae16b57e4fdafddb3ee5fac9d9dcac38399ad6fbf8492e76fd03027ac3088e043b4694eb859f65cd6c90bb3f3191bda436ed8e14af5d6c87cd44a59e235088ee138aeef1c8db94cd602633a186bf412323e01813c5d5e6b84b007ff0ef614cd34d97b0c324eae82131d665d2ec20b14c63cd9996dd6d3a60e79e4fe9b074b2d1012199dba872710f42915ccec5f9f738cad4181c09ddddb39e0815e3b139f5ce0cf2e227262b0598943e4fca0940020c79a9ea56e4f066cb512e27940e6da5a9b0a4ef28fb018842fd7c2509fe636cf75ddc47f225874c5c4a323e4057bc8a3e1567fbd15c3199b90fe2d2627451206a95a8120fda4afeaf485c0bd4d0154cab369b159faf787c9e1e28f4c057157fdcb41e4775a8dbf27c8e1d0e068e11d9495272f56a5be0967d57b30d25f32cf8cd711cd746e22ac260cb538db49d00b5f15af17de9bcca5efaa2c37fc8b7a10666fb1600253f20058c0499e923ce0293475fcd95207eb937a9606bb303873c078eea300cf0ce4cc25024b5025504888bb56fcd50e2c1ab336f50c11103b9700015fc34cfdd893c36e8c42dd4fda09ba491b56db986d2cdf9145e482926e0674b14c00e29efdf6db2f66ac4fc4f624b04a3ad7d8215c0ed707f678d378b0467a0a7891ec14e90a304f54329ec880614427662d7b410f1df2cab582d59e67c4968535c90fe3dbd3c2c60af202c6837b0bbf2045a0182f19bf8a903a972e3dc670097f8c576589c48639ed709e6d53a12b171a11f2bbef879a161e5a457fe2ada7505cf67565b812f23a9ede58df3e6f30682e68a2a761e33e9a6fb7930a9e8a23440fffd21494d4d1cec84bb73cabca29de9019df04bb3d80b9a7ec1574f1fe318215b197c3bd67c9a00587efde888f3e591abe8830cc2d81439e0e66aaade837779d5ccadee4b5352e681a66210cd01a2f054697bc09099eef433e778e4d813b7b4dcdbdcf9cb9cc88e9b74e518004fd189988804321750e5f7d34a811620750eb37355e69b39e5f16a3144062601d576d219301c1ac4d1c861dbc55e15f351d96fd1375895d9cd8592927875620da9afd7b6f5234000e1de31655ad792ee46b5d3f753a22e34d067b09e6badf04e4f2b1abd748231efd6a0518b38b6db12effaa1e8c1e84ea74ac25dc08fbcee19850717349b7203fb63cab46da07206ba1f34ed6e3be374fb9c31f43d1f8488979d59b0c8dd6e605f53372c542111a31a258ae4decfc1f3a09a58cf52a2cc3b0fc027bcd93256db09b5b4b8512335988b61c17e5e4b537bec016128ef7831680c7ddd75c276d2dc27b5786d1f1340693605326dd7f3fb5195fc41404ee092b30f06eba54c0168de43772f1a2e526f4857eed566abc7fd4e0b9ed4fbd43a2bb32f7b45373c11cc97c4a76fab6c5eb9d8bf4ebdf0c208f1bbaee9a1eb8245dae1632f1633152f8d97280255fd37b68069dac69d18768b745958517a1129aaadb1a7e220635ff7648fbb97bc2d136ded6d44f8c9a9e44c0b4435dfa731d6f83f7822e54743c9fa1b07b73f625eb37d66cc5022b756f1fe8efacefd1739b5f6222306c8aed2ece4f0680a1d0c77bcca35085eaec4a1751e89edffab8f51673ae750688b062ff2a2c727e8c52312a352fb2e019a47ddb7021a6ac5b878f80e6b3b3b257c317299114e61ff004053651ccb6c4ad1aa1f236afce29589d45661a8c550761814ffb8510345e2b574921f84bc034ff18e8cfd24d0d8c192da814900c7e8714033d0c73b02a7162c196c906c3aa1338a5b4e7661128a09213665db7ee4cde6e40493bee00b3e26f8f51df1215cd03024057af3c760f5d96a5b65fafbd72585800d520f1ca8fdebe3ec0102c413f5d34e7ce882278925b433b43cb7521ad3a5e30803354ab3bc1ade3fada1f74d4db2e2f7fc64403fca153d67cc9e695643841704f81d6142f42a58fe3d555d723d7eb028415812ff2341e125c073aad767ecd70c66508d9ad17314f95c6675935fab095107644c7575ed4488f86b1c16f7059702ac1cd805ffbac4859e5dc1aeae39e726894a77110405957aca382c3f7c5632024369f2731efc38334096281f90a30620e623c365df9f660b825c8b69e880bd09b4da28085cd89b5d24bb9caaf0e752d63c7932f7936b1bd90483ed7d799c1a0e4cc319873a8356269727c6118ddf3cc0b6844491104006306d220f4093b06a00b4cc912da856b147dfdb94f0fb8f59825a6503b6f9559658b1a1128899bda60fea8b9717925f6be273f12734b2454243b946b6b8d20094c38cfa88cede5cae0732db5668d500dd202355581f1f664179fe07457dda71ddb8f7e66a8537a4df0002d307562bf6530ad970b3c90c44d3628a2a457a3f0a450cee6d637c5670e203ead4cf4d1e1c25
//tx hash 932768971c60ff6c7c0ccda5e57a1b9f3cce0ccdf068e754994c7dab9deeeb9d
// second tx which has payment_id8 for us
txs_hex.emplace_back("020001020029c7b901df84019745ce67dc158a9304af02b17a97be01cb51a00b8d07db77c512d139cd0cd9179633d850fc9b01ca549e25eba301eb02be74810bf65eb30ed033e350daf701a711e87d9c1251bfcd01f007e226f02a821ed15518fff454382da01b4420cd666dc5f3101314537de00d62042206d4b393bf918a020002cf17a9eb628b54df1f79b400b3cf7bfa6072478ac6ac44ae15be52017a49031100026e9a8ac05e10ab205195790d2d05b33fe1e36d5b211531c40bc4f0a5fc19e4e42c020901d909623975fcf81d01e96b5a97669e10e3efbde814f63b10588171cdaa13987610ea298c17ac8f364f0180e8e0c6fe1513c543dba62fc7f541ae219abcf6e2cf6fa52e041bb9333454c900e48c974e0dfd0594eddb8ed93a20de36636107a1e0155d56494a31cd400fdf2f616834c70e400a6d51cfb19922981638a965e89072c157b5dc25e05a0d4693ab3385d11806dc80f4dcbe03fe9c2d159373333ae90beef668f5742c5134c2333743e612a905cc24c246b0de24cae2ace5d52cb6cd6466ec7a6a73841e8c9f579090b0426fa7b60355f3410d93d84c4f4982926501bb6fcaf56956fa2b1bd19035224175dd090d2f511ab97154dd07f7ce907bfd1d7c73f3787bab6e709a8a17ac622798750d570bcc95e19476d7f089b7e67206acd9103857b15eaf289689ba2023c7bea70e898867594fac0e4febf98e4639e5bf1feb45787563318668bef10fe817396b09bdc308906223e4d2ed3159f139c7b113ac2c76ba25314bce45e2ab938c91e303e13b217f5b242b52ef4d9abb41c0f43b50b7feb9999f64c96b6c38016755140134a0286c561543833e39b53ad2c416c134261a88dbfa530fa76259fbc2345b027e6af732886fd419fbc28a6f779746ce8f79eb08674fc45875e76d632b887c035721c5698f6f6903e8ec586dbcb68d7c6ac36d2545646f34ce762016a722f2070258c4edf5978ddd5294b36b2811ab5e5a9d79e6bd4db15ba7ba7f498c30b70435d9d137ad675993000a34a96e0447691e837a9ad5ab9fd37a4e11bdbd293c0c016b613862ab81b9f7c4a29d0dfa5545ae0f011b01877e113dc727e0582ef3099d3cf9f74056eb03bbe885ff4d4994ee01068b757387a0297a265ed3cb35110bcdbbec8ebdcd47f2bc05bd23070cda5579a190a212df15334d72409faae2ae0a040e5073d1fcfefab1878d92ee7879e8bcf007f92c927186c023adc68b679c0b4a004d9322440e2bfc6cc3616063b93b441bc7e2ea028132a7decd345fc8ab02f59c99d365d29bf5f29bec86d02b17fc3600f4547f91df1708001c3b4331c1029fca83d6a0ab75fdd2cf5856135ca1660d575b51a056b699e9c5ca484937c1033575288ea0008dd86d6a03db025076314a1cfe28ebc3a272828bf79995b0cf05a32f94b64ecb174b47f8bb91f8a7304a329a67c8be114f13abc24ed5aae8c9054ceda8f31794238540ede464b39a1ab9e9fb9d278c232a205c55cfbb8eee0006794656b220c307df5cf5edb24970d61819d33c4fb6efeda7299c2ee70f48fa0f8594d258f0d9cc16c9fe357fd02e2c1175bc888147dcf07c8a91b1ea8bf75a02f252070b92d2eadd8b7ac237ea8a66b768e2f31c4a19061da90807d565f94003fa405f616ebf9d541a2ce3e8b5c18eb3a9ddf80c042d6d6135ddf3e279f97501f2524d1b1a25882b5f4612f84e53eabbd1584226daaf66d9fd5fabcd8488cf054b897567267384094c45d0f5c43ae469642652edccd67a0b0a592d534a69dd02648cd31fb563370cf52a63ff47082ee743b95f1bb2d67e6e63892e3c64cf6905bf9fe4d2de4b6df986b582a2edea49aa6fb4678f44fc30620183e169414bca00fcce26d766793dea307701cf6314534f822b2ef36ccff91d311aa10b97ee6a054a383f338bd7640aa2f85cc9db3bd09bc8097dc71b7f0c8d4d774b6556db030bd0d331e8ea2a7365db5cd35e056bda04232d87098facc68d74a19e2c9ec88f098c5b2d6e37c712a31f216bb0d6fe90607e1cd2918d41525f260bc08a96dc2a0557f00dd8c1a63bf7436d8550ff99afb03c6c3756c5dabc76824362f2983c6e0af327a0a5cbca0f990d34f1fce6ba7dad83a8af01bc64be30f59bb8328555f30fe49fd4a5a48e6a40ee060050c8738111c63ceb178b2d40cc189ed1b4e362140a2cd64f6a3c949ee420902b56f46a0219946cd577fe1ecb38754bf071f2246a01b0a8ac95c5ffd4754b1e000fcb5c2efd8af77938f4f5f13cac9be5e938996306ef828a22c6df9bdc08bb2a8177b9704e7bc09e8fdc7edf28026f3a7e4d024d04e371c775e9c576dc4aa92aa2a6d42e0a65155f393e1e1a88740356cad03ac80c21878944191241e0d0d1786f6e92406972750a81ae17df9d428a9a1960d80d05d933dd55623065e1d47d5fca4fbbf38b8272d771044e78acef9bdc2f71ab9f07fbfab7b280cd6a5b7593cd3ee3b2899b83832fb395440813e897eee6c4efb307b0f7d87c8338837be982081277b05baeea16f5b89d9de6489c55172b1463060163886001f5531354c6d1040eae509217e1fb0480be75bce1504bc5b3c71e990d0c17558ad388a260d02e602cd904af1ec5ba839200cc5a7213ce03d69e09ea0c795919c2a7e4a1b9b4dd5da08c951fdac2bae207ed99d274611d848bede18e08a8083d5ad0684fa3d89a96f9ba1030990f752fd12f8ac25598803bf6ac681f08b46f2013ae00b514f52d9ed1fbc32f450113d6d1454f9628b3d8ed69b987b302330aefcca7d807fc6b134d0319be0aa2d4fa81dec5cd49efa8a41a9851af190613c29735ca5a43872e6f5cd111a2dbe134f0689ff4d78c9745c9
if (as_blob)
{
vector<string> txs_blobs;
for (auto const& tx_hex: txs_hex)
txs_blobs.push_back(xmreg::hex_to_tx_blob(tx_hex));
return txs_blobs;
}
return txs_hex;
}
TEST_P(BCSTATUS_TEST, FindTxsInMempool2)
{
vector<tx_info> mempool_txs_to_return;
vector<string> txs_blobs = get_mock_txs_as_str(true);
transaction selected_tx;
crypto::hash tx_hash;
crypto::hash tx_prefix_hash;
ASSERT_TRUE(parse_and_validate_tx_from_blob(
txs_blobs.at(2), selected_tx, tx_hash, tx_prefix_hash));
for (auto const& tx_blob: txs_blobs)
{
mempool_txs_to_return.emplace_back();
mempool_txs_to_return.back().tx_blob = tx_blob;
}
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillRepeatedly(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
ASSERT_TRUE(bcs->read_mempool());
transaction tx;
EXPECT_TRUE(bcs->find_tx_in_mempool(tx_hash, tx));
EXPECT_EQ(tx_hash, get_transaction_hash(tx));
crypto::hash non_existing_tx_hash = crypto::rand<crypto::hash>();
EXPECT_FALSE(bcs->find_tx_in_mempool(non_existing_tx_hash, tx));
}
TEST_P(BCSTATUS_TEST, FindKeyImagesInMempool)
{
vector<tx_info> mempool_txs_to_return;
vector<string> txs_blobs = get_mock_txs_as_str(true);
for (auto const& tx_blob: txs_blobs)
{
mempool_txs_to_return.emplace_back();
mempool_txs_to_return.back().tx_blob = tx_blob;
}
EXPECT_CALL(*mcore_ptr, get_mempool_txs(_, _))
.WillRepeatedly(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
ASSERT_TRUE(bcs->read_mempool());
}
INSTANTIATE_TEST_CASE_P(
DifferentMoneroNetworks, BCSTATUS_TEST,
::testing::Values(
network_type::MAINNET,
network_type::TESTNET,
network_type::STAGENET));
6 years ago
}