@@ -151,12 +151,6 @@ impl Validate for BillValidateActionData {
151
151
self . bill_is_blocked ( ) ?;
152
152
self . bill_can_only_be_recoursed ( ) ?;
153
153
// 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
- }
160
154
// the caller has to be the bill holder
161
155
if self . signer_node_id != holder_node_id {
162
156
return Err ( ValidationError :: CallerIsNotHolder ) ;
@@ -217,8 +211,8 @@ impl Validate for BillValidateActionData {
217
211
{
218
212
// only if the bill is not paid already - checked above
219
213
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 (
222
216
req_to_pay. timestamp ,
223
217
& self . maturity_date ,
224
218
) ?;
@@ -428,18 +422,20 @@ impl Validate for BillValidateActionData {
428
422
}
429
423
430
424
/// 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 (
434
428
req_to_pay_ts : u64 ,
435
429
bill_maturity_date : & str ,
436
430
) -> Result < u64 , ValidationError > {
437
431
let maturity_date = util:: date:: date_string_to_timestamp ( bill_maturity_date, None ) ?;
432
+ // we calculate from the end of the day
438
433
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) ;
440
436
// requested to pay after maturity date - deadline base is req to pay
441
437
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
443
439
// date end of day
444
440
deadline_base = maturity_date_end_of_day;
445
441
}
@@ -476,7 +472,7 @@ impl BillValidateActionData {
476
472
. blockchain
477
473
. get_last_version_block_with_op_code ( BillOpCode :: RequestToPay )
478
474
{
479
- let deadline_base = get_deadline_base_for_req_to_pay (
475
+ let deadline_base = get_expiration_deadline_base_for_req_to_pay (
480
476
req_to_pay_block. timestamp ,
481
477
& self . maturity_date ,
482
478
) ?;
@@ -551,17 +547,16 @@ impl BillValidateActionData {
551
547
Ok ( ( ) )
552
548
}
553
549
550
+ /// active req to pay, calculated from the start of the request
554
551
fn bill_waiting_for_req_to_pay ( & self ) -> Result < ( ) , ValidationError > {
555
552
if self . blockchain . get_latest_block ( ) . op_code == BillOpCode :: RequestToPay {
556
553
if let Some ( req_to_pay) = self
557
554
. blockchain
558
555
. get_last_version_block_with_op_code ( BillOpCode :: RequestToPay )
559
556
{
560
- let deadline_base =
561
- get_deadline_base_for_req_to_pay ( req_to_pay. timestamp , & self . maturity_date ) ?;
562
557
if !self . is_paid
563
558
&& !util:: date:: check_if_deadline_has_passed (
564
- deadline_base ,
559
+ req_to_pay . timestamp , // calculated from start of request
565
560
self . timestamp ,
566
561
PAYMENT_DEADLINE_SECONDS ,
567
562
)
@@ -593,7 +588,10 @@ mod tests {
593
588
TEST_PRIVATE_KEY_SECP , TEST_PUB_KEY_SECP , VALID_PAYMENT_ADDRESS_TESTNET , valid_address,
594
589
valid_identity_public_data, valid_other_identity_public_data,
595
590
} ,
596
- util:: { BcrKeys , date:: now} ,
591
+ util:: {
592
+ BcrKeys ,
593
+ date:: { format_date_string, now} ,
594
+ } ,
597
595
} ;
598
596
599
597
use super :: * ;
@@ -1000,6 +998,8 @@ mod tests {
1000
998
1001
999
#[ rstest]
1002
1000
#[ 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 ( ( ) ) ) ]
1003
1003
fn test_validate_bill_req_to_pay_valid (
1004
1004
#[ case] input : BillValidateActionData ,
1005
1005
#[ case] expected : Result < ( ) , ValidationError > ,
@@ -1019,7 +1019,6 @@ mod tests {
1019
1019
#[ 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 ) ) ]
1020
1020
#[ 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 ) ) ]
1021
1021
#[ 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 ) ) ]
1023
1022
#[ 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 ) ) ]
1024
1023
fn test_validate_bill_req_to_pay_errors (
1025
1024
#[ case] input : BillValidateActionData ,
@@ -1173,6 +1172,7 @@ mod tests {
1173
1172
1174
1173
#[ rstest]
1175
1174
#[ 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 ( ( ) ) ) ]
1176
1176
fn test_validate_bill_offer_to_sell_valid (
1177
1177
#[ case] input : BillValidateActionData ,
1178
1178
#[ case] expected : Result < ( ) , ValidationError > ,
@@ -1200,7 +1200,10 @@ mod tests {
1200
1200
}
1201
1201
1202
1202
#[ 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 ( ( ) ) ) ]
1204
1207
fn test_validate_bill_sell_valid (
1205
1208
#[ case] input : BillValidateActionData ,
1206
1209
#[ case] expected : Result < ( ) , ValidationError > ,
@@ -1291,7 +1294,8 @@ mod tests {
1291
1294
}
1292
1295
1293
1296
#[ 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 ( ( ) ) ) ]
1295
1299
fn test_validate_bill_reject_payment_valid (
1296
1300
#[ case] input : BillValidateActionData ,
1297
1301
#[ case] expected : Result < ( ) , ValidationError > ,
0 commit comments