Skip to content

Commit af4f97b

Browse files
committed
Merge pull request #8555
e29b2e9 wallet2: ensure imported outputs subaddresses are created (moneromooo-monero) 1d3657a wallet2: better test on whether to allow output import (moneromooo-monero) 0cbf557 allow exporting outputs in chunks (moneromooo-monero) b03d709 wallet2: fixes for export/import output flow (j-berman) 4b7eb57 wallet2: do not assume imported outputs must be non empty (moneromooo-monero) 5b98beb wallet2: prevent importing outputs in a hot wallet (moneromooo-monero) 0de1571 wallet2: fix missing subaddress indices in 'light' exported outputs (moneromooo-monero)
2 parents 89f3d46 + e29b2e9 commit af4f97b

File tree

14 files changed

+453
-82
lines changed

14 files changed

+453
-82
lines changed

src/device_trezor/device_trezor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ namespace trezor {
511511
tools::wallet2::signed_tx_set & signed_tx,
512512
hw::tx_aux_data & aux_data)
513513
{
514-
CHECK_AND_ASSERT_THROW_MES(unsigned_tx.transfers.first == 0, "Unsuported non zero offset");
514+
CHECK_AND_ASSERT_THROW_MES(std::get<0>(unsigned_tx.transfers) == 0, "Unsuported non zero offset");
515515

516516
TREZOR_AUTO_LOCK_CMD();
517517
require_connected();
@@ -522,7 +522,7 @@ namespace trezor {
522522
const size_t num_tx = unsigned_tx.txes.size();
523523
m_num_transations_to_sign = num_tx;
524524
signed_tx.key_images.clear();
525-
signed_tx.key_images.resize(unsigned_tx.transfers.second.size());
525+
signed_tx.key_images.resize(std::get<2>(unsigned_tx.transfers).size());
526526

527527
for(size_t tx_idx = 0; tx_idx < num_tx; ++tx_idx) {
528528
std::shared_ptr<protocol::tx::Signer> signer;
@@ -566,8 +566,8 @@ namespace trezor {
566566
cpend.key_images = key_images;
567567

568568
// KI sync
569-
for(size_t cidx=0, trans_max=unsigned_tx.transfers.second.size(); cidx < trans_max; ++cidx){
570-
signed_tx.key_images[cidx] = unsigned_tx.transfers.second[cidx].m_key_image;
569+
for(size_t cidx=0, trans_max=std::get<2>(unsigned_tx.transfers).size(); cidx < trans_max; ++cidx){
570+
signed_tx.key_images[cidx] = std::get<2>(unsigned_tx.transfers)[cidx].m_key_image;
571571
}
572572

573573
size_t num_sources = cdata.tx_data.sources.size();
@@ -579,9 +579,9 @@ namespace trezor {
579579
CHECK_AND_ASSERT_THROW_MES(src_idx < cdata.tx.vin.size(), "Invalid idx_mapped");
580580

581581
size_t idx_map_src = cdata.tx_data.selected_transfers[idx_mapped];
582-
CHECK_AND_ASSERT_THROW_MES(idx_map_src >= unsigned_tx.transfers.first, "Invalid offset");
582+
CHECK_AND_ASSERT_THROW_MES(idx_map_src >= std::get<0>(unsigned_tx.transfers), "Invalid offset");
583583

584-
idx_map_src -= unsigned_tx.transfers.first;
584+
idx_map_src -= std::get<0>(unsigned_tx.transfers);
585585
CHECK_AND_ASSERT_THROW_MES(idx_map_src < signed_tx.key_images.size(), "Invalid key image index");
586586

587587
const auto vini = boost::get<cryptonote::txin_to_key>(cdata.tx.vin[src_idx]);

src/device_trezor/trezor/protocol.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,8 @@ namespace tx {
230230
}
231231

232232
const tools::wallet2::transfer_details & get_transfer(size_t idx) const {
233-
CHECK_AND_ASSERT_THROW_MES(idx < m_unsigned_tx->transfers.second.size() + m_unsigned_tx->transfers.first && idx >= m_unsigned_tx->transfers.first, "Invalid transfer index");
234-
return m_unsigned_tx->transfers.second[idx - m_unsigned_tx->transfers.first];
233+
CHECK_AND_ASSERT_THROW_MES(idx < std::get<2>(m_unsigned_tx->transfers).size() + std::get<0>(m_unsigned_tx->transfers) && idx >= std::get<0>(m_unsigned_tx->transfers), "Invalid transfer index");
234+
return std::get<2>(m_unsigned_tx->transfers)[idx - std::get<0>(m_unsigned_tx->transfers)];
235235
}
236236

237237
const tools::wallet2::transfer_details & get_source_transfer(size_t idx) const {

src/serialization/tuple.h

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// Copyright (c) 2014-2020, The Monero Project
2+
//
3+
// All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without modification, are
6+
// permitted provided that the following conditions are met:
7+
//
8+
// 1. Redistributions of source code must retain the above copyright notice, this list of
9+
// conditions and the following disclaimer.
10+
//
11+
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
12+
// of conditions and the following disclaimer in the documentation and/or other
13+
// materials provided with the distribution.
14+
//
15+
// 3. Neither the name of the copyright holder nor the names of its contributors may be
16+
// used to endorse or promote products derived from this software without specific
17+
// prior written permission.
18+
//
19+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20+
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21+
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22+
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24+
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26+
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27+
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
//
29+
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30+
31+
#pragma once
32+
#include <memory>
33+
#include "serialization.h"
34+
35+
namespace serialization
36+
{
37+
namespace detail
38+
{
39+
template <typename Archive, class T>
40+
bool serialize_tuple_element(Archive& ar, T& e)
41+
{
42+
return ::do_serialize(ar, e);
43+
}
44+
45+
template <typename Archive>
46+
bool serialize_tuple_element(Archive& ar, uint64_t& e)
47+
{
48+
ar.serialize_varint(e);
49+
return true;
50+
}
51+
}
52+
}
53+
54+
template <template <bool> class Archive, class E0, class E1, class E2>
55+
inline bool do_serialize(Archive<false>& ar, std::tuple<E0,E1,E2>& p)
56+
{
57+
size_t cnt;
58+
ar.begin_array(cnt);
59+
if (!ar.good())
60+
return false;
61+
if (cnt != 3)
62+
return false;
63+
64+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<0>(p)))
65+
return false;
66+
if (!ar.good())
67+
return false;
68+
ar.delimit_array();
69+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<1>(p)))
70+
return false;
71+
if (!ar.good())
72+
return false;
73+
ar.delimit_array();
74+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<2>(p)))
75+
return false;
76+
if (!ar.good())
77+
return false;
78+
79+
ar.end_array();
80+
return true;
81+
}
82+
83+
template <template <bool> class Archive, class E0, class E1, class E2>
84+
inline bool do_serialize(Archive<true>& ar, std::tuple<E0,E1,E2>& p)
85+
{
86+
ar.begin_array(3);
87+
if (!ar.good())
88+
return false;
89+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<0>(p)))
90+
return false;
91+
if (!ar.good())
92+
return false;
93+
ar.delimit_array();
94+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<1>(p)))
95+
return false;
96+
if (!ar.good())
97+
return false;
98+
ar.delimit_array();
99+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<2>(p)))
100+
return false;
101+
if (!ar.good())
102+
return false;
103+
ar.end_array();
104+
return true;
105+
}
106+
107+
template <template <bool> class Archive, class E0, class E1, class E2, class E3>
108+
inline bool do_serialize(Archive<false>& ar, std::tuple<E0,E1,E2,E3>& p)
109+
{
110+
size_t cnt;
111+
ar.begin_array(cnt);
112+
if (!ar.good())
113+
return false;
114+
if (cnt != 4)
115+
return false;
116+
117+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<0>(p)))
118+
return false;
119+
if (!ar.good())
120+
return false;
121+
ar.delimit_array();
122+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<1>(p)))
123+
return false;
124+
if (!ar.good())
125+
return false;
126+
ar.delimit_array();
127+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<2>(p)))
128+
return false;
129+
if (!ar.good())
130+
return false;
131+
ar.delimit_array();
132+
if (!::serialization::detail::serialize_tuple_element(ar, std::get<3>(p)))
133+
return false;
134+
if (!ar.good())
135+
return false;
136+
137+
ar.end_array();
138+
return true;
139+
}
140+
141+
template <template <bool> class Archive, class E0, class E1, class E2, class E3>
142+
inline bool do_serialize(Archive<true>& ar, std::tuple<E0,E1,E2,E3>& p)
143+
{
144+
ar.begin_array(4);
145+
if (!ar.good())
146+
return false;
147+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<0>(p)))
148+
return false;
149+
if (!ar.good())
150+
return false;
151+
ar.delimit_array();
152+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<1>(p)))
153+
return false;
154+
if (!ar.good())
155+
return false;
156+
ar.delimit_array();
157+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<2>(p)))
158+
return false;
159+
if (!ar.good())
160+
return false;
161+
ar.delimit_array();
162+
if(!::serialization::detail::serialize_tuple_element(ar, std::get<3>(p)))
163+
return false;
164+
if (!ar.good())
165+
return false;
166+
ar.end_array();
167+
return true;
168+
}
169+

src/simplewallet/simplewallet.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7912,8 +7912,10 @@ bool simple_wallet::accept_loaded_tx(const std::function<size_t()> get_num_txes,
79127912
bool simple_wallet::accept_loaded_tx(const tools::wallet2::unsigned_tx_set &txs)
79137913
{
79147914
std::string extra_message;
7915-
if (!txs.transfers.second.empty())
7916-
extra_message = (boost::format("%u outputs to import. ") % (unsigned)txs.transfers.second.size()).str();
7915+
if (!std::get<2>(txs.new_transfers).empty())
7916+
extra_message = (boost::format("%u outputs to import. ") % (unsigned)std::get<2>(txs.new_transfers).size()).str();
7917+
else if (!std::get<2>(txs.transfers).empty())
7918+
extra_message = (boost::format("%u outputs to import. ") % (unsigned)std::get<2>(txs.transfers).size()).str();
79177919
return accept_loaded_tx([&txs](){return txs.txes.size();}, [&txs](size_t n)->const tools::wallet2::tx_construction_data&{return txs.txes[n];}, extra_message);
79187920
}
79197921
//----------------------------------------------------------------------------------------------------

src/wallet/api/wallet.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,8 +1146,8 @@ UnsignedTransaction *WalletImpl::loadUnsignedTx(const std::string &unsigned_file
11461146

11471147
// Check tx data and construct confirmation message
11481148
std::string extra_message;
1149-
if (!transaction->m_unsigned_tx_set.transfers.second.empty())
1150-
extra_message = (boost::format("%u outputs to import. ") % (unsigned)transaction->m_unsigned_tx_set.transfers.second.size()).str();
1149+
if (!std::get<2>(transaction->m_unsigned_tx_set.transfers).empty())
1150+
extra_message = (boost::format("%u outputs to import. ") % (unsigned)std::get<2>(transaction->m_unsigned_tx_set.transfers).size()).str();
11511151
transaction->checkLoadedTx([&transaction](){return transaction->m_unsigned_tx_set.txes.size();}, [&transaction](size_t n)->const tools::wallet2::tx_construction_data&{return transaction->m_unsigned_tx_set.txes[n];}, extra_message);
11521152
setStatus(transaction->status(), transaction->errorString());
11531153

0 commit comments

Comments
 (0)