@@ -92,14 +92,23 @@ pub async fn run(cli: &Cli, args: &OfferArgs) -> Result<CommandOutput, AppError>
9292 } ) ?;
9393 let expires_unix = i64:: try_from ( expires_u64)
9494 . map_err ( |_| AppError :: Invalid ( "expires_at_unix is out of range" . to_string ( ) ) ) ?;
95+ let main_payment_address = session
96+ . wallet
97+ . peek_payment_address ( 0 )
98+ . map ( |address| address. to_string ( ) )
99+ . ok_or_else ( || {
100+ AppError :: Internal ( "wallet main payment address unavailable" . to_string ( ) )
101+ } ) ?;
102+ let resolved_seller_payout_address = resolve_seller_payout_address (
103+ & main_payment_address,
104+ seller_payout_address. as_deref ( ) ,
105+ ) ?;
95106
96107 let request = CreateOfferRequest {
97108 inscription_id : inscription. clone ( ) ,
98109 seller_outpoint : inscription_details. satpoint . outpoint ,
99110 seller_input_address : output_details. address . clone ( ) ,
100- seller_payout_address : seller_payout_address
101- . clone ( )
102- . unwrap_or_else ( || output_details. address . clone ( ) ) ,
111+ seller_payout_address : resolved_seller_payout_address,
103112 seller_output_value_sats : postage_sats,
104113 ask_sats : * amount,
105114 fee_rate_sat_vb : * fee_rate,
@@ -639,6 +648,21 @@ fn assert_offer_expectations(
639648 Ok ( ( ) )
640649}
641650
651+ fn resolve_seller_payout_address (
652+ main_payment_address : & str ,
653+ provided : Option < & str > ,
654+ ) -> Result < String , AppError > {
655+ if let Some ( provided) = provided {
656+ if !provided. eq_ignore_ascii_case ( main_payment_address) {
657+ return Err ( AppError :: Invalid ( format ! (
658+ "--seller-payout-address must match wallet main payment address {}" ,
659+ main_payment_address
660+ ) ) ) ;
661+ }
662+ }
663+ Ok ( main_payment_address. to_string ( ) )
664+ }
665+
642666fn assert_offer_network_matches_profile (
643667 offer : & OfferEnvelopeV1 ,
644668 network : NetworkArg ,
@@ -685,7 +709,10 @@ fn map_offer_error<E: ToString>(err: E) -> AppError {
685709
686710#[ cfg( test) ]
687711mod tests {
688- use super :: { abbreviate, assert_offer_expectations, map_offer_error, resolve_offer_source} ;
712+ use super :: {
713+ abbreviate, assert_offer_expectations, map_offer_error, resolve_offer_source,
714+ resolve_seller_payout_address,
715+ } ;
689716 use crate :: error:: AppError ;
690717 use std:: path:: Path ;
691718 use zinc_core:: OfferEnvelopeV1 ;
@@ -761,4 +788,26 @@ mod tests {
761788 let short = abbreviate ( value, 6 , 4 ) ;
762789 assert_eq ! ( short, "123456...cdef" ) ;
763790 }
791+
792+ #[ test]
793+ fn resolve_seller_payout_address_defaults_to_main_payment ( ) {
794+ let resolved =
795+ resolve_seller_payout_address ( "bcrt1pmainpayment" , None ) . expect ( "should resolve" ) ;
796+ assert_eq ! ( resolved, "bcrt1pmainpayment" ) ;
797+ }
798+
799+ #[ test]
800+ fn resolve_seller_payout_address_rejects_non_main_address ( ) {
801+ let err =
802+ resolve_seller_payout_address ( "bcrt1pmainpayment" , Some ( "bcrt1pdifferentpayment" ) )
803+ . expect_err ( "must reject" ) ;
804+ assert ! ( matches!( err, AppError :: Invalid ( _) ) ) ;
805+ }
806+
807+ #[ test]
808+ fn resolve_seller_payout_address_accepts_case_insensitive_match ( ) {
809+ let resolved = resolve_seller_payout_address ( "bc1pmainpayment" , Some ( "BC1PMAINPAYMENT" ) )
810+ . expect ( "should resolve" ) ;
811+ assert_eq ! ( resolved, "bc1pmainpayment" ) ;
812+ }
764813}
0 commit comments