Electroneum
Electroneum::PendingTransactionImpl Class Reference

#include <pending_transaction.h>

Inheritance diagram for Electroneum::PendingTransactionImpl:
Collaboration diagram for Electroneum::PendingTransactionImpl:

Public Member Functions

 PendingTransactionImpl (WalletImpl &wallet)
 
 ~PendingTransactionImpl ()
 
int status () const override
 
std::string errorString () const override
 
bool commit (const std::string &filename="", bool overwrite=false) override
 
uint64_t amount () const override
 
uint64_t dust () const override
 
uint64_t fee () const override
 
std::vector< std::string > txid () const override
 
uint64_t txCount () const override
 txCount - number of transactions current transaction will be splitted to More...
 
std::vector< uint32_tsubaddrAccount () const override
 
std::vector< std::set< uint32_t > > subaddrIndices () const override
 
std::string multisigSignData () override
 multisigSignData More...
 
void signMultisigTx () override
 
std::vector< std::string > signersKeys () const override
 signersKeys More...
 
- Public Member Functions inherited from Electroneum::PendingTransaction
virtual ~PendingTransaction ()=0
 

Friends

class WalletImpl
 

Additional Inherited Members

- Public Types inherited from Electroneum::PendingTransaction
enum  Status { Status_Ok, Status_Error, Status_Critical }
 
enum  Priority {
  Priority_Default = 0, Priority_Low = 1, Priority_Medium = 2, Priority_High = 3,
  Priority_Last
}
 

Detailed Description

Definition at line 42 of file pending_transaction.h.

Constructor & Destructor Documentation

◆ PendingTransactionImpl()

Electroneum::PendingTransactionImpl::PendingTransactionImpl ( WalletImpl wallet)

Definition at line 52 of file pending_transaction.cpp.

53  : m_wallet(wallet)
54 {
55  m_status = Status_Ok;
56 }

◆ ~PendingTransactionImpl()

Electroneum::PendingTransactionImpl::~PendingTransactionImpl ( )

Definition at line 58 of file pending_transaction.cpp.

59 {
60 
61 }

Member Function Documentation

◆ amount()

uint64_t Electroneum::PendingTransactionImpl::amount ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 165 of file pending_transaction.cpp.

166 {
167  uint64_t result = 0;
168  for (const auto &ptx : m_pending_tx) {
169  for (const auto &dest : ptx.dests) {
170  result += dest.amount;
171  }
172  }
173  return result;
174 }
CXA_THROW_INFO_T void(* dest)(void *))
Definition: stack_trace.cpp:91
unsigned __int64 uint64_t
Definition: stdint.h:136

◆ commit()

bool Electroneum::PendingTransactionImpl::commit ( const std::string &  filename = "",
bool  overwrite = false 
)
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 81 of file pending_transaction.cpp.

82 {
83 
84  LOG_PRINT_L3("m_pending_tx size: " << m_pending_tx.size());
85 
86  try {
87  // Save tx to file
88  if (!filename.empty()) {
89  boost::system::error_code ignore;
90  bool tx_file_exists = boost::filesystem::exists(filename, ignore);
91  if(tx_file_exists && !overwrite){
92  m_errorString = string(tr("Attempting to save transaction to file, but specified file(s) exist. Exiting to not risk overwriting. File:")) + filename;
93  m_status = Status_Error;
94  LOG_ERROR(m_errorString);
95  return false;
96  }
97  bool r = m_wallet.m_wallet->save_tx(m_pending_tx, filename);
98  if (!r) {
99  m_errorString = tr("Failed to write transaction(s) to file");
100  m_status = Status_Error;
101  } else {
102  m_status = Status_Ok;
103  }
104  }
105  // Commit tx
106  else {
107  auto multisigState = m_wallet.multisig();
108  if (multisigState.isMultisig && m_signers.size() < multisigState.threshold) {
109  throw runtime_error("Not enough signers to send multisig transaction");
110  }
111 
112  m_wallet.pauseRefresh();
113 
114  const bool tx_cold_signed = m_wallet.m_wallet->get_account().get_device().has_tx_cold_sign();
115  if (tx_cold_signed){
116  std::unordered_set<size_t> selected_transfers;
117  for(const tools::wallet2::pending_tx & ptx : m_pending_tx){
118  for(size_t s : ptx.selected_transfers){
119  selected_transfers.insert(s);
120  }
121  }
122 
123  m_wallet.m_wallet->cold_tx_aux_import(m_pending_tx, m_tx_device_aux);
124  bool r = m_wallet.m_wallet->import_key_images(m_key_images, 0, selected_transfers);
125  if (!r){
126  throw runtime_error("Cold sign transaction submit failed - key image sync fail");
127  }
128  }
129 
130  while (!m_pending_tx.empty()) {
131  auto & ptx = m_pending_tx.back();
132  m_wallet.m_wallet->commit_tx(ptx);
133  // if no exception, remove element from vector
134  m_pending_tx.pop_back();
135  } // TODO: extract method;
136  }
137  } catch (const tools::error::daemon_busy&) {
138  // TODO: make it translatable with "tr"?
139  m_errorString = tr("daemon is busy. Please try again later.");
140  m_status = Status_Error;
141  } catch (const tools::error::no_connection_to_daemon&) {
142  m_errorString = tr("no connection to daemon. Please make sure daemon is running.");
143  m_status = Status_Error;
144  } catch (const tools::error::tx_rejected& e) {
145  std::ostringstream writer(m_errorString);
146  writer << (boost::format(tr("transaction %s was rejected by daemon with status: ")) % get_transaction_hash(e.tx())) << e.status();
147  std::string reason = e.reason();
148  m_status = Status_Error;
149  m_errorString = writer.str();
150  if (!reason.empty())
151  m_errorString += string(tr(". Reason: ")) + reason;
152  } catch (const std::exception &e) {
153  m_errorString = string(tr("Unknown exception: ")) + e.what();
154  m_status = Status_Error;
155  } catch (...) {
156  m_errorString = tr("Unhandled exception");
157  LOG_ERROR(m_errorString);
158  m_status = Status_Error;
159  }
160 
161  m_wallet.startRefresh();
162  return m_status == Status_Ok;
163 }
#define tr(x)
Definition: common_defines.h:4
::std::string string
Definition: gtest-port.h:1097
virtual void startRefresh() override
StartRefresh - Start/resume refresh thread (refresh every 10 seconds)
Definition: wallet.cpp:2140
virtual void pauseRefresh() override
pauseRefresh - pause refresh thread
Definition: wallet.cpp:2161
MultisigState multisig() const override
multisig - returns current state of multisig wallet creation process
Definition: wallet.cpp:1248
#define LOG_PRINT_L3(x)
Definition: misc_log_ex.h:102
const std::string & reason() const
#define LOG_ERROR(x)
Definition: misc_log_ex.h:98
const std::string & status() const
crypto::hash get_transaction_hash(const transaction &t)
const cryptonote::transaction & tx() const
Here is the call graph for this function:

◆ dust()

uint64_t Electroneum::PendingTransactionImpl::dust ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 176 of file pending_transaction.cpp.

177 {
178  uint64_t result = 0;
179  for (const auto & ptx : m_pending_tx) {
180  result += ptx.dust;
181  }
182  return result;
183 }
unsigned __int64 uint64_t
Definition: stdint.h:136

◆ errorString()

string Electroneum::PendingTransactionImpl::errorString ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 68 of file pending_transaction.cpp.

69 {
70  return m_errorString;
71 }

◆ fee()

uint64_t Electroneum::PendingTransactionImpl::fee ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 185 of file pending_transaction.cpp.

186 {
187  uint64_t result = 0;
188  for (const auto &ptx : m_pending_tx) {
189  result += ptx.fee;
190  }
191  return result;
192 }
unsigned __int64 uint64_t
Definition: stdint.h:136

◆ multisigSignData()

std::string Electroneum::PendingTransactionImpl::multisigSignData ( )
overridevirtual

multisigSignData

Returns
encoded multisig transaction with signers' keys. Transfer this data to another wallet participant to sign it. Assumed use case is:
  1. Initiator: auto data = pendingTransaction->multisigSignData();
  2. Signer1: pendingTransaction = wallet->restoreMultisigTransaction(data); pendingTransaction->signMultisigTx(); auto signed = pendingTransaction->multisigSignData();
  3. Signer2: pendingTransaction = wallet->restoreMultisigTransaction(signed); pendingTransaction->signMultisigTx(); pendingTransaction->commit();

Implements Electroneum::PendingTransaction.

Definition at line 215 of file pending_transaction.cpp.

215  {
216  try {
217  if (!m_wallet.multisig().isMultisig) {
218  throw std::runtime_error("wallet is not multisig");
219  }
220 
222  txSet.m_ptx = m_pending_tx;
223  txSet.m_signers = m_signers;
224  auto cipher = m_wallet.m_wallet->save_multisig_tx(txSet);
225 
227  } catch (const std::exception& e) {
228  m_status = Status_Error;
229  m_errorString = std::string(tr("Couldn't multisig sign data: ")) + e.what();
230  }
231 
232  return std::string();
233 }
#define tr(x)
Definition: common_defines.h:4
::std::string string
Definition: gtest-port.h:1097
std::unordered_set< crypto::public_key > m_signers
Definition: wallet2.h:513
MultisigState multisig() const override
multisig - returns current state of multisig wallet creation process
Definition: wallet.cpp:1248
std::string buff_to_hex_nodelimer(const std::string &src)
Definition: string_tools.h:87
std::vector< pending_tx > m_ptx
Definition: wallet2.h:512
Here is the call graph for this function:

◆ signersKeys()

std::vector< std::string > Electroneum::PendingTransactionImpl::signersKeys ( ) const
overridevirtual

signersKeys

Returns
vector of base58-encoded signers' public keys

Implements Electroneum::PendingTransaction.

Definition at line 255 of file pending_transaction.cpp.

255  {
256  std::vector<std::string> keys;
257  keys.reserve(m_signers.size());
258 
259  for (const auto& signer: m_signers) {
261  }
262 
263  return keys;
264 }
std::string encode(const std::string &data)
Definition: base58.cpp:173
bool t_serializable_object_to_blob(const t_object &to, blobdata &b_blob)
Here is the call graph for this function:

◆ signMultisigTx()

void Electroneum::PendingTransactionImpl::signMultisigTx ( )
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 235 of file pending_transaction.cpp.

235  {
236  try {
237  std::vector<crypto::hash> ignore;
238 
240  txSet.m_ptx = m_pending_tx;
241  txSet.m_signers = m_signers;
242 
243  if (!m_wallet.m_wallet->sign_multisig_tx(txSet, ignore)) {
244  throw std::runtime_error("couldn't sign multisig transaction");
245  }
246 
247  std::swap(m_pending_tx, txSet.m_ptx);
248  std::swap(m_signers, txSet.m_signers);
249  } catch (const std::exception& e) {
250  m_status = Status_Error;
251  m_errorString = std::string(tr("Couldn't sign multisig transaction: ")) + e.what();
252  }
253 }
#define tr(x)
Definition: common_defines.h:4
::std::string string
Definition: gtest-port.h:1097
std::unordered_set< crypto::public_key > m_signers
Definition: wallet2.h:513
std::vector< pending_tx > m_ptx
Definition: wallet2.h:512

◆ status()

int Electroneum::PendingTransactionImpl::status ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 63 of file pending_transaction.cpp.

64 {
65  return m_status;
66 }

◆ subaddrAccount()

std::vector< uint32_t > Electroneum::PendingTransactionImpl::subaddrAccount ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 199 of file pending_transaction.cpp.

200 {
201  std::vector<uint32_t> result;
202  for (const auto& ptx : m_pending_tx)
203  result.push_back(ptx.construction_data.subaddr_account);
204  return result;
205 }

◆ subaddrIndices()

std::vector< std::set< uint32_t > > Electroneum::PendingTransactionImpl::subaddrIndices ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 207 of file pending_transaction.cpp.

208 {
209  std::vector<std::set<uint32_t>> result;
210  for (const auto& ptx : m_pending_tx)
211  result.push_back(ptx.construction_data.subaddr_indices);
212  return result;
213 }

◆ txCount()

uint64_t Electroneum::PendingTransactionImpl::txCount ( ) const
overridevirtual

txCount - number of transactions current transaction will be splitted to

Returns

Implements Electroneum::PendingTransaction.

Definition at line 194 of file pending_transaction.cpp.

195 {
196  return m_pending_tx.size();
197 }

◆ txid()

std::vector< std::string > Electroneum::PendingTransactionImpl::txid ( ) const
overridevirtual

Implements Electroneum::PendingTransaction.

Definition at line 73 of file pending_transaction.cpp.

74 {
75  std::vector<std::string> txid;
76  for (const auto &pt: m_pending_tx)
78  return txid;
79 }
std::string pod_to_hex(const t_pod_type &s)
Definition: string_tools.h:317
crypto::hash get_transaction_hash(const transaction &t)
std::vector< std::string > txid() const override
Here is the call graph for this function:

Friends And Related Function Documentation

◆ WalletImpl

friend class WalletImpl
friend

Definition at line 64 of file pending_transaction.h.


The documentation for this class was generated from the following files: