diff --git a/src/carrot_impl/carrot_tx_format_utils.cpp b/src/carrot_impl/carrot_tx_format_utils.cpp index 34ca0df4d..f6e6976a5 100644 --- a/src/carrot_impl/carrot_tx_format_utils.cpp +++ b/src/carrot_impl/carrot_tx_format_utils.cpp @@ -31,6 +31,7 @@ //local headers #include "carrot_core/enote_utils.h" +#include "carrot_core/payment_proposal.h" #include "common/container_helpers.h" #include "cryptonote_basic/cryptonote_format_utils.h" #include "cryptonote_config.h" @@ -395,6 +396,28 @@ cryptonote::transaction store_carrot_to_coinbase_transaction_v1( return tx; } //------------------------------------------------------------------------------------------------------------------- +cryptonote::transaction make_single_enote_carrot_coinbase_transaction_v1(const CarrotDestinationV1 &destination, + const rct::xmr_amount block_reward, + const std::uint64_t block_index, + const cryptonote::blobdata &extra_nonce) +{ + CHECK_AND_ASSERT_THROW_MES(!destination.is_subaddress, + "make_single_enote_carrot_coinbase_transaction_v1: subaddress are not allowed in miner transactions"); + CHECK_AND_ASSERT_THROW_MES(destination.payment_id == null_payment_id, + "make_single_enote_carrot_coinbase_transaction_v1: integrated addresses are not allowed in miner transactions"); + + const CarrotPaymentProposalV1 payment_proposal{ + .destination = destination, + .amount = block_reward, + .randomness = gen_janus_anchor() + }; + + std::vector enotes(1); + get_coinbase_output_proposal_v1(payment_proposal, block_index, enotes.front()); + + return store_carrot_to_coinbase_transaction_v1(enotes, extra_nonce); +} +//------------------------------------------------------------------------------------------------------------------- bool try_load_carrot_coinbase_enote_from_transaction_v1(const cryptonote::transaction &tx, const epee::span enote_ephemeral_pubkeys, const std::size_t local_output_index, diff --git a/src/carrot_impl/carrot_tx_format_utils.h b/src/carrot_impl/carrot_tx_format_utils.h index bf94bad80..a945e4a27 100644 --- a/src/carrot_impl/carrot_tx_format_utils.h +++ b/src/carrot_impl/carrot_tx_format_utils.h @@ -30,6 +30,7 @@ //local headers #include "carrot_core/carrot_enote_types.h" +#include "carrot_core/destination.h" #include "cryptonote_basic/blobdatatype.h" #include "cryptonote_basic/cryptonote_basic.h" #include "cryptonote_basic/tx_extra.h" @@ -134,6 +135,18 @@ bool try_load_carrot_from_transaction_v1(const cryptonote::transaction &tx, cryptonote::transaction store_carrot_to_coinbase_transaction_v1( const std::vector &enotes, const cryptonote::blobdata &extra_nonce); +/** + * brief: make_single_enote_carrot_coinbase_transaction_v1 - store one coinbase Carrot enote to a cryptonote::transaction + * param: destination - + * param: block_reward - + * param: block_index - + * param: extra_nonce - + * return: a full coinbase transaction containing given Carrot information + */ +cryptonote::transaction make_single_enote_carrot_coinbase_transaction_v1(const CarrotDestinationV1 &destination, + const rct::xmr_amount block_reward, + const std::uint64_t block_index, + const cryptonote::blobdata &extra_nonce); /** * brief: try_load_carrot_coinbase_enote_from_transaction_v1 - load one coinbase Carrot enote from a cryptonote::transaction * param: tx -