@@ -151,12 +151,6 @@ impl Validate for BillValidateActionData {
151151 self . bill_is_blocked ( ) ?;
152152 self . bill_can_only_be_recoursed ( ) ?;
153153 // not already requested to pay - checked above already
154- // maturity date must have started
155- let maturity_date_start =
156- util:: date:: date_string_to_timestamp ( & self . maturity_date , None ) ?;
157- if self . timestamp < maturity_date_start {
158- return Err ( ValidationError :: BillRequestedToPayBeforeMaturityDate ) ;
159- }
160154 // the caller has to be the bill holder
161155 if self . signer_node_id != holder_node_id {
162156 return Err ( ValidationError :: CallerIsNotHolder ) ;
@@ -217,8 +211,8 @@ impl Validate for BillValidateActionData {
217211 {
218212 // only if the bill is not paid already - checked above
219213
220- // only if the request to pay expired or was rejected
221- let deadline_base = get_deadline_base_for_req_to_pay (
214+ // only if the deadline to pay expired or was rejected
215+ let deadline_base = get_expiration_deadline_base_for_req_to_pay (
222216 req_to_pay. timestamp ,
223217 & self . maturity_date ,
224218 ) ?;
@@ -428,18 +422,20 @@ impl Validate for BillValidateActionData {
428422}
429423
430424/// calculates the base for the expiration deadline of a request to pay - if it was before the
431- /// maturity date, we take the end of the day of the maturity date, otherwise the req to pay
432- /// timestamp
433- pub fn get_deadline_base_for_req_to_pay (
425+ /// maturity date, we take the end of the day of the maturity date, otherwise the end of
426+ /// day of the req to pay timestamp
427+ pub fn get_expiration_deadline_base_for_req_to_pay (
434428 req_to_pay_ts : u64 ,
435429 bill_maturity_date : & str ,
436430) -> Result < u64 , ValidationError > {
437431 let maturity_date = util:: date:: date_string_to_timestamp ( bill_maturity_date, None ) ?;
432+ // we calculate from the end of the day
438433 let maturity_date_end_of_day = util:: date:: end_of_day_as_timestamp ( maturity_date) ;
439- let mut deadline_base = req_to_pay_ts;
434+ // we calculate from the end of the day of the request to pay
435+ let mut deadline_base = util:: date:: end_of_day_as_timestamp ( req_to_pay_ts) ;
440436 // requested to pay after maturity date - deadline base is req to pay
441437 if deadline_base < maturity_date_end_of_day {
442- // requested to pay before end of maturity date - deadline base is maturity
438+ // requested to pay before end of day of maturity date - deadline base is maturity
443439 // date end of day
444440 deadline_base = maturity_date_end_of_day;
445441 }
@@ -476,7 +472,7 @@ impl BillValidateActionData {
476472 . blockchain
477473 . get_last_version_block_with_op_code ( BillOpCode :: RequestToPay )
478474 {
479- let deadline_base = get_deadline_base_for_req_to_pay (
475+ let deadline_base = get_expiration_deadline_base_for_req_to_pay (
480476 req_to_pay_block. timestamp ,
481477 & self . maturity_date ,
482478 ) ?;
@@ -551,17 +547,16 @@ impl BillValidateActionData {
551547 Ok ( ( ) )
552548 }
553549
550+ /// active req to pay, calculated from the start of the request
554551 fn bill_waiting_for_req_to_pay ( & self ) -> Result < ( ) , ValidationError > {
555552 if self . blockchain . get_latest_block ( ) . op_code == BillOpCode :: RequestToPay {
556553 if let Some ( req_to_pay) = self
557554 . blockchain
558555 . get_last_version_block_with_op_code ( BillOpCode :: RequestToPay )
559556 {
560- let deadline_base =
561- get_deadline_base_for_req_to_pay ( req_to_pay. timestamp , & self . maturity_date ) ?;
562557 if !self . is_paid
563558 && !util:: date:: check_if_deadline_has_passed (
564- deadline_base ,
559+ req_to_pay . timestamp , // calculated from start of request
565560 self . timestamp ,
566561 PAYMENT_DEADLINE_SECONDS ,
567562 )
@@ -593,7 +588,10 @@ mod tests {
593588 TEST_PRIVATE_KEY_SECP , TEST_PUB_KEY_SECP , VALID_PAYMENT_ADDRESS_TESTNET , valid_address,
594589 valid_identity_public_data, valid_other_identity_public_data,
595590 } ,
596- util:: { BcrKeys , date:: now} ,
591+ util:: {
592+ BcrKeys ,
593+ date:: { format_date_string, now} ,
594+ } ,
597595 } ;
598596
599597 use super :: * ;
@@ -1000,6 +998,8 @@ mod tests {
1000998
1001999 #[ rstest]
10021000 #[ case:: req_to_pay( BillValidateActionData { signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Ok ( ( ) ) ) ]
1001+ #[ case:: req_to_pay_after_maturity( BillValidateActionData { maturity_date: "2022-11-12" . into( ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Ok ( ( ) ) ) ]
1002+ #[ case:: req_to_pay_before_maturity( BillValidateActionData { maturity_date: "2099-11-12" . into( ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Ok ( ( ) ) ) ]
10031003 fn test_validate_bill_req_to_pay_valid (
10041004 #[ case] input : BillValidateActionData ,
10051005 #[ case] expected : Result < ( ) , ValidationError > ,
@@ -1019,7 +1019,6 @@ mod tests {
10191019 #[ case:: payment_expired_only_recourse( BillValidateActionData { bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , timestamp: now( ) . timestamp( ) as u64 + ( PAYMENT_DEADLINE_SECONDS * 2 ) , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Err ( ValidationError :: BillPaymentExpired ) ) ]
10201020 #[ case:: acceptance_expired_only_recourse( BillValidateActionData { bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , timestamp: now( ) . timestamp( ) as u64 + ( ACCEPT_DEADLINE_SECONDS * 2 ) , ..valid_bill_validate_action_data( add_req_to_accept_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Err ( ValidationError :: BillAcceptanceExpired ) ) ]
10211021 #[ case:: req_to_pay_not_holder( BillValidateActionData { bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , signer_node_id: TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Err ( ValidationError :: CallerIsNotHolder ) ) ]
1022- #[ case:: req_to_pay_before_maturity_date( BillValidateActionData { maturity_date: "2099-01-01" . into( ) , bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Err ( ValidationError :: BillRequestedToPayBeforeMaturityDate ) ) ]
10231022 #[ case:: req_to_pay_already_req_to_payed( BillValidateActionData { bill_action: BillAction :: RequestToPay ( "sat" . into( ) ) , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Err ( ValidationError :: BillIsRequestedToPayAndWaitingForPayment ) ) ]
10241023 fn test_validate_bill_req_to_pay_errors (
10251024 #[ case] input : BillValidateActionData ,
@@ -1173,6 +1172,7 @@ mod tests {
11731172
11741173 #[ rstest]
11751174 #[ case:: offer_to_sell( BillValidateActionData { bill_action: BillAction :: OfferToSell ( valid_other_identity_public_data( ) , 500 , "sat" . into( ) ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) } , Ok ( ( ) ) ) ]
1175+ #[ case:: offer_to_sell_req_to_pay_expired_before_maturity( BillValidateActionData { maturity_date: "2099-11-12" . into( ) , timestamp: now( ) . timestamp( ) as u64 + ( PAYMENT_DEADLINE_SECONDS * 2 ) , bill_action: BillAction :: OfferToSell ( valid_other_identity_public_data( ) , 500 , "sat" . into( ) ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
11761176 fn test_validate_bill_offer_to_sell_valid (
11771177 #[ case] input : BillValidateActionData ,
11781178 #[ case] expected : Result < ( ) , ValidationError > ,
@@ -1200,7 +1200,10 @@ mod tests {
12001200 }
12011201
12021202 #[ rstest]
1203- #[ case:: sell_invalid_data_buyer( BillValidateActionData { bill_action: BillAction :: Sell ( valid_identity_public_data( ) , 500 , "sat" . into( ) , VALID_PAYMENT_ADDRESS_TESTNET . into( ) ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( add_offer_to_sell_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
1203+ #[ case:: sell( BillValidateActionData { bill_action: BillAction :: Sell ( valid_identity_public_data( ) , 500 , "sat" . into( ) , VALID_PAYMENT_ADDRESS_TESTNET . into( ) ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( add_offer_to_sell_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
1204+ // minus 8 seconds so timestamp is before offer to sell expiry and after req to pay expiry
1205+ // as every block adds 1 sec to issue block, which is now() - 10
1206+ #[ case:: sell_req_to_pay_expired_before_maturity( BillValidateActionData { maturity_date: "2099-11-12" . into( ) , timestamp: now( ) . timestamp( ) as u64 + ( PAYMENT_DEADLINE_SECONDS - 8 ) , bill_action: BillAction :: Sell ( valid_identity_public_data( ) , 500 , "sat" . into( ) , VALID_PAYMENT_ADDRESS_TESTNET . into( ) ) , signer_node_id: OTHER_TEST_PUB_KEY_SECP . into( ) , ..valid_bill_validate_action_data( add_offer_to_sell_block( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) ) } , Ok ( ( ) ) ) ]
12041207 fn test_validate_bill_sell_valid (
12051208 #[ case] input : BillValidateActionData ,
12061209 #[ case] expected : Result < ( ) , ValidationError > ,
@@ -1291,7 +1294,8 @@ mod tests {
12911294 }
12921295
12931296 #[ rstest]
1294- #[ case:: reject_to_pay_expired( BillValidateActionData { bill_action: BillAction :: RejectPayment , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
1297+ #[ case:: reject_to_pay( BillValidateActionData { bill_action: BillAction :: RejectPayment , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
1298+ #[ case:: reject_to_pay_maturity_not_expired( BillValidateActionData { maturity_date: format_date_string( now( ) ) , bill_action: BillAction :: RejectPayment , ..valid_bill_validate_action_data( add_req_to_pay_block( valid_bill_blockchain_issue( valid_bill_issue_block_data( ) , ) ) ) } , Ok ( ( ) ) ) ]
12951299 fn test_validate_bill_reject_payment_valid (
12961300 #[ case] input : BillValidateActionData ,
12971301 #[ case] expected : Result < ( ) , ValidationError > ,
0 commit comments