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

1543 lines
869 KiB

6 years ago
#include "src/MicroCore.h"
6 years ago
#include "../src/CurrentBlockchainStatus.h"
#include "../src/ThreadRAII.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "helpers.h"
#include "mocks.h"
6 years ago
namespace
{
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();
tp = std::make_unique<TP::ThreadPool>();
tp_ptr = tp.get();
bcs = std::make_unique<xmreg::CurrentBlockchainStatus>(
bc_setup, std::move(mcore), std::move(rpc),
std::move(tp));
}
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;
std::unique_ptr<TP::ThreadPool> tp;
6 years ago
std::unique_ptr<xmreg::CurrentBlockchainStatus> bcs;
MockMicroCore* mcore_ptr;
MockRPCCalls* rpc_ptr;
TP::ThreadPool* tp_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, 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, GetTx)
{
// tx_hash 2ff79595683b546c8959e353b2c345394ea80694073d9237a146448bb65915dd
string tx_hex {"02c2d20701ff86d20701f88ceccabdbf06027b0b71991727c05f0ec98bdc0e12fe598acf8eb808790c3692550a464b722ec22101d9d9ddd1f2b7010715195405742af8fa89e12c0d6c3f490c81a08e836e3d516300"};
TX_FROM_HEX(tx_hex);
EXPECT_CALL(*mcore_ptr, get_tx(_, _))
.WillRepeatedly(DoAll(SetArgReferee<1>(tx),
Return(true)));
crypto::hash any_tx_hash;
transaction returned_tx;
// using tx_hash
EXPECT_TRUE(bcs->get_tx(any_tx_hash, returned_tx));
EXPECT_EQ(get_transaction_hash(returned_tx), tx_hash);
// tx_hash as string
transaction returned_tx2;
EXPECT_TRUE(bcs->get_tx(tx_hash_str, returned_tx2));
EXPECT_EQ(get_transaction_hash(returned_tx), tx_hash);
// tx hash as string fails to parse
EXPECT_FALSE(bcs->get_tx("hash of wrong format", returned_tx2));
}
//MOCK_CONST_METHOD1(get_tx_block_height,
// uint64_t(crypto::hash const& tx_hash));
TEST_P(BCSTATUS_TEST, GetTxBlockHeight)
{
// tx_hash 2ff79595683b546c8959e353b2c345394ea80694073d9237a146448bb65915dd
string tx_hex {"02c2d20701ff86d20701f88ceccabdbf06027b0b71991727c05f0ec98bdc0e12fe598acf8eb808790c3692550a464b722ec22101d9d9ddd1f2b7010715195405742af8fa89e12c0d6c3f490c81a08e836e3d516300"};
TX_FROM_HEX(tx_hex);
EXPECT_CALL(*mcore_ptr, have_tx(_))
.WillOnce(Return(true));
EXPECT_CALL(*mcore_ptr, get_tx_block_height(_))
.WillRepeatedly(Return(123));
int64_t height_returned;
EXPECT_TRUE(bcs->get_tx_block_height(tx_hash, height_returned));
EXPECT_EQ(height_returned, 123);
// tx does not exist
EXPECT_CALL(*mcore_ptr, have_tx(_))
.WillOnce(Return(false));
EXPECT_FALSE(bcs->get_tx_block_height(tx_hash, height_returned));
}
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 /* output idx */);
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(*rpc_ptr, get_current_height(_))
.WillOnce(SetArgReferee<0>(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(*rpc_ptr, get_current_height(_))
.WillOnce(SetArgReferee<0>(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(*rpc_ptr, get_current_height(_))
.WillOnce(SetArgReferee<0>(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_base_fee_estimate(_))
.WillOnce(Return(3333));
EXPECT_EQ(bcs->get_dynamic_per_kb_fee_estimate(), 3333 * 1024);
}
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;
ASSERT_TRUE(xmreg::hex_to_tx_blob(tx_4b40_hex, tx_blob));
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
6 years ago
{
EXPECT_TRUE(true);
return;
}
vector<tx_info> mempool_txs_to_return;
6 years ago
vector<string> txs_hex;
string expected_payment_id_str;
6 years ago
uint64_t desired_amount {0}; // 0.1 xmr
6 years ago
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";
6 years ago
desired_amount = 100000000000ull; // 0.1 xmr
6 years ago
// tx_hash ac715b386010bd95a506fde0ac0405aa8ad72080b1d7cef257b5b112d9ed84bb
txs_hex.emplace_back("020003020029f7d30185029407bc10800fe119f60fc6019916a008a507b80730eb01e114b609df03ac0b4da40cb002b606f010d410a607b205aa06e915f7018d04d106f70af603b516dc088d18d5055d8e020cb104daa32b6bfb671a92c2f9296e5d09174b509a69ac2e67988533bbbe5d6bf298aa0200298a28a8529d4c870c920f8202992aa203ee0e950ebd0403980226be016cc202b118b114f802c40bf60d8408cb03d611bd07b204c9069203a806169c15bd14e704da14c20e2ce605f205d5038526c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed020029bb3cb315c70db922bd109c22b00af023e0372df701a218f108b902c906a017a201f10fbc1196028c0782088e11e915d203cb048b0adc14ad0d60de01b602ae0651a909c305bc03a511c607980bb7147d8e2a1f1755ef12ce28185821e6b19cb6023d535411bbb7abdced139c923bad020002e4b04f1a4a46e00442df6fbee88056ef5d34fb87d432e232dc3b166be05fdb280002e475a89f6073029a3f6ca09f301d5a88e522e229b0a3e7867b2aa331cb46c8d62101307f043802c7d6460fbf3aab1ad9bddeb417c7a5810382d0b282d2e3ffa860a702a0a7edbbb679a40685a9ae03993e86e96bf3352ef6c7b90137e93053d0ea6ed521b6c86877c467657c7120b66248f4f2cac2293b84310c37ecf409a7a1c7365819387b039a613855d36fa10780922eda8c96c031682e8d35657e209b461a1fa64cdb07cf3ea55659ae1d583cd70ef6944164ab2c35f9ec26addba6cdd6d43287a58bf3e0fb0da0a3784186315a8ea8d8402026cd186c37c794f6d9b4b97f50e6726eda7fca0840d1c4eba4bee47fb53988a6b12fa4fdc661d20446d157eae0ea42a2c69d08008394fb8714a97a9c98858f1f57e1c45530f8ecdebc88a62f8eaa986adcf0940f32e62f9336efcb8a134813c6d9ac94736fea3ae7fa9969bb2acb5697bb3614474a297d61a76e9d352852999229a2f735b8bbefd3fcbb680eec46761959be5c9a33f8e99da8cf4e62cdb05b888cc2cba76020a2ec2b9843ca32565d84b665d901c56eaece700357808d78937231e5433e54bbb943fb6c8159dd9445df6561740a5bc6a6f4344efc2055b2b5c803d9676d7e8630b14c292756761ed158ffc6bb0a5a5243275192efcadfa63fcbb10b0b7b268c438599d37d1bce2bc30558821b035b7f9fb2f70e0f84f53e8b3d822dc42407848db1ae8eca2aca2cedf1fea2ec066332934cf1344d9df0e39c9607c8fd87a78d640d88fd01fc381b22bbbd7945048764e2f891467343ced6671e106d95c357689d59d6212e46931327578b8bce0a52a7bba6272d059cf5384b36fe12b33a26ebf9205c8589e32fb2cf16144dcf00a664150964d1ba8594aa7aa096be927192f7c33f0d9a373d5089a63b86d42d03e41a0dbc08b9b43a3650b2fb3d09be3586a9f3bf954d83b30d06b4cfb50be600ad798ae6903a0230526a1a97e2fdec48eac2757be16911a8694cf793cc408a0e1bbb3c4e3847f456af2d7c02e7a23428656006a488784dc5737c443967c742057ea11da8386a9885473d424f4c269678b4acf1c0f930d168167948b782a166060a4304cc1788e4e04332f2a54467cc373733e6a10b6e392a7948728b77573105e6e130bc88574bd54dc4b44a11f0af6b0eb97e069f113615d75148483fe1ba0536478bb1d745b5b2fc55d0f5237bd2b1b51406242ce195bea8d6882ed8c3c00e2f96ce3479b1d205b803e5b61ec19e69d1a64a0733a109b57d33a9f6063549020615c8604aff59dbeea47e33f3ca7d54002098059bc16d00f4623104cc17b6025a0ae39b2ad8490b54486cde43f214e73e556b5c5449b83fbb18196cd5c5940bc0d13012deadec31c43480138219e65f16dc3c729c943cd60c52cef818f8a30f97fcf04da1eec3efc26c29bd1777265c0940ee617f09952e0422d1d29b8c930cb150bd726365f349eb605aaa646f8d8dbf40aff57a2143ed618e2bf290a41506b5dcbe1e92d49d9bc57eba245f8e407f1ad1639346cd9100c2efc6adad65a40452c75fa8710b33040285ae0a8e5f71ecc471a5b01dbb2a4b9e3f526e7199a808e0b52b08d04600c2b50d67479c677aaa4e736ec8148195ff5c1da47cdf421d0c2c21bd7bc5dbdbed8909600e6f2edfc114382f651ed6be82118f52b4b45633095b89b3ca5333a8d9496c09f672feeab27fb18f750ccd8e00b62e936686351e06f1b017fd1838d4339f8fb9b6db2474815e2ac0a55e745071374ebd328cc22a06e65c6351e87bdeaf9994879b83dbaed95adba0d7fcb18a586f4883f11cdd3503b18b7912ce56293fab4fc17e84efe2d420318feb3be1d15dd06df254047dbc0ea5a82ba611ed0b8b19d1ff9f93e87c9fc00ce0704e7bdbf44ef916c3b29c46022a318ecfa1c6691122c1cd4c2147620ce26bf22e6e7e1d90e3e65b6d9a12bb09cc5d0fc54df90e7b8693b3e641e692fbcfd27137c62f8f8ee4036e543377b5079832faa7a6e07babf92e66880766c5b8cd13a6875ee40af2de1bd99eb1992d0dc79cd62f9034902a442730b9a872e26fac5a9e25c7e469d16f1b2eef7863d9064a80763b846b8ac6f9e81a704e43101cc6868d42b7ba181f59f05a70ebd75d08a821ef222ee4f66149f956367094bad0b93a4ea4f77df5b6c699b3ace1728a076ed7d515bc6a1dc641ff26a668a7b4a20a3272ff72915ee0904639fa62a4ff0f3435194c79b53602bd0e6bb5b6d6a41567fe5fecf4f9db931f757ef4aea46008ec6a0de98e4449b61d3e9552ffbcee27225f335478938ee6cd35dc6a9164870d6d352d594a175bc6f414a55
}
else if (GetParam() == 1) // testnet
{
// tx_hash 84ec08256fe54f3fbbe8dd109a177a35cd1d7788c1cfdf9074684ffb7b058a62
txs_hex.emplace_back("02000202000bda9012e79b02cb70891498076428dc13fe1018ad04d033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000b97b612b41cb90cda9001c24dc69b01da02498a06150729e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002915e00d148ba7fe9d87db41f6cccd1f5a42f97ad7e21be593bd5d426386dfc740002532d546c0e0b71c261c620dbbfc0483eacc5013f061942ca646218eede87b36e2101348b2a55ae9a3a5cc95b6f23f150801caba13db7a89d288a2d99de7e2ef9b50703f0d3ef46e6ad58a899a21ae112743b155278003e73207aec4e3d0d1066014fe4a54e450c10bbccefa40e36ec54f92355a4c1c668e34c3cb95e448bc258c3f82c80092d00d23b2d6d8bfe2cf8e5cd8fa75fcc29d95b3749c79607dea49b9c25ad6f0e7a0cab9a142c55479f7a5063a66fdb59a65dd66d963ef8c4139924f1330c155cad0507e1e2a0134efa3b0ec0ddfc67570e1091dcd30296919cd3da9b7561b05d3f6e1e7c4b568fe30b9563975ca99edc03061e89218f99f48c1b6f7227f9156778db01000000816d43fce0236c371ee6617135310d6fabc4276e8550f073dba55d2b71b7ed117b6116302f6931d29071cf436cb112150317cfd3bf20dea399fe1b09d7493f5d68794ee35438e828af648190ba945409240d9462b6bdd9baa6a169fb7be69e2f7a64626661a8d85ac32f3975f15882cfc37168e24f7174dd5bbe54a7c0a4adc840b984a747ab8caae8a9065c99fbb63455280f927d0b519eecb28d68abe6a70f610ef8d3bfb148fc41c1b4e829895079559cbecec68c25530ffc6bb322cba0050705ca23610e2182d22f7e92065bfccac733e8bddbc40102ad17cf3afa4802140db82068d8f688a97da1a5015999d6869d0f12d3748adf47a247945cc52feba3096902e58db2882e7672fec9ff323180e43094e0901cb56223916d167dedea7e530910b3db163272a6b86fe9697e041eea4423b9f7bc6fbe3e137f1138263611879e6eacab76d1ad61d3ab97b83a3767a996cddc7e847e6acb1620fbb22fedced8559cbfea642fb555dd11f3165b0c205f37b844a96620690d8317e09bbe8beae33fc6684f7e78b9e09449dd44512f18e21ecbf3834df144127a98e429e6b31c4407f5e0d0fb794d5b80d600cba8e2f9d9d54e65b0e5d6296fe91c29b7b341cce607269ba337044ab633fe7b7f3e3e26a29d05bd5ef8c0877c6bc09f0ec8339c1564b4493b32d2b87e95694e9b4e66add1adba93cf365ad324748d377c5dfca36a1726896c17c0a1ae1af47dfc3e436d0f3e11786e0df2f79d44aeca1c3241010818d40a94efc5b26786febd964fbfb88862c7bbe8af2c4813e0154a330765dc468ec965f76af2981ca663846ad6506c8267d0a394328c652ed56ae49233d1c69bd8918e53ade14096f997947b3baf8a602733a0d96bfae6b3085986a0b632b1ff11d96be009f602d274331be61d01a48962c8e604b65eb0b56d260af2b6946b690d8baad5085743bd19f2eb85b72108973e7c8c7a56bf7f1a2648c7b03d079791052d971575ac9462e282eed949c1da8e77b83764932fff0400f14edb6c0dd9aa08c5b36f9851f52274ebf64537a5b4fe5d8029621671d0e2232b09d432791e0e04c3030ed44ed9d30f643683bcf6de03d047f4c67087bac10079fd3de529dc1b04e3bf265b1187014b46c9e79d042890395d9a6f7041a6f0e8debf17a87fe0c409fa7e1d99cd4557221108ba2f416939846bff79cc981c457e92df3db0aa39fd04a908c7fe47c18f8dad3a8d1fd9440aa68510f2cb6388000be0e7f7ba70ce0e0c2ee7489d52361c60d170cbac7d85425d2514c8cc925a7f5b43a149bdd65a6007493e9740c7d94008e7668016d1e038fec62e5d7978d0df15a2873cd5ba84f50f747ccedcb3bc091bb977cfe8997c4142ffa3776f4e2384109f2081dbbeda610eb6cd44f664ba1e27caf9e78ffc66be6217ca0f6672a962e3b75eee0a1671e107c9c536b60b809e5c8e10d6e61fe83dde31afd38494a3a3b924fb0de3e882e30092c53ff92417bc677f8834f2f64a0ad937746973bed8724f8586939f2d158f0bcba37fa428e3fbf4417c3284ba5f140c9a111cbe1c90046ed5bb5a4c10f0110d87147b15d4b964e3beed2ea8409eda4d7173ef7411fdad3cdfe11d257ee4e3011d4f42422cf017efaf0a7a21b7c67bd0d2d8e13a0eba1724fb40dc43b16ab602ed6cf2192558f77323c1fb2aca773a6ed1078a7d4cd9907d313f6d8a437ffd0d0c8375446cd6d259796f3a638be77cd46d8bacb1637623cfcb33b8ad19d6b709334af2c62320cd3b5989ac9de5fbc5f125fb5f57980e3d6e5a35a06802ca9a0f4537417cfa003b3a26f9740c531a999fe9a6d7cd75cddc232cc2323bdd3f1204e1ee08e3adf511fb4f068195e1fd6841590f4645312ad5b022bfadee28fc1b03d13efd111ead8bfb0258ed2e7a1a33448c63241129c8c22aedd9cfe200e0110fbe55b42445d19adac772864ffb65eeb8654f4096fb75677fc1079a901a54120b096e650103366090cecba87a909cb3dfdce7e1dd32fc98c84478c48cb722be086af2f9423d35901aec9923dacdbdb5cba8c79aafd7689e9e82c2f87a232c7f02a05164edcdf0896f44cf90008d4e516ecc0e810ce333814d06cd3853906435068edf2c987d222b066de3bb6cf2c7a090df7878991900388ee05070d7ed6deb0d3c2a5f96196f14cdbbd0c74d381767eb27635196b2daac76644b5bb075b6ea08c6653ab966ed10015d1116593005522c61931b054dba273cc7d75a0f92185800d5fced9995d8257b09e50
6 years ago
// tx_hash 6aa5057aeccac8e1bf632eaa813554352b2f5a4b6bd02f920a44cf3081488a2f
// this tx should have 0.1 xmr for testnet wallet7 9tzmPMTViHYM3z6NAgQni1Qm1Emzxy5hQFibPgWD3LVTAz91yok5Eni1pH6zKhBHzpTU15GZooPHSGHXFvFuXEdmEG2sWAZ
6 years ago
// viewkey: ae6184287ca791609844f140b8502ccfa2223c04c8699cf31fcd0af1f1d0be08
// payment_id8: 6c224eea64220435
txs_hex.emplace_back("020001020005b98008b8488afe02ddec0292a006e3e8f7285830f025ce902188c93bcae9eaa9161f43a91f377b9380229025ca65020002f2d03bb485f877f6a5a07c87f0b0590aea326a91b7409bb9bdd229d63c8331940002c139346f6b4ad08d3d3af56b4869a1ea355e57cbcb4b4bb0cdd9b3eafe9a84f52c0209014d4495ad4516b03301bf41bcf90602f5c2a4865c84c7f5991f9156c3623532be81fd03e1049a4971c401c09fe4a442cbb8ee0dd124e916a25d9d013ca26ae1fabfd791658b55c16b4b3b2cf2b48b0f1a774f2ef1da80abe325aeede2fbf06bf401384fb24adab274d3c9987fcd1704c409da54aebd3417b4f334de47660e203a6b419e1520133697bd2a2bf9ce380148a67d16c3796c19ce3340d43cba8801761cb408267ab4e0b68a4e139b9cb10b3da43f6b557704432c55be77d924e2e937efb195ff62bd726013809aac85a8883804b84860f45e9122ccd805c483a71f9af424f97b2b24075b4a3c94f78916240fc956efef0629c1c3add3ebf898ada716cc29b04299e711c210b0e20d511703b684efa874993a53658553993cfb3866f3592986c5781a8ae4579794de7f0b0450e3da2f369a49332e20bc31a03d8d77862b1d9e8e2cc775624dad7342979903ec5715722691fb496c51d78e3afb37eab32a79525728b266b4d885a8ac7cfc0e07f3bda7ce627b9e3a93f5e574775c39de41230528339b3e2feb378853f8bf0aeaf3a22e6d2bbc84d65a0f63cbc0871c2ee93380e5d5c8db9a69f30fb718ab0dc94b5c652ddecb2793d2fb235047bf33cf758bfffe8af3ef7dd26c2973d807049c5f37ec896e409968946ca772607bad12bb6dd34bc495954ae34aa33b250b0b00df28e7a98468750a017c730b9260289b16e1f8207fa85f38822ce1b66b9f092dcea9e753c97fd44fd93444d1435152c60c2fdba6cdcb768678e0706f98c301eb19e94a75afb025c2e88470461c081f5bdbcd6d24e110537a3dffa21154bd0713d663edce151725da1176e88903d3df106deb48382b93daba591732008ecc0ff798c89a56d2b97e1dcaf315bc92a5c674e22da4074b24d175f732546b45be036179a799218dc8480b59171630e855613cc144f6eeb094e13649f4c5e0ed590650d19c9283e7eaa1d6eb4f6934b8f9526ded049c6c6cf8029c8c1613f7cb97087a0b42c0f4c710bd97c283b1b2d734f05ec4d37fb60dd3d600cbfd7edbc96a0ce52791291d81ef2c16f8d0dde60527b84d0005eba72be7cf5a1cc315ac6d8f07b86cd1ed0ab4e9f523753fe06055b9e2cbcf2eac9970015515eea4f08c4c6a0dc6717175ee854930e6c91c64f37e006e80cf7f6a052c22e451f63b08e327390ad6b79daff1388fdcd814eb933a5f0e736626c25fb02edd016568a68691207f0020df03db999d20a6cf0e9dd08029cb53f6ecab671f33dc2ed31fbc4b3497b5002b848e6f52731fb71adbed943be95b8cea4628a7f24e28e2e595a4f8e925f4039821cd8755d44fcf86f13444131b5b834e9b259d4edb6dce4cc6081fcdc2e80ea7437ecb1f5c3bc4ea8296face9e97c495f86038dd7d025e8dedb55ccfdc7a0982f0b40e11ee49a5236d9296ecb649ca6e50f0df0e74cd484df5a177a76b4602ac57f87da155abded4ad9ee710fa2849dca17505e7d2516071a4d29dd00bf0022cd3122e5f32b51ddde8e15d10bf636057d1bc3c13774ead261d9e3608f6db00b7e0c85a48064b1e43d036a4b85dbade28040a448dbe8e121693c5805a5a32021ffeaa427e0a1edb2ccb65dea25d4a1276bf95c7bcf33a1e6b8f63401463710a26273f808543c9a5544f7cff7e177d3ece6da829187e97bf325277445131c10a2aa5ff0af0d70915e91d2a1a1d2022b520b5a174315b9f4dcb5c77ea872ee907d060e42a5e088efdd85fe8def4f7566943ca4c728ab1de8e5f8e7d42dce318055ffb89d7d20e08eace6546abcb632ca518e334490dc791e4fde02d58fcb2dc0cdf381b6bae61849a9a27a428af0adff08aadbdc2e109044dff08570f6bb7da0b30913a7ffa0115732545c51a79e1817f4972a53110ef5ff688d5d9edd242e40bcf111ca6b2bbdeed2d3a7bc83297983fecb3d5cc7425c0883f712d8448d0af0047e891533719c1c99742c3821c80395219c7b1a4b28764cf46eef9197b5e4305304e402febe6ae38b1de2462d21fa02e9584e815310c04b5bab49ebfd981050b72b5c3e788f9d06f1f0af4bfb74faf956a966c82f665010af806693e7b47c30a2a02168b3a6e8288d8d5e350e2efcacc98f15c7d7e7486969bf2854e0543ca02d23800fbc3c5af6f8a1a2afc38125a8731dc13aa63330ab8cf922ef7f8dbc8000ac6c3b885d73c413809a39321d01d4f318e4257b3460d7e1c3a866279088c0773b91594c2352f80b99e3e853f255ad6c484ec4fa9318128ceaaa5d78a700a074677258d1c4a2dbae6afca491ea2e58abf3523dd6a54ddb9e643aba2125b2507ff64881dd6ba33a7a68ed8d776a3e70901470694261de282af86876b76875f07d0dad169b268bee8896e38b419839a0f1a540cbb563caffdd7c1b99d8a39d70fd880d7b264b1e3d8ed83d1d225aa74d6a9bcf5fbaca2324b2db7df8229893d0cfd28537fd6f20fb4a895d975bf5be7cdacca2f0ab5a6bdd6ebc1ec5b945077097fd2e8da52fda700400c73b20deb2ab1e4df8e2e47afb2784328a70264ade10ef6743b6e37e7755ebaa434bbc8060c87f68ef8a779c366445a05b7539bf57d0a6001fdbf0f0e47c930fa6f77c7306e762cb4f44e2d963dc123c75aeebd2cd009c68b6653dc851dfea8b9ec2ed1acbb50e350f282859af86f6ed092b385406e08caefd963d
6 years ago
expected_tx_hash_str = "6aa5057aeccac8e1bf632eaa813554352b2f5a4b6bd02f920a44cf3081488a2f";
expected_payment_id_str = "6c224eea64220435";
desired_amount = 100000000000; // 0.123 xmr
6 years ago
// tx_hash 61f9949d200593d9de4043db15b504dd8aeef0785e8f03d81f23eb76059cd419
txs_hex.emplace_back("02000402000b83d30efaaa03baa401dbb1019220bf08ee044c030b1aa3a2f659c06b15ceb102ee933e85f3de8117d50a710e3b257b5acdfdde1ad19402000bc0e613f673f612ab03f502ed08c403b40236152468395d9edfe7d7c5d74d4e3d83b1ef75ca27cb0b7f0d11aa487718845e0395aa02000ba5ed059cb20ec94584128a05cf04731c1783011a2075ec6bc3229731337e34672e9e42db9811540f46f272eef53891b0af032b5102000bb8c214c304a226b104f503be0256e7069d0317431b488a73c577625318246498ebaf05e01b458dc649e548534dd40d3522cbf82a020002410b1ee640e21dbd8df4ae780f5e2c6152c591e0faca0087dc3904485a19688700022c76544d03f5be4e26ad44480c3c97ea5d3691dab7aeee6804cc22f0a05df92d21018b35bd36fbbd981b78eb1b7d13dfbd83888ecbcef95dd8d9d33a95aec09f2eae0380a5e27429c0d3b30caee595d2861f0e3216a17fb4778b68da68a710ce8319a808cbd70f53feae6dae35757321721ee3b2d51b6c32b282c3567d1ef680288fa1986efe0d3c29128bf9dc2951acde59a2be0755f79c79a77f7980f13ff26056468cb1f30a77993822d366b1ba67db99156be052e9a9ae092b449507af5ec7ac7114d74a07184d5963ebdb14a93840b280a4cde03894fece192cda9e8ff1260a47971fe539d6bf14c6045308f9706cd4b736008a1fe850bdf60e53a994190d2bb1a33eeef4010000000bf3ee6806a425d3b2acb28e0e7df92964415cdab08b7c89d9b7ce05bd8b140c8e0584debb257421b85a4bfb1b9d6bc4f52423fb79bb652268caad201b90ddee7aca8d795e8f1643069d357b92dd201ea4d81c64fe718d61cf2f954a9a2d58a3571c2bf815d706f58c974249ccedb6997bb0ccdb650e6419419fd9613899c91367417b2676a209b0791817d0e7cad81dc0689008cde83c133a82ebbfc142a9096e31249682121db0d7d0ebb0144d95972a5007006b4905ddab006337be2fb20607ea3864386c5d1b44ccc8cf5d34039e7cb7c488d1a744f51ce9330a0afca25659501d83763092ccfffc616c6b5b90752a21388fde53d374568ad22d798b851e582c58fc182feb7de32b8c5fc1f7c7828b7845fe87773f6f573eb4810de943ac3eb5fe60cee018e536ba3e749e3dea9ce0cb889e62434ac60b22677aacb241fdd89e3d2f5bea8322086b012dee5b214fc64c3b9cc49cccc0daa4736990e2d2f05cb21b46f5cddfe01f2cd0cd0963cfc93853dcca0685bdaf265646c49dd149163726d39751e66a1682aab9df9c0998ffdf495c7c7cf80f3f3a6c21173441137f6e077fe945a5bb84a984fe9d8345eb135978d9cbdd572fcb80cb4baf6275e24795e360acc15f7fbabe78848565446ab124a03036b8d46b15ab973dae5f33408dc6728cc8d9aa1e6e5f4d0bc907a6aec1376116cf26e489851ab66df933314f7a9b4f4e73fb64a8bfc9222847d2523b1c78160bb6b18551971421a69ad778a318fe3e12f4fb232ee46c9b87cd20fad4cbe5c1d6704e8c63eff2448eed57de44060adcea310558b151fc1cd40a15f479b078b2cc921fa52a1328d43b83c9c9c23aa139ad8c056afac554a8c7f5a15a0a3e97006cd32d2b012090493445df5dbbbd3e71e7b265aac95bc37a60813a9adad13b4783780dd6e88973b42dd18e778f253a0a34ab67724255a6aeb2158b5a0b852f8c168dfc720e7b55a05b7c042a3f395808b979cf54e6aa03d7ded804e2b1e2d7cba0b0522c7114ea897033d5f7ec19e103c7485f38cee86a81944a84c6e27c7fb22214b8be0373d2c3a689803c3bebe0061a3947ace349b20cb3e61c64f1d02946652e565a9c08c67f5235e8c7e84b040afaca0d923e4ff20963c212d5cb888b339432c3c18f711253655992ed80b74006189446fda98609ef76e4573e7444931a66ea022790eeed0cbcd414733611c803410cb82fe6ddce756331e5b99f5ccef43031dca02de4fb751b14857b16f3bf0094a30959245440838289470d38059cc2cfb6e7aeb49bccfbba12b34af15e9b0d5ee0a4984b9ae14384a4c19bef90ec751db4d681636271debd3781a72252c90fad95d3cb35f7bea0139ea5669e37bc0a99affb06ba5f60f1760d2561df2f5f02ed9312251351a3018aa181f74a4021c533882d05650369c5a3cc92d5b35c38073dfd10086aaf1653619f8c4f28d00a7fc7c10130a7c4621ef02721f668bfa40cc0ae1f44b5fb68b82f99f161dfb2d858f9bfe0dcc61e6764e606d40ec2560906b782efc0841051323a052256a22ecf8184f2bc45b1b4c8def3d328760fc36e02e7085e901e2f6a521dfa7e9366b645889cb2299ef01ec81965375c0a7575bc030409281dca766a64555fcc22b6b32d402d4b4a80b2480653124118eec839270c39f721065ae26e91fed12736c4c79c37c7d1525068148caf8139f7c82723620b4612bfda30525cbcc6915e015cfba3c363f7ec59cd8ba3d1ecf3d5a99fbc4b07d206b0042cc265bf4cc908016edb96628dc5cba4ed1f9db24103978600061906e33120b119901caef27040ca28e4f499d4d2ef9d62e8ff025d2fd1cf1842de082709c824437af44820fea65e31ea143160cfb19ea30dfc149a17e8ca55728c01b71483ab5f5f32f85c882752389408bb6e17bab0f3517cafb974670b1adddd0d7b1ef40b7b2e8a6ccf56613fb96a977e47aeb7d77e799ff67a2c9e2dfaf13b05bae6c9ec7135068717115099beaf50552156f2b7b849e078166b9a978baceb0c65ec4d64eae185187d5369e884ba70b34b3196fb9ea1cf7ea17b7b1637e01a02bff36fee9173e89d376430f2ff9eaa4759adf9492cdb98eb5e8e4cdfdd2
6 years ago
//tx hash 8b3d170d3a5f4075e144b42073a04f54c4be16929f782039fa438befe2a2d0c2
6 years ago
// also mine
txs_hex.emplace_back("020001020005819d07ccb503a0cc01ddf70185ed012882c1a15bd6e003358a1d745b0a3da08a2ac964341c5447967c3f8fa3663664020002c12297bcf7fda1430609bd5ecff56860e8418d2420b76899b229d3d39fcf80ad00020b98d78111bcc9684b807784d51a8f433d04ae4879d342e34fbe9ab781426dd12c020901e119974c34d5d83901e6c5f20773f9a48bd23a6427978046b118d4065b697b0fc92b2a1a812072e9c80180bb8d9c4b0da31fabbdc6426ef2250c8d23ac9609d732e9e14671b2621cfbcd787d57900f2c731a161d6d295fdae4516970878aa9d4e1b5fad665ea0f5c5ffa5c5862140959f3fd8745d4929bcef33fe51c8fb73baf019016d573d155e50e687eb4d68100fa74c43fd41f2bcf1a53068915c729fd6f5073f9198289a43e6b1d62a96d480d2b90258680356f8fb4e728ea90c8407fcb8c5c4d61202e5261e1d9e06a193ff714fbeca70e9c75eb59938615fcb8cd4ffa9fa8cc160d5dfdbe8667defe86ed5e00f2767889c46d33a6c41b97c081e809bdb85ec948ed88318a0c014cbc18fd0f4d03f7907f2c039364e6699a6926df370d6b113a93e3130d227dc1dc3fc4c9016c820c7744a58b1e4a03d3857e205a3164683cd040505dfa60a43b3572acef0dba442fb836751d8777712e30173d9f391fed4b5101778a408e1cc3a09251ce0f203e6c4ae17394c0d74f962f9e96bdc9b1ad58e29740ada1fa60cb4c45a1880d39d94ff93fa055e56cdd943e3f38e9be8075fe55956981533df8559fcf0df0037f077e2739f6e2093f4678ffea9a8029513976ea0e55be9bbbb55ef07d10df035ac5634229f9ca20aa026cdf4099cc6c9af6003bfc236c9f6089b0b62d401d03e9e211ddc390fea0d28d5552dffb83e298dd01977b6779e4bdf3621bf7295b0e5221d4179abde3985f937579f27a1a5f474686abfd8f64afa542344e1887e80618572151fcf98c2f9f146730d70023c11dc2d93dbfc997d1b1c4f1ddeba7b400b885a98ca7c82e73545bfeb29d0f2aedb7523e815e12a5b212b20d7c8f7554044af28334226e3bc68cfe75f61d948712d2c93a8557d70ee01b3695f4cecb3705b1a135f2a75cd63865e6d3868bc391d482ad94b8e0d5c9dea3187de1cedb34060a14b0763530918f37afe1a80bf904618feaf3322756ceb65bd1e8b4255dc502f68d6dfe95631a69ec473df1abc90f5bd3224033f15db625fbb2d7af578db8079a3d0764c51f03267c28da571e6018bec535ee3c8cf0dcdbfcf571d3208f5b05d9defa4572b660075227b674f92e3ee520b19e7549ff29e473683f5a171fcd0e0450369cbfffc768404b9dd8ff72daf957fa508c9134c1ab1f727bfe2b0000010c81a3e40951b09bdb463ea521d32391ea32685a64744bdc17955d005aa1880c9c15c6018063cef1cb56eabaa05e59474d60b13708ce2d2d015b633e49e6800d01d6aef558a81f3d5f9452f93d6de8c12d94ab93c5d52e4d0c31516eef9c6d0f5942d67e234d9701a4f26a032562a2706ff38f748901cc5da381a2f919b8520dda8be60db30c950c79f1b521244be190f1441b2894f828ec581c3cdbf7e43f01bb4fd128460ce3d85d07c849fb5f9f419e022ab5d706a05834ab6d0b6191a50843aabdc950cb4481e5926047cd230cc0276e0062cbd0ce9b11d949abcefc7309e8cbdc4c503c1ad314201eb51efddadbb5033ea0af1ca92d5be92a2b98cbdb0771de8d076d6092d7439f1fb0c0a5f82bd856ded7ee35311e223a87b653fb0b0f960d6eb34a037cbf69966330a8bac2a94b0fbc08d24a5342cead35b089b0d50f85968993ce88a9794ca71376ba93fbced6fbef2ce85d8d820c66445e66b2ca073d14ef45edd3f241e33c8aa10d2aa7ebc41e6e83b3aae1b136d1c511ba0400071629be8f2e08d0b47603f51a581d2e5ce962eaced0154b89355a0a2700ed8a00c9c2d0d7ccfdcee23242bbd02b1225b596ce509262371fa6d97bed8982fee30cf5ab11afd32f9d44e2af3aef964e53230560d089265ef724a13307921c3a3b0c6649262df430b10ff407b2eff5caced66f5dfbc1c2423043ef1ec9d659db350cd5d3fcbf86302d4d98d06972729d171cda3b1f47b8dc24d211f93fe533d2c700877a7cc9f2938738a3deb5047ab200e389ed4fce3c778ded62fa9393f71e310f70f00e242a7131f932c46627e4e6aa4d5986d873d5b5b247e2cb50b99ac9d10d2e62e91a1bed3fa0efc8cb160022fc6e1a94880d0543626c2d3737093910d2007aed17b99877401525b79ad5fcc5aac304c668a602bd3e14143d7efc6f95ef0ba84a72e078fa04ff364c819d1d2c552e39581f37250741155324d2d6b97a7c0f9ede6c20f863d1acf7021b1cfaf304c30716e808c10c170754adca2cb3cd9101a7f9d964ad1ce68907d86b96441035b854d881c7b3093cd0fd80bf3aa44bb40cbdf953a6a6dce360be378c007dfbfa539281202a032532a76f8530e04da2e50c766372c8af7bc5bb19bb47f60a018f549cea9fed49023f36221aa385677f5b07247a56521b1714209af372d09d07c224ce228b927df705ac158d6d9126c65e0a9ab281c7fc763aa1f888de19d70b8bf0137ec48c59f9c17565b5fe4667e9570a81eb8f0cb9f22cb86ce5accff475528a39e4f5cdbf1237046839888c52f9b80fa469655ee8c1ff2cd5e9b74babcd7f68241791416150c80e1464ae887e3e480f059851e871b54020f506cdd2e4f42e3eec8928f16b56b405f269f152b809c30633739f914cc6a2925edcb9a0bc1495bce02f86215edab9d0f58200df1f99e80ce2bab6f072e08862b75d48f73178a3c94328c63141e3415f940d270f8c507b097f394bc
6 years ago
//tx hash 7cc28c836abf278ad8f329c1ae07868aa9cda16bd2b52126424bfc7cc97566ec
6 years ago
// second tx which has payment_id8 for us
txs_hex.emplace_back("020002020005bb8d0eac9201cf485ead01067e9e644546a9226e6a1668b6a9301bbacc91d6d4f6d92660cf5626f3397316020005e3bd0590a004908b06990125213f95bf1bb4d3737f91135d1eedb5d5473c380d5eccab83ead9856be71886f6020002f554d0939e4ff07ba7286fb62a6afc56a3590fc44dc317e4ccf8c4a7b4eb17c90002cf588dacfe17db9ce76ebd5f1d124fe755e4e8edbb245ad81079ab1e93a022732c01499f0cb98fb9e1fe26b8cc7e16e38e944e4ca1089bc88ca13bb8316ded3d29600209018c0f6fd01b74ccf6028085d9ca51c8bd55bcc4a3914f4654b0e9f0c24bd9ed7c885c2ebf30e7d0f0592e6dd5834f74cfd0eae019d0de716bf13eca46ef15a54b89828b0f60b55f72ed623ee8c39b46dd50c77f2403b14690a4d27eaf37ad3706d446268b8ba8e2f983ff5261f00fc1ddc4dbf8887dab52cedd26aecc2787b0e45cecc34fa51f273412f9078e91063daed6d1a1590004dce4755acfab764942ac4ac931f71926de5de191a0a4f60c2b6e7b8db242241f71798858db59c98b4de8cf05ca72e817abb32f2e4ae3870aca9ffefca8418390e1c7a6b286873184db0bd2dc248fd2baef096d38b1f3e1cfe4234e9fa110826072bdb4645357d52f73d5e695f6a922a13d2b8c6a13722f675a6e548eaaba07f14b1e501e7f599d9d960ad4a45f2580da80538d391556fb01b5be3b7db8b7fa871ba531609a501cffa6adb0bc0012a31f900699d3aa471c0c2129cedd1c414eb29b8a092b0d760da6c03f4342d31e38b42d8d7219c40e7a0bfcc9b262cda02378fdc0c09d4e392b67e85edce98191e797e5038ad33e988709eabeebd0dcafe19cd5d83e261d0d81f35cca825ca7ca22c286a1738c50959a07e895d8bde6af581fbc75ac3ed6e360f63ddad21bbec7cb12b69c11aaa5117e011dbf00e4500c7e5d3b833a4a3a8c70efec533e782eb392fa15753c25c17831034612f39d5e572058dec72c9c46a6aa96e2300a874d2c7b07cd586a4e3e75960ddae74ef6308f0ac6f627f2afcbc2e6fe781e5250aa72f08d8709e8285b2e8d0a8ec129a8a00320c3753646175bff441f59fb4904209fa51079f9240499eb3a0b0a1d2285ad49633f1efba62ce57a6bb00a4c70fcd4ae75d7eb2ede3b2197020b18ecb8711cb4054650bc0d49dedef81083abf45f8d2f1c1b316f8bb5d779770c08c4c40230d3dc67921dd90c8528ab2fbba11667eeba6562da89030954ec4d0cd88e62ea516db44d5bc24d5f91f7c23f471cd4e402cef0313b7a557c7f1afc0d0d15ec38846202f13e2fab9f88d7cf78f05981f9e62ef52d1aae529864b56801669110dc4657402d788b4b6370e79bef2e403f49e97e4b6348a07409a93a7508d704436e591f92dec76f5ebca63ddfb472a1703e0e33e533caa729cf2939a30e3890cfb35fc8466baf5fae3bd217fa410d07d2d22134bec888d52ddeabe5b200816ff9ded7dc44782b50237f1001d4f74bec6a55a78bd283dd3f892549c3b80b8e30294efc0c7f90c917ae786cab62cae230efc58022af5cfd51b0df76c4650b4ec4787a260ed2e595c78bbc8cc1b1cfa3d4ff1892a952ad732d6f131f668c07f5481f825a0e2755ffc9475331c0fb0e6532d3987bb0dd0791fdb2b8b785a404d529f61639c81061d7219da4ef64d8d6f7dab006d5099cfc62c7a6e93f76fa0979fe4abf02a277d3e773fa87cf649a06ac5784dc7590b56c1055bf4f5af84d013831713b9f8381970f20fdb2bb34c7b55e1a64185da16108033866bd729f410efb954c412f27c218e4661a1cb9fc63ec06de3858636ccf77fa136249eb056809503b0be6e53ffeed27b81700d78d8cedd03b24fa8b5130d477279922d761ea0acd824a12c1ea612e05d8cf1257f0dc89f760f57f13ed5ed371dc54a61b0406017c1df7e1284e773e373b45e7f118f2236092b772b8db6e87690bb4b74558df05f968c0c0bafcb7ca28930598f8acf031ed620ae927bee41ad98793fed61a4404d3a2fe00dcfaa549fc80bdff11d6bfe40b216506d151e51ffd4e86112dbf72001558715eebec4a59373ee47b5b74605fe67e3522c4bd72a5df33df04faa367068b62fd02da9b5f9e00fde4405f78b60b5b76237a121f940041ec869bb98fa402fd03fd94b625a177c6b1512c2cfc982b93cb5378ac0383967be0ec4f44a035077455e641a650aee54e3c651b25b8bbcd267a7105a12cf79df8358e1c62839708cde9bee3a89f9d12f1a758ec68a3522ae6b9cbd35556ab27444a673edb68a40b88b394243fac7142dbcaf75bb9e73be45b9f3e1782c9dd24f36e197d08782301a3dfc0a652bea5c6b88e770603733c9aee95ae1bd82d80123ae715aeb31acf0718fab2c3706fe6ea2432f05d9f67d71646de0548450f50bb576878317a6e0a0a726ed7bae7ddbe009824f2ca2435d9489854488fa7153a46b697d59157f1160eb862b0d4bb3ac8f48c3960969b4e2fa3d227faf8c8ebcc5cbc1efeb0f81b8d0fda832c16d62a76780e548a1fa4b2acef4428b01497a4fce8d51978095d7e150f73722a7fd60aadb05a2a8dc023ab3640fd0d44e0f1244406b7fd174c6b8cc200710ccac817e7dc600f1448afe05d503dbd95eddaca7bc120e9ec5f968d7c190cd489a1a91562dafc58af4daf2e3fc5b8949caf1f6505173abb1c3acab3ba580d62fd9ab4665f793bbd4588f1e7ef4827168252d7172e77ce22e6d8d0fd51e300dc2006928bc765fe7417fe6e43025d04b8206c57c5e57869de1c2a11a4e4fa01259e1c45b2efe33ac8aa4ee2ddd5642bc2a7515eef5ad9caa4b5da06eeef0c0d02e751e4a6703b2814389917e68210d72e7f8bf834eae7831
6 years ago
}
vector<string> txs_blobs;
for (auto const& tx_hex: txs_hex)
{
string tx_blob;
ASSERT_TRUE(xmreg::hex_to_tx_blob(tx_hex, tx_blob));
txs_blobs.push_back(tx_blob);
}
6 years ago
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(_, _))
6 years ago
.WillOnce(DoAll(
6 years ago
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
block mock_blk; // just an empty block
EXPECT_CALL(*mcore_ptr, get_current_blockchain_height())
.WillRepeatedly(Return(100));
bcs->update_current_blockchain_height();
6 years ago
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)));
6 years ago
EXPECT_CALL(*mcore_ptr, get_block_from_height(_, _))
.WillOnce(Return(false));
6 years ago
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_CALL(*tx_search, get_exception_ptr())
.WillOnce(Return(nullptr));
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
auto tx_search3 = std::make_unique<MockTxSearch>();
// here we test what happens if TxSearchThread throws some
// has thrown an execption and std::exception_ptr is not null
xmreg::XmrAccount acc2; // empty, mock account
acc2.address = "mock address";
auto expt_ptr = std::make_exception_ptr(
std::runtime_error("some exception"));
EXPECT_CALL(*tx_search3, get_exception_ptr())
.WillOnce(Return(expt_ptr));
EXPECT_CALL(*tx_search3, operator_fcall()) // mock operator()
.WillOnce(MockSearchWhile());
EXPECT_TRUE(bcs->start_tx_search_thread(acc2, std::move(tx_search3)));
// wait a bit, just to give time to tx_search mock thread to finish
// its mocking action
std::this_thread::sleep_for(1s);
// cleaning up the search threads should detect that one
// thread has some exception
bcs->clean_search_thread_map();
EXPECT_FALSE(bcs->search_thread_exist(acc2.address));
}
ACTION(MockSearchWhile2)
{
cout << "\nMocking while search in txsearch class2\n" << endl;
std::this_thread::sleep_for(1s);
}
TEST_P(BCSTATUS_TEST, GetSearchthreadThrows)
{
// CurrentBlockchainStatus::get_search_thread will throw
// exception if it is called for an address that does not exisit.
EXPECT_THROW(bcs->get_search_thread("whatever adddress"),
std::runtime_error);
}
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));
EXPECT_TRUE(bcs->set_new_searched_blk_no(acc.address, 22222));
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));
EXPECT_FALSE(bcs->set_new_searched_blk_no(acc.address, 22222));
}
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 66d2f912a652a670b5fe017144e5d49c06d3d0a936cc856a6800e917a7a0454d
txs_hex.emplace_back("02000102000893e502d7659257a90ed80c17c301e9039ffb38d77540b4cd9f83778aeec0a25fb579f1f35ae4e8be4e2a7deba8bce98e02000253ce6a03866ab6ac37aca5f1f2593599aea02989312d30b710a9e23abca922920002f9e102287b10bd1eac96db2d63b9b857febe315635a298946b574c1e0b203fda2101c8f0789807c7210708640f7e98f843308341893354cfc6c1d0ba5cefc431be6d01908691fb39d430c474e7b3047571cb37e6227a08725c7425e44e2e617cd159c7bfe640960ef365276aeb922f524b36c28e255e727aa169b82b3bd764fb200cb385b35d650d794eb66e5afa31815c40e1638dafbea6c09dfaceb54b81e828a75d13969fe405c9158af9a80ab4e6023e7903a9c892709bda237f7730ba82fab68ba0e003af064018781d94cfcecbd0fbef50f560ac14ef2cea4b4f09fa8025c1c92db6cd36d0f1165780254b75e7f5424ff36c30c742979d27f422a2d7c9610a8264d435b4495d3d8a295c524cceac951c31d43387d59ca8af3ff7213562b9c51c597ef5450066cb4bd532a83cd2f3d9499850bbd63dc473cd786f46cb163106209c872d39027ecfbc66779b051ebadc20754d573ed01a164028a2cfdfcb5d307e3dce438d079be072f1791a77ceff50624bbbbc714dd6c793d2e822b549b10631ed9e060f0e56af8e8a0df3910e1862afb2ddc895fe72d1eb45c83757cf2cf2a82a24e6530488a5581f529cd5e1f12f470061ef0fa07bdbe36f7428b9210499e6187ccbde03913963def9da138a01766528ee9e03f982ec5ae724f7a32970aa2dc942f2100e7b1be12abb445cac744711f46085932dfabb481d16c78d55ab07fefafa3160010c1f77c890e1b5903a983efa76bd8e73423e3f168c8d6e229be64e0375e3690eef5490e1004f596c95d365d773bb2572536d3b1d5acd5ee3da46ff2df807410cfea0cd9055d253acd0af43785860e261ac630f9ee70b5c459707e6cf5833950b79d46a58ccb2b23c43abe4964940a8822cb3a28b1a04e840bbded523fe8e54018fcdc93399b43c9701940a926442d2843e7ad48affe80e4f04a8f2d9010a020a2e7b1878bc7aff72d6370a50d7d6fbc383bcb77bcb8e5b2843d34e3c071bf70252106b95a75e0da41699a8e67d11f32cd6bd8bc3d035dbd719f50358dc5b88062f7d980612adb4cc596369b965dabc8b97dab6ca08c871bcfde9d76da708ce002cf29b13651fa4461e973ac97dcdf6e1f9c66d3bc058ebda9f890ffeec8a1f0c54ee73b7c9bcf5e53041a9a6457216b291c498cbd387783a9fb56fc383960506aca2f3da9d9af54909ae134c6ef3f42aff4db79ed6bcfc9ac7b92f0f932cd804e05fbf45fb3c09257364eeef3221099b873cba280f54e934836e1cc42c49f50ba3eaf9f2dfe4d304ba3b3afd357a90fbfd6a2e53f7d1039337fc2c8fbf996c0020baac4154b954398597e4dfeedbc53a058b216c165b14f40153e1aaa121c9007e04cc126d8d65d500a503c795d4f4b99109517ada22d88737b43ae6daa2ad043e13a08d2f7abd63aa2927a10f83212dd9a2a6e903de13750e5e2002515f4a01465ebdc85ec7e8848236080128a68e5f10de595cd9eb4b8404786c7905dfe60bcc5e2f9f5f658a9172ece554ed04866b236bc735cb6e98c5fd73853373a75205ad69819beccef4631cd847559530bbcff241edf0509eba254591e69e2d402900954736772bdbd841ab855c27b891cbce7af4a9e00a097d90f359f529149a2205d3e90d12f1236beea2bb789070f094a4173f41c525f1df45383825f32756bd0e289018362f035f542751ffb8b8f606e4d565f6c45c13d68a2101a0ace3175a0b34b327df464f3b66a3cef4ad83992242c2a848e96ae1dae89b9d19015391160e25daa73e66c4ad0cfaf44aa9d6dd73e1197aa3f9f07b178ad419ee2be8df1c0d6326f41d5375b19bfcb6a425cd40f08a5dd7eff241bf1210afe6aece867530085390e4c17b1ce098db3bcdab791684c572315fa868304961dbde219b90e9720f240a2a1e3c15f77bc2d48e81c3150a0fcc7ad3b97206068726324ec9002b2f0b35a4eeb39c225fd3ac3809cc80c8e43a53e2ee8b47effc8da2c3bd14e97f7b09b2916c1bd79c76c956c527e017512a749c39e01f9d0c42fbe963c9bb21ed4208d1bc5ea1a225e4a75bb63c4ddd0e3cb523855c6b889599a5842723855e09270fcf9372fd6dfc0d072c144648c60ddb00aaf46ff6352559e54a73a96a9406f20bd00d80a5bd13924a3354a1ea4724b75c4e718b75e5b867169a4b8d030ef221018d7c6ed58f2d1a5c90fd283e746e3d4e2f324485c10c88afa20b3de5037b9c0403e91cb80ef87db2220d980368876b949fb6298b87da6808306630d6c332870d8588bbc2feb19399ee516fdeff4a17c1af5ce4dc4f327b5a5a9a18e730ab470708fe71bf98537fde2f517469c4c25811b595586dd60fb9727585bdb81ace1003ed76c14c1958157183b4b75c0bd3bcb12cac6928fb9efc9e213ed0df0d842d08f12dc6cbb5e221a44050c889b94d96926245f83d3d97630398e9a87433ad5509ebd957884ea11bfe5bee1a1d28ac5f383bfb5c543f4762ddb6b30930f8c8170f67933ee93c524f261f757c03a74a8efb302dca176d4d65248c5ad30f2ab0fc0308bd843ae520b722025873cabc10c3192a8780fbe6a08b03d2f6043a5c97910c8a1728b481910506bf58fde8eaff9859f5f61b7acfb111bea311c40354aac706d39c4f62ca060accc542d33a4675b947a5dcba98398b7f8d6460ff4fff0b8f03efb4d83b1d7e31333d92f332a1c35177621afd80933f5fbde564ebe77d534c0e3073070ce320ff85fda44bce851938
// 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
// this tx has key_image: c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed
txs_hex.emplace_back("020003020029f7d30185029407bc10800fe119f60fc6019916a008a507b80730eb01e114b609df03ac0b4da40cb002b606f010d410a607b205aa06e915f7018d04d106f70af603b516dc088d18d5055d8e020cb104daa32b6bfb671a92c2f9296e5d09174b509a69ac2e67988533bbbe5d6bf298aa0200298a28a8529d4c870c920f8202992aa203ee0e950ebd0403980226be016cc202b118b114f802c40bf60d8408cb03d611bd07b204c9069203a806169c15bd14e704da14c20e2ce605f205d5038526c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed020029bb3cb315c70db922bd109c22b00af023e0372df701a218f108b902c906a017a201f10fbc1196028c0782088e11e915d203cb048b0adc14ad0d60de01b602ae0651a909c305bc03a511c607980bb7147d8e2a1f1755ef12ce28185821e6b19cb6023d535411bbb7abdced139c923bad020002e4b04f1a4a46e00442df6fbee88056ef5d34fb87d432e232dc3b166be05fdb280002e475a89f6073029a3f6ca09f301d5a88e522e229b0a3e7867b2aa331cb46c8d62101307f043802c7d6460fbf3aab1ad9bddeb417c7a5810382d0b282d2e3ffa860a702a0a7edbbb679a40685a9ae03993e86e96bf3352ef6c7b90137e93053d0ea6ed521b6c86877c467657c7120b66248f4f2cac2293b84310c37ecf409a7a1c7365819387b039a613855d36fa10780922eda8c96c031682e8d35657e209b461a1fa64cdb07cf3ea55659ae1d583cd70ef6944164ab2c35f9ec26addba6cdd6d43287a58bf3e0fb0da0a3784186315a8ea8d8402026cd186c37c794f6d9b4b97f50e6726eda7fca0840d1c4eba4bee47fb53988a6b12fa4fdc661d20446d157eae0ea42a2c69d08008394fb8714a97a9c98858f1f57e1c45530f8ecdebc88a62f8eaa986adcf0940f32e62f9336efcb8a134813c6d9ac94736fea3ae7fa9969bb2acb5697bb3614474a297d61a76e9d352852999229a2f735b8bbefd3fcbb680eec46761959be5c9a33f8e99da8cf4e62cdb05b888cc2cba76020a2ec2b9843ca32565d84b665d901c56eaece700357808d78937231e5433e54bbb943fb6c8159dd9445df6561740a5bc6a6f4344efc2055b2b5c803d9676d7e8630b14c292756761ed158ffc6bb0a5a5243275192efcadfa63fcbb10b0b7b268c438599d37d1bce2bc30558821b035b7f9fb2f70e0f84f53e8b3d822dc42407848db1ae8eca2aca2cedf1fea2ec066332934cf1344d9df0e39c9607c8fd87a78d640d88fd01fc381b22bbbd7945048764e2f891467343ced6671e106d95c357689d59d6212e46931327578b8bce0a52a7bba6272d059cf5384b36fe12b33a26ebf9205c8589e32fb2cf16144dcf00a664150964d1ba8594aa7aa096be927192f7c33f0d9a373d5089a63b86d42d03e41a0dbc08b9b43a3650b2fb3d09be3586a9f3bf954d83b30d06b4cfb50be600ad798ae6903a0230526a1a97e2fdec48eac2757be16911a8694cf793cc408a0e1bbb3c4e3847f456af2d7c02e7a23428656006a488784dc5737c443967c742057ea11da8386a9885473d424f4c269678b4acf1c0f930d168167948b782a166060a4304cc1788e4e04332f2a54467cc373733e6a10b6e392a7948728b77573105e6e130bc88574bd54dc4b44a11f0af6b0eb97e069f113615d75148483fe1ba0536478bb1d745b5b2fc55d0f5237bd2b1b51406242ce195bea8d6882ed8c3c00e2f96ce3479b1d205b803e5b61ec19e69d1a64a0733a109b57d33a9f6063549020615c8604aff59dbeea47e33f3ca7d54002098059bc16d00f4623104cc17b6025a0ae39b2ad8490b54486cde43f214e73e556b5c5449b83fbb18196cd5c5940bc0d13012deadec31c43480138219e65f16dc3c729c943cd60c52cef818f8a30f97fcf04da1eec3efc26c29bd1777265c0940ee617f09952e0422d1d29b8c930cb150bd726365f349eb605aaa646f8d8dbf40aff57a2143ed618e2bf290a41506b5dcbe1e92d49d9bc57eba245f8e407f1ad1639346cd9100c2efc6adad65a40452c75fa8710b33040285ae0a8e5f71ecc471a5b01dbb2a4b9e3f526e7199a808e0b52b08d04600c2b50d67479c677aaa4e736ec8148195ff5c1da47cdf421d0c2c21bd7bc5dbdbed8909600e6f2edfc114382f651ed6be82118f52b4b45633095b89b3ca5333a8d9496c09f672feeab27fb18f750ccd8e00b62e936686351e06f1b017fd1838d4339f8fb9b6db2474815e2ac0a55e745071374ebd328cc22a06e65c6351e87bdeaf9994879b83dbaed95adba0d7fcb18a586f4883f11cdd3503b18b7912ce56293fab4fc17e84efe2d420318feb3be1d15dd06df254047dbc0ea5a82ba611ed0b8b19d1ff9f93e87c9fc00ce0704e7bdbf44ef916c3b29c46022a318ecfa1c6691122c1cd4c2147620ce26bf22e6e7e1d90e3e65b6d9a12bb09cc5d0fc54df90e7b8693b3e641e692fbcfd27137c62f8f8ee4036e543377b5079832faa7a6e07babf92e66880766c5b8cd13a6875ee40af2de1bd99eb1992d0dc79cd62f9034902a442730b9a872e26fac5a9e25c7e469d16f1b2eef7863d9064a80763b846b8ac6f9e81a704e43101cc6868d42b7ba181f59f05a70ebd75d08a821ef222ee4f66149f956367094bad0b93a4ea4f77df5b6c699b3ace1728a076ed7d515bc6a1dc641ff26a668a7b4a20a3272ff72915ee0904639fa62a4ff0f3435194c79b53602bd0e6bb5b6d6a41567fe5fecf4f9db931f757ef4aea46008ec6a0de98e4449b61d3e9552ffbcee27225f335478938ee6cd35dc6a9164870d6d352d594a175bc6f414a558f3
// tx_hash dd081e09690c118429ccd773feb83b6d9668b38344f2f66cde06f087df720217
txs_hex.emplace_back("02000102000bc1d802ddbf1081c20d9bc804d540a920d22b9105c4018e02e912bc7f3eebe5034123307ee4f08bc6f21799e863274d5757f64aaddc8fd34b101e02000227d1efcd0e6c502e5b6d6f1b6e492fb5f8cae10d93c45054835609d2effbd51a0002cee2cc19a8ef3517cc2c36d9b35d69dd540b691955d29306f457fac71b031e4f2101dd64455be994a89712f6a05d0d87bd75e1a829dfd19ad6ceb46134b54d0afae203b08ba09901503704fbaf6ced7287fcfcba3457b51206921eba3dce2780376081e6cdfaab0570161ba30da57ee3f4571e502f4b9d98aed0f68cfeef55e38833df3da7fa5006182435a6c1749e074bc967409b3c2999e52e0301b1250370d6138d9420c49500983a83a89108ede1504ac07643bfc8a2d9d11c07dbe89f4a882d27a4f10b3a025491dde515575a061f7dc53e2a9eeb45c63945125ec5e914a9cc661cb590b73a229d45c37af78cfbbe14d684769b8508c2186fbd3468e5a2fa5e1b448529e8d401000000c0e73f2c27fbb652e0885034ff9e0adb5358933bc0ce722d1dd320520df16d247b121d7b13e7a99516693e42f31ed6c2e4890c0ba35b6def80ecea40de70edbfc0efe4d6c10bdca3b9fb0259195d1e6348fd01211f20a35c18bca03ae3043694f75885a4b0785ee97706a6ed2605b49a1cb30addeb8c6b7e8314f17d18672a244e8fee0c25ef7c097d9014c51402d2851f1db7af2d9e3b552a8ba82bacc55b07a8f39547f3679de045aa1728a3cede6b1962891f84d5f1c37d0e3ac025301b00078f1051102053860be971f33b6faa4b7bf51eb7ee23415ef5c61765b806d7abc39889cf1a53a0b53908522a0bd69093120f272a6e171906ec65a852c7b63307b9be5ed4e3b0615853e20e34f3e48eb3535e8bb9a5b554a60b9f2c1d614f912c322bea1857b12c9dcc4ff776dba6677460f73c4ceec551f198bd17713a4653ef6a57958d3025fc341ff4a60dfb22d6dba90de7c44609af818bb72ec2babce6c279f780d514d4ef0008e216e2c43356e8cdfb1ca0994261bd6c7566c48c4f8275588088b6988e202c1174c5774c319dd8b94f2eb9d70653b4dca1486cf1200ce0d507e895b3909a24b2f3f0e07e2fd92d1f0f6a7a4ccac01c1d6a3fb54999ce8f3b3b57734a43dc8e899162e423e009bb3c6ff036eba67eb31512b080ff299b10c5d7812a658a4800484392aa6949adc6a981302379d359c7de76ec2b0fa6a18c94978d5df6847ece631b5e5178a8ac5e09460a7a3d40af02856721873749a075d42839fb68fc7358c48c4c1851c3088a92524534d4a31edc6437ad5b691ddec586bb62fbc8ee2e2e2b9117dc582f8bf9f6850d6884974ba5d324ba059e4049ddd0d5f8e5f02e9231f112aef0d6e53355ff58e589418dc2a05e0ae72833f0925efa00ad9b34fae89fd2436350e641b02b98d762d08e6321e05ef013d5c593be4d490a85b15bdd55bdefc2f08d663111ed3c204de71fa4c0ce0963d53c10398b53360fe4850e0ce66d802c7d6edfbffc87db5a569810637e66ba27bcb87105f1ee240d74fbf27669b223ed852f39c9f1da078ea5358acaef594cd42169f9cfefa1dc09f311f09b1be6ed06c96417c94f0a35f877a0d4101aef5c37ec1fcc541dbca90b5912a90bbe9fdf92f4e82ad4644d833feccec1df80c04c7c15b52e4675554e0f10db740575d8eb93f871fcd9ee1cf96f9055cba321ed062d74ea64a091f85f07e908696b972024a76b475023aabe7cd6dc885d85e6cf939cb613e29f5c688800ffe4b47966debc27772932f27bfcdcca0cdf9f2311ab8b9466237656c6c947075cb8c6f3d40ec1304142100b2753d9e7a26469140d02ed5f90cbc4d09e9109028d0038ecff3ba19c92b30d02b5cedbe3573135debacc8e0f67b3801bda3ebe0b99981f98f2db463f679efee14ca8e826b22b34355d4a3b529f154c16d9eaf108b49727cc99faa75e679706f3da45e5615f53ddc4eade8e043c6382bc32cbec0dc6c22646296bb9df3785103ae4beb4cc89c4e70d218dc07117858028a932500134d482ee1038cd546ddb25bdd0108051896ed4cf87347b44f85d7e2f442825090a1dd18201fc4203c906c7628f403cfcebfc2aebe9c915b1afaf925650927200663d9a356e4e1b5f11963cc607a2abcf05f90227e27f119adad43ea64a44910568409004a500e58fc746c3cfd52e6386a2931d6d5971c1ace95b0cae6707d608cb4d756b3e466fcd11b39c25cf969dc2c67f1af31649ae69f04ea74bda4e4d0bd2970cdbbb450b7f42e96e50210c52af054fcfdd1f49d359ccead3ef3dff2d0eaa54849b3916476019678961a2aae55a26242c59767723bcd87ab944fee52003c4f5dc73d314435c7c5b4c7c3c768ada45328721144dd35c2ae6a44cd97b0006f6312dc281e4806c1a4827d543791b362341bcad419a0ba1ccee97d4e878110d420958ef3b15a49f5f210ac8971ef352e5bd13b2bfb7417cc8c67bec57fb990a88fd766c29cddbfefe7ca198c092bb886a390016026612159c51c2cd9d03570f1c1186ca6b0a61e7210a2548f42bdc0b5ff6ba87d4e9cd4aa6f090dd06b3a207b3298f532abb82e8c328bff6f158191dfdf34e2367dd0d8b6027119325e2b384");
// tx_hash 6aa5057aeccac8e1bf632eaa813554352b2f5a4b6bd02f920a44cf3081488a2f
// this tx should have 0.1 xmr for testnet wallet (monerowallettestnet7)
// 9tzmPMTViHYM3z6NAgQni1Qm1Emzxy5hQFibPgWD3LVTAz91yok5Eni1pH6zKhBHzpTU15GZooPHSGHXFvFuXEdmEG2sWAZ
// viewkey: ae6184287ca791609844f140b8502ccfa2223c04c8699cf31fcd0af1f1d0be08
// payment_id8: 6c224eea64220435
txs_hex.emplace_back("020001020005b98008b8488afe02ddec0292a006e3e8f7285830f025ce902188c93bcae9eaa9161f43a91f377b9380229025ca65020002f2d03bb485f877f6a5a07c87f0b0590aea326a91b7409bb9bdd229d63c8331940002c139346f6b4ad08d3d3af56b4869a1ea355e57cbcb4b4bb0cdd9b3eafe9a84f52c0209014d4495ad4516b03301bf41bcf90602f5c2a4865c84c7f5991f9156c3623532be81fd03e1049a4971c401c09fe4a442cbb8ee0dd124e916a25d9d013ca26ae1fabfd791658b55c16b4b3b2cf2b48b0f1a774f2ef1da80abe325aeede2fbf06bf401384fb24adab274d3c9987fcd1704c409da54aebd3417b4f334de47660e203a6b419e1520133697bd2a2bf9ce380148a67d16c3796c19ce3340d43cba8801761cb408267ab4e0b68a4e139b9cb10b3da43f6b557704432c55be77d924e2e937efb195ff62bd726013809aac85a8883804b84860f45e9122ccd805c483a71f9af424f97b2b24075b4a3c94f78916240fc956efef0629c1c3add3ebf898ada716cc29b04299e711c210b0e20d511703b684efa874993a53658553993cfb3866f3592986c5781a8ae4579794de7f0b0450e3da2f369a49332e20bc31a03d8d77862b1d9e8e2cc775624dad7342979903ec5715722691fb496c51d78e3afb37eab32a79525728b266b4d885a8ac7cfc0e07f3bda7ce627b9e3a93f5e574775c39de41230528339b3e2feb378853f8bf0aeaf3a22e6d2bbc84d65a0f63cbc0871c2ee93380e5d5c8db9a69f30fb718ab0dc94b5c652ddecb2793d2fb235047bf33cf758bfffe8af3ef7dd26c2973d807049c5f37ec896e409968946ca772607bad12bb6dd34bc495954ae34aa33b250b0b00df28e7a98468750a017c730b9260289b16e1f8207fa85f38822ce1b66b9f092dcea9e753c97fd44fd93444d1435152c60c2fdba6cdcb768678e0706f98c301eb19e94a75afb025c2e88470461c081f5bdbcd6d24e110537a3dffa21154bd0713d663edce151725da1176e88903d3df106deb48382b93daba591732008ecc0ff798c89a56d2b97e1dcaf315bc92a5c674e22da4074b24d175f732546b45be036179a799218dc8480b59171630e855613cc144f6eeb094e13649f4c5e0ed590650d19c9283e7eaa1d6eb4f6934b8f9526ded049c6c6cf8029c8c1613f7cb97087a0b42c0f4c710bd97c283b1b2d734f05ec4d37fb60dd3d600cbfd7edbc96a0ce52791291d81ef2c16f8d0dde60527b84d0005eba72be7cf5a1cc315ac6d8f07b86cd1ed0ab4e9f523753fe06055b9e2cbcf2eac9970015515eea4f08c4c6a0dc6717175ee854930e6c91c64f37e006e80cf7f6a052c22e451f63b08e327390ad6b79daff1388fdcd814eb933a5f0e736626c25fb02edd016568a68691207f0020df03db999d20a6cf0e9dd08029cb53f6ecab671f33dc2ed31fbc4b3497b5002b848e6f52731fb71adbed943be95b8cea4628a7f24e28e2e595a4f8e925f4039821cd8755d44fcf86f13444131b5b834e9b259d4edb6dce4cc6081fcdc2e80ea7437ecb1f5c3bc4ea8296face9e97c495f86038dd7d025e8dedb55ccfdc7a0982f0b40e11ee49a5236d9296ecb649ca6e50f0df0e74cd484df5a177a76b4602ac57f87da155abded4ad9ee710fa2849dca17505e7d2516071a4d29dd00bf0022cd3122e5f32b51ddde8e15d10bf636057d1bc3c13774ead261d9e3608f6db00b7e0c85a48064b1e43d036a4b85dbade28040a448dbe8e121693c5805a5a32021ffeaa427e0a1edb2ccb65dea25d4a1276bf95c7bcf33a1e6b8f63401463710a26273f808543c9a5544f7cff7e177d3ece6da829187e97bf325277445131c10a2aa5ff0af0d70915e91d2a1a1d2022b520b5a174315b9f4dcb5c77ea872ee907d060e42a5e088efdd85fe8def4f7566943ca4c728ab1de8e5f8e7d42dce318055ffb89d7d20e08eace6546abcb632ca518e334490dc791e4fde02d58fcb2dc0cdf381b6bae61849a9a27a428af0adff08aadbdc2e109044dff08570f6bb7da0b30913a7ffa0115732545c51a79e1817f4972a53110ef5ff688d5d9edd242e40bcf111ca6b2bbdeed2d3a7bc83297983fecb3d5cc7425c0883f712d8448d0af0047e891533719c1c99742c3821c80395219c7b1a4b28764cf46eef9197b5e4305304e402febe6ae38b1de2462d21fa02e9584e815310c04b5bab49ebfd981050b72b5c3e788f9d06f1f0af4bfb74faf956a966c82f665010af806693e7b47c30a2a02168b3a6e8288d8d5e350e2efcacc98f15c7d7e7486969bf2854e0543ca02d23800fbc3c5af6f8a1a2afc38125a8731dc13aa63330ab8cf922ef7f8dbc8000ac6c3b885d73c413809a39321d01d4f318e4257b3460d7e1c3a866279088c0773b91594c2352f80b99e3e853f255ad6c484ec4fa9318128ceaaa5d78a700a074677258d1c4a2dbae6afca491ea2e58abf3523dd6a54ddb9e643aba2125b2507ff64881dd6ba33a7a68ed8d776a3e70901470694261de282af86876b76875f07d0dad169b268bee8896e38b419839a0f1a540cbb563caffdd7c1b99d8a39d70fd880d7b264b1e3d8ed83d1d225aa74d6a9bcf5fbaca2324b2db7df8229893d0cfd28537fd6f20fb4a895d975bf5be7cdacca2f0ab5a6bdd6ebc1ec5b945077097fd2e8da52fda700400c73b20deb2ab1e4df8e2e47afb2784328a70264ade10ef6743b6e37e7755ebaa434bbc8060c87f68ef8a779c366445a05b7539bf57d0a6001fdbf0f0e47c930fa6f77c7306e762cb4f44e2d963dc123c75aeebd2cd009c68b6653dc851dfea8b9ec2ed1acbb50e350f282859af86f6ed092b385406e08caefd963de05
// tx_hash 84ec08256fe54f3fbbe8dd109a177a35cd1d7788c1cfdf9074684ffb7b058a62
txs_hex.emplace_back("02000202000bda9012e79b02cb70891498076428dc13fe1018ad04d033d24cf85e0913d79de224bc963260ce2a9525abd20c820321d521f87c54f502000b97b612b41cb90cda9001c24dc69b01da02498a06150729e0aa26efaeca36c9f157bf8e80619c32e25a78a4e724815d892c857a2f8766020002915e00d148ba7fe9d87db41f6cccd1f5a42f97ad7e21be593bd5d426386dfc740002532d546c0e0b71c261c620dbbfc0483eacc5013f061942ca646218eede87b36e2101348b2a55ae9a3a5cc95b6f23f150801caba13db7a89d288a2d99de7e2ef9b50703f0d3ef46e6ad58a899a21ae112743b155278003e73207aec4e3d0d1066014fe4a54e450c10bbccefa40e36ec54f92355a4c1c668e34c3cb95e448bc258c3f82c80092d00d23b2d6d8bfe2cf8e5cd8fa75fcc29d95b3749c79607dea49b9c25ad6f0e7a0cab9a142c55479f7a5063a66fdb59a65dd66d963ef8c4139924f1330c155cad0507e1e2a0134efa3b0ec0ddfc67570e1091dcd30296919cd3da9b7561b05d3f6e1e7c4b568fe30b9563975ca99edc03061e89218f99f48c1b6f7227f9156778db01000000816d43fce0236c371ee6617135310d6fabc4276e8550f073dba55d2b71b7ed117b6116302f6931d29071cf436cb112150317cfd3bf20dea399fe1b09d7493f5d68794ee35438e828af648190ba945409240d9462b6bdd9baa6a169fb7be69e2f7a64626661a8d85ac32f3975f15882cfc37168e24f7174dd5bbe54a7c0a4adc840b984a747ab8caae8a9065c99fbb63455280f927d0b519eecb28d68abe6a70f610ef8d3bfb148fc41c1b4e829895079559cbecec68c25530ffc6bb322cba0050705ca23610e2182d22f7e92065bfccac733e8bddbc40102ad17cf3afa4802140db82068d8f688a97da1a5015999d6869d0f12d3748adf47a247945cc52feba3096902e58db2882e7672fec9ff323180e43094e0901cb56223916d167dedea7e530910b3db163272a6b86fe9697e041eea4423b9f7bc6fbe3e137f1138263611879e6eacab76d1ad61d3ab97b83a3767a996cddc7e847e6acb1620fbb22fedced8559cbfea642fb555dd11f3165b0c205f37b844a96620690d8317e09bbe8beae33fc6684f7e78b9e09449dd44512f18e21ecbf3834df144127a98e429e6b31c4407f5e0d0fb794d5b80d600cba8e2f9d9d54e65b0e5d6296fe91c29b7b341cce607269ba337044ab633fe7b7f3e3e26a29d05bd5ef8c0877c6bc09f0ec8339c1564b4493b32d2b87e95694e9b4e66add1adba93cf365ad324748d377c5dfca36a1726896c17c0a1ae1af47dfc3e436d0f3e11786e0df2f79d44aeca1c3241010818d40a94efc5b26786febd964fbfb88862c7bbe8af2c4813e0154a330765dc468ec965f76af2981ca663846ad6506c8267d0a394328c652ed56ae49233d1c69bd8918e53ade14096f997947b3baf8a602733a0d96bfae6b3085986a0b632b1ff11d96be009f602d274331be61d01a48962c8e604b65eb0b56d260af2b6946b690d8baad5085743bd19f2eb85b72108973e7c8c7a56bf7f1a2648c7b03d079791052d971575ac9462e282eed949c1da8e77b83764932fff0400f14edb6c0dd9aa08c5b36f9851f52274ebf64537a5b4fe5d8029621671d0e2232b09d432791e0e04c3030ed44ed9d30f643683bcf6de03d047f4c67087bac10079fd3de529dc1b04e3bf265b1187014b46c9e79d042890395d9a6f7041a6f0e8debf17a87fe0c409fa7e1d99cd4557221108ba2f416939846bff79cc981c457e92df3db0aa39fd04a908c7fe47c18f8dad3a8d1fd9440aa68510f2cb6388000be0e7f7ba70ce0e0c2ee7489d52361c60d170cbac7d85425d2514c8cc925a7f5b43a149bdd65a6007493e9740c7d94008e7668016d1e038fec62e5d7978d0df15a2873cd5ba84f50f747ccedcb3bc091bb977cfe8997c4142ffa3776f4e2384109f2081dbbeda610eb6cd44f664ba1e27caf9e78ffc66be6217ca0f6672a962e3b75eee0a1671e107c9c536b60b809e5c8e10d6e61fe83dde31afd38494a3a3b924fb0de3e882e30092c53ff92417bc677f8834f2f64a0ad937746973bed8724f8586939f2d158f0bcba37fa428e3fbf4417c3284ba5f140c9a111cbe1c90046ed5bb5a4c10f0110d87147b15d4b964e3beed2ea8409eda4d7173ef7411fdad3cdfe11d257ee4e3011d4f42422cf017efaf0a7a21b7c67bd0d2d8e13a0eba1724fb40dc43b16ab602ed6cf2192558f77323c1fb2aca773a6ed1078a7d4cd9907d313f6d8a437ffd0d0c8375446cd6d259796f3a638be77cd46d8bacb1637623cfcb33b8ad19d6b709334af2c62320cd3b5989ac9de5fbc5f125fb5f57980e3d6e5a35a06802ca9a0f4537417cfa003b3a26f9740c531a999fe9a6d7cd75cddc232cc2323bdd3f1204e1ee08e3adf511fb4f068195e1fd6841590f4645312ad5b022bfadee28fc1b03d13efd111ead8bfb0258ed2e7a1a33448c63241129c8c22aedd9cfe200e0110fbe55b42445d19adac772864ffb65eeb8654f4096fb75677fc1079a901a54120b096e650103366090cecba87a909cb3dfdce7e1dd32fc98c84478c48cb722be086af2f9423d35901aec9923dacdbdb5cba8c79aafd7689e9e82c2f87a232c7f02a05164edcdf0896f44cf90008d4e516ecc0e810ce333814d06cd3853906435068edf2c987d222b066de3bb6cf2c7a090df7878991900388ee05070d7ed6deb0d3c2a5f96196f14cdbbd0c74d381767eb27635196b2daac76644b5bb075b6ea08c6653ab966ed10015d1116593005522c61931b054dba273cc7d75a0f92185800d5fced9995d8257b09e5011d
//tx hash 1be093bf3e0d004bd5bf3a121e812fbc0f5e1230bb33b2eb8d9456345afea19f
// also mine
txs_hex.emplace_back("029ca54101ffe0a4410186d08b88c5f101028d49e37bb8c1ae92cbcd928aa89494121be17e065f0d26427c165eda1cefdded2b018e774da8f7f5fb0214a235bd20b8f76271591dbf7de16f76d0085a5563114c5a02080000000397a47a0000");
//tx hash 8a0f4995709a67d5a175f4a435f6c3aa8fd5a0305e82484b4db2f9ef1df9b611
// second tx which has payment_id8 (7f4cd286ecadddce) for us
// tx has key_image: ??
txs_hex.emplace_back("020001020005daca038ddb02be8802939b0296ba0591d144ab56bbf28e81352afc8bc0f7822ff02af31dbf5e6844155723416d605e020002263c217ba93c83f75ccdedd4299fa7cea1d1c7a6e6dcc729019ee07c7db08fc5000257211ff41521a4d1f1668717a705af164b6b1e94cb37a3d8f956fcf938c22bf52c020901d8c90e0adb419c9c017838b3c081f2dd1404e0324669c19965ed49305f7df956dc21d4a79faff0851201c0d0aeceb118b752e6f044543acbe6c449890d28601b9df22fb030fb66cd98a522f96847980898a7bde763ee9487c8a33a817c75f5904d9cb4a180351471592e697d0d271d0c717686a8d08f546c5c63a594879dd4b677a4c45c4a7783a06b91e71b1958bc0469e93f805fb71448a93ab019d8abc4b05e3ea095a4359e7d6376f363186a7f0b6a3a04d88cc0aaf0b4869d6ee402a827ffe4df67f2d55319e1c209c3eeb8faf22c3bc829dca10a973ac0f09df6b86b413ad374f204505c7429e083dfde9e6a499e3a554ad9273cb2157fdc627e9cf373b76d5cfd4fb2597e548962cc6d39e5011bba020bd07afb6c38071531a5953c298c269198dde7ee9d86949b8ad21a3f0ecd26a6709438fde5ab58be20e487c501243ffc1b88ede154fb29486cab8a320d79f04c529fb52eef952cf10ab0d84fcd88e4b5d3deff7f43d8951ab6cc0f98094d3f913391f5fb7c689d7d1cedf649b83d9d502a31defeb76db15b732b45de0f166fc507c8bba052efd09886e1d72b3621a40c7ed4dc4347af0c6be614a5e9080d57323a588521704bef1c4b99a1251317ecf082e06bf9efba3d01edc7fec009adcc0b17a2f099cd7e8e1f8fa35870de4c662902cf50bd5aba5cd3fe4f003107956ea0b91a6e617ddefd54d39fe340ce5a501bf864337be12397b7ffe4943007eb589f9509ba6d311926b9316ce66f5c9ac5e0cacc9b0e0f105f0993dc75310582e5ab388e69acf735dd67398f109b7fb16691fb9172ddd6b1642283b5fc5c09765dee03038ca6c5c1a7a73f496fc7c3157c6deaea7d922f2277b9cf563d6f08474090559297840bd13884086647a302e5910ca27804963b1a8205ad2158840bb237a8991bfddc9055f9d634b9f655214914be04c7325bb776a412ecc660250cdba46b539603871344e1ff726c8803efdd22bc979e7c494873526385e9b38a027d2457c395fce5ed632a33ad22c3daad0ef52ddb38574e5f949793b88925f20febe020726fcbaa7a6e990da6fdbb4572cef17ea9565ea170e742ffc7735e65018d3889fac6f7e9326f929b4d66999a8631cade0cf96b2a886fd3e5858b5d1d085dabc71c5be79ce62006b71f240e9d74c33d5f77e3754432badecad2471a380e2282bb3b66fc8a8b02eae5fe53618b49f2ac7a71e8a3fbc03675f36d3af87a03efc2a2ccd12844f4141911722118b773076ba13915abb2b95bd03f9620f77d0dab7341f469d13fa3cd06e5cdee4e8d3f31f183101fb945c963c804b4c12a2e0c51cc48c34bc1bd9ecf42683f0299b699687abd9acb105bdc9df14e86b060fd0f75b9e4c439915904d2efc8ce4a6a40a4bef80cc199c2d007927ca96e99ebb40bc1ead701b8f8aea9fe57176313fd0322eb7573e595254cd96c39392faadca403cef7c9f50111c35ad00156a8bdb742b656f4ca4fa4f39dff17c78590ec921d05aad68aec16808d7b32ab1c06d3ac7d1a0812f4e3c02bfd33ad52ba6de6b9c408a58762c3d440ddb1476606a2685de6159065339693c1981d181c1339c7151303d427ebc84acd917d6711fe1eb443c4af220f00c142b780cf8202c078f643980de84e0fb67b13dbb9a0c6b9f8aff3765f3cc7575bb751dc3c6fa488c5d97d290abc80c3578ddf9a7ed99765cbddb3d16aa9acf1548bdcfd79dc6167812464ae0ea7b7b7e9f45479d2a414befd2b1772c72fad0dc3d45ca58c895fbc644201c40c5e910f5842f2927f95a7befcf56979cf28edba0a5207698c4cea03c7447bca08301671c7d176eaa163a9497a37a4c8ab566b2fecf5c5daf965de648cf796720dfd7e30e4065d3851ba43deddad3e054a106e8316ef255a27f0cd43c7b348bd0b1000a134fd98bd6fbe70179ff5fa7764bc9296f851c4cc6e16a62a0f0dcb2d0000265e93ac73e28356ad222161f2f7d4f706764e78105d046eaba7c6495be7082c32a4ab53b26c7d877a1ebc7d2f55ae19acd3b5b3ae2a2504f919091923660ca89389b8d998baffa0a35942ec964a6c5d7b925cdcc5155d8b15948ea53f7e0b4d8998df36af3fda232f2956f2d2dbd27b7de102f3c39254f3699a25c174550daaf8a044966ff7ccbd3c96211dce437850de051051f4455e6f8df835edf75a06007f41420fa7b4ffe3e76efe682a1327d68363b355c351f3b1728651dd1ca10eb6072f5f0e4ddc75ff797e0314e80bf37655a08047de013ee377f2d0310bbc0bf3eb94d0a53250358aee6f0862c1b564dc239c53ac0a6daeb0215165b4ef5f07723b8d382a6635c1a2dd76411048a7f9542b172126a0fc651dff7a6b93f42a0ea28d747c3b11b023ca2b10321fd0c2b9cbd8114341b147a1446b21d24a97c70488c384ff485763205b7da3d04dd5ccac96d1ca9a4f6c20936623e3f8e764c403b87f71f14b17d98e661ed23ebfbbc54b4089d679026bcc82d3719ba9b5498d03ce839fb598982b4bc232e2846e92e98058b694b34cce56dfd821b6962d6b2209f976393b9b1d5dfd26572b42000f03b33268aeea566c65e9d97a9fd5919cba0ba813cbfcdc79b5ee0c5f953aa2393aebd2d7d557fcc8a7d0dbe611293abd240e55b04d17ee67b73b31e6fb0649f671c847433bc92dc138ef6da45baf071a4506b4c99b64
if (as_blob)
{
vector<string> txs_blobs;
for (auto const& tx_hex: txs_hex)
{
string tx_blob;
if (!xmreg::hex_to_tx_blob(tx_hex, tx_blob))
{
cerr << "Failed converting tx_hex to tx_blob\n";
return {};
}
txs_blobs.push_back(tx_blob);
}
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);
ASSERT_FALSE(txs_blobs.empty());
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());
vector<string> key_images_to_find_str {
"18fff454382da01b4420cd666dc5f3101314537de00d62042206d4b393bf918a",
"c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286ed"};
vector<txin_v> key_images_to_find;
for (auto& ki_str: key_images_to_find_str)
{
key_images_to_find.push_back(txin_to_key{});
hex_to_pod(ki_str,
boost::get<txin_to_key>(key_images_to_find.back()).k_image);
}
EXPECT_TRUE(bcs->find_key_images_in_mempool(key_images_to_find));
// now do same but using tx as input, instead of vector of key images
transaction tx;
crypto::hash tx_hash;
crypto::hash tx_prefix_hash;
parse_and_validate_tx_from_blob(
mempool_txs_to_return[1].tx_blob,
tx, tx_hash, tx_prefix_hash);
EXPECT_TRUE(bcs->find_key_images_in_mempool(tx));
// and now check what happens if key images are not in the mempool
// we change just last character in the key images, thus
// making them different with those in the mempool
vector<string> key_images_to_find_str2 {
"18fff454382da01b4420cd666dc5f3101314537de00d62042206d4b393bf918h",
"c0b2a4909185084c7113de20415c3b7545e5d4f0cc5b5fd21cd1d297ad1286e2"};
vector<txin_v> key_images_to_find2;
for (auto& ki_str: key_images_to_find_str2)
{
key_images_to_find2.push_back(txin_to_key{});
hex_to_pod(ki_str,
boost::get<txin_to_key>(key_images_to_find2.back()).k_image);
}
EXPECT_FALSE(bcs->find_key_images_in_mempool(key_images_to_find2));
}
TEST_P(BCSTATUS_TEST, ConstructOutputRctField_RingCTTx)
{
// testnet tx_hash 4942dbb5421c8516c05473f3cf191f07e419109fbdaf22bfcc7f8e95a0e73bf2
string ringct_tx_hex {"02000202000589ad0adfac02d3f602ee81019ab203e413b8c4331030b044de847a8af9819f8c8dc7279e50a5f808e5ce046457f0810200059f8707de9d06ad0786b70181f105de4fbc7e9f3b2fa53a79818c06c2171768114efa8b95acd0b7d201bfc9c4b5a50200020ca366cb4718c5a9bd8beaec8d1a82875c5b90cbcd6025a916c27506b2ee00e70002d300d85b9e98e6d7ae89769c29741fade0f19b8101d713cf6e07d77d901d4f0421015c896eccc7009995ee071c1d0f88d27b66970f7b081b0a91501ffdd3eb2ac1d20280aff6b0475fb2f3468bcfbb33e3a9baf834f4d96fd60bf2502c620eee27a96bcbcc0197a098814e6805bc72cf993ecc261bb431d77cb5ac24097951e1cdd381dff64fb56b13dfacfc9f25201deecc815a19e461127665bae817d333a30a08a86be1ce0b04a4c034fd03a281b9120d6a9853b58b5d22f925333eeb8c361ec27b69d116e9014e3b4564048f50151f79dd73f17b97ea9cd2b64ac585ecc6fa95e8d4eb68ef073a724b8f8b6e2c321a2d67e82b2625cffdb90eeec533fb3f04db7c55bf7038071c7e322d4a66733353476ef558304bc379c8f6c977b17e22906ef747ce9f3686cc9f9fcddc3a8fde9d7ad923b122eeb783d54f4c4c6712d32de661d7f9c354735f653a117ea0d1e9177719a4fdba6af71d934d30ac5701d5a00cffa41a7eb10388e08081c66ee2f61f1f03a0c3072fb6a1f53f50c552afc033b6098338897e000affaf318d0132db7542803f973de206c68ed75aca18ac55d0a3e9784c4a5c05827f9a15a40167e9da22875330754f9fd11d944158038dab7428687b33fca802d1ab895b291d144f94a2b0e2ec36fd902de6b846dce95b924489b9be840af105d1159d68012cee1d54651d9eb468ffade2799075eb6a5e4f523524f23825e70397917295af94cc5e236467417351660a4b89614a5be44d7d45d54884615c0808fafc469e894a80ea7881af6dcdfecdfc4eed44b056e08b1e4213851cbd478e0e059bf849a775b807ee9167b5ddc79b9836fc570303b498fa1542c55de1ab6b056983812e7000dcdc71136859f462693534a7b6492b7a656b268626d0b49dda01d12447cbd4ac3834cc9a6ac63633ec7fa21a9b35bac9577d5407289d3424410f69cf54668663ad21737837c206240f808a2eaf9d929d8a8f67f9d97711f1b60c5887e578f54e37cb56ed4e7541672cbb170e45e04a485fb323a97717e75d9e0a5451e81db2243fc1c07a112ec2e4126d7e76725ada27e2c582d0f754f3da4709fc19beb7b0df16c20dd7fe947190edfd8ac7bb387a0f9ecb1d74396c1022c703ce08d60d4dc60ff59ce9630385048ff41eb5f38f5b4763ce1b660dffb6e11d0cf9235365a1c1ee4e2d39037caa940f7dfeb4206128cc79818f616818125efa060e7ccdc678da1460dcdf67aba8fbc98c024cf2baff9840e031732cf888cbb80c5e20ca88aecb0e2b536fb971079942eef602a2cd8aecacf5bc835549ce2d2c0fb8eeae35d2345b905fef798bef56bc8b9969906071d20d9f9f2c1aa0f6d05f05197689a7337cdd2f2b7eefccbc4d007a47f0e82ee54a36767ce227fa00b9a4031217653287914b3ff65121608d63e1afc089aa19013f6cd32dc41bc7fb906a022b235bba5f0424a76b11c9782a2cdc51baeb92119d543c0624d01b577059f70d961c028aa394ee566495c50c906e5f9fcd669eed2763a791f707abeda770a209784c1df5d478b008b54f3ea5bc31ef04dcbd78d35babcd2be3d24c1b0b5be10975ee2f48b54f217be2b4efe3cf77a2a6744aff50b233b40367c1f7206a77cc00704b429f13e22662d7613e48da3d9dcdf76951dbc4bb0359b27853071ce59d08fbf25cc8a0351302933601292c1c992fb1ce9b9c8a3319a834439910ae56b2057f870891b8f0b6cd9f3d0340ce06683da20e84cbfce0aafd99e7bc66a521b5009b9ea3487f3530db9fa58c90c1f9923cee1b5d30e9077ec7cb635a4bdd5bd10b3b70a814e67fcea765cd42c7e28d93d7ac15551aff5c9938f24e50076a4f000a9386cf3d85f5b3e4c4190c7978970d136144c0b5d700f009bd271b31d83779078ba474e9b9dd21267ce87eef80a416a9385c3e958ae3a5a00b0e4b77e862d2066e86a9db04efbedcc47b9b6ae3a5e087149d9f67d40a3fe1303ee5b803f2340b6dc14bd35786ea58099c1f397b65bee1ac6026d251b3a293aa2fa3e627eded06a927662d3e20082e7f067adb541934055d422877585c6061062ebc204956980c80e1a84bd507dc17bcd5fbee8cd9768bdac739239e00737e84662d84e8cd770beec6d21a41e1432f1b0330a0256f1792676717d338f7f6772090589cdd868f0e3a43dc029b59f4b26f4f0a2ba38d0c8f78c9b09a90ffe0bc8e0b4959935c8a062f52368a4af1fd58959c96c1326d57d4f4ddd9c511c8e58b350735205e691304a9eecf2de15e72ba6e83a9f155e5a3841efa4d68c2b682b632db390a9e932d0bfff11dd51f9a3f5aa4551459fd552ad9ba82d8769af772abfb6203f22ff15009f693a533ff1fca6e04514849e0747c04f175a136ba10b950b83451f6d4f79b079bb807f27f0b58f8a39605fe71351a8cb3294fb58d32fc85510ae38148577e0e8a3e92ad9803391ca009da09bbc458047eb22fd63ce8b81869fdfc03069cc704698cf0330766fb7205c09e00e11f2daf89a429dc66b6320573e5c1ea8106e80dff86db6e06876be7129620c34b0d9c48089392e10b70ed11fe03b6463fd7b40fc1aba37829397587f309c927e66c0e111630b2fb1fdfd002d05dbd0f5875e500a857a30378f7dca31ddd602b5f0f42d714f361c6be72b3479dcf1e452614a1
TX_FROM_HEX(ringct_tx_hex);
const tx_out_index tx_idx_to_return = make_pair(tx_hash,
1 /* output idx */);
EXPECT_CALL(*mcore_ptr, get_output_tx_and_index(_, _))
.WillRepeatedly(Return(tx_idx_to_return));
uint64_t mock_global_amount_index {33333}; // any index
uint64_t mock_out_amount {0}; // any amount
// first we check if get_tx returns false when it
// cant locate the txs that we need
EXPECT_CALL(*mcore_ptr, get_tx(_, _)).WillOnce(Return(false));
auto rct_fields = bcs->construct_output_rct_field(
mock_global_amount_index,
mock_out_amount);
EXPECT_TRUE(std::get<0>(rct_fields).empty());
EXPECT_TRUE(std::get<1>(rct_fields).empty());
EXPECT_TRUE(std::get<2>(rct_fields).empty());
// now get_tx will return true and the tx that we want
EXPECT_CALL(*mcore_ptr, get_tx(_, _))
.WillOnce(DoAll(SetArgReferee<1>(tx), Return(true)));
rct_fields = bcs->construct_output_rct_field(
mock_global_amount_index,
mock_out_amount);
string expected_rtc_outpk {"cc9f9fcddc3a8fde9d7ad923b122eeb783d54f4c4c6712d32de661d7f9c35473"};
string expected_rtc_mask {"4e3b4564048f50151f79dd73f17b97ea9cd2b64ac585ecc6fa95e8d4eb68ef07"};
string expected_rtc_amount {"3a724b8f8b6e2c321a2d67e82b2625cffdb90eeec533fb3f04db7c55bf703807"};
EXPECT_EQ(std::get<0>(rct_fields), expected_rtc_outpk);
EXPECT_EQ(std::get<1>(rct_fields), expected_rtc_mask);
EXPECT_EQ(std::get<2>(rct_fields), expected_rtc_amount);
}
TEST_P(BCSTATUS_TEST, ConstructOutputRctField_LegacyTx)
{
// mainnet tx_hash a898e407e3427200f8356e1d33d08023aa1440e01b2c2ce2fa9dfd5b7fc89c88
string ringct_tx_hex {"0100020280a0d9e61d018f90012489c0dd35d368c61d8bf7b692054cf2ecdf1d5e4c985b140a5afdf66525a97f0280c0dfda8ee90601a80cb030275216f7958e0c3a17cf42d8b1e8b17f1a5703b63bef978dea03f87cd62d048088aca3cf0202a65b1dd8cfe0e41e15af75dd0c1d18c26371e51ec9f293af5b909a0a5fa59be180d0b8e1981a02186734d4374cd227a0f7a65daeeae275828cf3c72fb5d93e1184322dfff394b580a0b6cef7850202958ecb9dee140f74ea0605f265d231261dec5e58c8a89975719690c50cb4cfaf808095e789c60402b9b075493ef432e589ca2a7dc63ecbee7b9e05bcd416596ed0498c7802f71c9e44022100462e3cdfa219d8724fb531eb7e741a65f6802546aed7ff7064236e038421b32801d33c3170a4d9417f13e2e3a83c5241d3383de20b3913a6d295d6e8cc5322df862b571136213f79ea1b834b361fec3d8eb4d297fc007f24e27a00d76c4716b6080db448368abdcaf65267d099de23c796f868ebe8eb6c91829258222abee147026144104a8e3233d953f68d265f8d15f8b15deddf5e1eedfc4302139f30160e08552888d925706c48f0f1f205e4dacf4ab314cca13819359e109094bc3c8d7707"};
// this tx is not realy used in this case for checking expectaions.
// we only have it so that we can get to the else section
// in the if statment in construct_output_rct_field
TX_FROM_HEX(ringct_tx_hex);
const tx_out_index tx_idx_to_return = make_pair(tx_hash,
1 /* output idx */);
EXPECT_CALL(*mcore_ptr, get_output_tx_and_index(_, _))
.WillRepeatedly(Return(tx_idx_to_return));
uint64_t mock_global_amount_index {33333}; // any index
uint64_t mock_out_amount {0}; // any amount
// now get_tx will return true and the tx that we want
EXPECT_CALL(*mcore_ptr, get_tx(_, _))
.WillOnce(DoAll(SetArgReferee<1>(tx), Return(true)));
// for legact txs we only need their outputs and commitment
// thus only rtc_outpk will be set in tuple produced
// by construct_output_rct_field
// since we mock eveyrhting, the commitment returned can
// be random.
output_data_t output_to_return {
crypto::rand<crypto::public_key>(),
1000, 2222,
crypto::rand<rct::key>() /* commitment */};
EXPECT_CALL(*mcore_ptr, get_output_key(_, _))
.WillOnce(Return(output_to_return));
auto rct_fields = bcs->construct_output_rct_field(
mock_global_amount_index,
mock_out_amount);
string expected_rtc_outpk = pod_to_hex(output_to_return.commitment);
string expected_rtc_mask(64, '0'); // expected to be zero
string expected_rtc_amount(64, '0'); // expected to be zero
EXPECT_EQ(std::get<0>(rct_fields), expected_rtc_outpk);
EXPECT_EQ(std::get<1>(rct_fields), expected_rtc_mask);
EXPECT_EQ(std::get<2>(rct_fields), expected_rtc_amount);
}
vector<string>
get_blocks_hex()
{
vector<string> blks;
// monero donation address
// 44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A
// f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501
// some of the txs in the blocks below have xmr for the above address
// complete block hex
// mainnet 1031380
blks.emplace_back("0111010101010201010805626c6f636b0a91060203d9fce8b80500b81c1893c0f296f18b01fdb577be90aaf992d29d6e90d3167810eae5dc380a610000000190fa3e01ffd4f93e0580cee4cd020297c8f2baa4726c9d722a97189886225eb48d57a46c029a70fe8480dc4ba9c39480d0acf30e0264d2ccea2aa2dce7b31a96a07eab44bf31946df32ad62ba4dd1eed3577ee582c80f092cbdd0802fa280ab0cb18a7e8463edc62a937ae1745472cde1d6d361b95ad4f642c05a7ee80e0bcefa75702c108f2d42a2a818ad3904d5a5e69ddc9e6d54d7eb929e5ea757e9123d768cecc80c0caf384a3020212f00b82a5c89760cebc028e17bb7245ec15ac5cd738e3e3caebb38a10abcc782b01060a7764310c1faacba8528be87dbbcb60782a54265ca9731e4f7c89586f4528020800000001f8cad9390494d69a6ba71b9e5e8037636579300041fbc141d3020b762d5773ed6c37f665ad2d9eefbf6fed61a618552042beb3ccfb53c1da5ece0826e7cce5d66005b34de9d6a43029479e039f3ac79e54f97c31fa398f9199386100d74d0a76f7d5480447486c22bfedd8bee3c2ea4496614014744203463cb083f32a62d7a3835d2cc6ed037478738a104d8c0100110280d0b8e1981a05cc940fea1df27696ae04d4ba01700da5632a85f38536a55b724466989b95f78c22e37e25744bb777709d36befc0280c0a8ca9a3a05d3cf02c3b20ecc6f9a35fa89027231702afb7d9c5214377d71ec7e320a5185ab7698932a99bdd7edc37147af070280c0caf384a3020599940bdfba0b958f0ac6e705d6b906d589fd80b1f859f75411f30c2c6ddc23ecae6763582719b477f1fa778e811bf30280d0b8e1981a05e28d0ea0f801bcca02c287039d3aadade1aac0f5815aebacf61edb233c49e85c0b5485cbf5facc6e48638e541193028090dfc04a05c2a804a7f603ebdb04f894019ea205da8e9668fcc03ca870686802637b1a62c87d7cde4836b1af57d9360a5ea04b840280c0caf384a302059dd720b2f802a1b0028685028cfa04ed84e0ca032d7295c6a0a216b67066c7aa4dd053d34be614f2e90a706673ca730280b09dc2df0105e5ed01b4e503e59b04a80c98c80247d8f3efb840961125167847e789a1e0fee1d41a76597611dec789b21035e86b0280d0b8e1981a05caa006ddc706ca35e1dc02c497069719b2e68e2ee513d188a5440db83f065b654f91723d5345e126bc4bf970eaf10280c0caf384a30205ab94028eb1149fd802efbb1189a402bdb529a3a14a719b69bc840d46cff0db9467390bb1bc648dde1b541ae6b0d2670280e0bcefa75705e18706c79b0587e1019e5bdae4017ed53c7fb7d4b03645c9d61b4234e45d268b919ff8f4547ca7a1d5ce7fb7df3c0280e0bcefa75705e3e002978d02f7840598b903cd9702417e664134d373b9b8092117c54ebf7efb33d26f0702747c920b4b119446df79028088aca3cf0205ee8406f7ba02cde702f234cdac024e85b4e897aff6fa7a4b93c951dd0cca61be7bbca4a9dc510b493cc3eed96eb0028090dfc04a05b4bd0ae803bea0069f1c82b40240aa683518d7a24653a857f457602c1069c01071b144dce77f37ec90ec61adaf0280e0bcefa75705b8e202aef60496f30286c201f2b50338cf2e890fdb522c3dc3c33a3e8dcf0ffd6e36c3bfc8f9676bbfd7c90edd59310280c0caf384a30205d58f179bc204ddea058c910489b107e88377b33293b2d39197c15f5735ecdf07428adab4f89b8aa0c3c6d434b0215b0280c0caf384a30205c3b80da29706ebbb0cd0b301ddbf0b55967e51802f2f6dd4dc511c5cfecce765a883270046543c255cbc6ce2d607500280d0b8e1981a05ee9a07dd6dbcb709c29a04d436f552ae762e34eb945d23df39ca9ec1564fd163198053b4d29aa67023a04240f04280a0b787e90502c7f6a00a37008d7d066dd07c3a8e2e40ad028416b858a72fa91dc399b7fea67780a0b787e9050208442915d1c8b9efe9198dd5e556ae8d1453c1e34f3de0a828885884121dce8c80a0b787e9050288770297df833c73fa21b392acb77d4fd96e56ab13a80098a2048ba017669cbb80a0b787e9050242f3c9609919d25ea884897d1542a8d891fc0c0bcbf6b411c0b27932f889cee480f092cbdd080236e428b7e6850b84a81e28a542b40a7526a1e327bdf4c19ea248f7e311fa17dd80f092cbdd08027dd7e7bf01659689cfe76dbe260497ec804651614cf378a471f19eb0284da54280c0ee8ed20b0290025b06b0f7d6ed782166cd75085b38b38f50c549dfdaf77c551f3936d6665880c0ee8ed20b02c2d3b61ff406f95626343a40a482bd669f5ed059f99ba3528e4a4c528706cdd580c0ee8ed20b02adbff115cdf269c071881522cf5f9ccf421950d3e1d7841b73a8ee9b109a959580c0ee8ed20b02a3052848943de40352bf5bce23bb32e430a8893de26ea722241b7b36458fbc708090cad2c60e02b2373325f31ee5f4d2ad2f5d4a2ef3eb647a4722f909e9b1da407968db9d729b8090cad2c60e02aef0e70cb2ccbebaf39c70624d67379f96495f4ae2b1ee0fb5650e74509610618090cad2c60e0232d8060fa9433b1ee4d60a873f250e0bc77725a8f7a5f61420fa49dd456761a58090cad2c60e028d564e83870b47f10786ff768db20bfe52908056a560d01b7e046232b4eedc8a8090cad2c60e02ebc8252e6171af4056387996808bd6d1bf156fff572653f8792d801e4c5d34178090cad2c60e0206586b41928422cd0e49862c48226bda9f7e6a9067b61e202febad0f6f4dd8c48090cad2c60e02eb6ccb1b2fd985e53ca10fe743c4f6ed0b766d4f9002c71ec0beeb6858
// mainet 1623891
blks.emplace_back("0111010101010201010805626c6f636b0aa90807078797deda059e1bda65068628715a9c2556f45891ce682d077dae6fcd26527e51bef9d0183b40960000028f8f6301ffd38e6301bfd1b081b67c025a309dbfe80db1aa4dec3bf2313050e2ec2fc60fc891fe60f2683057352c726d2b01cad801c62f491c03fcc96a73c3b873d17dc68a7ce370e19454120fce6614d629020800000023ddc22300000dfa620ca2bc732ae5b39f132d0f8f15ad49cf343c642a4963fe1ad740e4af4e8c4bc857c6537acf19c0ca95ede37dc8112a56321c09b959428ebbc936c42e895591d41da76776b747e6a8ff57b66c3db0e201b738302c804a9f1c356abd6ed85356d21e01c5c587f4db56abeacc682fdc3674840e40a83dcfd6eed7cff245d622669226a60434c338c2fba34369a0e77a962998aec007bf0e95f3ffd892d9d36bf2217e152913ba6ce4de2769d9b7fc3005f2bb0d9aef896a4c0605e82816f204e91d990f54e08c2fdfe60337bc028ed8cd9361ae7de6942ee45aea8ac3bd88ca5685683b835728deece0cedf44096d8e1cabe34fd68648e21ba2e6485697d4adc03fdde04f5f70da257f4f493311e6d078258d11743cd956aec12f9a418548cde296d2081184b201aad7d427a5ea6106f768563c85a6aed723b47a3eaa0bc36ab7753da914ddedb7182d399671ef0a7f1d735d43b912283af24720cc6d7bef00f26846359acf852e7f297c60cac1caa5242807131b595877f94ed8c396b0482f4e1755e7cfb4a7b4ce2a6a551eb0713aaf101b021511e0f4136c47d19d97927f037478738a34b1ce020001020007baec06fce929d0acc501b58d07e69c2192d24eba9927156085d0ec0f5d76d004764a1a40eb9f1775bd8caaa20a001f88dbbbe052ae28020002d74e11a13147adb89b54b7c30937999d3e2a366d232e15b9115eb725642d27190002767037f03c115bd083cd90ac46d3bddb55367e95a65bec0db7b453679872c3964401293b75f091e7105444c35adeecff1b39a314fb59a5f6905bce93c4dec29b7754022100a6001087a0e351a7868af454589cac42bec2ebc5a048151bc3e15e107d2c56f8018090dfc04a63805442d73d138d7c01576848b3e98c61e93fbdf122e2fcbebde33413060303fd6ce5b8dcb4886601c3f1fa2608cb35870598339cf327688188a7f0b04a1608b255d3c84504e216431808874e56c08087a0f2f936c372f4c792d7e5ebac9e0cf9ee0f2710bd354c36bce77be12f3ae2644dd48caca3672fc96a4bbc96c60f023e243b53b71d0734449f107983580c066b14088493cc30683108ce060a0e842336df5ade520bbcb244e604bf49342fb554e891ccfc3957fd530dcd9d4f42b9d3bb31462ccbfc3af1bb7a89ea8ee6686c043534220f7beca8591183a9c855610f721678d803aa7c3fd4fa0689fb310b15c89fd8cc80eec1a1b8a427953477f2018e98a8ee10a93a0589bb5c0e0aad1a8116581a2772511cf75e83747d8d3a3e04d874db2a61f0b9a745cb4b8c1915645438a6cd8d51511fc5426a05c8dfa6240013896629e4bd859e809c7d93034efbceb7e33337f3cc4b86319e7832e7259403321561e10473916a21dc4478c707618792251f916e13b8325ba5fbcab1b1850cb7d186d5db7f8d3badee76211e8a0a4825a857d18046449da13b3c25f5cba70e407cf97364418d4e00442c7a9cd2432b1de31d3df0bd15b2f41bd2499315a30048a346ec9ee504bb261875fed44459bfdbf0bb2122ffbe720da2587b4631b5047a71e2e0e4753728153b6409b818808605aba30b9b3acb9bb0a83b20815a30056035b553f697dffa8e7af71c74595f3479e2df7309bb63dd4619ad8e7ad26e085e5002da618c985bd18fd1af99ac7b874d810298ac129555cadcc39f764ed00c1b76ea450920682a238916dcbb91112b157699c1a70c875f767e48e1ac8feb0e07c9c0b0ace71c8a02eb8106ca5f3ff5ed12cede2aa17a0ab74e9d90409c05081b2879015e58395ee3efaac20b490cb293f95e2989cbbe70dc463809cb40c80f37e2f123e44bf723cf54f8f11e03bc7b021f6aec4bfff4e24a9469f43ee5f70624a39bde58d98499cdac59c98637142b063bd410251691679940de208e13f1021d7a47e72eb389e798676ae0e651962669ed680d1620e63f6e2f83aa0c6e89033aa31409b5525d565b439899d9b8caa6a0a126ba70ef0bcfad39030e8d59a0030f63e80ed64fa2e2776abc3c2082262831eddb034e5c2f039f7d404b3b321e0a96640412c7dc609ca6c3ae8e3b9decc9083f9e005ce941ae691a2993ee8d5e0989329f3c8e1636dbf0ca1178570064693dbeb4c23f37df77e16f1adfacb59901594a671d85520f6709d758fc743aa15080ac31af58fa70aae241bb90f7b40d08ad4b9a8ebe95a5fad34051019835fb0e4bbfe0c43a6da84dce777d0a0ac9740ae5f867cba2d44588e1340dee387712637a7110b0569565893318124c610bc9000af49f7a44229318651663a220ee0b67ac3bc32fcbfcc0e07b989257fda281015a5e83af642c35b5bbb6934fd989592a4dbca30e7ed9fa5dca17acd01d58860fb445b658344e89643a7da8d39b6bf3c2e1e73fa2062bfb6036ea948a4c316208d6097bebe5d66b7bded70a3ad79803ae5c84a40526c6c1effd5228770a52a2021a39c95a03ee1a25c8533b185f172c0e48939ee67516e5a3029eda3a0564270e258ed3becf42a87790d52fb1799b2c9dadeb9bce32c1a863c439cbd087c9450f3ad358c15f291a4eae412221a33bf1cab1aa5a6dc9ca6ef664f284a170e7790288ba0fb5d609782d3a2e1413a49aec2133aa048fc5e083b334aa8d52723abe03941ef4
// mainet 1633437
blks.emplace_back("0111010101010201010805626c6f636b0a2903070798aea4db05548dbf01085c8074a40d45bd05ceba446524fce07ef832fb7ab38b7e1cc4bc14cb44010002d9d96301ff9dd96301bcd8ce83cc7702d66fc9470dc842bbcc84535fea59497179d3d92bd877ec897d39fe95d569bae82b01a19f417687104b997dc649e2396a5fec3dbd308c452d64e81ebcd18e90ac50b70208000000c7330800000002f86e0cac2aae2e678c934788863a84894c89436d222d1fedcbb7ac4caf884986f41be175f057f4c70ca638a5b04cb79e26610b744ef501e458a0719a267bc5ba037478738a0831e9020004020007fcd0eb0186c166f4f134fd8701b7e902d1c7119e59c664feeefb69e0287b766d8182fef756b44eb7f9682aedd98fe6e3460e5b0d9702000789ec32daa678f08c2ba7930c86b5ba01c604882cb8d44b86001bb29f2bc6d347d155d3d46ff2b24cc575a37ba116db334231cda9020007adeacb01c0d9a5018ef82a8b1cce01a519ea0d5e5b5c6f7daf44a29ad3ae0fa8f428b808ba0c435d0400ccfe71014ea1352653020007ff8eac02ca853a93ad1f8a4086f70184d014aa52086fbee47c1180f81a71e39777234601e29431a93783326822d9a87338cd25ab02000228a56e9ec17a43d4b6866909cf18f36a555525422292c6c74313a6c5720ad6b80002e05251f1fc99624a3d5c5da0158457d3b3f9c65be77299843768e2f8a9f3911421015e67be733f86b3f0a1bb91ebc6313e47a5ca0dd4771b978b40dc54c801cfd31102d0b7b09609fb882fc197495942bd4f6e2b436825aa0066c58b633570e7374d050c2e42b64baa8b394acb8628ebb886ede50d5b0a28de7997b317928eab0af4307233861bda23f39f63dcf30ea5c878c3429e304f28c52d01f6f2b4b831b5afcf983299f22b32f33d670adb440bb3bb742a7e2686e8350eb34a5fd4477e0ae7869f7ac4d1ba49b3526b9a1f7cee55c70eff1b367a2c88781be2145f01dd11bd2b909ee0aa0ff3c0df891b69d4943edcab78be3f1213b0007fc1241912971b4e4980e14ab30bd9830bae5bbd9b6a3bf602e11c8d7104ae89dd2f6b79ce094c594574ee3c6a0d42884c9f868547e2bf4e9adcc0e8d4dce29e730a89b4b9a763b3ad322ef293014c77a07f308f0714d7fd9b23f49132c2f82258a9fe1217aa584d0126e5372bedf8343d25576372b49347519de1f561dafb8d3ed92304175e4b0839066eb9d60bb28c97673efa3fda283169f1cb81b7738d6c8fd074ce81bf239128ce783abd0e8278cf30d2cb857de82d34492931c9ba32ae9e25f30730b241f118ac04fdcc023be016596fd295f6771d672d66e2eb10f13ef32ad2c8fc20f32453f69c2d2d03fb6371844adce8f8781be1ab80d972a36056f7248cdd201ba3197a3f8db4b80a887aa9637f0cfd16ebd55a4a76a31872a717e170f90e93f2e9f2777924ac6505f3db13fbeedc7442e5303392ba0ddc39f289677e01ab27e57510cfd7f3a9450e29ddf194ea39a01d73d2f02a351f419468c7839f8e7b14a3f9a4cd50ace2ec0bbb52ddc8d9c561486c97619cf39cbf045f0be7a1c740426672992d3ad338bc04315959a8d788659df3fbe82782fdbb30136f104f5b71de8107b7ab6cb608650aead02fb83962cd9be9ecd8c98c3e473e6d694d4ec750d16f5c28203b8f094101a889a9ac34929c5c6fc6803e19863c166a75daaa7b3aeaddc1df854e77c3cf055cb813c55e0b7ac75cc6ef601fc152f85d03a582d3b4796b880d1369d7df0c09c920c15f828ab755409c23010c1eac5837d22921e2975f5be24abdc279d7ab0128f3cd6f49ccb1ecaa054b43666fc7e13888bd4fe19466fc53155821c776a209f33d9116c2153188283409d598da4a698da2d2374ff17bbe4c5a30fc5c6aa706b64a3842269c4f755a693b8edf7bf102d7c1f27ee8ee7baa9c4ef412684e6802b5c79d489c2670e19882447f78437550b44ec378f2709b7defab6b7ed0f5fd0cd5ddf26a5a88e9a30ef1e5cd8e9fa3022acddf5ec1498e6176eea5ae3869cc0800a3dc0219056967e974d7b5efcda201dfb9aea93a50b0b6be25c26f5d85590f86969984607c5590925e393cecdd5e387652d948b5f9dc8c9cf6c1e18fcd0f0830da8cdc227b42bcb4aedb3c4ac346b75e6ea78d6d70fc4af89c66013ce8f30b2b693a5851e33be77274bd613b35761cd0167b2e256a63028c385a9d1bd3690b12d6445857129a8e1c9748d5e4455622d9f9c1d39d0b1a15ab1f94c8b115a8030166482fc756de98c4082c37286747ff9a9c1974e033f34c14250c5f5ddb3f0696ff8ca06a6d2dca5f19ea2bc247083ea691ba6b6b0041be37d81ad8a9d7c00f9d840944caa8c0b70f6b137a929173356e1ca1c1e64070b317bd70ce2019b80830044c6992d0065495b9d2165085d42c2cd33d4a54caea22a8c6b46f1f6600068a812559dd7f9cc0b3c056b3c7dc2f8dd6cf184f6754755ec35c78925e736c0c38ab63b35f53efc46f2ca6a55de076dc1c4892d9ba69649e18fe53518657f50e670586ad558803561d0a48620d20f5f6967bbda6390bbda86e82273caea9fc08ccc04ebe7a2ca6006bdb7bf2155b26f8355eaf84f72b15a6042565cd6ac2fc09b667b9ad3882372c4fafe826549c80119a2b92ba7f4a4d24cc60d1afb08e8d0944c14ea11dc130f3f4a37a1990365f4fd2ee6669f113f6ee600a1c0b7936190a3aeb916a64e906479b3fd7ffe9381bdfd1a42b5849dec5874bef4373bae8130fa97ce07c22fe7e37528702df1685297c619766696c89c496ae85bb6f1b518c033a74cac0c171198d30024bd85c4f734db4028cbc38247b87d0e96e1c1054a80d65d3c4
// mainet
//blks.emplace_back("");
return blks;
}
TEST_P(BCSTATUS_TEST, InitTxsDataVector )
{
// complete blocks string as hex
vector<string> cblks_str = get_blocks_hex();
vector<block_complete_entry> cblks;
ASSERT_TRUE(xmreg::hex_to_complete_block(cblks_str, cblks));
vector<block> blocks;
vector<transaction> txs_to_return;
ASSERT_TRUE(xmreg::blocks_and_txs_from_complete_blocks(
cblks, blocks, txs_to_return));
crypto::hash expected_first_hash
= get_transaction_hash(blocks.front().miner_tx);
crypto::hash expected_last_hash
= blocks.back().tx_hashes.back();
vector<crypto::hash> txs_to_get;
vector<xmreg::CurrentBlockchainStatus::txs_tuple_t> txs_data;
bcs->init_txs_data_vector(blocks, txs_to_get, txs_data);
EXPECT_EQ(txs_to_get.size(), txs_to_return.size());
EXPECT_EQ(txs_to_get.front(), expected_first_hash);
EXPECT_EQ(txs_to_get.back(), expected_last_hash);
}
TEST_P(BCSTATUS_TEST, GetTxsInBlocks)
{
// complete blocks string as hex
vector<string> cblks_str = get_blocks_hex();
vector<block_complete_entry> cblks;
ASSERT_TRUE(xmreg::hex_to_complete_block(cblks_str, cblks));
vector<block> blocks;
vector<transaction> txs_to_return;
ASSERT_TRUE(xmreg::blocks_and_txs_from_complete_blocks(
cblks, blocks, txs_to_return));
crypto::hash expected_first_hash
= get_transaction_hash(blocks.front().miner_tx);
crypto::hash expected_last_hash
= blocks.back().tx_hashes.back();
vector<crypto::hash> missed_txs;
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(DoAll(SetArgReferee<1>(txs_to_return),
SetArgReferee<2>(missed_txs),
Return(true)));
vector<crypto::hash> txs_hashes;
vector<transaction> txs;
vector<xmreg::CurrentBlockchainStatus::txs_tuple_t> txs_data;
EXPECT_TRUE(bcs->get_txs_in_blocks(blocks, txs_hashes, txs, txs_data));
EXPECT_EQ(txs, txs_to_return);
EXPECT_EQ(txs_hashes.front(), expected_first_hash);
EXPECT_EQ(txs_hashes.back(), expected_last_hash);
EXPECT_EQ(is_coinbase(txs.front()), true);
// now if there are some missing txs
// some missing tx hash
missed_txs.push_back(crypto::rand<crypto::hash>());
missed_txs.push_back(crypto::rand<crypto::hash>());
EXPECT_CALL(*mcore_ptr, get_transactions(_, _, _))
.WillOnce(DoAll(SetArgReferee<1>(txs_to_return),
SetArgReferee<2>(missed_txs),
Return(true)));
EXPECT_FALSE(bcs->get_txs_in_blocks(blocks, txs_hashes,
txs, txs_data));
}
TEST_P(BCSTATUS_TEST, MonitorBlockchain)
{
uint64_t mock_current_height {1619148};
EXPECT_CALL(*mcore_ptr, get_current_blockchain_height())
.WillRepeatedly(Return(mock_current_height));
// stagenet tx: 4b40cfb2fdce2cd57a834a380901d55d70aba29dad13ac6c4dc82a895f439ecf
const string tx_4b40_hex {"0200010200089832f68b01b2a601a21ec01da83ffe0139a71678019703665175d1e067d20c738a8634aeaad6a7bc493a4b5a641b4962fa020002fb1d79f31791c9553c6dc1c066cde2361385021a5c33e7101d69a557cc3c34a1000292b1073ac7c2fdd851955e7fb76cbc7de4e812db745b5e795445594ea1c7d2a721010a9e82db48149442ac50cff52a39fda95f90b9683098b02e413a52b4d1f05f1c0180f3a3f93aaac0d8887ce542c01e49afbaf1f5ac8e1e4c8882011dd83fa33d1c9efa5f210d39e17c153a6a5825da329dcb31cd1acae98961d55038fb22e78fb93b95e6820a6904ff5b7bbfcf0cd1f6b9e9dd56f41062c7f5f43d9e1b3d69724eeca4bc3404a41ff0669f7f8ae725da8bbc2f8d0411605d2c3e959e3099414ffce1654418020d6ee74bb25042045e955b966e060a9f65b9cfccfbdcb4ee3101019a51f3a41372414c90383c9b84fb4ac690047ea67d70c917192abeb1fdf6c618aeafc732ae9a3e6c6f7fb274240ca04d24035a1d55b3fd1060dc3f4e64f9816868f36d2a0aeb76b64169bc9525d7d70b077c8b998b1204c6108e2917af893b0de24f4adb043eee433b096db8ef730de6e339a84f966b80b239821f350e2a8b10817fc19508da4f82bcb90fcf84cd47929ab1ba90bde5d252767736a4b23d26063cc6b2120dc636b2d4e3e7b3f6d7448882e01c10cf7bdd2117710dc49a59b49cf99212800093da22a6ab5bf693a80d4a662f35259f088a91a26ac261980c537238daa7a40477871f7481973edbcc86fa4885a4061d5c889d0986b4c0cb394165d4039081069f61cff822c7a227474d1609dbf05909f738803834b9e1b5ee68dcb825fcd906d880684e5fa684c8cb02495530fcaeeb35a405345f352ef3c8cf276c096d4303ee14cc0a48533afd1bcdf32dcfb25db4c45a19b10926dff72ace2c2a1d0759090acff99ad06e3f81c4d759a9f74d47fff9cb61d3784aa0eb57a250eec8d14800b85026f5b112740e2e8c257541bdfa4ea1f166b9d930e9705fa1d3f3c2be1e0fb242394d9230c7c457fc8422a6f919a06df5c52d954fa1bfdb57a0a2778d35020ef07490fc3c4f6e99ceaef97fcb3da049898944f3291b96a4f9ce491654340414565db2e0c6bd13eab933194b32336c09c478689cc4a7160b63ecb59937b2028e1649744c6ea69db01aed72fb8b39519cb28d764f158789cc539e01fd5f8f098597c8977e6d2b22c37b289c95dca13bece9e28f741ae2384ead8f0d6df7c30f311210523cb0b7e8c1173aee311362282f3c7d06ae2153969d073bec14ff3605d193bfe829e110df39b894fc4a8eb462d357098688748d579c85f9dc9e9cd20229c9865bc54ae8338433247c28875249e37d4d9b9ccbad611ce5948f1c7ea00fccdc41a9fbe942539a44111f160c9b1dc2653ecae0e4c30bada58d9164fa4c021b60fc0e2068510ef8ec56f7c8e036f2eb31ae0871c9a6aff7b8ad6a86054a06daf06393871f41859f51165f09d22fedd8a2326099a803491dbff5027f72540ed6981f505d1162d86c1ec716758bfbf4e1bfdbbe628b9340942a328209c86b0ec71981c90b407b146cbf065cfd8b0a1c2528aaf007c505a83779dacf8cb7500577a1f8f4a2c9a833d08b254c0c5edbbe87c9eaf266627d23bf518373dceba4099c13c6c468b99c16d56ea5eec12620867fdeb01be66bb0248a7ab7dd6434aa042392c4482e8694292bfc638f1a344d35c9cbfe121a25d2302db4db9688285905fcef9a892593840fe2ddebf0e059e341b2e7f107ee6a19fe386e3f9ea0da2801c5e9fe1b9c4b21155f6f2194ef36f2383097f9cf7ee0994873cfd92d098a33006547ef67bbeb2c1386fcbeec6f0b974532f2ac6e474b26683a37ed3919ec3108b578d3a552c32a362c0bea8bfe35c481f014721af9503a0663d95f5aa91b8802c32f60dbaa65978ad114a2fd45901a07fb4dded61d19e30c8c11e4efbdc1180a02d08d05a646bd8a4d160203da8d490ae0a0b4e631280401d635eb78e0416408c208436dcd653c11a75f365e2d012e0e69f0d4fe2fb2997726dad29468109001ed7c65464ba734e4b35f2ac85a4437fcafe0cdb6128e634970ba420e2e3296080636520e9fbf453e07cdd215117a2eeffed5a0ea0003761f5eb4c35aebf87b063f59d0571e149dc9d0c143a59415a7fe950d34b5024087145969abdc7f7140079bc25119825dda1bf080150bd40142d9635fd87e5dc691899d2686ccf6c9d106c7cdbf783fbbc83fc0feebe8abee3b458e7417a385215f1f89a2a89bef3b870c7a30a6cf4920ddd6eb50439c95c1f38fec867a41e628415ed142b7014991fd0818e8cf725b7075498e773790ccc882db0eb22453f0c9931debfb8d3adb09370f30e62b5fe94ffa7e55ff053488ad48f6e244ed6f043fae8f2225a024800c690ce15dd8017457d23c834b276d079d4a141f22db8fed4ea8f1e378fb741a2da30c09abc817ef0ad589428f966b8bdf92fb32fefa67f425ef1c58a2d4c881e8cc0156519256b87736ed84691b585687971c01a23da37ab76726602a01e771d9820add53f62168d51c7ec12ede030b61155f12e7c8d5573985a9e0884bcc41e0b50aa066b3337f2ab8e3b1031a1c843700413ef03d3734536547fc636055f5d15b0f804b3d25f90e4aaf199ee666d90199d0781526bb2040144b5a638411c1067d0bc5e3ef1911c5223fb0f5d0ce6387702b6957f9466b1a8be6879b8c7190ec1e0662cda6005a363f5d3d4585e6d9d15349be797353179b0a713b925dddfbd05609430601339bf31226cce63c763d887364aa6f1d640892f2a074338b741b7c3303e62c6fc16f544ceeed251dba
std::string tx_blob;
ASSERT_TRUE(xmreg::hex_to_tx_blob(tx_4b40_hex, tx_blob));
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(_, _))
.WillRepeatedly(DoAll(
SetArgReferee<0>(mempool_txs_to_return),
Return(true)));
// set refresh rate to 1 second as we dont wont to wait long
xmreg::BlockchainSetup bs = bcs->get_bc_setup();
bs.refresh_block_status_every = 1s;
bcs->set_bc_setup(bs);
bcs->is_running = false;
auto thread_function = std::bind(
&xmreg::CurrentBlockchainStatus::monitor_blockchain,
bcs.get());
{
xmreg::ThreadRAII blockchain_monitoring_thread(
std::thread(thread_function),
xmreg::ThreadRAII::DtorAction::join);
// wait few seconds so that several loops are done
std::this_thread::sleep_for(4s);
bcs->stop_blockchain_monitor_loop = true;
}
while(bcs->is_running)
{
cout << "Waiting for blockchain_monitoring_thread to stop"
<< endl;
std::this_thread::sleep_for(1s);
}
EXPECT_EQ(bcs->get_mempool_txs().size(), 1);
}
INSTANTIATE_TEST_CASE_P(
DifferentMoneroNetworks, BCSTATUS_TEST,
::testing::Values(
network_type::MAINNET,
network_type::TESTNET,
network_type::STAGENET));
6 years ago
}