diff --git a/src/currency_core/currency_format_utils_transactions.cpp b/src/currency_core/currency_format_utils_transactions.cpp index e7071e0c..95bb4cdd 100644 --- a/src/currency_core/currency_format_utils_transactions.cpp +++ b/src/currency_core/currency_format_utils_transactions.cpp @@ -397,5 +397,14 @@ namespace currency CATCH_ENTRY2(std::vector{}); } //--------------------------------------------------------------- + bool validate_tx_output_details_againt_tx_generation_context(const transaction& tx, const tx_generation_context& gen_context, const crypto::secret_key& onet_time_key) + { + //TODO: Implement this function before mainnet +#ifdef TESTNET + return true; +#else + return false; +#endif + } } \ No newline at end of file diff --git a/src/currency_core/currency_format_utils_transactions.h b/src/currency_core/currency_format_utils_transactions.h index 30cb7589..2137054b 100644 --- a/src/currency_core/currency_format_utils_transactions.h +++ b/src/currency_core/currency_format_utils_transactions.h @@ -201,7 +201,7 @@ namespace currency bool tx_to_blob(const transaction& b, blobdata& b_blob); bool read_keyimages_from_tx(const transaction& tx, std::list& kil); bool validate_inputs_sorting(const transaction& tx); - bool is_asset_emitting_transaction(const transaction& tx, asset_descriptor_operation* p_ado = nullptr); + bool is_asset_emitting_transaction(const transaction& tx, asset_descriptor_operation* p_ado = nullptr); std::vector prepare_outputs_entries_for_key_offsets(const std::vector& outputs, size_t old_real_index, size_t& new_real_index) noexcept; @@ -313,4 +313,6 @@ namespace currency END_SERIALIZE() }; // struct tx_generation_context + bool validate_tx_output_details_againt_tx_generation_context(const transaction& tx, const tx_generation_context& gen_context, const crypto::secret_key& onet_time_key); + } // namespace currency diff --git a/src/serialization/serialization.h b/src/serialization/serialization.h index 5b5383b1..d2e8d029 100644 --- a/src/serialization/serialization.h +++ b/src/serialization/serialization.h @@ -63,8 +63,8 @@ inline bool do_serialize(Archive &ar, T &v) #define BEGIN_SERIALIZE() \ template class Archive> bool do_serialize(Archive &_ser_ar) {uint8_t s_current_version ATTRIBUTE_UNUSED = 0; uint8_t s_version ATTRIBUTE_UNUSED = 0; #define BEGIN_SERIALIZE_OBJECT() \ - template class Archive> bool do_serialize(Archive &_ser_ar) { _ser_ar.begin_object(); bool _ser_res = do_serialize_object(_ser_ar); _ser_ar.end_object(); return _ser_res; } \ - template class Archive> bool do_serialize_object(Archive &_ser_ar){ + template class Archive> bool do_serialize(Archive &_ser_ar) {_ser_ar.begin_object(); bool _ser_res = do_serialize_object(_ser_ar); _ser_ar.end_object(); return _ser_res; } \ + template class Archive> bool do_serialize_object(Archive &_ser_ar){ uint8_t s_current_version ATTRIBUTE_UNUSED = 0; uint8_t s_version ATTRIBUTE_UNUSED = 0; #define PREPARE_CUSTOM_VECTOR_SERIALIZATION(size, vec) ::serialization::detail::prepare_custom_vector_serialization(size, vec, typename Archive::is_saving()) #define END_SERIALIZE() return true;} diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index d6e49151..1fab53bc 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -4967,7 +4967,7 @@ bool wallet2::check_htlc_redeemed(const crypto::hash& htlc_tx_id, std::string& o return false; } //---------------------------------------------------------------------------------------------------- -bool wallet2::create_ionic_swap_proposal(const wallet_public::ionic_swap_proposal_info& proposal_details, const currency::account_public_address& destination_addr, ionic_swap_proposal& proposal) +bool wallet2::create_ionic_swap_proposal(const wallet_public::ionic_swap_proposal_info& proposal_details, const currency::account_public_address& destination_addr, wallet_public::ionic_swap_proposal& proposal) { std::vector selected_transfers_for_template; @@ -4979,10 +4979,9 @@ bool wallet2::create_ionic_swap_proposal(const wallet_public::ionic_swap_proposa } //---------------------------------------------------------------------------------------------------- bool wallet2::build_ionic_swap_template(const wallet_public::ionic_swap_proposal_info& proposal_detais, const currency::account_public_address& destination_addr, - ionic_swap_proposal& proposal, + wallet_public::ionic_swap_proposal& proposal, std::vector& selected_transfers) { - ionic_swap_proposal& proposal.tx_template; construct_tx_param ctp = get_default_construct_tx_param(); ctp.fake_outputs_count = proposal_detais.mixins; @@ -5020,11 +5019,11 @@ bool wallet2::build_ionic_swap_template(const wallet_public::ionic_swap_proposal selected_transfers = ftp.selected_transfers; currency::finalized_tx finalize_result = AUTO_VAL_INIT(finalize_result); finalize_transaction(ftp, finalize_result, false); - add_transfers_to_expiration_list(selected_transfers, finalize_result, 0, currency::null_hash); + add_transfers_to_expiration_list(selected_transfers, proposal_detais.expiration_time, 0, currency::null_hash); //wrap it all proposal.tx_template = finalize_result.tx; - ionic_swap_proposal_context ispc = AUTO_VAL_INIT(ispc); + wallet_public::ionic_swap_proposal_context ispc = AUTO_VAL_INIT(ispc); ispc.gen_context = finalize_result.ftp.gen_context; ispc.one_time_skey = finalize_result.one_time_key; std::string proposal_context_blob = t_serializable_object_to_blob(ispc); @@ -5035,7 +5034,7 @@ bool wallet2::build_ionic_swap_template(const wallet_public::ionic_swap_proposal bool wallet2::get_ionic_swap_proposal_info(const std::string&raw_proposal, wallet_public::ionic_swap_proposal_info& proposal_info) { wallet_public::ionic_swap_proposal proposal = AUTO_VAL_INIT(proposal); - bool r = t_unserializable_object_from_blob(raw_proposal, proposal); + bool r = t_unserializable_object_from_blob(proposal, raw_proposal); THROW_IF_TRUE_WALLET_EX(!r, error::wallet_internal_error, "Failed to parse proposal"); return get_ionic_swap_proposal_info(proposal, proposal_info); } @@ -5065,6 +5064,8 @@ bool wallet2::get_ionic_swap_proposal_info(const wallet_public::ionic_swap_propo r = t_unserializable_object_from_blob(ionic_context, decrypted_raw_context); THROW_IF_FALSE_WALLET_INT_ERR_EX(r, "Failed to unserialize decrypted ionic_context"); + r = validate_tx_output_details_againt_tx_generation_context(tx, ionic_context.gen_context, ionic_context.one_time_skey); + THROW_IF_FALSE_WALLET_INT_ERR_EX(r, "Failed to validate decrypted ionic_context"); std::unordered_map ammounts_to; std::unordered_map ammounts_from; @@ -5072,21 +5073,27 @@ bool wallet2::get_ionic_swap_proposal_info(const wallet_public::ionic_swap_propo size_t i = 0; for (const auto& o : outs) { + THROW_IF_FALSE_WALLET_INT_ERR_EX(ionic_context.gen_context.asset_ids.size() > i, "Tx gen context has mismatch with tx(asset_ids) "); + THROW_IF_FALSE_WALLET_INT_ERR_EX(ionic_context.gen_context.asset_ids[i].to_public_key() == o.asset_id, "Tx gen context has mismatch with tx(asset_id != asset_id) "); + THROW_IF_FALSE_WALLET_INT_ERR_EX(ionic_context.gen_context.amounts[i].m_u64[0] == o.amount, "Tx gen context has mismatch with tx(amount != amount)"); + ammounts_to[o.asset_id] += o.amount; third_party_outs[i] = false; i++; } + //validate outputs against decrypted tx generation context for (i = 0; i != tx.vout.size(); i++) { - if (!third_party_outs[i]) - continue; - crypto::hash asset_id = AUTO_VAL_INIT(asset_id); - uint64_t amount = 0; - //TODO decode output info - //get_amout_and_asset_id() - //ammounts_from[asset_id] += amount; + if (!third_party_outs[i]) + { + continue; + } + + crypto::public_key asset_id = ionic_context.gen_context.asset_ids[i].to_public_key(); + uint64_t amount = ionic_context.gen_context.amounts[i].m_u64[0]; + ammounts_from[asset_id] += amount; } for (const auto& a : ammounts_to) @@ -5120,8 +5127,8 @@ bool wallet2::get_ionic_swap_proposal_info(const wallet_public::ionic_swap_propo //---------------------------------------------------------------------------------------------------- bool wallet2::accept_ionic_swap_proposal(const std::string& raw_proposal, currency::transaction& result_tx) { - const wallet_public::ionic_swap_proposal proposal = AUTO_VAL_INIT(proposal); - bool r = parse_and_validate_tx_from_blob(raw_proposal, proposal); + wallet_public::ionic_swap_proposal proposal = AUTO_VAL_INIT(proposal); + bool r = t_unserializable_object_from_blob(proposal, raw_proposal); THROW_IF_TRUE_WALLET_EX(!r, error::wallet_internal_error, "Failed to parse proposal info"); return accept_ionic_swap_proposal(proposal, result_tx); @@ -5130,7 +5137,7 @@ bool wallet2::accept_ionic_swap_proposal(const std::string& raw_proposal, curren bool wallet2::accept_ionic_swap_proposal(const wallet_public::ionic_swap_proposal& proposal, currency::transaction& result_tx) { mode_separate_context msc = AUTO_VAL_INIT(msc); - msc.tx_for_mode_separate = tx_template; + msc.tx_for_mode_separate = proposal.tx_template; wallet_public::ionic_swap_proposal_context ionic_context = AUTO_VAL_INIT(ionic_context); bool r = get_ionic_swap_proposal_info(proposal, msc.proposal_info, ionic_context); diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 82c6a19f..80a665ae 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -305,7 +305,7 @@ namespace tools struct mode_separate_context { currency::transaction tx_for_mode_separate; - view::ionic_swap_proposal_info proposal; + view::ionic_swap_proposal_info proposal_info; }; @@ -949,11 +949,10 @@ namespace tools bool check_htlc_redeemed(const crypto::hash& htlc_tx_id, std::string& origin, crypto::hash& redeem_tx_id); // ionic swaps: - bool create_ionic_swap_proposal(const wallet_public::ionic_swap_proposal_info& proposal, const currency::account_public_address& destination_addr, ionic_swap_proposal& proposal); + bool create_ionic_swap_proposal(const wallet_public::ionic_swap_proposal_info& proposal_details, const currency::account_public_address& destination_addr, wallet_public::ionic_swap_proposal& proposal); bool build_ionic_swap_template(const wallet_public::ionic_swap_proposal_info& proposal_detais, const currency::account_public_address& destination_addr, - ionic_swap_proposal& proposal, - std::vector& selected_transfers_for_template, - crypto::secret_key& one_time_key); + wallet_public::ionic_swap_proposal& proposal, + std::vector& selected_transfers_for_template); bool get_ionic_swap_proposal_info(const std::string&raw_proposal, wallet_public::ionic_swap_proposal_info& proposal_info); bool get_ionic_swap_proposal_info(const wallet_public::ionic_swap_proposal& proposal, wallet_public::ionic_swap_proposal_info& proposal_info); bool get_ionic_swap_proposal_info(const wallet_public::ionic_swap_proposal& proposal, wallet_public::ionic_swap_proposal_info& proposal_info, wallet_public::ionic_swap_proposal_context& ionic_context); diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index c7e2123a..06dd7832 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -1208,6 +1208,7 @@ namespace wallet_public KV_SERIALIZE(fee) KV_SERIALIZE(expiration_time) END_KV_SERIALIZE_MAP() + };