@@ -105,8 +105,9 @@ pub fn execute(
105105 ) ,
106106
107107 ExecuteMsg :: CancelCollectionOffer { id } => execute_cancel_collection_offer ( deps, info, id) ,
108- ExecuteMsg :: ApproveSale { id } => execute_approve_sale ( deps, info, id) ,
108+ ExecuteMsg :: ApproveSale { id } => execute_approve_sale ( deps, env , info, id) ,
109109 ExecuteMsg :: RejectSale { id } => execute_reject_sale ( deps, info, id) ,
110+ ExecuteMsg :: ReclaimExpiredSale { id } => execute_reclaim_expired_sale ( deps, env, info, id) ,
110111 ExecuteMsg :: UpdateConfig { config } => execute_update_config ( deps, info, config) ,
111112 }
112113}
@@ -400,6 +401,7 @@ fn execute_create_pending_sale(
400401
401402pub fn execute_approve_sale (
402403 deps : DepsMut ,
404+ env : Env ,
403405 info : MessageInfo ,
404406 pending_sale_id : String ,
405407) -> Result < Response , ContractError > {
@@ -409,6 +411,12 @@ pub fn execute_approve_sale(
409411 let config = CONFIG . load ( deps. storage ) ?;
410412 let pending_sale = pending_sales ( ) . load ( deps. storage , pending_sale_id. clone ( ) ) ?;
411413
414+ if env. block . time . seconds ( ) >= pending_sale. expiration {
415+ return Err ( ContractError :: PendingSaleExpired {
416+ id : pending_sale_id,
417+ } ) ;
418+ }
419+
412420 // Generate listing_id to find the listing
413421 let listing_id = generate_id ( vec ! [
414422 pending_sale. collection. as_bytes( ) ,
@@ -478,16 +486,12 @@ pub fn execute_approve_sale(
478486 Ok ( response)
479487}
480488
481- pub fn execute_reject_sale (
489+ fn remove_pending_sale (
482490 deps : DepsMut ,
483- info : MessageInfo ,
484491 pending_sale_id : String ,
492+ pending_sale : PendingSale ,
493+ reason : & str ,
485494) -> Result < Response , ContractError > {
486- // Only manager can reject
487- only_manager ( & info, & deps) ?;
488-
489- let pending_sale = pending_sales ( ) . load ( deps. storage , pending_sale_id. clone ( ) ) ?;
490-
491495 let listing_id = generate_id ( vec ! [
492496 pending_sale. collection. as_bytes( ) ,
493497 pending_sale. token_id. as_bytes( ) ,
@@ -514,6 +518,7 @@ pub fn execute_reject_sale(
514518 funds : vec ! [ ] ,
515519 } ) ;
516520 }
521+
517522 // refund buyer
518523 let refund_msg = BankMsg :: Send {
519524 to_address : pending_sale. buyer . to_string ( ) ,
@@ -531,7 +536,43 @@ pub fn execute_reject_sale(
531536 pending_sale. buyer . clone ( ) ,
532537 pending_sale. seller ,
533538 pending_sale. price ,
539+ reason,
534540 ) )
535541 . add_message ( refund_msg)
536542 . add_messages ( sub_msgs) )
537543}
544+
545+ pub fn execute_reject_sale (
546+ deps : DepsMut ,
547+ info : MessageInfo ,
548+ pending_sale_id : String ,
549+ ) -> Result < Response , ContractError > {
550+ only_manager ( & info, & deps) ?;
551+
552+ let pending_sale = pending_sales ( ) . load ( deps. storage , pending_sale_id. clone ( ) ) ?;
553+
554+ remove_pending_sale ( deps, pending_sale_id, pending_sale, "rejected_by_manager" )
555+ }
556+
557+ pub fn execute_reclaim_expired_sale (
558+ deps : DepsMut ,
559+ env : Env ,
560+ info : MessageInfo ,
561+ pending_sale_id : String ,
562+ ) -> Result < Response , ContractError > {
563+ let pending_sale = pending_sales ( ) . load ( deps. storage , pending_sale_id. clone ( ) ) ?;
564+
565+ if env. block . time . seconds ( ) < pending_sale. expiration {
566+ return Err ( ContractError :: PendingSaleNotExpired {
567+ id : pending_sale_id,
568+ } ) ;
569+ }
570+
571+ if info. sender != pending_sale. buyer {
572+ return Err ( ContractError :: Unauthorized {
573+ message : "only the buyer can reclaim an expired sale" . to_string ( ) ,
574+ } ) ;
575+ }
576+
577+ remove_pending_sale ( deps, pending_sale_id, pending_sale, "expired" )
578+ }
0 commit comments