@@ -6532,25 +6532,70 @@ bool simple_wallet::transfer_main(const std::vector<std::string> &args_, bool ca
6532
6532
bool r = true ;
6533
6533
6534
6534
// check for a URI
6535
- std::string address_uri, payment_id_uri, tx_description, recipient_name , error;
6535
+ std::string payment_id_uri, tx_description, error;
6536
6536
std::vector<std::string> unknown_parameters;
6537
- uint64_t amount = 0 ;
6538
- bool has_uri = m_wallet->parse_uri (local_args[i], address_uri, payment_id_uri, amount, tx_description, recipient_name, unknown_parameters, error);
6537
+ std::vector<std::string> addresses, recipient_names;
6538
+ std::vector<uint64_t > amounts;
6539
+ bool has_uri = m_wallet->parse_uri (local_args[i], addresses, amounts, recipient_names, payment_id_uri, tx_description, unknown_parameters, error);
6539
6540
if (has_uri)
6540
6541
{
6541
- r = cryptonote::get_account_address_from_str_or_url (info, m_wallet->nettype (), address_uri, oa_prompter);
6542
- if (payment_id_uri.size () == 16 )
6542
+ for (size_t address_index = 0 ; address_index < addresses.size (); address_index++)
6543
6543
{
6544
- if (!tools::wallet2::parse_short_payment_id (payment_id_uri, info.payment_id ))
6544
+ r = cryptonote::get_account_address_from_str_or_url (info, m_wallet->nettype (), addresses[address_index], oa_prompter);
6545
+ if (payment_id_uri.size () == 16 )
6545
6546
{
6546
- fail_msg_writer () << tr (" failed to parse short payment ID from URI" );
6547
+ if (!tools::wallet2::parse_short_payment_id (payment_id_uri, info.payment_id ))
6548
+ {
6549
+ fail_msg_writer () << tr (" failed to parse short payment ID from URI" );
6550
+ return false ;
6551
+ }
6552
+ info.has_payment_id = true ;
6553
+ }
6554
+ de.amount = amounts[address_index];
6555
+ de.original = addresses[address_index];
6556
+ if (!r)
6557
+ {
6558
+ fail_msg_writer () << tr (" failed to parse address" );
6547
6559
return false ;
6548
6560
}
6549
- info.has_payment_id = true ;
6561
+ de.addr = info.address ;
6562
+ de.is_subaddress = info.is_subaddress ;
6563
+ de.is_integrated = info.has_payment_id ;
6564
+
6565
+ if (info.has_payment_id || !payment_id_uri.empty ())
6566
+ {
6567
+ if (payment_id_seen)
6568
+ {
6569
+ fail_msg_writer () << tr (" a single transaction cannot use more than one payment id" );
6570
+ return false ;
6571
+ }
6572
+ crypto::hash payment_id;
6573
+ std::string extra_nonce;
6574
+ if (info.has_payment_id )
6575
+ {
6576
+ set_encrypted_payment_id_to_tx_extra_nonce (extra_nonce, info.payment_id );
6577
+ }
6578
+ else if (tools::wallet2::parse_payment_id (payment_id_uri, payment_id))
6579
+ {
6580
+ LONG_PAYMENT_ID_SUPPORT_CHECK ();
6581
+ }
6582
+ else
6583
+ {
6584
+ fail_msg_writer () << tr (" failed to parse payment id, though it was detected" );
6585
+ return false ;
6586
+ }
6587
+ bool r = add_extra_nonce_to_tx_extra (extra, extra_nonce);
6588
+ if (!r)
6589
+ {
6590
+ fail_msg_writer () << tr (" failed to set up payment id, though it was decoded correctly" );
6591
+ return false ;
6592
+ }
6593
+ payment_id_seen = true ;
6594
+ }
6595
+ dsts.push_back (de);
6550
6596
}
6551
- de.amount = amount;
6552
- de.original = local_args[i];
6553
- ++i;
6597
+ i++;
6598
+ break ;
6554
6599
}
6555
6600
else if (i + 1 < local_args.size ())
6556
6601
{
0 commit comments