@ -5268,10 +5268,18 @@ bool wallet2::sign_tx(unsigned_tx_set &exported_txs, std::vector<wallet2::pendin
LOG_PRINT_L1 ( " " < < ( n + 1 ) < < " : " < < sd . sources . size ( ) < < " inputs, ring size " < < sd . sources [ 0 ] . outputs . size ( ) ) ;
signed_txes . ptx . push_back ( pending_tx ( ) ) ;
tools : : wallet2 : : pending_tx & ptx = signed_txes . ptx . back ( ) ;
rct : : RangeProofType range_proof_type = rct : : RangeProofBorromean ;
if ( sd . use_bulletproofs )
{
range_proof_type = rct : : RangeProofBulletproof ;
for ( const rct : : Bulletproof & proof : ptx . tx . rct_signatures . p . bulletproofs )
if ( proof . V . size ( ) > 1 )
range_proof_type = rct : : RangeProofMultiOutputBulletproof ;
}
crypto : : secret_key tx_key ;
std : : vector < crypto : : secret_key > additional_tx_keys ;
rct : : multisig_out msout ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sd . sources , sd . splitted_dsts , sd . change_dts . addr , sd . extra , ptx . tx , sd . unlock_time , tx_key , additional_tx_keys , sd . use_rct , sd . use_bulletproofs , m_multisig ? & msout : NULL ) ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sd . sources , sd . splitted_dsts , sd . change_dts . addr , sd . extra , ptx . tx , sd . unlock_time , tx_key , additional_tx_keys , sd . use_rct , range_proof_type , m_multisig ? & msout : NULL ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : tx_not_constructed , sd . sources , sd . splitted_dsts , sd . unlock_time , m_nettype ) ;
// we don't test tx size, because we don't know the current limit, due to not having a blockchain,
// and it's a bit pointless to fail there anyway, since it'd be a (good) guess only. We sign anyway,
@ -5684,7 +5692,15 @@ bool wallet2::sign_multisig_tx(multisig_tx_set &exported_txs, std::vector<crypto
cryptonote : : transaction tx ;
rct : : multisig_out msout = ptx . multisig_sigs . front ( ) . msout ;
auto sources = sd . sources ;
bool r = cryptonote : : construct_tx_with_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , sd . splitted_dsts , ptx . change_dts . addr , sd . extra , tx , sd . unlock_time , ptx . tx_key , ptx . additional_tx_keys , sd . use_rct , sd . use_bulletproofs , & msout , false ) ;
rct : : RangeProofType range_proof_type = rct : : RangeProofBorromean ;
if ( sd . use_bulletproofs )
{
range_proof_type = rct : : RangeProofBulletproof ;
for ( const rct : : Bulletproof & proof : ptx . tx . rct_signatures . p . bulletproofs )
if ( proof . V . size ( ) > 1 )
range_proof_type = rct : : RangeProofMultiOutputBulletproof ;
}
bool r = cryptonote : : construct_tx_with_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , sd . splitted_dsts , ptx . change_dts . addr , sd . extra , tx , sd . unlock_time , ptx . tx_key , ptx . additional_tx_keys , sd . use_rct , range_proof_type , & msout , false ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : tx_not_constructed , sd . sources , sd . splitted_dsts , sd . unlock_time , m_nettype ) ;
THROW_WALLET_EXCEPTION_IF ( get_transaction_prefix_hash ( tx ) ! = get_transaction_prefix_hash ( ptx . tx ) ,
@ -7054,7 +7070,7 @@ void wallet2::transfer_selected(const std::vector<cryptonote::tx_destination_ent
std : : vector < crypto : : secret_key > additional_tx_keys ;
rct : : multisig_out msout ;
LOG_PRINT_L2 ( " constructing tx " ) ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , splitted_dsts , change_dts . addr , extra , tx , unlock_time , tx_key , additional_tx_keys , false , false , m_multisig ? & msout : NULL ) ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , splitted_dsts , change_dts . addr , extra , tx , unlock_time , tx_key , additional_tx_keys , false , rct : : RangeProofBulletproof , m_multisig ? & msout : NULL ) ;
LOG_PRINT_L2 ( " constructed tx, r= " < < r ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : tx_not_constructed , sources , splitted_dsts , unlock_time , m_nettype ) ;
THROW_WALLET_EXCEPTION_IF ( upper_transaction_size_limit < = get_object_blobsize ( tx ) , error : : tx_too_big , tx , upper_transaction_size_limit ) ;
@ -7103,7 +7119,7 @@ void wallet2::transfer_selected(const std::vector<cryptonote::tx_destination_ent
void wallet2 : : transfer_selected_rct ( std : : vector < cryptonote : : tx_destination_entry > dsts , const std : : vector < size_t > & selected_transfers , size_t fake_outputs_count ,
std : : vector < std : : vector < tools : : wallet2 : : get_outs_entry > > & outs ,
uint64_t unlock_time , uint64_t fee , const std : : vector < uint8_t > & extra , cryptonote : : transaction & tx , pending_tx & ptx , bool bulletproof )
uint64_t unlock_time , uint64_t fee , const std : : vector < uint8_t > & extra , cryptonote : : transaction & tx , pending_tx & ptx , rct : : RangeProofType range_proof_type )
{
using namespace cryptonote ;
// throw if attempting a transaction with no destinations
@ -7259,7 +7275,7 @@ void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry
rct : : multisig_out msout ;
LOG_PRINT_L2 ( " constructing tx " ) ;
auto sources_copy = sources ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , splitted_dsts , change_dts . addr , extra , tx , unlock_time , tx_key , additional_tx_keys , true , bulletproof , m_multisig ? & msout : NULL ) ;
bool r = cryptonote : : construct_tx_and_get_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources , splitted_dsts , change_dts . addr , extra , tx , unlock_time , tx_key , additional_tx_keys , true , range_proof_type , m_multisig ? & msout : NULL ) ;
LOG_PRINT_L2 ( " constructed tx, r= " < < r ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : tx_not_constructed , sources , dsts , unlock_time , m_nettype ) ;
THROW_WALLET_EXCEPTION_IF ( upper_transaction_size_limit < = get_object_blobsize ( tx ) , error : : tx_too_big , tx , upper_transaction_size_limit ) ;
@ -7304,7 +7320,7 @@ void wallet2::transfer_selected_rct(std::vector<cryptonote::tx_destination_entry
LOG_PRINT_L2 ( " Creating supplementary multisig transaction " ) ;
cryptonote : : transaction ms_tx ;
auto sources_copy_copy = sources_copy ;
bool r = cryptonote : : construct_tx_with_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources_copy_copy , splitted_dsts , change_dts . addr , extra , ms_tx , unlock_time , tx_key , additional_tx_keys , true , bulletproof , & msout , false ) ;
bool r = cryptonote : : construct_tx_with_tx_key ( m_account . get_keys ( ) , m_subaddresses , sources_copy_copy , splitted_dsts , change_dts . addr , extra , ms_tx , unlock_time , tx_key , additional_tx_keys , true , range_proof_type , & msout , false ) ;
LOG_PRINT_L2 ( " constructed tx, r= " < < r ) ;
THROW_WALLET_EXCEPTION_IF ( ! r , error : : tx_not_constructed , sources , splitted_dsts , unlock_time , m_nettype ) ;
THROW_WALLET_EXCEPTION_IF ( upper_transaction_size_limit < = get_object_blobsize ( tx ) , error : : tx_too_big , tx , upper_transaction_size_limit ) ;
@ -8010,6 +8026,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
uint64_t upper_transaction_size_limit = get_upper_transaction_size_limit ( ) ;
const bool use_rct = use_fork_rules ( 4 , 0 ) ;
const bool bulletproof = use_fork_rules ( get_bulletproof_fork ( ) , 0 ) ;
const rct : : RangeProofType range_proof_type = bulletproof ? rct : : RangeProofMultiOutputBulletproof : rct : : RangeProofBorromean ;
const uint64_t fee_per_kb = get_per_kb_fee ( ) ;
const uint64_t fee_multiplier = get_fee_multiplier ( priority , get_fee_algorithm ( ) ) ;
@ -8326,7 +8343,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
tx . selected_transfers . size ( ) < < " inputs " ) ;
if ( use_rct )
transfer_selected_rct ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
test_tx , test_ptx , bulletproof ) ;
test_tx , test_ptx , range_proof_type ) ;
else
transfer_selected ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
detail : : digit_split_strategy , tx_dust_policy ( : : config : : DEFAULT_DUST_THRESHOLD ) , test_tx , test_ptx ) ;
@ -8369,7 +8386,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp
while ( needed_fee > test_ptx . fee ) {
if ( use_rct )
transfer_selected_rct ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
test_tx , test_ptx , bulletproof ) ;
test_tx , test_ptx , range_proof_type ) ;
else
transfer_selected ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
detail : : digit_split_strategy , tx_dust_policy ( : : config : : DEFAULT_DUST_THRESHOLD ) , test_tx , test_ptx ) ;
@ -8442,7 +8459,7 @@ skip_tx:
extra , /* const std::vector<uint8_t>& extra, */
test_tx , /* OUT cryptonote::transaction& tx, */
test_ptx , /* OUT cryptonote::transaction& tx, */
bulletproof ) ;
range_proof_type ) ;
} else {
transfer_selected ( tx . dsts ,
tx . selected_transfers ,
@ -8581,6 +8598,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
const bool use_rct = fake_outs_count > 0 & & use_fork_rules ( 4 , 0 ) ;
const bool bulletproof = use_fork_rules ( get_bulletproof_fork ( ) , 0 ) ;
const rct : : RangeProofType range_proof_type = bulletproof ? rct : : RangeProofBulletproof : rct : : RangeProofBorromean ;
const uint64_t fee_per_kb = get_per_kb_fee ( ) ;
const uint64_t fee_multiplier = get_fee_multiplier ( priority , get_fee_algorithm ( ) ) ;
@ -8636,7 +8654,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
tx . selected_transfers . size ( ) < < " outputs " ) ;
if ( use_rct )
transfer_selected_rct ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
test_tx , test_ptx , bulletproof ) ;
test_tx , test_ptx , range_proof_type ) ;
else
transfer_selected ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
detail : : digit_split_strategy , tx_dust_policy ( : : config : : DEFAULT_DUST_THRESHOLD ) , test_tx , test_ptx ) ;
@ -8653,7 +8671,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
tx . dsts [ 0 ] . amount = available_for_fee - needed_fee ;
if ( use_rct )
transfer_selected_rct ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
test_tx , test_ptx , bulletproof ) ;
test_tx , test_ptx , range_proof_type ) ;
else
transfer_selected ( tx . dsts , tx . selected_transfers , fake_outs_count , outs , unlock_time , needed_fee , extra ,
detail : : digit_split_strategy , tx_dust_policy ( : : config : : DEFAULT_DUST_THRESHOLD ) , test_tx , test_ptx ) ;
@ -8692,7 +8710,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton
pending_tx test_ptx ;
if ( use_rct ) {
transfer_selected_rct ( tx . dsts , tx . selected_transfers , fake_outs_count , tx . outs , unlock_time , tx . needed_fee , extra ,
test_tx , test_ptx , bulletproof ) ;
test_tx , test_ptx , range_proof_type ) ;
} else {
transfer_selected ( tx . dsts , tx . selected_transfers , fake_outs_count , tx . outs , unlock_time , tx . needed_fee , extra ,
detail : : digit_split_strategy , tx_dust_policy ( : : config : : DEFAULT_DUST_THRESHOLD ) , test_tx , test_ptx ) ;