1009{
1010
1014
1015 tools::wallet2::unsigned_tx_set txs;
1016 std::vector<cryptonote::transaction> tx_list;
1017
1018 for(auto &ptx : ptxs) {
1019 txs.
txes.push_back(get_construction_data_with_decrypted_short_payment_id(ptx, *
m_trezor));
1020 }
1022
1023 auto dev_cold =
dynamic_cast<::hw::device_cold*
>(
m_trezor);
1025
1026 tools::wallet2::signed_tx_set exported_txs;
1027 hw::tx_aux_data aux_data;
1029 setup_shim(&wallet_shim);
1032 dev_cold->tx_sign(&wallet_shim, txs, exported_txs, aux_data);
1033
1034 MDEBUG(
"Signed tx data from hw: " << exported_txs.
ptx.size() <<
" transactions");
1036
1037 for (
size_t i = 0; i < exported_txs.
ptx.size(); ++i){
1038 auto &c_ptx = exported_txs.
ptx[i];
1039 c_ptx.tx.rct_signatures.mixRing = ptxs[i].tx.rct_signatures.mixRing;
1040 expand_tsx(c_ptx.tx);
1041
1042
1048
1049 tx_list.push_back(c_ptx.tx);
1051 }
1052
1054
1055
1058
1059 for(
size_t txid = 0; txid < exported_txs.
ptx.size(); ++txid) {
1060 auto &c_ptx = exported_txs.
ptx[txid];
1061 auto &c_tx = c_ptx.tx;
1063 const size_t num_outs = c_tx.vout.size();
1064 size_t num_received = 0;
1068 std::unordered_set<size_t> recv_out_idx;
1069 std::string exp_payment_id = get_payment_id(c_ptx.construction_data.extra);
1070 std::string enc_payment_id = get_payment_id(c_tx.extra);
1071 size_t num_payment_id_checks_done = 0;
1072
1073 CHECK_AND_ASSERT_THROW_MES(exp_payment_id.empty() || exp_payment_id.size() == 8 || exp_payment_id.size() == 32,
"Required payment ID invalid");
1074 CHECK_AND_ASSERT_THROW_MES((exp_payment_id.size() == 32) == (enc_payment_id.size() == 32),
"Required and built payment ID size mismatch");
1076
1077 for(auto &src : c_ptx.construction_data.sources){
1078 cur_sum_in += src.amount;
1079 }
1080
1081 for(auto &dst : c_ptx.construction_data.splitted_dsts){
1082 cur_sum_out += dst.amount;
1083 }
1084
1086
1087 for (size_t widx = 0; widx < wallets.size(); ++widx) {
1088 const bool sender = widx == 0;
1089 tools::wallet2 *wl = wallets[widx];
1090
1092
1096
1097 std::copy_if(m_trans.begin(), m_trans.end(), std::back_inserter(m_trans_txid), [&txhash](const tools::wallet2::transfer_details& item) {
1098 return item.m_txid == txhash;
1099 });
1100
1101
1102 num_received += m_trans_txid.size();
1103 for (auto & ctran : m_trans_txid){
1104 cur_sum_out_recv += ctran.amount();
1105 recv_out_idx.insert(ctran.m_internal_output_index);
1108 }
1109
1110
1111 if (sender) {
1112 std::list<std::pair<crypto::hash, tools::wallet2::confirmed_transfer_details>> confirmed_transfers;
1113 std::list<std::pair<crypto::hash, tools::wallet2::confirmed_transfer_details>> confirmed_transfers_txid;
1115
1116 std::copy_if(confirmed_transfers.begin(), confirmed_transfers.end(), std::back_inserter(confirmed_transfers_txid), [&txhash](const std::pair<crypto::hash, tools::wallet2::confirmed_transfer_details>& item) {
1117 return item.first == txhash;
1118 });
1119
1120 CHECK_AND_ASSERT_THROW_MES(confirmed_transfers_txid.size() == 1,
"Sender does not have outgoing transfer for the transaction");
1121 }
1122
1123
1124 std::list<std::pair<crypto::hash, tools::wallet2::payment_details>> payments;
1125 std::list<std::pair<crypto::hash, tools::wallet2::payment_details>> payments_txid;
1127
1128 std::copy_if(payments.begin(), payments.end(), std::back_inserter(payments_txid), [&txhash](const std::pair<crypto::hash, tools::wallet2::payment_details>& item) {
1129 return item.second.m_tx_hash == txhash;
1130 });
1131
1132 for(auto &paydet : payments_txid){
1133 CHECK_AND_ASSERT_THROW_MES(exp_payment_id.empty() || (memcmp(exp_payment_id.data(), paydet.first.data, exp_payment_id.size()) == 0),
"Payment ID mismatch");
1134 num_payment_id_checks_done += 1;
1135 }
1136 }
1137
1140
1141 if(!is_sweep){
1144 } else {
1147 }
1148
1149 sum_in += cur_sum_in;
1150 sum_out += cur_sum_out + c_tx.rct_signatures.txnFee;
1151 }
1152
1154
1155
1157}
cryptonote::block get_head_block(const std::vector< test_event_entry > &events)
std::string dump_data(const cryptonote::transaction &tx)
virtual void add_transactions_to_events(std::vector< test_event_entry > &events, test_generator &generator, const std::vector< cryptonote::transaction > &txs)
crypto::hash head_hash() const
virtual void test_get_tx(std::vector< test_event_entry > &events, std::vector< tools::wallet2 * > wallets, const std::vector< tools::wallet2::pending_tx > &ptxs, const std::vector< std::string > &aux_tx_info)
cryptonote::block head_block() const
std::vector< std::string > tx_device_aux
boost::optional< int > bp_version
std::vector< cryptonote::address_parse_info > tx_recipients
static tools::wallet2::transfer_container & get_transfers(tools::wallet2 *wallet)
std::string obj_to_json_str(T &obj)
crypto::hash get_transaction_hash(const transaction &t)
struct hw::wallet_shim wallet_shim