carrot_impl: make_signable_tx_hash_from_carrot_transaction_proposal_v1 and bug fixes

This commit is contained in:
jeffro256
2025-04-03 13:37:49 -05:00
committed by akildemir
parent 4f33613628
commit 939fd068c5
6 changed files with 121 additions and 12 deletions

View File

@@ -168,7 +168,6 @@ static void subtest_multi_account_transfer_over_transaction(const unittest_trans
make_pruned_transaction_from_carrot_proposal_v1(tx_proposal,
&ss_keys.s_view_balance_dev,
&ss_keys.k_view_incoming_dev,
ss_keys.carrot_account_spend_pubkey,
tx);
// calculate acceptable fee margin between proposed amount and actual amount for subtractable outputs

View File

@@ -368,7 +368,6 @@ static cryptonote::transaction construct_carrot_pruned_transaction_fake_inputs(
carrot::make_pruned_transaction_from_carrot_proposal_v1(tx_proposal,
/*s_view_balance_dev=*/nullptr,
&k_view_dev,
acc_keys.m_account_address.m_spend_public_key,
tx);
return tx;

View File

@@ -135,3 +135,90 @@ TEST(wallet_tx_builder, input_selection_basic)
}
ASSERT_EQ(selected_transfer_indices.size(), matched_transfer_indices.size());
}
//----------------------------------------------------------------------------------------------------------------------
TEST(wallet_tx_builder, make_carrot_transaction_proposal_wallet2_transfer_1)
{
cryptonote::account_base alice;
alice.generate();
cryptonote::account_base bob;
bob.generate();
const tools::wallet2::transfer_container transfers{
gen_transfer_details(),
gen_transfer_details()};
const rct::xmr_amount out_amount = rct::randXmrAmount(transfers.front().amount() / 2);
const std::vector<cryptonote::tx_destination_entry> dsts{
cryptonote::tx_destination_entry(out_amount, bob.get_keys().m_account_address, false)
};
const uint64_t top_block_index = std::max(transfers.front().m_block_height, transfers.back().m_block_height)
+ CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE;
const carrot::CarrotTransactionProposalV1 tx_proposal = tools::wallet::make_carrot_transaction_proposal_wallet2_transfer(
transfers,
/*subaddress_map=*/{},
dsts,
/*fee_per_weight=*/1,
/*extra=*/{},
/*subaddr_account=*/0,
/*subaddr_indices=*/{},
/*ignore_above=*/MONEY_SUPPLY,
/*ignore_below=*/0,
top_block_index,
alice);
std::vector<crypto::key_image> expected_key_images{
transfers.front().m_key_image,
transfers.back().m_key_image};
std::sort(expected_key_images.begin(),
expected_key_images.end(),
std::greater{});
// Assert basic length facts about tx proposal
ASSERT_EQ(2, tx_proposal.key_images_sorted.size()); // we always try 2 when available
EXPECT_EQ(expected_key_images, tx_proposal.key_images_sorted);
ASSERT_EQ(1, tx_proposal.normal_payment_proposals.size());
ASSERT_EQ(1, tx_proposal.selfsend_payment_proposals.size());
EXPECT_EQ(0, tx_proposal.extra.size());
// Assert amounts
EXPECT_EQ(out_amount, tx_proposal.normal_payment_proposals.front().amount);
EXPECT_EQ(out_amount + tx_proposal.selfsend_payment_proposals.front().proposal.amount + tx_proposal.fee,
transfers.front().amount() + transfers.back().amount());
}
//----------------------------------------------------------------------------------------------------------------------
TEST(wallet_tx_builder, make_carrot_transaction_proposal_wallet2_sweep_1)
{
cryptonote::account_base alice;
alice.generate();
cryptonote::account_base bob;
bob.generate();
const tools::wallet2::transfer_container transfers{gen_transfer_details()};
const carrot::CarrotTransactionProposalV1 tx_proposal = tools::wallet::make_carrot_transaction_proposal_wallet2_sweep(
transfers,
/*subaddress_map=*/{},
{transfers.front().m_key_image},
bob.get_keys().m_account_address,
/*is_subaddress=*/false,
/*n_dests=*/1,
/*fee_per_weight=*/1,
/*extra=*/{},
transfers.front().m_block_height + CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE,
alice);
// Assert basic length facts about tx proposal
ASSERT_EQ(1, tx_proposal.key_images_sorted.size());
EXPECT_EQ(transfers.front().m_key_image, tx_proposal.key_images_sorted.front());
ASSERT_EQ(1, tx_proposal.normal_payment_proposals.size());
ASSERT_EQ(1, tx_proposal.selfsend_payment_proposals.size());
EXPECT_EQ(0, tx_proposal.extra.size());
// Assert amounts
EXPECT_EQ(0, tx_proposal.selfsend_payment_proposals.front().proposal.amount);
EXPECT_EQ(transfers.front().amount(), tx_proposal.fee + tx_proposal.normal_payment_proposals.front().amount);
}
//----------------------------------------------------------------------------------------------------------------------